Java:<;初始化>;及<;clinit>;?

Java:<;初始化>;及<;clinit>;?,java,jvm,Java,Jvm,我无法理解以下文字。。。这是否意味着用于空构造函数?为什么有两个不同的版本很重要 在Java虚拟机级别,每个构造函数(§2.12)都显示为具有 特殊名称。此名称由编译器提供。因为 名称不是有效的标识符,不能直接用于 用Java编程语言编写的程序。实例 只能在Java虚拟机中调用初始化方法 通过invokespecial指令调用机器,并且只能调用它们 在未初始化的类实例上。一种实例初始化方法 接受来自其的构造函数的访问权限(§2.7.4) 它是派生出来的 一个类或接口最多有一个类或接口初始化方法

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

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

一个类或接口最多有一个类或接口初始化方法,并通过调用该方法进行初始化(§2.17.4) 方法。类或接口的初始化方法是静态的 不需要争论。它有一个特殊的名称
。这个名字是 由编译器提供。因为名称
无效 标识符,它不能直接用于在中编写的程序中 Java编程语言。类和接口初始化方法 由Java虚拟机隐式调用;他们从来都不是 直接从w2struction中的任何Java虚拟机调用,但是 仅作为类初始化过程的一部分间接调用

是实例的(或其中一个)构造函数和非静态字段初始化

class X {

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

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}
是类的静态初始化块和静态字段初始化

class X {

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

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}
X类{
静态日志日志=LogFactory.getLog();//
私有整数x=1;//
X(){
// 
}
静止的{
// 
}
}

表示构造函数,
表示静态初始值设定项,

之间的区别在于
用于初始化对象实例的构造函数方法,而
用于初始化类对象本身。例如,当类被加载和初始化时,任何
静态
类级字段的初始化都在
中完成。

只是为了添加 如果使用Class.forName方法,它只初始化类。因此,在这个方法中,它只调用clinit,当您对从forName返回的对象使用newInstance时,它将调用init进行实例初始化。您可以使用下面的代码在调试中查看它

public class ByteCodeParent
{
 public static String name="ByteCode";
 public ByteCodeParent()
{
    System.out.println("In Constructor");
}

 static
 {
     System.out.println("In Static");
 }

 {
     System.out.println("In Instance");
 }
测试,使用

   Class<ByteCodeParent> bcp2 =(Class<ByteCodeParent>) Class.forName("ByteCodeParent");
ByteCodeParent bcp4= bcp2.newInstance();
Class bcp2=(Class)Class.forName(“ByteCodeParent”);
字节码父bcp4=bcp2.newInstance();

CL
代表什么?@Thilo这很有趣,因为JVM也将类定义视为另一种类型的对象。@Jonathanneufield是真的,尽管我认为有一些特殊的规则。此方法(由类初始值设定项调用)标记为本机@Thilo它也可以代表“类加载器”。