我最近了解到你无法在Java中使用增强的for循环来初始化对象,因为增强的for循环的工作方式是通过从对象创建“虚拟”对象然后使用虚拟对象执行任何代码状态
但这促使我尝试使用增强的for循环更改对象内的字段变量,并且令人惊讶的是代码更改了对象中的字段变量。任何人都可以向我解释这是如何工作的,因为根据我的理解,对象不会发生任何变化,原因与您无法使用增强的for循环初始化对象相同。显然,我在这里的理解中暴露了一个空白,所以任何人都可以帮助我
答案 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
中对象引用所引用的同一对象。