类加载与类初始化

时间:2013-09-30 17:14:31

标签: java jvm jls

我一直认为类加载和类初始化是同义的,并且通常在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语言中类加载和类初始化之间的区别。通常直觉说初始化应始终先加载,但我完全错了。可以在没有加载类的情况下进行初始化吗?

1 个答案:

答案 0 :(得分:8)

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

  

5.5。初始化

     

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

返回链接部分

  

5.4。链接

     

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

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

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