类从被加载到内存中开始,到卸载出内存为止,要经历7个阶段:
加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类加载过程中必须按照这种顺序按部就班的开始(注意是“开始”,而不是“完成”,因为这些阶段通常是交叉进行的),而解析阶段不确定,解析阶段可以在初始化之前或之后进行,这也正是Java支持动态绑定的原因。
什么情况下需要开始类加载的第一个阶段----加载,Java虚拟机没有强制约束,但Java虚拟机强制约束了类的初始化的开始时间(而加载、验证、准备自然在初始化之前进行),有且只有以下5种情况对类进行初始化:
这5种场景中的行为称为对一个类的主动引用。除此以外,所有引用类的方式都不会出发初始化,称为被动引用。下面是三种被动引用的例子:
可以看出,并没有输出“SubClass",说明SubClass没有被初始化。
可以看出,没有任何输出,说明SuperClass没有被初始化。
可以看出,没有输出”ConstClass“,说明ConstClass没有被初始化。
接口的加载过程与类的加载过程稍微有一点不同:接口也有初始化过程,这点和类一样。接口和类的区别在与5种场景的第三种:当一个类初始化时,要求其父类都初始化了,但一个接口初始化时,并不要求父接口初始化,只有在真正使用到父接口时才进行初始化。