类成员变量初始化顺序:
1、定义实例变量时指定初始值;
2、非静态初始化块中对实例变量指定初始值;
3、构造函数对实例变量指定初始值
这3种方式(以下简称1,2,3)初始化的顺序是怎样的呢?
下面根据程序实例分析一下:
public class Javatest_ClassMemberInitOrder {
int b;
//构造函数对实例变量指定初始值
public Javatest_ClassMemberInitOrder(int b){
System.out.println("执行构造函数");
this.b=b;
this.a=b;
}
//非静态初始化块中对实例变量指定初始值
{
System.out.println("执行非静态初始化块");
a=2;
}
//定义实例变量时指定初始值
int a=3;
public static void main(String[] args){
Javatest_ClassMemberInitOrder myclass=new Javatest_ClassMemberInitOrder(5);
System.out.println("b="+myclass.b);
System.out.println("a="+myclass.a);
}
}
由此可见其中1和2要比3更早执行,那么1与2哪个更早执行呢?
下面我测试一下:
这里要注意了:1与2 的执行顺序与他们在源程序中的排列顺序有关,是按顺序执行的
这里分析一下a=3而为什么不等于2
实际上会被分成两块执行:
int a:创建Java对象时分配内存
a=3:提取到Java类构造器中执行(这里注释掉,其实还是会被系统调用进去),最终的结果a=3