类加载与类初始化
我一直认为类加载和类初始化是同义的,并且当初始化/加载的类以第一次以某种方式使用时,通常会按需发生。 但是现在我从这个答案中得知关于最终静态文件的行为,它保存了我认为错误的编译时常量。
请注意以下内容,非常清楚类加载和初始化是两种不同的机制。
作为一个侧面,请注意类加载和类初始化之间的区别:只有后者的出现由JLS精确指定。 类加载可以随时发生。
但有人可以解释Java语言中类加载和类初始化之间的区别。 通常直觉说初始化应始终先加载,但我完全错了。 可以在没有加载类的情况下进行初始化吗?
从Java虚拟机规范,第5章。加载,链接和初始化 ,您可以找到此信息(强调我的):
5.5。 初始化
在初始化之前, 必须链接一个类或接口,即validation,准备和可选地解析。
回到链接部分
5.4。 链接
链接类或接口涉及validation和准备该类或接口,其直接超类,其直接超接口及其元素类型(如果它是数组类型),如果需要。 类或接口中符号引用的解析是链接的可选部分。 此规范允许实现灵活性,以便何时发生链接活动(以及由于递归,加载),前提是保持以下所有属性 :
- 类或接口在链接之前已完全加载
因此,我们可以推断在初始化之前必须加载类或接口 。