1、创建类的对象时,其内部的初始化顺序是如此的:
1)静态成员变量与静态始化块按照出现顺序先后执行;
2)调用本对象的构造函数(但还未执行构造方法体);
3)调用父类的构造方法;
4)成员变量与构造代码块按照出现顺序先后执行;
5)执行本对象的构造方法。
注意:3)调用父类构造方法时,也按照1-5的顺序依次执行父类的初始化。
2、静态成员变量与成员变量只有在定义时,才会分配内存。
3、根据上述原因,你的代码中,a与s_a定义位置在于静态代码块与构造代码后面,所以前两个代码块的赋值其实是毫无意义的。这从结果打印为a=1,s_a=2可以看出。
实际上,此代码初始化顺序是这样的:
1)代码7;无意义
2)代码14;无意义
3)代码19;
4)代码2;
5)代码13;
6)代码16;
7)本类构造方法; |