尝试创建相同对象类型的两个实例,但最终得到两个引用相同对象的变量
Trying to create two instances of the same object type but end up with two variables referencing the same object
我一直在尝试在 Java 中创建一个井字游戏,以帮助我改进从头开始创建面向对象的项目。但是我 运行 遇到了问题,正在寻找一些指导。
目前我的项目只完成了一半,所以我将向您简要介绍一下我到目前为止所做的工作。
该项目目前有一个游戏 class 作为驱动程序。它有一个 Board class,用于存储板上位置(A1、A2、A3...)及其值('X'、'O'、null)之间的映射。还有一个玩家class,它保存玩家所在团队的字段(Xs 或Os)和获胜次数(获胜功能尚未实现)。
我遇到的问题是从游戏中创建玩家 class(玩家 1 和玩家 2)的两个实例。
我将它们定义为游戏中的字段,如下所示:
public static Player player1 = new Player();
public static Player player2 = new Player();
玩家 1 然后被要求在 Xs 和 Os 之间做出选择,而玩家 2 则给出相反的选择。
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");
播放器class的内容如下:
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
不属于任何给定的实例。它属于class.
实际上,每当您调用 player1.setTeam
或 player2.setTeam
时,都会更改 class 范围内的 team
变量,而不是特定于 player1
或到 player2
.
您需要使 team
特定于实例。只需删除 static
关键字即可。
private char team;
你也会注意到我把它做到了 private
,因为这是推荐的做法(你已经为它定义了 getter 和 setter,所以它需要不是 public)。
另一个变化是从 Character
到 char
。您在代码 (if(player1.getTeam() == 'X')
) 的某处使用 ==
进行比较,使用引用类型可能会导致意外结果,此处使用原始类型是您需要进行的最简单的更改。
你的 class 最终看起来像
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;
}
}
我一直在尝试在 Java 中创建一个井字游戏,以帮助我改进从头开始创建面向对象的项目。但是我 运行 遇到了问题,正在寻找一些指导。
目前我的项目只完成了一半,所以我将向您简要介绍一下我到目前为止所做的工作。
该项目目前有一个游戏 class 作为驱动程序。它有一个 Board class,用于存储板上位置(A1、A2、A3...)及其值('X'、'O'、null)之间的映射。还有一个玩家class,它保存玩家所在团队的字段(Xs 或Os)和获胜次数(获胜功能尚未实现)。
我遇到的问题是从游戏中创建玩家 class(玩家 1 和玩家 2)的两个实例。
我将它们定义为游戏中的字段,如下所示:
public static Player player1 = new Player();
public static Player player2 = new Player();
玩家 1 然后被要求在 Xs 和 Os 之间做出选择,而玩家 2 则给出相反的选择。
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");
播放器class的内容如下:
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
不属于任何给定的实例。它属于class.
实际上,每当您调用 player1.setTeam
或 player2.setTeam
时,都会更改 class 范围内的 team
变量,而不是特定于 player1
或到 player2
.
您需要使 team
特定于实例。只需删除 static
关键字即可。
private char team;
你也会注意到我把它做到了 private
,因为这是推荐的做法(你已经为它定义了 getter 和 setter,所以它需要不是 public)。
另一个变化是从 Character
到 char
。您在代码 (if(player1.getTeam() == 'X')
) 的某处使用 ==
进行比较,使用引用类型可能会导致意外结果,此处使用原始类型是您需要进行的最简单的更改。
你的 class 最终看起来像
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;
}
}