You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承方法调用顺序问题:输出ABDC及最后C的打印原因

解析Java继承中输出ABDC的原因,以及最后一个C的来源

首先,你给出的Derived类代码没写完(应该是extends Base),我先补全能输出ABDC的完整代码,再一步步给你拆解:

public class Base { 
    public static void main(String[] args) { 
        Base b = new Derived(); 
        b.methodOne(); 
    } 
    public void methodOne() { 
        System.out.print("A"); 
        methodTwo(); 
    } 
    public void methodTwo() { 
        System.out.print("B"); 
    } 
} 

public class Derived extends Base {
    @Override
    public void methodOne() {
        // 先调用父类的methodOne逻辑
        super.methodOne();
        // 这行就是最后输出C的关键
        System.out.print("C");
    }

    @Override
    public void methodTwo() {
        // 先执行父类的methodTwo打印B,再打印D
        super.methodTwo();
        System.out.print("D");
    }
}

现在咱们跟着代码执行流程走一遍,搞清楚每个字符的来源:

  1. Base b = new Derived();:创建子类实例,这里构造函数没有输出操作,暂时忽略。
  2. b.methodOne();:因为Java的动态多态特性,父类引用指向子类实例时,调用的是子类重写的methodOne()方法:
    • 子类methodOne()先执行super.methodOne(),进入父类的methodOne():
      • 父类methodOne()打印A。
      • 接着调用methodTwo(),同样因为多态,这里调用的是子类重写的methodTwo():
        • 子类methodTwo()先执行super.methodTwo(),进入父类的methodTwo(),打印B。
        • 回到子类methodTwo(),打印D。
      • 父类methodOne()执行完毕,回到子类methodOne()。
    • 子类methodOne()最后执行System.out.print("C");,打印C。

整个流程下来,输出顺序就是A→B→D→C,也就是你看到的ABDC。

至于你疑惑的最后一个C,它来自子类Derived重写的methodOne()方法——子类在复用了父类methodOne()的逻辑(输出ABD)之后,额外添加了打印C的代码,所以会在最后输出这个字符。

这里核心要记住Java继承的两个关键点:

  • 动态多态:父类引用调用方法时,优先执行子类重写的版本。
  • super关键字:可以在子类方法里调用父类的同名方法,复用父类逻辑。

内容的提问来源于stack exchange,提问作者Mandeyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:34:09