阿里面试官问Java中init和clinit区别,这么回答offer应该稳了
发布日期:2021-06-30 12:24:57
浏览次数:3
分类:技术文章
本文共 748 字,大约阅读时间需要 2 分钟。
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类型的常量,因此在准备阶段就已经初始化。
转载地址:https://javaedge.blog.csdn.net/article/details/106039513 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月30日 06时25分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【python学习笔记】jion()函数和split()函数
2019-04-30
【NLP学习笔记】使用jieba实现关键词提取
2019-04-30
【深度学习笔记】卷积的原理
2019-04-30
【深度学习笔记】卷积的基础知识
2019-04-30
【NLP学习笔记】TF-IDF
2019-04-30
【NLP学习笔记】文本相似度计算——判断两篇文章是否相似
2019-04-30
【NLP学习笔记】余弦相似度
2019-04-30
【NLP学习笔记】One-hot encoding:独热编码
2019-04-30
【NLP学习笔记】word2vec
2019-04-30
【工具使用】如何去掉CSDN-markdown编辑器中图片的水印
2019-04-30
【工具使用】CSDN编辑器markdown字体、颜色与字号的设置
2019-04-30
【深度学习笔记】卷积核weights参数shape说明
2019-04-30
【深度学习笔记】Tensorflow中dense(全连接层)各项参数
2019-04-30
【Python学习笔记】切片x[::2] 理解
2019-04-30
【Python学习笔记】lambda表达式
2019-04-30
【NLP学习笔记】词共现矩阵
2019-04-30
【NLP学习笔记】NLP基础知识框架图
2019-04-30
【深度学习笔记】卷积的输入输出的通道、维度或尺寸变化过程
2019-04-30