专栏首页JavaEdge面试官问Java中init和clinit区别,这么回答offer应该稳了

面试官问Java中init和clinit区别,这么回答offer应该稳了

JVM 源码,都是初始化方法

1 执行时机

  • init是构造器时
  • clinit是类构造器时,也就是在类加载—–验证—-解析—–初始化,中的初始化阶段jvm调用clinit方法

2 执行目的

看 JVM 源码:

is_static是啥?

  • init是instance实例构造器,对非静态变量解析初始化
  • clinit是class类构造器对静态变量,静态代码块进行初始化

3 clinit详解

准备阶段,变量已经赋过一次系统要求的初始值 在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器<clinit>方法的过程。

<clinit>方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问

虚拟机会保证在子类的<clinit>方法执行之前,父类的<clinit>方法已经执行完毕。 因此在虚拟机中第一个被执行的<clinit>方法的类肯定是java.lang.Object。意味着父类中定义的静态语句块要优先于子类的变量赋值操作

接口中不能使用静态语句块,但仍有变量初始化的赋值,因此接口与类一样都会生成<clinit>方法。 不同的是,执行接口的<clinit>方法不需要先执行父接口的<clinit>方法。 只有当父接口中定义的变量使用时,父接口才会初始化。 另外,接口的实现类在初始化时也一样不会执行接口的<clinit>方法。

接口中的属性都是static final类型的常量,因此在准备阶段就已经初始化。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从JVM 源码看init和clinit到底什么区别

    准备阶段,变量已经赋过一次系统要求的初始值 在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是...

    JavaEdge
  • Java编程思想第五版精粹(五)-初始化和清理(下)

    以编译时错误的方式呈现。编译器可以为 i 赋一个默认值,但是未初始化的局部变量更可能是程序员的疏忽,所以强制程序员提供一个初始值,往往能帮助找出程序里的 bug...

    JavaEdge
  • 虚拟机的类加载机制1 类加载的时机

    JavaEdge
  • 从JVM 源码看init和clinit到底什么区别

    准备阶段,变量已经赋过一次系统要求的初始值 在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是...

    JavaEdge
  • ​golang的变量定义为什么还没有python简洁?

    最近在深度研究k8s和docker,期间发现源码是golang。无奈,只好乘机把golang也学了。

    运维部落
  • 使用微信小程序 富文本编辑器组件 editor

    https://developers.weixin.qq.com/miniprogram/dev/component/editor.html 富文本组件文档

    hotqin888
  • 新型工控恶意软件Triton卷土重来

    据外媒报道,Triton针对关键基础设施的第二次攻击已启动,此次事件幕后黑手或为某俄罗斯组织。尽管FireEye公司没有公布设施的位置和类型等细节,但其表示,袭...

    周俊辉
  • VR内容什么时候可以爆发呢? | 拔刺

    先来看看什么是VR虚拟现实技术。VR是基于计算机技术结合传感器构建体验虚拟现实的技术,能够给用户带来身临其境的沉浸感。VR系统的基本要素是计算机技术和传感器技术...

    镁客网
  • Windows10 ARM版本Chromium性能大幅提升

    实验将基于ARM版本的真机Windows 10与仿真的x86版本进行比较,并发现了处理器占用上的巨大差异。当他们尝试在两台Windows 10电脑上打开Chro...

    德顺
  • 企业神奇中间件-RPC(总览) No.97

    大蕉

扫码关注云+社区

领取腾讯云代金券