В чем разница между default и static методами

Ответ

Default методы в интерфейсах позволяют добавлять реализацию без нарушения обратной совместимости. Классы, реализующие интерфейс, могут использовать дефолтную реализацию или переопределить её.

Static методы в интерфейсах - это просто вспомогательные методы, принадлежащие самому интерфейсу. Они не наследуются и вызываются через имя интерфейса.

Пример:

interface MyInterface {
    default void defaultMethod() {
        System.out.println("Default implementation");
    }

    static void staticMethod() {
        System.out.println("Static method");
    }
}

class MyClass implements MyInterface {
    // Можно использовать дефолтный метод как есть
    // или переопределить его
}

// Использование:
MyClass obj = new MyClass();
obj.defaultMethod();  // Вызов default метода
MyInterface.staticMethod();  // Вызов static метода

Ответ 18+ 🔞

А, ну это же та самая фишка, которая всех спасла от вечного пиздеца с обратной совместимостью! Раньше, блядь, добавишь в интерфейс один новый метод — и всё, пизда, все твои классы, которые его реализуют, ломаются в хлам. Теперь же — завезли default методы, ёпта!

Это как если бы ты купил всем сотрудникам по новому стулу, но сказал: «Ребят, вот вам стул. Кто хочет — садитесь, а кому и на старом корячке удобно — хуй с вами, сидите как сидели». Никого не заставляешь, обратной совместимости — ноль ебать, все довольны.

А static методы в интерфейсах — это вообще отдельная песня. Это как будто к этому же стулу прикрутили встроенную отвертку, но она не твоя личная, она общая, на всех. И чтобы ей воспользоваться, не надо даже садиться на стул — подошел, взял, закрутил. Они принадлежат самому интерфейсу, как будто маленькая утилитарная конторка при нём.

Вот смотри, наглядно:

interface MyInterface {
    // Дефолтный метод — типа «базовая поставка». Бери, если своё городить лень.
    default void defaultMethod() {
        System.out.println("Default implementation");
    }

    // Статический метод — это как общий инструмент в мастерской. Бери и юзай, не спрашивая.
    static void staticMethod() {
        System.out.println("Static method");
    }
}

class MyClass implements MyInterface {
    // Тут можно вообще нихуя не писать — и defaultMethod() уже будет работать!
    // А если захотел по-своему — просто перепиши его тут, и всё.
}

// Использование:
MyClass obj = new MyClass();
obj.defaultMethod();  // Вызываем дефолтный метод — он просто есть, как будто так и было!
MyInterface.staticMethod();  // А статический — только так, через имя интерфейса. Прямо как из библиотеки.

Короче, default — чтобы не ебать мозги тем, кто не хочет реализовывать каждый чих, а static — чтобы не плодить утилитные классы на каждый чих. Удобно, блядь, как швейцарский нож!