【问题标题】:Why can you change field variables with an enhanced for loop but you cannot initialiaze objects?为什么可以使用增强的 for 循环更改字段变量但不能初始化对象?
【发布时间】:2014-08-07 20:46:59
【问题描述】:

我最近了解到,您不能在 Java 中使用增强型 for 循环来初始化对象,因为增强型 for 循环的工作方式是从对象创建一个“虚拟”对象,然后使用虚拟对象执行任何代码状态

但这促使我尝试使用增强的 for 循环更改对象内的字段变量,令人惊讶的是,代码更改了对象中的字段变量。任何人都可以向我解释这是如何工作的,因为据我了解,对象不应发生任何更改,原因与您无法使用增强的 for 循环初始化对象相同。显然我在这里暴露了我的理解上的差距,所以任何人都可以帮助我

【问题讨论】:

  • 如果你能展示一个正在工作的例子,以及一个没有工作的例子,那真的很有帮助。我怀疑这只是更改迭代变量的值(不允许)和更改迭代变量引用的对象内的数据(允许)之间的区别。

标签: java arrays for-loop foreach initialization


【解决方案1】:

在 java 中,你看到的对象不是对象,而是对象引用
对象引用只是对 RAM 中对象的引用。 例如。

Person p1;
Person p2;
p1 = new Person();  // p1 now has an reference to an Person object
p2 = p1;  // Now p2 and p1 point to the same object

现在,如果我们对 p2 的对象进行更改,该更改将反映到 p1 的对象,因为它们引用的是同一个对象。

例如。

p2.setHeight(50);
p1.setHeight(90);
System.out.println(p2.getHeight());

上面的代码 sn-p 会打印出 90,而不是 50。因为首先将对象的高度设置为 50,然后将对象的高度设置为 90(使用其他对象引用)。​​

回到你的问题。

for(Person p : peopleArray)
{
    // more code
}

在 for 循环的每个循环中,都会创建一个对象引用 p,并引用 peopleArray 中的对象引用所引用的同一对象。

【讨论】:

  • 这解释了我所观察到的一切,对我来说很有意义。谢谢
【解决方案2】:

在增强的for 循环中,您可以修改 对象,但不允许更改正在迭代的数据结构。这意味着您可以更改对象的字段,但不能在数据结构中添加或删除项目。您也不允许将一个全新的对象设置为已经在列表中的对象。如果修改列表,就会抛出ConcurrentModificationException

【讨论】:

    【解决方案3】:

    你是在问这个吗:

    for (Animal a: animals)
    { 
     a=new Dog(); // wrong
    }
    

    如果是这样,请将本例中定义的a 视为final Animal a。因此,参考变量是不可变的。但对象的成员字段(如果有)不一定是不可变的。

    for (Animal a: animals)
    { 
      a.Name = "Jack"; //valid, if Name is a mutable member field.
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 2011-11-08
      • 2018-10-09
      • 2011-09-26
      • 1970-01-01
      • 2012-01-02
      • 2013-08-03
      • 1970-01-01
      相关资源
      最近更新 更多