Lernpfad:Objektorientierte Programmierung mit Java/Komplexe Arrays: Unterschied zwischen den Versionen

Aus Informatik-Box
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
Zeile 14: Zeile 14:
</syntaxhighlight>
</syntaxhighlight>


Der gezeigte Quelltext würde beispielsweise folgendes Array erzeugen:
Der gezeigte Quelltext würde etwa folgendes Array erzeugen:


[[Datei:Java Objektarray.jpg|center|600px]]
[[Datei:Java Objektarray.jpg|center|600px]]

Aktuelle Version vom 7. Februar 2022, 23:36 Uhr

Objektarrays

Arrays können nicht nur primitive Datentypen speichern, sondern auch komplexe Typen - also Objekte. Jedes Element ist dann eine Referenz auf eine Objektinstanz der deklarierten Klasse. Dabei können einzelne Indizes des Arrays auch auf dasselbe Objekt referenzieren. Ein Array ist aber auf Objekte einer Klasse beschränkt, die bei der Deklaration angegeben werden muss.

Random[] wuerfel = new Random[6];
wuerfel[4] = new Random();
wuerfel[0] = new Random();
wuerfel[2] = new Random();
wuerfel[1] = wuerfel[4];
wuerfel[3] = wuerfel[2];

Der gezeigte Quelltext würde etwa folgendes Array erzeugen:

Java Objektarray.jpg

Eine Änderung an dem Objekt r1 kann hier mit wuerfel[1] oder wuerfel[4] erfolgen. Der Inhalt des Index 5 ist null, da noch keine Objektinstanz zugewiesen wurde.

Umgang mit Nullreferenzen

Im Gegensatz zu Variablen werden die Inhalte eines Objektarrays mit dem Wert null initialisiert, auch, wenn noch keine Zuweisung stattgefunden hat.

// Objektreferenzen
Random zufall;
zufall.nextInt(); // Fehler: variable zufall might not have been initialized

Random zufall2 = null;
zufall2.nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "zufall2" is null

Random zufall3 = new Random();
zufall3.nextInt(); // Funktioniert

// Objektarrays
Random[] wuerfel;
wuerfel[0].nextInt(); // Fehler: variable wuerfel might not have been initialized

Random[] wuerfel2 = new Random[2];
wuerfel2[0].nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "wuerfel2[0]" is null

Random[] wuerfel3 = new Random[2];
wuerfel3[0] = new Random();
wuerfel3[0].nextInt(); // Funktioniert

Das bedeutet, ein Objektarray enthält zu Beginn überall den Wert null. Wird ein Index nicht mit einer Objektreferenz initialisiert, dann bleibt dort immer der Wert null gespeichert. (Im Beispiel oben der Index 5.)

Wenn du nun mit einer Zählschleife über ein Objektarray iterierst, dann musst du vor dem Zugriff auf das Objekt prüfen, ob überhaupt ein Objekt vorhanden ist, oder nur null.

for(int i = 0; i < wuerfel.length; i++) {
    Wuerfel w = wuerfel[i];
    if( w != null ) {
        w.werfen();
    }
}

Mehrdimensionale Arrays

Da ein Array selbst auch ein komplexer Datentyp ist, kann jedes Element in einem Array auch selber wieder ein Array sein. Das erlaubt die Erzeugung von zwei-, drei, oder n-dimensionalen Arrays.

int[][][] dreidim = new int[3][3][3];
dreidim[0][0][0] = 1;
dreidim[1][0][2] = 2;
dreidim[2][2][2] = 3;

Bei bis zu drei Dimensionen kann man sich das Array noch gut vorstellen (zweidimensional: Tabelle, dreidimensional: Würfel), aber ab vier Dimensionen wird die Handhabung sehr kompliziert. Arrays mit mehr als drei Dimensionen setzt man daher nur in Spezialfällen ein.

Über ein mehrdimensionales Array iterieren

Um über Arrays mit mehreren Dimensionen zu iterieren, nutzt du mehrere ineinander verschachtelte Zählschleifen.

String[][] zweidim = new String[4][4];

for( int i = 0; i < zweidim.length; i++ ) {
    String[] innerArray = zweidim[i];
    for( int j = 0; j < innerArray.length; j++ ) {
        innerArray[j] = "(" + i + "," + j + ")";
    }
}

Der Quelltext erzeugt die folgende Matrix an Strings:

0 1 2 3
0 "(0,0)" "(1,0)" "(2,0)" "(3,0)"
1 "(0,1)" "(1,1)" "(2,1)" "(3,1)"
2 "(0,2)" "(1,2)" "(2,2)" "(3,2)"
3 "(0,3)" "(1,3)" "(2,3)" "(3,3)"