標籤:csharp extend 返回 soft sys console system string java
Java和CSharp的類繼承的執行過程的差異:
Java的執行過程:子類先初始化父類的成員→初始化父類的建構函式→返回子類執行初始化子類的成員→初始化子類建構函式。
CSharp的執行過程:子類先初始化子類的成員→初始化父類的成員→初始化父類的建構函式→初始化子類的建構函式。
假設:A類繼承自B類。
Java的執行過程:A類先初始化B類的成員→初始化B類的建構函式→ 初始化A類的成員→初始化A類的建構函式。
CSharp的執行過程:A類先初始化A類的成員→初始化B類的成員→初始化B類的構函數→初始化A類的建構函式。
依次假設:A類繼承自B類,B類繼承自C類,依次類推下去。
Java的執行過程:A類先初始化C類的成員→初始化C類的建構函式→初始化B類的成員→初始化B類的建構函式→初始化A類的成員→初始化A類的建構函式。
CSharp的執行過程:A類先初始化A類的成員→初始化B類的成員→初始化C類的成員→初始化C類的建構函式→初始化B類的建構函式→初始化A類的建構函式。
範例程式碼:
//----------------------Java代碼----------------------
1 //----------------------Java代碼---------------------- 2 class Demo extends X{ 3 Y y = new Y(); 4 Demo(){System.out.print("Z");} 5 public static void main(String[] args) { 6 new Demo(); 7 } 8 } 9 class X extends J {10 Y y = new Y();11 X() {12 System.out.print("X");13 }14 }15 class Y {16 Y() {17 System.out.print("Y");18 }19 }20 class J{21 K k = new K();22 J(){23 System.out.print("J");24 }25 }26 class K{27 K(){28 System.out.print("K");29 }30 }31 //Java輸出結果為:KJYXYZ
//----------------------CSharp代碼----------------------
1 //----------------------CSharp代碼---------------------- 2 using System; 3 4 class Demo : X 5 { 6 Y y = new Y(); 7 8 public Demo() 9 {10 Console.Write("Z");11 }12 13 static void Main(string[] args) {14 new Demo();15 }16 }17 18 public class X : J19 {20 Y y = new Y();21 public X()22 {23 Console.Write("X");24 }25 }26 27 public class Y28 {29 public Y()30 {31 Console.Write("Y");32 }33 }34 35 public class J36 {37 K k = new K();38 public J()39 {40 Console.Write("J");41 }42 }43 44 public class K45 {46 public K()47 {48 Console.Write("K");49 }50 }51 //CSharp輸出結果為:YYKJXZ
Java和CSharp的類繼承的執行過程的差異