理解Java传递值
我在stackoverflow上浏览了几篇帖子,并在Google上搜索了其他好的站点,以了解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
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处创建。我的问题是,为什么在值(引用地址)更改时没有差异。