Professional Documents
Culture Documents
Constructors in JAVA
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.
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