子类重写需明确意图、保持签名一致、合理调用super()并使用@override注解:意图分完全替换、补充增强、条件调整三类;签名须方法名、参数类型、返回类型严格匹配;super()用于复用而非复制;@override防止假重写。

子类重写不是简单替换父类代码,而是让子类在继承基础上精准表达自身业务逻辑——关键在于明确“要改什么、为什么改、怎么改得安全”。
重写前先想清楚意图
盲目重写容易破坏原有契约。常见意图有三类:
-
完全替换:父类逻辑不适用,子类需独立实现。例如 Animal 的
move()在 Bird 中重写为“飞翔”,和“奔跑”“爬行”无共性。 -
补充增强:父类完成基础动作,子类追加专属处理。比如 User 的
save()做数据入库,VipUser 重写后在调用super.save()后额外发送权益短信。 -
条件调整:主流程不变,关键节点插入子类判断。例如 PaymentService 的
confirm()中,CorporateAccount 重写后增加对账触发逻辑,普通账户直接跳过。
签名一致是硬门槛,一步错就失效
JVM 只认签名(方法名 + 参数类型 + 返回类型)完全匹配才算重写。常见陷阱:
- 参数类型看似相同实则不同:父类用
List<order></order>,子类写成ArrayList<order></order>→ 实际是重载,多态调用进不去。 - 泛型擦除后不一致:父类
<t extends user> T process(T input)</t>,子类漏掉类型参数 → 编译报错或误判为新方法。 - 返回类型不协变:父类返回
Response,子类返回String(非其子类)→ 编译失败。
用 super() 复用,而不是复制粘贴
重写不是推倒重来,而是站在父类肩膀上定制。是否调用 super.xxx() 取决于语义:
-
前置增强:权限校验、日志记录放在
super.method()之前; -
后置清理:关闭子类独有资源、发异步通知放在
super.method()之后; - 中间介入:根据父类返回结果做分支,如父类校验通过才执行子类补偿逻辑。
漏掉 super() 可能导致字段未初始化、资源未释放等隐性 bug。
@Override 注解是防错刚需
它不参与运行,但能在编译阶段揪出所有“假重写”:
- 拼错方法名(
toString写成toSting); - 父类方法已被删除或改为
private/final/static; - 参数顺序或类型微调(
int, StringvsString, int)。
IDE 自动生成重写方法时默认带该注解,手写也务必补上——报错不是失败,而是及时止损。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











