Java массив переписывает все индексы - PullRequest
0 голосов
/ 17 сентября 2011

Прежде всего, моя проблема в значительной степени аналогична описанной там: Массив, возвращающий одинаковые значения для всех индексов , за исключением того, что это для Java, а не для C #. (Что я слышал довольно похоже)

В игре несколько классов, я постараюсь рассказать подробнее:

SomeInterface: интерфейс для различных типов пикселей.

PixelTypeA: один тип пикселя.

PixelTypeB: другой тип пикселя.

(PixelTypeA и PixelTypeB реализуют / наследуют от SomeInterface)

PixelImage: это проблемный класс, он содержит двухмерный массив, который имеет одинаковые значения для всех квадратов, вот объявление:

SomeInterface[][] pixels;

Теперь конструктор делает следующее для выделения памяти (высота и ширина являются параметрами):

pixels = new SomeInterface[height][width];

Пока все хорошо. Но затем в PixelImage вызывается метод для загрузки пикселей из файла PPM. Этот код работает правильно, потому что если я проверяю значение пикселя сразу после его сохранения в памяти (в цикле readfile), все в порядке. Однако я понял, что после каждой итерации цикла (т.е. после сохранения каждого пикселя в памяти) все значения массива пикселей имеют одинаковое значение, и это значение последнего сохраненного пикселя. Вот важный код в цикле:

pixels[row][col] = new PixelTypeA( pixelValue );

Как я уже сказал, если я выполняю системную печать пикселей [row] [col] на следующей строке, в ней будет правильное значение, хотя и у всех других индексов в двумерном массиве пикселей это значение тоже есть. row и col увеличиваются правильно. Я совершенно новичок в Java, и я предполагаю, что я что-то упустил из-за ссылок или чего-то подобного, что заставляет меня случайно обновлять весь массив пикселей на каждой итерации цикла readfile (или это может быть объявление / инициализация в чем проблема?). Я пытался решить это самостоятельно в течение нескольких часов, но это стало очень неприятно. Я изменил имена и не могу дать вам полный код, так как это задание, и я хочу сделать это сам, мне просто нужны подсказки, что может вызвать такое странное поведение прямо сейчас.

Спасибо!

1 Ответ

1 голос
/ 17 сентября 2011

Скорее всего, вы повторно используете объект, вставленный в массив, вместо того, чтобы каждый раз делать new.

Это означает, что каждая запись массива указывает на один и тот же объект, для которого установлено последнее прочитанное значение.

...