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
相关产品推荐
相关产品推荐

