java方法重写必须严格遵守四条铁律:方法签名完全一致、返回类型协变兼容、访问权限不更严格、检查型异常声明不更宽泛;@override注解是编译期强制校验的关键开关,确保重写合法性并防止多态失效。

Java 中方法重写(Override)不是“名字一样就行”,而是有四条不可妥协的铁律契约。违反任意一条,编译器会直接报错,或导致看似重写、实则失效(变成重载或新方法),多态就断了。
方法签名必须完全一致
签名 = 方法名 + 参数列表(参数个数、类型、顺序),三者必须和父类方法严丝合缝:
- 方法名大小写不能错,hashCode() 写成 hashcode() 就不是重写;
- int 和 Integer 是不同参数类型,父类是
void log(int x),子类写void log(Integer x)属于重载,加@Override会编译失败; - 泛型擦除后类型也得对齐:父类是
void process(List<string> list)</string>,子类不能写成void process(ArrayList<string> list)</string>(ArrayList ≠ List 擦除后等价); - 可变参数
String...和String[]语法上不等价,不能互换重写。
返回类型必须协变兼容
返回值不能“变宽”,但允许“变窄”(JDK 5 起支持协变返回):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类返回 Animal,子类可返回 Dog extends Animal ✅;
- 父类返回 String(引用类型),子类不能返回 Object ❌(扩大范围);
- 父类返回 int 或 void,子类必须严格相同,不支持协变 ❌;
- 协变只适用于返回类型,不适用于参数或异常类型。
访问权限不能更严格
子类方法的可见性只能等于或放宽,否则破坏里氏替换原则:
- 父类是 public → 子类只能是 public;
- 父类是 protected → 子类可用 protected 或 public,不能是 private 或包私有;
- 父类是包私有(无修饰符)→ 子类可用包私有、protected 或 public;
- private 和 static 方法不可被重写,子类同名方法只是独立新方法。
检查型异常声明不能更宽泛
这条只约束 checked 异常(编译期强制处理的异常),runtime 异常无限制:
- 父类没声明 checked 异常 → 子类不能抛 IOException、SQLException 等;
- 父类声明 IOException → 子类可抛 FileNotFoundException(它是子类),也可不抛,但不能抛 Exception(更宽)或 SQLException(无关类型);
- 子类可以比父类抛得更少、更具体,但绝不能更多、更笼统。
这四条是硬性底线,缺一不可。而 @Override 注解不是锦上添花,是激活编译器校验的开关——它让所有不合规的“伪重写”在编码阶段就暴露出来,而不是等到运行时静默出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










