Методы Java 8 по умолчанию против не абстрактных методов в абстрактных классах

Стандартные методы интерфейса Java 8 по сравнению с не абстрактными методами в абстрактных классах - существуют ли различия между ними (помимо различий в классе iface, видимости и т.д.).

Не метод по умолчанию - это шаг назад в Java, что означает его против сути, которую Java рекламирует в течение многих лет?!

Ответ 1

не абстрактные методы в абстрактных классах будут вызываться, когда конкретный подкласс вызывает super(), если он переопределен. Таким образом, существует множество возможностей. Если метод не переопределяется, будет выполняться метод суперкласса. если мы используем super() в конкретном подклассовном методе, тогда будет выполнен переопределенный метод с методом суперкласса.

Где, как методы по умолчанию интерфейса Java 8, совершенно разные. Он предоставил разработчикам возможность реализовать метод в классе реализации или нет. Если функция не реализована , а затем только, будет выполнен метод по умолчанию.

Возможный вариант использования:

Наиболее важным примером использования этой новой функции в библиотеках JDK является возможность расширения существующих интерфейсов без нарушения существующих исполнителей: добавление нового абстрактного метода в интерфейс потребует, чтобы все реализующие классы реализовали этот новый метод. (Источник)

Ответ 2

Важно помнить, что методы по умолчанию не имеют доступа к состоянию, а только к поведению. На самом деле это отличное место для определения разумного поведения по умолчанию.

Представьте, что у вас есть интерфейс:

public interface Plant {
    enum Pace { FAST, SLOW; }

    void grow(Pace pace);
    void growFast();
    void growSlow();
}

Кажется разумным предоставить поведение по умолчанию:

default void growFast() { grow(Pace.FAST); }
default void growSlow() { grow(Pace.SLOW); }

Это упрощенный пример, но показывает, как методы по умолчанию могут быть полезны. В этом случае поведение growSlow или growFast ведет себя как часть контракта интерфейса, поэтому имеет смысл определить их поведение на уровне интерфейса.

Однако интерфейс не делает предположений о том, как выполняется действие "расти растение". Это можно определить в абстрактном классе.

Ответ 3

Сначала методы по умолчанию позволяют добавлять новые методы для взаимодействия без нарушения существующих реализаций.

Также возьмите пример класса Collections, который является классом утилиты для интерфейса Collection.

Таким образом, используя методы по умолчанию, мы теперь можем переместить все утилиты как реализацию по умолчанию в самом Collection, что будет иметь больше смысла, чем создание отдельного класса для таких утилит.

Также вы сможете наследовать методы из нескольких интерфейсов, которые не могли быть выполнены с использованием простых классов abstract.

Ответ 4

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

Ответ 5

Основные отличия: Методы интерфейса Java 8 по умолчанию являются общедоступными, а не абстрактные (конкретные) методы абстрактных классов могут быть определены как общедоступные, защищенные или частные. Лямбда-выражения были введены в Java 8, для использования лямбда-функций нам нужны методы по умолчанию (чтобы сохранить обратную совместимость), не абстрактные методы абстрактных классов не могут служить цели.