Java Interfaces und abstrakte Klassen?

4 Antworten

Abstrakte klassen verwendest du, wenn du dem programmierer die nöglichkeit geben willst etwas genauer zu definieren und nur grundfunktionen festlegen willst. z.B: du hast eine Klasse Auto als abstrakt klass. Jetzt definierst du dort funktionen die alle auto haben müssen wie motor starten oder so. Die genauere dann kann man auto noch genauerer definieren, in Audi etc und noch genauer in sportwagen etc. Alle haben z.b. den Motor start in der Abstrakten klasse anders definiert. Wenn du jetzt Viele verschiedene automarken hast. Ein audi, ein Vw etc. Kannst du alle in einem array vom typ auto speichern und die funktion motor starten ausführen.

Im Grunde liegt der Unterschied in der Geschichte von Java begründet.

Das Problem war nämlich, man wollte Mehrfachvererbung ermöglichen, das ging aber mit abstrakten Klassen aus folgendem Grund nicht:

Stell dir 2 abstrakte Klassen vor und beide haben eine abstrakte Methode die genauso heisst wie die andere mit selber Signatur.

Nun irbt eine Klasse von beiden Klassen, die Frage ist nun wie soll der Compiler zwischen den beiden Signaturgleichen Methoden unterscheiden? Damals ging das nicht, sodass man für diesen Fall eine neue Struktur (Interfaces) eingebracht hat und man deshalb explizit den Interfacenamen vor der Methode die man implementiert angibt (bei expliziter Interface Methodenimplementierung), angegeben hat.

Heutzutage ist es möglich diesen Fall auch in abstrakten Klassen durch den Compiler abzufangen. In C++ wird das so gemacht, in Java wird es so belassen aus Abwärtskompatibilitätsgründen.

So wurde das zumindest im 1. Semester bei uns mal gesagt vom Prof.


regex9  21.07.2018, 21:46

Beschrieben wird hier das Diamond-Problem.

Die Mehrfachvererbung war in C++ schon vor Java möglich. Bei der Entwicklung von Java hat man sich allerdings bewusst für einen anderen Lösungsansatz als in C++ entschieden.

Jetzt interfaces. Wenn du abstrakte klassen verstanden hast und das was ich dir erklärt habe dann verstehst du auch interfaces. Abstrakte klassen bieten dir eine genauere festlegung des Rahmens. Interfaces sind nur abstract. Siehe auch das Beispiel in wiki:

https://de.m.wikipedia.org/wiki/Schnittstelle


An abstract class can have shared state or functionality.

An interface is only a promise to provide functionality. A good abstract class will reduce the amount of code that has to be rewritten because it's functionality or state can be shared. The interface has no data members to be shared.