Найти тему
JavaKruzh

Чем интерфейс отличается от абстрактного класса?

Коротко:

  1. Интерфейс имеет только описание методов без реализации, абстрактный класс - методы (можно даже с реализацией) и атрибуты.
  2. Мы не можем инициализировать объект ни от объекта, ни от интерфейса.
  3. В Java мы можем наследоваться только от одного класса, зато можно реализовать множество интерфейсов.

Подробно с примерами:

Мы уже узнали, что абстрактный класс может хранить в себе атрибуты и методы, а значит он содержит в себе и состояние, и поведение.

Интерфейс хранит в себе методы и описывает только поведение.

Разберем более подробно на старом добром примере.

У нас есть абстрактный класс Person и от него наследуются 3 класса - Маг, Воин и Охотник. Сделать наследование было логичным решением, чтобы не дублироваться в написании кода, у каждого из персонажей есть параметры здоровья и защиты, а так же каждый владеет методами боевого клича и контратаки.

Теперь мы хотим добавить еще персонажей. Добавим к нашему бравому отряду живых еще летающего Грифона и возьмем из легиона мертвецов Некроманта, а так же Костяного дракона. Новые персонажи тоже могут наследоваться от класса Person, у них тоже есть параметры здоровья, защиты, а также навык боевого клича. Здорово.

А что есть общего, например у Грифона и Костяного дракона? Правильно! Они умеют летать, по сути их можно объединить по этому признаку. Но как?! Они же уже наследуются от класса Person, а в Java нет множественного наследования, плак-плак ;(

Вот тут на помощь и приходит интерфейс! Интерфейсы очень хорошо могут объединять очень даже далекие по смыслу классы, главное, чтобы у них было одинаковое поведение. Давайте сделаем наших персонажей летабельными, создадим интерфейс Flyable, добавим в него метод fly(), а к нашим классам добавим ключевое слово implements (реализует).

Теперь мы можем, например, объединить всех летающих существ в массив и вызвать у каждого метод полета:

-3

Кстати мага и некроманта можно объеденить в интерфейс, например, Wizardable с методом makeSpell(), который у каждого из них уже есть. Ну или наследовать от класса Person абстрактный метод Mage и сделать наших некромантов и волшебника наследниками от Mage. Здесь воображению нет предела, это все дело тщательной проектировки и планирования будущего проекта. Главное помнить, что все эти инструменты нужны нам для аккуратного структурированного кода, который можно легко масштабировать и адаптировать под новые требования заказчика.

Если остались какие-то вопросы или что-то нужно разобрать подробнее, буду признателен комментарию, постараюсь дописать и привести примеры)