方法重写是子类有意识替换父类行为实现,保持接口不变以支持多态;需满足继承关系、方法签名一致、返回类型协变、访问权限不更严格四条件;private、static、final方法不可重写;重写方法异常范围不得超出父类声明;@override注解用于编译期校验与意图表达。

方法重写(Override)不是“重新写一个名字一样的方法”,而是子类在继承关系中,**有意识地替换父类已有行为的实现逻辑**。它的核心是“保持接口不变,改变内部实现”,从而支撑多态——同一调用,不同表现。
重写的前提条件必须同时满足
只有当以下四点全部成立时,Java 才认定这是合法的重写:
- 子类与父类存在继承关系(extends)
- 方法名、参数列表(类型、个数、顺序)完全一致
- 返回值类型相同,或为父类返回类型的子类(Java 5+ 支持协变返回)
- 子类方法的访问权限不能比父类更严格(如父类是 protected,子类不能是 private)
哪些方法根本不能被重写
不是所有父类方法都能被覆盖,三类方法天然排除在重写机制之外:
- private 方法:子类不可见,连继承都做不到,谈不上重写
- static 方法:属于类而非对象,子类定义同签名 static 方法,本质是“隐藏”(hiding),不是重写
- final 方法:被明确锁定,编译器直接禁止子类修改其行为
重写时异常和 throws 的约束
子类重写方法抛出的异常,范围不能超过父类方法声明的异常:
- 可以不抛异常(比父类更保守)
- 可以抛出父类异常的子类(如父类 throws Exception,子类 throws IOException)
- 但不能抛出更宽泛或无关的异常(如父类 throws IOException,子类不能 throws Exception)
@Override 注解不是可选的,而是强烈推荐的
加上 @Override 不仅是风格问题,更是编译期防护:
- 如果签名写错(比如参数少一个、返回类型不兼容),编译器立刻报错
- 避免误把重载(Overload)当成重写,尤其在重构父类方法后能及时暴露问题
- 明确表达设计意图,让其他开发者一眼看出这是有意覆盖行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











