参数中的Java reference-type

时间:2011-03-20 18:57:02

标签: java reference

为什么这不会改变初始对象:

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";
}

我不明白这有什么不同。

5 个答案:

答案 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";
}

上面修改了传递的对象,因为testitem都指的是同一个对象。

因此,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对象的任何内容,也不会更改对方法范围之外的引用。

我想我在这里非常近似,我很乐意得到纠正。