Java 7 Grundkurs

Abstrakte Klassen und Methoden

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Bei der Deklaration einer Klasse können Sie die Implementierung einzelner Methoden weglassen und lediglich den Namen und die Parameterliste dieser Methoden angeben. Warum Sie so etwas tun sollten und was es Ihnen bringt, zeigt Ihnen dieses Video.
07:05

Transkript

Neben ganz normalen Klassen gibt es in Java auch das Konzept der abstrakten Klasse. Schauen wir uns an, was das ist und wozu wir das brauchen können. Nehmen wir an, wir entwickeln als Teil einer Software für einen Fahr-Simulator nacheinander die Klassen *LKW* und *Cabrio*. Die *LKW* bekommt Methoden wie *Beschleunigen*, *Bremsen*, *Anhalten*, *get Geschwindigkeit*, um uns die aktuelle Geschwindigkeit zu holen, sowie *Anhängen* und *Abhängen* für den Anhänger. In der Klasse *Cabrio* haben wir dann andere Methoden, nämlich *Beschleunigen*, *Bremsen*, *Anhalten*, *get Geschwindigkeit*, um die aktuelle Geschwindigkeit herauszufinden, dann noch *öffne Dach*, und *schließe Dach*. Nach einer Analyse finden wir heraus, dass es gewisse Ähnlichkeiten gibt. Die ersten 4 Methoden heißen nämlich in beiden Klassen gleich und tun eigentlich im Prinzip auch das Gleiche. Was machen wir in solchen Fällen? Wir erzeugen uns eine Oberklasse und lassen diese beiden Klassen *LKW* und *Cabrio* von dieser Oberklasse erben. Wir können die gemeinsame Funktionalität in die Oberklasse packen und müssen nicht doppelt implementieren. Bei der Umsetzung stellt sich dann heraus, dass zwar alle 4 Methoden in die Basis-Klasse verlegt werden können, die Methoden *Beschleunigen* und *Bremsen* müssen trotzdem in den Unterklassen nochmal überschrieben werden. Denn Beschleunigungs- und Bremsverhalten ist bei LKW und Cabrio doch sehr unterschiedlich. Das Cabrio beschleunigt vermutlich besser als der LKW, allerdings benötigt der LKW vielleicht auch stärkere Bremsen, weil er ja wesentlich schwerer ist. Wir können die Methoden also zwar in der Basis-Klasse anlegen, aber eine konkrete Funktionalität müssen die beiden Unterklassen selbst liefern. Schauen wir uns diesen Stand mal im Quelltext an. Beginnen wir mit der Basis-Klasse *Fahrzeug*. Wir haben hier ein Attribut für die Geschwindigkeit, das Attribut ist als *protected* markiert, damit auch die Unterklassen direkt auf dieses Geschwindigkeits-Attribut zugreifen können. Dann haben wir die Beschleunigen- und die Bremsen-Methoden. Wir haben zwei Möglichkeiten für die Implementierung, entweder wir lassen sie weg, so wie hier, das heißt die beiden Methoden machen gar nichts oder wir versuchen hier irgendeine Art von Standard-Verhalten einzubauen. So was wie, die Geschwindigkeit wird immer um 1 erhöht und immer um 1 abgesenkt. Die Schwierigkeit hierbei ist, ein Standard-Verhalten zu finden, dass für alle möglicherweise nach uns kommenden Unterklassen funktioniert. Es wäre denkbar, das in Zukunft weitere Fahrzeuge dazu kommen. Vielleicht Traktor oder ein Fahrrad oder ein Go-Kart. Es ist unmöglich, eine passende Implementierung für die beiden Methoden zu finden, die für alle noch kommenden Unterklassen funktioniert. Eine Leer-Implementierung, gar nichts schreiben in die beiden Methoden, ist aber auch nicht das Wahre. Der Hobby-Bastler baut sich dann eine Unterklasse, erzeugt sich ein Objekt und will losfahren. Und nichts passiert. Wir müssten in die Dokumentation schreiben: Jeder, der eine Unterklasse von Fahrzeug erzeugt, muss die beiden Methoden *Beschleunigen* und *Bremsen* überschreiben. Ja, Dokumentation. Die liest dann auch jeder Entwickler und hält sich daran. Noch besser wäre es natürlich, wenn der Java-Compiler selbst überprüfen könnte, ob jeder diese Methoden überschrieben hat. Dann könnte er Compiler-Fehler melden, das Programm würde nicht erst zur Ausführung kommen. Die Lösung liegt im Schlüsselwort *abstract*. Das zeige ich Ihnen am besten im Quelltext. Statt die beiden Methoden mit irgendwelchen vermutlich nicht funktionierenden Werten zu versehen, nehmen wir den Rumpf der Methoden komplett raus. Das heißt also, keine geschweiften Klammern, nicht nur nicht nichts zwischen den geschweiften Klammern, die Klammern verschwinden ebenfalls. Nach der runden Klammer zu kommt ein Semikolon. Damit das funktioniert, muss hier davor noch das eben erwähnte Schlüsselwort *abstract*. Das Gleiche mache ich mit *Bremsen*. Nein hier und das hier raus, das auch, und einfach ein Semikolon dahinter. Wir haben hier in unserer Klasse *Fahrzeug* zwei abstrakte Methoden. Eine abstrakte Methode hat keinen Rumpf, sie hat keine Implementierung. Ich gebe hier also lediglich die Signatur der Methode vor, das heißt den Namen der Methode, die Parameter-Liste, die jetzt hier bei uns leer ist und den Rückgabe-Typ. Die Implementierung lasse ich offen. Würde ich jetzt ein Fahrzeug-Objekt erzeugen und dann versuchen eine dieser Methoden aufzurufen, dann wäre nicht richtig klar, welcher Code dort ausgeführt werden soll. Denn es gibt ja gar keinen. Deshalb gilt die Regel, wenn eine Klasse abstrakte Methoden hat, eine oder mehrere, dann muss ich auch die Klasse als abstrakt markieren. Das ist auch das, was uns hier diese Fehlermeldung mitteilen wollte. Was bedeutet das, wenn eine Klasse abstrakt ist? D.h,, dass ich von dieser Klasse keine Objekte erzeugen kann. Versuche ich es, bekomme ich Compiler-Fehler. Fein, wir haben uns also mit dem Schlüsselwort *abstract* drumrum gedrückt, für diese beiden Methoden Implementierungen zu liefern. Schauen wir uns an, was für Auswirkungen das auf Unterklassen hat, indem wir versuchen, die Klasse *Go-Kart* zu bauen. Ich erzeuge hier also eine neue Klasse, nenne sie *Go-Kart*, im selben Package und drücke auf *Finish*. Und dann schreibe ich hier, hinter den Klassennamen, *extends Fahrzeug*. Siehe da, Compiler-Fehler. Der Compiler sagt mir, diese Klasse überschreibt nicht die Methoden *Bremsen* und *Beschleunigen* aus der Oberklasse. Das heißt also, wenn Sie von einer Klasse, die abstrakt ist, eine Unterklasse erzeugen möchten, müssen Sie Methoden, die in der Oberklasse abstrakt sind, also unvollständig, hier in Ihrer Klasse vervollständigen. Nur so ist es ja möglich, die Methoden dann später auch aufzurufen. Die Implementierung, zumindest die Leer-Implementierungen, können wir uns erstmal von der IDE geben lassen. Hier, *Implement all abstract methods*, das sieht dann so aus. Und jetzt können wir hier unsere Go-Kart spezifischen Implementierungen rein schreiben. Denn, wir haben ja jetzt erfahren müssen, es geht nicht ohne. Der Compiler ist glücklich, wir dürfen uns ein Go-Kart bauen und dürfen damit los tuckeln. Das Schlüsselwort *abstract* gibt uns die Möglichkeit, in einer Basis-Klasse schon die Schnittstelle festzulegen, also Methoden-Namen, Parameter-Typen, Rückgabe-Typ, ohne dabei schon irgendeine Form von Implementierung der Methoden liefern zu müssen. So können wir absichern, dass alle Unterklassen über eben diese Methoden verfügen. Versucht jemand eine Unterklasse zu bauen, ohne die Implementierungen für die abstrakten Methoden, bekommt er einen Compiler-Fehler. Sie haben gesehen, dass von einer Klasse, die abstrakte Methoden enthält, keine Objekte erzeugt werden können dürfen, weshalb dann auch die ganze Klasse als abstrakt markiert werden muss; was dann wiederum genau diese Objekt-Erzeugung erfolgreich verhindert. Versuchen Sie es, heißt es auch hier: Compiler-Fehler.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!