Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen2:constructors:start

Dies ist eine alte Version des Dokuments!


Konstruktoren

Wir haben inzwischen schon viele Objekte instanziert, oft auch mit der Angabe von Parametern. Das folgende Programm instanziert beispielsweise ein Objekt der Klasse Rechteck und übergibt die Parameter (50, 50, 400, 300) für die Koordinaten der linken oberen Ecke (50, 50), die Breite (400) und die Höhe (300).

Beim Instanzieren eines neuen Objekts mithilfe des Schlüsselwortes new wird immer eine Methode aufgerufen, die das Objekt initialisiert. Diese Methode wird Konstruktor genannt. Werden zusätzliche Parameter angegeben, z.B. new Rectangle(50, 50, 400, 300), so bekommt der Konstruktor diese als Parameterwerte übergeben.

Wir lernen in diesem Kapitel, wie wir die Konstruktoren unserer Klassen selbst schreiben können.

Beispiel 1: Buntstift

Aufgabe

Führe das Programm Schrittweise mit "step into ()" aus und beobachte, in welcher Reihenfolge die Programmzeilen durchlaufen werden!

Die Definition des Konstruktors der Klasse Buntstift ist in den Zeile 11 - 13 zu finden:

  1. public Buntstift(Color farbe1) {
  2. farbe = farbe1;
  3. }

Eine Konstruktordefinition sieht aus wie die Definition einer "normalen" Methode, mit zwei Unterschieden:

  • Sie besitzt keinen Rückgabetyp.
  • Ihr Bezeichner stimmt exakt mit dem Bezeichner der Klasse überein.

Findet der Compiler eine Methodendefinition mit diesen Eigenschaften, so erkennt er sie als Konstruktor der Klasse. Beim Instanzieren eines neuen Objekts mittels new (hier: new Buntstift(Color.red)) wird der Konstruktor automatisch ausgeführt. Dabei werden die in Klammern angegebenen Werte (hier: Color.red) als Parameterwerte übergeben.

Im Falle der Klasse Buntstift besitzt die Konstruktordefinition den Parameter Color farbe1. Da der Wert jedes Parameters nach abgeschlosssener Ausführung der Methode verworfen wird (in unserem Fall also dann, wenn der Computer beim Ausführen des Konstruktors in Zeile 13 angelangt ist), müssen wir ihn "retten", damit er im weiteren Programmverlauf benutzt werden kann. Das machen wir, indem wir ihn in Zeile 12 in das Attribut farbe kopieren:

  1. public Buntstift(Color farbe1) {
  2. farbe = farbe1;
  3. }

Das Schlüsselwort "this"

Hat es Dich gewundert, warum wir den Parameter im Konstruktor oben farbe1 genannt haben und nicht farbe? Probier' im folgenden Kasten mal aus, was passiert, wenn wir ihn einfach umbenennen:

Führe das Programm wieder Schrittweise mit "step into ()" aus. Verstehst Du, warum es beim Ausführen zum Fehler kommt?

Tipp: Klicke mit der Maus auf den Bezeichner farbe. Alle Vorkommen der Parametervariable werden dann markiert.

Das Problem besteht darin, dass der Parameter farbe jetzt das Attribut farbe überdeckt. Dadurch bewirkt die Anweisung

farbe = farbe;

in Zeile 9, dass der Wert des Parameters farbe mit seinem eigenen Wert überschrieben wird. Der Wert des Attributs farbe wird nicht verändert, bleibt also null und führt so in Zeile 13 zum Fehler.

Wir müssen dem Compiler irgendwie mitteilen, dass der Bezeichner farbe auf der linken Seite der Zuweisung für das Attribut farbe steht, nicht für den Parameter farbe. Dies können wir mithilfe des Schlüsselwortes this erreichen: this steht nämlich immer für dasjenige Objekt, "in dem" wir uns gerade befinden. Im Bereich Zeile 8 - 10 also für das Objekt, das gerade erzeugt wird. this.farbe ist damit eindeutig dessen Attribut farbe. Wir ersetzen Zeile 9 also durch

this.farbe = farbe;

Klicke im unteren Beispiel auf die verschiedenen Vorkommen des Bezeichners farbe und achte darauf, welche davon jeweils als zusammengehörig markiert werden!

Beispiel 2: Polynomrechner

Die Klasse PolynomZweitenGrades repräsentiert ein Polynom 2. Grades, also einen Term der Form . Die Werte für die Konstanten a, b und c werden beim Instanzieren des Objekts dem Konstruktor übergeben und in den entsprechenden Attributen gespeichert, so dass dann in der Methode getWert(double x) für jeden beliebigen Wert von x der Wert des Polynoms berechnet werden kann.

Aufgabe: Die Klasse Bruch

Ein Objekt der Klasse Bruch repräsentiert einen Bruch $\frac{a}{b}$, wobei $a\in\mathbb{Z}$ und $b\in\mathbb{N}$. Die Klasse soll einen Konstruktor besitzen, der die Werte für $a$ und $b$ entgegennimmt. Zudem soll sie die Methoden ausgabeUnecht() und ausgabeEcht() haben, die den Bruch als unechten bzw. echten Bruch ausgeben. Mit den Methoden mal und geteilt soll es möglich sein, den Wert eines Bruches mit dem Wert eines anderen zu multiplizieren bzw. durch ihn zu dividieren. Hier ein beispielhaftes Hauptprogramm zusammen mit der Ausgabe:

Bruch b1 = new Bruch(4, 3);
Bruch b2 = new Bruch(1, 2);
b1.ausgabeUnecht();
b1.ausgabeEcht();
b1.mal(b2);
b1.ausgabeUnecht();

Dieses Programm soll folgendes ausgeben:

4/3
1 1/3
4/6

An meine Schüler/innen: Bitte benutzt nicht den folgenden Eingabebereich, sondern Eure Entwicklungumgebung unter www.mathe-pabst.de/java. Legt dort einen neuen Workspace "Hausaufaben" an und darin die Datei "Bruch", in die Ihr das Hauptprogramm und Eure Klasse Bruch schreibt.
Die Tipps im Eingabebereich unten könnt Ihr Euch aber natürlich ansehen!

Für die Guten und Interessierten unter Euch:
Ihr könntet die Klasse Bruch erweitern um die Methoden

  • kürze() (kürzt den Bruch)
  • addiere(Bruch b) (addiert zum Bruch einen weiteren Bruch)
  • subtrahiere(Bruch b) (subtrahiert vom Bruch einen weiteren Bruch)

Hier geht's zur Lösung!

klassen2/constructors/start.1606669770.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki