子类通过父类间接调用方法时,会执行重写后的实现吗?
关于子类调用父类方法时重写方法的执行逻辑
嘿,这个问题真的戳中了很多面向对象开发者的认知盲区——我当年刚学的时候也踩过这个坑!咱们直接把问题拆解开说:
问题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
相关产品推荐
相关产品推荐

