Методы 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, для использования лямбда-функций нам нужны методы по умолчанию (чтобы сохранить обратную совместимость), не абстрактные методы абстрактных классов не могут служить цели.