Java获取父类(super class)方法在子类调用时使用子类实例方法

标签 java oop inheritance

我试图让父类(super class)方法在子类调用时在子类方法/字段上运行。例如

public class CoffeeMachine() {
    protected int cost = 3;

    protected int getCost() {
        return cost;
    }
}

public class FancyCoffeeMachine() extends CoffeeMachine{
    protected int cost = 6;
}

main{
    FancyCoffeeMachine expensive = new FancyCoffeeMachine();
    System.out.println(expensive.getCost());
}

我希望打印 6,但它却打印 3。我想让它尽可能干燥,所以我试图避免创建第二个 getCost() 方法。有什么办法可以做到这一点吗?当子类调用时,如何获得父类(super class)方法来使用子类变量?方法也会发生同样的事情:如果我有

public class makeCoffee() {
    System.out.println("Coffee cost " + this.getCost());
}

即使我在 FancyCoffeeMachine 上调用 makeCoffee,输出也将是“咖啡成本 3”。为什么是这样?我该如何修复它?或者有没有更好的方法来实现这个对象结构,完全避免这个错误?

最佳答案

链接字段不像虚拟方法调用那样使用动态调度。您的字段 FancyCoffeeMachine.cost 只是隐藏字段 CoffeeMachine.cost

要实现您想要的目标(即 FancyCoffeeMachine 具有更高的成本),您只需在 FancyCoffeeMachine 中的初始化程序 block 或构造函数内为 CoffeeMachine.cost 字段设置一个新值即可>.

public class CoffeeMachine {
    protected int cost = 3;

    protected int getCost() {
        return cost;
    }
}
public class FancyCoffeeMachine extends CoffeeMachine{
    {cost = 6;} // <- sets CoffeeMachine.cost
}

关于Java获取父类(super class)方法在子类调用时使用子类实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736832/

相关文章:

macos - 无法在 Mac OS X (Mountain Lion 10.8.4) 上卸载 Java 7 JDK

java - Eclipse 插件从当前打开的文件中获取代码

c++ - 运算符重载时的继承和 "invalid covariant return type"错误

java - 使用 hibernate 进行多个子插入的父表

c++ - 为什么这个 C++ 继承代码示例的行为是这样的

用于查找二叉树中最大独立节点集的 Java 算法

java - 无法识别的选项 : -o Could not create the Java virtual machine

javascript - 如何使用 OO JavaScript 管理 GUI 交互?

ruby - 这些方法命名方法中哪种更好,为什么?

python - __new__ 在对象创建中没有被调用