Копирование и массивы Java-классов - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть некоторые проблемы с объектами в массиве, работающими как один объект, а не отдельно, как предполагалось. Например

boardArray = new object[4];
workingBoardArray = new object[4];
boardArray[0] = new board(boardA);
boardArray[1] = new board(boardB);
boardArray[2] = new board(boardC);
boardArray[3] = new board(boardD);
int selectedBoard = selectBoard(boardArray);
workingBoardArray[0] = boardArray[selectedBoard];
workingBoardArray[1] = boardArray[selectedBoard];
workingBoardArray[2] = boardArray[selectedBoard];
workingBoardArray[3] = boardArray[selectedBoard];
workingBoard[0].moveUp();
workingBoard[1].moveRight();
workingBoard[2].moveDown();
workingBoard[3].moveLeft();

Этот код создает набор из 4 досок, находит нужную плату, копирует эту плату в массив рабочих плат и затем перемещает каждую рабочую плату в новом направлении. Проблема в том, что все доски действуют вместе. Поэтому, если я делаю moveUp () на workingBoard [0], workingBoard [1] также перемещается вверх. Есть ли способ обойти это, я чувствую, что упускаю какое-то фундаментальное понимание или действительно глупую ошибку.

Я также пытался использовать конструктор копирования, как

workingBoard[0] = new Board(boardArray[selectedBoard].getBoard);

Который извлекает всю необходимую информацию о доске и создает новую доску с ней, но, похоже, это ни на что не влияет. Любая помощь будет отличной

Ответы [ 2 ]

7 голосов
/ 03 апреля 2012

Посмотрите на этот код:

int selectedBoard = selectBoard(boardArray);
workingBoardArray[0] = boardArray[selectedBoard];
workingBoardArray[1] = boardArray[selectedBoard];
workingBoardArray[2] = boardArray[selectedBoard];
workingBoardArray[3] = boardArray[selectedBoard];

Это устанавливает для всех четырех элементов массива значение , ссылающееся на один и тот же объект.Так что да, когда вы изменяете этот объект, вызывая moveUp() или что-то еще, это изменение будет видимым через все элементы в массиве.

Звучит так, как будто вы хотите создать копия доски каждый раз.В зависимости от того, что делает ваш тип board (который должен называться Board в соответствии с соглашениями об именах), вы можете просто реализовать Cloneable (вполне возможно, переопределив метод clone()) или предоставить какой-либо другой вид операции копирования.

Известно ли вам о разнице между ссылка и объект в Java и что массив содержит только ссылки, а не объекты?(Аналогично, любое значение переменной будет только ссылкой, а не объектом.) действительно важно понимать, как объекты работают в Java.Например:

 StringBuilder a = new StringBuilder();
 StringBuilder b = a;
 a.append("Foo");
 System.out.println(b); // Still prints "Foo"

Здесь у нас есть один StringBuilder объект, хотя есть две переменные (a и b), значения которых относятся к тому жеобъект.

1 голос
/ 03 апреля 2012

... копирует эту плату в массив рабочих плат и затем перемещает каждую рабочую доску в новом направлении.

На самом деле вы не копируете доску. Существует только один экземпляр платы, на который четыре раза ссылаются из workingBoardArray. Для создания копий доски вы должны либо внедрить метод клонирования, либо предоставить собственный метод копирования.

Например, если вы реализуете метод клонирования, вы можете написать:

workingBoardArray[0] = boardArray[selectedBoard].clone();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...