发布日期:2025-05-23 23:35 点击次数:60
Java 程序对类的使用方式可分为两种:
主动使用
被动使用
特别的重要:
所有的 Java 虚拟机实现必须在每个类或接口被 java 程序首次主动使用时才初始化他们。
主动使用(八种情况):
1)创建类的实例,比如 new 一个对象
2)访问某一个类或接口的静态变量,或者对该静态变量赋值 (访问类的静态变量的助记符 getstatic,赋值是 putstatic)。
3)调用类的静态方法 (应用 invokestatic 助记符)。
4)使用 java.lang.reflect 包的方法对类型进行反射调用,比如:Class.forName (“com.test.Test") 通过反射的方式获取类的 Class 对象。
5)初始化一个类的子类,比如有 class Parent {}、子类 class Child extends Parent {},当初始化 Child 类时也表示对 Parent 类的主动使用,Parent 类也要全部初始化。
6)Java 虚拟机启动时被标注为启动类的类,即有 main 方法的类。
7)JDK1.7 开始提供的动态语言支持:java.lang.invoke.MethodHandle 实例的解析结果 REF_getStatic, REF_putStatic, REF_invokeStatic 句柄对应的类没有初始化,则初始化。
8)当一个接口中定义了 JDK 8 新加入的默认方法(被 default 关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。
除了上述所讲的八种情况,其他使用 Java 类的方式都被看作是类的被动使用,都不会导致类的初始化。
另外,要特别说明的一点:
接口的加载过程与类加载过程会有所不同,接口不能使用 「static {}」语句块,但是编译器会为接口生成对应的 () 类构造器,用于初始化接口中所定义的成员变量。
主动使用的第 5 种:当子类初始化时,要求其父类也要全部初始化完成。但是,对于一个接口的初始化时,并不要求其父接口要全部初始化完成,只有在真正使用到父接口时(比如引用接口中定义的常量)时才会去初始化,有点延迟加载的意思。
Powered by 顶盛体育官方登录入口手机版 @2013-2022 RSS地图 HTML地图
Copyright Powered by365建站 © 2013-2024