2013-06-25 125 views
3

如果我們將一個引用變量傳遞給方法並修改對象的狀態,那麼這些修改是永久性的(請糾正我,如果我錯了)。考慮代碼:通過參考var和GC

class CardBoard { 
    Short story = 200; 
    CardBoard go(CardBoard cb) {      //....(1) 
    cb = null; 
    return cb; 
    } 
    public static void main(String[] args) { 
    CardBoard c1 = new CardBoard(); 
    CardBoard c2 = new CardBoard(); 
    CardBoard c3 = c1.go(c2);  //pass c2 into a method ....(2) 
    c1 = null; 
    // do Stuff 
    } } 

當在上面的代碼,我們說CB =空和返回CB,不應C2(也C3)現在有空引用? (PS:原始問題要求在「// do stuff」之後有資格獲得gc的對象,答案是2,但我在理解時遇到問題。)

+3

沒有,因爲基準是按值傳遞。關於堆棧溢出(以及網絡上的其他頁面)有很多*問題,詳細討論這些問題。 –

回答

3

不,因爲cb=null只將'cb'的引用目標從原始實例替換爲null,因此c2不會受到影響。

當你只是傳遞c2到函數,情況會是這樣的:

cb  c2 
    |   | 
------------------ 
|  object | 
------------------ 

一旦cb設置爲null,它成爲

null--cb  c2 
       | 
    ------------------- 
    |  object  | 
    ------------------- 

,並返回Cb和分配到C3,它實質上是c3 = null

然而,在另一方面,如果你改變對象的內部狀態,那麼肯定是由所有引用引用的對象的狀態將被改變..

0

Java是嚴格的pass由價值

CardBoard go(CardBoard cb) { // here cb has a *copy* of address c2 points to 
    cb = null; // when you modify cb, c2 still points to the original location 
    return cb; // returning null now 
} 

CardBoard c3 = c1.go(c2); // c3 becomes null because of explicit assignment 
c1 = null; // same as c3 

很多你的困惑來自於如果我們傳遞一個引用變量的方法和修改對象的狀態觀察這個

,修改是永久性的。

出現如通過引用傳遞但在Java通過(的參考)值可以作爲通。

修改依然存在,因爲(地址的)副本仍然指向原始對象。所以,所有被激發的方法(使用副本引用)仍然觸發原始對象。

但是,如果要銷燬此複製的參考(通過將其設置爲null),它不會影響原始對象或指向它的任何其他參考。

+0

cb是一個指向同一個對象的指針,不是副本 – Tala

+0

@Tala請刷新答案。我已經重寫了它。 –

+0

好的,撤消了投票權 – Tala