Разница между методом по умолчанию в интерфейсе и обычным методом в классе

356
02 февраля 2017, 00:40

Чем отличаются между собой метод по умолчанию, объявленный в интерфейсе с модификатором default и обычный метод, объявленный в обычном классе?

(update) Читаю

Метод по умолчанию представляет собой метод, который объявлен в интерфейсе с модификатором default; его тело всегда представлено блоком. Он предоставляет реализацию по умолчанию для любого класса, который реализует интерфейс без перекрытия метода. Методы по умолчанию отличны от конкретных методов, которые объявляются в классах.

Answer 1

default метод не может обращаться к состоянию объекта (полям объекта), так как никакого объекта нет, но может вызвать другие методы и обращаться к статическим данным (константам).

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

В классе, реализующим интерфейс с default методами, вы можете их переопределить.

interface I1 {
    // это public static final int i = 0;
    // но в описании интерфейса public static final можно опустить
    int i = 0;
    default void m1() {
        System.out.println("I1 m1 i = " + i);
        m2();
    }
    void m2();
}

Без default этот класс бы не скомпилировался:

public class C1 implements I1 {
    @Override
    public void m2() {
        System.out.println("C1 m2");
    }
    public static void main(String[] args) {
        new C1().m1();
        new C1().m2();
    }
}

Вывод будет следующим:

I1 m1 i = 0
C1 m2
C1 m2
Answer 2

Одно из различий заключается в том, что все методы (в т.ч. и default) в интерфейсе неявно объявлены как public и поменять этот модификатор доступа не получится, а в обычном методе в классе Вы можете сами устанавливать различные модификаторы доступа.

UPD:

Метод по умолчанию представляет собой метод, который объявлен в интерфейсе с модификатором default; его тело всегда представлено блоком. Он предоставляет реализацию по умолчанию для любого класса, который реализует интерфейс без перекрытия метода. Методы по умолчанию отличны от конкретных методов, которые объявляются в классах.

Вы несколько неправильно поняли это предложение. Здесь имелось ввиду то, что если класс реализует интерфейс, который содержит default-метод, то при переопределении в классе этого метода, метод из класса перекроет default-реализацию.

Попробуйте сделать акцент на выделенном тексте, тогда поймете о чем я:

Он предоставляет реализацию по умолчанию для любого класса, который реализует интерфейс без перекрытия метода. Методы по умолчанию отличны от конкретных методов, которые объявляются в классах.

К тому же, если бы здесь имелись ввиду какие-то принципиальные различия, то они здесь же были бы указаны, так как в этом пункте из главы про интерфейсы рассказывается непосредственно про default-методы.

READ ALSO
Android studio графика .xml

Android studio графика .xml

Полазив в anroid studio я нашел файлы векторной графики в (данном случаи это были иконки, в форматеxml)

400
общие вопросе по системе координат в JavaFX

общие вопросе по системе координат в JavaFX

я тут начал писать программу в javafx и у меня скопилось много вопросов по поводу координат в инете я нечего не нашел

424
Авторизация по токену для POST/PUT/DEL в RESTful API на Spring Boot

Авторизация по токену для POST/PUT/DEL в RESTful API на Spring Boot

Здравствуйте! Впервые практикуюсь в REST и Spring

436