我无法理解以下文字...这是否意味着<clinit>
用于空构造函数?为什么拥有两个不同的版本很重要?
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
在 Java 虚拟机级别,每个构造函数(第 2.12 节)都显示为实例初始化方法,该方法具有
特别的名字<init>
。该名称由编译器提供。因为
姓名<init>
不是有效的标识符,不能直接在
用Java编程语言编写的程序。实例
初始化方法只能在 Java 虚拟内部调用
机器通过invokespecial指令,并且它们只能被调用
在未初始化的类实例上。实例初始化方法
获取构造函数的访问权限(第 2.7.4 节)
它是派生出来的。
类或接口至多有一个类或接口初始化方法,并通过调用该方法进行初始化(第 2.17.4 节)
方法。类或接口的初始化方法是静态的
并且不接受任何争论。它有一个特别的名字<clinit>
。这个名字是
由编译器提供。因为名字<clinit>
不是有效的
标识符,它不能直接在用
Java 编程语言。类和接口的初始化方法
由 Java 虚拟机隐式调用;他们从来都不是
直接从任何 Java 虚拟机 inw2struction 调用,但是
仅作为类初始化过程的一部分间接调用。
<init>
是实例的(或其中一个)构造函数,以及非静态字段初始化。
<clinit>
是类的静态初始化块和静态字段初始化。
class X {
static Log log = LogFactory.getLog(); // <clinit>
private int x = 1; // <init>
X(){
// <init>
}
static {
// <clinit>
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)