在foreach循环中Java的微妙之处

时间:2012-04-28 10:02:38

标签: java for-loop iterator

如果我有一个二维数组的对象,并想要将它们全部初始化,我会调用一个循环,例如:

for(int i=0; i<len; i++)
    for(int j=0; j<len; j++)
        objects[i][j] = new MyObject();

哪个工作正常,但当我尝试使用for-each结构时,它不起作用,整个数组保持为空:

for(MyObject[] intermediate: objects)
    for(MyObject obj: intermediate)
        obj = new MyObject();

他们为什么表现不同?

3 个答案:

答案 0 :(得分:4)

分配

obj = new MyObject();

只需在变量obj中设置一个新对象,并且不会更改数组中的值,它只会更改引用变量obj

如果objects[i][j]obj限制,然后您更改obj的值,而不更改实际数组,则会发生什么。

直接分配到objects[i][j]时 - 它按预期工作,因为您更改了objects[i][j]的值,这正是您想要做的。

答案 1 :(得分:3)

引用按值传递,因此obj = new MyObject();仅更新您对objects[i][j]的引用的本地副本。

答案 2 :(得分:1)

它只适用于外部循环,因为有新的引用,但不是深层引用:

public static void main (String[] args ) {
    Integer [][] iaa = new Integer[3][4];
    for (Integer[] ia : iaa) {
        for (int i = 0; i < ia.length; ++i) {
            ia[i] = i; 
        }
    }
}