【问题标题】:Does the Java for each loop return a reference, or a reference copy?每个循环的 Java 是否返回引用或引用副本?
【发布时间】:2011-05-02 15:23:19
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • for-each 循环不返回任何内容(给谁?)。您的问题与标题不符。

标签: java reference foreach


【解决方案1】:

它也不会。这和说的差不多

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

您所做的只是更改c 所指的内容。即使 Java 支持真正的 pass-by-reference,这也行不通

【讨论】:

  • 哦,你是对的。我不知道我在想什么。我应该检索每个叶子的父级,然后调用某种 parent.setChild(new Constraint()) 方法。谢谢。
【解决方案2】:

简答:reference-copy

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 1970-01-01
      • 2013-04-15
      • 2011-12-29
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多