Abstrakte Methoden überschreiben


zur vorherigen Seite  
zum Inhaltsverzeichnis  
zur nächsten Seite

Antwort:

Ja.

Abstrakte Methoden überschreiben

Eine abstrakte Klasse wird üblicherweise abstrakte Methoden enthalten.
Eine abstrakte Methodendefinition besteht aus:

  • einem optionalen Zugriffsmodifizierer (z.B. public)
  • dem reservierten Wort abstract
  • dem Typ des Rückgabewerts oder void
  • einer Methodensignatur
  • einem Semikolon.

Der Signatur folgen weder geschweifte Klammern noch ein Methodenkörper.
Hier ist die abstrakte Klasse
AbstrakteSuperklasse mit der abstrakten Methode berechne():

abstract class AbstrakteSuperklasse
{
  public abstract int berechne( int x, String s );
}

Wenn eine Klasse eine oder mehrere abstrakte Methoden hat,
muss sie als abstract deklariert werden.

Eine abstrakte Klasse kann Methoden haben, die nicht abstrakt sind
(die übliche Art von Methoden). Diese Methoden werden von den Subklassen in der üblichen Weise geerbt.

Eine nicht-abstrakte Subklasse einer abstrakten Superklasse
muss jede der abstrakten Methoden ihrer Superklasse überschreiben.

  • Eine nicht-abstrakte Subklasse muss jede der von ihrer Superklasse geerbten abstrakten Methoden überschreiben,
    indem sie eine Methode mit der gleichen Signatur und dem
    gleichen Rückgabewert definiert
    .

    • Objekte der Subklasse werden diese Methode enthalten.

  • Eine Subklasse kann zusätzliche Methoden
    mit anderen Signaturen als den der Superklasse definieren.

    • Objekte der Subklasse werden diese Methoden zusätzlich zu der ersten
      enthalten.

  • Es ist ein Fehler, wenn eine Subklasse eine Methode mit der gleichen Signatur
    wie die der Superklasse, aber mit einem unterschiedlichen
    Rückgabewert
    definiert.

Diese Regeln sind nicht so schlimm wie sie scheinen.
Nachdem Ihr eine Weile mit abstrakten Klassen gearbeitet habt, werden Euch die Regeln klar sein.
Hier ist eine Subklasse von AbstrakteSuperklasse:

class Subklasse extends AbstrakteSuperklasse
{
    public int berechne( int x, String s )
    { . . . }
}

Die Methode berechne() der Subklasse überschreibt korrekt die abstrakte Methode der Superklasse.


FRAGE 3:

Überschreibt das Folgende korrekt die abstrakte Methode der Superklasse?

class Subklasse extends AbstrakteSuperklasse
{
    public double berechne( int x, String s )
    { . . . }
}