理解 Java 的动态绑定机制(Dynamic Binding / Runtime Polymorphism),可以从“是什么、为什么、怎么发生、注意事项”几个层面来看。
动态绑定指的是:
在程序运行时,根据对象的实际类型(而不是引用变量的声明类型)来决定调用哪一个方法。
动态绑定是 Java 实现**多态(Polymorphism)**的核心机制。
class Animal {
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog bark");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
a.sound(); // 输出什么?
}
}
✅ 输出:
Dog bark
虽然 a 的声明类型是 Animal,
但 实际对象是 Dog,
所以调用的是 Dog.sound()。
这就是动态绑定。
因为方法调用不是在编译期确定的,而是在运行时根据对象真实类型决定。
对比:
| 绑定方式 | 决定时机 | 例子 |
|---|---|---|
| 静态绑定 | 编译期 | static 方法、private 方法、构造方法 |
| 动态绑定 | 运行期 | 普通实例方法(可被重写) |
动态绑定只在以下情况发生:
✅ 满足这些条件,才会发生动态绑定
class A {
static void m() { System.out.println("A"); }
}
class B extends A {
static void m() { System.out.println("B"); }
}
A a = new B();
a.m(); // 输出 A
❌ 不会发生动态绑定
private 方法不能被继承,也不能被重写
final 方法不能被重写 → 编译期绑定
⚠️ 字段没有动态绑定
class A {
int x = 1;
}
class B extends A {
int x = 2;
}
A a = new B();
System.out.println(a.x); // 1
字段访问看的是引用类型
所以动态绑定 ≠ 查源码,而是 运行时查表
✅ 解耦
✅ 可扩展
✅ 符合“开闭原则”
void feed(Animal a) {
a.sound(); // 不关心具体类型
}
新增 Cat 也不用改代码。
Java 动态绑定 = 运行时根据对象的实际类型,调用被重写的方法
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。