<clinit>() 方法包括了类的静态变量的赋值和静态代码块的执行,以及其他的初始化操作。
在执行<clinit>() 方法之前,Java 虚拟机会先加载类的字节码,分配空间,并进行默认初始化。然后,它会找到类中所有的静态变量,并对它们进行默认初始化。接着,它会执行静态代码块中的语句,以及其他静态方法中引用的其他类和方法的初始化操作。
在执行<clinit>() 方法时,类的静态成员已经被分配空间并进行了默认初始化,静态代码块中的语句和其他类方法中引用的其他类和方法也已经被加载和初始化。因此,在<clinit>() 方法中,可以直接访问所有的类的静态成员并对其进行操作。
需要注意的是,<clinit>() 方法只会执行一次,即使同一个类被加载多次,也只会执行一次<clinit>() 方法。如果在<clinit>() 方法中发生了异常,Java 虚拟机会立即停止执行,并抛出异常,此时类就无法正常使用。如果<clinit>() 方法没有执行完毕,就不能访问该类的任何静态成员(静态变量和静态方法),直到<clinit>方法执行完毕为止。
<clinit>() 方法是 Java 虚拟机在类初始化时调用的,它是由 Java 编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并而来的。
<clinit>() 方法可以对类变量进行初始化,包括赋值和执行静态语句块中的语句。
具体来说,<clinit>() 方法中包含以下操作:
- 分配类变量并进行默认初始化;
- 执行静态语句块中的语句,包括赋值和执行方法调用;
- 解析和链接类中的所有相关的符号引用;
- 把符号引用转换为直接引用;
- 对类变量进行显示初始化;
- 最后执行其他的<clinit>() 方法。
需要注意的是,<clinit>() 方法是由 Java 虚拟机自动调用的,开发人员无法手动调用。<clinit>() 方法的执行只会在以下情况下发生:
- 创建类的实例;
- 访问类的静态变量;
- 调用类的静态方法;
- 使用反射访问类中的字段或方法;