packagecom.xdr630.dynamic_;publicclassDynamicBinding{publicstaticvoidmain(String[] args){// a 的编译类型是 A ,运行类型是 B//属性看编译类型是哪个,方法看运行类型是哪个。A a =newB();System.out.println(a.sum());//40System.out.println(a.sum1());//30}}classA{//父类publicint i =10;publicintsum(){returngetI()+10;}publicintsum1(){return i +10;}publicintgetI(){return i;}}classBextendsA{publicint i =20;publicintsum(){return i +20;}publicintgetI(){return i;}publicintsum1(){return i +10;}}
演示结论1
把上面子类中的 sum() 方法注释掉,main 方法中的 a.sum() 输出什么?
publicclassDynamicBinding{publicstaticvoidmain(String[] args){// a 的编译类型是 A ,运行类型是 BA a =newB();System.out.println(a.sum());//30System.out.println(a.sum1());}}classA{//父类publicint i =10;//动态绑定机制:publicintsum(){returngetI()+10;// 20 + 10}publicintsum1(){return i +10;}publicintgetI(){//父类 getI()return i;}}classBextendsA{//子类publicint i =20;publicintgetI(){// 子类 getI()return i;}publicintsum1(){return i +10;}}
因为a.sum() 方法的运行类型B,根据动态绑定机制,所以找到子类中的 getI() 方法,而在 getI() 中的return i 这个 i 是属性,没有绑定机制,在子类中声明的,直接返回 20 ,然后回到父类中的 sum() 方法 ,20 + 10,所以最后 a.sum 的输出值为 30
演示结论2
把上面子类中的 sum1() 方法注释掉,main 方法中的 a.sum1() 输出什么?
publicclassDynamicBinding{publicstaticvoidmain(String[] args){// a 的编译类型是 A ,运行类型是 BA a =newB();System.out.println(a.sum());//30System.out.println(a.sum1());//20}}classA{//父类publicint i =10;//动态绑定机制:publicintsum(){returngetI()+10;//20 + 10}publicintsum1(){return i +10;}publicintgetI(){//父类 getI()return i;}}classBextendsA{//子类publicint i =20;publicintgetI(){// 子类 getI()return i;}}
代码分析:
a 的运行类型是 B,所以从子类B开始找,而此时 sum1 方法被注释了,只能去找父类A中的 sum1 方法,在 sum1 方法中 return i + 10,而 i 是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i 属性在父类A中声明,所以 i 为10,所以 a.sum1 的输出值为 20