Коротко:
- Интерфейс имеет только описание методов без реализации, абстрактный класс - методы (можно даже с реализацией) и атрибуты.
- Мы не можем инициализировать объект ни от объекта, ни от интерфейса.
- В Java мы можем наследоваться только от одного класса, зато можно реализовать множество интерфейсов.
Подробно с примерами:
Мы уже узнали, что абстрактный класс может хранить в себе атрибуты и методы, а значит он содержит в себе и состояние, и поведение.
Интерфейс хранит в себе методы и описывает только поведение.
Разберем более подробно на старом добром примере.
У нас есть абстрактный класс Person и от него наследуются 3 класса - Маг, Воин и Охотник. Сделать наследование было логичным решением, чтобы не дублироваться в написании кода, у каждого из персонажей есть параметры здоровья и защиты, а так же каждый владеет методами боевого клича и контратаки.
Теперь мы хотим добавить еще персонажей. Добавим к нашему бравому отряду живых еще летающего Грифона и возьмем из легиона мертвецов Некроманта, а так же Костяного дракона. Новые персонажи тоже могут наследоваться от класса Person, у них тоже есть параметры здоровья, защиты, а также навык боевого клича. Здорово.
А что есть общего, например у Грифона и Костяного дракона? Правильно! Они умеют летать, по сути их можно объединить по этому признаку. Но как?! Они же уже наследуются от класса Person, а в Java нет множественного наследования, плак-плак ;(
Вот тут на помощь и приходит интерфейс! Интерфейсы очень хорошо могут объединять очень даже далекие по смыслу классы, главное, чтобы у них было одинаковое поведение. Давайте сделаем наших персонажей летабельными, создадим интерфейс Flyable, добавим в него метод fly(), а к нашим классам добавим ключевое слово implements (реализует).
Теперь мы можем, например, объединить всех летающих существ в массив и вызвать у каждого метод полета:
Кстати мага и некроманта можно объеденить в интерфейс, например, Wizardable с методом makeSpell(), который у каждого из них уже есть. Ну или наследовать от класса Person абстрактный метод Mage и сделать наших некромантов и волшебника наследниками от Mage. Здесь воображению нет предела, это все дело тщательной проектировки и планирования будущего проекта. Главное помнить, что все эти инструменты нужны нам для аккуратного структурированного кода, который можно легко масштабировать и адаптировать под новые требования заказчика.
Если остались какие-то вопросы или что-то нужно разобрать подробнее, буду признателен комментарию, постараюсь дописать и привести примеры)