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 : J 19 { 20 Y y = new Y(); 21 public X() 22 { 23 Console.Write("X"); 24 } 25 } 26 27 public class Y 28 { 29 public Y() 30 { 31 Console.Write("Y"); 32 } 33 } 34 35 public class J 36 { 37 K k = new K(); 38 public J() 39 { 40 Console.Write("J"); 41 } 42 } 43 44 public class K 45 { 46 public K() 47 { 48 Console.Write("K"); 49 } 50 } 51 //CSharp輸出結果為:YYKJXZ