这一章要了解:虚拟机如何加载这些Class文件?Class文件中的信息加入到虚拟机后会发生什么?
类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载,验证,准备,解析,初始化,使用和卸载七个阶段,其中验证,准备,解析统称为连接
加载,验证,准备,初始化和卸载这五个阶段的顺序是确定的
这些阶段通常都是互相交叉地混合式进行的,通常会在一个阶段执行的过程中调用,激活另一个阶段,因此说按部就班地“开始”,而不是“进行”或“完成”
虚拟机规范严格规定了有且只有5种情况必须对类进行“初始化”:(主动引用)
- 遇到new,getstatic,putstatic或invokestatic,如果类没有进行初始化,则需要先触发其初始化。
- 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
- 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类
- 当使用jdk1.7的动态语言支持时,解析结果的方法句柄所对应的类没有进行过初始化
ps:通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化
接口的加载过程与类的加载过程的异同:
- 相同点:接口和类都有初始化过程
- 当一个类初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化