首先看下c#
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 new Child(); 6 } 7 } 8 9 10 class Faher 11 { 12 public static Test FSTest = new Test("基类静态成员"); 13 14 public Test FTest=new Test("基类实例成员"); 15 16 static Faher() 17 { 18 Console.WriteLine("基类静态构造函数"); 19 } 20 21 public Faher() 22 { 23 Console.WriteLine("基类构造函数"); 24 } 25 26 } 27 28 class Child : Faher 29 { 30 public static Test CSTest =new Test("子类静态成员"); 31 32 public Test CTest=new Test("子类实例成员"); 33 34 static Child() 35 { 36 Console.WriteLine("子类静态构造函数"); 37 } 38 39 public Child() 40 { 41 Console.WriteLine("子类构造函数"); 42 } 43 } 44 45 46 //用于做成员的类 47 class Test 48 { 49 public Test(string info) 50 { 51 Console.WriteLine(info); 52 } 53 }
程序结果:
子类静态成员
子类静态构造函数子类实例成员基类静态成员基类静态构造函数基类实例成员基类构造函数子类构造函数再来看看java的
1 public class Show 2 { 3 public static void main(String[] args) 4 { 5 new Child(); 6 } 7 } 8 9 class Father 10 { 11 public static Test FSTest=new Test("基类静态成员"); 12 13 public Test FTest=new Test("基类实例成员"); 14 15 public Father() 16 { 17 System.out.println("基类构造函数"); 18 } 19 20 static 21 { 22 System.out.println("基类静态块"); 23 } 24 } 25 26 class Child extends Father 27 { 28 public static Test CSTest=new Test("子类静态成员"); 29 30 public Test CTest=new Test("子类实例成员"); 31 32 public Child() 33 { 34 System.out.println("子类构造函数"); 35 } 36 37 static 38 { 39 System.out.println("子类静态块"); 40 } 41 42 } 43 44 45 //用于做成员的类 46 class Test 47 { 48 public Test(String info) 49 { 50 System.out.println(info); 51 } 52 }
程序结果:
基类静态成员
基类静态块子类静态成员子类静态块基类实例成员基类构造函数子类实例成员子类构造函数由于以上的程序可以看出
c#初始化顺序为
子类静态成员-->子类静态构造函数-->子类实例成员-->基类静态成员-->基类静态构造函数-->基类实例成员-->基类构造函数-->子类构造函数
java初始化顺序为
基类静态成员-->基类静态块-->子类静态成员-->子类静态块-->基类实例成员-->基类构造函数-->子类实例成员-->子类构造函数
总结一下:
c#创建对象的时候会为先初始化子类各成员再初始化基类各成员静态成员(而静态成员总先于实例成员),java创建对象是总是先初始化基类静态成员和子类静态成员,然后才是基类实例成员和子类实例成员,c#和java最后是先调用基类构造函数最后调用子类构造函数
要点:
1 c#先子后基,java先基后子
2 静先于实
3 先基构后子构