java方法重写支持多态需同时满足:方法签名严格一致(含方法名、参数列表)、访问权限不 stricter、非static/final/private、使用@override注解、通过父类引用指向子类对象调用,且检查异常声明不得扩大。

要让 Java 中的方法重写真正支持多态,关键不是“写出来就行”,而是确保 JVM 能在运行时根据实际对象类型,自动调用子类重写后的方法。这需要同时满足语法规范、继承结构和调用方式三方面要求。
方法签名必须严格一致
这是多态生效的底层前提。JVM 通过方法签名(方法名 + 参数列表)识别是否构成重写,任何偏差都会导致重载或新方法,无法参与动态绑定:
- 方法名完全相同,大小写敏感(如 hashCode 不能写成 hashcode)
- 参数个数、类型(原始类型或泛型擦除后的类型)、顺序必须一模一样(List
和 ArrayList 不等价) - 返回类型:基本类型和 void 必须完全相同;引用类型允许协变(子类返回更具体的类型,如父类返回 Animal,子类可返回 Dog)
访问权限与修饰符不能破坏继承链
如果子类方法比父类更难被访问,就切断了多态调用的路径:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 子类方法访问修饰符不能比父类更严格(public → 只能 public;protected → 可 protected 或 public;不能从 protected 降为 private)
-
static、final、private 方法不可重写——它们不参与运行时绑定:
• static 是类级别,调用看引用类型;
• final 显式禁止重写;
• private 对子类不可见,子类中同名方法是独立新方法
必须用 @Override 注解并配合向上转型调用
注解不是装饰,是编译期强制校验工具;而多态行为只在特定调用模式下触发:
- 所有重写方法都应加 @Override,它能捕获拼写错误、父类方法被删、参数类型误写等隐患
- 多态生效的前提是:用父类(或接口)类型声明引用,但指向子类对象(即向上转型),例如:
Animal a = new Dog(); → a.eat(); 才会执行 Dog 的 eat - 若写成 Dog d = new Dog(); d.eat();,虽也调用子类方法,但这属于静态调用,不体现多态性
异常声明不能扩大作用域
异常规则保障调用方代码的健壮性,避免因重写引入未预期的检查异常:
- 子类重写方法抛出的检查型异常(checked exception)只能是父类方法所声明异常的子类,或不抛
- 运行时异常(RuntimeException 及其子类)无此限制
- 若父类方法不抛任何检查异常,子类也不能新增检查异常(否则编译失败)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










