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

3.4 KiB

  • Интерфейс - тип данных
  • Описывает только поведение без реализации
  • Контракт интерфейса определяет, что делает класс, но не определяет как он это делает
  • У класса может быть единственный класс-предок
  • Класс может реализовывать много интерфейсов

Принципы интерфейсов

  • Отсутствие состояния
  • Нет конструкторов
  • Множественная реализация
  • Полная абстракция поведения

Определение интерфейсов

  • Ключевое слово interface
  • Все методы по умолчанию public abstract
  • Все поля public static final
  • Реализация - ключевое слово implements

Наследование интерфейсов

Интерфейс может расширять другие интерфейсы (несколько)

interface I extends I1, I2, I3 { }

Методы

  • Абстрактные - основной контракт
  • Методы с реализацией по умолчанию - default
  • Статические
  • Приватные
  • protected - запрещены, ошибка компиляции

Default методы

  • Реализация вспомогательного поведения в интерфейсе
  • Необязательное переопределение в классах
  • Если в двух интерфейсах есть default-методы с одинаковым именем - класс обязан их переопределить. Можно взять реализацию через InterfaceName.super.methodName
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 методы

  • Вспомогательный код

Вложенные интерфейсы

Интерфейсы, как и классы могут быть вложенными

class Printer{
    interface Printable {
        void print();
    }
}
class Book implements Printer.Printable {
    public void print() {
        System.out.println("Печатаем книгу");
    }  
}
Printer.Printable printable = new Book();
printable.print();

Могут вкладываться и в другие интерфейсы

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("Метод вложенного интерфейса");
    }
}

Дополнительно: Абстрактные классы,