我在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
明白了吗