Java体彩投注系统对象数组全被最后输入值覆盖问题求助
核心错误原因
你出现投注数据被覆盖的根本原因是错误使用了static修饰成员变量:
static修饰的变量属于类本身,所有该类的实例共享同一块内存存储,只要修改一次,所有对象读到的都是修改后的值- 你的
Bet类里的name、投注数组,Template类里的开奖结果数组都加了static,所以哪怕你new了多个Bet对象,所有对象共用同一个姓名和投注数组,最后一次输入自然会覆盖之前所有记录
各模块修正方案
1. 修正Bet类
首先去掉成员变量的static修饰,补充作业要求的13位投注Vector(你之前写的是6位数组,不符合需求),补全构造方法:
import java.util.Arrays; import java.util.Vector; public class Bet { // 去掉static,改为实例变量,每个Bet对象独有一份 private String name; // 作业要求13位整数Vector存储投注 private Vector<Integer> betVector = new Vector<>(13); // 无参构造 public Bet() {} // 全参构造 public Bet(String name, Vector<Integer> betVector) { this.name = name; this.betVector = betVector; } // getter setter public String getName() { return name; } public void setName(String name) { this.name = name; } public Vector<Integer> getBetVector() { return betVector; } public void setBetVector(Vector<Integer> betVector) { this.betVector = betVector; } @Override public String toString() { return "Bet{" + "姓名='" + name + '\'' + ", 投注内容=" + betVector + '}'; } }
2. 修正ReadBets类(对应你写的V_Bets类)
去掉存储投注列表的static修饰,修正输入逻辑,补全toString:
import java.util.Scanner; import java.util.Vector; public class ReadBets { private Scanner input = new Scanner(System.in); // 作业要求用Vector存储Bet对象,去掉static private Vector<Bet> betList = new Vector<>(); private int size; // 构造方法 public ReadBets() {} // 设置投注总人数 public void setSize(int size) { this.size = size; } // 读取所有投注数据 public void readAllBets() { for (int j = 0; j < size; j++) { Bet currentBet = new Bet(); System.out.println("请输入第" + (j+1) + "位玩家的姓名:"); currentBet.setName(input.next()); System.out.println("请输入13场比赛的投注结果(1=A队胜,2=B队胜,0=平局):"); Vector<Integer> currentBets = new Vector<>(13); for (int i = 0; i < 13; i++) { System.out.println("第" + (i+1) + "场比赛投注:"); int num = input.nextInt(); // 输入校验 while (num <0 || num >2) { System.err.println("输入非法,请输入0/1/2:"); num = input.nextInt(); } currentBets.add(num); } currentBet.setBetVector(currentBets); betList.add(currentBet); } } public Vector<Bet> getBetList() { return betList; } @Override public String toString() { return "所有投注数据:\n" + betList; } }
3. 修正Template和ReadTemplate类
去掉static修饰,改用Vector存储开奖结果:
import java.util.Vector; public class Template { // 去掉static,改为实例变量 private Vector<Integer> resultVector = new Vector<>(13); public Template() {} public Vector<Integer> getResultVector() { return resultVector; } public void setResultVector(Vector<Integer> resultVector) { this.resultVector = resultVector; } @Override public String toString() { return "开奖结果:" + resultVector; } }
import java.util.Scanner; import java.util.Vector; public class ReadTemplate { private Scanner input = new Scanner(System.in); private Template template = new Template(); public ReadTemplate() {} // 读取开奖结果 public Template readResult() { Vector<Integer> result = new Vector<>(13); System.out.println("\n请输入13场比赛的开奖结果(1=A队胜,2=B队胜,0=平局):"); for (int i = 0; i < 13; i++) { System.out.println("第" + (i+1) + "场比赛结果:"); int num = input.nextInt(); while (num <0 || num >2) { System.err.println("输入非法,请输入0/1/2:"); num = input.nextInt(); } result.add(num); } template.setResultVector(result); System.out.println(template); return template; } }
4. 修正GenerateResult类
修正比对逻辑,需要传入已经读取好的投注列表和开奖结果,不要新建空对象:
import java.util.Vector; public class GenerateResult { // 投注列表和开奖结果通过参数传入,不要新建空对象 public void checkResult(Vector<Bet> betList, Template template) { Vector<Integer> result = template.getResultVector(); for (Bet bet : betList) { int hitCount = 0; Vector<Integer> userBet = bet.getBetVector(); // 对应位置比对命中数 for (int i = 0; i < 13; i++) { if (userBet.get(i).equals(result.get(i))) { hitCount++; } } System.out.println("\n玩家姓名:" + bet.getName()); System.out.println("投注内容:" + userBet); System.out.println("命中场数:" + hitCount); // 作业要求命中6个输出中奖 if (hitCount >=6) { System.out.println("WINNER, CONGRATULATIONS"); } else { System.out.println("Try again, this time you didn't win"); } } } }
5. 修正Main类
调整执行流程,传递实例参数:
import java.util.Scanner; public class Main { static Scanner input = new Scanner(System.in); public static void main(String[] args) { // 读取投注 ReadBets readBets = new ReadBets(); System.out.println("请输入投注总人数:"); int size = input.nextInt(); readBets.setSize(size); readBets.readAllBets(); System.out.println(readBets); // 读取开奖结果 ReadTemplate readTemplate = new ReadTemplate(); Template template = readTemplate.readResult(); // 比对结果 GenerateResult generateResult = new GenerateResult(); generateResult.checkResult(readBets.getBetList(), template); } }
其他注意事项
- 你之前的比对逻辑写反了顺序,应该是同一场次的投注和开奖结果比对,不是交叉比对
- 不要随便用static修饰需要每个实例独有的成员变量,只有所有对象共享的常量/工具方法才适合加static
- 变量名统一用英文驼峰命名,不要混用中英文、拼写错误,避免运行报错
内容的提问来源于stack exchange,提问作者Lekost93
相关产品推荐
相关产品推荐

