Что происходит со ссылкой на объект?

Мое намерение состояло в том, чтобы создавать один JForm в котором игрении кота, всякий раз когда было заработано сохранять этот JForm в списке, в конце некоего числа игр, заработанных (4 в этом коде) показывать окна, которые он сохраняет в списке, где он оценивается, как была заработана игра, и если он пошел с X ó O.

Проблема что, если он делает то, что я хочу, но мне не удается понять, что оно происходит внутри в объекте и ссылке на этот. В методе checkForWin() я перемещаю его в список ссылку на объект посредством this и функционируй правильно, в отличие от, когда вместо this я перемещаю его ссылку в otro.

else {
        TicTacCollection.gatos.add(otro);

otro это объект того же класса instanciado внутри этой в методе setMarca() поскольку видят в следующем коде.

public class Индикаторное табло extends javax.swing. JFrame {

public JButton[][] board;
private char currentPlayerMark;
Tablero otro;

public Tablero() {

    board = new JButton[3][3];
    currentPlayerMark = 'X';
    initComponents();
    initializeBoard();
    setLocationRelativeTo(null);
}

private void initializeBoard() {
    board[0][0] = b1;
    board[0][1] = b2;
    board[0][2] = b3;
    board[1][0] = b4;
    board[1][1] = b5;
    board[1][2] = b6;
    board[2][0] = b7;
    board[2][1] = b8;
    board[2][2] = b9;
}

private void reset(){
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[i][j].setText("");
        }
    }
}

public boolean isBoardFull() {
    boolean isFull = true;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j].getText().equals("")) {
                isFull = false;
            }
        }
    }
    return isFull;
}

public boolean checkForWin() {
    boolean winner = (checkRowsForWin() || checkColumnsForWin() || checkDiagonalsForWin());

    if (winner) {
        if (TicTacCollection.gatos.isEmpty()) {
            TicTacCollection.gatos.add(this);
        } else {
            TicTacCollection.gatos.add(this);
        }
    }
    return winner;
}

private boolean checkRowsForWin() {
    for (int i = 0; i < 3; i++) {
        if (checkRowCol(board[i][0].getText(), board[i][1].getText(), board[i][2].getText()) == true) {
            return true;
        }

    }
    return false;
}

private boolean checkColumnsForWin() {
    for (int i = 0; i < 3; i++) {
        if (checkRowCol(board[0][i].getText(), board[1][i].getText(), board[2][i].getText()) == true) {
            return true;
        }
    }
    return false;
}

private boolean checkDiagonalsForWin() {
    return ((checkRowCol(board[0][0].getText(), board[1][1].getText(), board[2][2].getText()) == true) || (checkRowCol(board[0][2].getText(), board[1][1].getText(), board[2][0].getText()) == true));
}

private boolean checkRowCol(String c1, String c2, String c3) {
    return ((c1.length() > 0) && (c1.equals(c2)) && (c2.equals(c3)));
}

public void setMarca(JButton boton) {
    if (currentPlayerMark == 'X') {
        boton.setText("X");
        currentPlayerMark = 'O';
    } else {
        currentPlayerMark = 'X';
        boton.setText("O");
    }

    if (checkForWin()){
        JOptionPane.showMessageDialog(null, "El ganador fue el jugador con la marca: " + boton.getText());

        System.out.println("EN GATO HAY " + TicTacCollection.gatos.size());
        if (TicTacCollection.gatos.size() == 4) {
            TicTacCollection.showMatches();
        }
        if (TicTacCollection.gatos.size() >= 1 && TicTacCollection.gatos.size() < 4) {

            otro = new Tablero();
            this.hide();
            otro.setVisible(true);
            otro.setTitle("otro tablero");
        }

    } else if (isBoardFull()) {
        JOptionPane.showMessageDialog(null, "Empate");
        reset();
    }

}
    @SuppressWarnings("unchecked") //Código auto generado ...

 /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
Tablero tabla = new Tablero();
tabla.setVisible(true);

        }
    });
}

//Cada uno de los nueve botones tiene su `ActionPerformed` donde se invoca `setMarca(boton)`

private void b1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-  FIRST:event_b1ActionPerformed 
    setMarca(b1);
}//GEN-LAST:event_b1ActionPerformed    

В этом классе хранятся индикаторные табло

public class TicTacCollection {
    public static ArrayList<Tablero> gatos = new ArrayList<Tablero>();    

    static int x =10,y=20;

    public ArrayList<Tablero> devuelveGatos(){
        return gatos;
    }

    public static void showMatches(){

        System.out.println("Estas son las partidas y los resultados");
        for (int i = 0; i < gatos.size(); i++) { 

            if(i != 0){
                gatos.get(i).setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
            }
            gatos.get(i).setTitle("Gato"+i);
            gatos.get(i).setLocation(x,y);x+=286;
            gatos.get(i).setVisible(true);            
        }
    }

}
0
задан 17.01.2017, 04:37
0 ответов

То, что он перемещает, так это следующее:

У тебя есть поле Tablero otro в твоем классе Tablero. Если ты перемещаешь этот otro в ArrayList в TicTacCollection, проходит ссылка на изменчивый и присоединяется в список. Следующий раз, который называется checkForWin(), это поле находится на сочинении с новым Tablero, также затрагивая ссылку, сохраняемую в списке.

Я рекомендую тебе давать возвращение и читать немного о концепциях программирования, ориентируемый на объекты и потом начинаться снова с нуля. Поскольку ты используешь поля, объявленный как static в классах главным образом как глобальные переменные рискни путаницей, и в любом более сложном проекте ты идет вызывать чистые головные боли.

2
ответ дан 03.12.2019, 17:39
  • 1
    Пожалуйста, давайте избегать использовать выделенных в полужирном шрифте и италике для có я говорю. Существует battick ('), чтобы отпрыгивать có я говорю. Имена классов, mé все, переменные, có я говорю, давайте использовать выделенный приспособленный. –  17.01.2017, 02:58
  • 2
    так как также я не знал, что он происходит, если я не перемещаю его otro, и если this –  17.01.2017, 06:18
  • 3
    Если ты перемещаешь this, ты перемещаешь ссылку на сам объект, перемещая otro перемещаешь ссылку на другую инстанцию Tablero, созданный в checkForWin(). Для má s detailles deberí схвати иметь твой mé совсем main, где ты бросаешь твою программу. –  17.01.2017, 16:47