所以我有一个算法,它迫使我递归地传递一个对象作为参数,并在递归的不同深度设置对象的值。问题是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
。