Интерфейс - контракт (набор методов и констант), описывающий какие есть способы взаимодействовать с объектом, который реализует этот контракт. С другой стороны, тот кто заявляет о поддержке какого-либо контракта обязан реализовать все методы описанные в контракте.
Интерфейс в Java позволяет реализовать полиморвизм и множественное наследование.
Java
Сначала рассмотрим как интерфейсы устроены в Java.
Создание интерфейса
Не нужно стесняться использовать имя
IPlant
для интерфейсов ;).
Но, чтобы не нервировать народ из Java мира в Java коде будем использоватьPlantInterface
.
interface PlantInterface {
String getName();
}
Тут все просто. У нас есть сущность Plant и мы хотим чтобы она предоставляла возможность просто получить имя растения.
Реализация интерфейса
@Getter
@RequiredArgsConstructor
class Plant implements PlantInterface {
private final String ruName;
private final String latName;
private final String enName;
public String getName() {
if (latName != null) {
return latName;
} else if (enName != null) {
return enName;
} else {
return ruName
}
}
}
Немного Lombok, чтобы оставить только важное.
множественное наследование
Множественное наследование в Java запрещено и если у нас есть классы BasePlant
и PlantUtils
, то мы не можем сделать так:
class Plant extends BasePlant,PlantUtils { // WRONG!
// ...
}
Это запрещено чтобы исключить следующий проблемы diamond problem.
В Java разрешено реализовывать несколько интерфейсов в одном классе и вместе со статическими методами и методами по умолчанию в интерфейсах, речь о которых пойдет ниже, возвращаюется возможность нахватать ошибок с множественным наследов анием.
Модификаторы доступа
В общем-то есть основная идея - в интерфейсе мы определяем контракт, а это значит, что класс реализующий интерфейс должен имплементировать его как public методы. Но, как водится, с некоторыми особенностями.
методы
Методы в интерфейсах считаются публичными и абстрактными.
Методы не могут быть финальными ;) abstract и final запрещена.
статические методы
Статические методы считаются публичными по умолчанию.
поля
Интерфейсы могут содержать поля, так же как и обычные классы, но с несколькими отличиями:
- Поля должны быть проинициализированы