理解Java传递值

理解Java传递值,java,pass-by-reference,pass-by-value,Java,Pass By Reference,Pass By Value,我在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

我在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=newDog(“FIFI”)我的理解是,新的狗对象在mem位置72处创建,并分配给mem位置42处的另一个狗位置对象

这意味着什么?在后台

问候
Punith.

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

一张图片抵得上千言万语,下面是发生的事情:

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

请注意,如果您修改了现有的dog,图片会有所不同:如果您修改了
newDog.setName(“FIFI”)内部
foo
,而不是
newDog=newDog(“FIFI”),结果会有所不同:图表看起来仍然像中间的图片,但狗的名字应该是
FIFI

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
中。现在有两个引用指向同一个对象。这就是为什么第一行的计算结果为
true

执行之后

newDog = new Dog("FIFI");
变量
newDog
引用新创建的
Dog
对象。这根本不会更改变量
someDog
。现在,您有两个变量,每个变量指向不同的
Dog
对象

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

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

这就是为什么

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

明白了吗?

是的,可能是重复的。。但是,在newDog=newDog(“FIFI”)一行中,上面的so是什么;我的理解是,新的狗对象在mem位置72处创建,并分配给mem位置42处的另一个狗位置对象。这是什么意思???并分配给mem位置42处的另一个狗位置对象…为什么?“你是怎么得出这个结论的?”维沙尔克,我引用它作为记忆地址的一个例子。像Foo最初创建的mem位置42一样,后来在Foo方法中,我们为这个引用指定了一个值,一个新的Dog对象在72处创建。我的问题是,为什么在值(引用地址)更改时没有差异。