2013-10-19 6 views
6

ı-döngü, normal kullanımı,
tüm elemanlar, normal olarak başlatılır:Neden gelişmiş öğeler için geliştirilmiş bir döngü içinde başlatılmaz? Bir dizideki

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


Ama için-her döngü kullandığınızda.
dizi elemanları döngü sonra, hala null vardır: I başlatmak eğer obj düşünce

bir dizi içinde özel bir element anlamına gelir

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


,
nedenle, dizi elemanı olacak de başlatıldı.
Bu neden oluyor?

cevap

10

Diz, dizisindeki belirli bir öğeyi ifade eder diye düşünürsem, eğer onu başlatırsam dizi öğesi de başlatılır. Bu neden oluyor?

Resim, obj döngünün gövdesi başlangıcında dizi elemanının değeri sahiptir. Dizi öğesi değişkeni için diğer adı değil. Yani böyle bir döngü (diziler için, aynı Iterables için farklı):

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

döngü için geliştirilmiş tam davranışının daha fazla ayrıntı için section 14.14.2 of the JLS bakınız:

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

denk mi.

+0

Bölüm 14.14.2 bu konuda hiçbir şey söylemiyor ama cevabınız çok açık, teşekkürler! –

+0

Sadece kontrol etmek için, bu hala obj [i] 'deki metodlar anlamına gelir mi? Obj.method()' yaparak? 'Obj' objs [i] ' – SmRndGuy

+0

@ SmRndGuy'a işaret ettiğinden:" Yöntemler hala yapılabilir "ile ne demek istiyorsun? Referans yoluyla yine de yöntemleri çağırabilirsiniz, ancak dizinin içeriğini değiştirmez. –

0

Yeni değeri "obje" ye değil, 'objeye' atayacaksınız, dolayısıyla öğeler boş. Sen nesneleri gidecek boşluk oluşturduk

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(); 

, ama aslında nesneleri yaratmadıysanız: Ayrıca OBJS değer atamak zorundayız. Bu Bunun nedeni sadece basitçe 0'dan 9'a kadar sayıyorsanız gerçeğine farklıdır

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

(! Onlar henüz yok) Varsa dizide nesneler üzerinde yineleme deneyin ve edecek bunları dizide uygun noktaya yerleştirmek + saklamak.

+0

Cevabınız doğru anlaşılırsa Jon Skeet'in cevabıyla gerçekten uyuşmuyor. –

+5

O Jon Skeet. Bununla rekabet edemiyorum. – yamafontes

0

Dizi nesnesine yeni bir nesne atamaktasınız (Bu, bir Nesne referansı olabilecek bir değişkendir) ve bunun için döngü dışında erişilebilir.

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

Ama her döngü için yerel değişkene yeni nesneyi atamayacaksanız içinde

(değil dizi elemanları)

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

ve biz bu hat hakkında konuşursak

 for (Object obj : objs){ 

Sonra onun demektir, objs öğesinin değerini, null olan yerel değişken objesine alıyorsunuzdur.

İlgili konular