Es gibt eigentlich (aktuell) nur die folgenden Einschränkungen (unabhängig davon, ob du eine abstrakte oder nicht-abstrakte Oberklasse verwendest):
- eine Klasse kann nur eine Oberklasse haben, aber beliebig viele Interfaces implementieren (wenn du also irgendwann einmal mehrere "Schnittstellen"/Sichten auf deine Klasse hinzufügen willst, dann musst du es mit Java Interfaces machen und nicht mit Oberklassen)
- ein Interface kann keinen Zustand vererben (du kannst also keine Instanzvariablen (wohl aber Konstanten) in einem Interface deklarieren)
- die Methoden eines Interfaces sind immer public (bei einer abstrakten Klasse könntest du sie noch protected machen, damit zumindest noch ableitende Klassen oder Klassen imselben Package Zugriff auf die Methoden haben, nicht aber andere Klasse außerhalb)
Du kannst dir aber schon mal folgenden Satz merken: "Prefer composition over inheritance".
Man sollte, wenn möglich, also auf Vererbung verzichten und stattdessen lieber Komposition wählen, da Vererbung statisch/starr ist, aber Komposition zur Laufzeit angepasst werden kann. Du kannst eben (aktuell) zur Laufzeit nicht die Oberklasse einer Klasse ändern, wenn es für deinen Anwendungsfall sinnvoll ist.