阿里面试官问Java中init和clinit区别,这么回答offer应该稳了
发布日期:2021-06-30 12:24:57
浏览次数:2
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月04日 09时11分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
分布式服务与库表设计
2019-04-30
Css布局口诀
2019-04-30
超详细常用css布局
2019-04-30
css 各种常见布局整理
2019-04-30
CSS布局大全
2019-04-30
超干货 CSS3/SVG Loading动画集合
2019-04-30
Python黑帽 获取注册表、U盘历史痕迹和回收站文件
2019-04-30
C++读取配置文件代码
2019-04-30
人脸识别+表情检测+行人检测+人脸关键点检测!Open CV
2019-04-30
C++ 虚函数基础知识
2019-04-30
SQL Server 数据库性能优化
2019-04-30
数据库SQL优化大总结之 百万级数据库优化方案
2019-04-30
数据库性能优化一:数据库自身优化(大数据量)
2019-04-30
MYSQL数据库语句优化
2019-04-30
Modbus通讯两种传输方式
2019-04-30
关于TCP/IOCP构架中出现的Socket假死连接解决方案
2019-04-30
UDP Socket客服示例
2019-04-30
十大滤波算法程序大全(精心整理版) - C++
2019-04-30
60个非常实用的CSS代码
2019-04-30
Oracle在存储过程中如何返回结果集
2019-04-30