Может ли интерфейс в Java содержать метод с реализацией?

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

Ответ

Да, начиная с Java 8. Интерфейсы могут содержать методы с реализацией двух типов: default и static.

1. Default методы

Позволяют добавлять новую функциональность в существующие интерфейсы, не ломая обратную совместимость с уже написанными классами.

interface NotificationService {
    // Абстрактный метод (без реализации)
    void send(String recipient, String message);

    // Default метод (с реализацией по умолчанию)
    default void sendUrgent(String recipient, String message) {
        System.out.println("[URGENT] Preparing...");
        send(recipient, "URGENT: " + message);
    }
}

Класс, реализующий NotificationService, обязан реализовать send(), но может использовать или переопределить sendUrgent().

2. Static методы

Предоставляют служебные (утилитные) функции, логически связанные с интерфейсом. Вызываются только через имя интерфейса.

interface MathOperations {
    static boolean isEven(int number) {
        return number % 2 == 0;
    }
}
// Использование
boolean result = MathOperations.isEven(4); // true

Важно: И default, и static методы должны иметь тело. Они не могут быть abstract.