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