You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:09:03