经典面试题:子类通过 super.method() 调用父类方法,父类方法内部又调用了被子类覆盖的方法,**最终执行的是子类还是父类的版本?**
public class SuperClass {
public void printA() {
System.out.print("SuperClass-printA");
printB(); // 内部调用
}
public void printB() {
System.out.print("SuperClass-printB");
}
}
public class ChildClass extends SuperClass {
@Override
public void printA() {
System.out.print("ChildClass-printA");
super.printA(); // 显式调用父类
}
@Override
public void printB() {
System.out.print("ChildClass-printB");
}
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.printA();
}
}
ChildClass-printASuperClass-printAChildClass-printB
父类方法内部调用被覆盖方法时,触发动态绑定,执行子类的覆盖版本。
super.printA() 仅固定调用父类的 printA 实现printA 内部的 printB() 是 **虚方法调用**,运行时根据对象实际类型(ChildClass)分发super 只能锁定直接调用的目标,无法锁定间接调用链super.printA() → invokespecial SuperClass.printA(静态绑定)printB() → invokevirtual SuperClass.printB(动态分发)final 骨架方法,调用 protected abstract 钩子方法,子类实现钩子private void printBInternal() 供内部调用