在探索 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;
}
}
并尝试两次访问 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。 我不明白这是怎么发生的。
最佳答案
obj
是 Item
类型的引用,因此自 Item
的 cost
字段值以来的前 20 个是 20。第二个值是 10
因为 obj
的运行时类型是 Bolt
因此 getCost()
调用Bolt
类的 getCost
(因为 Bolt
扩展 Item
)。
简而言之,运行时多态性只适用于实例成员(方法覆盖),而不适用于实例字段。
关于Java继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908360/