Alle.
In diesem Beispiel hat jede Kartenklasse ihre eigene Version der
gruss()
Methode, aber jede ist anders implementiert.
Es ist sinnvoll eine abstrakte gruss()
Methode in der Superklasse zu haben.
Das besagt, dass jede Subklasse das "Konzept" gruss()
erbt, aber die jeweilige Implementation unterschiedlich ist.
Hier ist die Klassendefinition der abstrakten Klasse Karte
:
abstract class Karte { String empfaenger; // Name des Empfängers // abstrakte Methode public abstract void gruss(); }
Das ist die vollständige Definition dieser abstrakten Klasse. Beachtet die abstrakte Methode. Abstrakte Klassen können (aber müssen nicht) abstrakte Methoden enthalten. Ebenso kann eine abstrakte Klasse nicht-abstrakte Methoden enthalten, die von den Subklassen geerbt werden.
Eine abstrakte Methode hat keinen Körper. (Sie besitzt keine Anweisungen.) Sie deklariert Zugriffsmodifizierer, Rückgabetyp und Methodensignatur gefolgt von einem Semikolon.
Eine nicht-abstrakte Subklasse erbt die abstrakte Methode und muss eine nicht-abstrakte Methode definieren, die mit der abstrakten Methode übereinstimmt.
Eine abstrakte
Subklasse einer abstrakten
Superklasse
ist nicht verpflichtet die geerbten abstrakten Methoden zu implementieren.
Das heißt, dass es mehrere Schritte geben kann, von einer abstrakten Basisklasse
bis zu einer Subklasse, die vollständig nicht-abstrakt ist.
Da in der Klasse Karte
kein Konstruktor definiert ist, wird automatisch der argumentenlose Standardkonstruktor vom Compiler
zur Verfügung gestellt.
Aber, dieser Konstruktor kann nicht direkt verwendet werden, da
kein Karte
-Objekt konstruiert werden kann.
Fühlt Ihr Euch in diesem Moment etwas abstrakt?