В Java 8 были расширены функциональные возможности интерфейсов. До Java 8 интерфейсы были связаны только с абстрактными методами, а подкласс был обязан реализовать контракт. Дочерний класс должен реализовать абстрактные функции для выполнения контракта. Начиная с Java 8, интерфейс стал более мощным благодаря статическим методам и методам по умолчанию.
interface Alpha{ default void bar(){ System.out.println("Default bar of A!!"); } } class Clazz implements Alpha{ // Java8 compiler is ok, We can create Object of Clazz //Because of default method provided, we do not have to override the bar method }
В этом обсуждении мы рассмотрим некоторые функции / улучшения интерфейса Java 8, а также силу, приданную интерфейсам с Java 9.
- В Java 8 у нас появилась новая функция с реализацией методов в интерфейсах по умолчанию. Теперь мы можем предоставить реализацию по умолчанию для методов, которые мы не хотим переопределять каждым классом, реализация по умолчанию может быть предоставлена путем написания ключевого слова default для метода. Компилятор Jave не будет принудительно переопределять этот метод, объявленный по умолчанию. Мы можем переопределить этот метод в любом классе реализации, но не обязательно предоставлять реализацию для метода по умолчанию.
А как насчет проблемы с бриллиантами?
- В качестве метода по умолчанию и множественного наследования возникают проблемы неоднозначности. Java не поддерживает множественное наследование, чтобы избежать проблемы с ромбами. Здесь, с реализацией по умолчанию, мы можем столкнуться с той же проблемой. Любой класс, реализующий 2 интерфейса и использующий тот же метод по умолчанию, вызывает проблему неоднозначности.
Проблема с бриллиантом: -
interface Alpha{ default void bar(){ System.out.println("Default bar of A!!"); } } interface Beta{ default void bar(){ System.out.println("Default bar of B!!"); } } class Clazz implements Alpha,Beta{ // Code fails to compile with the following result: // error: class Clazz inherits unrelated defaults for bar() from types Alpha and Beta }
- Чтобы исправить это, в Clazz.class мы должны переопределить панель методов, чтобы разрешить конфликты.
class Clazz implements Alpha,Beta{ public void bar(){ System.out.println("Overridden bar!!"); } }
- Также мы можем сделать это другим способом. Предположим, что из двух реализаций панели по умолчанию в интерфейсах Alpha и Beta, мы хотим использовать вариант Alpha по умолчанию, тогда у нас также может быть следующий обходной путь: -
class Clazz implements Alpha,Beta{ public void bar(){ Alpha.super.bar(); } }
- В Java 9 интерфейс становится более усовершенствованным и усиленным. Интерфейс Java 9 может объявлять частные методы, сохраняя неизменными свойства метода по умолчанию, представленного в Java 8. Теперь мы можем определять частные методы также в интерфейсах. Давайте рассмотрим важность и необходимость частных методов в интерфейсах.