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

Java类继承疑问:子类重写方法后输出为何不符合预期?

解惑Java类继承中的方法调用问题

嗨,我来帮你把这个问题理清楚~

你预期的输出和实际结果不一样,核心原因是你创建了两个完全不同的对象,Java中实例方法的调用是基于对象的实际运行时类型,而不是引用变量的类型。

咱们拆解一下你的代码:

1. 第一个对象调用(符合预期)

SubClass2 subClass2= new SubClass2();
subClass2.overideThisMethod();

这里你创建的是SubClass2类型的对象,引用变量也是SubClass2,所以调用overideThisMethod()时,自然执行子类重写后的版本,输出from subclass2,这部分是没问题的。

2. 第二个对象调用(和预期不符的原因)

SuperSub superSub = new SuperSub();
superSub.overideThisMethod();

这里你创建的是**SuperSub父类自己的对象**,虽然引用变量是SuperSub类型,但实际对象就是父类本身,所以调用方法时会执行父类原有的版本,输出Printed from Superclass。

如果你想让父类引用调用子类方法,得这么做

要触发Java的多态特性,需要让父类引用指向子类对象,而不是父类对象。修改代码如下:

public class SubClass2 extends SuperSub {
    @Override
    public void overideThisMethod(){
        System.out.println("from subclass2");
    }
    public static void main(String[] args){
        SubClass2 subClass2= new SubClass2();
        subClass2.overideThisMethod(); // 输出:from subclass2
        
        // 父类引用指向子类对象
        SuperSub superSub = new SubClass2();
        superSub.overideThisMethod(); // 现在输出:from subclass2
    }
}

总结一下关键知识点

  • 实例方法的调用逻辑:Java会根据对象实际运行时的类型来决定执行哪个方法版本,而不是看引用变量的编译时类型。
  • 多态的触发条件:只有当父类引用指向子类对象时,才会调用子类重写的方法;如果引用指向的是父类自己的对象,就只会执行父类的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:46:27