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