Konstruktoren
Konstruktoren sind spezielle Objektmethoden einer Klasse. Sie dienen der Erzeugung bzw. Initialisierung eines Objekts: Komplexe Klassen, in denen verschiedene Attribute verwaltet werden, sollten bereits unmittelbar nach der Erzeugung mit Hilfe des new-Operators in einem "gültigen" Zustand sein. Was aber ist ein "gültiger" Zustand? Per Konvention ließe sich bspw. für Zahlen ein solcher festlegen (immer 0), ebenfalls für Boolean-Objekte (immer false), bei komplexeren Objekten ist dies jedoch nicht ausreichend. Zur Lösung dieses Problems wurden Konstruktoren konzipiert.
Beispiel:
Bei der Objekterzeugung mit new wird ein Konstruktor der angegebenen Klasse aufgerufen, und zwar derjenige, der zur angebenenen Parameterliste paßt.
Bei Eintritt in den Körper des Konstruktors ist das Objekt im Speicher angelegt und seine Attribute sind mit dem Defaultwert des jeweiligen Typs initialisiert (0, null, false, ...).
Die Definition eines Konstruktors muss folgende Anforderungen erfüllen:
- Ein Konstruktor trägt den Namen der Klasse.
- Er darf nicht als static oder final deklariert werden.
- Ein Konstruktor darf nur in Objekterzugungsausdrücken mit dem new-Operator benutzt werden.
- Eine Klasse kann mehrere Konstruktoren haben. Diese müssen sich in ihrer Signatur unterscheiden (Anzahl und/oder Typ der Parameter).
- Wenn der Programmierer in einer Klasse KlasseAbc gar keinen Konstruktor definiert, ergänzt der Compiler automatisch den sogenannten Default-Konstruktor, das ist der Konstruktor mit leerer Parameterliste, der bisher verwendet wurde ( bspw. new Student() ...).
Definiert der Programmierer dagegen einen Konstruktor, etwa einen anderen als den Default-Konstruktor, so ergänzt der Compiler nicht mehr den Default-Konstruktor, was bei obigem Objekterzeugungsausdruck zu einem Syntaxfehler führt: "Kein passender Konstruktor definiert." o.ä.
Bei einfachen Klassen, deren Objekte keiner besonderen Initialisierung bedürfen, soll man sich nicht die Mühe machen müssen, einen leeren Konstruktor hinschreiben zu müssen. Bei komplexen Klassen kann es dagegen sein, daß nur Konstruktoren mit Parametern für eine sinnvolle Initialisierung der Objekte geeignet sind und daher der Default-Konstruktor fehl am Platz wäre.
Zwar gäbe es als Alternative zum Konstruktor-Konzept auch die Möglichkeit, eine init()-Methode o.ä. anzubieten, die vom Programmierer aufgerufen wird und die das Objekt in einen gültigen Zustand bringt, doch hat diese Variante den Nachteil, dass sie fehleranfälliger ist (weil der Aufruf der Methode vergessen werden kann) und dass die Namensgebung problematisch sein kann (init() oder initialize() oder initialisiere() ???).