====== Abstrakte Klassen ======
{{ youtube>Aekx2HXnEVg?large }}
\\
\\
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 [[klassen2:casting:start|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).
===== Klassendiagramm =====
{{ :klassen2:abstrakt:pasted:20210424-215332.png?200}}
Der UML-Standard sieht vor, dass die Bezeichner abstrakter Klassen und Methoden **in Schrägschrift** gesetzt werden. Vor den Klassenbezeichner kann wahlweise zusätzlich das Präfix "<>" geschrieben werden.