Konstruktoren
Ein Objekt wird durch Aufruf eines Konstrukors mit new
gebildet. Bei folgendem Beispiel speichert die Variable konst
nach Ausführen des Ausdrucks ein Objekt vom Typ KonstuktorClass
.
KonstruktorClass konst = new KonstruktorClass();
An den runden Klammern erkennt man unschwer, dass es sich um
einen speziellen Methodenaufruf handelt, der sich von anderen
Methodenaufrufen durch das Schlüsselwort new
und den groß geschriebenen Bezeichner unterscheidet. Die
Ursache dafür liegt darin, dass er zwingend mit dem Namen
der Klasse identisch sein muss, in der er deklariert wurde und
deren Objekte er bildet. Ein Konstruktor wird außerhalb
einer Klasse nie direkt, sondern ausschließlich mit
vorangestelltem new
aufgerufen. Innerhalb der
eigenen Klasse kann ein Konstruktor mit dem Schlüsselwort this
angesprochen werden (s.u.).
Eine Klasse kann, analog zur Methodenüberladung, keinen,
einen oder mehrere unterschiedliche Konstruktoren besitzen. Sie
dienen neben der Objektbildung selbst dazu, es in einen
definierten Anfangszustand zu versetzen. Ein Konstruktor kann
mit oder ohne Parameterliste deklariert sein.
Wird lediglich
ein leerer (sog. Standard-) Konstruktor ohne
Parameterübergabe benötigt, so muss dieser nicht
ausdrücklich angegeben werden. Er wird bei Fehlen vom
Compiler automatisch erzeugt. Allerdings ist dies nur der Fall,
solange kein weiterer Konstruktor der Klasse deklariert wurde.
Wird umgekehrt neben weiteren Konstruktoren auch ein leerer
Standardkonstruktor benötigt, so muss dieser explizit
angegeben werden.
public class KonstruktorClass {
private int x;
// Standardkonstruktor
public KonstruktorClass() {
}
// zweiter Konstruktor
public KonstruktorClass(int i){
this.x=i;
}
}
Das Beispiel zeigt eine Klasse mit zwei Konstruktoren. Der erste
ist ein Standardkonstruktor, der bei Bildung des Objektes die
Variable x
uninitialisiert belässt. Der zweite
bewirkt auch die Initialisierung dieser Instanzvariablen. Soll
also ein Objekt der Klasse KonstruktorClass
erzeugt
werden, kann dies ohne oder mit Angabe eines Anfangswertes
für die Instanzvariable x
geschehen. Es kann
somit folgendermaßen erfolgen:
KonstruktorClass konst = new KonstruktorClass();
oder:
KonstruktorClass konst = new KonstruktorClass(2);
Konstruktoren müssen einigen Regeln folgen:
- Sie tragen immer den Namen der Klasse.
- Sie können überladen werden (mehrere Konstruktoren, s.o.).
- Sie besitzen keinen Rückgabewert.
- Rufen sie ihrerseits keinen anderen Konstruktor auf, werden
sie vom Compiler um den Aufruf des Konstruktors der
Basisklasse
super()
erweitert.
Da sie von außen erreichbar sein müssen, mag man
vermuten, dass Konstruktoren immer public
deklariert werden. Dies ist im 'Normalfall' auch so. Es gibt
jedoch auch Ausnahmen. Ein Beispiel dafür ist der
Konstruktor eines Singletons,
der private
deklariert und über eine statische
Methode aufgerufen wird. Siehe hierzu den Artikel unter →
Design Patterns/Singleton-Pattern.
Wechselseitiger Konstruktorenaufruf
Konstruktoren können sich innerhalb einer Klasse auch
wechselseitig aufrufen. Das ist in der Java-Standardbibliothek
weit verbreitet. Als Beispiel sei ein Ausschnitt der Klasse java.awt.Rectangle
angeführt, deren Objekte ein Rechteck definierter
Größe an einer bestimmten Position
repräsentieren. Bei der Erzeugung des Objektes müssen
diese Werte somit angegeben werden.
//... int x, y, width, height; //... public Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } //... public Rectangle(int width, int height) { this(0, 0, width, height); }
Beim ersten Konstruktor enthalten die Parameter x, y
die Werte für die Position und width, height
diejenigen für die Größe des Rechtecks. Die
Parameterwerte werden innerhalb des Konstruktors an die
entsprechenden Instanzvariablen übergeben.
Man erkennt
hier das Prinzip: Im zweiten Konstruktor wird der erste
über das Schlüsselwort this
aufgerufen
(Die eindeutige Parameterliste sorgt für die Ansprache des
korrekten Konstruktors.). Von dessen vier Parametern werden die
ersten beiden, die Position des Rechtecks, mit den konstanten
Werten 0, 0
belegt, an die letzten beiden werden
die übergebenen Parameter für Breite und Höhe
direkt weitergereicht. Die eigentliche Objektbildung geschieht
also durch den ersten Konstruktor, auf den durch den zweiten
verwiesen wird. Bei Nutzung des zweiten Konstruktors wird ein
Rechteck an einer Standardposition gebildet, bei Nutzung des
ersten, kann diese je nach Bedarf vorgegeben werden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.