主动引用
1.遇到 new, getstatic,putstatic,invokestatic, 四条指令时,若类未初始化,则先进行初始化(4条指令在Java中代表: new一个对象,读取或者设置类的静态字段[被final 修饰的在编译期已放入常量池],调用类的静态方法)
2.使用java.lang.reflect包的方法队类进行反射调用时, 若未初始化,先初始化
3.初始化一个子类时,父类若未初始化则先初始化
4.虚拟机启动时,用户需要指定一个主执行类(包含main方法的那个类),虚拟机会先初始化此类
5.使用jdk1.7动态语言时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic,REF_putStatic,REF_invokeStatic四种类型的方法句柄,且这个方法句柄对应的类未初始化,则先初始化
6.接口定义了jdk8 新加入的默认方法时(被default修饰的接口方法),如果有这个接口的实现类且发生初始化,要先初始化接口,在初始化实现类
被动引用
1.通过子类引用父类的静态字段,不会导致子类初始化
2.通过数组定义来引用类, 不会触发此类的初始化
3.final 修饰的常量在编译期会存入调用类的常量池中, 本质上没用引用到定义常量的类, 所以不会触发定义常量类的初始化