类的初始化是类加载的最后一步。
对类的主动引用会引发类的初始化,而被动引用不会引发初始化。
主动引用有且只有下面 4 种情况:
- 遇到
new
、getstatic
、putstatic
、invokestatic
这四条字节码指令时,需要触发初始化,常见场景为:new 关键字实例化对象、读取或设置一个类的静态字段、以及调用一个类的静态方法。 - 对类进行反射调用时,如果类没有初始化,需要触发初始化。
- 对一个类进行初始化,需要先初始化其父类。
- 虚拟机启动时需要初始化主类(包含 main 方法的类)。