理解Java按值传递

时间:2013-06-30 09:51:58

标签: java pass-by-reference pass-by-value

我在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。

3 个答案:

答案 0 :(得分:5)

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

Variable to object diagrams

如您所见,调用者中的两个变量someDognewDog中的foo最初引用了同一个对象。在分配之后,他们引用不同的对象,解释您看到的行为:由于Dog是通过引用传递的,并且因为您创建了新的Dog而不是修改现有的newDogsomeDog在转让后与newDog.setName("FIFI");无关。

请注意,如果您修改现有的狗,则图片会有所不同:如果您在foonewDog = 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仍然引用的对象没有任何影响。因此,此变量仍然引用相同的对象。这是你想知道的吗?