理解Java类加载与对象创建顺序

 在Java编程中,理解类加载和对象创建的顺序是非常重要的。这个过程涉及到静态代码块、静态成员变量、实例代码块以及构造器的执行顺序。在本文中,我们将深入探讨Java中类加载和对象创建的顺序,并通过示例代码来加深理解。

类加载顺序

首先,让我们来看一下类加载的顺序。当JVM加载一个类时,它会按照以下步骤执行:

  1. 加载父类:首先,JVM会加载父类。在加载父类的过程中,父类中的静态代码块和静态成员变量会被优先执行。

  2. 加载子类:接着,JVM加载子类。同样,子类中的静态代码块和静态成员变量也会被优先执行。

对象创建顺序

在类加载完成之后,接下来就是对象的创建过程。对象的创建顺序如下:

  1. 创建父类对象:在创建子类对象之前,会先创建父类对象。在创建父类对象之前,会先创建对象的资源。然后,执行父类的构造器,完成父类对象的创建。

  2. 创建子类对象:在创建子类对象之前,同样会先创建对象的资源。然后,执行子类的构造器,完成子类对象的创建。

比如以下实例 

package study2.day22;class Parent {static {System.out.println("Parent static block"); // 静态代码块}{System.out.println("Parent instance block"); // 实例代码块}public Parent() {System.out.println("Parent constructor"); // 构造器}
}class Child extends Parent {static {System.out.println("Child static block"); // 静态代码块}{System.out.println("Child instance block"); // 实例代码块}public Child() {System.out.println("Child constructor"); // 构造器}
}public class Main {public static void main(String[] args) {System.out.println("Creating Child object:");Child child = new Child();}
}

输出结果为

Parent static block
Child static block
Creating Child object:
Parent instance block
Parent constructor
Child instance block
Child constructor

执行流程为 1.父类的静态内容(按顺序执行)(不包含静态方法(方法是无法被自动加载的只能调用时候的执行))

             静态方法是属于类的而不是对象的。因此,静态方法在继承时不能被重写,而是被隐藏。

                   2.子类的静态内容        

                   3.加载父类的成员变量,执行实例代码块

                   4.执行父类的构造方法

                   5.加载子类的成员变量,执行实例代码块

                   6.执行子类的构造方法

为什么要先3在4呢?

在Java中,当你创建一个对象时,它需要经历一系列步骤来完成初始化。这些步骤包括为对象分配内存空间、初始化实例变量和执行构造方法。

  1. 分配内存空间:首先,内存空间会被分配给对象。这个过程会为对象的实例变量分配内存。

  2. 初始化实例变量:接着,实例变量会被初始化。如果类中包含实例代码块,它们会在执行构造方法之前被执行。实例代码块的作用是在对象创建时执行一些额外的初始化操作。

  3. 执行构造方法:最后,构造方法会被执行。构造方法用来设置对象的初始状态,完成对象的初始化过程。

在继承关系中,当你创建子类对象时,Java会先初始化父类的部分,然后再初始化子类的部分。这意味着,在执行子类的构造方法之前,父类的实例代码块和构造方法会被执行。这是因为子类继承了父类的实例变量和方法,所以在创建子类对象时,需要先确保父类部分的初始化完成。

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

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

相关文章

pg数据库学习知识要点分析-1

知识要点1 对象标识OID 在PostgreSQL内部,所有的数据库对象都通过相应的对象标识符(object identifier,oid)进行管理,这些标识符是无符号的4字节整型。数据库对象与相应oid 之间的关系存储在对应的系统目录中&#xf…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目: Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者:Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

SAP-PP-MM特殊库存的生产发料

如果有个物料是在特殊库存E,那么往生产订单发料是如何确定哪一个组件消耗这个特殊库存呢? 在生产订单中有哪些标记确定特殊库存?确定销售订单和行项目? 通过上图可以看到特殊库存标记1,也就是单独客户库存。 其他的特…

UVa11865 Stream My Contest

UVa11865 Stream My Contest 题目链接题意输入格式输出格式 分析朱-刘算法 不固定根的最小树形图求法AC 代码 题目链接 UVA - 11865 Stream My Contest 题意 你需要花费不超过cost元来搭建一个比赛网络。网络中有n台机器,编号为0~n-1,其中机器0为服务器…

洗地机什么品牌好?洗地机怎么选?618洗地机选购指南

随着科技的飞速发展,洗地机以其高效的清洁能力、稳定的性能和用户友好的设计而闻名,不仅可以高效吸尘、拖地,还不用手动洗滚布,已经逐渐成为现代家庭不可或缺的清洁助手。然而,在众多品牌和型号中,如何选择…

C++语言·string类

1. 为什么有string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数(strcpy,strcat),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming面向对…

封装长按触发事件的uniapp组件

简单说一下原理 首先介绍三个针对触摸屏设备的事件,分别是: touchstart:当手指触摸屏幕时触发,即触摸开始的时候;touchend:当手指离开屏幕时触发,即触摸结束的时候;touchcancel&am…

【深耕 Python】Quantum Computing 量子计算机(3)重要数学公式一览

写在前面 往期量子计算机博客: 【深耕 Python】Quantum Computing 量子计算机(1)图像绘制基础 【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波 正文 偏微分: 交换关系&#xff…

GtkButton事件处理、事件的捕获、鼠标事件等

事件 事件处理 GTK 所提供的工具库与其应用程序都是基于事件触发机制来管理, 所有的应用程序都是基于事件驱动。 如果没有事件发生, 应用程序将处于等待状态, 不会执行任何操作, 一旦事件发生, 将根据不同的事件做出…

Offer必备算法37_记忆化搜索_五道力扣题详解(由易到难)

目录 记忆化搜索概念和使用场景 ①力扣509. 斐波那契数 解析代码1_循环 解析代码2_暴搜递归 解析代码3_记忆化搜索 解析代码4_动态规划 ②力扣62. 不同路径 解析代码1_暴搜递归(超时) 解析代码2_记忆化搜索 解析代码3_动态规划 ③力扣300. 最…

Java12基础(Package包 作用域 String字符串)

目录 一. Package包 import关键字 命名规范 二. 作用域 三. String字符串(进阶) 创建方式: 内存情况: 1. 字符串的搜索 2. trim()方法 3. 替换字符串 4. 分割字符串 5. 拼接字符串 6. 格式化字符串 7. 类型转换 8. 转换为char[ ]字符数组 9. 字符编码 10. Str…

Navicat导入sql报错[Err] 1046 - No database selected

Navicat导入sql报错[Err] 1046 - No database selected ​ 今天系统重装了,就很完蛋。所有东西都重新下载安装。向Navicat导入sql的时候导入失败: 报错[Err] 1046 - No database selected。我很疑惑地又导了几次。当然又全都失败. 错误造成原因&#x…

ardupilot的固定翼飞行模式

飞行模式 APM所有的飞行模式都在对应的机型的文件夹下的mode.h里面有定义,针对于不同的模型,功能函数在基类中Mode中都是以纯虚函数实现了, 然后在继承的子类中重新实现它,以实现多态。 takeoff模式 参见网址在 ArduPlane 4.0 及更高版本中,自动起飞本身也是一种模式(…

Redis持久化策略——Java全栈知识(17)

Redis持久化 1、Redis 持久化的三种方式 1、RDB: 以快照的方式将此刻 Redis 中的数据以二进制的文件形式保存在磁盘中。 RDB 的优点是:快照文件小、恢复速度快,适合做备份和灾难恢复。 RDB 的缺点是:定期更新可能会丢数据&#…

20K薪资要什么水平?来看看25岁测试工程师的面试过程…_测试工程师薪资20k(2)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、…

阿里云最新重磅发布:通义千问2.5模型更强、5到10行代码搭建企业RAG应用、代码助手通义灵码推企业版

速览: 5月9日阿里云举办“阿里云AI智领者峰会”,会上发布一系列重磅产品,通义千问模型性能更强,通义灵码、阿里云百炼平台、通义千问App等均有重要信息发布。 会上阿里云发布正式发布通义千问2.5,中文性能全面赶超GPT-…

STM32G4做一个示波器

随着科技的飞速进步,曾经庞大笨重的示波器如今已经可以轻松装进口袋,随时随地揭示电子世界的奥秘。这不仅是技术革新的象征,更是便携实用性的极致演绎。最近,我发现了一个让人眼前一亮的小型示波器制作方案,它的心脏是STM32G4系列芯片。这个口袋大小的奇迹是如何成为可能的…

我们的小程序每天早上都白屏,真相是。。。

大家好,我是程序员鱼皮。最近我们在内测一款面试刷题小程序,没错,就是之前倒下的 “面试鸭”! 在我们的内测交流群中,每天早上都会有同学反馈:打开小程序空白,没任何内容且登录不上。 然后过了…

PT:fix_eco_power用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2中没有直接修leakage/power的命令,需要在scenario status中设置leakage_power和dynamic_power的开关,结合place_opt/clock_opt.flow.enable_power true来使用。 innovus中专门的命令可以去优…

单例的命名重复

最近在开发的过程中,涉及到多个目录下,都由相同文件名和类名的单例,但是调用的时候编译器却知道调用哪个,所以学习了下,做个笔记。 DataInteraction *DataInteraction::instance() {static DataInteraction instance;…