04.03.08 Konstruktoren

Um mit den erstellten Klassen arbeiten zu können, müssen davon Objekte instanziiert werden. Dies geschieht wie gewohnt über das reservierte Wort new (siehe Kapitel 04.02 Objekte). Um aber definierte Anfangszustände dieser Objekte zu erzeugen, benötigt man die Hilfe von Konstruktoren.

Konstruktoren

Lassen Sie uns das bisher Gelernte an einem Beispiel wiederholen.

public class MeineKlasse {

  public void schreibeHalloWelt() {
    System.out.println("Hallo Welt");
  }

  public static void main(String[] args) {

    // Anlegen eines Objektes vom Typ MeineKlasse
    MeineKlasse einObjekt = new MeineKlasse();

    // Verwendung der Methode schreibeHalloWelt()
    einObjekt.schreibeHalloWelt();
  }
}

Wir legen eine Klasse mit den Namen MeineKlasse an. Diese Klasse enthält nun zwei Methoden – einmal public void schreibeHalloWelt() und zum anderen public static void main(String[] args).

Die main Methode kennen Sie bereits aus dem Kapitel 04.03.05 Sonderfall main. Hier wird ein Objekt namens einObjekt vom Typ MeineKlasse erzeugt und im weiteren Verlauf dessen Objektmethode schreibeHalloWelt verwendet. Mit dem new-Operator wird der benötigte Speicherplatz für ein Objekt des Typs MeineKlasse im Heap allokiert. Danach wird der Konstruktor der Klasse MeineKlasse aufgerufen, in welchem die Objektzustände initialisiert werden. Anschließend liefert der Konstruktor eine Referenz auf das soeben erzeugte Objekt zurück.

Schauen wir uns dies einmal Schritt für Schritt an einem weiteren Beispiel an.

public class Punkt {

  private int x;
  private int y;

  public void ausgabe() {

    System.out.println("x-Wert: " + this.x);
    System.out.println("y-Wert: " + this.y);
  }

  public static void main(String[] args) {

    Punkt meinPunkt = new Punkt();

    meinPunkt.ausgabe();
  }
}

Dies ist die Punktklasse aus den Kapitel 04.03.02 Attribute und 04.03.03 Methoden. In der main erzeugen wir ein Objekt der Klasse Punkt. Da wir keinen expliziten Konstruktor für diese Klasse geschrieben haben, wird der sogenannte Standardkonstruktor verwendet.

Der Standardkonstruktor ist für jede Klasse vorhanden (es sei denn es wird ein anderer Konstruktor definiert), auch wenn dieser nicht explizit in den Quellcode der Klasse geschrieben wird. Damit wird sichergestellt, dass jedes Objekt einen definierten Anfangszustand hat und man eine Referenz für selbiges erhält.

In unserem Fall erzeugen wir also ein Objekt vom Typ Punkt über den Standardkonstruktor. Da wir direkt nach der Erzeugung die Methode ausgabe aufrufen, erhalten wir die Standardinitialisierungswerte für int (0).

x-Wert: 0
y-Wert: 0

Schreiben wir nun aber unseren eigenen Konstruktor.

public class Punkt {

  //...

  // Konstruktor
  public Punkt() {

    this.x = 1;
    this.y = 1;
  }

  //...
}

Der Aufbau eines Konstruktors ähnelt dem einer Methode. Wichtig hierbei ist nur, dass es keinen Rückgabetyp gibt. Dies ist ja standardmäßig eine Referenz auf das erzeugte Objekt selbst. Weiterhin muss der Konstruktor den gleichen Namen wie die Klasse haben, um als Konstruktor identifiziert werden zu können buy kamagra oral jelly canada. Die Positionen der Konstruktoren innerhalb der Klasse sollte am besten nach den Attributen und vor den Methoden erfolgen (siehe Kapitel 07.05 Code Conventions).
In unserem Konstruktor setzen wir den Anfangszustand unserer Punktobjekte auf den Wert 1 für die Attribute x und y.

Als Ausgabe erhalten wir:

x-Wert: 1
y-Wert: 1

Sie sehen also, dass wir den Wert für die Attribute x und y bereits zur Initialisierung des Objektes gesetzt haben.

Fassen wir dies nun noch einmal kurz zusammen.
Wenn wir ein Objekt erzeugen wollen, geschieht dies mit Hilfe des new-Operators. Dieser weist die Laufzeitumgebung an, entsprechenden Speicherplatz für das (zu erzeugende) Objekt auf dem Heap zu reservieren. War dieser Vorgang erfolgreich, wird der entsprechende Konstruktor aufgerufen. Haben wir selber keinen für diese Klasse definiert, wird der Standardkonstruktor verwendet. Ziel eines solchen Konstruktors ist die Bereitstellung eines Objektes mit einem definierten Anfangszustand. Schlussendlich liefert der Konstruktor eine Referenz auf das soeben erzeugte Objekt zurück. Diesen ganzen Vorgang nennt man Initialisierung.

Zusätzlich zu dem leeren Standardkonstruktor hat man noch weitere Möglichkeiten Konstruktoren zu definieren und zu verwenden. Man kann den Konstruktor auch – analog zu einer Methode – mit einer Parameterliste versehen.

public class Punkt {

  private int x;
  private int y;

  // leerer Konstruktor
  public Punkt() {

    this.x = 1;
    this.y = 1;
  }

  // Konstruktor mit Parameterliste
  public Punkt(int neuesX, int neuesY) {

    this.x = neuesX;
    this.y = neuesY;
  }

  public void ausgabe() {

    System.out.println("x-Wert: " + this.x);
    System.out.println("y-Wert: " + this.y);
  }

  public static void main(String[] args) {

    Punkt meinPunkt = new Punkt();
    Punkt meinPunkt2 = new Punkt(5, 5);

    meinPunkt.ausgabe();
    meinPunkt2.ausgabe();
  }
}

Sie sehen in diesem Beispiel zusätzlich zu dem Standardkonstruktor einen Weiteren mit den Parametern neuesX und neuesY. Diese sollen die Initialisierungswerte für die Attribute x und y enthalten. In der main Methode ist die Verwendung beider Konstruktoren zu sehen. Das Objekt meinPunkt2 wird über diesen neuen Konstruktor erzeugt und dessen Attribute mit dem Wert 5 initialisiert. Als Ausgabe erhalten wir.

x-Wert: 1
y-Wert: 1
x-Wert: 5
y-Wert: 5

Sie sehen also wie man mit Hilfe eines Konstruktors bereits bei der Initialisierung eines Objektes dessen Anfangszustand bestimmen kann.

Als weitere Verwendung sei noch der Aufruf eines Konstruktors innerhalb eines anderen Konstruktors erwähnt.

// leerer Konstruktor
public Punkt() {
  this(1,1);
}

// Konstruktor mit Parameterliste
public Punkt(int neuesX, int neuesY) {

  this.x = neuesX;
  this.y = neuesY;
}

Im Standardkonstruktor rufen wir über this(1,1) den Konstruktor mit der Parameterliste auf.

Fazit

Ein Konstruktor liefert uns immer eine Referenz auf ein Objekt der entsprechenden Klasse zurück.
Durch die Verwendung von Konstruktoren kann man die Anfangszustände von Objekten bereits zu Initialisierung definieren. Dank dieser Vorgehensweise ist es möglich ungültige Objektzustände zu vermeiden.

2 Replies to “04.03.08 Konstruktoren”

  1. EinAufmerksamerLeser

    Hi, sehr gutes Buch, kann ich nur empfehlen. Anschauliche Beispiele auf jedenfall und verständlich erklärt. Wäre nett, wenn Ihr einen download als PDF Datei anbieten würdet..(kleiner gimmick: Vielleicht, dass man diese Datei nach einen bestandenen Quiz downloaden könnte. .)

    Mit freundlichen Grüßen

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.