为什么这不会改变初始对象:
public class Foo
{
Bar item = new Item(5);
public changeBar(Bar test){
test = new Item(4);
}
public run(){
changeBar(item);
}
}
在这种情况下,item
不会被更改。这怎么可能?我的意思是,你将参考作为参数传递给方法,所以我要说给它分配一个新值,意味着初始item
也会被改变。
有人可以向我解释这是如何运作的。
=======================================
然而,我的问题如下:
以下工作正常吗?
public changeBar2(Bar test){
test.parameter = "newValue";
}
我不明白这有什么不同。
答案 0 :(得分:3)
考虑一个思想实验:
changeBar(null);
上面的代码会改变null
的价值吗?
您的问题的答案是,尽管您的Bar
对象是“通过引用”传递的,但这与通过值传递引用本身不同。在Java中,所有参数都按值传递,即使它们本身也是对其他对象的引用。
答案 1 :(得分:2)
public changeBar(Bar test){
test = new Item(4);
}
changeBar(item);
此处item
中的值已复制到test
。截至目前,两个item, test
都指向同一个对象。在方法内部,test
指向不同的位置,不会影响item
。您传递值而非参考。
public changeBar2(Bar test){
test.parameter = "newValue";
}
上面修改了传递的对象,因为test
和item
都指的是同一个对象。
因此,test
可以完全指向新对象或修改之前引用的对象。两者都不同且有效。
答案 2 :(得分:1)
Java中的参数始终是按值传递的。
在函数的开始时,changeBar()测试是对item的引用,但是然后您通过对新创建的项的引用来覆盖它。因此,您只使用不同的引用覆盖局部变量,但不要更改引用的对象。
答案 3 :(得分:0)
test
中的 changeBar
基本上是指针。因此,当您指定它时,您正在更改指针。
这是一篇文章:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
答案 4 :(得分:0)
您正在为该方法提供对该对象的引用,即它的地址可以这么说。因此,此地址存储在名为test
的变量中。
然后你的方法会删除test
变量中写入的内容,而是写入它创建的新Item
对象的地址。这里没有任何内容可以更改初始Item
对象的任何内容,也不会更改对方法范围之外的引用。
我想我在这里非常近似,我很乐意得到纠正。