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



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

永远不会在Java中将对象作为参数传递。要么传递引用,要么传递原始值。参数总是按值传递。Java根本没有引用传递。

如果你正在传递一个对象的引用,并且你想确保你调用的代码不会改变该对象中的数据,你的选项是:

  • 创建一个副本并传递一个引用来代替
  • 首先让你的类型不可变

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

Foo f = new Foo();

f的值为而不是Foo对象。它是对Foo对象的引用。如果你现在调用:

doSomething(f);

则将f的值复制为doSomething内参数的原始值。这种行为基本上就是值传递的定义。doSomething不能做什么改变f的值-之后它仍然引用相同的对象。对象中的数据可能已经改变,但它不会是一个不同的对象。

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

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

换句话说,如果您执行了以下操作,则没有更改传递的对象:

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

上面的代码将本地引用更改为o,但不会更改调用方对o的引用。如果需要这样做,则需要返回o

最新更新