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