2014-10-03 3 views
1

Я смущен тем, как работают ссылки на объекты. В приведенном ниже примере, в конце цикла, Will result указывает на myList.get(9) или myList.get(3)?Как работает операция назначения объектов

Class MyClass{ 
... 
} 

public static MyClass myUtilityMethod(){ 
    List<MyClass> myList = new ArrayList<MyClass>(10); 
    //initialize the list 
    .... 
    //////////// 
    MyClass tmp = null; 
    MyClass result = null; 

    for(int i =0; i < 10; i++){ 
     temp = myList.get(i); 
     if(i == 3) result = temp; 
    } 

    return result; 
} 

С result указывает temp и temp изменений в каждой итерации цикла, это означает, что result также будет меняться в зависимости от того, где temp указывает?

+0

'result' НЕ указывает на' temp' , Он указывает на объект, на который указывает «temp», когда было выполнено задание. –

+0

@ColonelThirtyTwo так 'result' будет указывать на' myList.get (3) 'в конце? – faizal

ответ

4

Он укажет на объект, хранящийся в myList по индексу 3 (с того момента, когда вы запустили этот код).

Операция:

result = temp; 

копирует значение в настоящее время в temp в result. Это значение является ссылкой на объект, который вы только что получили от myList.get(i). Между temp и result нет прочной связи.

+0

Если бы я должен был вернуть «результат» из метода, как это работает? Потому что 'myList' существует только в рамках метода. Итак, 'result' будет указывать на несуществующий объект? – faizal

+1

@faizal: Все будет хорошо. Объекты не * принадлежат * к списку, список просто имеет ссылку на них. Что хранит объект в памяти, есть ли у кого есть ссылка на него. Поэтому, если вы вернете «результат», все, что вы вернете, будет иметь ссылку на этот объект, и поэтому он не будет иметь права на сбор мусора. Если 'myList' было единственной вещью, которая имела какие-либо ссылки на другие 9 объектов, и больше ничего не ссылалось на' myList' (и ничего не делает в этом коде), тогда '' MyList 'ArrayList' означает, что он имеет право для GC, как и остальные девять объектов, но не тот, который вы возвращаете. –

+1

Определенно стоит посмотреть на это: http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value –

0

result будет указывать на тот же объект температура указал, когда i был 3. Это тот же объект, который был возвращен myList.get(3).

1

Переменные объекта Java являются ссылками на объекты. Когда назначается ссылка на объект; содержимое самого объекта не копируется.

В вашем случае назначение result происходит только один раз, когда i == 3. После назначения result ссылается на объект в месте 3 списка. Поскольку в цикле других назначений result нет, result ссылается на результат вызова myList.get(3) после окончания цикла.

1

результат фактически не указывает на темп. Когда вы назначаете temp для результата, вы не назначаете временную точку объекта, вы назначаете ссылку (указатель) на результат. После того, как результат присваивания содержит тот же указатель на ячейку памяти, который сделал temp. Он будет указывать на тот же объект, что temp был, когда temp был назначен для результата. Поэтому результат будет указывать на объект в индексе 3 объекта списка myList. Он не будет изменяться, поскольку temp изменяет ссылки, потому что результат не указывает на temp, он указывает на объект, на который указывает temp, когда он указывал на объект списка в индексе 3.

Смежные вопросы