Что такое default-метод в интерфейсе Java и есть ли у него реализация?

«Что такое default-метод в интерфейсе Java и есть ли у него реализация?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Default-метод (метод по умолчанию) — это метод в интерфейсе, который имеет собственную реализацию. Эта функциональность была добавлена в Java 8 для эволюции интерфейсов без нарушения обратной совместимости: можно добавлять новые методы в существующие интерфейсы, не заставляя все реализующие классы их немедленно переопределять.

Ключевые характеристики:

  • Объявляется с ключевым словом default.
  • Имеет тело с реализацией прямо в интерфейсе.
  • Класс, реализующий интерфейс, может, но не обязан переопределять этот метод.

Пример:

interface Vehicle {
    // Абстрактный метод (без реализации)
    void honk();

    // Default-метод (с реализацией по умолчанию)
    default void start() {
        System.out.println("Vehicle is starting...");
        performSystemCheck(); // default-метод может вызывать private-метод интерфейса
    }

    // Static-метод в интерфейсе (также с Java 8)
    static boolean isVehicle(Object obj) {
        return obj instanceof Vehicle;
    }

    // Private-метод (помощник для default-метода, с Java 9)
    private void performSystemCheck() {
        System.out.println("System check passed.");
    }
}

class Car implements Vehicle {
    @Override
    public void honk() {
        System.out.println("Beep beep!");
    }
    // Метод start() не переопределен, будет использована реализация по умолчанию
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.start(); // Вывод: "Vehicle is starting..." "System check passed."
        car.honk();  // Вывод: "Beep beep!"
        System.out.println(Vehicle.isVehicle(car)); // Вывод: true
    }
}

Варианты поведения класса:

  1. Наследовать реализацию по умолчанию (как в примере выше).
  2. Переопределить default-метод, предоставив свою специфичную реализацию.
  3. Повторно объявить метод абстрактным в абстрактном классе-посреднике, переложив обязанность по реализации на следующие конкретные классы.