Java
都是按值传递的。
我们要这样去理解这个问题:
Dog myDog;
myDog
并不是一个Dog
,而是一个指针指向了一个Dog
对象。
Dog myDog = new Dog("Rover");
foo(myDog);
这个程序实际上是将new Dog("Rover")
这个对象地址的值给了foo
方法
假设new Dog("Rover")
这个对象在内存地址的42
,也就是说我们将42
这个地址给了foo
方法
public void foo(Dog someDog)
{
someDog.setName("Max"); // AAA
someDog = new Dog("Fifi"); // BBB
someDog.setName("Rowlf"); // CCC
}
someDog
被设置为了42
- 在
AAA
行- someDog这个对象(
42
)被要求改名为Max
- someDog这个对象(
- 在
BBB
行- 生成一个新的
Dog
对象,比如说在地址74
- 我们将
someDog
这个对象设置成74
- 生成一个新的
- 在
CCC
行someDog
这个对象(74
)被要求改名为Rowlf
- 最后,我们返回结果
因为我们传的只是42
这个内存地址的值,所以返回后,someDog
还是(42
),只是他的名字变成了Max
Reference
http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value