В 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. Теперь мы можем определять частные методы также в интерфейсах. Давайте рассмотрим важность и необходимость частных методов в интерфейсах.

Подробнее о Java 8 и Java 9: ​​сравнение расширенных функций и возможностей интерфейса