<clinit>:在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行。
<init>:在实例创建出来的时候调用,包括调用new操作符;调用Class或Java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。
<init>是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法,而<clinit>是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用clinit方法。
<clinit>是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对静态变量,静态代码块进行初始化。<clinit>是由javac添加的静态方法,并且在加载类之后由JVM调用。可以在类字节码中使用字节码大纲工具看到这种方法。注意,<clinit>只有当一个类需要静态初始化时才添加,具体代码如下:
public class Test1 {
static int x = 1;
public static void main(String[] args) throws Exception {
}
}
public class Test2 {
static final int x = 1;
public static void main(String[] args) throws Exception {
}
}
Test1类中有<clinit>,因为它的变量x需要使用1初始化;而Test2没有<clinit>