目录
java的动态绑定机制(非常重要)
这里a的编译类型为A,运行类型为B。所以调用a的方法时,其实调用的就是B中的sum 和sum1方法,结果为40和30.
调用sum和sum1时,都调用的是子类的,i也是子类的i。
案例演示
如果将子类B的sum方法给注销掉,输出的a.sum()的值为多少?还是40吗?
由于运行类型为B,所以会先去B类里面去找sum方法,但是没找到,就去B的父类A那里去找。
父类A的sum方法里有一个getI方法 。
但是子类B也有一个getI方法,那么调用的时候调用的是子类的还是父类的呢?
这里就是动态绑定机制
调用对象方法时,该方法与该对象的运行类型绑定,调用对象属性时,哪里声明哪里使用。
由于a的运行类型为B,所以这里调用的为子类B里的getI方法。
所以这里其实是20+10。
子类sum1注销后第二行的结果为多少?还是30吗?
由于子类a的运行类型为B,所以先去B里去找,但B里没有sum1方法,所以再去父类A里去找。
由于属性没有动态绑定机制,这里的i就是父类A中的i,也就是10。
所以这里的结果会变为20。
总结
如果子类中的sum被注释掉的话,调用sum时它会先去子类找,发现没有,就去父类找,父类中有一个geti方法,由于动态绑定,这个方法也会先去子类找,返回方法所在的类,也就是子类的i(值为20)与10相加后返回。
如果子类的sum1也被注释掉,会调用父类的sum1,使用父类中的i,值变为20。