-
动态绑定
1. 当调用对象方法的时候,该方法和运行类型绑定,即方法调用看运行的类型
2. 当方法中调用对象属性的时候,哪个类声明的属性就使用哪个类的属性,即属性调用看声明的位置
3. 不通过方法直接获得的属性, 只看编译类型
public class Dynamic {
public static void main(String[] args) {
A a = new B();
// sum1() 方法在运行类型B中找到, 所以 i = 20
System.out.println("a.sum1() = " + a.sum1());
// sum() 方法在父类A中找到, 但根据动态绑定机制, getI()方法绑定运行类型是B对象, 所以 i = 20
System.out.println("a.sum() = " + a.sum());
// 不通过方法直接获得的属性, 只看编译类型, 所以 i = 10
System.out.println("a.i = " + a.i);
}
}
class A {
public int i = 10;
public int sum() {
// 此时, getI() 通过动态绑定机制绑定到运行对象类型B类的 getI()上
return getI() + 10;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
class B extends A {
public int i = 20;
public int getI() {
return i;
}
public int sum1() {
return i + 10;
}
}
运行结果:
a.sum1() = 30
a.sum() = 30
a.i = 10