Java 8 — методы по умолчанию
В Java 8 представлена новая концепция реализации методов по умолчанию в интерфейсах. Эта возможность добавлена для обратной совместимости, чтобы можно было использовать старые интерфейсы для использования возможностей лямбда-выражений Java 8.
Например, интерфейсы «Список» или «Коллекция» не имеют объявления метода «forEach». Таким образом, добавление такого метода просто нарушит реализацию фреймворка коллекции. В Java 8 представлен метод по умолчанию, так что интерфейс List/Collection может иметь реализацию метода forEach по умолчанию, и класс, реализующий эти интерфейсы, не должен реализовывать то же самое.
Синтаксис
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } }
Несколько значений по умолчанию
С функциями по умолчанию в интерфейсах существует вероятность того, что класс реализует два интерфейса с одинаковыми методами по умолчанию. Следующий код объясняет, как можно разрешить эту двусмысленность.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } } public interface fourWheeler { default void print() { System.out.println("I am a four wheeler!"); } }
Первое решение — создать собственный метод, который переопределяет реализацию по умолчанию.
public class car implements vehicle, fourWheeler { public void print() { System.out.println("I am a four wheeler car vehicle!"); } }
Второе решение — вызвать метод по умолчанию указанного интерфейса с помощью super.
public class car implements vehicle, fourWheeler { public void print() { vehicle.super.print(); } }
Статические методы по умолчанию
Интерфейс также может иметь статические вспомогательные методы начиная с Java 8.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } }
Пример метода по умолчанию
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрацияpublic class Java8Tester { public static void main(String args[]) { Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print() { System.out.println("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } } interface FourWheeler { default void print() { System.out.println("I am a four wheeler!"); } } class Car implements Vehicle, FourWheeler { public void print() { Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("I am a car!"); } }
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом -
C:\JAVA>javac Java8Tester.java
Теперь запустите Java8Tester следующим образом:
C:\JAVA>java Java8Tester
Это должно привести к следующему выводу -
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
java