Java的 clinit 方法和 init 方法

一、 clinit初始化和静态方法

类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在方法中。
java.lang.Class.forName(String name, boolean initialize,ClassLoader loader),其中第二个参数就是是否需要初始化。
在这里插入图片描述
Java类型初始化过程中对static变量的初始化操作依赖于static域和static代码块的前后关系,
static域与static代码块声明的位置关系会导致java编译器生成方法字节码。
类型的初始化方法只在该类型被加载(初始化)时才执行,且只执行一次。

二、对象实例化方法 init

Java对象在被创建时,会进行实例化操作。该部分操作封装在方法中,并且子类的方法中会首先对父类方法的调用。
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.
JVM-Java: What is the difference between and ?–stack overflow
上面这两句是Stack Overflow上的解析,很清楚init是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对静态变量,静态代码块进行初始化。看看下面的这段程序就很清楚了。

class X {
 
   static Log log = LogFactory.getLog(); // <clinit>
 
   private int x = 1;   // <init>
 
   X(){
      // <init>
   }
  {
     // <init>
   }
 
   static {
      // <clinit>
   }
 
}

clinit一定优先于init

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值