动态绑定是jvm在运行时根据对象实际类型查虚方法表自动调用重写方法的过程;仅适用于非static、非private、非final的实例方法,且需被子类重写。

动态绑定不是“选方法”,而是 JVM 在运行时根据对象真实类型自动查表调用的过程。它不靠关键字驱动,也不需要手动干预,只要满足条件,JVM 就会走这套流程。
哪些方法能触发动态绑定
只有同时满足以下三个条件的实例方法,才会进入动态绑定流程:
- 不是 static 方法(静态方法属于类,调用只看引用声明类型)
- 不是 private 方法(无法被继承,子类里同名方法是独立定义)
- 不是 final 方法(禁止重写,编译期就能确定唯一实现)
除此之外的普通实例方法,只要被子类重写(Override),就天然支持动态绑定。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
运行期执行的三步核心动作
JVM 执行 obj.method() 时,若该方法符合动态绑定条件,会按如下顺序操作:
-
取实际类型:从
obj引用指向的堆内存对象中,读取其真实的运行时类(比如new Dog(),实际类型就是Dog.class) - 查虚方法表(vtable):找到该类对应的 vtable,表中每一项对应一个方法签名,已重写的方法项指向子类自己的字节码入口
- 跳转执行:直接跳到 vtable 中对应项所指的指令地址开始运行,整个过程对开发者完全透明
为什么父类引用能调用子类方法
例如:Animal a = new Dog(); a.speak();
-
编译期只检查
Animal类有没有speak()方法——有,就允许编译通过 -
运行期发现
a实际指向的是Dog实例,于是查Dog的 vtable,找到重写的speak()实现并执行 - 如果
Dog没重写speak(),JVM 会沿继承链向上查找,直到Animal的实现
容易混淆的几个关键点
动态绑定和重载(Overload)无关,也和字段访问无关:
-
重载在编译期决定:比如
print(String)和print(Object),编译器只看实参的静态类型,不看对象实际类型 -
字段不参与动态绑定:
Parent p = new Child(); System.out.println(p.field);输出的是Parent的字段值 - @Override 注解只是编译检查,不影响运行行为;没加它,只要签名一致且可访问,照样触发动态绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










