首页 > Java > java教程 > 正文

Java继承中构造函数的执行顺序:为什么会出现两次Shape输出?

霞舞
发布: 2025-02-22 13:56:14
原创
969人浏览过

java继承中构造函数的执行顺序:为什么会出现两次shape输出?

Java继承中构造器执行顺序详解:揭秘两次“shape”输出之谜

本文分析一段Java继承代码,解释其构造器执行顺序,并解答为何出现两次“shape”输出的疑惑。

以下代码片段来自《on java》基础卷,展现了Java继承中构造器调用的非直观特性:

class Shape {
    Shape() {
        System.out.println("Shape");
    }
}

class Line extends Shape {
    Line() {
        super();
        System.out.println("Line");
    }
}

public class CADSystem extends Shape {
    private Line li = new Line(); // 关键点1
    public CADSystem() {
        super(); // 关键点2
        System.out.println("CADSystem");
    }

    public static void main(String[] args) {
        CADSystem x = new CADSystem();
    }
}
登录后复制

运行结果为:

立即学习Java免费学习笔记(深入)”;

Shape
Shape
Line
CADSystem
登录后复制

与预期结果(Shape, Line, Shape, CADSystem)不符。 这并非简单的变量初始化优先于方法调用,而是Java构造器执行顺序的体现。

关键在于理解Java构造器初始化的步骤:

  1. 成员变量初始化: 在CADSystem类的构造器执行之前,其成员变量li会被初始化。 li的初始化需要调用Line的构造器,而Line的构造器又会调用Shape的构造器,因此第一次输出"Shape"。

  2. 父类构造器调用: CADSystem的构造器显式调用了super() (关键点2),这会调用Shape的构造器,导致第二次输出"Shape"。

  3. 构造器主体执行: 接着,Line构造器的剩余部分执行,输出"Line"。最后,CADSystem构造器的剩余部分执行,输出"CADSystem"。

因此,输出顺序为"Shape" (来自li的初始化), "Shape" (来自super()), "Line", "CADSystem"。 这并非变量初始化在方法调用之前那么简单,而是Java语言规范中对构造器初始化顺序的严格规定导致的。 父类构造器的调用发生在子类构造器主体执行之前,而成员变量的初始化又发生在父类构造器调用之前。

总而言之,理解Java中构造器执行顺序的关键在于:成员变量初始化 -> 父类构造器调用 -> 子类构造器主体执行。 这三个步骤的顺序是固定的,并且成员变量的初始化会触发一系列的构造器调用,这在继承关系中尤为重要。

以上就是Java继承中构造函数的执行顺序:为什么会出现两次Shape输出?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号