Java方法重写必须严格满足“两同两小一大”原则:方法名和参数列表完全相同;返回值和异常类型更具体或相等;访问权限只能扩大,否则编译不通过,@Override注解可辅助验证。

Java 中方法重写必须严格满足“两同两小一大”原则,否则编译不通过。这个原则不是建议,而是编译器强制校验的语法要求。
两同:方法名和参数列表必须完全一致
子类重写的方法,名称、参数类型、参数个数、参数顺序,必须和父类被重写的方法一模一样。哪怕只是把 int 换成 Integer,或调换两个参数位置,都不算重写,而是重载或新方法。
- 方法名拼写不能有大小写差异(如 toString 和 ToString 是两个方法)
- 参数列表包括泛型擦除后的原始类型,所以 List<String> 和 List<Integer> 在重写判断中视为相同参数类型
- 可变参数 void method(String... args) 与 void method(String[] args) 不能互相重写(语法上不等价)
两小:返回值类型和异常类型必须“更具体”或“相等”
“小”不是指数值范围小,而是指类型继承关系中的下界——即子类能安全替代父类,符合里氏替换原则。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
返回值类型:
• 基本类型(int、boolean 等)必须完全相同
• void 方法返回值也必须是 void
• 引用类型允许协变返回(covariant return),例如父类返回 Object,子类可返回 String 或 Number -
抛出的异常:
• 只针对 检查型异常(checked exception)
• 子类方法不能新增检查型异常,也不能抛出比父类更宽泛的异常(如父类抛 IOException,子类不能抛 Exception)
• 可以减少异常(如不抛任何检查异常),或抛出其子类(如 FileNotFoundException)
• 运行时异常(RuntimeException 及其子类)不受限制,可自由添加
一大:访问权限只能扩大,不能缩小
子类方法的访问修饰符必须比父类方法的更“开放”,确保父类能被多态调用时,子类实现依然可访问。
立即学习“Java免费学习笔记(深入)”;
- 权限由大到小顺序为:public > protected > 默认(包级私有) > private
- 父类是 protected,子类可用 protected 或 public,但不能用默认或 private
- 父类是默认(无修饰符),子类只能用默认或 public,不能用 protected 或 private
- private 方法无法被重写(它对子类不可见),static 和 final 方法也不允许重写
辅助验证:善用 @Override 注解
在子类方法上显式加上 @Override,编译器会立即检查是否真正满足重写条件。一旦不满足“两同两小一大”,就会报错,而不是静默变成新方法或重载。
- 如果误写了参数类型,加了 @Override 会提示 “method does not override or implement a method from a supertype”
- 如果降低了访问权限(如父类 public,子类写 protected),也会直接编译失败
- 这是最简单、最可靠的自查手段,建议所有重写方法都加上

















