【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

  📝个人主页:哈__

期待您的关注 

在日常使用Java的时候,我们都接触过new这个关键字,那你是否知道在我们的对象真正创建出来之前都做了哪些事情呢?

实际上要去判断一个类的初始化的顺序,需要分一下情况,一种是没有继承关系的类(不考虑Object类),一种是有继承关系的类。

一、无继承关系类的初始化

先看下边的代码。有着这样的一个类InitializeDemo ,我们直接运行main方法,你知道会打印出来什么吗?

public class InitializeDemo {
    private static int k = 1;
    private static InitializeDemo t1 = new InitializeDemo("t1");
    private static InitializeDemo t2 = new InitializeDemo("t2");
    private static int i = print("i");
    private static int n = 99;

    {
        print("初始化块");
        j=100;
    }
    public InitializeDemo(String str){
        System.out.println((k++)+":" + str + "  i="+i+".    n="+n);
        ++i;
        ++n;
    }
    static{
        print("静态块");
        n=100;
    }
    private int j = print("j");
    public static int print(String str){
        System.out.println((k++)+":" + str + "  i="+i+".    n="+n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        InitializeDemo i = new InitializeDemo("test");
    }
}

打印结果如下所示。

想要弄明白这个,我就得先了解一下类的生命周期了。我们通过主方法运行Java程序,而这个主方法中创建了i对象并且属于InitializeDemo 类,所以在main方法执行时会将我们的类进行初始化。

在我们的类第一次进行初始化的时候,我们类中的静态块和静态属性会被优先构建。之后才轮得到非静态块和非静态属性。

当你知道了上边的规则之后,我们来看代码,类中有五个静态属性,一个非静态属性,一个静态块,一个非静态块还有一个静态方法。我们优先构建静态方法、属性和静态块,之后在构建非静态块。

这里我总结出第一条规则。

类的一个对象进行初始化,按照代码顺序从上往下先构建静态的属性、方法和静态块,之后在构建非静态块和非静态属性。(类中的静态块和静态变量只会初始化一次,也就是类第一次被用到的时候)

 1、静态变量k被初始化

private static int k = 1;

2、静态变量t1初始化

 private static InitializeDemo t1 = new InitializeDemo("t1");

这里还要说一下,这个静态变量是创建自己的类的对象,代码执行到这一行就要进行一个对象的初始化过程了。遇到这种创建本类对象的,我们按照以下的第二条规则。

一个类中有静态的本类对象,创建的过程从上到下先执行本类的非静态块和非静态属性,最后在执行构造方法。 

那么我们初始化t1的时候,就要从上向下找非静态块和非静态属性(如果有的话 ),最后在执行构造方法。

{
        print("初始化块");
        j=100;
    }

我们调用print函数并且将j的值修改为100,这样就出现了我们的第一行。

之后往下走,走到了这一行代码。这行代码定义了j变量,并且调用了print方法,所以也就有了我们的第二行。

private int j = print("j");

最后调用构造方法。打印我们的第三行。

现在你是否清楚了前三行输出结果是怎么来的了吗?这前三行的结果都是t1进行初始化时非静态块和非静态变量的执行结果。

3、静态变量 t2初始化

搞明白了t1是如何初始化的t2就和t1一模一样了,这里不讲解。

4、静态变量i初始化

静态变量i的初始化用到了print函数,这也就是第七行为什么会打印的原因。

private static int i = print("i");

5、静态变量n初始化

 private static int n = 99;

6、静态块初始化

这里调用print函数,也就是第八行的由来。

static{
        print("静态块");
        n=100;
    }

ok,到了这一步我们的静态属性和静态块已经从上到下全部初始化完成了。但你要知道,我们在上边初始化的非静态块和非静态属性所打印的语句是我们的t1和t2对象引起的,并非我们主方法内构建的i对象引起的,接下来还要初始化我们的非静态块和属性。

7、非静态块初始化

第九行的由来。

 {
        print("初始化块");
        j=100;
    }

8、非静态属性初始化

第十行的由来。

private int j = print("j");

9、执行构造方法

第十一行的由来。

public InitializeDemo(String str){
        System.out.println((k++)+":" + str + "  i="+i+".    n="+n);
        ++i;
        ++n;
    }

以上就是我们的一个类的构建过程,这里我给大家一张图(自己画的)。

二、有父类继承的初始化 

和没有父类继承初始化大同小异,我定义了这样的一个类让InitializeDemo,去继承。为了便于还是懵懂的同学理解,我把静态变量t1和t2删掉。

public class InitializeDemoFather {
    {
        System.out.println("父类初始化块");
    }
    static{
        System.out.println("父类静态块");
    }
    public InitializeDemoFather(){
        System.out.println("父类构造函数");
    }
}
来看看我们现在的打印结果。

 

 我给大家讲一下初始化的顺序大家就明白了,这里用一张图来表示。

对应着上边的图,是不是一看就有点思路了呢? 

如果你可以完整的走出以上的输出顺序,你就可以把t1和t2对象加上去了,不过不要被输出顺序所迷惑,就比如说,你可能会看到父类静态块和属性初始化完成后,初始化的不是子类的静态块和静态属性,而是父类的非静态块和非静态属性。你应该认真的思考一下,这个 输出的父类的非静态块和非静态属性初始化的语句到底是从何而来?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt使用QWidget重绘实现圆环形渐变色进度条(支持不确定进度模式)

效果如下: 从纯竖直方向顶部蓝色到底部青色的渐变。 从左上角偏左45到右下角偏右45的蓝色到青色渐变。 从左上角偏左22.5到右下角偏右22.5的蓝色到青色渐变。(这个角度渐变最好看) 可以选择添加背景图片 支持两种模式:正常进度模…

媒体邀约专访如何深入的做一篇专访报道?流程分享

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 进行媒体邀约专访并深入撰写一篇专访报道是一个系统性工作,涉及多个环节。以下是一个详细的流程分享: 一、前期准备 确定专访目的与主题:明确专访希…

Training - 使用 WandB 配置管理模型训练过程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137529140 WandB (Weights&Biases) 是轻量级的在线模型训练可视化工具,类似于 TensorBoard,可以帮助用户跟踪…

可编程网关:如何助力智慧工厂实现智能化管理

一个具体的实际案例,详细说明可编程网关在某汽车零部件智慧工厂中的应用细节: 案例背景: 某大型汽车零部件制造企业,致力于提升生产效率、降低运营成本、确保产品质量,决定对其传统工厂进行全面数字化改造&#xff0…

从零开始:一步步学习爬虫技术的实用指南(一)

从零开始:一步步学习爬虫技术的实用指南(一) Urllib1.什么是互联网爬虫2.爬虫核心3.爬虫的用途4.爬虫的分类4.1 通用爬虫:4.1 聚焦爬虫: 5.反爬手段5.1 User‐Agent:5.2.代理IP5.3.验证码访问5.4.动态加载网…

深入理解JVM后端优化技术-逃逸分析(Escape Analysis)

相关系统 深入理解jvm执行引擎-CSDN博客 深入理解JVM后端优化技术-方法内联-CSDN博客 定义 当一个对象在方法里面被定义后,它可能让外部方法所引用,作为调用参数传递到其它的方法中,这种称为方法逃逸;还有可能被外部线程访问到,赋值给可以在其它线程中访问的实例数量,这…

【测试篇】Selenium + Java环境搭建

文章目录 Selenium Java环境搭建配置系统环境变量PATH验证环境是否搭建成功常见问题&解决办法 Selenium Java环境搭建 Java版本最低要求为8,这里默认大家都下载好了Java。😆 下载chrome浏览器(点我下载) 观察chrome版本。…

混合专家(MoE)模型

文心一言 混合专家模型(Mixture of Experts,简称MoE)是一种基于Transformer架构的模型设计策略。它通过将多个模型(称为“专家”)直接结合在一起,以获得更好的预测性能。这种模型特别适用于处理大规模数据…

学习操作系统之多道批处理系统

1964年IBM生产了第一台小规模集成电路计算机IBM System/360(第三代计算机),并为该计算机开发了OS/360操作系统,是第一个多道批处理系统。 多道批处理的运行机制: 多道批处理系统同样要求事先将多道作业存放到外存上并…

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…

​泛微文书定人事档案一体化管理,覆盖人事管理全过程,人事档案全量归档

人事档案是个人身份、学历、资历等方面的证据,与个人工资待遇、社会劳动保障、组织关系紧密挂钩,具有法律效力。应注重收集和鉴别、整理工作,提升人事档案利用率。 企业应依据国家有关人事档案管理规定,制定企业人事档案管理办法&…

python机器学习-乳腺癌细胞挖掘和生存分析(2024年新版)

​ 随着人们生活水平提高,大家不仅关注如何生活,而且关注如何生活得更好。在这个背景下,精准治疗和预测诊断成为当今热门话题。 据权威医学资料统计,全球大约每13分钟就有一人死于乳腺癌,乳腺癌已成为威胁当代人健康的…

DataEase-V1.18版本源码通过Docker镜像部署与静态资源通过阿里云OSS存储实现看这一篇就够了

修改DataEase实现静态资源阿里云OSS存储 后端源码文件读取配置类配置 1.阿里云OSS配置类 /*** ClassName AliyunConfig.java* author shuyixiao* version 1.0.0* Description 阿里云OSS配置* createTime 2024年04月03日 10:03:00*/ Data Configuration public class AliyunC…

创建型模式--5.建造者模式【卡雷拉公司】

1. 造船,我是专业的 在海贼世界中,水之都拥有全世界最好的造船技术,三大古代兵器之一的冥王就是由岛上的造船技师们制造出来的。现在岛上最大、最优秀的造船公司就是卡雷拉公司,它的老板还是水之都的市长,财富权力他都…

大话设计模式——11.桥接模式(Bridge Pattern)

简介 将抽象部分与它的实现部分分离,使它们可以独立变化。 UML图: 应用场景: 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性不想使用继承导致系统类的个数急剧增加某个类存在多个变化维度使用继承方式容易出现类的膨胀 示例…

护眼台灯什么牌子好?爱德华、书客、明基护眼台灯真实测评

台灯是我们日常比较实用的一盏桌面照明灯具,不管是休闲看书、学习、办公都会用得上。如果使用了一款光源不好的台灯,时间长了可能就会影响我们的眼睛健康,特别是孩子的眼睛,还没有发育完全,影响更大。 在面临如今市面上…

设计模式——2_7 状态(State)

欲买桂花同载酒,终不似,少年游 ——刘过《唐多令芦叶满汀州》 文章目录 定义图纸一个例子:如何模拟一个转笔刀自动转笔刀PencilPencilSharpener 投诉和改善钝刀BladePencilSharpener 没有铅笔PencilSharpener if if ifStatePencilSharpener 碎…

动态物体检测 | 复杂环境下多目标动态物体实时检测算法实现

项目应用场景 面向复杂环境下的多目标动态物体实时检测场景,项目采用一种在线体积映射的算法实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装、编译工程,包括 ROS,具体步骤参见 README(2) 执行 DOALS Sequence roslaunch d…

Point cloud转 Laser sacn

文章目录 概要安装pointcloud_to_laserscan修改配置运行结果 概要 在ROS中将点云(PointCloud)转换为激光扫描(LaserScan)是一个常见的任务,尤其是在某些机器人系统中,激光雷达数据被用于导航和避障&#x…

Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。

在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误,可能是由于以下几种原因: DNS 解析问题: 确保源域和目标域的DNS配置正确,能够互相解析对方的域名和IP地址。…