类加载的初始化阶段的奥秘

一、概述
初始化阶段是类加载机制(加载,链接(验证,准备,解析),初始化)的最后一步。在准备阶段已经为类变量赋过一次值(默认为0或null)。在初始化阶段,进行静态变量的赋值和静态代码块的执行。也就是执行类构造器 <clinit> 方法、分配静态变量的内存空间和执行static方法块的过程。<clinit>方法是线程安全的,JVM会确保在多线程环境中正确地加锁同步。


二、举例
1.private static int i = 1;
在上面 i 是被 static 所修饰的,在准备阶段被赋值为0,在初始化阶段被赋值为1。
2.private static final int i = 1;
被final修饰的基本类型或字符串类型的静态变量在编译时就被确定并在准备阶段赋值,否则在初始化阶段赋值。
同时被 final和 static 修饰的变量i准备阶段之后就是 1 了。可以理解为 static final 在编译时就将结果放入调用它的类的常量池中了。


三、初始化步骤
1、若该类还没有被加载和链接,则程序先加载并链接该类。
2、若该类的直接父类还没有被初始化,则先初始化其直接父类。
3、若类中有初始化语句,则系统按照代码文本顺序依次执行这些初始化语句。


四、类初始化时机
只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下几种情况:
1.创建某个类的实例。
2.访问某个类或接口的静态变量或静态方法,对 该 静 态 变 量 赋 值 。
3.调 用 类 的 静 态 方 法 反 射 , 如Class.forName("com.xxx.test")。调用某类的反射方法。
4.初始化某个类的子类,则其父 类也会被 初始化。
5.Java 虚 拟机启 动时被标 明为启 动类的 类( main)。
6.当使用 JDK 1.7 的动态语言技术时,若一个 java.lang.invoke.MethodHandle 实例最终的解析结果为 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄时,并且这些方法句柄所对应的类未进行过初始化,则需先触发这些类的初始化。


五、引申
1.虚拟机设计团队把加载动作放到 JVM外部实现,以便让应用程序决定如何获取、加载、初始化所需的类。
2.子类引用父类的静态变量时,只会初始化父类而不会初始化子类。
3.类的初始化只会进行一次,若类已初始化,则不会再初始化。
4.若在类初始化过程中发生异常,则JVM会抛出java.lang.ExceptionInitializerError异常。
 


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

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

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

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

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

相关文章

HTML和CSS基础(一)

前言 HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它由各种标签组成&#xff0c;这些标签定义了网页的结构和内容。HTML的早期形式诞生于1989年&#xff0c;由CERN的物理学家Tim Berners-Lee发明&#xff0c;最初用于在科学家之…

js 刷题常用方法

Object 对象共有 toString()valueOf()obj.keys()obj.values()obj.entries()for of 循环…扩展运算符Array.of()Array.from() 数组使用时 toString 返回以逗号分隔的字符串valueOf 返回数组本身 Array 数组 创建数组 Array.from(可迭代对象)Array.of(传入一组参数) let arr…

C语言 | Leetcode C语言题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {if (headA NULL || headB NULL) {return NULL;}struct ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA NULL ? headB : pA->ne…

windows11 x64 23H2 企业纯净版2024.6.16

闲来无事试安装了下da_nao_yan的 【6月12日更新】Windows11 22631.3737企业版 23H2 自用优化版 &#xff08;原版地址&#xff1a;https://bbs.pcbeta.com/viewthread-1985546-1-1.html&#xff09;&#xff0c;感觉比原版流畅多了&#xff0c;重新按照自己习惯封装了下&#x…

C++作业第四天

#include <iostream> using namespace std; class Per { private: string name; int age; int *high; double *weight; public: //构造函数 Per() { cout << "Per的无参构造" << endl; } Per(str…

Python获取一个列表的全组合

numList [1, 3, 5, 7, 9] from itertools import combinationsfor i in range(1, len(numList) 1): # xrange will return the values 1,2,3,4 in this loopprint(list(combinations(numList, i)))输出&#xff1a; [(1,), (3,), (5,), (7,), (9,)] [(1, 3), (1, 5), (1, 7)…

通讯的一些基本概念 -网卡 -网段 -网桥 -路由表

网卡&#xff08;Network Interface Card, NIC&#xff09; 网卡是安装在计算机或其他设备上的硬件组件&#xff0c;它允许设备通过有线或无线方式连接到计算机网络。网卡工作在OSI模型的数据链路层&#xff08;第二层&#xff09;和物理层&#xff08;第一层&#xff09;&…

排序——希尔排序

希尔排序实际上是插入排序的优化&#xff0c;所以要先介绍插入排序。 目录 插入排序 思想 演示 代码实现 总结 希尔排序 思想 演示 代码 总结 插入排序 思想 又称直接插入排序。它的基本思想是将一个值插入到一个有序序列中。直至将所有的值都插入完。 演示 假设数…

Web前端开发的过程:深入剖析与精彩演绎

Web前端开发的过程&#xff1a;深入剖析与精彩演绎 在数字化时代&#xff0c;Web前端开发作为构建用户界面的关键环节&#xff0c;其重要性不言而喻。这一过程涉及众多技术细节和创意构思&#xff0c;充满了挑战与机遇。本文将从四个方面、五个方面、六个方面和七个方面&#…

Java并发编程三大神器之Semaphore

Java并发编程三大神器之Semaphore 1、Semaphore是什么2、Semaphore小试牛刀3、Semaphore和CountDownLatch组合使用4、Semaphore常用方法5、Semaphore 结语 1、Semaphore是什么 Semaphore 是一个计数信号量&#xff0c;是JDK1.5引入的一个并发工具类&#xff0c;位于java.util.…

实验五:分枝限界法

实验五&#xff1a;分枝限界法 【实验目的】 应用分枝限界法的算法设计思想求解单源最短路径问题。 【实验内容与要求】 采用分支限界法编程求源点0到终点6的最短路径及其路径长度。 要求完成&#xff1a;⑴算法描述⑵写出程序代码⑶完成调试⑷进行过程与结果分析。 【实验…

logTrick

贴一下灵神的题解里面的解释~ 就是一种优化策略&#xff0c;logtrick class Solution { public:int minimumDifference(vector<int>& nums, int k) {int res 0x3f3f3f3f;int n nums.size();for(int i0;i<n;i){res min(res,abs(nums[i]-k));for(int j i-1;j&g…

编程0基础学难吗:深度剖析与实用指南

编程0基础学难吗&#xff1a;深度剖析与实用指南 编程&#xff0c;这个看似神秘而高深的领域&#xff0c;对于许多零基础的学习者来说&#xff0c;往往伴随着一系列的疑问和困惑。那么&#xff0c;编程零基础学习究竟难不难呢&#xff1f;本文将从四个方面、五个方面、六个方面…

算法题解记录28+++对称二叉树(百日筑基)

一、题目描述&#xff1a; 题目难度&#xff1a;简单 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 分割线 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,nul…

SpringAI学习及搭建AI原生应用

文章目录 一、SpringAI是什么二、准备工作1.GPT-API-free2.AiCore3.eylink 三、对话案例实现1.创建项目2.实现简单的对话 四、聊天客户端ChatClient1.角色预设2.流式响应3.call和stream的区别 五、聊天模型提示词提示词模板 六、图像模型(文生图)七、语音模型1.文字转语音(文生…

【C语言】分支与循环(下)

目录 6. while 循环 7. for 循环 8. do-while 循环 9. break 和 continue 循环 10. 循环的嵌套 11. goto 语句 正文开始—— 6. while 循环 C语言提供了三种循环&#xff0c;while 就是其中一种。 while 语句的语法结构与 if 语句非常相似。 6.1 if 和 wh…

ubuntu中安装docker并换源

使用 Ubuntu 的仓库安装 Docker sudo apt update现在&#xff0c;你可以使用以下命令在 Ubuntu 中安装 Docker 以及 Docker Compose&#xff1a; sudo apt install docker.io docker-composeDocker 包被命名为 docker.io&#xff0c;因为在 Docker 出现之前就已经存在一个名为…

hashlib的简单使用

在 Python 中&#xff0c;hashlib 模块提供了常见的哈希算法&#xff0c;如 SHA1, SHA256, MD5 等。在安全性相关的应用中&#xff0c;比如用户密码存储&#xff0c;hashlib 通常用于生成哈希值以确保密码存储的安全性&#xff0c;因为直接存储用户密码是不安全的。 以下是如何…

【论文复现|智能算法改进】基于多策略融合灰狼算法的移动机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.改进点 混沌反向学习策略 融合Logistic混沌映射和Tent混沌映射生成Logistic-Tent复合混沌映射: Z i 1 { ( r Z i ( 1 − Z i ) ( 4 −…

git - LFS 使用方法

安装Git LFS 访问 Git LFS官网 下载适用于您操作系统的版本。 Linux用户&#xff0c;解压缩下载的.tar.gz文件&#xff0c;并通过终端运行安装脚本。 tar -xvf git-lfs-linux-amd64-vX.Y.Z.tar.gz cd git-lfs-X.Y.Z sudo ./install.sh 初始化Git LFS # 全局启用 git lfs i…