OOP基础:超类与子类方法混合调用的执行逻辑问题
问题解答
执行的是Sub.m2,核心原因是面向对象的多态特性:实例方法的调用始终基于对象的实际类型,而非当前代码所在的类。
具体逻辑如下:
- 创建的是Sub类实例,调用Sub.m1后,Sub.m1先执行
super.m1()触发Super类的m1方法。 - 在Super.m1中调用m2时,JVM会根据当前对象的实际类型(Sub)去查找对应的方法实现,因此会调用Sub类中重写的m2方法。
用Java代码示例验证:
class Super { public void m1() { System.out.println("Super.m1"); m2(); // 调用的是实际实例的m2 } public void m2() { System.out.println("Super.m2"); } } class Sub extends Super { @Override public void m1() { System.out.println("Sub.m1"); super.m1(); System.out.println("Sub.m1 额外执行代码"); } @Override public void m2() { System.out.println("Sub.m2"); } } public class Demo { public static void main(String[] args) { Sub subInstance = new Sub(); subInstance.m1(); } }
运行输出:
Sub.m1 Super.m1 Sub.m2 Sub.m1 额外执行代码
从输出可以明确看到,Super.m1中调用的m2是Sub类的实现。
内容的提问来源于stack exchange,提问作者Jan Verrept
相关产品推荐
相关产品推荐

