2013-10-19 25 views
6

當我使用正常的循環,
陣列中的所有元件,通常會初始化:爲什麼數組元素未在增強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是指特定數組中的元素,
所以如果我初始化中,陣列元件將初始化也是如此。
爲什麼不會發生這種情況?

回答

10

我以爲obj是指數組中的一個特定元素,所以如果我初始化它,數組元素也會被初始化。 爲什麼不會發生這種情況?

否,obj具有在循環體的開始時的數組元素的值。它不是數組元素變量的別名。所以像這樣的循環(對於陣列,它是iterables不同):

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循環的具體行爲的詳細信息,請參見section 14.14.2 of the JLS

+0

14.14.2節沒有告訴我這件事,但你的回答非常清楚,謝謝! –

+0

只是爲了檢查,這仍然意味着'objs [i]'上的方法仍然可以通過'obj'通過執行'obj.method()'來完成嗎?由於'obj'指向'objs [i]' – SmRndGuy

+0

@SmRndGuy:「方法......仍然可以完成」是什麼意思?您仍然可以通過引用調用方法,但不會更改數組的內容。 –

0

您正在將新值分配給'obj'而不是'objs',因此元素爲空。你得值分配也OBJ文件:

Object[] objs = new Object[10]; 
    for (int k = 0; k < objs.length; k++) { 
     objs[k] = new Object(); 
     System.out.println(objs[k]); 
    } 
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不同的是,和創建並將它們存儲在數組中的適當位置。

+0

如果我理解正確,你的答案與Jon Skeet的答案並不吻合。 –

+5

他是Jon Skeet。我無法與之競爭。 – yamafontes

0

您正在將新對象分配給可以在for循環之外訪問的數組元素(這是一個將引用Object的變量)。

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。