第一个样品没有在调用者改变变量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