Java继承问题

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

并尝试两次访问 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。 我不明白这是怎么发生的。

最佳答案

objItem 类型的引用,因此自 Itemcost 字段值以来的前 20 个是 20。第二个值是 10 因为 obj 的运行时类型是 Bolt 因此 getCost() 调用Bolt 类的 getCost(因为 Bolt 扩展 Item)。

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

关于Java继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908360/

相关文章:

java - 如何获取从 fragment 到某个类的微调器项目位置?

c# - 通过继承使用 IDisposable

objective-c - Objective C - 类别和继承 - 将方法添加到基类并将覆盖添加到派生类

java合法标识符

java - 在 Spring 配置文件中定义变量以访问包含图像的外部文件夹

java - 分割字符

c++ - 如何将初始化列表与基类一起使用?

Java 泛型方法/参数类型

java - 多维数组声明

java - 有没有办法将字母形式的数字字符串数组转换为数字形式?