Tratando de crear dos instancias del mismo tipo de objeto, pero terminan con dos variables referencia al mismo objeto

Ciaran Muir:

He estado tratando de crear un juego de tres en raya en Java para ayudar a mejorar a la creación de proyectos orientados a objetos a partir de cero. Pero tengo encontramos con un problema y estoy buscando alguna orientación.

Estoy a mitad de camino a través del proyecto en el momento, así que sólo voy a dar una rápida actualización de lo que he hecho hasta ahora.

El proyecto cuenta actualmente con una clase de juegos como el conductor. Tiene una clase Junta que almacena un mapa entre las ubicaciones en el tablero (A1, A2, A3 ...) y sus valores ( 'X', 'S', null). Y una clase de jugador que tiene campos para el equipo del jugador está en (X o S) y el número de victorias (funcionalidad para ganar no se ha aplicado todavía).

El problema que estoy teniendo es con la creación de dos instancias de la clase Player (player1 y Player2) de juego.

Yo los he definido como campos en juego, así:

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

Entonces se le pide jugador1 que elegir entre Xs y Os y jugador2 se da lo contrario.

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

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

En mi cabeza esto debería funcionar. Sin embargo, al imprimir a cabo las elecciones del jugador imprime lo jugador2 se ha establecido para ser.

System.out.println("Player 1 you have selected " + player1.getTeam() + "\n");
System.out.println("Player 2 you will be " + player2.getTeam() + "\n");

El contenido de la clase Player se ven a continuación:

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

}
ernest_k:

El problema está aquí:

public static Character team;

teames estática, y eso significa que la variable teamno es de un caso dado. Pertenece a la clase.

Como están las cosas, cada vez que llame player1.setTeamo player2.setTeam, es el de toda la clase de teamla variable que se está cambiando, no es algo específico de player1o para player2.

Es necesario hacer teaminstancia específica. Sólo se necesita para eliminar la staticpalabra clave.

private char team;

También se dará cuenta de que lo hice private, ya que es la práctica recomendada (ya has definido un getter y setter para ello, por lo que no tiene que ser público).
El otro cambio no es de Charactera char. Estás haciendo comparaciones utilizando ==algún lugar de su código ( if(player1.getTeam() == 'X')), utilizando un tipo de referencia puede conducir a resultados inesperados, utilizando el tipo primitivo aquí es el cambio más simple que necesita para hacer.

Su clase terminará pareciéndose

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=397100&siteId=1
Recomendado
Clasificación