java 的init方法与clinit方法
一、
clinit静态方法:类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在
Java类型初始化过程中对static变量的初始化操作依赖于static域和static代码块的前后关系,static域与static代码块声明的位置关系会导致java编译器生成
二、
对象实例化方法
三、init和clinit区别:
①init和clinit方法执行时机不同
init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法,而clinit是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用clinit方法。
②init和clinit方法执行目的不同
init is the (or one of the) constructor(s) for the instance, and non-static field initialization.
clinit are the static initialization blocks for the class, and static field initialization.
上面这两句是Stack Overflow上的解析,很清楚init是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对静态变量,静态代码块进行初始化。看看下面的这段程序就很清楚了。
class X {
static Log log = LogFactory.getLog(); // <clinit>
private int x = 1; // <init>
X(){
// <init>
}
static {
// <clinit>
}
}
clinit一定优先于init
今天先来分析一下经常遇到的一个问题,在笔试面试中可能会经常遇见,类中字段代码块的加载顺序等,从jvm角度分析一下这个问题。我们先来看下知识点,接下来进行代码实践验证。
1.
2、接口中不能使用static块,但是接口仍然有变量初始化的操作,因此接口也会生成