一个类的整个生命周期包括:加载,验证,准备,解析,初始化,使用,卸载
初始化
- 运行过程中遇到如下字节码指令时,如果类尚未初始化,那就要进行初始化:new、getstatic、putstatic、invokestatic等。这四个指定对应的Java代码场景是:
new: 通过new创建对象;
getstatic,putstatic: 读取、设置一个类的静态成员变量(不包括final修饰的静态变量);
invokestatic: 调用一个类的静态方法; - 调用一个类的静态变量
- 对类进行reflect反射调用,如果还没初始化则进行初始化
- 如果父类还没初始化,则初始化其父类
- 虚拟机启动时,会先初始化main主类
主动引用和被动引用
直接满足上述条件才会初始化,被称为主动引用。
间接满足上述情况不会初始化,被称为被动引用。
- 子类引用父类静态字段
- 子类引用父类静态方法
- 定义类的数组
- 调用类的常量 public static final