Default методы в интерфейсах

В java 8 всё же появилась возможность добавлять реализации методов в интерфейс.

Нужно в основном для того чтобы у классов реализующих интерфейс не было слишком много одинаковых реализаций абстрактных методов интерфейса.

До java 8 приходилось делать так:

import java.util.*; interface Car { public void gas(); public void brake(); } class Sedan implements Car { @Override public void gas() { System.out.println(“Gas!”); } @Override public void brake() { System.out.println(“Stop!”); } } class Truck implements Car { // такая же как в прошлой реализации @Override public void gas() { System.out.println(“Gas!”); } // такая же как в прошлой реализации @Override public void brake() { System.out.println(“Stop!”); } } class PickUp implements Car { // такая же как в прошлой реализации @Override public void gas() { System.out.println(“Gas!”); } // такая же как в прошлой реализации @Override public void brake() { System.out.println(“Stop!”); } } // Как можно увидеть у всех реализаций // интерфейса Car одинаковые реализации gas и brake // что очевидно плохо class Ddefault { public static void main(String[] args) { Sedan sedan = new Sedan(); Truck truck = new Truck(); PickUp pickUp = new PickUp(); sedan.gas(); truck.gas(); pickUp.gas(); } }

Вывод:

Добавив дефолтные реализации gas и brake в интерфейс всем классам, которые реализуют Car больше не придется делать одинаковые реализации этих методов.

После java 8:                    

import java.util.*; // Определение интерфейса Car interface Car { // Дефолтные реализации методов. // Помечаются словом default public default void gas() { System.out.println(“Gas!”); } public default void brake() { System.out.println(“Stop!”); } } // Классы, реализующие интерфейс Car class Sedan implements Car { } class Truck implements Car { } class PickUp implements Car { } class Ddefault { public static void main(String[] args) { // Создание объектов классов Sedan sedan = new Sedan(); Truck truck = new Truck(); PickUp pickUp = new PickUp(); // Вызов метода gas() для каждого объекта sedan.gas(); truck.gas(); pickUp.gas(); } }

Вывод:

Анонимный класс

Узнайте про анонимные классы в Java: одноразовые реализации интерфейсов без создания отдельных классов. Примеры кода и практическое применение.
Time to read: 8

Функциональный интерфейс

Изучите функциональные интерфейсы в Java: как один абстрактный метод позволяет использовать лямбда-выражения и анонимные классы для функционального программирования.
Time to read: 12

Лямбда выражения

Лямбда-выражения в Java: краткая реализация функциональных интерфейсов. Сравнение с анонимными классами и примеры использования с методами.
Time to read: 13