多态依赖运行时动态绑定,super是编译期语法用于显式调用父类成员;super.method()静态定位到直接父类或首个提供实现的祖先类,不参与多态。

多态本身不依赖 super 实现,而是靠运行时动态绑定;super 是编译期语法,用于**显式指定调用某一层父类的成员**,与多态无关,但可在多层级继承中辅助控制行为调用路径。
super 不参与多态,只做静态定位
super.method() 在编译时就确定调用哪个类中的方法——它跳过子类重写,直接绑定到**直接父类**(或向上追溯到第一个声明该方法的祖先类)的实现。这和多态的“运行时根据实际对象类型决定调用哪个重写版本”本质不同。
- 多态:调用
obj.method()→ JVM 查实际对象类型 → 找对应类的重写版本 -
super:写super.method()→ 编译器查当前类的直接父类 → 绑定到那个类里定义的方法(哪怕它自己又继承自更上层)
在多层级继承中,super 向上追溯有明确规则
当父类自身也继承了更上层类,且未重写某个方法时,super.method() 会继续向上查找,直到找到第一个提供该方法实现的祖先类。
- 例如:
GrandParent → Parent → Child - 若
Parent没重写GrandParent的say(),而Child写了super.say(),则实际调用的是GrandParent.say() - 这个过程是编译器静态解析的,不是运行时多态行为
super 不能绕过中间层强制调用“爷爷类”的方法
Java 不支持类似 super.super.method() 的语法。如果想跳过 Parent 直接调用 GrandParent 的方法,必须满足:
立即学习“Java免费学习笔记(深入)”;
-
Parent没重写该方法(即方法自然向上继承) - 或
Parent在自己重写的方法里主动用super.method()转发 - 否则,
Child.super.method()只能到达Parent层,无法越级
结合多态使用 super 的典型场景
常见于子类方法中扩展父类逻辑:先执行父类原有行为(用 super.xxx()),再添加子类特有操作。
- 比如
Dog重写Animal的move(),内部调用super.move()复用基础移动逻辑 - 即使
Animal继承自LivingThing,只要Animal没重写,super.move()就可能最终执行LivingThing.move() - 此时多态体现在
new Dog().move()调用的是Dog版本;而Dog版本内部用super主动回退到祖先实现


















