Java:For-Each循环和引用

rhu*_*hes 14 java loops for-loop object

我想知道以下循环是否创建了对象的副本,而不是给我一个对它的引用.原因是,因为第一个例子没有分配我的数组对象,但是第二个例子没有.

MyObject objects[] = new MyObject[6];
for (MyObject o: objects) {

    o = new MyObject();
}

MyObject objects[] = new MyObject[6];
for(int i = 0; i < objects.length; i++) {

    objects[i] = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*mos 15

Java的工作方式与许多其他语言略有不同.什么o是在第一实施例简单地是对对象的引用.

当你说o = new MyObject(),它会创建一个MyObject类型的新Object并引用o该对象,而在o引用之前objects[index].

也就是说,objects [index]本身只是对内存中另一个对象的引用.因此,为了将对象[index]设置为新的MyObject,您需要更改对象[index]指向的位置,这只能通过使用对象[index]来完成.

图片:(我糟糕的油漆技巧:D)

在此输入图像描述

说明:这大致是Java内存管理的工作原理.无论如何,不​​完全是粗略的.你有对象,引用A1.当您访问对象数组时,从开始参考点(A1)开始,然后向前移动X块.例如,引用索引1会将您带到B1.B1然后告诉你,你正在A2寻找对象.A2告诉你它有一个位于C2的字段.C2是整数,基本数据类型.搜索完成.

o不引用A1或B1,而是引用C1或C2.当你说new ...,它将创建一个新对象并放在那里(例如,在插槽A3中).它不会影响A1或B1.

如果我能清楚一点,请告诉我.


Ada*_*cin 9

简短的回答:是的,有类似副本怎么回事.

长的答案:您发布的Java的foreach循环是语法糖

MyObject objects[] = new MyObject[6];

Iterator<MyObject> it = objects.iterator();
while (it.hasNext()) {
   MyObject o = it.next();
   // The previous three lines were from the foreach loop

   // Your code inside the foreach loop
   o = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

正如desugared版本所示,设置一个等于foreach循环内部内容的引用不会改变数组的内容.


Igo*_*sky 5

我在每个示例中添加了注释以阐明发生的情况。

第一个例子:

MyObject objects[] = new MyObject[6]; 
for(MyObject o: objects) { 

    // Construct a new object of type MyObject and assign a reference to it into 
    // the iteration variable o. This has no lasting effect, because the foreach
    // loop will automatically assign the next value into the iteration variable
    // in the the next iteration.
    o = new MyObject(); 
} 
Run Code Online (Sandbox Code Playgroud)

第二个例子:

MyObject objects[] = new MyObject[6]; 
for(int i = 0; i < objects.length; i++) { 

    // Construct a new object of type MyObject and store a reference to it into the
    // i-th slot in array objects[]:
    objects[i] = new MyObject(); 
} 
Run Code Online (Sandbox Code Playgroud)