Was ist der Unterschied zwischen einer abstrakten Klasse und einem Interface?

Interface

Ein Interface definiert Methoden. Diese Methoden müssen von allen abgeleiteten Klassen, die nicht abstrakt sind, implementiert werden. Neben den Signaturen für die zu implementierenden Methoden kann ein Interface Konstanten und Enumerationen haben.

Interfaces werden verwendet, um Software zu schreiben, die unabhängig von einer konkreten Implementierung ist. Festgelegt wird im Interface lediglich eine Schnittstelle. Diese Schnittstelle beschreibt, wie eine Klasse zu verwenden ist.

Beispiel aus der Java-Klassenbibliothek:
Alle nicht abstrakten Klassen, die das Comparable-Interface implementieren, müssen eine konkrete Implementierung der Methode compareTo() anbieten.

Abstrakte Klasse

Eine abstrakte Klasse kann im Unterschied zum Interface neben abstrakten Methoden auch konkrete Implementierungen von Methoden haben. Außerdem kann sie auch Instanz- und Klassenvariablen besitzen. Eine abstrakte Methode legt – genauso wie eine Interface-Methode – eine Signatur für die zu implementierende Methode fest.

Bei der Verwendung von abstrakten Klassen ist zu beachten, dass eine Klasse von höchstens einer abstrakten Klasse abgeleitet werden kann. Im Gegensatz dazu kann eine Klasse beliebig viele Interfaces implementieren.