登录
首页 >  文章 >  java教程

Java继承:构造函数执行顺序详解(Shape输出两次?)

时间:2025-03-09 18:00:32 104浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

Java继承中构造函数的执行顺序并非直观,本文将以《on java》中的代码为例,深入分析其构造函数执行顺序,并解释为什么会出现两次“Shape”输出的现象。代码通过`Shape`、`Line`和`CADSystem`三个类展现了Java构造函数的调用过程,其中`CADSystem`类包含一个`Line`类型的成员变量,其初始化和`CADSystem`构造函数的`super()`调用分别触发了`Shape`构造函数的两次执行。文章将详细解释成员变量初始化、父类构造器调用以及子类构造器主体执行这三个步骤的顺序,帮助读者理解Java构造函数执行的机制,并解答代码运行结果与预期不符的疑惑。

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

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

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

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

<code>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输出两次?)》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>