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!