繁体   English   中英

子类中的方法不起作用

[英]Methods in subclass aren't working

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

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

我已经检查过了,主要方法是进入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);
            }
        }
    }
}

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

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

更新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM