java - 尝试创建相同对象类型的两个实例,但最终得到两个引用同一对象的变量

标签 java object definition

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

目前该项目只完成了一半,因此我将向您快速介绍一下我迄今为止所做的工作。

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

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

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

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");

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.setTeamplayer2.setTeam 时,都会更改类范围的 team 变量,而不是特定于 player1player2 的内容。

您需要使团队特定于实例。所需要做的就是删除 static 关键字。

private char team;

您还会注意到我将其设置为私有(private),因为这是推荐的做法(您已经为其定义了 getter 和 setter,因此不需要公开)。
另一个变化是从 Characterchar。您在代码中的某处使用 == 进行比较 (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;
    }
}

关于java - 尝试创建相同对象类型的两个实例,但最终得到两个引用同一对象的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61003665/

相关文章:

java - 由于线程处于 WAITING 和 TIMED_WAITING 状态,请求处于挂起状态

java - jOOQ 与 java 15 : both interface org. jooq.Record 在 org.jooq 和类 java.lang.Record 在 java.lang 匹配

java - JPA 标准 API : Aggregating on Multiple Columns with IF Condition

具有可变属性的Javascript对象: Is it possible?

c++ - 不确定 Typedef 和类的位置

java - 多模式使用的副作用

javascript - 如何使用在其键中有空间的对象解构数组?

javascript - new 关键字如何强制 this 关键字指向 JavaScript 中新创建的对象?

Spring - 使用静态最终字段(常量)进行 bean 初始化

c++ - "only one implementation"规则的异常(exception)?