子类中的方法不起作用

时间:2017-11-03 21:46:36

标签: java inheritance

我有一个赋值是创建一个子类,它继承现有的超类,这是由第三个类运行的,带有一个main方法,它创建子类的对象并调用适当的方法。

我的问题是调用超类中的方法是正确的,但调用我在子类中编写的另外两个方法会被忽略。

我已经检查过了,主方法IS到了if语句,它在子类中调用了new方法,但是这个方法没有执行。

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

当我选择电源选项时,它只是返回当前值而不是将电源提升到指定的数字。

超类:

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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

在超类中保护currentValue,并将其从子类中删除。

更新

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