【问题标题】:Methods in subclass aren't working子类中的方法不起作用
【发布时间】:2017-11-03 21:46:36
【问题描述】:

我有一个任务是创建一个添加到现有超类的子类,这是由具有 main 方法的第三个类运行的,该方法创建子类的对象并调用适当的方法。

我的问题是调用超类中的方法可以正常工作,但是调用我在子类中编写的另外两个方法却被忽略了。

我已经检查过了,主方法正在进入调用子类中新方法的 if 语句,但是这个方法没有执行。

具体来说,超类是一个内存计算器,具有基本的加、减、除和乘选项,以及清除当前值的选项。 子类是一个科学内存计算器,它覆盖了超类中的 menu 方法以包含幂和对数选项,并且具有两者的方法。

当我选择功率选项时,它只是返回当前值,而不是将该功率提高到指定的数字。

超类:

import java.util.Scanner;

public class MemoryCalc {
    private double currentValue = 0;
    public static int displayMenu() {
        Scanner input = new Scanner(System.in);
        System.out.print("Menu\n1. Add\n2. Subtract\n3. Multiply\n4. Divide\n5. Clear\n6. Quit\nWhat would you like to do? ");
        int menuChoice = input.nextInt();
        while (menuChoice < 1 || menuChoice > 6) {
            System.out.print("Please enter a valid option.\n\n");
            System.out.print("Menu\n1. Add\n2. Subtract\n3. Multiply\n4. Divide\n5. Clear\n6. Quit\nWhat would you like to do? ");
            menuChoice = input.nextInt();
        }
        return menuChoice;  
    }
    public static double getOperand(String prompt) {
        Scanner input = new Scanner(System.in);
        System.out.print(prompt);
        double operand = input.nextDouble();
        return operand;
    }
    public double getCurrentValue() {
        return currentValue;
    }
    public void add(double operand2) {
        currentValue = currentValue + operand2;
    }
    public void subtract(double operand2) {
        currentValue = currentValue - operand2;
    }
    public void multiply(double operand2) {
        currentValue = currentValue * operand2;
    }
    public void divide(double operand2) {
        if (operand2 == 0) {
            currentValue = Double.NaN;
        }
        else currentValue = currentValue / operand2;

    }
    public void clear() {
        currentValue = 0;
    }
}

子类:

import java.util.Scanner;

public final class ScientificMemCalc extends MemoryCalc {
    private double currentValue = 0;
    public static int displayMenu() {
        Scanner input = new Scanner(System.in);
        int menuChoice = -1;

        while (menuChoice < 1 || menuChoice > 8) {

            System.out.println();
            System.out.println("Menu");
            System.out.println("1. Add");
            System.out.println("2. Subtract");
            System.out.println("3. Multiply");
            System.out.println("4. Divide");
            System.out.println("5. Power");
            System.out.println("6. Logarithm");
            System.out.println("7. Clear");
            System.out.println("8. Quit");
            System.out.println();
            System.out.print("What would you like to do? ");

            menuChoice = input.nextInt();

            if (menuChoice < 1 || menuChoice > 8) {
                System.out.println(menuChoice + " wasn't one of the options");
            }
        }

        return menuChoice;
    }
    public void power(double operand2) {
        currentValue = Math.pow(currentValue, operand2);
    }
    public void logarithm() {
        currentValue = Math.log(currentValue);
    }
}

主要方法:

public class ScientificCalcDriver {
    public static void main(String[] args) {
        ScientificMemCalc calculator1 = new ScientificMemCalc();
        int menuChoice = 0;
        while (menuChoice != 8) {
            System.out.print("The current value is " + calculator1.getCurrentValue() + "\n");
            menuChoice = ScientificMemCalc.displayMenu();
            if (menuChoice < 6) {
                double Operand2 = ScientificMemCalc.getOperand("What is the second number? ");

                if (menuChoice == 1) {
                    calculator1.add(Operand2);
                }
                if (menuChoice == 2) {
                    calculator1.subtract(Operand2);
                }
                if (menuChoice == 3) {
                    calculator1.multiply(Operand2);
                }
                if (menuChoice == 4) {
                    calculator1.divide(Operand2);
                }
                if (menuChoice == 5) {
                    calculator1.power(Operand2);
                }
            }
            else if (menuChoice == 6) {
                calculator1.logarithm();
            }
            else if (menuChoice == 7) {
                calculator1.clear();
            }
            else if (menuChoice == 8) {
                System.out.print("Goodbye!");
                System.exit(0);
            }
        }
    }
}

【问题讨论】:

  • 加上相关代码,事情会更简单。
  • 会做,就是怕帖子太长。
  • 我们不需要all您的代码,只需要相关部分。理想情况下是minimal reproducible example
  • 如果这太过分了,我深表歉意。总的来说,我对 Java 和编程还是很陌生,所以我不完全确定什么是相关的。

标签: java inheritance


【解决方案1】:

你有两个不同的currentValue 变量,都是私有的,一个在超类中,一个在子类中。您的超类中的方法正在更改其变量的值,而子类的方法正在更改 its 变量的值。

在超类中设置currentValueprotected,并从子类中删除。

更新:

基于“必须是私有的”注释:您仍然需要删除子类中额外的currentValue 变量,但正如 Oleg 指出的那样,您可以使用 get 获取和更新超类中私有变量的值并设置超类中定义的方法。

【讨论】:

  • 非常感谢!现在完美运行。我想我需要再读一遍这一章,因为我似乎错过了这一章。
  • @SteveStillwell 不要忘记您可以accept the answer 将其标记为解决您问题的问题
  • 谢谢,我终于找到了那个按钮。我更改了问题的标题以更准确地描述问题。
  • 在检查分配标准时我遇到了一个问题。讲师指定超类中的 currentValue 字段必须是私有的。这意味着子类中添加的方法将不起作用。如果它在超类中是私有的,我如何在子类中获取该 currentValue?
  • 啊,我想我明白了。在幂和对数的方法中,我只使用了 setCurrentValue(Math.pow(getCurrentValue(),operand2));
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多