每个循环的Java是返回引用还是引用副本?

时间:2011-05-02 15:23:19

标签: java reference foreach

我知道Java并不真正使用精确的引用传递,而是通过引用副本传递。这就是为什么刚尝试交换引用的交换函数在Java中不起作用的原因。 for-each循环是否也这样做?例如,给出以下代码......

for (Constraint c : getLeafNodes(constraintGraph)){
    c = new Constraint();
}

...我想通过一个递归定义的树状结构,找到所有叶子节点。每个叶节点都需要用新的空节点替换。这会做我期望的,还是只是将每个叶节点的引用副本设置为一个新节点?

我在传递单元测试的另一段代码上写了一个类似的方法,这让我觉得for-each循环使用引用,而不是引用副本,但我们的代码质量软件将此标记为局部变量的死存储,重大错误。

感谢。

3 个答案:

答案 0 :(得分:10)

它也不会这样做。这类似于说

Object c = getObject();
c = new Object();

您所做的就是改变c所指的内容。即使Java支持真正的传递引用

,这也行不通

答案 1 :(得分:4)

简答:参考副本

分配迭代器的变量时,它不会传播到集合。请将迭代器视为对列表的只读访问。

Java的for循环与C#的for-each循环完全相同,其中while Enumerator moveNext可以Current将{{1}}元素分配给局部变量

答案 2 :(得分:0)

不,它不会做你所期望的。 c是一个局部变量,它引用/指向getLeafNodes返回的集合中的元素。 Java没有您提到的引用概念,一切都是引用副本。如果您知道,例如C或C ++,将java中的对象变量视为指针而不是引用。