如何在Java中将一个类的数组值传递到另一个类并计算订单总价
如何将主类数组数据传递到另一个类进行价格计算
我来帮你理清楚怎么实现这个需求,你的核心问题是主类里的局部变量无法被另一个类直接访问,而且原methOds类的构造函数逻辑有问题(没有循环、未定义变量i)。下面是具体的解决方案:
问题分析
你主类里的priceList、foodChoice、quantOrder还有订单数量qntty都是main方法的局部变量,默认只能在main方法内部使用。原methOds类的构造函数直接尝试调用这些变量会编译报错,而且缺少遍历订单项的循环逻辑,无法计算所有订单的总价。
解决方案步骤
我们需要通过参数传递把主类的数据传给methOds类,同时修正methOds类的计算逻辑:
1. 改造methOds类
修改类的构造函数,让它接收所需的所有数据,然后在构造函数里完成价格计算。同时添加getter方法来获取计算结果(遵循封装原则):
public class Methods { // 注意类名首字母大写,符合Java规范 private double[] pricePerItem; // 存储每个订单项的价格 private double totalPrice; // 构造方法:接收主类传递过来的所有数据 public Methods(double[] priceList, int[] foodChoice, int[] quantOrder, int orderCount) { pricePerItem = new double[orderCount + 1]; // 和主类的索引保持一致(从1开始) totalPrice = 0.0; // 遍历每个订单项计算价格 for (int i = 1; i <= orderCount; i++) { // 先校验菜品选择是否合法,避免数组越界 if (foodChoice[i] >= 1 && foodChoice[i] < priceList.length) { pricePerItem[i] = priceList[foodChoice[i]] * quantOrder[i]; totalPrice += pricePerItem[i]; } else { // 处理无效选择的情况 pricePerItem[i] = 0.0; System.out.println("警告:第" + i + "项的菜品选择无效!"); } } } // 获取总价的方法 public double getTotalPrice() { return totalPrice; } // 可选:获取单个订单项的价格 public double getPricePerItem(int index) { if (index >= 1 && index < pricePerItem.length) { return pricePerItem[index]; } return 0.0; } }
2. 修改主类的main方法
在收集完所有订单数据后,创建Methods类的实例,把需要的数据传递进去,然后通过getter方法获取计算结果:
import java.util.Scanner; public class MainClass { // 主类名建议清晰命名 public static void main(String[] args) { String menu[] = {"", "Hotsilog", "Porksilog", "Bangsilog", "Tapsilog", "Chicksilog"}; double priceList[] = {0, 20.00, 20.00, 20.00, 20.00, 20.00}; int quantOrder[] = new int[100]; int foodChoice[] = new int[100]; int qntty = 0; Scanner scan = new Scanner(System.in); // 打印菜单 System.out.printf(" %3s%14s\n", "Menu", "Price"); for (int i = 1; i <= 5; i++) { System.out.printf("[%d] %-15s%.2f\n", i, menu[i], priceList[i]); } // 输入订单数量 System.out.print("How many items do you want to order? "); qntty = scan.nextInt(); // 收集每个订单的选择和数量 for (int i = 1; i <= qntty; i++) { System.out.println("Enter the number of your choice: "); foodChoice[i] = scan.nextInt(); // 提前校验输入的合法性 if (foodChoice[i] < 1 || foodChoice[i] > 5) { System.out.println("Invalid choice! Please enter a number between 1 and 5."); i--; // 让用户重新输入当前项 continue; } System.out.println("You choose " + menu[foodChoice[i]] + "!"); System.out.print("Quantity of order :"); quantOrder[i] = scan.nextInt(); } // 关键:创建Methods实例,传递所有数据 Methods priceCalculator = new Methods(priceList, foodChoice, quantOrder, qntty); // 输出计算结果 System.out.printf("\nTotal Price: %.2f\n", priceCalculator.getTotalPrice()); // 可选:输出每个订单项的价格 for (int i = 1; i <= qntty; i++) { System.out.printf("Item %d (%s): %.2f\n", i, menu[foodChoice[i]], priceCalculator.getPricePerItem(i)); } scan.close(); } }
3. 可选方案:使用静态方法
如果不需要保存每个订单项的价格,只需要计算总价,可以用静态方法简化逻辑,不需要创建类实例:
在Methods类里添加静态方法:
public static double calculateTotal(double[] priceList, int[] foodChoice, int[] quantOrder, int orderCount) { double total = 0.0; for (int i = 1; i <= orderCount; i++) { if (foodChoice[i] >= 1 && foodChoice[i] < priceList.length) { total += priceList[foodChoice[i]] * quantOrder[i]; } } return total; }
然后在主类里直接调用:
double totalPrice = Methods.calculateTotal(priceList, foodChoice, quantOrder, qntty); System.out.printf("Total Price: %.2f\n", totalPrice);
关键要点总结
- 数据传递:通过方法参数(构造方法或普通方法)把主类的局部变量传递给另一个类,这是Java中跨类传递数据的常用方式。
- 逻辑修正:必须遍历所有订单项才能计算总价,原代码缺少循环逻辑会报错。
- 合法性校验:添加输入校验可以避免数组越界异常,提升程序稳定性。
- 代码规范:类名首字母大写,变量名用驼峰式,遵循Java编码规范,让代码更易读。
内容的提问来源于stack exchange,提问作者helloWorld
相关产品推荐
相关产品推荐

