Значения 2D-массива изменяются без явного объявления их в Java - PullRequest
1 голос
/ 02 марта 2011

Следующий параметр изменяет параметр chr и в конечном итоге совпадает с «поменяемым» 2D-массивом.Я не могу видеть, как это может измениться, поскольку это не на конце получения любого вычисления.Существуют также похожие переменные, из которых вызывается этот метод, которые также изменяются аналогичным образом.

private Character[][] moveLeft(Character[][] chr) {
    Character[][] swapped = chr;
    int[] pos = getBlankLocation(chr); //find the blank space

    //location of blank space in 2d array
    int row = pos[0];
    int col = pos[1];
    if (col != 0) {
        Character temp = chr[row][col - 1];
        swapped[row][col - 1] = chr[row][col];            
        swapped[row][col] = temp;

        return swappedChr;
    }
    return null;
}

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Это ожидается. Java передается по значению, но значение, передаваемое в метод, является адресом памяти объекта Array. Таким образом, назначение:

Character[][] swapped = chr;

На самом деле не создает новый массив.

1 голос
/ 02 марта 2011

Вы заставили swapped и chr ссылаться на один и тот же объект в памяти. Поэтому изменение одного изменит другое, поскольку они оба ссылаются на один и тот же объект. Обратите внимание, что это не относится к примитивным значениям, таким как int.

Если вы хотите поменять значения в swapped без эффекта в chr, вам нужно будет сделать копию или клон chr. Вы можете сделать это с помощью вложенного цикла for, который копирует значения, или вы можете использовать один из нескольких вспомогательных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...