我在stackoverflow中浏览了几篇文章,并用Google搜索了其他好的网站,以了解按值传递Java的概念。

我的疑问如下。

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位置对象。

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

问候
普尼思

最佳答案

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是该方法的局部变量。当您调用该方法并传递someDog时,someDog的值(它是对Dog对象的引用)被复制到newDog中。因此,现在您有2个引用指向同一对象。这就是第一行计算为true的原因。

执行后

newDog = new Dog("FIFI");


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

方法完成后,newDog变量消失,并且新创建的Dog对象没有指向它的引用,因此可以进行垃圾回收。

该方法中发布的代码不会更改someDog引用的对象的任何属性,并且永远无法切换someDog引用的对象。

这就是为什么

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


明白了吗

10-08 00:51