当前位置: 首页 > news >正文

【教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这个关键字来调用父类带参数的构造方法,否则在编译期都不能通过。
如下图:
image.png

类的加载及初始化

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

类加载的时机:
什么情况下虚拟机需要开始加载一个类呢?虚拟机规范中并没有对此进行强制约束,这点可以交给虚拟机的具体实现来自由把握。

类初始化则是类加载的最后一步,
类初始化的时机
虚拟机规范指明 有且只有 五种情况必须立即对类进行初始化(而这一过程发生在加载、验证、准备之后):

  • 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】详解父子类变量、代码块、构造函数执行顺序

-----------------第二天------------------------ 本文先论述父子类变量、代码块、构造函数执行顺序的结论, 然后通过举例论证,接着再扩展,彻底搞懂静态代码块、动态代码块、构造函数、父子类、类加载机制等知识体系。 温故而知新&#xff…...

深度学习中文汉字识别 计算机竞赛

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…...

从零开始 通义千问大模型本地化到阿里云通义千问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…...

Power BI Desktop数据可视化图表

...

鸿蒙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…...

业务架构、技术架构、项目管理的有机结合

新入职的创业公司一年不行了。 这一年来没有上班,也因为大龄的问题找不到合适的工作。然后考了几个项目管理证书,又思考了一个技术兑现的问题。 技术本身是架构的执行层面,如果上面的公司战略、业务架构变小,缩水,或者…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...