Lernpfad:Einführung in Git/11

Aus Informatik-Box
Zur Navigation springen Zur Suche springen

Objektarrays

Arrays können nicht nur primitive Datentypen speichern, sondern auch 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 beispielsweise folgendes Array erzeugen:

Java Objektarray.jpg

Eine Änderung an dem Objekt r1 kann hier mit wuerfel[1] oder wuerfel[4] erfolgen.

Umgang mit Nullreferenzen

Im Gegensatz zu primitiven Datentypen haben Objektreferenzen null als Initialwert. Das bedeutet, ein Objektarray enthält zu Beginn nur 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();
    }
}
BlueJ Logo.png
Arbeitsauftrag
  1. Erstelle einen Fork des Projekts "arrays2" und öffne es in BlueJ.
  2. Analysiere die Methode public void objectArrayExample() und führe sie aus.
  3. Implementiere die Methoden public void rollAll(Wuerfel[]) und public int diceSum(Wuerfel[]).


Mehrdimensionale Arrays

Da ein Array-Element auch ein komplexer Datentyp sein kann, kann jedes Array-Element auch selber wieder ein Array sein. Das erlaubt die Erzeugung zwei-, drei, oder n-dimensionaler 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 Zählschleifen ineinander.

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

for( int i = 0; i < zweidim .length; i++ ) {
    String[] innerArray = zweidim [i];
    if( innerArray != null ) { // Notwendig, falls inneres Array noch nicht initialisiert
        for( int j = 0; j < innerArray.length; j++ ) {
            innerArray[j] = "(" + i + "," + j + ")";
        }
    }
}

Der Quelltext erzeugt die folgende Tabelle/Matrix mit 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)"
BlueJ Logo.png
Arbeitsauftrag
  1. Implementiere die Methoden public void twoDimRoll(Wuerfel[][]) und public int twoDimSum(Wuerfel[][]).
  2. Implementiere die Methode public int[] rowSum(Wuerfel[][]).