2014-10-03 85 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对象的对象。