Inhaltsverzeichnis

Konstruktoren

Wir haben inzwischen schon viele Objekte instanziert, oft auch mit der Angabe von Parametern. Das folgende Programm instanziert beispielsweise ein Objekt der Klasse Rechteck und übergibt die Parameter (50, 50, 400, 300) für die Koordinaten der linken oberen Ecke (50, 50), die Breite (400) und die Höhe (300).

Beim Instanzieren eines neuen Objekts mithilfe des Schlüsselwortes new wird immer eine Methode aufgerufen, die das Objekt initialisiert. Diese Methode wird Konstruktor genannt. Werden zusätzliche Parameter angegeben, z.B. new Rectangle(50, 50, 400, 300), so bekommt der Konstruktor diese als Parameterwerte übergeben.

Wir lernen in diesem Kapitel, wie wir die Konstruktoren unserer Klassen selbst schreiben können.

Beispiel 1: Würfel

Programmiere eine Klasse Würfel, die einen n-seitigen Würfel simuliert. Die Zahl der Seiten soll schon beim Instanzieren mit angegeben werden, ein Hauptprogramm könnte also so aussehen:

Würfel w6 = new Würfel(6);     // Würfel-Objekt mit 6 Seiten
Würfel w20 = new Würfel(20);   // Würfel-Objekt mit 20 Seiten
println(w6.würfle());
println(w20.würfle());

Beispiel 2: Buntstift

Schau' Dir das folgende Beispielprogramm an und überlege Dir, an welchen Stellen des Programms der Konstruktor Buntstift(Color farbe1) aufgerufen wird und welchen Zweck er hat.

Aufgabe

Führe das Programm Schrittweise mit „step into ()“ aus und beobachte, in welcher Reihenfolge die Programmzeilen durchlaufen werden!

Die Definition des Konstruktors der Klasse Buntstift ist in den Zeile 11 - 13 zu finden:

  1. public Buntstift(Color farbe1) {
  2. farbe = farbe1;
  3. }

Eine Konstruktordefinition sieht aus wie die Definition einer „normalen“ Methode, mit zwei Unterschieden:

  • Sie besitzt keinen Rückgabetyp.
  • Ihr Bezeichner stimmt exakt mit dem Bezeichner der Klasse überein.

Findet der Compiler eine Methodendefinition mit diesen Eigenschaften, so erkennt er sie als Konstruktor der Klasse. Beim Instanzieren eines neuen Objekts mittels new (hier: new Buntstift(Color.red)) wird der Konstruktor automatisch ausgeführt. Dabei werden die in Klammern angegebenen Werte (hier: Color.red) als Parameterwerte übergeben.

Im Falle der Klasse Buntstift besitzt die Konstruktordefinition den Parameter Color farbe1. Da der Wert jedes Parameters nach abgeschlosssener Ausführung der Methode verworfen wird (in unserem Fall also dann, wenn der Computer beim Ausführen des Konstruktors in Zeile 13 angelangt ist), müssen wir ihn „retten“, damit er im weiteren Programmverlauf benutzt werden kann. Das machen wir, indem wir ihn in Zeile 12 in das Attribut farbe kopieren:

  1. public Buntstift(Color farbe1) {
  2. farbe = farbe1;
  3. }

Das Schlüsselwort "this"

Hat es Dich gewundert, warum wir den Parameter im Konstruktor oben farbe1 genannt haben und nicht farbe? Probier' im folgenden Kasten mal aus, was passiert, wenn wir ihn einfach umbenennen:

Führe das Programm wieder Schrittweise mit „step into ()“ aus. Verstehst Du, warum es beim Ausführen zum Fehler kommt?

Tipp: Klicke mit der Maus auf den Bezeichner farbe. Alle Vorkommen der Parametervariable werden dann markiert.

Das Problem besteht darin, dass der Parameter farbe jetzt das Attribut farbe überdeckt. Dadurch bewirkt die Anweisung

farbe = farbe;

in Zeile 9, dass der Wert des Parameters farbe mit seinem eigenen Wert überschrieben wird. Der Wert des Attributs farbe wird nicht verändert, bleibt also null und führt so in Zeile 13 zum Fehler.

Wir müssen dem Compiler irgendwie mitteilen, dass der Bezeichner farbe auf der linken Seite der Zuweisung für das Attribut farbe steht, nicht für den Parameter farbe. Dies können wir mithilfe des Schlüsselwortes this erreichen: this steht nämlich immer für dasjenige Objekt, „in dem“ wir uns gerade befinden. Im Bereich Zeile 8 - 10 also für das Objekt, das gerade erzeugt wird. this.farbe ist damit eindeutig dessen Attribut farbe. Wir ersetzen Zeile 9 also durch

this.farbe = farbe;

Klicke im unteren Beispiel auf die verschiedenen Vorkommen des Bezeichners farbe und achte darauf, welche davon jeweils als zusammengehörig markiert werden!

Beispiel 3: Polynomrechner

Die Klasse PolynomZweitenGrades repräsentiert ein Polynom 2. Grades, also einen Term der Form $ax^2+bx+c$. Die Werte für die Konstanten a, b und c werden beim Instanzieren des Objekts dem Konstruktor übergeben und in den entsprechenden Attributen gespeichert, so dass dann in der Methode getWert(double x) für jeden beliebigen Wert von x der Wert des Polynoms berechnet werden kann.

Aufgabe 1: Die Klasse Bruch

Im vorhergehenden Kapitel haben wir eine Klasse zum Bruchrechnen kennengelernt. Erweitere sie um einen Konstruktor, der Zähler und Nenner als Parameter entgegennimmt, so dass man statt

Bruch b1 = new Bruch();
b1.zähler = 3;
b1.nenner = 4;

einfach schreiben kann

Bruch b1 = new Bruch(3,4);

Hier geht's zur Lösung!

Aufgabe 2: Die Klasse Tier

Füge der Klasse Tier aus dem vorangegangenen Kapitel einen Konstruktor hinzu, so dass man das Tier-Objekt zur Katze „Pirat“ mit 3 Beinen folgendermaßen instanzieren kann:

Tier p = new Tier("Katze", "Pirat", 3);

Hier geht's zur Lösung!