首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: For-Each循环和引用

Java: For-Each循环和引用
EN

Stack Overflow用户
提问于 2012-02-16 12:38:51
回答 7查看 72.2K关注 0票数 16

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

代码语言:javascript
复制
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();
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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。

如果我能把事情弄清楚一点,请告诉我。

票数 15
EN

Stack Overflow用户

发布于 2012-02-16 12:45:24

The short answer:是的,有类似复制的东西正在进行。

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

代码语言:javascript
复制
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循环中设置一个等于某个值的引用不会改变数组的内容。

票数 10
EN

Stack Overflow用户

发布于 2012-02-16 12:48:02

我在每个示例中都添加了注释,以澄清到底是怎么回事。

第一个示例:

代码语言:javascript
复制
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(); 
} 

第二个例子:

代码语言:javascript
复制
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(); 
} 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9305632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档