当我们调用静态最终变量时,为什么不首先执行静态块

时间:2018-05-28 12:07:19

标签: java

class Test4 {
     public static void main(String as[]) {
         System.out.println(Hello.x); 
     }

}

class Hello {
    final static int x=10;
    static {
        System.out.println("Hello");                
    }
}

输出:10

为什么不按照我的知识打印Hello如果我们调用静态变量然后加载第一个类,当加载类时,首先应该执行静态块然后发送静态变量。

1 个答案:

答案 0 :(得分:11)

静态初始化程序块在初始化包含它的类时执行 - 通常是在加载类时。

当您在类Hello中访问Hello.x时,您会说JVM应该加载并初始化类Test4。但是,这不会发生在这里,因为这是一个特例。

static final常量由编译器内联 - 这意味着在编译此代码时,Hello.x方法中的main在编译时被常量的值替换,这是10。从本质上讲,您的代码编译为与编译时相同的字节代码:

class Test4 {
    public static void main(String[] args) {
        System.out.println(10); // Inlined constant value here!
    }
}

class Hello {
    final static int x = 10;
    static {
        System.out.println("Hello");                
    }
}

请注意,在这种情况下,类Test4并不真正访问类Hello - 因此未加载类Hello并且在运行{{1}时不执行静态初始化程序}。