Abstrakte Klasse vs. Interface

Status
Nicht offen für weitere Antworten.

kossy

Bekanntes Mitglied
Hallo Leute !

Ich muss mal etwas über strakte Klassen und Interfaces wissen. Wann genau baue ich in meinen Javacode Abstrakte Klassen und wann Interfaces ein? Ich habe einiges über diese beiden Dinge gelesen, in der Theorie bin ich also fit. Allerdings will mir nicht so recht in den Kopf, wann was in der Praxis eingesetzt wird. Hoffe, ihr könnt mir mal ein paar Stichwörter zukommen klassen!?

MFG
 
M

maki

Gast
Mehrfachvererbung ist mit (abstrakten) Klassen nicht möglich, mit Interfaces schon.
Interfaces definieren nur Schnittstellen, also Dinge die ein Objekt "kann", während bei Klassenvererbung eine "ist-ein" Beziehung erzeugt wird.
 

Marco13

Top Contributor
Ganz grob:

In einem Interface steht, was ALLE können sollen, die das Interface implementieren
In einer abstrakten Klasse steht, was ALLE können sollen, die von der Klasse erben, und ein Teil davon ist vielleicht schon implementiert

Code:
// Definieren, was alle Lebewesen können
interface Lebewesen
{
    void esse();
    void schlafe();
}

// Das, was bei allen Lebewesen gleich ist, schonmal implementieren,
// und das was unterschiedlich ist abstrakt lassen
abstract class AbstraktesLebewesen // Könnte schon implements Lebewesen machen...
{
    abstract void esse();

    void schlafe()
    {
        legDichHin();
        while (müde())
        {
           atmeEin();
           atmeAus();
        }
        wacheAuf();
    }

}


class Mensch extends AbstraktesLebewesen implements Lebewesen
{
    void esse()
    {
        dieSacheMitMesserUndGabel();
    }

    // Schlafe ist schon in der abstrakten BasisKlasse implementiert!
}


class Tier extends AbstraktesLebewesen implements Lebewesen
{
    void esse()
    {
        mampf();
    }

    // Schlafe ist schon in der abstrakten BasisKlasse implementiert!
}
 

kossy

Bekanntes Mitglied
Nettes Codebeispiel ! Danke schön. Wenn sich noch weitere Frage im Laufe der Zeit ergeben, dann wärme ich diesen Post nochmal auf !
 

0815

Mitglied
Mehrfachvererbung ist mit (abstrakten) Klassen nicht möglich, mit Interfaces schon.
Interfaces definieren nur Schnittstellen, also Dinge die ein Objekt "kann", während bei Klassenvererbung eine "ist-ein" Beziehung erzeugt wird.

bei der mehrfach implementation von interfcaces handelt es sich nicht um mehrfachvererbung. da man keine methoden / eigenschaften erbe, sondern nur dazu gezwungen wird diese zu implementieren.

auch bei interfaces handelt es sich um eine "ist-ein" beziehung.
siehe listener: addActionListener(ActionListener l);

jede klasse, die ActionListener implementiert "ist ein" ActionListener.
 
M

maki

Gast
bei der mehrfach implementation von interfcaces handelt es sich nicht um mehrfachvererbung. da man keine methoden / eigenschaften erbe, sondern nur dazu gezwungen wird diese zu implementieren.
Ein Interface kann von mewheren Erben, mit Klassen geht das nicht.
Die Behauptung dass es sich nicht um Mehrfachvererbung handelt weil die Implementerung nicht mitvererbt wird sondern nur die Schnittstelle ist schlicht falsch.

auch bei interfaces handelt es sich um eine "ist-ein" beziehung.
siehe listener: addActionListener(ActionListener l);

jede klasse, die ActionListener implementiert "ist ein" ActionListener.
Nicht unbedingt, siehe "mix ins", durch Klassenvererbung wird eine viel höhere Kopplung erzeugt.
Der Actionlistener könnte aber auch "Comparable", "Serialiasable" sein, das ist keine "ist-ein" Beziehung.
 

kossy

Bekanntes Mitglied
Nochmal ne Frage zum Thema. Also ich kann ja eine Referenzvariable von einer abstrakten Klasse anlegen, aber selbst kein abstraktes Objekt erzeugen. Bei Interfaces kann eine Referenzvariable vom Typ eines Interfaces mit einer Klasse kompatibel sein, die dieses Interfaces implementiert. (Hoffe ich habe mich korrekt ausgedrückt).

Wann genau macht es Sinn mit einer Referenzvariable vom Typ einer abstrakten Klasse zu arbeiten und wann mit der Referenzvariable vom Typ eines Interfaces. Der genaue Unterschied und jeweilige Vor- und Nachteil wäre für mich wichtig, damit man diese Programmierstile besser versteht und auch selbst bei Problemstellungen verwenden kann, wenn man selbst programmiert.
 

Leroy42

Top Contributor
Mit der Referenzvariablen des Typs einer (abstrakten) Klasse zu arbeiten macht Sinn,
wenn dort Instanzen einer von dieser Klasse abgeleiteten verwiesen werden soll.

Mit der Referenzvariablen des Typs eines Interfaces kannst du auf Instanzen
verweisen deren Klasse dieses Interface implemtieren
 

Marco13

Top Contributor
Stark verallgemeinert würde ich sagen, dass man Referenzen auf abstrakte Klassen "selten" braucht, weil "oft" die abstrakte Klasse nochmal durch ein Interface verallgemeinert ist. Als Beispiel: Man würde nicht sowas machen
AbstractList<String> list = new ArrayList<String>();
sondern gleich
List<String> list = new ArrayList<String>();
 

kossy

Bekanntes Mitglied
Mit der Referenzvariablen des Typs einer (abstrakten) Klasse zu arbeiten macht Sinn,
wenn dort Instanzen einer von dieser Klasse abgeleiteten verwiesen werden soll.

Mit der Referenzvariablen des Typs eines Interfaces kannst du auf Instanzen
verweisen deren Klasse dieses Interface implemtieren

Jo das entspricht ja dem, was ich bereits gesgat hatte. Aber gibt es noch spezielle Vor- und Nachteile, wenn ich die eine oder andere Variante benutze?
 

Landei

Top Contributor
Ein häufiges Muster ist:

interface Interface{}
abstract class AbstractClass implements Interface{}
class ConcreteClass extends AbstractClass{}

Beispiele aus der Java-API:
- MouseListener (interface), MouseAdapter (abstract class), eigene Implementierung (konkrete Klasse)
- TableModel (interface), AbstractTableModel (abstract class), DefaultTableModel (konkrete Klasse)

Mit diesem Muster hat man immer ein interface, das man zurückgeben kann (und gegebenenfalls direkt implementieren, z.B. wenn man schon eine Klasse erweitert, also nicht von der abstrakten Klasse erben kann). Die abstrakte Klasse stellt nützliche Grundfunktionalität zusammen, erleichtert also das Erstellen konkreter Klassen.
 

kossy

Bekanntes Mitglied
Mit diesem Muster hat man immer ein interface, das man zurückgeben kann (und gegebenenfalls direkt implementieren, z.B. wenn man schon eine Klasse erweitert, also nicht von der abstrakten Klasse erben kann).

Vielen Dank für deinen Post ! Was genau meinst Du mit zurückgeben?


Die abstrakte Klasse stellt nützliche Grundfunktionalität zusammen, erleichtert also das Erstellen konkreter Klassen.

Wobei man aber in Deinem Beispiel mit den "Listener-Klassen" auch darauf verzichten könnte. Es müssten nur alle Methoden des Interfaces implementiert werden. Sehe ich das richtig?
 

Marco13

Top Contributor
Es müssten nur alle Methoden des Interfaces implementiert werden. Sehe ich das richtig?

Ja. Aber genau um das "nur alle" geht's :D Das können ziemlich viele sein (MouseListener) von denen man nur wenige mit was sinnvollem überschreiben will, oder es können welche sein, die für viele abgeleitete Klassen gleich sein sollen, und deswegen schonmal in einer abstrakten Klasse vorgefertigt angeboten werden können.
 

André Uhres

Top Contributor
Related reading: Abstract Classes vs. Interfaces
Schnittstellen sind in vielen Fällen besser als abstrakte Klassen, obwohl wir die Schnittstelle gleich beim ersten Mal richtig definieren müssen. Das nachträgliche Ändern der Schnittstelle wird viel Code brechen.
Abstrakte Klassen sind nützlich, wenn wir eine teilweise Umsetzung zur Verfügung stellen wollen. In diesem Fall sollten wir ebenfalls eine Schnittstelle definieren, und die Schnittstelle in der abstrakten Klasse implementieren.
 

0815

Mitglied
Ein Interface kann von mewheren Erben, mit Klassen geht das nicht.
Die Behauptung dass es sich nicht um Mehrfachvererbung handelt weil die Implementerung nicht mitvererbt wird sondern nur die Schnittstelle ist schlicht falsch.


Nicht unbedingt, siehe "mix ins", durch Klassenvererbung wird eine viel höhere Kopplung erzeugt.
Der Actionlistener könnte aber auch "Comparable", "Serialiasable" sein, das ist keine "ist-ein" Beziehung.

zu pkt1.
vererbung ist laut verschiedenen definitionen in der objektorientierung "die möglichkeit einer KLASSE von einer anderen KLASSE zu erben deren sichtbare eigenschaften methoden zu zu verwenden/überschreiben/....(und weitere dinge tun.)
auch SUN's "Java Language Specification" verwendet den begriff "inheritance" nur im bezug auf KLASSEN.

nungut.
wenn wir nun den begiff "vererbung" abweichend von der definition des objektorientierten programmierens;
und auch abweichend von der "Java Language Specification";

auf das erweitern von schnittstellen, deren hirarchie und der möglichkeit, dass ein subinterface mehrere superinterfaces haben kann, anwenden,
gebe ich dir recht.

da ich aber deine definition nich kannte, bezog sich mein beitrag auf "interface ~" bzw "multiple typ inheritance", (welche erst bei klaseendefinition am 'implements' ansetzen) was laut verschiedener quellen 'übliche begriffe' sind. und welche eine möglichkeit bieten mehrfachvererbung zu simulieren.

sry, dass meine ausführungen so missverständlich waren. (musste dringend weg und konnte meine gedanken nicht beenden)


zu pkt 2.
ich habe die "ist ein beziehung" nur an "objektes ist vom Typ" festgemacht.
class c extends superC implements if1, if2 ("ist ein" superC / if1 / if2)
ich werde mich mal nach "mix ins" und stärke der kopplung unschaun.
>>zurückruder<<
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Nehmen wir z.B. eine Klasse "MyPoint", die geometrische X-, Y-Punkte definiert, mit den üblichen Konstruktor und Accessor-Methoden. Die Klasse implementiert drei Schnittstellen. Eine Schnittstelle wird verwendet, um einen Punkt mit einem anderen zu vergleichen, eine andere wird für die Berechnung der Distanz zwischen zwei Punkten benutzt, und die letzte definiert "MyPoint"-Objekte als serialisierbar.
Ein alternativer Ansatz wäre, eine neue Schnittstelle Composite (eine sogenannte "Unterschnittstelle") zu definieren, die die drei Schnittstellen erweitert, und dann Composite in MyPoint zu implementieren. Dies ist ein Beispiel für ein "nonhierarchical type framework".
Es ist einfach, eine bestehende Klasse nachzurüsten, um eine neue Schnittstelle zu implementieren. Dies wird manchmal auch als "Mixin" bezeichnet. In einem Mixin erklärt eine Klasse, dass sie ein optionales Nebenverhalten zusätzlich zu seiner Hauptaufgabe anbietet. "Comparable" ist ein Beispiel für ein Mixin.
 

titus

Mitglied
Ich wollte auch nur einmal Dankeschön sagen, für das obere Code-Beispiel. Das ist echt gut und idiotensicher - also genau richtig für mich! ;D Ich hatte gerade die selbe Frage unter den Fingern brennen und wollte schon einen neuen Thread aufmachen, bis mir einfiel, dass es doch auch eine Suchfunktion gibt. :D
 

sliwalker

Top Contributor
Noch ein weiterer Aspekt ist, dass abstrakte Klassen dann sinnvoll sind, wenn man dennoch ausimplementierte Methoden bereitstellen möchte, die nicht überschrieben werden können. Diese Möglichkeit bietet sich Dir bei Interfaces nicht. Es kann zum Beispiel sein, dass ein Verhalten (Objekt zu EntityBean) unanhänig vom Typ des Objekts geschehen soll. Eine Implementierung eines Interfaces würde in diesem Fall schlicht zu viele Freiheiten lassen.

Ein wenig unprofessionell formuliert, aber der merksatz in meinem Kopf lautet etwas so, dass ich jederzeit gegen Interfaces implementiere bzw. Mix-In Beziehungen gegen Interfaces, außer ich möchte Verhalten explizit und nicht-änderbar vorgeben.
 

Localtime

Mitglied
Jaja ... der Joda .... bildet 500 Jahre Jedi-Ritter aus, bekommt aber keinen einzigen Satz vernünftig über die Lippen. :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
G Interface oder Abstrakte Klasse? Java Basics - Anfänger-Themen 3
Acha Unterschied Interface - abstrakte Klasse Java Basics - Anfänger-Themen 4
B OOP: abstrakte klasse implementiert interface Java Basics - Anfänger-Themen 3
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
A Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt? Java Basics - Anfänger-Themen 7
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
M abstrakte Klasse Java Basics - Anfänger-Themen 3
F Abstrakte Klasse: Konstruktor vs init() Java Basics - Anfänger-Themen 13
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
A Abstrakte Klasse Java Basics - Anfänger-Themen 3
G abstrakte klasse Java Basics - Anfänger-Themen 6
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
T abstrakte Klassen? Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
M abstrakte klassen und interfaces Java Basics - Anfänger-Themen 2
L abstrakte Methode nicht implementiert! Java Basics - Anfänger-Themen 5
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
H abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 13
R Interfaces durch abstrakte Klassen ersetzbar? Java Basics - Anfänger-Themen 8
A Eine abstrakte Methode static machen? Java Basics - Anfänger-Themen 4
A Abstrakte Klassen und Interfaces Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben