Java静态变量初始化的坑
如图所示的代码
class SingleTon {
private static SingleTon singleTon = new SingleTon();
public static int count1;
public static int count2 = 1;
private SingleTon() {
count1++;
count2++;
}
public static SingleTon getInstance() {
return singleTon;
}
}
public class Test {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
}
}
如图所示的代码运行之后的结果为“count=1 count=1”,而这和我们想象中的两个值分别为1,2不一样,这是因为在Test中调用getInstance时,首先会将SingTon中的静态方法和变量按前后顺序进行加载,在SingleTon中,首先会创建一个空对象,在该对象创建好之后,会立即调用构造函数(两个数据成员初始化都为0),因而调用构造函数之后两个值均为1。之后便是count1,count2进行显示初始化,count1没有显示初始化,所以其值依然为1,count2显示初始化为1,所以最后值也依然是1。
而如果是下面这种情况,
class SingleTon {
public static int count1;
public static int count2 = 1;
private static SingleTon singleTon = new SingleTon();
private SingleTon() {
count1++;
count2++;
}
public static SingleTon getInstance() {
return singleTon;
}
}
public class Demo {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
}
}
则最后的输出count1和count2分别为1,2。这是因为在这种情况下首先是将两个数据成员进行显示初始化,分别为1、2,然后是创建新对象,创建好之后就通过构造函数将两个数据值各加一,最后输出的便为1,2。
Java静态变量初始化顺序解析
本文探讨了Java中静态变量的初始化顺序问题,通过对比两种不同代码结构的输出结果,揭示了构造函数与静态变量初始化之间的关系。在一种情况下,由于构造函数先于静态变量初始化执行,导致两个静态变量都被初始化为1;而在另一种情况下,静态变量的显示初始化发生在构造函数调用之前,从而得到预期的1和2的输出结果。
890

被折叠的 条评论
为什么被折叠?



