Files
obsidian/Программирование на Java/ООП/Интерфейсы.md
T
roma-dxunvrs 8fda05110c 07.09.26
2026-09-07 23:26:20 +03:00

97 lines
3.4 KiB
Markdown

- Интерфейс - тип данных
- Описывает только поведение без реализации
- Контракт интерфейса определяет, что делает класс, но не определяет как он это делает
- У класса может быть единственный класс-предок
- Класс может реализовывать много интерфейсов
## Принципы интерфейсов
- Отсутствие состояния
- Нет конструкторов
- Множественная реализация
- Полная абстракция поведения
## Определение интерфейсов
- Ключевое слово `interface`
- Все методы по умолчанию `public abstract`
- Все поля `public static final`
- Реализация - ключевое слово `implements`
## Наследование интерфейсов
Интерфейс может расширять другие интерфейсы (несколько)
```Java
interface I extends I1, I2, I3 { }
```
## Методы
- Абстрактные - основной контракт
- Методы с реализацией по умолчанию - `default`
- Статические
- Приватные
- `protected` - запрещены, ошибка компиляции
## Default методы
- Реализация вспомогательного поведения в интерфейсе
- Необязательное переопределение в классах
- Если в двух интерфейсах есть `default`-методы с одинаковым именем - класс обязан их переопределить. Можно взять реализацию через `InterfaceName.super.methodName`
```Java
interface I1 {
default void print() {
print("Hello");
}
}
interface I2 {
default void print() {
print("Bye");
}
}
class A implements I1, I2 {
@Override
public void print() {
I1.super.print(); // можно взять реализацию
I2.super.print();
}
}
// Hello
// Bye
```
## Static методы
- Принадлежат интерфейсу, а не экземплярам
- Вызов через `InterfaceName.methodName`
- Не наследуются
- Утилитарные функции
## Private методы
- Вспомогательный код
## Вложенные интерфейсы
Интерфейсы, как и классы могут быть вложенными
```Java
class Printer{
interface Printable {
void print();
}
}
class Book implements Printer.Printable {
public void print() {
System.out.println("Печатаем книгу");
}
}
Printer.Printable printable = new Book();
printable.print();
```
Могут вкладываться и в другие интерфейсы
```Java
public interface OuterInterface {
void outerMethod();
interface InnerInterface {
void innerMethod();
}
}
public class MyClass implements OuterInterface, OuterInterface.InnerInterface {
@Override
public void outerMethod() {
System.out.println("Метод внешнего интерфейса");
}
@Override
public void innerMethod() {
System.out.println("Метод вложенного интерфейса");
}
}
```
Дополнительно: [[Абстрактные классы]],