java多态运行时分派依赖虚方法重写与动态绑定,由jvm根据对象实际类型调用对应方法;虚方法指非static、非private、非final的实例方法,重写需满足签名一致、返回类型兼容、访问权限不收紧、异常不扩大等契约,并推荐使用@override注解。

Java 中的多态运行时分派,本质是靠虚方法重写 + 动态绑定实现的。它不依赖编译期类型,而是由 JVM 在运行时根据对象真实类型决定调用哪个方法——这种机制既简洁又可靠,关键在于“虚方法”被正确定义和重写。
什么是虚方法
在 Java 中,所有非 static、非 private、非 final 的实例方法默认就是虚方法。它们支持被子类重写,并参与运行时动态绑定。比如:
-
public void speak() { ... }是虚方法 -
private void init() { ... }不是虚方法(不可重写) -
static void log() { ... }不是虚方法(绑定发生在编译期) -
final void close() { ... }不是虚方法(禁止重写)
重写必须满足契约,才能触发多态分派
只有符合重写规范的方法,JVM 才会在父类引用调用时自动转向子类实现。重点规则包括:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 方法签名完全一致:方法名、参数列表(含顺序与类型)必须相同
- 返回类型兼容:可以是相同类型,或父类返回类型的子类型(协变返回)
- 访问权限不能更严格:如父类是
protected,子类不能改为private - 异常声明不能扩大:子类方法抛出的检查异常不能比父类方法更多
- 务必使用
@Override注解——它不是可选装饰,而是编译器强制校验重写的手段
运行时分派靠的是对象实际类型,不是引用类型
写法如 Animal a = new Dog();,看似是 Animal 类型,但 JVM 在调用 a.speak() 时,会查 Dog 实例的虚方法表(vtable),找到 Dog 版本的 speak() 并执行。这就是“编译看左边,运行看右边”的实质:
- 编译期只检查
Animal是否有speak()方法(有则通过) - 运行期根据
new Dog()这个真实对象,定位并调用 Dog 的实现 - 哪怕后续换成
new Cat(),同一行代码自动切换行为,无需修改调用方
多态分派的价值体现在设计层面
真正优雅的地方,不在于语法本身,而在于它让高层代码摆脱对具体类型的依赖:
- 方法参数用父类类型(如
void feed(Animal a)),就能接受任意子类实例 - 集合存的是父类引用(如
List<animal></animal>),遍历时自动调用各子类特有逻辑 - 新增子类(如
class Duck extends Animal)只需重写方法,原有调用逻辑零改动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










