Methoden Überschreiben
und @Override

Mit dem Laden des Videos akzeptierst du die Datenschutzerklärung von YouTube. Wenn du die Menge an Daten reduzieren möchtest, die YouTube von dir sammelt, solltest du dich vorher aus deinem YouTube-Account ausloggen, das Speichern von Cookies für das Google-Ads-Programm deaktivieren und/oder Cookies im Browser blockieren.
YouTube immer automatisch ladenInhaltsverzeichnis
Als Text lesen
Wenn eine Klasse von einer anderen erbt, werden ja alle Attribute und Methoden implizit von der Oberklasse in die Unterklasse übernommen. Folgendes Beispiel:
Car.java
GolfCar.java
GolfCar
erbt von Car
und übernimmt daher implizit die Methode slowDown()
. Wenn also irgendwo someGolfCar.slowDown()
aufgerufen wird, passiert für das GolfCar
genau das gleiche wie beim Aufruf von slowDown()
auf einem Car
Objekt. Was, wenn das Verhalten der Methode in der Unterklasse aber anders sein soll?
Hierfür ist es möglich, Methoden zu überschreiben:
Wenn die Signatur einer Methode der Unterklasse mit der Signatur einer Methode der Oberklasse übereinstimmt, wird beim Aufruf die Methode der Unterklasse ausgeführt. Man spricht hierbei davon, dass die Methode überschrieben wurde.
Der Übersicht halber vermerkt man eine überschriebene Methode mit @Override
.
Im gegebenen Beispiel könnte also die Klasse GolfCar
wie folgt verändert werden:
Falls nun auf ein GolfCar
Objekt slowDown()
aufgerufen wird, wird anstatt der Methode in Car
nun die Methode in GolfCar
ausgeführt.
Eine Sache habe ich dir verschwiegen
Wenn du eine Klasse nicht (durch Verwendung von extends
) von einer anderen erben lässt, hat sie trotzdem eine Oberklasse. Der Grund dafür ist folgender:
Jede Klasse (ohne explizite Oberklasse) erbt implizit von der Klasse Object
.
Und das hat einige Vorteile. Beispielsweise sind in der (standardmäßig vorhandenen) Klasse Object
die Methoden toString()
und equals()
implementiert:
toString()
wandelt ein Objekt in eineString
Darstellung um. (Praktisches Feature: Falls ein Objekt anSystem.out.println()
übergeben wird, gibtprintln()
immer genau dieseString
Darstellung aus.)equals(Object o)
gibttrue
genau dann zurück, wenn das übergebene Objekt gleich ist wie die eigene Instanz
Jede Klasse in Java kann diese Methoden überschreiben, und damit selbst angeben, wie ein Objekt dieser Klasse als String
aussehen soll, bzw. wann zwei Objekte dieser Klasse als gleich angesehen werden. Beispiel:
Hier wird beim Aufruf von toString()
nun der String
"VORNAME NACHNAME"
erzeugt, und nicht mehr der ursprüngliche Rückgabewert, den die Methode toString()
in Object
produziert hätte.
a) Füge zu der Klasse Shape
aus der letzten Aufgabe eine Methode area()
hinzu, die den Flächeninhalt der jeweiligen Figur als double
zurückgibt:
In der Klasse Shape
selbst darf als Platzhalter 0.0
zurückgegeben werden. Die restlichen Klassen sollen die Methode (falls sinnvoll) überschreiben und abhängig von der eigenen Figur einen passenden Wert zurückgeben.
Formeln für Flächeninhalte
Figur | Attribute | Formel für Flächeninhalt |
---|---|---|
Rechteck | Breite a, Höhe b | a · b |
Quadrat | Seitenlänge a | a2 |
Kreis | Radius r | π · r2 |
Eine Annäherung für π bekommst du in Java über Math.PI
.
b) Überschreibe anschließend in allen Klassen die toString()
Methode, sodass der Code
folgende Ausgabe erzeugt:
Figur an Position (2.0, 3.0) mit Flächeninhalt 0.0 Rechteck-Figur an Position (2.0, 3.0) mit Flächeninhalt 20.0 und den Maßen 4.0 x 5.0 Gleichseitige Rechteck-Figur an Position (2.0, 3.0) mit Flächeninhalt 16.0 und den Maßen 4.0 x 4.0 Kreis-Figur an Position (2.0, 3.0) mit Flächeninhalt 113.09733552923255 und Radius 6.0
Häufige Fehlerquellen
java: method does not override or implement a method from a supertype
: Du hast ein@Override
vor einer Methode, die gar nicht in einer Oberklasse existiert- Falsche Berechnung der Flächeninhalte
- Falsche Verwendung der
super
Aufrufe