一个类中各种代码块的执行顺序

简介: 一个类中各种代码块的执行顺序

正文


01 只有父类的代码块


今天分享一点简单的技术,一起来分析一下一个类的代码块是什么顺序执行的。学习代码如下


public class MethodPrintSequenceTest {
    public static class Father {
        static {
            System.out.println("i am father's static block");
        }
        {
            System.out.println("i am father's normal block");
        }
        public Father() {
            System.out.println("i am father's Construction block");
        }
        static {
            System.out.println("i am father's another static block");
        }
        {
            System.out.println("i am father's another normal block");
        }
    }
    public static void main(String[] args) {
        Father f = new Father();
    }
}


在上面的代码中,我写了各种各样的代码块,看一下我们的执行结果。


i am father's static block
i am father's another static block
i am father's normal block
i am father's another normal block
i am father's Construction block
Process finished with exit code 0


显而易见,首先是静态代码块先执行,然后是普通的代码块后执行,最后才是构造方法,那么也就是说,在我们使用某一个对象的时候,对应的类已经把静态的普通的都已经执行了。

但是在执行的顺序上有什么特殊的地方呢?比例,都是静态代码块,为啥上面的先执行,下面的后执行,这就需要我们看一下编译后的代码啦!


28.png


经过IDEA的反编译,得到上面的反编译结果,显而易见,静态方法被合并了,而且是按照静态代码块的顺序合并的。同理,普通代码块放在了构造方法的最前面,顺序同静态代码块,这也就是,为啥他们的代码块是先执行的了。


02 父类与子类混合双打


上面执行的结果仅仅是某一个类的情况,那如果要是夹杂着继承关系,会是得到什么样的结果呢?一起看下面改造后的代码:


public class MethodPrintSequenceTest {
    public static class Father {
        static {
            System.out.println("i am father's static block");
        }
        {
            System.out.println("i am father's normal block");
        }
        public Father() {
            System.out.println("i am father's Construction block");
        }
        static {
            System.out.println("i am father's another static block");
        }
        {
            System.out.println("i am father's another normal block");
        }
    }
    public static class Sun extends Father {
        static {
            System.out.println("i am sun's static block");
        }
        {
            System.out.println("i am sun's normal block");
        }
        public Sun() {
            System.out.println("i am sun's Construction block");
        }
        static {
            System.out.println("i am sun's another static block");
        }
        {
            System.out.println("i am sun's another normal block");
        }
    }
    public static void main(String[] args) {
        Father f = new Sun();
    }
}

执行结果如下:


i am father's static block
i am father's another static block
i am sun's static block
i am sun's another static block
i am father's normal block
i am father's another normal block
i am father's Construction block
i am sun's normal block
i am sun's another normal block
i am sun's Construction block
Process finished with exit code 0


显而易见,执行的顺序分别是:执行父类的静态代码块->执行子类的静态代码块->执行父类的普通代码块和构造代码块->执行子类的普通代码块和构造代码块和我们平时认知是一样的。也就是,使用子类对象时候,首先要初始化父类的值,再初始化子类的值。反编译结果如下:


29.png

看上面的截图就显而易见了,怎么样的执行一目了然。


03 复盘


如何更加快速的知道怎么样的执行顺序,要牢记一点,就是先父类后子类,先静态后普通,最后才是构造。



相关文章
交流电路理论:峰值、平均值和RMS值的计算公式
除了频率和周期之外,AC 波形的一个关键属性是振幅,它表示交变波形的最大值,或者更广为人知的是峰值。
14605 1
交流电路理论:峰值、平均值和RMS值的计算公式
|
Web App开发 编解码 JavaScript
优酷播放体验优化实战(六)--Electron跨平台进阶:Native播放器融合
随着桌面应用开发技术的发展,程序的跨平台性和代码的维护成本显得尤为重要,目前优酷Windows平台采用QT作为UI的主要开发方案,DuiLib辅助一些扩展插件开发,Mac平台采用原生的Native UI开发,由于历史原因并没有将Windows端的QT框架迁移到Mac端,两端分别维护耗费不同人力。
3055 0
优酷播放体验优化实战(六)--Electron跨平台进阶:Native播放器融合
|
机器学习/深度学习 存储 机器人
LLM系列 | 19: ChatGPT应用框架LangChain实践速成
本文以实践的方式将OpenAI接口、ChatOpenAI接口、Prompt模板、Chain、Agent、Memory这几个LangChain核心模块串起来,从而希望能够让小伙伴们快速地了解LangChain的使用。
|
11月前
|
机器学习/深度学习 JSON API
干货,淘宝拍立淘按图搜索,淘宝API(json数据返回)
淘宝拍立淘按图搜索API接口基于深度学习与计算机视觉技术,通过解析用户上传的商品图片,在淘宝商品库中实现毫秒级相似商品匹配,并以JSON格式返回商品标题、图片链接、价格、销量、相似度评分等详细信息。
|
机器学习/深度学习 人工智能 数据挖掘
找不到中文语音预训练模型?中文版 Wav2vec 2.0和HuBERT来了,腾讯游戏知几AI团队和西工大ASLP组联合出品
找不到中文语音预训练模型?中文版 Wav2vec 2.0和HuBERT来了,腾讯游戏知几AI团队和西工大ASLP组联合出品
1426 0
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
1150 1
|
Web App开发 数据安全/隐私保护
无影云电脑快速上手教程(保姆级)
无影云桌面创建云桌面流程和互联网使用流程,初步体验。
2338 1
无影云电脑快速上手教程(保姆级)
|
传感器
电阻的作用及其应用
一、什么是电阻 电阻是指电流在电路中流动时遇到的阻碍。它是电路中的一种基本元件,用来限制电流的流动。电阻的单位是欧姆(Ω),表示电阻对电流流动的阻碍程度。电阻的大小取决于电阻器的材料、长度、横截面积等因素。当电流通过电阻时,会产生电阻热,将电能转化为热能。电阻常用于调节电路中的电流和电压,以及控制电路的工作状态。 二、电阻的作用 电阻在电路中起到以下几个作用: 1. 限制电流:电阻可以限制电流的流动。根据欧姆定律,电流(I)等于电压(V)除以电阻(R),因此增加电阻会减小电流。这使得电阻可以用来控制电路中的电流大小。 2. 控制电压:电阻可以分压电路中的电压。根据电压分压定律,当电阻串联在电路
687 0
|
SQL 数据库
若依框架---树状层级部门数据库表
若依框架---树状层级部门数据库表
1921 0
|
消息中间件 存储 监控
MQ线上大规模消息堆积问题处理及使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色
1150 1

热门文章

最新文章