- 当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定;
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用;
父类
public class C {
public int i =10;
public int getI() {
return i;
}
public int sum(){
return getI()+10;
}
public int sum1(){
return i+10;
}
}
子类
public class D extends C{
public int i =20;
public int getI() {
return i;
}
public int sum(){
return getI()+20;
}
public int sum1(){
return i+10;
}
}
调用类
public class T {
public static void main(String[] args) {
C d = new D();//父类指向子类
System.out.println(d.sum());
System.out.println(d.sum1());
}
}
输出结果:
40
30
在子类中把sum方法注释,运行调用类;
因为子类中没有sum方法,就继续向父类中查找sum方法,sum方法中是return getI()+10;
getI()方法在子类和父类中都有,所以先去子类中查找,返回i=20,再加上10;
d.sum()返回结果应该是30;
在子类中把sum1方法注释,运行调用类;
因为子类中没有sum1方法,所以去父类中查找,父类的sum1方法返回的是return i+10;
属性没有动态绑定机制,哪里声明就在哪里使用,所以i=10,加上10,结果=20;
d.sum1()返回结果是20;