Назад к вопросам
Middle
72
questionbank

Что такое метод по умолчанию (default method) в интерфейсе?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Это метод в интерфейсе, помеченный ключевым словом default и имеющий реализацию по умолчанию.

Появились в Java 8 для решения проблемы "совместимости" интерфейсов при добавлении новых методов. Позволяют добавить новый метод в уже существующий интерфейс, не ломая классы, которые этот интерфейс реализуют. Классы-имплементаторы могут использовать реализацию по умолчанию или переопределить ее.

Основные особенности:

  • Допускают наличие тела метода в интерфейсе.
  • Позволяют добавлять новые методы к интерфейсам без принудительного изменения всех реализующих классов.
  • Могут быть переопределены в классах-имплементаторах.
  • Могут вызывать другие методы интерфейса (включая абстрактные).
  • Не могут быть статическими или финальными (в отличие от статических методов интерфейса).

Пример:

// Интерфейс до добавления default метода
interface MyInterface {
    void existingMethod();
}

// Класс, реализующий старый интерфейс
class MyClass implements MyInterface {
    @Override
    public void existingMethod() {
        System.out.println("Existing implementation");
    }
}

// Интерфейс с добавленным default методом
interface MyInterfaceWithDefault {
    void existingMethod();

    // Новый default метод
    default void newDefaultMethod() {
        System.out.println("Default implementation of new method");
    }
}

// Existing класс может реализовать новый интерфейс без изменений
class MyClassUsingDefault implements MyInterfaceWithDefault {
    @Override
    public void existingMethod() {
        System.out.println("Existing implementation");
    }
    // newDefaultMethod() автоматически наследуется
}

// Новый класс может переопределить default метод
class MyClassOverridingDefault implements MyInterfaceWithDefault {
    @Override
    public void existingMethod() {
        System.out.println("Existing implementation");
    }

    @Override
    public void newDefaultMethod() {
        System.out.println("Overridden implementation of new method");
    }
}

Конфликты множественного наследования: Если класс реализует два интерфейса с одинаковым default методом, компилятор выдаст ошибку, и класс обязан будет переопределить этот метод. Класс может вызвать реализацию из конкретного интерфейса с помощью синтаксиса InterfaceName.super.methodName().