English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 добавила возможность методов по умолчанию в интерфейсы.
Короче говоря, метод по умолчанию позволяет интерфейсу иметь реализованные методы, не требуя от класса реализовывать этот метод.
Чтобы реализовать метод по умолчанию, достаточно добавить ключевое слово default перед именем метода.
Для чего нужна эта возможность?
Раньше интерфейсы были двойственным инструментом: их преимущество - направленность на абстрактное программирование, а не на конкретное, их недостаток - при необходимости изменения интерфейса необходимо изменять все классы, реализующие этот интерфейс. В Java 8, до этого момента, в стандартной библиотеке Java не было метода foreach, обычно можно было подумать о добавлении нового метода и его реализации в JDK. Однако, для уже выпущенных версий, было невозможно добавить новый метод к интерфейсу, не повлияв на существующие реализации. Поэтому была введена возможность методов по умолчанию. Их目的是 решить проблему несовместимости интерфейсов с существующими реализациями.
Грамматика методов по умолчанию выглядит следующим образом:
public interface Vehicle { default void print(){ System.out.println("Я автомобиль!"); {} {}
Интерфейс имеет метод по умолчанию, рассмотрим такую ситуацию, когда класс реализует несколько интерфейсов, и у этих интерфейсов есть одинаковые методы по умолчанию. Следующий пример объясняет способ решения этой проблемы:
public interface Vehicle { default void print(){ System.out.println("Я автомобиль!"); {} {} public interface FourWheeler { default void print(){ System.out.println("Я четырехколесный автомобиль!"); {} {}
Первый вариант решения - создание своего метода по умолчанию, чтобы перекрыть метод по умолчанию интерфейса:
public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("Я четырехколесный автомобиль!"); {} {}
Второй вариант решения - использование super для вызова методов по умолчанию интерфейса:
public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); {} {}
Одна из других возможностей Java 8 - интерфейсы могут声明(и предоставлять реализацию)статических методов. Например:
public interface Vehicle { default void print(){ System.out.println("Я автомобиль!"); {} // Статический метод static void blowHorn(){ System.out.println("Пищик!!!"); {} {}
Мы можем понять о использовании методов по умолчанию следующим образом: мы можем поместить код в файл 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("Я автомобиль!"); {} static void blowHorn(){ System.out.println("Пищик!!!"); {} {} interface FourWheeler { default void print(){ System.out.println("Я четырехколесный автомобиль!"); {} {} class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("Я автомобиль!"); {} {}
Выполните вышеуказанный скрипт, результат вывода будет:
$ javac Java8Tester.java $ java Java8Tester Я автомобиль! Я четырехколесный автомобиль! Пищик!!! Я автомобиль!