Java继承问题

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因为运行时类型objBolt,因此getCost()调用getCostBolt类(因为Bolt延伸Item).

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


Ale*_*exR 7

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

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

结论:

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