【一名正在不断努力的新人,记得每天温习代码~~~】
【现在所会知识有限,会有很多不足,请大家多多指教,共同进步~~~感谢】
动态绑定
Java的动态绑定,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
父类
class A { //父类
public int i = 10;
public int sum() {
return getI() + 10;
}
poublic int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
子类
class B extends A { //子类
public int i = 20;
public int sum() {
return i = 20;
}
public int getI() {
return i;
}
public int sum1() {
return i + 10;
}
}
main方法
A a = new B ();//向上转型
//a 的编译类型 A,运行类型 B
System.out.println(a.sum()); //40
System.out.println(a.sum1()); //30
在main方法中第一条输出语句System.out.println(a.sum());先判断a.sum()调用的是哪个类中的sum()方法,通过A a = new B ();可知运行类型为B,所以先从子类中查找sum()方法,可得出a.sum()最终结果为40;同理a.sum1()和上述操作过程相同。
1.如果我们将子类B中的方法sum()注销掉,此时第一条输出结果会有变化,因为方法a.sum()的运行类型为B,所以会先从子类B中查找是否有sum()方法,咱们已经注销掉B类中的sum()方法,找不到就会去父类A中查找,很好找到了,但是此时问题来了,A类中sum()方法,返回语句中包含getI(),子类和父类中都有这个方法,这时就有动态绑定机制在里面了(动态绑定机制在最下面)。(根据动态绑定机制第一句话)因为a.sum()运行类型为B,所以会调用子类B中的getI()方法,a.sum()结果为30。
2.如果我们将子类B中的方法sum1()注销掉,第二条输出语句中的方法a.sum1(),在子类B中没有找到sum1()方法,最终在父类中找到,此时父类A中sum1()方法下的返回语句 i 是调用父类A中的还是子类B中的,此时看动态绑定机制第二条,可知 i 在父类A中声明,就使用父类A中的 i ,a.sum1()结果为20。
动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性的时候,没有动态绑定机制,哪里声明,哪里使用