在探索scjp问题时,我遇到了这种我觉得很奇怪的行为。
我已经声明了两个类Item和Bolt如下:
class Item {
int cost = 20;
public int getCost() {
return cost;
}
}
class Bolt extends Item {
int cost = 10;
public int getCost() {
return cost;
}
}
并尝试访问两次费用的价值
public class Test {
public static void main(String[] args) {
Item obj = new Bolt();
System.out.println(obj.cost);
System.out.println(obj.getCost());
}
}
我得到的输出是20 10。 我无法理解这是怎么发生的。
答案 0 :(得分:19)
obj
是Item
类型的引用,因此cost
的{{1}}字段值为20后的前20位。第二个值为Item
因为10
的运行时类型为obj
,因此Bolt
调用getCost()
类的getCost
(因为Bolt
扩展Bolt
)
简而言之,运行时多态性仅适用于实例成员(方法重写)而不适用于实例字段。
答案 1 :(得分:7)
类字段不参与多态游戏。方法呢。
因此,当您访问该字段时,您将转到基类中定义的字段,因为对象的类型为Item
。当您调用方法时,您将获得实际值,因为您使用多态来调用方法。
结论:
字段始终是私有的。如果要访问字段写入方法。