package poly.dynamic;
public class A {
public int i = 10;
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
package poly.dynamic;
public class B extends A {
public int i = 20;
@Override
public int sum() {
return i + 20;
}
@Override
public int getI() {
return i;
}
@Override
public int sum1() {
return i + 10;
}
}
package poly.dynamic;
public class Test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
结果
例240
30
修改B
package poly.dynamic;
public class B extends A {
public int i = 20;
// @Override
// public int sum() {
// return i + 20;
// }
@Override
public int getI() {
return i;
}
@Override
public int sum1() {
return i + 10;
}
}
结果
分析30
30
A a = new B();编译类型是A,运行类型是B。
执行System.out.println(a.sum());时,先去找B中是否有sum()方法,由于修改后的B中将sum()注释掉了,所以从父类A中找该方法。
以下是A类中的sum()方法
public int sum(){
return getI() + 10;
}
此时发现A类和B类都有getI(),所以应该调用哪一个?
根据动态绑定原则,因为getI()是方法,所以调用运行类型的getI();即此时getI()返回的值是20;
所以答案是30
再次修改B,将sum1()方法注释掉
package poly.dynamic;
public class B extends A {
public int i = 20;
// @Override
// public int sum() {
// return i + 20;
// }
@Override
public int getI() {
return i;
}
// @Override
// public int sum1() {
// return i + 10;
// }
}
结果
分析30
20
A a = new B();编译类型是A,运行类型是B。
执行System.out.println(a.sum1());时,先去找B中是否有sum1()方法,由于修改后的B中将sum1()注释掉了,所以从父类A中找该方法。
以下是A类中的sum1()方法
public int sum1(){
return i + 10;
}
当调用对象属性的时候,没有动态绑定机制,哪里声明,哪里使用,使用i = 10;sum1()返回20



