# Abstrakte Klassen /Interface



## zitamina (11. Apr 2012)

Im vergleiche zu Interfaces haben abstrakter Klassen als Vorteil das Hinzufügen von Methoden mit Default-Implementierung bei der Erweiterung der Schnittstelle. Dies kann aber auch ein Nachteil sein. Warum ist das so?


----------



## Gast2 (11. Apr 2012)

Ich seh darin keinen Nachteil.


----------



## tfa (11. Apr 2012)

Das ist eine große Einschränkung. Eine Klasse kann zwar mehrere Interfaces implementieren, aber nur von einer abstrakten Klasse abgeleitet sein.


----------



## Marcinek (11. Apr 2012)

Die Defaultimplementierungen können nur durch überschreiben geändert werden. Man wird aber darauf nicht hingewiesen im Sinne von "must implement abstrakt Methods".


----------



## JavaProfi (13. Apr 2012)

Teilaspekte wurden hier schon gepostet.
Jedoch erklärt sich der eigentliche Unterschied zwischen abstrakten Klassen und interfaces aus der polymorphen Sicht der Objektorientierung. Das ist zwar jetzt sehr theoretisch, aber zum Gesamtverständnis der Objektorientierung ein wesentlicher Unterschied.

1) Eine Klasse beschreibt ein konkretes Objekt der realen Welt.
2) Eine abstrakte Klasse beschreibt ein Objekt der realen Welt, welches jedoch nicht konkret ist und damit als eigenständiges Objekt nicht existieren darf/soll, sondern nur Spezialisierungen davon.
3) Ein Interface beschreibt bestimmte "Fähigkeiten" von (i.d.R. mehreren) Objekten. Insofern werden Interfaces von Java-Entwicklern auch immer "....able" benannt, wie z.B. Clonable, Obserable, Serializable, Comparable, ....

Da eine abstrakte Klasse ein Objekt beschreibt und keine Fähigkeiten eines oder mehrerer Objekte, kann es auch Teilimplementierungen enthalten. Abstrakte Klassen dürfen nämlich sehr wohl Implementierungen enthalten, Interfaces nicht. Aus dem selben Grund dürfen abstrakte Klassen auch über "Eigenschaften" in Form von nicht abstrakten Variablen verfügen. 

Da abstrakte Klassen nicht eigenständige Objekte repräsentieren, kann eine abstrakte Klasse nicht instanziert werden, sondern nur die Spezialisierungen davon. Die Methoden einer abstrakten Klasse "können" (=müssen nicht) durch die Spezialisierung "überschrieben" werden.
Methoden eines interfaces "müssen" durch die Klasse "implementiert" werden.

Gruß
JP


----------



## zitamina (29. Apr 2012)

Unter Umständen entspricht die Default-Implementierung dabei nicht dem Verhalten, welches für eine (inzwischen bereits) abgeleitete Klasse eigentlich erforderlich wäre.


----------

