Java:<init>和<clinit>有什么区别?

2022-08-31 10:05:47

我无法理解以下文本...这是否意味着适用于空构造函数?为什么有两个不同的版本很重要?<clinit>

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

2.9. Special Methods

在 Java 虚拟机级别,每个构造函数 (§2.12) 都显示为具有特殊名称的实例初始化方法。此名称由编译器提供。由于该名称不是有效的标识符,因此不能直接在用 Java 编程语言编写的程序中使用它。实例初始化方法只能在 Java 虚拟机中由调用专用指令调用,并且只能在未初始化的类实例上调用。实例初始化方法采用派生该方法的构造函数的访问权限 (§2.7.4)。<init><init>

类或接口最多有一个类或接口初始化方法,并通过调用该方法进行初始化 (§2.17.4)。类或接口的初始化方法是静态的,不带任何参数。它具有 特殊名称 。此名称由编译器提供。由于该名称不是有效的标识符,因此不能直接在用 Java 编程语言编写的程序中使用它。类和接口初始化方法由 Java 虚拟机隐式调用。它们从不直接从任何 Java 虚拟机 inw2 结构调用,而只是作为类初始化过程的一部分间接调用。<clinit><clinit>


答案 1

<init>是实例的(或其中一个)构造函数,并且是非静态字段初始化。

<clinit>是类的静态初始化块,以及静态字段初始化。

class X {

   static Log log = LogFactory.getLog(); // <clinit>

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}

答案 2

<init>表示构造函数,表示静态初始值设定项Java 教程中的“静态初始化块”,Java 中的静态初始值设定项<clinit>


推荐