Menu
Coddy logo textTech

Введение в интерфейсы

Часть раздела Объектно-ориентированное программирование путешествия по 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.

challenge icon

Задание

Легко

Давайте создадим систему управления устройствами, определив интерфейсы, которые описывают, что могут делать различные устройства. Эта задача сосредоточена на создании интерфейсов — контрактов, которые определяют возможности без указания того, как они работают.

Вы организуете свой код в трех файлах:

  • Switchable.java: Создайте интерфейс, который определяет, что значит для устройства быть переключаемым. Любое переключаемое устройство должно иметь возможность включаться и выключаться. Объявите два метода: turnOn() и turnOff(). Помните, что методы интерфейса неявно являются public и abstract, поэтому вам нужны только сигнатуры методов.
  • Adjustable.java: Создайте еще один интерфейс, который определяет, что значит для устройства быть регулируемым. Регулируемое устройство должно иметь возможность устанавливать свой уровень. Объявите метод setLevel(int level). Также включите константу MAX_LEVEL со значением 100 — помните, что константы в интерфейсах неявно являются public static final.
  • Main.java: Продемонстрируйте, что ваши интерфейсы определены правильно, выведя информацию о них. Вы получите один входной параметр: значение уровня (int). Выведите следующие три строки:
    • Switchable methods: turnOn, turnOff
    • Adjustable methods: setLevel
    • Max 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: ", а затем введенный уровень
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование