5.2 Konstruktor

In diesem Abschnitt werden wir eine Möglichkeit kennenlernen, bereits beim Erzeugen eines neuen Objekts bestimmte Attributwerte zu initialisieren.

Beispiel

Einem Objekt der Klasse Buch, das unter dem Objektnamen neuesBuch zu erreichen ist, soll der Titel „Jetzt lerne ich Java“ zugewiesen werden. Dazu wird dessen öffentliche setTitel-Methode aufgerufen und als Argument der entsprechende String übergeben.

JAVA

neuesBuch = new Buch();
neuesBuch.setTitel("Jetzt lerne ich Java");

Abb. 5-16: Einem bestehenden Objekt wird mit Hilfe der entsprechenden set-Methode ein Attributwert zugewiesen (Quellcodeausschnitt).

Das Attribut titel ist für Objekte der Klasse Buch sehr wichtig. In den meisten Fällen wird nach dem Erzeugen eines neuen Buch-Objekts, diesem ein Titel zugewiesen. Unser Ziel ist es, eine Möglichkeit zu schaffen, bereits beim Erzeugen eines neuen Buch-Objekts dessen Attribut titel zu initialisieren.

JAVA

neuesBuch = new Buch("Jetzt lerne ich Java");

Abb. 5-17: Quellcode der Klasse Buch

Hierzu kann eine besondere Methode erstellt werden, die automatisch beim Erzeugen eines neuen Objekts aufgerufen wird. Die Methode erhält den gleichen Namen wie ihre Klasse – beginnt also ausnahmsweise mit einem Großbuchstaben – und erhält als Argumente die für die ausgewählten Attribute vorgesehenen Initialwerte. Die Angabe eines Rückgabetyps entfällt. Da diese Methode bei der Konstruktion eines neuen Objekts behilflich ist, wird sie als Konstruktor bezeichnet.

JAVA

public class Buch {

    private String titel;
    //weitere Attribute...

    public Buch() {

    }
    
    public Buch(String titel) {
        this.titel = titel;
    }
    
    public void setTitel(String titel) {
        this.titel = titel;
    }

    //weitere Methoden...
}

Abb. 5-17b: Konstruktor zur Initialisierung des Attributs titel (Quellcode-Ausschnitt)

Wird in einer Klasse kein bestimmter Konstruktor erstellt, erhält diese automatisch einen parameterlosen Konstruktor, der keinerlei Anweisungen enthält. Sobald jedoch ein Konstruktor erstellt wird, der Parameter erwartet, muss der parameterlose Konstruktor im Quellcode explizit hinzugefügt werden, wenn es weiterhin möglich sein soll, Objekte auch parameterlos zu erzeugen.

Der Konstruktor ist eine besondere Methode, die den gleichen Namen besitzt wie ihre Klasse.

Jedes Mal, wenn wir mit Hilfe des new-Operators ein neues Objekt erzeugen, rufen wir daher automatisch den entsprechenden Konstruktor der Klasse auf. Dieser führt dann alle Anweisungen aus, die er enthält.

Wird in einer Klasse kein bestimmter Konstruktor erstellt, erhält diese automatisch einen parameterlosen Konstruktor, der keinerlei Anweisungen enthält.

Im Gegensatz zu einer gewöhnlichen Methode wird beim Konstruktor kein Rückgabetyp angegeben, auch nicht void.

Merke: Konstruktor

Überladen des Konstruktors

Methoden, das heißt auch Konstruktoren, können überladen werden. Dabei werden mehrere Methoden gleichen Namens erstellt, die jedoch unterschiedliche Paramtertypen vorsehen beziehungsweise bei denen sich die Reihenfolge der erwarteten Paramtertypen unterscheidet.

Aufgabe

Aufgabe 5-5: Konstruktoren der Klasse Buch

Vervollständigen Sie den bisher erstellten Quellcode der Klasse Buch entsprechend dem folgenden UML-Klassendiagramm (vgl. Abb. 5.18).

img/5_18_UML_Klasse_Buch_Konstruktoren.svg
Abb. 5-18: Klasse Buch (UML) inklusive Konstruktoren
JAVA
public class Buch {

    private String isbn;
    private String titel;
    private int erscheinungsjahr;
    
    public Buch() {

    }

    public Buch(String titel) {
        this.titel = titel;
    }

    public Buch(String titel, String pIsbn) {
        this.titel = titel;
        this.isbn = pIsbn;
    }

    public Buch(String titel, int erscheinungsjahr) {
        this.titel = titel;
        this.erscheinungsjahr = erscheinungsjahr;
    }


    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String pIsbn) {
        this.isbn = pIsbn;
    }
    
    public String getTitel() {
        return titel;
    }
    
    public void setTitel(String titel) {
        this.titel = titel;
    }
    
    public int getErscheinungsjahr() {
        return erscheinungsjahr;
    }
    
    public void setErscheinungsjahr(int erscheinungsjahr) {
        this.erscheinungsjahr = erscheinungsjahr;
    }

}
Abb. 5-19: Quellcode der Klasse Buch inklusive Konstruktoren

Methoden und damit auch Konstruktoren werden nicht allein durch ihren Namen identifiziert, sondern auch durch die jeweils vorgesehenen Parametertypen. Der Methodenname bildet zusammen mit den vorgesehenen Parametertypen (in der Reihenfolge ihrer Deklaration) die Signatur der Methode. Innerhalb einer Klasse darf ein Methodenname mehrfach, eine Signatur jedoch nur einmal vorkommen.

Existieren in einer Klasse mehrere Methoden gleichen Namens, die sich in ihrer Signatur unterscheiden, gelten sie als überladen.

Merke: Überladen von Methoden
Frage

Frage 5-1: Überladen von Methoden

Warum darf in der Klasse Buch – so wie sie in Abb. 5.18 modelliert ist – nicht zusätzlich der Konstruktor Buch(pIsbn: String) ergänzt werden? Lösung

Antwort:
Der Konstruktor Buch(pIsbn: String) hat die gleiche Signatur wie der bereits vorhandene Konstruktor Buch(titel: String), nämlich Buch(String). In einer Klasse darf es zwar mehrere Methoden gleichen Namens geben, diese müssen sich jedoch in ihrer Signatur unterscheiden.
Aufgabe

Aufgabe 5-6: Konstruktoren der Klasse Ort

Vervollständigen Sie den bisher erstellten Quellcode der Klasse Ort entsprechend dem folgenden UML-Klassendiagramm (vgl. Abb. 5.20).

img/5_20_UML_Klasse_Ort_Konstruktoren.svg
Abb. 5-20: Klasse Ort (UML) inklusive Konstruktoren
JAVA
public class Ort {

    private String name;
    private int einwohnerzahl;
    private double kaufkraft;
    
    public Ort() {

    }

    public Ort(String name) {
        this.name = name;
    }

    public Ort(String name, int einwohnerzahl) {
        this.name = name;
        einwohnerzahl = einwohnerzahl;
    }


    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setEinwohnerzahl(int einwohnerzahl) {
        einwohnerzahl = einwohnerzahl;
    }

    public int getEinwohnerzahl() {
        return this.einwohnerzahl;
    }

    public void setKaufkraft(double kaufkraft) {
        this.kaufkraft = kaufkraft;
    }

    public double getKaufkraft() {
        return this.kaufkraft;
    }
    
    public double berechneKaufkraftJeEinwohner() {
        return kaufkraft/einwohnerzahl;
    }

}
Abb. 5-21: Quellcode der Klasse Ort inklusive Konstruktoren