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

为何重写方法始终由子类对象调用?向上转型时为何仍调用子类重写方法?

关于方法重写与多态的常见疑问解答

嘿,这些都是面向对象编程里多态机制的核心问题,我来给你逐一拆解清楚:

问题1:为何重写方法始终由子类对象调用?

这背后的核心是动态绑定(Dynamic Binding)机制——在Java这类面向对象语言中,方法调用的最终版本不是由引用的类型决定的,而是由实际创建的对象类型决定的。

当你在子类中重写父类的方法时,JVM会在运行时检查当前引用指向的真实对象是什么:如果是子类实例,就会调用子类重写后的方法;如果是父类实例,才会调用父类的原方法。这也是多态的核心体现——同一个方法调用,根据对象的不同有不同的行为。

问题2:向上转型为父类类型时,为何仍会调用子类的重写方法?

还是要回到动态绑定的逻辑:向上转型只是改变了引用的类型,但并没有改变它指向的实际对象的类型。

举个你可能写过的代码例子来理解:

// 父类
class Parent {
    public void sayHello() {
        System.out.println("Hello from Parent");
    }
}

// 子类,重写sayHello方法
class Child extends Parent {
    @Override
    public void sayHello() {
        System.out.println("Hello from Child");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        Parent obj = new Child(); // 向上转型:父类引用指向子类对象
        obj.sayHello(); // 输出 "Hello from Child"
    }
}

在这个例子里,obj是Parent类型的引用,但它实际指向的是Child对象。JVM在运行时会识别出这一点,所以会调用Child中重写的sayHello方法,而不是Parent的原方法。

问题3:重写方法是否仅发生在子类中?

准确来说,重写是基于继承/实现关系的方法覆盖,所以它只会发生在以下场景:

  • 子类重写父类的非私有、非静态、非final方法
  • 实现类重写接口中的抽象方法(或者默认方法)

简单来说,没有继承/实现关系的类之间,不存在“重写”的概念——那只是定义了一个新的方法,或者是方法重载(方法名相同但参数列表不同)。所以本质上,重写确实是子类(或接口实现类)特有的行为,因为它必须依赖于父类/接口的方法定义来进行覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:57:42