public class Test {
private static final Test INSTANCE = new Test(); // 这行代码的位置会影响结果
private static int x = 0;
private static int y;
public Test() {
x++;
y++;
}
public static Test getInstance() {
return INSTANCE;
}
public static void main(String[] args) {
System.out.println("x: " + x);
System.out.println("y: " + y);
}
}
问:这段程序输出什么?
最终输出 x = 0, y = 1
why?
要回答这个问题先来看看类的初始化流程
上面那段代码走到初始化的时候是先初始化的 INSTANCE
变量,然后会执行Test的构造函数,x++;y++;此时x=1;y=1;是没有任何问题的,但是初始化INSTANCE
变量之后,紧接着又要初始化 x
而 x
的初始化是 0; 所以就将原来的 x = 1; 覆盖掉了,y的话是没有指定 初始值的,所以y仍然是1;