Menu

Java-Konstruktoren: Objekte mit new initialisieren

Wie Java-Konstruktoren funktionieren: der Standardkonstruktor, parametrisierte Konstruktoren, this, Konstruktor-Überladung und Verkettung mit this() und super().

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Warum es Konstruktoren gibt

Auf der vorherigen Seite hast du Klassen erstellt und Objekte mit new erzeugt. Ein Konstruktor ist der Code, der während dieses new-Aufrufs tatsächlich ausgeführt wird. Sein einziger Zweck ist es, dir ein einsatzbereites Objekt zurückzugeben – alle erforderlichen Felder gesetzt, kein halb initialisierter Zustand.

Ein Konstruktor sieht aus wie eine Methode, mit zwei Unterschieden: Er trägt den gleichen Namen wie die Klasse und hat keinen Rückgabetyp – nicht einmal void.

new Point(3, 4) reserviert das Objekt und führt dann den Konstruktorrumpf mit x = 3 und y = 4 aus. Wenn new zurückkehrt, ist p vollständig initialisiert.

Das Schlüsselwort this

Im Konstruktor oben heißen die Parameter x und y – genauso wie die Felder. this.x bedeutet „das Feld x, das zu diesem Objekt gehört", während ein einfaches x den Parameter meint. Ohne this würde x = x lediglich den Parameter sich selbst zuweisen und das Feld unberührt lassen.

Du brauchst this nur, wenn ein Parameter ein Feld verdeckt, doch viele verwenden es der Klarheit halber überall. Der häufige Fehler besteht darin, es bei gleichen Namen zu vergessen: Der Code kompiliert, läuft und lässt deine Felder stillschweigend auf ihren Standardwerten (null, 0, false).

Der Standardkonstruktor

Wenn du nie einen Konstruktor schreibst, stellt Java unauffällig einen Standardkonstruktor bereit: einen öffentlichen, argumentlosen Konstruktor, der nichts Zusätzliches tut. Deshalb funktionierte new bei Klassen, die gar keinen Konstruktor hatten.

Der Haken: Sobald du irgendeinen Konstruktor schreibst, ist der geschenkte weg.

class Box {
    int size;

    Box(int size) {       // jetzt gibt es KEINEN argumentlosen Konstruktor
        this.size = size;
    }
}

new Box();   // Kompilierfehler: es existiert kein Konstruktor Box()

Wenn new Box() trotzdem funktionieren soll, deklariere den argumentlosen Konstruktor selbst:

Konstruktor-Überladung

Eine Klasse kann mehrere Konstruktoren haben, solange sich ihre Parameterlisten unterscheiden – das ist einfach Methodenüberladung, angewendet auf Konstruktoren. Jeder bietet eine andere Möglichkeit, das Objekt zu erstellen.

Java wählt anhand der Anzahl und der Typen der Argumente, die du an new übergibst, den passenden Konstruktor aus.

Verkettung mit this()

Beachte die Duplizierung oben: Jeder Konstruktor weist die Felder selbst zu. Das kannst du vermeiden, indem ein Konstruktor mit this(...) einen anderen aufruft. Der Aufruf muss die erste Anweisung im Konstruktor sein.

Nun liegt die eigentliche Initialisierung an einer einzigen Stelle. Die kleineren Konstruktoren füllen nur die Standardwerte ein und reichen die Arbeit weiter. Wenn du jemals versuchst, eine Anweisung vor this(...) zu setzen, weist der Compiler sie zurück.

Konstruktoren und super()

Jeder Konstruktor ruft implizit zuerst den Konstruktor seiner Oberklasse auf. Wenn du nichts schreibst, fügt Java ein verstecktes super() (den argumentlosen Konstruktor der Oberklasse) am Anfang des Rumpfs ein. Damit wirst du direkt arbeiten, sobald du beginnst, Unterklassen zu bilden – das ist das nächste Thema.

class Animal {
    String name;
    Animal(String name) { this.name = name; }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);   // hier muss der Konstruktor der Elternklasse explizit aufgerufen werden
    }
}

Da Animal keinen argumentlosen Konstruktor hat, muss Dog super(name) ausdrücklich aufrufen – es gibt kein geschenktes super(), auf das man zurückgreifen könnte. Wie this() muss auch ein super(...)-Aufruf die erste Anweisung im Konstruktor sein.

Weiter: Vererbung

Konstruktoren initialisieren ein einzelnes Objekt, doch super() hat bereits etwas Größeres angedeutet: Klassen können auf anderen Klassen aufbauen und deren Felder, Methoden und Konstruktoren wiederverwenden. Diese Beziehung – eine Klasse, die eine andere erweitert – ist die Vererbung, und sie ist die nächste Seite.

Häufig gestellte Fragen

Was ist ein Konstruktor in Java?

Ein Konstruktor ist eine spezielle Methode, die ausgeführt wird, wenn du ein Objekt mit new erzeugst. Er trägt denselben Namen wie die Klasse und hat keinen Rückgabetyp (nicht einmal void). Seine Aufgabe ist es, das neue Objekt in einen gültigen Anfangszustand zu versetzen – in der Regel, indem die Argumente des Konstruktors den Feldern des Objekts zugewiesen werden.

Was ist der Unterschied zwischen einem Konstruktor und einer Methode in Java?

Ein Konstruktor hat exakt denselben Namen wie die Klasse, deklariert keinen Rückgabetyp und kann nur mit new beim Erzeugen eines Objekts aufgerufen werden. Eine normale Methode hat einen eigenen Namen, deklariert einen Rückgabetyp (oder void) und wird auf einem bereits existierenden Objekt aufgerufen. Konstruktoren initialisieren; Methoden erledigen danach die eigentliche Arbeit.

Was passiert, wenn ich in Java keinen Konstruktor schreibe?

Der Compiler schenkt dir einen Standardkonstruktor ohne Argumente, der keine Parameter entgegennimmt und außer dem impliziten super()-Aufruf nichts tut. Doch sobald du selbst irgendeinen Konstruktor schreibst, verschwindet dieser geschenkte: Wenn du also einen parametrisierten Konstruktor hinzufügst und trotzdem möchtest, dass new Thing() weiterhin funktioniert, musst du den argumentlosen Konstruktor ausdrücklich deklarieren.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S