Java继承问题

时间:2011-08-02 07:02:16

标签: 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;
    }
}

并尝试访问两次费用的价值

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。 我无法理解这是怎么发生的。

2 个答案:

答案 0 :(得分:19)

objItem类型的引用,因此cost的{​​{1}}字段值为20后的前20位。第二个值为Item因为10的运行时类型为obj,因此Bolt调用getCost()类的getCost(因为Bolt扩展Bolt

简而言之,运行时多态性仅适用于实例成员(方法重写)而不适用于实例字段。

答案 1 :(得分:7)

类字段不参与多态游戏。方法呢。

因此,当您访问该字段时,您将转到基类中定义的字段,因为对象的类型为Item。当您调用方法时,您将获得实际值,因为您使用多态来调用方法。

结论:

字段始终是私有的。如果要访问字段写入方法。