Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

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

#java #классы #методы #интерфейс #java_8


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

(update) Читаю


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

    


Ответы

Ответ 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

Ответ 2



Одно из различий заключается в том, что все методы (в т.ч. и default) в интерфейсе неявно объявлены как public и поменять этот модификатор доступа не получится, а в обычном методе в классе Вы можете сами устанавливать различные модификаторы доступа. UPD: Метод по умолчанию представляет собой метод, который объявлен в интерфейсе с модификатором default; его тело всегда представлено блоком. Он предоставляет реализацию по умолчанию для любого класса, который реализует интерфейс без перекрытия метода. Методы по умолчанию отличны от конкретных методов, которые объявляются в классах. Вы несколько неправильно поняли это предложение. Здесь имелось ввиду то, что если класс реализует интерфейс, который содержит default-метод, то при переопределении в классе этого метода, метод из класса перекроет default-реализацию. Попробуйте сделать акцент на выделенном тексте, тогда поймете о чем я: Он предоставляет реализацию по умолчанию для любого класса, который реализует интерфейс без перекрытия метода. Методы по умолчанию отличны от конкретных методов, которые объявляются в классах. К тому же, если бы здесь имелись ввиду какие-то принципиальные различия, то они здесь же были бы указаны, так как в этом пункте из главы про интерфейсы рассказывается непосредственно про default-методы.

Комментариев нет:

Отправить комментарий