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:
public Buntstift(Color farbe1) { farbe = farbe1; }
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:
public Buntstift(Color farbe1) { farbe = farbe1; }
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);
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);