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

Posted

技术标签:

【中文标题】通过引用递归传递对象? JAVA【英文标题】:Recursive pass in object by reference? JAVA 【发布时间】:2011-12-12 11:53:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

从不在 Java 中将对象作为参数传递。您要么传递一个引用,要么传递一个原始值。参数始终按值传递。 Java 根本没有传递引用。

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

创建一个副本并传递对其的引用 首先让您的类型不可变。

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

Foo f = new Foo();

那么f 的值不是 Foo 对象。这是对Foo 对象的引用。如果你现在打电话:

doSomething(f);

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

打个比方:如果我给你一份我的地址副本,你可以去前门粉刷,但你不能改变我住的地方。

【讨论】:

我很难理解你的第一段。您说“永远不要将对象作为参数传递”???此外,“参数总是按值传递”,但如果它是非原始的,它是通过引用??? “Java 没有按引用传递”,但所有非基元都是按引用传递的,只是没有选择。 @JohnB:“按值传递引用”和“按引用传递”之间存在很大的区别。 Java支持前者,支持后者。 明白了,从声明中没有明白这是你的意思。 @JohnB:我添加了一个编辑以使这一点更清晰。如果你能让我知道它是否真的有帮助,那就太好了:) 我认为这确实有助于解释它。尤其是结合 Joachim 的评论。【参考方案2】:

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

也就是说,如果你做了下面的事情,你并没有改变被传递的对象:

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

上面将本地引用更改为o,但不会更改调用者对o的引用。如果你需要做这样的事情,你需要返回o

【讨论】:

我当然不会说非基元是通过引用传递的。事实上,我明确指出 Java 没有 引用传递。 抱歉引用不明确,我相信我的编辑可以纠正它。

以上是关于通过引用递归传递对象? JAVA的主要内容,如果未能解决你的问题,请参考以下文章

通过 Java 中的套接字传递对包含在“数据包”对象中的对象的引用

在递归函数的函数调用中修改通过引用传递的参数

Java中对象对象引用堆栈值传递以及引用传递的详解

Java中对象对象引用堆栈值传递以及引用传递的详细解释

“通过引用传递”究竟是啥意思?

java 对象的this使用 java方法中参数传递特性 方法的递归