Vertiefung des Theorieteils zu Folge 7

2.3 Arrays, die Objekte speichern

Bisher haben unsere Arrays einfache int-Zahlen gespeichert. Man kann aber auch Objekte in einem Array speichern. Natürlich geht das nur dann, wenn alle Objekte der gleichen Klasse angehören.

Deklaration eines Objekt-Arrays

Wenn man ein einzelnes Objekt, z.B. ein Auto (Folge 4) deklarieren will, so schreibt man bekanntlich:

Auto meinPorsche;

Will man einen Array solcher Objekte deklarieren, schreibt man entsprechend:

Auto[] autos;

Die Zahl der Arrayelemente ist mit dieser Deklaration noch nicht festgelegt. Die Variable autos ist eine Referenz (ein Verweis, Zeiger oder Pointer) auf den eigentlichen Array, der aber noch gar nicht existiert.

Initialisierung eines Objekt-Arrays

Um ein einzelnes Objekt zu initialisieren, schreiben wir:

meinPorsche = new Auto(77000);

Damit wird ein neues Objekt der Klasse Auto erzeugt; beim Erzeugen wird der Konstruktor aufgerufen, und diesem Konstruktor können Parameter übergeben werden wie hier z.B. der Kilometerstand des Fahrzeugs.

Um einen Array aus Objekten zu initialisieren, sind zwei Schritte notwendig. Zunächst wird der Array selbst erzeugt:

autos = new Auto[10];

Damit wird ein Fahrzeugpark aus genau 10 Autos erzeugt - ein Array, der 10 Auto-Objekte umfasst, nämlich autos[0] bis autos[9].

Bei dieser Initialisierung wurden aber noch nicht die Konstruktoren der Klasse Auto aufgerufen. Der Array existiert zwar, aber noch nicht der Inhalt des Arrays, nämlich die zehn Objekte der Klasse Auto. Dazu ist eine for-Schleife gut geeignet:

for (int i=0; i<10; i++)
   autos[i] = new Auto(10000);

So werden zehn Auto-Objekte erzeugt, allerdings alle Autos mit dem gleichen Kilometerstand. Sollen die zehn Auto-Objekte einen unterschiedlichen Kilometerstand haben, so muss jedes Objekt einzeln erzeugt werden:

autos[0] = new Auto(77000);
autos[1] = new Auto(66000);
autos[2] = new Auto(20000);
...
autos[9] = new Auto(120000);

Anders geht es leider nicht.

Zugriff auf Objekte eines Objekt-Arrays

Wir wollen uns jetzt noch ansehen, wie man alle zehn Autos in der Konsole anzeigen lassen kann:

for (int i=0; i<10; i++)
   autos[i].anzeigen();

So einfach geht das - vorausgesetzt, die Klasse Auto stellt ihren Objekten eine anzeigen()-Methode zur Verfügung.

Vertiefung

Das Ganze mit den Autos wollen wir uns noch einmal in einem Objektdiagramm anschauen. Dazu brauchen wir aber erst mal eine übergeordnete Klasse Fahrzeugpark:

public class Fahrzeugpark
{
   Auto[] autos;
   public Fahrzeugpark()
   {
      autos = new Auto[10];
      for (int i = 1; i < 10; i++)
         autos[i] = new Auto(10000);
   }
}

Betrachten wir uns dann ein Objekt park dieser Klasse Fahrzeugpark. Der oberste rote Kasten steht für dieses eine Objekt. Da die Klasse Fahrzeugpark nur ein einziges Attribut hat, nämlich den Array autos, enthält der rote Kasten auch nur ein einziges Attribut. In dem weißen Kasten steht allerdings kein Wert, sondern ein Pfeil, der auf einen weiteren roten Kasten zeigt. Wie bereits im Text gesagt, wird nach der Deklaration eines Arrays noch kein Array erzeugt, sondern die Erzeugung eines Arrays wird lediglich vorbereitet. Zunächst wird nur ein Zeiger (Pointer, Referenz) auf den zu erzeugenden Array bereitgestellt.

Nach der Initialisierung des Arrays ist - bildlich vorgestellt - der zweite rote Kasten vorhanden. Dies ist der eigentliche Array, der hier genau zehn Elemente umfasst. Diese Elemente sind aber auch noch nicht die Objekte, sondern wiederum nur Zeiger auf Objekte. Die Objekte selbst existieren noch nicht. Dazu muss erst jedes Objekt einzeln erzeugt werden. Im Konstruktor der Klasse Fahrzeugpark geschieht dies in einer for-Schleife. Nach dem Durchlaufen der for-Schleife existieren dann zehn Objekte der Klasse Auto, von denen in dem Objektdiagramm aber aus Platzgründen nur drei berücksichtigt sind.

Durch die Initialisierung in der for-Schleife haben alle zehn Objekte am Anfang natürlich die gleichen Attributwerte und damit den gleichen Status.

Mit dem BlueJ-Objektinspektor kann man nachprüfen, dass die im Objektdiagramm gezeigten Beziehungen tatsächlich so existieren!

Übungen

Übung 7.2 (4 Punkte)

In der alten Version des BlueJ-Kurses mussten meine Schüler(innen) ein Abenteuer-Spiel programmieren. In der jetzigen Version ist das Abenteuer-Spiel nur noch ein Exkurs für besonders schnelle Schüler(innen). Ich werde mir erlauben, für diese Aufgabe einmal das Spiel zu "plündern" (dabei aber auch zu vereinfachen).

In dem Spiel soll es folgende Klassen geben:

Klasse Gegenstand mit den Attributen bezeichnung, angriffswert, verteidigungswert und goldwert. Das erste Attribut ist vom Typ String, die anderen sind vom Typ int.

Klasse Inventar mit den Attributen anzahl und liste. Das Attribut anzahl ist vom Typ int, das Attribut liste vom Typ Gegenstand[ ], es handelt sich also um einen Array von Gegenständen. Maximal soll das Inventar zehn Gegenstände fassen können.

Klasse Held mit den Attributen name, leben und rucksack. Das Attribut name ist vom Typ String, das Attribut leben vom Typ int, und das Attribut rucksack ist ein Objekt der Klasse Inventar.

Kommen wir nun zu Ihrer Aufgabe.

Zeichnen Sie ein Objektdiagramm, das folgende Situation darstellt: Der Held, sein Name ist übrigens "Anton", hat 10 Lebenspunkte und einen Rucksack, der drei Gegenstände enthält. Die Namen und Attributwerte der drei Gegenstände dürfen Sie sich selbst ausdenken. Lassen Sie sich Zeit mit dem Zeichnen, auch die äußere Form wird bewertet (Lineal verwenden, Farben einsetzen).



Übung 7.3 (4 Punkte)

In der Folge 5 haben Sie sich mit Java-Applets befasst, in der Folge 6 sogar mit der Programmierung eines kleinen Roboters, der durch Buttons gesteuert wird.

Schreiben Sie ein Java-Applet mit 25 Buttons (Anordnung 5 x 5), die mit den Zahlen von "1" bis "25" beschriftet sind. Natürlich sollen Sie nicht 25 einzelne Buttons deklarieren und initialisieren, sondern einen Array aus 25 Button-Objekten. Je kürzer Ihr Quelltext, desto besser.

So könnte Ihr Applet z.B. aussehen.

Übung 7.3 - Ergänzung (2 Punkte)

Erweitern Sie das Applet aus Übung 7.3 so, dass die Buttons angeklickt werden können. Anschließend soll die paint()-Methode mit g.drawString() anzeigen, welcher der 25 Buttons angeklickt wurde.



Zurück zum Theorieteil

Diese HTML-Seite wurde erstellt von Ulrich Helmich am 26. September 2006 und geringfügig überarbeitet am 3. Februar 2008.

(C) Ulrich Helmich, Februar 2008





IMPRESSUM