在 Java 中,类的初始化指的是类的静态变量和静态代码块的初始化过程。类初始化是由 JVM 控制的,以下是六种触发类初始化的情况:
1. 创建类的实例(使用 new
关键字)
当通过 new
关键字创建类的实例时,会触发该类的初始化。这是最常见的类初始化情况。在创建实例时,如果类尚未被初始化,JVM 会首先初始化该类,然后再创建对象实例。
2. 访问类的静态成员
当首次访问类的静态字段或调用类的静态方法时,会触发该类的初始化。静态字段和方法属于类而非实例,因此在访问这些静态成员时,JVM 会确保类已经被初始化。
3. 使用反射 API 访问类
使用反射 API(如 Class.forName()
)加载类时,会触发该类的初始化。Class.forName()
方法会导致类被加载并初始化,从而确保类的静态成员和静态代码块被执行。
4. 初始化子类
当一个子类被初始化时,如果它的父类还没有被初始化,则会触发父类的初始化。这是因为在初始化子类之前,JVM 需要确保其父类已经完成初始化,以确保继承的静态成员和静态代码块被正确执行。
5. JVM 启动时初始化主类
在 JVM 启动时,主类(即包含 main
方法的类)会被初始化。JVM 启动时会初始化主类,以便可以执行 main
方法并开始程序的执行。
6. 定义常量的类
在某些情况下,当类中定义了静态常量,并在其他类中被引用时,可能会触发该类的初始化。特别是当常量在其他类中被直接引用时,JVM 可能会在编译时将其替换为常量值,从而触发类的初始化。