Java方法重写必须严格匹配签名:方法名和参数列表(个数、类型、顺序)完全一致,泛型擦除后类型须等价,返回类型支持协变(引用类型可更具体,基本类型和void须相同),访问权限不能更严格,且必须使用@Override注解以确保编译期校验。

Java 中方法重写(Override)的签名要求非常明确,不是“差不多就行”,而是必须严格匹配——差一个字母、一个参数类型、甚至泛型擦除后的差异,都会导致重写失败,变成重载或编译错误。
方法名和参数列表必须完全一致
这是签名一致性的核心:
- 方法名大小写、拼写必须与父类一模一样(比如 hashCode() 写成 hashcode() 就不是重写);
- 参数个数、类型顺序、类型本身必须完全相同;
- 泛型不参与签名,但擦除后类型要一致:父类方法是 void process(List<String> list),子类不能写成 void process(ArrayList<String> list)(因为 ArrayList 是 List 的子类,但擦除后签名不等价);
- 可变参数(... )属于参数类型的一部分,int... 和 int[] 虽然运行时等价,但语法上不算签名一致,不能互换重写。
返回类型支持协变,但有约束
从 JDK 5 开始允许返回更具体的子类型,但前提是:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 父类返回的是引用类型(如 Object、Number、自定义类),子类可返回其子类(如 String、Integer、MySubClass);
- 基本类型(int、boolean 等)和 void 不支持协变,必须完全相同;
- 协变只适用于返回类型,不适用于参数类型或异常类型。
访问修饰符不能更严格
子类方法的可见性只能等于或放宽,不能收紧:
立即学习“Java免费学习笔记(深入)”;
- 父类是 public → 子类只能是 public;
- 父类是 protected → 子类可以是 protected 或 public;
- 父类是包级(默认,无修饰符)→ 子类只能是包级或 public 或 protected;
- private 方法不可继承,因此根本无法被重写。
必须用 @Override 注解显式声明
这不是语法强制,但已是工程实践中的硬性要求:
- 让编译器检查该方法是否真能重写——若父类方法被删或改名,子类会立即报错;
- 避免因大小写、空格或参数微调导致“看似重写,实为新方法”的隐蔽问题;
- IDE 依赖它做安全重构(比如父类方法重命名时自动同步所有子类)。

















