在 Java 中,动态绑定(Dynamic Binding)也称为后期绑定(Late Binding)。它是多态的一种实现机制。当一个对象的引用调用一个方法时,Java 会根据对象的实际类型(而不是引用的类型)来决定调用哪个方法的实现。这意味着在运行时才能确定具体调用的方法,而不是在编译时。
class A{
public int i = 10;
// 动态绑定机制
// 1. 调用对象方法,方法和运行类型绑定
// 2. 调用属性 无动态绑定,哪里调用哪里使用
public int sum(){
return getl() + 10; // 20 + 10 20是子类的方法
}
public int sum1(){
return i + 10; // 10 + 10 10是本类的i
}
public int getl(){
return i;
}
}
class B extends A{
private int i = 20;
public int sum(){
return getl() + 20;
}
public int sum1(){
return i + 10;
}
public int getl(){
return i;
}
}
main方法中
public static void main(String[] args) { //a的编译类型 A 运行类型 B A a = new B();//向上转型 System.out.println(a.i); System.out.println(a.sum());// 40 ->30 System.out.println(a.sum1());// 30 ->20 System.out.println(a.getl()); }
1.当调用对象方法时,该方法会和该对象的内存地址、运行类型绑定
A是一个基类,B是它的派生类。在main方法中,a是A类型的引用,但它实际指向一个B对象;
调用a.sum(),a.sum1()方法时,要判断,父类中是否存在该方法,然后会根据其指向的对象来选择调用的方法,即调用B类的sum(),sum1(), 而B类的sum(),sum1(), 中的i是B类本身的i = 20,
所以a.sum() = 40, a.sum1() = 30
2.当调用对象属性时,没有动态绑定机制,那里声明,那里使用
如果要输出类的属性,就会直接输出A类的i属性,属性看 = 左边 ,方法看 = 右边
现在我们如果把B类的public int getl(){ return i; } 注释掉,此时sum会调用父类的getI(),而属性i也是父类里面的,此时sum() = 30,sum1()调用的还是本类的属性i, sum1() = 30
这就是动态绑定的体系,运行时,它会根据对象的实际类型来确定调用正确的方法,并且调用正确的属性