public class StaticTest {
private static StaticTest stObj=new StaticTest();
private static int VAR1=10;
private static final int VAR2=20;
public StaticTest() {
System.out.println("Var1 : "+VAR1);
System.out.println("Var2 : "+VAR2);
}
public static void main(String[] args) {
System.out.println("VAR1 after constrution : "+StaticTest.VAR1);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Var1:0 Var2:构造后20 VAR1:10
为什么VAR1和VAR2有这种不同的行为?
静态字段按声明顺序逐个初始化.在您的特定情况下,您StaticTest stObj首先初始化.这在初始化之前执行VAR1.因此VAR1在打印时具有默认值.
但是VAR2编译时常量,因此编译器优化其初始化并首先进行初始化.这样,其中一个变量在您调用构造函数时初始化,另一个 - 不是.