1.java程序对类的使用方式可以分为两种
- 主动使用
- 被动使用
2.所有的java虚拟机实现必须在每个类或接口被java程序"首次主动使用"时才初始化它们
即首次主动使用初始化
3.主动使用的七种方式
- 创建类的实例
- 访问某个类或接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射(如Class.forName(“com.test.Test”)对类的主动使用)
- 初始化一个类的子类(初始化子类,也是对父类的主动使用)
- java虚拟机启动时被标明为启动类的类(main方法)
- jdk1.7开始提供的动态语言支持:java.lang.invoke.MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有初始化,则初始化
除了以上七种情况,其他使用java类的方式都被看作是对类的被动使用,都不会导致类的初始化(可能加载,但绝对不会导致初始化)
ps: 只有当前程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类接口的主动使用