2014-10-03 119 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; 
} 

由於resulttemp,並在每個循環迭代temp變化,是否意味着result也將改變基於這樣temp指向?

+0

'result'不指向'temp' 。它指向的是分配完成時'temp'指向的對象。 – 2014-10-03 12:37:13

+0

@ColonelThirtyTwo所以'result'會在最後指向'myList.get(3)'? – faizal 2014-10-03 12:38:51

回答

4

它將指向存儲在myList索引3(從運行該代碼時起)的對象。

操作:

result = temp; 

副本目前tempresult值。該值是您剛剛從myList.get(i)獲得的對象的參考。 tempresult之間沒有持久的聯繫。

+0

如果我要從方法中返回'result',那會如何工作?因爲myList只存在於方法的範圍內。所以'result'會指向一個不存在的對象? – faizal 2014-10-03 13:00:06

+1

@faizal:沒關係。對象不屬於列表,列表只是對它們的引用。記憶中的對象是否有人提及它。所以,如果你返回'result',那麼你返回的任何東西都會引用該對象,所以它不符合垃圾回收的條件。如果'myList'是唯一具有任何其他9個對象的引用,並且沒有其他引用了'myList'(並且在該代碼中沒有任何內容),那麼'ArrayList'' myList'指向符合條件對於GC來說,其他九個對象也是如此,但不是你返回的對象。 – 2014-10-03 13:04:40

+1

絕對值得一看:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – 2014-10-03 13:27:46

0

result將指向同一對象臨時指向時i3。這是myList.get(3)返回的同一個對象。

1

Java對象變量是對象的引用。當分配對象的引用時;對象本身的內容不會被複制。

在你的情況下,result的賦值只發生一次,當時i == 3。分配後,result引用列表中位置3的對象。由於循環中沒有其他任務result,因此result也會在循環結束後引用myList.get(3)調用的結果。

1

結果實際上並不指向溫度。如果將temp分配給結果,則不會將對象temp分配給結果,而是將參考(指針)分配給結果。賦值結果包含與temp相同的內存位置指針後。它將指向與temp分配給結果時的溫度相同的對象。因此結果將指向myList List Object的索引3處的對象。它不會因爲溫度變化引用而改變,因爲結果不指向temp,它指向臨時指向它在索引3處指向List對象的對象。