Java的动态绑定机制
1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。
2.当调用对象属性时,没有动态绑定机制,在哪里声明,就在哪里使用。
举个栗子:
public static void main(String[] args) {
A a = new B(); //向上转型
System.out.println(a.sum()); //输出40
System.out.println(a.sum1()); //输出30
}
}
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;
/*
如果注释B类的sum方法,虚拟机会去调用A类的getI,但是由于动态绑定,
所以回去调用B类指向的内存地址,也就是是B类的getI,传入的数值为20,
所以Main方法中的a.sum()输出getI+10 -> 20+10=30,最后的输出结
果为30。
*/
public int sum() {
return getI() + 20;
}
/*
如果注释B类的sum1方法,调用属性i的时候没有动态绑定,哪里调用,就在哪里使用
所以传入A中的数值->(10),Main方法中的a.sum1()输出i+10 -> 10+10=20,
最后的输出结果20。
*/
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}