类加载与类初始化

我一直认为类加载和类初始化是同义的,并且当初始化/加载的类以第一次以某种方式使用时,通常会按需发生。 但是现在我从这个答案中得知关于最终静态文件的行为,它保存了我认为错误的编译时常量。

请注意以下内容,非常清楚类加载初始化是两种不同的机制。

作为一个侧面,请注意类加载和类初始化之间的区别:只有后者的出现由JLS精确指定。 类加载可以随时发生。

但有人可以解释Java语言中类加载和类初始化之间的区别。 通常直觉说初始化应始终先加载,但我完全错了。 可以在没有加载类的情况下进行初始化吗?

从Java虚拟机规范,第5章。加载,链接和初始化 ,您可以找到此信息(强调我的):

5.5。 初始化

在初始化之前, 必须链接一个类或接口,即validation,准备和可选地解析。

回到链接部分

5.4。 链接

链接类或接口涉及validation和准备该类或接口,其直接超类,其直接超接口及其元素类型(如果它是数组类型),如果需要。 类或接口中符号引用的解析是链接的可选部分。 此规范允许实现灵活性,以便何时发生链接活动(以及由于递归,加载),前提是保持以下所有属性

  • 类或接口在链接之前已完全加载

因此,我们可以推断初始化之前必须加载类或接口