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
如果我们调用静态变量然后加载第一个类,当加载类时,首先应该执行静态块然后发送静态变量。
答案 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}时不执行静态初始化程序}。