Java类的初始化流程是指在类被加载到内存并且链接完成后,执行类的初始化操作的过程。在Java中,类的初始化是在以下情况下触发的:
-
创建类的实例:当使用
new
关键字创建类的实例时,会触发类的初始化。 -
访问类的静态成员(静态变量或静态方法):如果通过类名直接访问类的静态成员,也会触发类的初始化。
-
使用反射机制访问类:如果通过Java的反射机制来访问类,如
Class.forName("className")
,也会触发类的初始化。 -
初始化类的子类:当一个类初始化时,如果其父类还没有初始化,则会先初始化父类。
Java类初始化的流程如下:
-
父类静态成员初始化:如果当前类有父类,并且父类还没有被初始化,则先初始化父类。这个过程是递归的,直到最顶层的父类被初始化为止。
-
静态成员变量赋值:对类的静态成员变量按照代码中的顺序进行赋值,如果静态成员变量被声明为编译时常量(使用
final
修饰,且赋值时是一个编译时常量表达式),则在编译阶段就会被分配为常量值,不需要在初始化阶段赋值。 -
静态代码块执行:按照代码中的顺序执行类的静态代码块。
-
实例成员变量赋值和构造函数执行:对实例成员变量按照代码中的顺序进行赋值,然后执行构造函数。
需要注意的是,初始化过程是线程安全的,JVM保证在多线程环境下只会有一个线程执行类的初始化操作。如果多个线程同时初始化一个类,JVM会保证只有一个线程执行初始化,其他线程会被阻塞直到初始化完成。