【40】阿里面试常问:聊聊JVM虚拟机中init和clinit的区别?

在jvm第一次加载文件时调用,包括静态变量初始化语句和静态块的执行。:在实例创建出来的时候调用,包括调用new操作符;调用Class或对象的方法;调用任何现有对象的方法;通过类的方法反序列化。是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的方法时才会执行init方法,而是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用方法。是实例构造器,对非静态变量解析初始化,而是class类构造器对静态变量,静态代码块进行初始化。
摘要由CSDN通过智能技术生成

 <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>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值