package basis.dynamic;
public class DynamicBinding {
public static void main(String[] args) {
//a的编译类型是A ,a的运行类型是B
A a = new B();
System.out.println(a.sum()); //40
System.out.println(a.sum1()); //30
System.out.println("============");
//将B类中的sum() 和 sum1() 注释掉
System.out.println(a.sum()); //30
System.out.println(a.sum1()); //20
}
}
class A{ //父类
public int i = 10;
public int getI() {
return i;
}
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 10;
}
}
class B extends A{ //子类
public int i = 20;
@Override
public int getI() {
return i;
}
public int sum(){
return i + 20;
}
public int sum1() {
return i + 10;
}
}
运行结果:
结论:
java 的动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
分析:
当没有注释掉子类B中的 sum() 和 sum1() 方法时,a.sum()这两个函数执行的是运行类型的函数。
当注释掉子类B中的 sum() 和 sum1() 方法时,a.sum()这两个函数执行时在B类中没有找到这两个函数,去它继承的父类中寻找,在A类中找到 sum() 和 sum1() 函数,执行这两个函数;关于成员属性 i 不被动态绑定,只在定义的类中使用。