Ich würde mal sagen, dass es dafür keine pauschale Regel gibt, mit der man alles erschlagen kann. Das Buch von Joshua Bloch(Java guru und Mitentwickler selbiger Programmiersprache) Effective Java, gibt hier einen guten Überblick was wann verwendet werden sollte.
Es kommt hier nicht nur darauf an was man Programmieren möchte, sondern wie.
Man kann einen Sachverhalt mit Interfaces, Superklassen oder Abstrakten Klassen darstellen.
Interfaces geben "nur" an welche Methoden eine Klasse enthält. Also welche Schnittstellen zur Aussenwelt ein Programm mindestens enthält.
Eine Klasse kann mehrere Interfaces implementieren.
z.B. Auto implements KannFahren, Boot implements KannSchwimmen, ==> Amphibienfahrzeug implements KannFahren, KannSchwimmen
Abstrakte Klassen sollte man verwenden wenn man sicherstellen möchte, das eine Methode der Subklasse auch tatsächlich implementiert wird. Wenn ich z.B eine Normale Klasse als Oberklasse habe und nun davon in mehreren verschiedenen Klassen erbe und dort jeweils die gleichen Methoden überschreibe und zudem vllt. noch die eigentliche Oberklasse nie wirklich benutze. So habe ich zumindest mal einen Kandidaten für die Abstrakte Klasse und eine abstrakte Methode.
Normale Klassen als "Oberklassen" werden oftmals "schlecht" verwendet (Gehörte selbst dazu). Eine Klasse als Superklasse, sollte nur die wirklich Notwendigen öffentlichen Methoden und Variablen haben, die es wirklich brauch. Wenn man nun davon erbt, stellt man oftmals fest, das man irgendetwas aus der Suberklasse braucht und nicht darauf zugreifen kann. Nun sollte man aber nicht die Superklasse ändern sondern die Subklasse darauf anpassen.