在子类方法中需用 super.方法名(...) 显式调用父类同名方法以复用其逻辑,仅限实例方法使用,参数需兼容,且父类必须存在该方法;构造器中 super() 调用父类构造器,必须为首句且强制存在。

在子类中重写父类方法后,若想在子类方法内部执行父类的原始逻辑,必须用 super 关键字显式调用父类同名方法。这是实现“在子类行为中复用父类逻辑”的核心机制。
super 调用父类方法的基本语法
在子类的实例方法中,使用 super.方法名(...) 即可调用父类中被重写的同名方法。注意:该调用不会自动发生,必须手动写出;且只能在实例方法中使用(不能在静态方法或字段初始化中直接用)。
- 必须确保父类中存在对应方法(否则编译报错)
- 参数列表需与父类方法签名兼容(类型、数量、顺序一致)
- 返回值可接收或忽略,取决于业务需要
典型场景:扩展而非完全替换父类逻辑
比如父类定义了基础的数据校验,子类需要先执行父类校验,再追加额外检查:
class Animal {
void speak() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
void speak() {
super.speak(); // 先执行父类行为
System.out.println("Woof!"); // 再添加子类特有行为
}
}
这样既保留了父类功能,又实现了定制化增强。
注意构造器中的 super() 调用
虽然问题聚焦于“方法”,但需特别提醒:子类构造器第一行默认或显式调用 super()(父类构造器),这与方法调用不同——它是强制性的,且只能出现在构造器开头。若父类无无参构造器,子类必须显式写出匹配参数的 super(...)。
- 不写
super(...)且父类没有无参构造器 → 编译失败 -
super(...)必须是构造器第一条语句 - 不能在普通方法里调用
super()(那是构造器专用语法)
避免常见误区
super 不是指向父类对象的引用,而是“调用父类版本”的语法指令。它不会创建新对象,也不改变当前 this 的指向。
- 错误理解:
super是一个对象 → 实际上它不是对象,不能赋值给变量 - 错误写法:
super = ...或Dog d = super;→ 编译不通过 - 混淆
super.方法()和父类名.方法()→ 后者非法,Java 不支持类名直接调实例方法











