Попытка создать два экземпляра одного и того же типа объекта, но в итоге получим две переменные, ссылающиеся на один и тот же объект. - PullRequest
3 голосов
/ 03 апреля 2020

Я пытался создать игру ti c -ta c -toe в Java, чтобы помочь мне улучшить создание объектно-ориентированных проектов с нуля. Но я столкнулся с проблемой и ищу какое-то руководство.

В настоящий момент я только на полпути к проекту, поэтому я просто дам вам быстрое обновление того, что я сделал до сих пор. .

В настоящее время в проекте в качестве драйвера используется класс Game. Он имеет класс Board, в котором хранится карта между местоположениями на доске (A1, A2, A3 ...) и их значениями ('X', 'O', null). И класс Player, который содержит поля для команды, в которой находится игрок (X или Os), и количество побед (функциональность для победы еще не реализована).

Проблема, с которой я столкнулся, заключается в создании два экземпляра класса Player (player1 и player2) из ​​Game.

Я определил их как поля в Game следующим образом:

public static Player player1 = new Player();
public static Player player2 = new Player();

player1 затем предлагается выбрать между X и Os и player2 дают противоположное.

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

if(player1.getTeam() == 'X')
     player2.setTeam('O');
else
     player2.setTeam('X');

В моей голове это должно работать. Тем не менее, когда я распечатываю выбор игрока, он печатает, какой плеер2 был установлен.

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;
    }

}

1 Ответ

3 голосов
/ 03 апреля 2020

Проблема здесь:

public static Character team;

team is stati c, и это означает, что переменная team не принадлежит ни одному данному экземпляру. Он принадлежит к классу.

Как бы то ни было, всякий раз, когда вы вызываете player1.setTeam или player2.setTeam, изменяется только переменная класса team, а не что-то конкретное c в player1 или player2.

Вам необходимо указать team instance-speci c. Все, что нужно, это удалить ключевое слово static.

private char team;

Вы также заметите, что я сделал это private, так как это рекомендуемая практика (вы уже определили метод получения и установки) для этого, поэтому он не должен быть опубликован c). Другое изменение от Character до char. Вы проводите сравнения, используя == где-то в своем коде (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;
    }
}
...