Является ли элемент массива ссылкой на объект или ссылкой на него самого? - PullRequest
1 голос
/ 24 апреля 2011

Если у меня есть массив объектов AnObjects, и я делаю это:

AnObject oldObject = arrayOfObjects[validIndex];
arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);
oldObject.terminate();

Прекращается ли новое содержимое arrayOfObjects[validIndex] или прекращается исходное oldObject?

Другими словами: содержит ли oldObject ссылку на AnObject или содержит ссылку на ссылку на AnObject?

Ответы [ 4 ]

3 голосов
/ 24 апреля 2011

Этот код немного сбивает с толку. Ваш массив объектов должен иметь ссылку на AnObject.

AnObject oldObject = arrayOfObjects[validIndex];

Вы назначаете эту ссылку oldObject здесь.

arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);

Теперь вы устанавливаете ссылку на массив на validIndex, чтобы указывать на новый экземпляр AnObject. Больше не указывает на oldObject.

oldObject.terminate();

Это ссылка на объект в куче.

oldObject относится к экземпляру в куче; ссылка в массиве указывает на новый экземпляр, который вы создали в куче.

Если oldObject завершен (что бы это ни значило), это не имеет значения для нового экземпляра, который вы создали. Массив по-прежнему указывает на новый экземпляр.

1 голос
/ 24 апреля 2011
  • Предположим, что arrayOfObjects начинается с ячейка памяти 100.
  • Предположим, что validIndex равен 0.

Тогда arrayOfObjects [validIndex] означает ячейку памяти 100.

  • Предположим, что ячейка памяти 100 имеет значение 200.

    AnObject oldObject = arrayOfObjects [validIndex];

oldObject находится в ячейке памяти 200.

arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);
  • Предположим, что вызов для нового выделен объект в ячейке памяти 300.

Тогда ячейка памяти 100 имеет значение 300.

oldObject.terminate();

oldObject никогда не менялся, поэтому он все еще указывает на область памяти 200.

Таким образом, элемент, который был в массиве, завершается после его замены новым объектом.

1 голос
/ 24 апреля 2011

Содержит ссылку на объект.В этом случае oldObject будет завершен, а не новый экземпляр, который вы поместили в массив.

0 голосов
/ 24 апреля 2011

В Java нет ссылок на ссылки.Игнорируя примитивные типы, тогда все переменные / ячейки массива содержат ссылки на объекты.Вот фрагмент, который иллюстрирует это:

class Something {
  public int n;
}    

Something[] arr = new Something[2];
Something s = new Something();
s.n = 2;

arr[0] = s;
System.out.print(arr[0].n); // Output: "2"
arr[0].n += 1;
System.out.print(s.n); // Output: "3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...