0

我浏览了 stackoverflow 中的几篇文章,并在其他好网站上搜索了以了解 java pass by value 的概念..

我的疑问如下。

Dog someDog = new Dog("FOO"); //mem location 42
foo(someDog);
someDog.setName("FIFI"); // false

    foo(Dog newDog){
      newDog.name.equals("FOO"); //true
      newDog = new Dog("FIFI");  // create a new DOG object mem location 72. my doubt here
      newDog.name.equals("FIFI"); //true
    }

因此,如上一行,newDog = new Dog("FIFI");我的理解是在内存位置 72 处创建新的 DOG 对象,并将其分配给内存位置 42 处的另一个 Dog 位置对象。

这是什么意思?在后台。。

问候普尼斯。

4

3 回答 3

5

一张图片胜过千言万语,所以这是发生的事情:

变量到对象图

如您所见,someDog调用者和引用中newDog的两个变量foo最初是同一个对象。在赋值之后,它们引用了不同的对象,解释了你看到的行为:因为Dog是通过引用传递的,并且因为你创建了一个新的Dog而不是修改现有的,所以在赋值之后newDog变得无关。someDog

请注意,如果您修改了现有的狗,图片会有所不同:如果您在newDog.setName("FIFI");里面做foo,而不是newDog = new Dog("FIFI");,结果会有所不同:图表仍然看起来像中间的图片,但狗的名字会是FIFI

于 2013-06-30T10:08:01.283 回答
2
void foo(Dog newDog){
    newDog.name.equals("FOO"); //true
    newDog = new Dog("FIFI");  // create a new DOG object mem location 72. my doubt here
    newDog.name.equals("FIFI"); //true
}

newDog是该方法的局部变量。当您调用该方法并 passsomeDog时,someDog(这是对Dog对象的引用)的值被复制到newDog. 所以现在你有 2 个引用指向同一个对象。这就是为什么第一行评估为true.

执行后

newDog = new Dog("FIFI");

该变量newDog引用新创建的Dog对象。这根本不会改变变量someDog。所以现在,您有 2 个变量,每个变量都指向一个不同的Dog对象。

方法完成后,newDog变量消失,新创建的Dog对象不再有指向它的引用,因此它有资格进行垃圾回收。

方法中贴出的代码不会改变被引用的对象的任何属性,someDog也永远不能切换被引用的对象someDog

这就是为什么

someDog.setName("FIFI"); // is false

明白了吗?

于 2013-06-30T10:12:20.547 回答
0

您正在创建一个新的 Dog 对象 (FIFI) 并让方法参数 newDog 引用这个新对象。这对 someDog 仍然引用的对象没有任何影响。所以,这个变量仍然引用同一个对象。这是你想知道的吗?

于 2013-06-30T09:56:27.543 回答