Разница между интерфейсом и абстрактным классом в Java

Разница между абстрактным классом и интерфейсом в Java

Абстрактный класс и интерфейс являются основной частью языка программирования Java. В последних статьях мы узнали что такое Java интерфейс и абстрактный класс в Java.

В этой статье мы узнаем о разнице между абстрактным классом и интерфейсом и когда лучше использовать интерфейс, а когда абстрактный класс.

Разница между абстрактным классом и интерфейсом

  1. Ключевое слово abstract используется для того, чтобы создать абстрактный класс с методами, а ключевое слово interface  используется для создания интерфейса и не может быть использовано с методами.
  2. Подклассы используют ключевое слово extends чтобы наследовать абстрактный класс. При этом они должны обеспечить реализацию всех заявленных методов в абстрактном классе. Если же подкласс не является абстрактным классом и использует ключевое слово implements для реализации интерфейсов, то он должен обеспечить реализацию для всех методов, объявленных в интерфейсе.
  3. Абстрактные классы могут иметь методы с реализации, тогда как интерфейс обеспечивает абсолютную абстракцию и не может иметь каких-либо реализаций метода.
  4. Абстрактные классы могут иметь конструкторы; интерфейсы не могут иметь конструкторов.
  5. У абстрактного класса есть все черты обычного Java-класса, за исключением того, что мы не можем создать его экземпляр. Мы можем использовать ключевое слово abstract чтобы создать абстрактный класс. Интерфейс может иметь только статические public static final константы и объявления методов.
  6. Абстрактные методы классов могут иметь public, private, protected и static модификаторы доступа, а методы интерфейса неявно public и abstract, поэтому мы не можем использовать другие модификаторы доступа с методами интерфейса.
  7. Подкласс может наследовать только один абстрактный класс, и реализовать несколько интерфейсов.
  8. Абстрактный класс может наследовать другой класс и реализовывать интерфейсы, а интерфейс может только наследовать другие интерфейсы.
  9. Мы можем запустить абстрактный класс, если он имеет метод main(). Мы не можем запустить интерфейс, потому что у него не может быть реализации метода main().
  10. Интерфейс обеспечивает так называемый контракт для всех классов, которые реализуют интерфейс. Абстрактный классы — класс с реализацией метода по умолчанию для подклассов.

Вот и вся разница между интерфейсом и абстрактным классом. Теперь мы можем двигаться дальше, чтобы узнать когда лучше использовать интерфейс, а когда абстрактный класс.

Интерфейс или абстрактный класс?

Выбор между интерфейсом и абстрактным классом зависит от многих факторов. Давайте рассмотрим основные аргументы в пользу интерфейсов и абстрактных классов.

  1. Java не поддерживает множественное наследование, поэтому каждый класс может наследовать только один суперкласс. При этом любой класс может реализовать несколько интерфейсов. Именно поэтому интерфейсы являются лучшим выбором для вашего проекта. Также написание кода с использованием интерфейсов является одним из лучших практик программирования на Java.
  2. Если вы решили написать много методов, то лучшим решением для вас будет абстрактный класс. Все дело в том, что мы можем обеспечить реализацию по умолчанию для некоторых методов, которые являются общими для всех подклассов.
  3. Если мы захотим добавить или удалить метод из интерфейса, то с этим могут возникнуть проблемы. Все дело в том, что мы не можем объявить дополнительные методы в интерфейсе без изменения всех классов, которые реализуют этот интерфейс.

Используйте интерфейсы и абстрактные классы

В большинстве случаев использование интерфейсов вместе с абстрактными классами будет лучшим решением для любого проекта. Например, в JDK есть java.util.List — интерфейс, который содержит много методов. Также там есть абстрактный класс java.util.AbstractList, который является костяком для всех методов интерфейса List. Это значит, что любой подкласс может наследовать этот класс и реализовать только необходимые ему методы.

Программисты всегда должны начинать с интерфейса в качестве основания системы и определять методы, которые каждый подкласс должен осуществить. Также мы можем создать новый (дочерний) интерфейс, который наследует родительский, но уже с определенными методами. В этом случае класс, которому не нужны все методы базового интерфейса, может реализовать дочерний интерфейс. Теперь подклассы имеют возможность выбрать между базовым интерфейсом и дочерним интерфейсом.

Изменения в Java 8 интерфейсах

Начиная с Java 8 появилась возможность писать реализацию методов в интерфейсах. Мы можем создавать методы по умолчанию, а также статические методы в интерфейсах и обеспечить их реализацию. Следите за обновлениями на Javadevblog.com, чтобы не пропустить новые статьи об интерфейсах в Java 8.

2 thoughts to “Разница между абстрактным классом и интерфейсом в Java”

  1. Необходимо добавить, что в Java 9 появилась возможность декларировать private-методы в interface.

  2. Подклассы используют ключевое слово extends чтобы наследовать абстрактный класс. При этом они должны обеспечить реализацию всех заявленных методов в абстрактном классе. Если же подкласс не является абстрактным классом и использует ключевое слово implements для реализации интерфейсов, то он должен обеспечить реализацию для всех методов, объявленных в интерфейсе.

    Здесь есть ошибка!!!

Добавить комментарий для PavelPraulov Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *