Konstruktoren

Konstruktoren sind spezielle Methoden, die zur Bildung von Objekten der Klasse dienen, in denen sie deklariert sind.

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:

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.