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"); } }
现在咱们跟着代码执行流程走一遍,搞清楚每个字符的来源:
Base b = new Derived();:创建子类实例,这里构造函数没有输出操作,暂时忽略。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
相关产品推荐
相关产品推荐

