14

在探索 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。我不明白这是怎么发生的。

4

2 回答 2

19

obj是类型的引用,Item因此第一个 20,因为costfield of 的Item值为 20。第二个值是10因为 is 的运行时类型,obj因此Bolt调用getCost()getCostBolt因为Boltextends Item)。

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

于 2011-08-02T07:05:38.030 回答
7

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

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

结论:

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

于 2011-08-02T07:08:27.140 回答