Java如何通过数组/ArrayList将用户输入变量传递给其他类方法
问题原因
- 你创建
Addition/Subtraction等子类实例的时机过早:初始化运算类数组时你传入的是num1=0、num2=0的初始值,Java基本数据类型是值传递,此时子类实例的成员变量已经被固定为初始值,后续修改主方法里的num1、num2变量不会同步更新到已经实例化的子类对象中。 - 你调用
calculate()方法时没有把新输入的数值传递给对应实例,方法只能读取到实例化时传入的初始值0。 - 补充:你现有代码的while循环中没有更新
operation变量的逻辑,会出现无限循环的问题,需要补充对应逻辑。
修复方案
方案1:最小改动适配现有代码结构
在获取到用户输入的num1、num2之后、调用calculate()之前,给选中的运算实例的成员变量重新赋值即可,修改后的switch分支和循环收尾逻辑如下:
switch (operation) { case '+': allMath[0].num1 = num1; allMath[0].num2 = num2; allMath[0].calculate(); break; case '-': allMath[1].num1 = num1; allMath[1].num2 = num2; allMath[1].calculate(); break; case '*': allMath[2].num1 = num1; allMath[2].num2 = num2; allMath[2].calculate(); break; case '/': allMath[3].num1 = num1; allMath[3].num2 = num2; allMath[3].calculate(); break; default: System.out.println("输入的运算符不合法,请重新输入"); } // 补充下一轮运算符输入逻辑,避免死循环 System.out.println("请输入下一次要执行的运算符,输入!退出程序:"); operation = input.next().charAt(0);
方案2:优化方法定义(符合抽象类要求可选用)
如果允许修改抽象父类的方法定义,可以把calculate抽象方法改为接收两个double参数的形式,子类实现时直接用传入的参数计算,不需要在实例中存储冗余的数值变量:
- 抽象父类方法定义:
public abstract void calculate(double num1, double num2);
- Addition子类实现示例:
@Override public void calculate(double num1, double num2) { System.out.println(num1 + " + " + num2 + " is " + (num1 + num2)); }
- 调用时直接传输入的数值即可,不需要单独给实例成员变量赋值:
case '+': allMath[0].calculate(num1, num2); break;
内容的提问来源于stack exchange,提问作者Koryn Pascoe
相关产品推荐
相关产品推荐

