首页 > 编程语言 >Java中类的生命周期(快速掌握)

Java中类的生命周期(快速掌握)

时间:2024-10-25 20:21:18浏览次数:9  
标签:Test1 生命周期 Java 变量 代码 new 执行 中类

Java中类的生命周期(快速掌握)

概览

image-20241024102834608

加载阶段

第一步

我们也可以使用Java代码拓展不同的渠道

image-20241024103421081

第二步

image-20241024103609026

第三步

这里的InstanceKlass是区别与源代码中的Class

image-20241024103732162

第四步

方法区中的Klass对象,是使用C++所编写出来的对象,一般不能够直接进行操作,并且其中有部分信息,开发者在开发时并不是经常用的到,所以就在堆区中又创建了一个Class对象,该Class对象在反射中尤为重要

这样也能很好的控制开发者访问数据的范围,为数据安全做保障

image-20241024103910248

连接阶段

验证

这里只罗列了四部分,但是真实验证的内容远远不止这些

image-20241024105558986

准备

准备阶段为静态变量(static)分配内存并且设置初始值(这里以JDK8之后的版本为例)

例如,有如下代码

public static int i=1;

在准备阶段,会为 i 这个变量设置默认值0,赋值为1的操作并不在该阶段,而是在下一个阶段

这里给出大部分类型的默认初始值

image-20241024110441822

  • 注意:有一个特殊情况,如果静态变量使用final修饰,那么在该阶段会直接为该变量赋值

例如,有如下代码

public static final int i=1;

这里又final修饰,会直接将 i 赋值为1,不会赋给 i 默认值0

解析

image-20241024110922975

  • 直接引用就是常说的内存地址的引用

初始化

概览

image-20241024111543332

例子如下,

image-20241024111620140

这里最终value的值为2

思考一个问题,如果将该静态代码块放到声明该变量之前会发生什么?答案是,value的值将被赋值为1

我们从字节码指令的角度来看,为什么会是这样的结果

  • 会发现,iconst_1与iconst_2的字节码命令的执行顺序发生了改变

image-20241024111920296

那么,就有一个结论——clinit方法中的执行顺序与Java代码中编写的顺序是一致的

类的初始化的方式

image-20241024112413797

  • 注意:clinit指令在某些特定的情况下不会执行

image-20241024114150978

  • 在继承中的clinit指令执行情况

image-20241024114347923

题目练手

第一道

image-20241024112754270

这里最终会在控制台输出DACBCB

首先由于main方法要执行,所以会加载Test1这个类,那么就会执行静态代码块中的代码,输出D。然后,开始执行main方法,输出A。接着 new 了两个Test1对象,由于Test1这个类在之前已经加载过了,所以不会重复加载,自然也就不会再打印D了。new Test1会执行该类的构造方法,打印 “C” 的语句最终会被整合到构造方法中,并且放在打印“B”的前面(这个大家可以根据字节码指令,或者自行搜索相关资料来了解一下),所以就是输出 “C” “B”,由于是 new 了两个Test1,所以就执行两遍打印“C” “B”。最终的答案就是,输出“DACBCB”

第二道

image-20241024114417028

new B02,首先会优先初始化父类,那么a=1,然后再接着初始化子类,a=2,所以最终答案是a=2

  • 拓展一下,如果将new B02()去掉,又会是什么结果呢?

B02.a 访问的是父类A02中的静态变量a(因为a这个变量就是父类A02的中的变量),所以最终a=1

标签:Test1,生命周期,Java,变量,代码,new,执行,中类
From: https://blog.csdn.net/AIAIAIXIAO_/article/details/143242938

相关文章

  • 基于java+springboot的高校毕业生就业推介系统
    基于java+springboot的高校毕业生就业推介系统是一款助力高校毕业生就业的平台。它全面记录毕业生个人信息,如基本信息、学习成绩、获奖实习等履历,且支持实时更新。对企业则有入驻审核机制,确保合法性,企业可发布岗位信息并管理。系统运用智能匹配算法,依据毕业生专业、技能......
  • 自学狂神说java第四天
    HelloWorld随便新建一个文件夹存放代码新建一个Java文件文件名后缀为.javaHello.java注意文件拓展名编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}编译javacjava文件,自动生成class文件......
  • java多线程
    Java中的多线程是Java编程语言的一个重要特性,它允许程序同时执行多个任务。在多线程环境中,每个线程都可以独立地执行任务,提高了程序的并发性和性能。本文将详细介绍Java中多线程的概念、实现方式以及多线程编程中的注意事项。一、多线程的概念多线程是指在一个程序中同时运......
  • 【JavaEE初阶】网络原理(1)
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~互联网中最主流的时TCP/IP五层协议(应用层,传输层,网络层,数据链路层,物理层),应用层是程序员日常开发中最常用到的一层(可以使用已经开发好的协议,也可以自己定义应用层协议),其他层则操作系统/硬件/......
  • 3:java的介绍与基础:if-else语句
    3.1if-else语句3.1.1ifelse语句每一个代码的本质逻辑是差不多的,而我们在python中学过的ifelse的语句,就是基本的条件逻辑。在Java中我们同样也要学习关于条件语句的写法,首先来学习一下关于ifelse的写法。在Java中写ifelse的基本逻辑与python没有任何区别,就是格式有一定......
  • java计算机毕业设计宠物网站(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着人们生活水平的提高,宠物在现代社会中的地位日益凸显。越来越多的家庭选择饲养宠物,宠物已经成为许多人生活中不可或缺的一部分。在这样的背景......
  • java计算机毕业设计大学生志愿者服务管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展,志愿服务在社会各个领域发挥着越来越重要的作用。大学生作为充满活力、富有社会责任感且具备一定知识技能的群体,是志愿服务的主力......
  • java计算机毕业设计超市收银系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今商业环境下,超市作为零售业的重要组成部分,面临着日益复杂的运营管理需求。随着消费者数量的增加、商品种类的多样化以及市场竞争的加剧,传统......
  • java计算机毕业设计高校课程思政网站(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着高等教育的发展以及教育理念的不断更新,课程思政成为高校教育教学改革的重要方向。在当今社会多元文化思潮的冲击下,传统的高校课程体系在思想......
  • c++/python/java/go用途介绍
    C++用途:系统编程:操作系统、驱动程序等底层开发。游戏开发:游戏引擎和高性能游戏应用,因其高效的性能和内存管理。嵌入式系统:适合资源受限的设备。科学计算:高性能计算和数值分析。金融系统:高频交易和复杂金融模型。Python用途:数据科学与分析:广泛用于数据处理和可视化......