类的生命周期
7.2、开始类加载、类初始化的时机。
1)类加载过程的第一个阶段:加载。虚拟机规范中没有进行强制约束,交由具体的虚拟机实现来自由把握。
2)初始化 阶段,虚拟机规范中严格规定了有且只有4种情况必须立即对类进行“初始化”(加载,验证,准备自然在初始化之前开始)。
a)遇到new、getstatic、putstatic、invokestatic四条字节码指令时,若类没被初始化,则要立即初始化。
b)使用java.lang.reflect包的方法对类进行反射调用时,若类没被初始化,则要立即初始化。
c)当初始化一个类时,若它的父类还没被初始化,则需先初始化父类。
d)当虚拟机启动时,用户需要指定一个要执行的主类(包括main()方法的那个类),虚拟机会先初始化这个主类。
以上四种情况的行为称作对一个类的主动引用。除此之外所有引用类的方式,都不会触发类的初始化,称为被动引用。
以下贴3个被动引用的场景例子:
扩展:
7.3类加载过程,具体动作。
1.加载:
虚拟机规范的这三点比较笼统,具体实现上灵活度高。
2.验证:
这一阶段的目的:为了确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全。
1.文件格式验证:
2.元数据验证:主要检查语言规范。
3.字节码验证
4.符号引用验证
总结:
7.3准备
准备阶段是正式为类变量(被static修饰的变量)分配内存并设置初始值(数据类型的“零值”)的阶段,这些内存都将在方法区中分配。
举例:
public static int value = 123;在此阶段,它的零值是 0;
public static int value = 123;在此阶段,它的零值是 123;
零值对应表:
7.4解析
是虚拟机将常量池中的符号引用替换为直接应用的过程。
7.5初始化
类加载器
1、什么是类加载器。