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

Jay*_*yan 87 java jvm

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

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

2.9. Special Methods
Run Code Online (Sandbox Code Playgroud)

在Java虚拟机的级别上,每个构造函数(第2.12节)都显示为具有特殊名称的实例初始化方法<init>.该名称由编译器提供.因为名称<init>不是有效的标识符,所以它不能直接用在用Java编程语言编写的程序中.实例初始化方法可以仅通过invokespecial指令在Java虚拟机中调用,并且可以仅在未初始化的类实例上调用它们.实例初始化方法接受从其派生的构造函数的访问权限(第2.7.4节).

类或接口最多只有一个类或接口初始化方法,并通过调用该方法进行初始化(第2.17.4节).类或接口的初始化方法是静态的,不带参数.它有特殊的名字<clinit>.该名称由编译器提供.因为名称<clinit>不是有效的标识符,所以它不能直接用在用Java编程语言编写的程序中.Java虚拟机隐式调用类和接口初始化方法; 它们永远不会直接从任何Java虚拟机inw2struction中调用,但只能作为类初始化过程的一部分间接调用.

Thi*_*ilo 128

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

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

class X {

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

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}
Run Code Online (Sandbox Code Playgroud)

  • 我的猜测是"上课". (11认同)
  • `CL`代表什么? (4认同)
  • @Thilo这很有趣,因为JVM也将类定义视为另一种类型的对象. (2认同)

Eli*_*kan 21

<init>表示一个构造函数,<clinit>表示静态初始化:"静态初始化块"中的Java教程,Java中静态初始化.


rsp*_*rsp 12

之间的差<init><clinit><init>用于那些初始化对象实例构造方法,而<clinit>用于初始化类对象本身.例如,任何static类级别字段的初始化都<clinit>在类加载和初始化时完成.