java的动态绑定机制(非常重要)
动态绑定机制:
1)当调用对象方法的时候,该方法会和该对象的内存地址 / 运行类型绑定;
2)当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用;
public class DynamicBinding {
public static void main(String[] args) {
// 向上转型 属性看编译,方法看运行
// a 的编译类型 A,运行类型 B
A a = new B();
System.out.println(a.sum()); // 40
System.out.println(a.sum1()); // 30
// 把子类 B 的 sum() 方法注释掉
// a 的运行类型是 B,调用的是 B 的方法 getI(),getI()返回的值是 20
System.out.println(a.sum()); // 输出结果为 20 + 10 = 30
// 把子类 B 的 sum1() 方法注释掉
//当调用对象属性时,没有动态绑定机制,调用的 A 中的 i,i = 10
System.out.println(a.sum1()); // 输出结果为 10 + 10 = 20
}
}
class A{ // 父类
public int i = 10;
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
class B extends A{
public int i = 20;
public int sum(){
return getI() + 20;
}
public int sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
总结:找方法从运行类型开始找; 找属性从使用方法的类中找。