我想知道下面的循环是否创建了对象的副本,而不是给我一个对它的引用。原因是,因为第一个示例没有分配我的数组对象,而第二个示例分配了我的数组对象。
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();
}发布于 2012-02-16 12:44:38
Java的工作方式与许多其他语言略有不同。在第一个示例中,o只是对对象的引用。
当您说o = new MyObject()时,它会创建一个MyObject类型的新对象并引用o到该对象,而在o之前引用objects[index]。
也就是说,objectsindex本身只是对内存中另一个对象的引用。因此,为了将objectsindex设置为新的MyObject,您需要更改objectsindex指向的位置,这只能通过使用objectsindex来完成。
图片:(我糟糕的绘画技巧:D)

说明:这大致就是Java内存管理的工作原理。不完全是,无论如何,只是粗略的。您有引用A1的对象。访问对象阵列时,从起点参照点(A1)开始,并向前移动X个块。例如,引用索引1会将您带到B1。然后,B1会告诉您,您正在A2中查找该对象。A2告诉您它有一个位于C2的字段。C2是一个整数,一种基本的数据类型。搜索已经完成。
O不引用A1或B1,而是引用C1或C2。当您说new ...时,它将创建一个新对象并将o放在那里(例如,在插槽A3中)。它不会影响A1或B1。
如果我能把事情弄清楚一点,请告诉我。
发布于 2012-02-16 12:45:24
The short answer:是的,有类似复制的东西正在进行。
长答案:您发布的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();
}如去糖化后的版本所示,在foreach循环中设置一个等于某个值的引用不会改变数组的内容。
发布于 2012-02-16 12:48:02
我在每个示例中都添加了注释,以澄清到底是怎么回事。
第一个示例:
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();
} 第二个例子:
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();
} https://stackoverflow.com/questions/9305632
复制相似问题