多态只适用于方法,而不适用于域。
例子来至于 thinking in java:
父对象:
public class Super {
public int field = 0;
public int getField(){
return field;
}
}
子对象:
public class Sub extends Super {
public int field = 1;
public int getField(){
return field;
}
public int getSuperField(){
return super.field;
}
}
调用:
Super sup = new Sub();
断点: System.out.println("sup.field:" + sup.field + " sup.getField():" + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field:" + sub.field + " sub.getField():" + sub.getField() + " sub.getSuperField():" + sub.getSuperField());
结果:
sup.field:0 sup.getField():1
sub.field:1 sub.getField():1 sub.getSuperField():0
奇异的结果:为什么sup.field为0??
进入调试状态:检测sup对象(eclipse):
从检测结果可以看出:sup对象(Sub)有两个名为field的域(一个从super继承过来,一个是自己定义的)。
但是 ,当Sub对象转型为Super(Upcast)引用时,域访问操作都是由编译器解析,因此不是多态 。所以
sup.field:0