Реализация интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 35 из 87.
Чтобы использовать interface, class должна implement его с помощью ключевого слова implements. Затем class предоставляет конкретные реализации для всех методов, объявленных в interface:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}Если class реализует interface, но не предоставляет реализации для всех своих method, компилятор выдаст ошибку. Аннотация @Override необязательна, но рекомендуется, поскольку помогает обнаруживать ошибки.
Как и в случае с абстрактными class, вы можете использовать interface как ссылочный тип. Это обеспечивает полиморфизм, при котором разные class, реализующие один и тот же interface, могут обрабатываться единообразно:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // Рисование круга с радиусом 5.0
shape2.draw(); // Рисование прямоугольника 4.0 x 3.0Это мощный подход, потому что коду, работающему со ссылками Drawable, не нужно знать конкретный тип класса. Его интересует только то, что объект можно нарисовать.
В следующем уроке ты увидишь, как один класс может одновременно реализовывать несколько интерфейсов.
Задание
ЛегкоДавайте создадим систему динамиков, которая демонстрирует, как классы реализуют интерфейсы. Вы создадите интерфейс, определяющий, что может делать любой динамик, а затем создадите два разных типа динамиков, каждый из которых реализует этот контракт по-своему.
Вы организуете код в четырех файлах:
Speaker.java: Define интерфейс с именемSpeaker, объявляющий, что должен уметь делать любой динамик. У каждого динамика должен быть методspeak(), который возвращает String. Это контракт, которому должны соответствовать все реализующие его классы.Human.java: Create класс, который реализует интерфейсSpeaker. У Human есть полеname(String). Добавьте constructor для инициализации имени и реализуйте методspeak(), чтобы он возвращал:[name] says: Hello everyone!Robot.java: Create еще один класс, который реализует интерфейсSpeaker. У Robot есть полеmodel(String). Добавьте constructor для инициализации модели и реализуйте методspeak(), чтобы он возвращал:Robot [model] says: Beep boop!Main.java: Объедините всё с помощью полиморфизма на основе интерфейсов. Вы получите два входных значения: имя человека и модель робота. Создайте Human и Robot, затем сохраните их в массиве ссылок типаSpeaker. Пройдите в цикле по массиву и выведите результат вызоваspeak()для каждого динамика.
Вы получите два входных значения: имя человека (String) и модель робота (String).
Ваша программа должна вывести две строки: по одной для каждого динамика. Обратите внимание, как и Human, и Robot могут единообразно обрабатываться через интерфейс Speaker, несмотря на то что они говорят совершенно по-разному!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Считать входные данные
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: Создать объект Human с заданным именем
// TODO: Создать объект Robot с заданной моделью
// TODO: Создать массив ссылок Speaker, содержащий оба объекта
// TODO: Пройти по массиву и вывести результат speak() для каждого speaker
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java