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












