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

Java中父类方法调用被子类重写方法的执行逻辑问题

问题解答:子类实例调用父类foo()时,内部bar()的执行版本

嘿,这个问题刚好是Java多态特性的典型场景,答案很明确——执行的是SubClass中重写的bar()版本。

咱们来拆解一下背后的逻辑:

  • 当你创建SubClass sub = new SubClass();时,这个对象的实际类型是SubClass,哪怕你把它赋值给SuperClass类型的变量(比如SuperClass sub = new SubClass();),实际类型依然是子类。
  • 调用sub.foo()时,因为SubClass没有重写foo(),所以会执行从SuperClass继承来的foo()逻辑。
  • 但在foo()内部调用bar()的时候,Java的动态绑定机制会生效:JVM会在运行时根据对象的实际类型(也就是SubClass)去查找bar()的实现,而不是直接用SuperClass里的版本——谁让你在SubClass里重写了bar()呢😉

为了更直观,咱们给代码加个打印验证:

public abstract class SuperClass {
    public void foo() {
        System.out.println("SuperClass的foo()正在执行");
        bar();
    }
    public void bar() {
        System.out.println("这是SuperClass的bar()");
    }
}

public class SubClass extends SuperClass {
    @Override
    public void bar() {
        System.out.println("这是SubClass的bar()");
    }
}

运行SubClass sub = new SubClass(); sub.foo();后,控制台会输出:

SuperClass的foo()正在执行
这是SubClass的bar()

完美印证了咱们的结论。

简单来说,只要方法是可重写的(非private、static、final),Java就会在运行时根据对象的实际类型来匹配对应的实现,哪怕这个调用是在父类方法内部也不例外。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:32:27