Language Średniozaawansowany

Dodaj implementacje metod bezpośrednio w interfejsach, umożliwiając wielokrotne dziedziczenie zachowania.

✕ Java 7
// Need abstract class to share behavior
public abstract class AbstractLogger {
    public void log(String msg) {
        System.out.println(
            timestamp() + ": " + msg);
    }
    abstract String timestamp();
}

// Single inheritance only
public class FileLogger
    extends AbstractLogger { ... }
✓ Java 8+
public interface Logger {
    default void log(String msg) {
        IO.println(
            timestamp() + ": " + msg);
    }
    String timestamp();
}

// Multiple interfaces allowed
public class FileLogger
    implements Logger, Closeable { ... }
Widzisz problem z tym kodem? Daj nam znać.
🔀

Wielokrotne dziedziczenie

Klasy mogą implementować wiele interfejsów z metodami domyślnymi, w odróżnieniu od pojedynczego dziedziczenia klas abstrakcyjnych.

📦

Ewolucja API

Dodawaj nowe metody do interfejsów bez łamania istniejących implementacji.

🧩

Komponowalne zachowanie

Swobodnie łącz i dobieraj możliwości z wielu interfejsów.

Stare podejście
Klasy abstrakcyjne dla współdzielonego zachowania
Nowoczesne podejście
Metody domyślne w interfejsach
Od JDK
8
Poziom trudności
Średniozaawansowany
Domyślne metody interfejsów
Dostępne

Szeroko dostępne od JDK 8 (marzec 2014)

Przed Javą 8 współdzielenie zachowania między niezwiązanymi klasami wymagało klas abstrakcyjnych, co ograniczało do pojedynczego dziedziczenia. Metody domyślne pozwalają interfejsom dostarczać implementacje metod, dzięki czemu klasy mogą dziedziczyć zachowanie z wielu interfejsów. Było to niezbędne do rozszerzenia API Collections (np. List.forEach, Map.getOrDefault) bez łamania istniejących implementacji.