Вы хорошо описали практические различия в использовании и реализации, но ничего не сказали о различии в значении.
Интерфейс - это описание поведения, которое будет иметь класс реализации. Класс реализации гарантирует, что он будет иметь эти методы, которые могут быть использованы на нем. Это в основном контракт или обещание, которое должен выполнить класс.
Абстрактный класс является основой для разных подклассов, которые разделяют поведение, которое не нужно многократно создавать. Подклассы должны выполнить поведение и иметь возможность переопределить предопределенное поведение (если оно не определено как final
или private
).
Вы найдете хорошие примеры в пакете java.util
, который включает интерфейсы, такие как List
и абстрактные классы, такие как AbstractList
, которые уже реализуют интерфейс. Официальная документация описывает AbstractList
следующим образом:
Этот класс обеспечивает скелетную реализацию интерфейса List для минимизации усилий, необходимых для реализации этого интерфейса при поддержке хранилище данных «произвольного доступа» (например, массив).