Java中类初始化的奥秘

一、概述
在 Java 语言中,类的加载、链接(验证、准备、解析)和初始化过程都是在程序运行期间完成的。
其中加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的。解析阶段可以在初始化之前也可以在初始化之后再开始(又叫作运行时绑定、动态绑定、晚期绑定)。


二、以下5种情况必须对类进行初始化(当然加载、验证、准备阶段也需要在初始化之前完成):
1.遇到 new、getstatic、putstatic 或 invokestatic 这 4 条字节码指令时若类未初始化则触发初始化。
使用场景:使用 new 关键字实例化对象、读取一个类的静态字段(被 final 修饰并且已在编译期把结果存入常量池的静态字段除外)、调用一个类的静态方法等。
2.使用 java.lang.reflect 包中的方法对类进行反射调用的时候。
3.当初始化一个类的时候,如果其父类还未进行初始化,则需先触发其父类的初始化。 
4.当虚拟机启动时,用户需指定一个要加载的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。
5.当使用 JDK 1.7 的动态语言技术时,若一个 java.lang.invoke.MethodHandle 实例最终的解析结果为 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄时,并且这些方法句柄所对应的类未进行过初始化,则需先触发这些类的初始化。


三、以上5种方式是对一个类的主动引用,除此之外,所有其它引用类的方法都不会触发初始化,这叫做被动引用。例如:
/**
* 虚拟机在运行时动态创建了一个数组类,通过数组定义来引用类不会触发此类的初始化。
*/
AClass[] ac = new AClass[8];

/**
* 常量在编译阶段会存入调用类的常量池中,
* 所以本质上并没有直接引用到定义类常量的类,
* 因此不会触发定义常量的类的初始化。
* Constant.FOO="foo" 在编译期常量传播优化时已经存储到 常量池中了。
*/
System.out.println(Constant.FOO);
 


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#与汇川plc通信 使用官网API库

前言 上位机开发中有时会要求与PLC进行通信,汇川官网也有好用的API库方便大家使用。记录一下开发过程。 1.下载资料 汇川官网地址:汇川技术 - 推进工业文明 共创美好生活 打开后选择:服务与支持-》资料下载-》 资料下载 这里可以直接搜索&am…

六级作文---3.图画类

六级作文—3.图画类 范文 As is illustrated in the graph, the share of urban population increased from 19.39% to 60.6% between 1980 and 2019. From my perspective, the above figures reveal a currently prevailing tendency and represent China’s achievements i…

C++学习插曲:“name“的初始化操作由“case“标签跳过

问题 "name"的初始化操作由"case"标签跳过 问题代码 case 3: // 3、删除联系人string name;cout << "请输入删除联系人姓名&#xff1a;" << endl;cin >> name;if (isExistPerson(&abs, name) -1){cout << "…

【刷题篇】分治-归并排序

文章目录 1、排序数组2、交易逆序对的总数3、计算右侧小于当前元素的个数4、翻转对 1、排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 class Solution { public:vector<int> tmp;void mergeSort(vector<int>& nums,int left,int right){…

cocos creator3.7版本拖拽事件处理

前言&#xff1a;网上能找到的资料都太落后了&#xff0c;导致哥们用AI去写&#xff0c;全是瞎B写&#xff0c;版本都不对。贴点实际有用的。别老捣鼓你那破convertToNodeSpaceAR或者convertToNodeSpace了。 核心代码 touch.getDeltaX() touch.getDeltaY() 在cocoscreator3…

python-自幂数判断

[题目描述]&#xff1a; 自幂数是指&#xff0c;一个N 位数&#xff0c;满足各位数字N 次方之和是本身。例如&#xff0c;153153 是 33 位数&#xff0c;其每位数的 33 次方之和&#xff0c;135333153135333153&#xff0c;因此 153153 是自幂数&#xff1b;16341634 是 44 位数…

简单快速设置Windows和Ubuntu双系统双引导

一、参考资料 Windows和Ubuntu双系统安装教程 二、设置引导 1. 安装EasyBCD 下载并安装 EasyBCD 2. 设置Windows引导 3. 设置Ubuntu引导 4. 启动系统 遇到这种情况&#xff0c;直接Enter回车。 三、修复引导 如果引导区损坏&#xff0c;导致无法进入系统&#xff0c;可以…

FuTalk设计周刊-Vol.041

&#x1f525;AI漫谈 热点捕手 1、国产GPTs来了&#xff0c;基于智谱第4代大模型 全自研第四代基座大模型GLM-4&#xff0c;且所有更新迭代的能力全量上线。GLM-4性能相比GLM-3提升60%&#xff0c;逼近GPT-4&#xff08;11月6日最新版本效果&#xff09;。而同时推出的GLM-4-…

【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞

0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…

生活中的人工智能

生活中的人工智能应用广泛&#xff0c;涵盖了多个领域&#xff0c;以下是一些主要的应用场景和详细介绍&#xff1a; 智能家居&#xff1a; 智能家居控制&#xff1a;利用AI技术&#xff0c;实现对智能家居设备的智能化控制&#xff0c;如智能灯光、智能窗帘、智能音响、智能门…

六级作文---2.选择与平衡类

六级作文—2.选择与平衡类 范文一&#xff08;选择理科还是文科专业&#xff1f;&#xff09; It is universally acknowledged that, all other factors being equal, a proper choice on major could be the difference between one’s success of failure. But when it com…

算法分析与设计期末考试复习(更新ing)

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

[个人博客]喊你来收藏下我的个人博客

最近整了两个博客 一个用来专门记录技术相关: Developer.lulu 的个人技术博客 一个用来记录平时的一些思考: 有启发 之所以决定要重新搞两个博客,是因为我个人还是喜欢一个主题,一件事情 说实话,每次在 csdn 上写碎碎念的时候,都有些不好意思,毕竟大家来这里都是抱着学技术知识…

根据反射获取枚举值集合

1、获取枚举集合&#xff08;根据枚举类名通过反射实现&#xff09; /// <summary> /// 枚举下拉列表接口 /// </summary> /// <returns></returns> [HttpGet("enumerations/{enumCode}")] [AllowAnonymous] public…

43.bug:mapper接口参数使用@param重命名导致的错误

错误信息&#xff1a;Nested exception is org.apache.ibatis.binding.bindingException:parameter inVo not found public interface UserMapper{ //查询用户列表User queryUserList(Param ("inVo") UserInVo userInVo); } 对应的UserMapper如下&#xff1a; &l…

让 AI 写高考作文丨10 款大模型 “交卷”,实力水平如何?

文章部分素材来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 前言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是逐渐融入我们日常生活的实用工具。从智能语音助手到自动驾驶汽车&#xff0c…

kvm虚拟化2

需求&#xff0c;给你的kvm机器增加500g的neicun 1.vmware增家50g的硬盘 2.重启vm虚拟机 mkfs.xfs /dev/sdb mkdir /new_data mount -t xfs /dev/sdb /new_data #将虚拟机的磁盘放到/new_data下1先给虚拟机guanji [rootlocalhost ~]# virsh shutdown linux0224_cento7 Domai…

JS里 new Map()方法介绍

在JavaScript中&#xff0c;new Map() 用于创建一个新的Map对象。Map是一种数据结构&#xff0c;允许你存储键值对&#xff0c;其中任何值&#xff08;对象和原始值&#xff09;都可以作为一个键或一个值。 Map对象的特点&#xff1a; 键值对存储&#xff1a;Map是一种键值对…

SWD端口无法连接如何排查

大家在调试GD32 MCU的时候是否也碰到过SWD调试端口无法连接的情况&#xff1f;SWD端口无法连接的原因有很多&#xff0c;有时候排查没有思路&#xff0c;可能会耽误大家的时间&#xff0c;下面小编为大家介绍常见的SWD无法连接的原因&#xff0c;供大家排查参考&#xff1a; 排…

炫技来了!使用SDR设备成功抓到蓝牙air packet, 并且wireshark实时解析, 没错就是蓝牙空口抓包器

本文章主要介绍是用ZYNQ7020AD9361Gnu radio是搭建一个蓝牙抓包器的文章。 由于之前一直做蓝牙Host&#xff0c;对controller觉得是一个比较虚无缥缈的东西&#xff0c;得不到的总是在骚动&#xff0c;所以最近用我用吃灰了2年的SDR(Software Defined Radio&#xff09;设备研…