10.5 Überschreiben von Methoden

Bislang haben wir die Möglichkeiten, die uns die Vererbung bietet, nur dazu genutzt um eine bestehende Klasse zu erweitern. Die abgeleitete Klasse erbt dabei zunächst die Attribute und Methoden ihrer Oberklasse und kann darüber hinaus um zusätzliche Attribute und Methoden erweitert werden.

Nicht immer erfüllen die von der Oberklasse geerbten Methoden jedoch genau die Anforderungen, die an die neu abgeleitete Klasse gestellt werden.

Aufgabe

Aufgabe 10-6: robi geh vorwärts! Aber nur, wenn der Weg frei ist...

Die Klasse RoboterErweitert hat von ihrer Oberklasse Roboter unter anderem die Methode gehVorwaerts() geerbt.

Die Anforderungen an die Klasse RoboterErweitert sehen jedoch vor, dass ein Objekt dieser Klasse bei Aufruf der Methode gehVorwaerts() nicht mehr einfach in blindem Gehorsam ein Feld vorwärts geht. Stattdessen soll es zunächst selbst prüfen, ob der Weg vor ihm wirklich frei ist, und nur dann ein Feld vorwärts gehen. Explodierende Roboter gehören damit der Vergangenheit an.

Aufgabe
  1. Lesen Sie zunächst den Abschnitt „Merke: Methoden überschreiben“.
  2. Erfüllen Sie dann die gestellte Anforderung, indem Sie in der Klasse RoboterErweitert die von der Klasse Roboter geerbte Methode gehVorwaerts() in geeigneter Weise überschreiben. Lösung
    Lösung
    JAVA
    public class RoboterErweitert extends Roboter {

        //...

        public void gehVorwaerts() {
            if(this.istWegFrei()) {
                super.gehVorwaerts();
            }
        }
    }
    Abb. 10-18: Überschreiben der von der Oberklasse Roboter geerbten Methode gehVorwaerts()

Eine geerbte Methode wird in der jeweiligen Unterklasse durch eine neue Methode überschrieben, wenn beide Methoden die gleiche Signatur besitzen.

Die Signatur einer Methode besteht aus ihrem Namen und den vorgesehenen Parametertypen (in der Reihenfolge ihrer Deklaration).

Die überschriebene Methode bleibt jedoch erreichbar und kann mit Hilfe des Schlüsselworts super auch weiterhin aufgerufen werden:

JAVA
super.methodenname();
Abb. 10-19: Aufruf einer überschriebenen Methode
Merke: Methoden überschreiben
Frage

Fragen 10-1: Objektorientierung

  1. Worin liegt der Unterschied zwischen dem Überladen und dem Überschreiben einer Methode? Welcher Zweck wird dabei jeweils verfolgt? Lösung
    Lösung

    Eine Methode wird überladen, wenn eine weitere Methode gleichen Namens erstellt wird und beide Methoden eine unterschiedliche Signatur besitzen.
    Dagegen wird eine Methode, die von einer Oberklasse geerbt wurde, überschrieben, wenn in der Unterklassen eine Methode gleichen Namens erstellt wird und beide Methoden die gleiche Signatur besitzen.

  2. Was bewirken jeweils die folgenden Anweisungen?
    • super();
    • super.gehVorwaerts();
    Lösung
    Lösung

    Die Anweisung super() ruft den parameterlosen Konstruktor der Oberklasse auf.

    Wenn in der Unterklasse die Methode gehVorwaerts() überschrieben wurde, kann mit der Anweisung super.gehVorwaerts() die in der Oberklasse derfinierte (Original-)Methode gehVorwaerts() aufgerufen werden.