Java程序员深入java虚拟机(三)——类的生命周期(下)类的初始化

Java虚拟机类加载机制探究:生命周期、初始化、使用与验证 深度解析Java虚拟机中类的生命周期,包括加载、验证、初始化等阶段。强调主动和被动使用触发条件,总结类加载器类型和获取方法。 阅读详情
上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看。


       类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化。在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值。(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化

[html] view plain copy
  1. public class Test  
  2. {  
  3. public static int a = 0;  
  4. public static int b ;  
  5. static{  
  6. b=2;  
  7. }  
  8. }  


      静态变量的声明和静态代码块的初始化都可以看做静态变量的初始化,类的静态变量的初始化是有顺序的。顺序为类文件从上到下进行初始化,想到这,想起来一个很无耻的面试题,分享给大家看一下:

[java] view plain copy
  1. package com.bzu.csh;  
  2. class Singleton  
  3. {  
  4. private static Singleton singleton = new Singleton();  
  5. public static int counter1;  
  6. public static int counter2 = 0;  
  7. private Singleton()  
  8. {  
  9. counter1++;  
  10. counter2++;  
  11. }  
  12. public static Singleton getInstance()  
  13. {  
  14. return singleton;  
  15. }  
  16. }  
  17. public class Test  
  18. {  
  19. public static void main(String[] args)  
  20. {  
  21. Singleton singleton = Singleton.getInstance();  
  22. System.out.println("counter1 = " + singleton.counter1);  
  23. System.out.println("counter2 = " + singleton.counter2);  
  24. }  
  25. }  


大家先看看这里的程序会输出什么?

不知道大家的答案是什么,如果不介意的话可以把你的答案写到评论上,看看有多少人的答案和你一样的。我先说说我刚开始的答案吧。我认为会输出:

counter1 = 1

Counter2 = 1

不知道大家的答案是不是这个,反正我的是。下面我们来看一下正确答案:


不知道你做对没有,反正我刚开始做错了。好,现在我来解释一下为什么会是这个答案。在给出解释之前,我们先来看一个概念:

Java程序对类的使用方式可分为两种 

主动使用

被动使用

•所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化他们 

主动使用(六种) 

–创建类的实例 

–访问某个类或接口的静态变量,或者对该静态变量赋值 

–调用类的静态方法 

–反射(如Class.forName(“com.bzu.csh.Test”)) 

–初始化一个类的子类 

–Java虚拟机启动时被标明为启动类的类(Java Test) 

        OK,我们开始解释一下上面的答案,程序开始运行,首先执行main方法,执行main方法第一条语句,调用Singleton类的静态方法,这里调用Singleton类的静态方法就是主动使用Singleton类。所以开始加载Singleton类。在加载Singleton类的过程中,首先对静态变量赋值为默认值,

Singleton=null

counter1 = 0

Counter2 = 0

给他们赋值完默认值值之后,要进行的就是对静态变量初始化,对声明时已经赋值的变量进行初始化。我们上面提到过,初始化是从类文件从上到下赋值的。所以首先给Singleton赋值,给它赋值,就要执行它的构造方法,然后执行counter1++;counter2++;所以这里的counter1 = 1;counter2 = 1;执行完这个初始化之后,然后执行counter2的初始化,我们声明的时候给他初始化为0 了,所以counter2 的值又变为了0.初始化完之后执行输出。所以这是的

counter1 = 1

counter2 = 0

类初始化步骤

(1)假如一个类还没有被加载或者连接,那就先加载和连接这个类

(2)假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类

(3)假如类中存在初始化语句,那就直接按顺序执行这些初始化语句

       在上边我们我们说了java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化他们,上面也举出了六种主动使用的说明。除了上述六种情形,其他使用Java类的方式都被看作是被动使用,不会导致类的初始化。程序中对子类的“主动使用”会导致父类被初始化;但对父类的“主动”使用并不会导致子类初始化(不可能说生成一个Object类的对象就导致系统中所有的子类都会被初始化) 


注:调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

当java虚拟机初始化一个类时,要求它的所有的父类都已经被初始化,但这条规则并不适用于接口。

       在初始化一个类时,并不会先初始化它所实现的接口

       在初始化一个接口时,并不会先初始化它的父接口

      因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用 。如果是调用的子类的父类属性,那么子类不会被初始化。

深入Java虚拟机及其光盘内容3 理解Java虚拟机的很好的书 光盘的内容是不可缺少的学习资料 立即下载

相关推荐

深入Java虚拟机(原书第二版清晰版) 中文版 Bill Venners PDF

讲述java虚拟机 唯二的书。本书作者曾因本书荣获专业技术杂志《Java Report》评选的优秀作者奖,细心的读者可以从网上找到许多对本书第1版的赞誉。作者以易于理解的方式深入揭示了Java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益!

一个Java程序完整的生命周期

以下是总结的一张图表加载到内存的途径有很多,可以通过本地磁盘也可以通过网络(上图是通过网络)加载。

楠寻寻的博客 942

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3228

Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化...

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看。 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化。在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值。(2)在静态代码块处赋值...

红太阳照大地 216

开放平台 - 互动玩法演进之路

随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。

bilibili_TC的博客 1739

告别CPU空转!用STC8的SPI+DMA高效驱动上百颗WS2812B灯珠

本文详细解析了如何利用STC8单片机的SPI+DMA外设高效驱动WS2812B全彩灯珠,解决传统软件延时驱动方式在长灯带应用中的性能瓶颈。通过硬件方案设计、数据格式转换和DMA传输配置,实现高达400Hz的刷新率和低于5%的CPU占用率,适用于大规模灯光项目。

weixin_30847939的博客 395

JAVA类的生命周期和初始化

   类初始化 类"初始化"阶段,它是一个类或接口被首次使用的前阶段中的最后一项工作,本阶段负责为类变量赋予正确的初始值。 Java 编译器把所有的类变量初始化语句和类型的静态初始化器通通收集到 <clinit> 方法内,该方法只能被 Jvm 调用,专门承担初始化工作。 除接口以外,初始化一个类之前必须保证其直接超类已被初始化,并且该初始化过程是由 Jvm 保证线程...

hujin1979的专栏 352

SAP FAGLFLEXT 是 SAP 新总账的核心余额表,存储多维度的汇总余额数据。核心结论:该表按 “科目 + 会计年度 + 期间 + 维度” 存储累计余额,字段可分为基础标识

FAGLFLEXT是SAP新总账的核心余额表,采用"科目+年度+期间+维度"结构存储多维汇总数据。其字段分为基础标识(科目、年度等)、维度细分(公司代码、利润中心等15个维度)、金额数值(本外币余额)、辅助控制(状态标识)四大类,支持新总账的灵活核算。该表通过凭证自动更新,与旧总账GLT0相比显著扩展了维度核算能力,各维度需在科目主数据或Ledger配置中启用才能使用。

金牌架构师 454

Java虚拟机JVM学习04 类的初始化

  Java虚拟机JVM学习04 类的初始化 类的初始化   在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。   在程序中,静态变量的初始化有两种途径:   1.在静态变量的声明处进行初始化;   2.在静态代码块中进行初始化。   没有经过显式初始化的静态变量将原有的值。     一个比较奇怪的例子: package com.mengdd....

weixin_33862514的博客 153

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 403

【51单片机仿真】基于51单片机设计的温湿度采集检测系统__资料编号11

该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。

嵌入式阿齐Archie 2万+

Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看。        类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化。在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值。(2)在静态代码块处赋值,

曹胜欢 1万+

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3932

Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期 下)类的初始化

Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期 下)类的初始化

uffvhj的博客 183

【OpenClaw从入门到精通】第20篇:OpenClaw实战—从零搭建教育自动化助教系统(作业批改+智能答疑+学情分析)【2026实测】

本文基于OpenClaw开源框架,聚焦教育行业“答疑重复、批改耗时、学情模糊”三大核心痛点,提供从环境部署到功能落地的全流程实操方案。通过整合QQ群交互、代码分析、数据可视化等技能,构建“智能答疑+作业批改+学情分析”的自动化助教系统。系统支持7×24小时群聊答疑、多语言作业自动评审、学情数据周报生成,经实测可使助教工作时间减少60%、作业批改效率提升5-10倍、学情问题识别提前5周。文中包含完整配置步骤、可直接运行的代码示例及避坑指南,兼顾新手入门与进阶实操,帮助教育工作者快速落地自动化工具,从重复劳动中

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1449

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java程序员从笨鸟到菜鸟之(九十五)深入java虚拟机_Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化...

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看。类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化。在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值。(2)在静态代码块处赋值,比如下面的代码,a就是第一...

weixin_28882103的博客 169

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

腾讯云AI Skills实战:从零搭建Agent技能编排与排错指南

在AI应用开发中,Agent不仅需要大模型的理解与生成能力,更依赖一套可复用、可管理的技能体系来执行真实业务操作。腾讯云AI Skills提供了一站式工具调用与管理方案,将模型与具体业务解耦,让开发者可以像组装积木一样为Agent配置能力。本文围绕AI Agent、Function Calling、Docker、Redis等关键技术,介绍了如何设计Skill的输入输出契约、将服务容器化部署、以及排查“agent execution terminated due to error”等常见报错。通过实际案例,展

weixin_33831196的博客 397

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

瑞_JVM虚拟机_类的生命周期_初始化阶段 <clinit>

本文章为瑞_系列专栏之《JVM虚拟机》的类的生命周期篇的初始化阶段小节。初始化阶段 会执行静态代码块中的代码,并为静态变量赋值,初始化阶段会执行字节码文件中 clinit 部分的字节码指令,初始化阶段就是执行static代码块赋值

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2894

【深入Java虚拟机】之三:类初始化

类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段时(被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。 使用Java.lang

兰亭风雨的专栏 1万+

(二)Java虚拟机——类的生命周期

类的生命周期描述了一个类从加载、使用、卸载的过程。类的生命周期有七个阶段其中连接阶段又可以细分为验证,准备,解析。

一位热爱编程的青年 1127

java类的生命周期

在Java类的生命周期中,**加载阶段(Loading)**是类生命周期的第一个阶段,指的是JVM将类的字节码文件从外部(通常是硬盘或其他存储介质)加载到内存中的过程。加载阶段涉及到类加载器(ClassLoader)从类路径中找到相应的类文件,并将其加载到JVM内存中以便后续使用。请求加载:查找类文件:加载类字节码:创建类的对象:类加载器的作用非常重要,它负责从类路径中查找并加载类文件。在加载类时,JVM会根据类加载器的机制来决定如何加载不同的类。类加载器有几种类型,它们的职责如下:引导类加载器(Boots

gggfJJ的博客 1634

Java程序员从笨鸟到菜鸟之(九十三)深入java虚拟机(二)——类的生命周期(上)类的加载和连接

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.youkuaiyun.com/csh624366188               类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码

曹胜欢 2万+

吃透Java基础三:触发类初始化的五种方式

一:类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析这三个阶段统称为链接。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类加载过程必须按照这种顺序按部就班的开始。 二:类加载时机 什么情况下需要开始类加载过程的第一个阶段:加载 呢?Java虚拟机规范中并没有进行强制约束,这点可以交...

吃透Java 1509

Java中类的生命周期

Java虚拟机管理类和对象的生命周期; (1)类的生命周期从类被加载,连接,初始化开始,到类被卸载结束; (2)类处于生命周期时,它的二进制数据位于运行时方法区内,在堆区还有一个相应的描述类的Class类的对象; (3)只有当类处于生命周期中时,Java程序才能够使用它。   1.Java虚拟机及程序的生命周期 (1)通过java命令运行一个Java程序时,启动一个Java虚拟机进程;

JBuilder3的专栏 3862

Java虚拟机(JVM)(6)—— 类的生命周期

本文主要介绍类的生命周期,以及在各阶段所执行的任务,希望对大家的日常工作有所帮助☺

知唔猪的博客 990
上一篇: Java程序员深入java虚拟机(二)——类的生命周期(上)类的加载和连接
下一篇: Java程序员深入java虚拟机(四)——java虚拟机的垃圾回收机制
lmjsummer
博客等级 码龄9年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值