Java 的**动态绑定(Dynamic Binding / Late Binding)**指的是:在运行时根据对象的实际类型,而不是引用变量的声明类型,来决定调用哪个方法。它是 Java 实现多态的核心机制。
下面从原理、过程、底层实现、示例几个方面说明。
Animal a = new Dog();
a.sound(); // 调用的是 Dog 的 sound()
a 的编译时类型是 Animala 的运行时类型是 Dog动态绑定只发生在:
以下情况不是动态绑定:
每个类在加载时会生成一个方法表:
示例:
class Animal {
void sound() {}
}
class Dog extends Animal {
void sound() {} // 重写
}
方法表逻辑上类似:
Animal 方法表:
[ sound -> Animal.sound ]
Dog 方法表:
[ sound -> Dog.sound ]
对象在堆中大致结构:
Dog 对象:
├─ 对象头
├─ 指向 Dog 类的方法表(vtable 指针)
├─ 成员变量
当执行:
a.sound();
JVM 实际做的是:
a 指向的真实对象sound 方法的地址✅ 方法地址在运行时确定
| 类型 | 绑定时机 | 示例 |
|---|---|---|
| 静态绑定 | 编译期 | static / private / final |
| 动态绑定 | 运行期 | 重写方法 |
class A {
static void m() {}
void n() {}
}
A a = new B();
a.m(); // 静态绑定,调用 A.m()
a.n(); // 动态绑定,调用 B.n()
class A {
int x = 1;
}
class B extends A {
int x = 2;
}
A a = new B();
System.out.println(a.x); // 输出 1
原因:
final void m() {}
Java 动态绑定的本质是:通过对象运行时的类信息(方法表 / vtable),在运行时确定要调用的具体方法实现。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。