动态绑定机制
例题如下:
class M{ int i = 10; public int sum(){ return getI()+10; } public int sum1(){ return i+10; } public int getI(){ return i; } } class N extends M{ int i = 20; public int getI(){ return i; } public int sum(){ return i+20; } public int sum1(){ return i+10; } }
M m = new N();
System.out.println(m.sum());//输出结果为40,
System.out.println(m.sum1());//输出结果为30
当调用方法时,方法会和该对象的内存地址即运行类型进行绑定,当调用属性时则没有动态绑定,那里声明,哪里使用。
具体为:当注销N类的sum与sum1方法时:
m调用sum方法,因为m的运行类型为N,所以先去N中找sum方法,N中没有则去到父类M中调用M的sum方法,M的sum方法内返回了一个getId方法,此时M,N中均有该方法,但因存在动态绑定,所以返回的N中的
getId方法,N的getId方法中返回的i为N中的i,所以输出结果为20+10=30
m调用sum1方法,因为m的运行类型为N,所以先去N中找sum1方法,N中没有则去到父类M中调用M的sum1方法,此时sum1方法内返回的i为M中的i,所以输出结果为:10+10=20
浙公网安备 33010602011771号