为什么可以使用增强的for循环更改字段变量但是无法初始化对象?

时间:2014-08-07 20:46:59

标签: java arrays for-loop foreach initialization

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

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

3 个答案:

答案 0 :(得分:1)

你在问这个问题:

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.
}

答案 1 :(得分:1)

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

答案 2 :(得分: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());

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

回到你的问题。

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

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