2013-10-19 8 views
6

Wenn ich für-Schleife verwenden, normal,
alle Elemente in einem Array werden normalerweise initialisieren:Warum werden Array-Elemente nicht in einer erweiterten for-Schleife initialisiert?

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


Aber wenn ich eine für-jede Schleife.
Die Arrayelemente sind noch null, nach der Schleife:

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


I obj in einem Array zu einem bestimmten Element verweist gedacht,
so, wenn ich es zu initialisieren, wird das Array-Element sein, initialisiert auch.
Warum passiert das nicht?

Antwort

10

dachte ich obj in einem Array zu einem bestimmten Element bezieht, so wenn ich es zu initialisieren, wird das Feldelement als auch initialisiert werden. Warum passiert das nicht?

Nein, obj hat den Wert des Array-Elements zu Beginn des Körpers der Schleife. Es ist kein Alias ​​ für die Array-Element-Variable. So eine Schleife wie diese (für Arrays, es ist anders für Iterables):

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

entspricht:

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

Siehe section 14.14.2 of the JLS, um weitere Informationen über das genaue Verhalten der for-Schleife verbessert.

+0

Abschnitt 14.14.2 sagt mir nichts darüber, aber Ihre Antwort ist sehr klar, danke! –

+0

Nur um zu überprüfen, bedeutet das noch, dass Methoden auf 'objs [i]' noch durch 'obj' gemacht werden können, indem' obj.method() 'gemacht wird? Da 'obj' auf 'objs [i]' ' – SmRndGuy

+0

@SmRndGuy zeigt: Was meinst du mit" Methoden ... kann man noch machen "? Sie können Methoden immer noch über die Referenz aufrufen, aber der Inhalt des Arrays wird nicht geändert. –

0

Sie vergeben den neuen Wert an 'obj' und nicht an 'objs', daher sind die Elemente null. Sie haben den Wert zuweisen auch objs:

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

Sie den Raum erstellt haben wo die Objekte gehen, aber Sie haben nicht wirklich die Objekte erstellt. Dies wird versuchen, über die Objekte in dem Array zu durchlaufen, wenn sie vorhanden ist (was sie tun noch nicht!)

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

Dies aufgrund der Tatsache, anders ist, dass Sie nur einfach von 0 bis 9 zu zählen, und Erstellen + Speichern an der entsprechenden Stelle im Array.

+0

Ihre Antwort stimmt nicht wirklich mit Jon Skeets Antwort überein, wenn ich richtig verstanden habe. –

+5

Er ist Jon Skeet. Damit kann ich nicht mithalten. – yamafontes

0

Sie ordnen dem Array-Element (welches eine Variable ist, die eine Referenz auf ein Objekt darstellt) ein neues Objekt zu, auf das außerhalb der for-Schleife zugegriffen werden kann.

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

Aber für jede Schleife Sie das neue Objekt in dem lokalen Variable zuweisen (nicht Array-Elemente)

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

und wenn wir sein über diese Linie

 for (Object obj : objs){ 

Dann sprechen bedeutet, dass Sie den Wert von objs-Element auf die lokale Variable obj nehmen, die null ist.