在 Java 中,动态绑定(Dynamic Binding),也叫运行时绑定,是指方法调用在运行时才确定具体要执行哪个方法实现,而不是在编译期确定。
它是 Java 多态的核心机制之一。
动态绑定:在运行时根据对象的实际类型,决定调用哪个方法实现。
因为 Java 中:
动态绑定就是让“调用哪个方法”由对象的实际类型决定,而不是引用类型。
✅ 只适用于方法
❌ 不适用于字段(成员变量)
❌ 不适用于 static 方法
❌ 不适用于 private 方法
❌ 不适用于构造方法
class Animal {
void sound() {
System.out.println("Animal makes a 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");
}
}
public class Test {
public static void main(String[] args) {
Animal a;
a = new Dog();
a.sound(); // 输出:Dog barks
a = new Cat();
a.sound(); // 输出:Cat meows
}
}
a 的 编译时类型 是 Animala 的 运行时类型 是 Dog 或 Catsound() 方法在 运行时 根据对象真实类型调用✅ 这就是 动态绑定
| 对比项 | 动态绑定 | 静态绑定 |
|---|---|---|
| 发生时间 | 运行时 | 编译时 |
| 适用对象 | 实例方法(非 private / static) | static、private、构造方法 |
| 是否多态 | ✅ 是 | ❌ 否 |
| 决定依据 | 对象实际类型 | 引用类型 |
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
}
Parent p = new Child();
System.out.println(p.x); // 输出 10
原因:
Parent❌ 没有
构造方法在对象创建时固定调用,不能被重写。
❌ 不能
static 方法属于类,不依赖对象。
✅ 动态绑定 = 运行时根据对象真实类型调用方法
✅ 是多态的实现基础
✅ 只适用于普通实例方法
如果你愿意,我也可以从 JVM 方法表 / invokevirtual 指令 角度再深入讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。