2012-04-20 91 views
1

當在方法中覆蓋下面類型爲Thing的現有變量someThing時,正確的方法是什麼?什麼是做這個變量覆蓋的正確方法?

doSomething(someThing); 

void doSomething(Thing thing){ 
    //... 
    thing = new Thing(...); // receives warning in Eclipse 
} 

someThing = doSomething(someThing); 

Thing doSomething(Thing thing){ 
    //... 
    return new Thing(...); 
} 

回答

2

第一個樣品沒有在調用者改變變量someThing。該分配僅在doSomething方法中可見。

第二個示例確實在調用者中更改了someThing

所以如果你想改變調用者的someThing,選項2是可行的,而選項1不是。

請參閱Is Java "pass-by-reference" or "pass-by-value"?爲什麼這樣工作。

假設下面的代碼和Thing有一個打印方法和一個String成員。

void foo() { 
    Thing one = new Thing("hello"); // 1 
    bar(one); 
    one.print();     // 5 
} 

void bar(Thing two) {   // 2 
    two = new Thing("bye");  // 3 
}        // 4 

1分配首先創建一個新的Thing對象:

     Thing{data="hello"} 

然後存儲在one到一個參考:當你點2進入bar

one *----- refs --------v 
         Thing{data="hello"} 

,將創建對同一對象的新引用:

one *----- refs --------v 
         Thing{data="hello"} 
two *----- refs --------^ 

然後線3不一樣的東西線1,即創建一個新的Thing對象:

one *----- refs --------v 
         Thing{data="hello"} 
two *----- refs --------^ 

         Thing{data="bye"} 

然後存儲在two到新對象的引用:

one *----- refs --------v 
         Thing{data="hello"} 

two *----- refs --------v 
         Thing{data="bye"} 

注意只有two被修改。該分配會改變two所引用的內容。

當你從bar返回,在線4,two超出範圍,「再見」事情不再有任何引用它(並最終將被垃圾回收)。

one *----- refs --------v 
         Thing{data="hello"} 

         Thing{data="bye"} // dead, will be collected 

所以在點5,你可以看到,hello將被打印出來 - 什麼都沒改變了one指對象。

+0

Oooh ...我可能搞砸了 – Theodor 2012-04-20 07:30:27

+0

_why_是這個嗎?是否因爲我在第一種情況下覆蓋了對'someThing'的引用? – Theodor 2012-04-20 07:34:10

相關問題