English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Java

Java управление потоком

Java массивы

Java направленный на объекты (I)

Java направленный на объекты (II)

Java направленный на объекты (III)

Обработка исключений Java

Java Списки (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Методы по умолчанию Java 8

Java 8 новые возможности

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
Я автомобиль!
Я четырехколесный автомобиль!
Пищик!!!
Я автомобиль!

Java 8 новые возможности