第一個樣品沒有在調用者改變變量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
指對象。
來源
2012-04-20 07:28:45
Mat
Oooh ...我可能搞砸了 – Theodor 2012-04-20 07:30:27
_why_是這個嗎?是否因爲我在第一種情況下覆蓋了對'someThing'的引用? – Theodor 2012-04-20 07:34:10