通过引用递归传递对象? JAVA

时间:2011-10-21 10:44:41

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

所以我有一个算法迫使我递归地传递一个对象作为参数,并且在递归的不同深度上它设置了对象的值。问题是Java不允许我这样做,因为它们传递的是价值或其他让我搞砸的东西。如何确保传入的对象保留了值集?

2 个答案:

答案 0 :(得分:10)

永远不会在Java中将对象作为参数传递。您可以传递引用值或原始值。参数始终按值传递。 Java根本没有pass-by-reference。

如果您传入对象的引用,并且您想确保您调用的代码不会更改该对象中的数据,那么您的选项是:

  • 创建副本并传入对该
  • 的引用
  • 首先让你的类型不可变。

编辑:只是为了说清楚,如果你有:

Foo f = new Foo();

然后f的值是而不是一个Foo对象。它是Foo对象的引用。如果你现在打电话:

doSomething(f);

然后将f的值复制为doSomething中参数的原始值。这种行为基本上是传值的定义。没有doSomething可以更改f的值 - 它之后仍会引用同一个对象。 该对象中的数据可能已更改,但它不会是另一个对象。

在一个现实世界的比喻中:如果我给你一份我的地址,你可以去画前门,但你不能改变我住的地方。

答案 1 :(得分:3)

正如Jon所述,所有非基元都是通过传递引用的副本来传递的。你没有选择。所以你的递归方法应该能够更新对象,如果它是可变的。但是,您无法重新分配引用并期望它传播回调用堆栈。请记住,字符串不可变。

换句话说,如果执行以下操作,则表示您尚未更改传递的对象:

void myMethod(Object o){
     o = new Object();
}

以上内容将本地引用更改为o,但不会更改调用者对o的引用。如果您需要执行此类操作,则需要返回o