谁能解释发生了什么?

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/

10-13 05:23