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.
如果我能清楚一点,请告诉我.
在简短的回答:是的,有类似副本怎么回事.
该长的答案:您发布的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循环内部内容的引用不会改变数组的内容.
我在每个示例中添加了注释以阐明发生的情况。
第一个例子:
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)
| 归档时间: |
|
| 查看次数: |
59844 次 |
| 最近记录: |