方法重写是实现多态的核心,需依托继承结构、方法签名一致性和运行时动态绑定;父类提供非私有非final的公共契约,子类严格重写并注入差异化逻辑,通过父类引用调用触发jvm动态绑定,结合接口可提升扩展性与松耦合。

在 Java 中,方法重写(Override)是实现多态的核心手段。要让重写真正支撑多态并输出不同业务逻辑,关键不是“写个重写方法”就行,而是围绕继承结构、方法签名一致性、运行时动态绑定这三个支点来组织代码。
确保父类定义可被重写的公共契约
父类应提供清晰、稳定、非私有、非 final 的方法声明,作为子类行为的统一入口。这个方法不负责具体实现,只定义“做什么”,比如:
- 用 public 或 protected 修饰,不能是 private 或 final
- 避免使用 static —— 静态方法无法被多态调用
- 返回类型可相同,或使用协变返回类型(如父类返回 Animal,子类返回 Dog)
例如:Animal 类中定义 public void processOrder(),不写具体逻辑,只为后续子类提供统一调用点。
子类按规则重写并注入差异化业务
每个子类根据自身职责,覆盖父类方法,把业务细节“填进去”。重点在于:方法名、参数列表、返回类型必须严格一致;访问权限不能更严格;异常范围不能扩大。
-
PaymentProcessor 父类声明
void execute(double amount) - AlipayProcessor 重写后打印“支付宝支付 ¥{amount},已扣款”
- WechatProcessor 重写后打印“微信支付 ¥{amount},已扫码”
- BankTransferProcessor 重写后打印“银行转账 ¥{amount},处理中…”
此时,只要用 PaymentProcessor p = new AlipayProcessor();,调用 p.execute(199.9) 就自动执行支付宝逻辑 —— 不需要 if-else 判断类型。
用父类引用调用,触发运行时动态绑定
多态生效的临门一脚,是用父类类型变量指向子类对象,并通过该变量调用重写方法。JVM 在运行时查对象实际类型,决定执行哪个版本的方法。
- 正确写法:
PaymentProcessor processor = getProcessorByType("alipay"); processor.execute(299.0); - 错误写法:
AlipayProcessor a = new AlipayProcessor(); a.execute(299.0);—— 这只是普通调用,没用上多态 - 常见场景:集合统一处理:
List<paymentprocessor> list = Arrays.asList(new AlipayProcessor(), new WechatProcessor()); list.forEach(p -> p.execute(99.0));</paymentprocessor>
配合向上转型与接口抽象提升扩展性
纯继承有时不够灵活。若业务角色差异大、无强继承关系(比如“支付”和“通知”),建议改用接口。接口天然支持多实现,且更松耦合。
- 定义
interface Notifier { void send(String content); } -
SmsNotifier、EmailNotifier、PushNotifier各自实现send() - 业务层只依赖
Notifier notifier,随时替换实现,无需修改调用方
这样既满足多态本质(同一方法名,不同对象不同行为),又让新增渠道(比如加个 DingTalkNotifier)只需新增类,不碰原有代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











