5

当我使用普通的for循环时,
数组中的所有元素都会正常初始化:

Object[] objs = new Object[10];
for (int i=0;i<objs.length;i++)
        objs[i] = new Object();


但是当我使用 for-each 循环时。
在循环之后,数组元素仍然null是:

Object[] objs = new Object[10];
for (Object obj : objs)
        obj = new Object();


我认为obj是指数组中的特定元素,
所以如果我初始化它,数组元素也会被初始化。
为什么没有发生这种情况?

4

4 回答 4

9

我认为 obj 指的是数组中的特定元素,所以如果我初始化它,数组元素也会被初始化。为什么没有发生这种情况?

不,数组元素obj位于循环体的开头。它不是数组元素变量的别名。所以像这样的循环(对于数组;对于可迭代对象是不同的):

for (Object obj : objs) {
    // Code using obj here
}

相当于:

for (int i = 0; i < objs.length; i++) {
    Object obj = objs[i];
    // Code using obj here
}

有关增强型 for 循环的确切行为的更多详细信息,请参见JLS 的第 14.14.2 节。

于 2013-10-19T08:15:28.803 回答
1
Object[] objs = new Object[10];
for (Object obj : objs)
  obj = new Object();

您已经创建了对象所在的空间,但实际上并未创建对象。如果它们存在(它们还不存在!),这将尝试迭代数组中的对象

Object[] objs = new Object[10];
for (int i=0; i < objs.length; i++)
  objs[i] = new Object();

这是不同的,因为您只是简单地从 0 数到 9,并创建 + 将它们存储在数组中的适当位置。

于 2013-10-19T08:18:38.087 回答
0

您正在将新对象分配给可以在 for 循环之外访问的数组元素(这是一个可以引用对象的变量)。

Object[] objs = new Object[10];
for (int i=0;i<objs.length;i++)
objs[i] = new Object();

但是在每个循环中,您将新对象分配给局部变量(而不是数组元素)

Object[] objs = new Object[10];
for (Object obj : objs){
obj = new Object(); 
}
//obj can not be accessed here

如果我们谈论这条线

     for (Object obj : objs){

那么它的意思就是你将 objs 元素的值赋值给局部变量 obj,它为 null。

于 2013-10-19T08:49:01.837 回答
0

您将新值分配给 'obj' 而不是 'objs' ,因此元素为空。您还必须将值分配给 objs:

    Object[] objs = new Object[10];
    for (int k = 0; k < objs.length; k++) {
        objs[k] = new Object();
        System.out.println(objs[k]);
    }
于 2013-10-19T08:18:35.333 回答