谁能解释发生了什么?
public class MagicFinal {
public static void main(String[] args) {
System.out.println(A.s);
}
}
class A {
static {
System.out.println("class has been loaded");
}
public static final String s = "final";
public static final Integer i = 3;
}
控制台:那是什么?我不明白为什么类没有被加载,我知道类总是在第一次调用时加载。字段
s
在字符串池中,我看到最终修饰符是魔术。如果删除最终修饰符(
public static String s = "final"
),我会得到控制台:
注意:我更改了
i
字段:public static final int i = 3;
并将其显示在控制台中。我和String情况一样。为什么?
最佳答案
"final"
是字符串文字,因此是compile-time constant expression。用编译时常量表达式初始化的static final
变量的值直接硬编码到引用它的类中,并且不引用原始类。因此,不会发生原始类的初始化。
附带说明一下,请注意类加载和类初始化之间的区别:JLS只是精确地指定了类的出现。类加载可以随时发生。
关于java - 静态块没有被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18979176/