方法覆盖必须满足“两同两小一大”:方法名和参数列表完全相同;返回值类型更具体、抛出检查异常更少;访问权限只能更大。还需满足非final、非static、可继承等前提。

方法覆盖(重写)不是简单地“换个实现”,而是要让子类对象在多态调用中能无缝替代父类对象。理解“两同两小一大”,关键在于抓住它的设计目的:保障类型安全、维持调用契约、支持里氏替换原则。
两同:识别重写的唯一依据
只有方法名和参数列表完全一致,编译器才认定这是对父类方法的覆盖,而不是重载或新定义。
- 方法名必须逐字相同,大小写敏感
- 参数列表指参数个数、类型顺序、每个参数的具体类型都必须严格匹配——int x 和 Integer x 不等价,String a, int b 和 int b, String a 也不等价
- 建议始终加上 @Override 注解,编译器会帮你校验是否真正在重写;如果写错,会立即报错,避免隐式创建新方法
两小:缩小契约范围,不扩大责任
“小”不是数值意义上的小,而是类型语义上的更具体、约束更强——相当于承诺“我能做的事,父类也能做;但我做的,可能比父类更精准、更少出错”。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 返回值类型:基本类型(int、boolean等)和 void 必须完全相同;引用类型允许协变返回,比如父类返回 List,子类可返回 ArrayList(因为 ArrayList 是 List 的子类型)
- 抛出异常:仅限制检查异常(checked exception)。子类方法只能抛出父类声明异常的子类,或不抛,不能新增、不能升级(如父类 throws IOException,子类不能 throws Exception 或 SQLException);运行时异常(如 RuntimeException)不受限制
一大:访问权限只能放宽,不能收紧
目的是确保所有原本能调用父类方法的地方,依然能通过子类对象正常调用——否则多态就失效了。
立即学习“Java免费学习笔记(深入)”;
- 访问权限从小到大为:private < 默认(包级) < protected < public
- 父类方法是 protected,子类可改为 public,但不能改为 default 或 private
- private 方法不可被继承,因此也无法被重写;static 方法属于类,不是实例行为,重写无效(实际是隐藏)
额外硬性前提不能漏
即使满足“两同两小一大”,以下情况仍会导致重写失败:
- 父类方法被 final 修饰 → 编译报错
- 父类方法是 static → 子类同名 static 方法只是隐藏,不是重写
- 子类与父类无继承关系,或因包访问限制导致父类方法对子类不可见 → 编译不通过

















