在《深入理解 JVM 虚拟机(第二版)》的第七章有这么一段话
遇到
new
、getstatic
、putstatic
或invokestatic
这 4 条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这 4 条指令的最常见的 Java 代码场景是:使用 new 关键字实例化对象的时候、读取或设置一个类的静态字段**(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)**的时候,以及调用一个类的静态方法的时候。
其中 『被 final 修饰、已在编译期把结果放入常量池的静态字段除外』让我觉得有些困惑。
之后 7.3.5 初始化阶段 又提到:
接口中不能使用静态语句块,但仍然有变量初始化的赋值操作。因此接口与类一样都会生成
<clinit>()
方法。
可是接口中变量初始化,必然是public static final
的,而final
变量的处理是编译期的工作,怎么又让类加载器的初始化阶段有所参与呢。。所以如何理解编译和编译期,类加载三者的关系啊?
谢谢