【教3妹学编程-java基础6】详解父子类变量、代码块、构造函数执行顺序

-----------------第二天------------------------

本文先论述父子类变量、代码块、构造函数执行顺序的结论, 然后通过举例论证,接着再扩展,彻底搞懂静态代码块、动态代码块、构造函数、父子类、类加载机制等知识体系。 温故而知新,建议点赞收藏~
先说结论
面试官:好的,你说一下java中父类子类的变量、代码块、构造函数执行顺序是怎样的?
3妹:好的,
Java程序中类中个元素的初始化顺序 初始化的原则是:
- 先初始化静态部分,再初始化动态部分,
- 先初始化父类部分,后初始化子类部分,
- 先初始化变量,再初始化代码块和构造器。
具体的,由于类中初始化的部分有静态成员变量、静态代码块、普通成员变量、动态代码块、构造函数。 所以跟父类子类组合起来有10种情况,总体顺序是:
- 1.父类的静态成员变量(如果是第一次加载类)
- 2.父类的静态代码块(如果是第一次加载类)
- 3.子类的静态成员变量(如果是第一次加载类)
- 4.子类的静态代码块(如果是第一次加载类)
- 5.父类的普通成员变量
- 6.父类的动态代码块
- 7.父类的构造器方法
- 8.子类的普通成员变量
- 9.子类的动态代码块
- 10.子类的构造器方法
举例
面试官:能写个栗子🌰,验证一下吗
3妹:好的,假设有一个Parent和Child类
public class Parent {static Instance staticInstance = new Instance("1---Parent类的静态成员变量staticInstance");static {System.out.println("2---Parent类的静态代码块执行了");}Instance instance = new Instance("5---Parent类的普通成员变量instance");{System.out.println("6---Parent类的动态代码块执行了");}Base() {System.out.println("7---Parent类的构造器方法执行了");}
}public class Child extends Parent {static Instance staticInstance = new Instance("3---Child类的静态成员变量staticInstance");static {System.out.println("4---Child类的静态代码块执行了");}Instance instance = new Instance("8---Child类的普通成员变量instance");{System.out.println("9----Child类的动态代码块执行了");}Child() {System.out.println("10---Child类的构造器方法执行了");}//执行测试public static void main(String[] args) {Child child = new Child();}
}
测试结果如下:
1—Parent类的静态成员变量staticInstance进行了初始化
2—Parent类的静态代码块执行了
3—Child类的静态成员变量staticInstance进行了初始化
4—Child类的静态代码块执行了
5—Parent类的普通成员变量instance进行了初始化
6—Parent类的动态代码块执行了
7—Parent类的构造器方法执行了
8—Child类的普通成员变量instance进行了初始化
9----Child类的动态代码块执行了
10—Child类的构造器方法执行了
说明确实是按照上面的执行顺序执行的。
静态变量、静态代码块
面试官:好的,我们先来说一个静态变量和静态代码块,他们的加载时机是怎样的
3妹:
静态变量、静态代码块是被static修饰的,是属于当前类的信息,类加载过程是先将编译后的class文件加载到内存中,一个类只会被加载到内存中一次。而static修饰的代码块属于类的信息的,所以,静态代码块中的代码有且只有一次被执行。执行的时机:类被加载的时候。
动态代码块
面试官:那动态代码块呢?
3妹:
动态代码块即不是static修饰的代码块,是用来初始化类实例信息的。当我们new关键字创建一个对象的时候,就会被执行,而且每使用一个new关键字创建出一个新对象的时候就会被执行一次的,在构造函数主题代码执行之前被运行的。
父类与子类的构造函数
面试官:再来说一下构造函数,new 一个子类的时候,父类的构造函数是何时被加载的呢?
3妹:
父类与子类的加载时机:父类在子类前面
需要注意的是:子类的构造方法,不管是无参构造还是有参构造,默认都会先去寻找父类的无参构造方法。如果父类中,没有无参构造,那么子类必须使用supper这个关键字来调用父类带参数的构造方法,否则在编译期都不能通过。
如下图:

类的加载及初始化
面试官:再来说一下类的加载及初始化是怎样的?
3妹:好的:
Java类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。

类加载的时机:
什么情况下虚拟机需要开始加载一个类呢?虚拟机规范中并没有对此进行强制约束,这点可以交给虚拟机的具体实现来自由把握。
类初始化则是类加载的最后一步,
类初始化的时机:
虚拟机规范指明 有且只有 五种情况必须立即对类进行初始化(而这一过程发生在加载、验证、准备之后):
- 1、遇到new、getstatic、putstatic或invokestatic这四条字节码指令(注意,newarray指令触发的只是数组类型本身的初始化,而不会导致其相关类型的初始化,比如,new String[]只会直接触发String[]类的初始化,也就是触发对类[Ljava.lang.String的初始化,而直接不会触发String类的初始化)时,如果类没有进行过初始化,则需要先对其进行初始化。生成这四条指令的最常见的Java代码场景是:
1)使用new关键字实例化对象的时候;
2) 读取或设置一个类的静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候;
3)调用一个类的静态方法的时候。 - 2、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
- 3、当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
- 4、当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
- 5、当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。
再次总结一下
面试官:好的, 今天的面试就到这里,很高兴你能来参加面试~
3妹:谢谢面试官,再见~
3妹:今天的面试面试的还挺细的,我要总结一下:

Java程序中类中个元素的初始化顺序 初始化的原则是:
- 先初始化静态部分,再初始化动态部分,
- 先初始化父类部分,后初始化子类部分,
- 先初始化变量,再初始化代码块和构造器。
具体的,由于类中初始化的部分有静态成员变量、静态代码块、普通成员变量、动态代码块、构造函数。 所以跟父类子类组合起来有10种情况,总体顺序是:
- 1.父类的静态成员变量(如果是第一次加载类)
- 2.父类的静态代码块(如果是第一次加载类)
- 3.子类的静态成员变量(如果是第一次加载类)
- 4.子类的静态代码块(如果是第一次加载类)
- 5.父类的普通成员变量
- 6.父类的动态代码块
- 7.父类的构造器方法
- 8.子类的普通成员变量
- 9.子类的动态代码块
- 10.子类的构造器方法
还有静态代码块、动态代码块、构造函数、父子类、类加载、类初始化,这些知识点虽然普通,但是也要牢记哦~

相关文章:
【教3妹学编程-java基础6】详解父子类变量、代码块、构造函数执行顺序
-----------------第二天------------------------ 本文先论述父子类变量、代码块、构造函数执行顺序的结论, 然后通过举例论证,接着再扩展,彻底搞懂静态代码块、动态代码块、构造函数、父子类、类加载机制等知识体系。 温故而知新ÿ…...
深度学习中文汉字识别 计算机竞赛
文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…...
从零开始 通义千问大模型本地化到阿里云通义千问API调用
从零开始 通义千问大模型本地化到阿里云通义千问API调用 一、通义千问大模型介绍 何为“通义千问”? “通义千问大模型”是阿里云推出的一个超大规模的语言模型,具有强大的归纳和理解能力,可以处理各种自然语言处理任务,包括但…...
Linux(3):Linux 的文件权限与目录配置
把具有相同的账户放入到一个组里面,这个组就是这两个账户的 群组 。在访问资源(操作系统中计算机的资源)时,可以让这个组里面的所有用户都具有访问权限。 每个账号都可以有多个群组的支持。 在我们Liux 系统当中,默认的…...
Linux进程——exec族函数、exec族函数与fork函数的配合
exec族函数解析 作用 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。 功能 在调用进程内部…...
客户端缓存技术
客户端缓存技术主要有以下几种: 内存缓存:客户端(如浏览器)会将请求到的资源(如HTML页面、图片文件等)存储在内存中,以便在再次访问相同资源时可以快速获取,减少向服务器的请求次数…...
Leetcode -2
Leetcode Leetcode -263.丑数Leetcode -268.丢失的数字 Leetcode -263.丑数 题目:丑数就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。 示例…...
使用 DFS 轻松求解数独难题(C++ 的一个简单实现)
起因 都说懒惰是第一生产力,最近在玩数独游戏的时候,总会遇到拆解数独比较复杂的情况,就想着自己写个代码解题,解放双手。所以很快就写了一个简单的代码求解经典数独。拿来跑了几个最高难度的数独发现确实很爽!虽说是…...
【SQL server】 表结构的约束和维护
表结构的约束和维护 修改表结构 (1)添加列 (2)删除列 (3)修改列alter table 表名 add 新列名 数据类型给员工表添加一列邮箱 alter table People add PeopleMail varchar(200)删除列 alter table People drop column PeopleMain修改列 alter table 表名 alter column 列名 数据…...
竞赛 题目:基于大数据的用户画像分析系统 数据分析 开题
文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…...
Vue3-ref、reactive函数的watch
Vue3-ref、reactive函数的watch ref函数的watch 原理:监视某个属性的变化。当被监视的属性一旦发生改变时,执行某段代码。watch 属性中的数据需要具有响应式watch 属性可以使用箭头函数watch 属性可以监视一个或者多个响应式数据,并且可以配…...
【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架
🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 目录 🍓多任务系统中使用DHT11🍅关闭调度器🍅使用中断 &am…...
鸿蒙APP外包开发需要注意的问题
在进行鸿蒙(HarmonyOS)应用开发时,开发者需要注意一些重要的问题,以确保应用的质量、性能和用户体验。以下是一些鸿蒙APP开发中需要特别关注的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软…...
Redis 19 事务
Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求…...
Fabric多机部署启动节点与合约部署
这是我搭建的fabric的网络拓扑 3 个 orderer 节点;组织 org1 , org1 下有两个 peer 节点, peer0 和 peer1; 组织 org2 , org2 下有两个 peer 节点, peer0 和 peer1; 以上是我的多机环境的网络拓扑,使用的是docker搭建的。我的网络…...
WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载
WordPress主题WoodMart v7.3.2 WooCommerce主题和谐汉化版下载 WoodMart是一款出色的WooCommerce商店主题,它不仅提供强大的电子商务功能,还与流行的Elementor页面编辑器插件完美兼容。 主题文件在WoodMart Theme/woodmart.7.3.2.zip,核心在P…...
Java 高等院校分析与推荐系统
1)项目简介 随着我国高等教育的大众化,高校毕业生就业碰到了前所未有的压力,高校学生就业问题开始进入相关研究者们的视野。在高校学生供给忽然急剧增加的同时,我国高校大学生的就业机制也在发生着深刻的变化,作为就业…...
【JVM】Java虚拟机
本文主要介绍了JVM的内存区域划分,类加载机制以及垃圾回收机制. 其实JVM的初心,就是让java程序员不需要去了解JVM的细节,它把很多工作内部封装好了.但是学习JVM的内部原理有利于我们深入理解学习Java. 1.JVM的内存区域划分 JVM其实是一个java进程 ; 每个java进程,就是一个jvm…...
业务架构、技术架构、项目管理的有机结合
新入职的创业公司一年不行了。 这一年来没有上班,也因为大龄的问题找不到合适的工作。然后考了几个项目管理证书,又思考了一个技术兑现的问题。 技术本身是架构的执行层面,如果上面的公司战略、业务架构变小,缩水,或者…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
