【目录】 【上一篇:双亲委派机制】 【下一篇:运行时数据区】
四、类的主动使用和被动使用
类的主动使用与被动使用的区别在于:当类是主动使用时,在类加载的时候会导致类的初始化() 执行,被动使用虽然也会加载类,但不会触发类的初始化;
主动使用:
- 创建类的实例(new 关键字、克隆、序列化与反序列化)
- 访问某个类、接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射
- 初始化一个类的子类(在初始化子类的时候,会优先初始化父类)
- Java虚拟机启动时,被标明为启动类的类
- JDk7开始提供的动态语言的支持
- java.lang.invoke.MethodHandle实例的解析结果
- REF_getStatic、REF_putStatic、REF_invokeStatic句柄对应的类没有初始化,则初始化
被动使用:
除了以上7种情况之外,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化。(会被加载到内存中)
- 当访问一个静态字段时,只有真正声明这个字段的类才会被初始化;
- 通过子类引用父类的静态变量,不会导致子类初始化;
- 通过数组定义类引用,不会触发此类初始化;
- 引用常量不会触发此类或接口的初始化;(因为常量在链接阶段就已经显式赋值了);
- 调用 ClassLoader 类的 loadClass() 方法加载一个类,并不是对类的主动使用,不会导致类的初始化