Eine Unterklasse oder Subklasse ist eine Klasse, die von einer anderen Klasse, der sogenannten Oberklasse oder Superklasse, abgeleitet ist. Sie erbt dabei alle Instanzvariablen und nicht-privaten Methoden der Oberklasse.
Die Unterklasse kann diese geerbten Variablen und Methoden nutzen, sie um weitere Variablen und Methoden erweitern oder die vorhandenen Methoden der Oberklasse überschreiben (auf eigene Weise implementieren). Dieses Konzept wird als Vererbung bezeichnet und ist ein zentrales Prinzip der OOP.
Unterklassen erben die Spezifikation der Oberklasse
Die Spezifikation einer Klasse ergänzt die Schnittstelle der Klasse um eine formalisierte Beschreibung des Verhaltens der öffentlichen Methoden mit
Eine Unterklasse erbt diese Spezifikation (und damit auch die Schnittstelle) der Oberklasse. Das heißt mit anderen Worten: Die Spezifikation der Oberklasse gilt auch für die Unterklasse.
"Die Unterklasse übernimmt damit alle Verpflichtungen und Zusicherungen der Oberklasse" [1].
IST-Beziehungen
Man kann sogar sagen, dass jede Unterklasse gleichzeitig ein Exemplar der Oberklasse ist. Im Unterricht der gymnasialen Oberstufe hat sich hierfür der Begriff IST-Beziehung eingebürgert. Zwischen der Unterklasse und der Oberklasse besteht eine IST-Beziehung.

Eine Oberklasse mit zwei Unterklassen
Dieses Bild zeigt das von BlueJ erzeugte Klassendiagramm einer Oberklasse mit zwei Unterklassen. Die IST-Beziehungen werden hier durch Pfeile mit leeren dreieckigen Spitzen dargestellt. Das entspricht durchaus der gängigen UML-Konvention [4].
Diese IST-Beziehung hat zur Folge, dass eine Unterklasse auch überall dort eingesetzt werden kann, wo die Oberklasse eingesetzt wird. Diese Tatsache wird auch als Prinzip der Ersetzbarkeit bezeichnet.
Das Prinzip der Ersetzbarkeit
"Das Prinzip der Ersetzbarkeit besagt, dass jedes Exemplar einer Klasse deren Spezifikation erfüllen muss. Das gilt auch dann, wenn das Objekt ein Exemplar einer Unterklasse der spezifizierten Klasse ist." [1]

Das Objekt einer Unterklasse in BlueJ
Legt man in BlueJ ein Objekt einer Unterklasse an, wie hier zum Beispiel das Objekt heldFritz der Klasse Held, dann kann man mit der rechten Maustaste alle öffentlichen Methoden der Unterklasse sehen.
In diesem Fall sehen wir zwei Methoden findeGold() und trinkeHeiltrank(), die nur in der Unterklasse definiert wurden. In der Oberklasse Person existieren diese Methoden nicht.
Klickt man dann auf den Menüeintrag "geerbt von Person", sieht man alle öffentlichen Methoden der Klasse Held, zum Beispiel setAngriffswert().

Eine Testklasse soll die Ersetzbarkeit der Oberklasse überprüfen
Hier der Quelltext dieser Testklasse:
public class TesteErsetzbarkeit { Person testobjekt; public TesteErsetzbarkeit() { testobjekt = new Person("Fritz"); } public void teste() { testobjekt.zeigeDaten(); } }
Nun ersetzen wir in dem Quelltext die Klasse Person durch die Klasse Held, unser Testobjekt ist jetzt also eine Instanz der Klasse Held.
public class TesteErsetzbarkeit { Held testobjekt; public TesteErsetzbarkeit() { testobjekt = new Held("Fritz"); } public void teste() { testobjekt.zeigeDaten(); } }
Wir können nun ohne Probleme testobjekt.zeigeDaten() aufrufen, obwohl diese Methode in der Oberklasse definiert war. Die Ersetzung von Person durch Held hat also funktioniert.
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
- Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
- Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
- Kecher et al.: UML 2.5 - Das umfassende Handbuch, Rheinwerk Computing 2021