Interfaces, Abstract classes, Default methods - luk6233/interview GitHub Wiki
Интерфейс — это совокупность методов и правил взаимодействия элементов системы. Другими словами, интерфейс определяет как элементы будут взаимодействовать между собой.
Habr
Главное отличие класса от интерфейса — в том, что класс состоит из интерфейса и реализации.
Интерфейсы работают со слоями сервисов, безопасности, DAO и т.д. Это позволяет создавать модульные конструкции, в которых для изменения одного элемента не нужно трогать остальные.
Интерфейсы в Java компенсируют отсутствие множественного наследования классов. У класса-потомка может быть только один абстрактный класс-родитель, а вот интерфейсов класс может применять (имплементировать) сколько угодно.
Интерфейс описывает поведение, которым должны обладать классы, реализующие этот интерфейс. «Поведение» — это совокупность методов.
Интерфейс не реализует поведение. Его задача — описать, какое поведение должны иметь все объекты, которые его имплементируют.
Интерфейсы могут содержать поля, так же как и обычные классы, но с несколькими отличиями:
-
Поля должны быть проинициализированы
-
Поля считаются публичными статическими финальными
-
Модификаторы public, static и final не нужно указывать явно (они «проставляются» по умолчанию)
public interface MyInterface { int MY_CONSTANT = 9; }
Даже несмотря на то, что явно это не задано, поле MY_CONSTANT считается публичной статической финальной константой. Вы можете добавить эти модификаторы, но делать это не обязательно.
Абстрактный класс — это «заготовка» класса: реализовано большинство методов (включая внутренние), кроме нескольких. Эти несколько нереализованных методов вполне могут быть внутренними методами класса, они лишь уточняют детали имплементации. Абстрактный класс — средство для повторного использования кода, средство, чтобы указать, какой метод обязан быть перекрыт для завершения написания класса.
Отличия абстрактных классов и интерфейсов:
- Интерфейс описывает только поведение. У него нет состояния. А у абстрактного класса состояние есть: он описывает и то, и другое.
- Абстрактный класс связывает между собой и объединяет классы, имеющие очень близкую связь. В то же время, один и тот же интерфейс могут реализовать классы, у которых вообще нет ничего общего.
- Классы могут реализовывать сколько угодно интерфейсов, но наследоваться можно только от одного класса.