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.
neuesBuch = new Buch();
neuesBuch.setTitel("Jetzt lerne ich Java");
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.
neuesBuch = new Buch("Jetzt lerne ich Java");
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.
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...
}
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.
Ü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 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).
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;
}
}
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.
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
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).
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;
}
}