Abstrakte Klassen und Methoden in Java


In diesem Beitrag betrachten wir Klassen, die mindestens eine nicht implementierte (abstrakte) Methode besitzen.

Wenn eine Klasse nicht implementierte Methoden besitzt, kann sie nicht instanziert werden und wird als abstrakte Klasse bezeichnet, da sie keine konkrete Form annehmen kann.

Im zweiten Teil dieses Beitrags zeigen wir mit Hilfe einer Beispielanwendung wie abstrakte Klassen und Methoden in Java verwendet werden.

Abstrakte Klassen in Java

Wird in Java eine Klasse mit dem Schlüsselwort abstract deklariert, gilt sie als abstrakt. Abstrakte Klassen können nicht instanziert werden.

In abstrakten Klassen können abstrakte Methoden deklariert werden. Es sind aber auch normale, konkrete Methoden erlaubt.

Java-Entwickler setzen abstrakte Klassen als Superklassen ein, die abstrakte Methoden enthalten, welche erst später von abgeleiteten Klassen implementiert werden.

Solange die abstrakten Methoden nicht in den Subklassen implementiert wurden, können weder die Superklasse noch die Subklassen instanziert werden. Existieren auch in der Subklasse noch abstrakte Methoden, dann muss auch die Subklasse als abstrakte Klasse mit dem abstract-Schlüsselwort deklariert werden.

Erst wenn alle abstrakten Methoden der Superklasse implementiert worden sind, kann die Subklasse konkret werden (instanziert werden). Diese Konkretisierung kann auch schrittweise über mehrere Vererbungsstufen erfolgen.

Abstrakte Methoden in Java

In Java werden Methoden durch das abstract-Schlüsselwort als abstrakte Methoden deklariert, die nicht implementiert werden können. Daher besitzen abstrakte Methoden keinen Methodenrumpf. Anstelle des Methodenrumpfs und den geschweiften Klammern steht ein Semikolon.

Deklaration einer abstrakten Methode: public abstract int berechneTicketpreis();.

Abstrakte Methoden können nicht aufgerufen werden, da sie über keine Implementierung verfügen. Sie müssen erst in einer abgeleiteten Klasse durch Methoden-Überlagerung nachträglich implementiert werden.

Erst dann wird eine abstrakte Methode konkret und kann aufgerufen werden.

Verwendung von abstrakten Klassen und Methoden in Java

In unserer Beispielanwendung wollen wir eine abstrakte Methode als Schnittstelle einsetzen. Dazu definieren wir eine abstrakte Superklasse, die allen abgeleiteten Klassen eine abstrakte Methode für die Berechnung der Ticketpreise zur Verfügung stellt.

Die Superklasse definiert alle gemeinsamen Eigenschaften von Tickets, wie Basispreis, Eventname und Veranstaltungsort. Die spezialisierten Subklassen implementieren dann die jeweiligen zusätzlichen Eigenschaften der verschiedenen Ticketarten (Sport-, Konzert- und Kinoticket).

Die Berechnung des Ticketpreises soll für jedes Ticket einzeln erfolgen, ist aber abhängig von der Ticketart. Daher wird die abstrakte Methode berechneTicketpreis() schon in der Superklasse (Basisklasse) deklariert, aber erst in den abgeleiteten Subklassen implementiert.

Der folgende Quellcode enthält die Implementierungen der Subklassen SportTicket, KonzertTicket, KinoTicket und AutoKinoTicket, sowie die Implementierung ihrer abstrakten Superklasse Ticket. Die Berechnung des Gesamtticketumsatzes wird in der Klasse TicketpreisBerechnung durchgeführt, in der auch die main-Methode definiert ist.

Für die Berechnung der Ticketpreise wird ein Array vTickets erzeugt, das alle verkauften Tickets enthält und dazu mit konkreten Untertypen der Klasse Ticket gefüllt wird. Anschließend wird für alle Array-Elemente (Tickets) der jeweilige Ticketpreis berechnet mit Hilfe der Methode berechneTicketpreis(), die in jeder Subklasse entsprechend der Ticketart implementiert ist.

Die obere Beispielanwendung nutzt die Möglichkeiten des Polymorphismus von Java. In der Array-Variable vTickets vom Typ der Superklasse Tickets werden zur Laufzeit verschiedene Objekte der Subklassen SportTicket, KonzertTicket, KinoTicket und AutoKinoTicket abgelegt.

Da bereits die Superklasse Ticket die Deklaration der Methode berechneTicketpreis enthält, ist diese Methode dem Java-Compiler für Objektvariablen vom Typ Ticket bekannt. Die Methode ist in der Superklasse noch abstrakt, wird aber von den Subklassen nachträglich durch Methodenüberlagerung implementiert.

Da das Array vTickets nur Objekte vom Typ der Subklassen SportTicket, KonzertTicket, KinoTicket und AutoKinoTicket enthält und in jeder Subklasse die Methode berechneTicketpreis implementiert ist, kann zur Laufzeit für jedes Array-Element die Methode berechneTicketpreis aufgerufen werden. Dazu wird mit Hilfe der dynamischen Methodensuche zur Laufzeit entschieden welche implementierte Variante der Methode berechneTicketpreis für das jeweilige Array-Element aufgerufen werden soll.

Es wird für jedes Array-Element die passende Berechnung durchgeführt. Unabhängig davon, ob in einem Array-Element ein SportTicket, KonzertTicket, KinoTicket und AutoKinoTicket gespeichert ist, führt der Aufruf von berechneTicketpreis durch Late Binding die zum Datentyp des konkreten Objekts passende Berechnung aus.

Es können auch weitere Ticketarten hinzugefügt oder bestehende Arten spezialisiert werden, ohne das dabei eine Veränderung an der Routine vorgenommen werden muss. Die Subklasse AutoKinoTicket leitet sich von der Klasse KinoTicket ab und besitzt eine eigene Implementierung der Methode berechneTicketpreis.

Hinweis: Mit Hilfe des Schlüsselworts super können die Anweisungen des Superklassen-Konstruktors genutzt und somit Quellcode wiederverwendet werden. Achtung! Der Aufruf des Superkonstruktors muss, wie im Quellcode angegeben, erfolgen. Andernfalls erhält man einen Compiler-Fehler, da der parameterlose Standard-Konstruktor hier nicht vom Java-Compiler erstellt wird und nur der parametrisierte Konstruktor existiert.

Starten wir nun die Beispielanwendung. Die dabei erzeugte Textausgabe ist in der unten abgebildeten Kommandozeilenausgabe dargestellt:

Java abstrakte Klassen und Methoden

Java abstrakte Klassen und Methoden – Ausgabe der Beispielanwendung

Mit dem folgenden Link gelangt ihr wieder zurück zum Java Kurs für Programmieranfänger.

Comments 1

  1. Pingback: Klassen in Java: Die Grundlagen der objektorientierten Programmierung

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *