Введение в интерфейсы
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 34 из 87.
Вы видели, как абстрактные классы определяют контракты, которым должны следовать подклассы. Но что, если вы хотите, чтобы класс следовал нескольким контрактам? Java не позволяет классу наследоваться от нескольких классов, но решает эту проблему с помощью интерфейсов.
Интерфейс — это контракт, который определяет, что класс может делать, не указывая, как он это делает. В отличие от абстрактных классов, интерфейсы содержат только сигнатуры методов (по умолчанию) без реализации:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}Представьте интерфейс как обещание. Когда класс реализует интерфейс, он обещает предоставить реализации для всех методов, объявленных в этом интерфейсе. Интерфейс определяет возможность, а класс обеспечивает поведение.
Интерфейсы объявляются с помощью ключевого слова interface вместо class. Все методы в интерфейсе неявно являются public и abstract, поэтому вам не нужно писать эти ключевые слова:
public interface Playable {
void play(); // неявно public abstract
void pause();
void stop();
}Интерфейсы также могут объявлять константы, которые неявно являются public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // неявно public static final
}В следующем уроке вы узнаете, как классы реализуют интерфейсы с помощью ключевого слова implements.
Задание
ЛегкоДавайте создадим систему управления устройствами, определив интерфейсы, которые описывают, что могут делать различные устройства. Эта задача сосредоточена на создании интерфейсов — контрактов, которые определяют возможности без указания того, как они работают.
Вы организуете свой код в трех файлах:
Switchable.java: Создайте интерфейс, который определяет, что значит для устройства быть переключаемым. Любое переключаемое устройство должно иметь возможность включаться и выключаться. Объявите два метода:turnOn()иturnOff(). Помните, что методы интерфейса неявно являются public и abstract, поэтому вам нужны только сигнатуры методов.Adjustable.java: Создайте еще один интерфейс, который определяет, что значит для устройства быть регулируемым. Регулируемое устройство должно иметь возможность устанавливать свой уровень. Объявите методsetLevel(int level). Также включите константуMAX_LEVELсо значением100— помните, что константы в интерфейсах неявно являютсяpublic static final.Main.java: Продемонстрируйте, что ваши интерфейсы определены правильно, выведя информацию о них. Вы получите один входной параметр: значение уровня (int). Выведите следующие три строки:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](получите доступ к константе из интерфейса Adjustable)
Setting level to: [input level]
Вы получите один входной параметр: значение уровня (int).
Эта задача сосредоточена исключительно на определении интерфейсов — чертежей, описывающих возможности. В следующем уроке вы узнаете, как классы на самом деле реализуют эти интерфейсы для обеспечения реального поведения!
Шпаргалка
Интерфейс — это контракт, который определяет, что класс может делать, не указывая, как он это делает. Интерфейсы содержат только сигнатуры методов без реализации.
Интерфейсы объявляются с помощью ключевого слова interface:
public interface Drawable {
void draw();
}Все методы в интерфейсе неявно являются public и abstract:
public interface Playable {
void play(); // неявно public abstract
void pause();
void stop();
}Интерфейсы могут объявлять константы, которые неявно являются public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // неявно public static final
}Класс может реализовывать несколько интерфейсов, в отличие от наследования от нескольких классов.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Выведите информацию об интерфейсах
// Выведите: "Switchable methods: turnOn, turnOff"
// Выведите: "Adjustable methods: setLevel"
// Выведите: "Max level constant: ", а затем Adjustable.MAX_LEVEL
// Выведите: "Setting level to: ", а затем введенный уровень
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»