Interfejsy mają pokazywać bardziej zachowanie danego obiektu, natomiast klasa abstrakcyjna daje dodatkową semantykę dla obiektu. Np. Node w JavaFx nie bardzo pasuje pod interfejs bo przechowuje jakiś stan i tworzenie bezpośrednio instancji tego obiektu też było by bez sensu. Zadaniem klasy jest własnie też podtrzymanie jakiegoś stanu, interfejs raczej nie bardzo się do tego nadaje, bo nie można w nim tworzyć pól.
Abstrakcyjna klasa może przydać się np. we wzorcu Metoda szablonowa.
Z bardziej technicznych rzeczy to, w interfejsie nie zablokujesz sobie nadpisania metody:
interface Inter
{
public default void method()
{
System.out.println("default");
};
}
abstract class AbstClass
{
public final void method() //mozna uzyc final
{
System.out.println("default");
}
}
class A extends AbstClass
{
@Override
public void method(){} //bład, ta metoda jest finalna i nie można jej nadpisać
}
class B implements Inter
{
@Override
public void method() //działa
{
}
}