Java知识点--动态绑定机制及其练习题 谁借莪1个温暖的怀抱¢ 2024-04-08 11:26 12阅读 0赞 ### 动态绑定机制两条秘诀 ### 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。
还没有评论,来说两句吧...