我知道Java并不真正使用精确的引用传递,而是通过引用副本传递。这就是为什么刚尝试交换引用的交换函数在Java中不起作用的原因。 for-each循环是否也这样做?例如,给出以下代码......
for (Constraint c : getLeafNodes(constraintGraph)){
c = new Constraint();
}
...我想通过一个递归定义的树状结构,找到所有叶子节点。每个叶节点都需要用新的空节点替换。这会做我期望的,还是只是将每个叶节点的引用副本设置为一个新节点?
我在传递单元测试的另一段代码上写了一个类似的方法,这让我觉得for-each循环使用引用,而不是引用副本,但我们的代码质量软件将此标记为局部变量的死存储,重大错误。
感谢。
答案 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中的对象变量视为指针而不是引用。