我在stackoverflow中经历了几个帖子并搜索了其他好网站以了解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");
行,我的理解是新的DOG对象在mem位置72处创建并分配给mem位置42处的另一个Dog位置对象。
这意味着什么?在背景..
此致 Punith。
答案 0 :(得分:5)
一张图片胜过千言万语,所以这是正在发生的事情:
如您所见,调用者中的两个变量someDog
和newDog
中的foo
最初引用了同一个对象。在分配之后,他们引用不同的对象,解释您看到的行为:由于Dog
是通过引用传递的,并且因为您创建了新的Dog
而不是修改现有的newDog
,someDog
在转让后与newDog.setName("FIFI");
无关。
请注意,如果您修改现有的狗,则图片会有所不同:如果您在foo
内newDog = new Dog("FIFI");
而不是FIFI
,则结果会有所不同:图表仍然看起来像中间的图片,但狗的名字应该是{{1}}。
答案 1 :(得分: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
是该方法的局部变量。当您调用该方法并传递someDog
时,someDog
(对Dog
个对象的引用)的值将被复制到newDog
。所以现在你有2个引用指向同一个对象。这就是为什么第一行评估为true
。
执行
后newDog = new Dog("FIFI");
变量newDog
引用新创建的Dog
对象。这根本不会改变变量someDog
。所以现在,你有两个变量,每个变量都指向一个不同的Dog
对象。
方法完成后,newDog
变量消失,新创建的Dog
对象没有更多引用指向它,因此它有资格进行垃圾回收。
方法中发布的代码不会更改someDog
引用的对象的任何属性,并且永远不能切换someDog
引用的对象
这就是为什么
someDog.setName("FIFI"); // is false
明白了?
答案 2 :(得分:0)
您正在创建一个新的Dog对象(FIFI),并让方法参数newDog引用此新对象。这对somedog仍然引用的对象没有任何影响。因此,此变量仍然引用相同的对象。这是你想知道的吗?