动态绑定机制两条秘诀
1.当调用对象方法时,该方法会与该对象的运行类型绑定
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里调用
注意:动态绑定机制是建立在多态的基础上的。
练习题
求输出什么?
public class DynamicBinding {
public static void main(String[] args) {
//a 的编译类型 A, 运行类型 B
A a = new B();//向上转型
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A {//父类
public int i = 10; //动态绑定机制:
public int sum() {//父类 sum()
return getI() + 10;
}
public int sum1() {//父类 sum1()
return i + 10;
}
public int getI() {//父类 getI
return i;
}
}
class B extends A {//子类 public
int i = 20; //
//public int sum() {//子类 sum()
// return i + 20;
//}
public int getI() {//子类 getI()
return i;
}
//public int sum1() {//子类 sum1()
// return i + 10;
//}
}
解题思路:
1.A a = new B();是多态的向上转型,a 的编译类型是A, 运行类型是B。
2.输出a.sum(),由于a 的编译类型是A,所以A类的所有成员都可以访问,当然如果B类重写了A类的方法,这些被重写的方法也可以被访问。
3.在运行时,以a的运行类型为准,所以a.sum()首先会在B类中寻找sum方法,因为属性没有动态绑定机制,所以 i = 20,a.sum() = 40。
4.a.sum1()同理,输出30。
如果子类 sum(),子类 sum1()被注销,又会输出什么?
1.当a.sum()在B类找不到sum方法时,就会找A类的sum方法,但是sum方法中还有getI()方法,这时就会用到第一条秘决:当调用对象方法时,该方法会与该对象的运行类型绑定。所以就会返回B类查找getI()方法,因为属性没有动态绑定机制,所以 i = 20,getI() = 20,a.sum() = 30。
2.a.sum1()也会在A类寻找sum1方法,因为属性没有动态绑定机制,所以 i = 10,a.sum1() = 20。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/120188.html