san*_*til 14 java inheritance scjp
在探索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;
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试两次访问成本的价值
public class Test {
public static void main(String[] args) {
Item obj = new Bolt();
System.out.println(obj.cost);
System.out.println(obj.getCost());
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是20 10.我无法理解这是怎么发生的.
San*_*rma 19
obj是类型的引用Item自的值,因此该第一20 cost的字段Item20.第二个值是10因为运行时类型obj是Bolt,因此getCost()调用getCost的Bolt类(因为Bolt延伸Item).
简而言之,运行时多态性仅适用于实例成员(方法重写)而不适用于实例字段.
类字段不参与多态性游戏.方法呢.
因此,当您访问该字段时,您将转到基类中定义的字段,因为对象的类型是Item.当您调用方法时,您将获得实际值,因为您使用多态来调用方法.
结论:
字段始终是私有的.如果要访问字段写入方法.
| 归档时间: |
|
| 查看次数: |
341 次 |
| 最近记录: |