类的主动使用和被动使用主要是观察clinit方法是否在加载阶段执行,如果执行则是类的主动使用否则是类的被动使用
类的主动使用
类的主动使用指的是执行clinit方法,触发类的初始化方法。
主动使用具体可以分为以下几种情况:
- 创建类的实例变量时会触发类的初始化;
- 调用类的静态方法时会触发类的初始化;(包括main执行的时候会先触发当前类的clinit方法)
- 当调用类的非final字段时会触发类的初始化;如果这个final修饰的静态字段需要执行字节码那么也会执行类的初始化方法;
- 主动得到类的.class对象的时候会触发类的初始化;
- 当子类进行初始化时,也会让父类进行初始化;但是如果是实现的接口,那么这个接口不会执行类的初始化方法;同时如果是一个接口继承了另外一个接口,当前接口的初始化也不会伴随父接口的初始化;
- 如果一个接口实现了一个default方法,那么这个接口当作类看待,类的初始化会触发接口的初始化;
类的被动使用
类的被动使用指的是不执行clinit方法,不会触发类的初始化方法 类的被动使用可以分为以下几种情况
- 子类访问父类的静态字段的时候(非字面量)不会导致子类的初始化;
- 定义数组也不会初始化这个类;
- classLoader加载类的时候,不会导致类的初始化!!!!!!!!!!!!