类加载与类初始化的区别

3
我一直以为类加载和类初始化是同义词,并且通常在使用时按需加载/初始化,直到某种方式第一次使用初始化/加载该类。但现在我从这个 SO 回答中了解到有关保存编译时常量的 final static 字段行为的内容,我的想法是错误的。
请注意以下几点,这些都很清楚地表明类加载和初始化是两种不同的机制。
引用如下:

另外,请注意类的加载和初始化之间的区别:仅后者的发生是由 JLS 精确定义的。类的加载可以在任何时候发生。

但Java语言中类加载和类初始化之间有什么区别呢?通常情况下,初始化应该始终先于加载,但我可能完全错了。初始化是否可以在未加载类的情况下发生?

1
阅读JLS的第12章。具体来说是12.2和12.4节。 - Sotirios Delimanolis
2
同时,Java虚拟机规范的第5章 - Rohit Jain
1个回答

8
Java虚拟机规范第5章“加载、链接和初始化”中,您可以找到以下信息(强调是我的):
5.5 初始化
在初始化之前,必须链接类或接口,即验证、准备和可选地解析。
向后查看链接部分
5.4 链接
链接类或接口涉及验证和准备该类或接口、其直接超类、其直接超接口和其元素类型(如果它是数组类型),如果需要的话。类或接口中符号引用的解析是链接的可选部分。本规范允许实现在何时进行链接活动(以及由于递归而导致的加载)方面具有灵活性,只要维护以下所有属性:
1. 类或接口在链接之前完全加载 2. 因此,我们可以推断出,在初始化之前,必须先加载类或接口。

“符号引用”的解析在类或接口中是链接的可选部分。”你能解释一下这是什么意思吗? - Geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接