Inhaltsverzeichnis
Abstrakte Klassen
Oft ist es nicht sinnvoll, Objekte einer Oberklasse zu instanzieren, weil sie „abstrakt“ ist, d.h. noch nicht über alle Attribute/Methoden verfügt. Wir sehen uns dazu wieder ein einfaches Beispiel an: Die Klasse Tier
besitzt ein Attribut art
. Von ihr leiten wir die Unterklassen Hund
und Katze
ab:
Abstrakte Methoden
Jedes Tier soll eine Methode sagwas()
besitzen. Ruft man die Methode für ein Objekt der Klasse Hund auf, so soll „Wau, wau!“ ausgegeben werden, ruft man sie für ein Objekt der Klasse Katze auf, so soll „Miau“ ausgegeben werden. Wenn wir - wie im Kapitel Casting und der Operator instanceof - die Methode sagwas()
in den Klassen Hund
und Katze
implementieren, dann können wir sie nur aufrufen, wenn die Objektvariable vom Datentyp Hund
oder Katze
ist. Bei Objektvariablen vom Typ Tier
müssen wir vorher mithilfe des Operators instanceof
herausfinden, um welche Klasse es sich handelt und dann entsprechend casten.
Viel klarer wäre es doch, wenn die Klasse Tier
eine Methode sagwas()
enthalten würde, diese Methode aber erst in ihren Unterklassen mit Inhalt gefüllt wird. Das geht, wenn wir sowohl die Klasse Tier
als auch die Methode sagwas()
als abstract
kennzeichnen:
Die Deklaration der Methode
abstract public void sagwas();
in der Klasse Tier
verpflichtet alle Unterklassen von Tier, diese Methode mit genau dieser Signatur zu implementieren. Sie sorgt gleichzeitig dafür, dass man mit einer Variable vom Typ Tier
dann diese Methode aufrufen kann, egal, zu welcher Unterklasse von Tier
das Objekt gehört, auf das die Variable zeigt.
Eine Klasse kann nur dann abstrakte Methoden enthalten, wenn sie selbst mit dem Schlüsselwort abstract
gekennzeichnet ist. Das sorgt dafür, dass keine Objekte dieser Klasse instanziert werden können (was nicht geht, weil die abstrakten Methoden ja keinen Programmtext besitzen, der ausgeführt werden könnte).