Java方法重写必须满足“两同两小一大”:方法名和参数列表完全相同;返回值类型和检查异常范围更小(协变返回、子类异常);访问权限只能扩大(private < default < protected < public)。

Java 中方法重写必须严格满足“两同两小一大”原则,否则编译不通过。这个规则本质是保证子类对象能安全替代父类对象(里氏替换原则),同时不破坏调用方的预期行为。
两同:方法名和参数列表必须完全一致
这是重写最基础的识别条件。方法名、参数个数、每个参数的类型和顺序,都得和父类方法一模一样。
- 哪怕只是把
int x改成Integer x,就不是重写,而是重载(或编译错误) - 参数顺序不同(如
(String, int)vs(int, String))也不算重写 - 建议始终加上
@Override注解,让编译器帮你检查是否真正在重写
两小:返回值类型和抛出异常要“更具体”或“不变”
“小”不是指字节数或范围大小,而是指类型的语义范围更窄、约束更强。
-
返回值类型:
• 基本类型(
int、boolean等)和void必须完全相同; • 引用类型允许协变返回(covariant return),即子类方法可返回父类方法返回类型的子类,例如父类返回Animal,子类可返回Dog -
抛出异常:
• 只限制检查异常(checked exception);
• 子类方法只能抛出父类声明异常的子类,或不抛出,不能新增或升级为父类异常的父类(比如父类抛
IOException,子类不能抛Exception); • 运行时异常(unchecked)不受此限,可自由添加或删减
一大:访问权限只能扩大,不能缩小
目的是确保所有能访问父类方法的地方,也能访问子类重写后的方法。
立即学习“Java免费学习笔记(深入)”;
- 权限从小到大排序:
privatedefault(包级) protected public - 父类方法是
protected,子类可改为public,但不能改为default或private - 父类方法是
private,根本不可被继承,自然也无法重写(此时子类定义同名方法属于新方法)
额外注意的硬性限制
这些虽不在“两同两小一大”字面中,但实际重写时必须同时满足:
-
final方法不能被重写 -
static方法不能被重写(可被隐藏,但不是重写) - 构造方法不能被重写
- 子类和父类必须存在继承关系,且该方法对子类可见(即不能是
private或因包访问限制不可见)


















