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。