Java中方法重写通过相同签名、协变返回、宽松访问权限实现子类对父类方法的动态增强,需用super()调用父类逻辑并结合预处理/后置处理,仅当父类引用指向子类对象时触发运行时多态。

Java 中通过方法重写(Override)实现子类对父类方法的扩展,这是多态的核心机制。关键在于:子类继承父类后,用 相同的方法签名(方法名、参数列表、返回类型兼容)重新定义方法体,运行时根据实际对象类型动态调用对应版本。
重写父类方法的基本要求
要正确扩展父类方法,必须满足以下条件:
- 方法名、参数列表(个数、类型、顺序)必须完全一致
- 返回类型需是父类方法返回类型的子类型或相同类型(协变返回)
- 访问权限不能比父类更严格(如父类是 protected,子类不能用 private)
- 父类方法不能是 final、static 或 private
在子类中扩展逻辑的常见方式
不只是“替换”,而是“增强”——通常保留父类行为,并在此基础上添加新逻辑:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 使用 super.methodName() 调用父类原实现,再追加子类特有操作
- 在方法开头做预处理(如参数校验、日志记录)
- 在方法结尾做后置处理(如资源清理、状态更新)
- 根据子类特性调整部分逻辑分支(如不同计算规则)
配合多态使用的典型场景
只有通过父类引用指向子类对象,才能体现运行时多态效果:
立即学习“Java免费学习笔记(深入)”;
- 声明为父类类型,但 new 的是子类实例(如 Animal a = new Dog();)
- 调用被重写的方法时,JVM 自动选择实际对象所属类的版本
- 可将不同子类对象存入同一集合(如 List
),遍历时自动执行各自实现
注意避免常见误区
容易混淆重写与重载,也容易忽略多态前提:
- 重载(Overload)发生在同一个类中,靠参数列表区分;重写(Override)发生在父子类之间,靠对象实际类型决定
- 若子类方法签名与父类不一致,哪怕名字相同,也只是新增方法,不构成重写,也不参与多态
- 静态方法不能被重写(可被隐藏),调用取决于引用类型而非实际对象类型
- 构造方法不参与多态,子类构造器默认先调用 super(),但不是多态调用

















