https://blog.youkuaiyun.com/noaman_wgs/article/details/74489549
里面有一段分析输出结果的原因
再回过头来分析一开始的面试题:
Singleton输出结果:1 0
原因:
1 首先执行main中的Singleton singleton = Singleton.getInstance();
2 类的加载:加载类Singleton
3 类的验证
4 类的准备:为静态变量分配内存,设置默认值。这里为singleton(引用类型)设置为null,value1,value2(基本数据类型)设置默认值0
5 类的初始化(按照赋值语句进行修改):
执行private static Singleton singleton = new Singleton();
执行Singleton的构造器:value1++;value2++; 此时value1,value2均等于1
执行public static int value1;
public static int value2 = 0;
此时value1=1,value2=0
Singleton2输出结果:1 1
原因:
1 首先执行main中的Singleton2 singleton2 = Singleton2.getInstance2();
2 类的加载:加载类Singleton2
3 类的验证
4 类的准备:为静态变量分配内存,设置默认值。这里为value1,value2(基本数据类型)设置默认值0,singleton2(引用类型)设置为null,
5 类的初始化(按照赋值语句进行修改):
执行public static int value2 = 0;
此时value2=0(value1不变,依然是0);
执行private static Singleton singleton = new Singleton();
执行Singleton2的构造器:value1++;value2++;
此时value1,value2均等于1,即为最后结果
https://blog.youkuaiyun.com/yaotai8135/article/details/80506071
叙述了初始化顺序 ,static 在初始化阶段执行,所以有上面的结果