理解 Java 的动态绑定(Dynamic Binding),关键要抓住一句话:
方法在运行时根据“对象的实际类型”来决定调用哪一个实现,而不是根据“引用变量的声明类型”。
下面从概念、原理、示例和对比几个角度来说明。
在 Java 中:
new 出来的对象类型,决定调用哪个方法这就是动态绑定,也叫运行时多态。
class Animal {
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Cat meows");
}
}
使用:
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // Dog barks
a2.sound(); // Cat meows
a1 的声明类型是 AnimalDogsound() 时,JVM 看的是 Dog,不是 Animal✅ 这就是动态绑定
因为:
对比:
static、private、构造方法):编译时就确定动态绑定只在以下情况发生:
❌ 不会动态绑定的情况:
static 方法
private 方法
final 方法
构造方法
| 特性 | 动态绑定 | 静态绑定 |
|---|---|---|
| 发生时机 | 运行时 | 编译时 |
| 常见场景 | 普通实例方法 | static / private / final |
| 多态 | ✅ 支持 | ❌ 不支持 |
示例:
class A {
static void m() {}
}
A a = new B();
a.m(); // 调用的是 A.m(),静态绑定
这就是为什么:
父类引用能调用子类重写的方法
Java 动态绑定 = 父类引用 + 子类对象 + 方法重写 → 运行时决定调用哪个方法
如果你愿意,我也可以用画图方式或字节码层面再讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。