3

我一直认为类加载和类初始化是同义词,并且通常在第一次以某种方式使用被初始化/加载的类时按需发生。但是现在我从这个关于 SO 的答案中知道了关于持有编译时间常数的最终静态文件的行为,我的信念是错误的。

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

附带说明一下,请注意类加载和类初始化之间的区别:只有后者的出现是由 JLS 精确指定的。类加载可以随时发生。

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

4

1 回答 1

8

Java Virtual Machine Specification, Chapter 5. Loading, Linking, and Initializing,你可以找到这个信息(emphasys mine):

5.5. 初始化

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

回到链接部分

5.4. 链接

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

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

因此,我们可以推断出一个类或接口必须在被初始化之前被加载。

于 2013-09-30T17:28:52.257 回答