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

