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

子类通过父类间接调用方法时,会执行重写后的实现吗?

关于子类调用父类方法时重写方法的执行逻辑

嘿,这个问题真的戳中了很多面向对象开发者的认知盲区——我当年刚学的时候也踩过这个坑!咱们直接把问题拆解开说:

问题1:子类通过父类间接调用方法时,会调用重写后的方法吗?

会的,而且这正是面向对象中「多态」特性的核心表现之一。

问题2:父类方法调用被子类重写的方法,会执行哪个实现?

答案和你测试的结果一致:执行子类A的重写实现。

为什么会这样?

核心原因是动态绑定(运行时绑定):在绝大多数面向对象语言(比如Java、Python、C#等)中,实例方法的调用是基于运行时对象的实际类型,而不是编译时的声明类型。

举个直观的代码例子(用Java演示,其他OOP语言逻辑一致):

// 父类B
class B {
    public void parentMethod() {
        System.out.println("执行父类B的parentMethod");
        // 这里调用的callX,实际指向的是运行时对象的版本
        callX();
    }

    public void callX() {
        System.out.println("父类B的callX实现");
    }
}

// 子类A,重写callX
class A extends B {
    @Override
    public void callX() {
        System.out.println("子类A的callX重写实现");
    }
}

// 测试代码
public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.parentMethod(); // 调用父类的方法
    }
}

运行这段代码,输出会是:

执行父类B的parentMethod
子类A的callX重写实现

你之前的误解可能是觉得「父类内部调用自己的方法,应该用父类的实现」,但实际上,父类方法里的callX()本质是this.callX(),而这个this在运行时是子类A的实例(因为我们创建的是A的对象)。所以JVM会根据this的实际类型(A),去调用A中重写的callX方法。

补充:什么时候不会触发重写?

只有当方法是**私有方法(private)、静态方法(static)、最终方法(final)**时,才会采用静态绑定(编译时确定调用版本),不会触发子类的重写实现。比如如果父类的callX是private的,那子类根本无法重写它,父类内部调用时也只会用自己的版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:58:04