重写必须严格匹配方法签名:方法名、参数类型、个数、顺序完全一致;返回类型支持协变;访问权限只能放宽;必须加@override注解;static、final、private方法无法被重写;检查异常声明不能更宽。

方法签名必须完全一致
重写不是改个名字或调个参数,而是严格匹配父类方法的“长相”:方法名、参数类型、参数个数、参数顺序,缺一不可。比如父类有 void save(String id, int version),子类就得照写,不能写成 void save(String id, Integer version)——哪怕只是把 int 换成 Integer,编译器就当它是新方法(重载),多态就断了。
返回类型支持协变,但不能倒着来
引用类型返回值可以“收窄”:父类返回 Object,子类可返回 String 或 Listvoid 则必须一字不差。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
访问权限只能放宽,不能收紧
子类方法的修饰符得 ≥ 父类:父类是 protected,子类可用 protected 或 public;父类是 public,子类只能是 public。用 private 或默认(包级)去重写 protected 方法?编译器立刻拒绝。
必须加 @Override 注解
这不是形式主义,是关键防线:
• 拼错方法名(比如 hashcode() 写成 hashCode())?
• 父类方法被删了,子类忘了同步?
• 参数类型看着像,其实不一样?
这些都会导致 @Override 编译失败,提前暴露问题。IDE 重命名父类方法时,带这个注解的子类方法还能自动跟着改,省心又安全。
避开三类“假重写”陷阱
以下情况看似在重写,实际完全无效:
• static 方法:子类同名 static 方法只是“隐藏”,调用走的是引用类型,不是运行时对象类型。
• final 方法:编译器直接报错,不给机会。
• private 方法:子类根本看不见,定义同名方法只是新增一个私有方法,跟父类毫无关系。
异常声明不能更宽,但运行时异常除外
如果父类方法声明抛出 IOException,子类重写时只能:
• 不抛异常
• 或只抛 FileNotFoundException 这类子类异常
不能抛 Exception 或全新检查异常。但运行时异常(RuntimeException 及其子类)不受限,想 throw 就 throw。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










