Java 尝试创建同一对象类型的两个实例,但最终导致两个变量引用同一对象

Java 尝试创建同一对象类型的两个实例,但最终导致两个变量引用同一对象,java,object,definition,Java,Object,Definition,我一直在尝试用Java创建一个tic-tac-toe游戏,以帮助我从零开始提高创建面向对象项目的能力。但我遇到了一个问题,正在寻求一些指导 我现在只完成了项目的一半,所以我会给你一个关于我到目前为止所做工作的快速更新 该项目目前有一个游戏类作为驱动程序。它有一个Board类,用于存储板上位置(A1、A2、A3…)及其值('X'、'O'、null)之间的映射。和一个玩家类,该类保存玩家所在团队的字段(Xs或Os)和获胜次数(获胜功能尚未实现) 我遇到的问题是从游戏中创建两个Player类实例(pl

我一直在尝试用Java创建一个tic-tac-toe游戏,以帮助我从零开始提高创建面向对象项目的能力。但我遇到了一个问题,正在寻求一些指导

我现在只完成了项目的一半,所以我会给你一个关于我到目前为止所做工作的快速更新

该项目目前有一个游戏类作为驱动程序。它有一个Board类,用于存储板上位置(A1、A2、A3…)及其值('X'、'O'、null)之间的映射。和一个玩家类,该类保存玩家所在团队的字段(Xs或Os)和获胜次数(获胜功能尚未实现)

我遇到的问题是从游戏中创建两个Player类实例(player1和player2)

我将它们定义为游戏中的字段,如下所示:

public static Player player1 = new Player();
public static Player player2 = new Player();
然后要求player1在Xs和Os之间进行选择,而player2的选择正好相反

player1.setTeam(Character.toUpperCase(teamChoice));

if(player1.getTeam() == 'X')
     player2.setTeam('O');
else
     player2.setTeam('X');
在我看来,这应该行得通。然而,当我打印出玩家选择时,它会打印出player2设置为的任何内容

System.out.println("Player 1 you have selected " + player1.getTeam() + "\n");
System.out.println("Player 2 you will be " + player2.getTeam() + "\n");
Player类的内容如下所示:

public class Player {
    public static int wins = 0;
    public static Character team;

    public Player(){
    }

    public int getWins(){return wins;}

    public Character getTeam(){return team;}

    public void setTeam(Character team){
        Player.team = team;
    }

}
问题在于:

public static Character team;
team
是静态的,这意味着变量
team
不属于任何给定实例。它属于这个班

事实上,无论何时调用
player1.setTeam
player2.setTeam
,都是类范围内的
team
变量在改变,而不是特定于
player1
player2
的变量

您需要使
团队
特定于实例。只需删除
static
关键字即可

private char team;
您还会注意到,我将它设置为私有的,因为这是推荐的做法(您已经为它定义了getter和setter,所以它不需要是公共的)。
另一个变化是从
字符
字符
。您正在使用代码中的某个地方进行比较(
if(player1.getTeam()=='X')
),使用引用类型可能会导致意外的结果,在这里使用原语类型是您需要进行的最简单的更改

你的班级最终会变成这样

public class Player {
    private int wins = 0;
    private char team;

    public Player() {
    }

    public int getWins() {
        return wins;
    }

    public char getTeam() {
        return team;
    }

    public void setTeam(char team) {
        this.team = team;
    }
}

这似乎已经解决了问题。非常感谢!:)