静态和最终静态变量初始化之间的Java差异

ami*_*ngh 0 java

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有这种不同的行为?

Bor*_*jev 5

静态字段按声明顺序逐个初始化.在您的特定情况下,您StaticTest stObj首先初始化.这在初始化之前执行VAR1.因此VAR1在打印时具有默认值.

但是VAR2编译时常量,因此编译器优化其初始化并首先进行初始化.这样,其中一个变量在您调用构造函数时初始化,另一个 - 不是.