Методы по умолчанию в Java 8
В Java 8 были введены методы по умолчанию для интерфейсов.
Проще говоря, методы по умолчанию означают, что интерфейсы могут иметь реализованные методы, а реализующие классы не обязаны их реализовывать.
Нам просто нужно добавить ключевое слово default перед именем метода, чтобы реализовать метод по умолчанию.
Зачем нужна эта возможность?
Во-первых, предыдущий интерфейс был палкой о двух концах. Преимущество в том, что он ориентирован на абстракцию, а не на конкретное программирование. Недостаток в том, что когда интерфейс нужно изменить, все классы, реализующие этот интерфейс, должны быть изменены. Фреймворк коллекций до Java 8 не имел метода foreach. Обычное решение, которое можно придумать, — добавить новые методы и реализации в соответствующие интерфейсы в JDK. Однако для уже выпущенных версий нет способа добавить новые методы в интерфейс, не затрагивая существующие реализации. Поэтому были введены методы по умолчанию. Их цель — решить несовместимость между изменениями интерфейса и существующими реализациями.
Синтаксис
Синтаксис метода по умолчанию выглядит следующим образом:
Несколько методов по умолчанию
Если интерфейс имеет метод по умолчанию, рассмотрим ситуацию, когда класс реализует несколько интерфейсов, и эти интерфейсы имеют один и тот же метод по умолчанию. Следующий пример иллюстрирует решение этой ситуации:
Первое решение — создать собственный метод по умолчанию, чтобы переопределить метод по умолчанию интерфейса:
Второе решение — использовать super для вызова метода по умолчанию указанного интерфейса:
Статические методы по умолчанию
Ещё одна особенность Java 8 заключается в том, что интерфейсы могут иметь (и предоставлять реализации) методы по умолчанию. Например:
Пример метода по умолчанию
Мы можем понять использование методов по умолчанию из следующего кода. Вы можете поместить код в файл Java8Tester.java:
Файл Java8Tester.java
При выполнении приведённого выше скрипта результат вывода:
$ javac Java8Tester.java $ java Java8Tester 我是一辆车! 我是一辆四轮车! 按喇叭!!! 我是一辆汽车!
Другие расширения
Новые возможности Java 8