You are on page 1of 2

Constructors in Java

1. Ein Konstruktor ist eine besondere Art von (Instanz-)Methode, deren Name genau
der Name der Klasse ist, in der der Konstruktor steht.
2. Im Konstruktorkopf sind Ergebnistyp und Methodenname zu einem Wort verschmol-
zen, d.h. der Name der Klasse dient gleichzeitig als Konstruktor-(Methoden-)name
und als Ergebnistyp der Methode.
3. Ein Konstruktor hat die Aufgabe, ein Objekt (eine Instanz) eines Referenztyps zu
erzeugen, d.h. für eine Instanz dieser Klasse im Heap Speicher (für alle (von den Su-
perklassen geerbten und alle neu hinzugekommenen eigenen) Instanzvariablen sowie
für weitere Daten, z.B. Informationen zum Typ des Objekts, Zugang zur Methoden-
Tabelle) zu beschaffen und diesen Speicherblock vollständig zu initialisieren.
4. Da Java für Instanzvariablen grundsätzlich immer eine Initialisierung vorsieht (im-
plizit auf Werte, die einer Kodierung durch Null-Bits entspricht), haben alle dyna-
misch erzeugten Objekte von Anfang an einen definierten Speicherzustand — im
Gegensatz zu nicht innerhalb ihrer Variablendeklaration initialisierten lokalen (d.h.
in einer Methode deklarierten) Variablen; für Stack-Variablen gibt es also keine
Default-Initialisierung.
5. Ein Konstruktor liefert eine Referenz auf das von ihm erzeugte Objekt, welches wie
in normalen Instanzmethoden für die Dauer der Ausführung des Konstruktors das
this-Objekt ist.
6. Durch Überladung des Konstruktor-/Klassennamens können innerhalb einer Klas-
se mehrere Konstruktoren mit unterschiedlichen Parametertyplisten existieren.
7. Jeder Konstruktor enthält maximal einen super(...); oder einen this(...); –
Aufruf; falls ein solcher existiert, muss er die erste Anweisung im Rumpf des Kon-
struktors sein.
8. Wenn die erste Anweisung im Rumpf eines Konstruktors weder ein super(...);
noch ein this(...); –Aufruf ist, so generiert der Java-Compiler automatisch den
Aufruf super(); des parameterlosen Konstruktors der Superklasse, welcher, falls
dort kein Konstruktor definiert ist, der vom Java-Compiler implizit zur Verfügung
gestellte Default-Konstruktor der Superklasse ist.
9. Wenn die erste Anweisung im Rumpf eines Konstruktors ein super(...); –Aufruf
ist, so wird der Konstruktor mit der passenden Parametertypliste in der Super-
klasse aufgerufen; dieser führt alle Initialisierungen seiner (eigenen und geerbten)
Instanzvariablen durch.
10. Wenn die erste Anweisung im Rumpf eines Konstruktors ein this(...); –Aufruf
ist, wird ein anderer Konstruktor in derselben Klasse mit der passenden Parameter-
typliste aufgerufen, wobei jede Art von (direkter oder indirekter) Rekursion verboten
ist, da dies unweigerlich zu unendlicher Rekursion führen würde (wenn this(...);
immer an erster Stelle stehen muss, kann keine Abbruchbedingung dazwischenge-
schoben werden).
11. Aus dem zuletzt Gesagten folgt, dass jede Klasse mindestens einen Konstruktor
mit einem super(...); –Aufruf enthalten muss (bei Klassen ohne explizite Kon-
struktordefinition erledigt dies der Default-Konstruktor) und dass jede Folge von
this(...); –Aufrufen letztlich einen Konstruktor erreicht, der einen super(...);
–Aufruf durchführt. Folglich wird aus jeder Klasse der Klassenhierarchie oberhalb
der Klasse, deren Konstruktor aufgerufen wurde (bis hinauf zur Urklasse Object)
mindestens ein Konstruktor aufgerufen (dies nennt man Constructor Chaining).

12. Diese Java-spezifischen Regeln garantieren, dass die Initialisierung der Instanzva-
riablen in der Reihenfolge ihres Auftretens innerhalb der Klassenhierarchie (von der
Klasse Object nach unten bis zur Klasse des aufgerufenen Konstruktors) erfolgt, so
dass jede Klasse die von ihren Superklassen durchgeführten Initialisierungen beliebig
verwenden und revidieren kann (da der eigentliche Konstruktor-Code, der ja nach
dem this- oder super-Aufruf stehen muss, erst ausgeführt wird, wenn alle aufgeru-
fenen Konstruktoren dies bereits getan haben) — falls die geerbten Instanzvariablen
nicht private sind.

13. Enthält eine Klasse keine einzige Konstruktordefinition, so stellt der Java-Compiler
automatisch einen sogenannten Default-Konstruktor zur Verfügung, welcher pa-
rameterlos ist und wiederum den Default-Konstruktor seiner Superklasse aufruft.

14. Sobald in einer Klasse mindestens eine Konstruktordefinition existiert, stellt das
System nicht automatisch einen Default-Konstruktor zur Verfügung, d.h. bei Bedarf
muss man selbst einen parameterlosen Konstruktor schreiben.

15. Konstruktoren werden im Gegensatz zu normalen Instanzmethoden nicht vererbt


(da der Name eines Konstruktors ja explizit die Klasse benennt, in der der Kon-
struktor aufgerufen werden soll), sind aber wie oben beschrieben über den Aufruf
super(...); von ihren Subklassen aus erreichbar.

16. Syntaktisch steht direkt vor einem Konstruktoraufruf immer der new-Operator, z.B.
Sohn sref = new Sohn();
Vater vref = new Sohn(); // Vater ist Superklasse von Sohn

Laufzeitvorgang beim Erzeugen einer Klassen-Instanz


1. Speicherbeschaffung Beschaffung eines ausreichend großen Speicherblocks (im Heap)
für alle (von den Superklassen geerbten und alle in der Klasse hinzugekommenen)
Instanzvariablen sowie für den Zugang zur Methoden-Tabelle und weitere Informa-
tionen zum Typ des Objekts,

2. Default-Initialisierung Initialisierung aller Instanzvariablen mit den aus einer Ko-


dierung mit Null-Bits resultierenden Werten (0, 0L, ’\u0000’ , 0.0F, 0.0D, false
für primitive Typen, null für Referenztypen) bzw. mit den evtl. in den Typdekla-
rationen der Instanzvariablen angegebenen Initialwerten,

3. Initializer-Blöcke Abarbeitung aller nicht-statischen Initialisierungsblöcke (das sind


in { und } eingeschlossene Codestücke außerhalb von Methoden) in der Reihenfolge
ihres Auftretens in der Klasse,

4. Constructor Chaining Eigentliche Ausführung des Konstruktors in der oben be-


schriebenen Weise: der auf den this- oder super-Aufruf folgende Code wird immer
zuletzt, also erst nach Abarbeitung der ganzen Kette aufgerufener Konstruktoren,
ausgeführt.

You might also like