我一直认为类加载和类初始化是同义的,并且通常在some way or the other for the first time中使用初始化/加载的类时按需发生。但现在我从this answer on SO regarding the behavior of final static fileds that holds compile time constants知道我的信念是错误的。
请注意以下内容,非常清楚加载和初始化是两种不同的机制。
作为一个侧面,请注意类加载和 类初始化:只有后者的出现才是精确的 由JLS指定。类加载可以随时发生。
但有人可以解释Java语言中类加载和类初始化之间的区别。通常直觉说初始化应始终先加载,但我完全错了。可以在没有加载类的情况下进行初始化吗?
答案 0 :(得分:8)
从Java Virtual Machine Specification, Chapter 5. Loading, Linking, and Initializing ,你可以找到这个信息(强调我的):
5.5。初始化
在初始化之前,必须链接一个类或接口 ,即验证,准备和选择性地解析。
返回链接部分
5.4。链接
链接类或接口涉及验证和准备该类或接口,其直接超类,其直接超接口及其元素类型(如果它是数组类型),如果需要。类或接口中符号引用的解析是链接的可选部分。此规范允许实现灵活性,以便何时发生链接活动(以及由于递归,加载),前提是维护所有以下属性:
- 类或界面在链接之前已完全加载
因此,我们可以推断在初始化之前必须加载一个类或接口。