子类重写方法时可通过super.方法名()调用父类原始实现,用于在原有逻辑基础上增强:前置校验、后置日志、环绕计时等;需注意父类方法非private/final/abstract,且参数签名一致。

子类重写方法时,用 super.方法名() 就能调用父类的原始实现。
为什么需要调用父类逻辑
很多场景下,子类不是要完全替换父类行为,而是想在原有基础上做增强或补充。比如:初始化前校验参数、执行完父类逻辑后再记录日志、或在父类处理后追加特定业务。
基本写法:super + 方法调用
只要父类方法不是 private 或 final,子类重写时就可以通过 super.方法名(参数) 显式调用父类版本:
- 必须在重写方法体内调用,不能在静态上下文或构造器外直接用
- 参数类型和数量需与父类方法签名一致
- 返回值可复用父类结果,也可进一步加工(如包装、转换)
常见使用模式
前置增强:先做子类特有操作,再调用父类逻辑
// 示例:子类保存前校验数据
立即学习“Java免费学习笔记(深入)”;
@Override
public void save(User user) {
if (user == null) throw new IllegalArgumentException("user cannot be null");
super.save(user); // 执行父类真正的保存逻辑
}后置增强:先让父类执行,再追加子类逻辑
// 示例:父类发送消息后,子类记录发送日志
@Override
public void sendMessage(String content) {
super.sendMessage(content);
log.info("Message sent: {}", content);
}环绕增强:父类逻辑包在子类代码中间,适合拦截、计时、事务控制等
// 示例:统计方法执行耗时
@Override
public String process(String input) {
long start = System.currentTimeMillis();
String result = super.process(input); // 调用父类核心处理
long cost = System.currentTimeMillis() - start;
log.debug("process took {}ms", cost);
return result;
}注意事项
调用 super 不代表“继承父类实现”,只是触发父类该方法的代码执行;它不会自动复制父类字段或构造逻辑。若父类方法本身依赖其私有状态(如 private 字段),子类无需关心——只要父类方法设计合理,super 调用就能正常工作。
如果父类方法是 abstract,就不能 super 调用(因为没实现);如果是 default 方法(接口中),子类重写时也可以用 super.方法名() 调用接口默认实现。


















