Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 34 из 87.

Вы уже видели, как abstract классы определяют контракты, которым должны следовать подклассы. Но что, если вы хотите, чтобы class следовал нескольким контрактам? Java не позволяет class наследовать несколько классов, но решает эту проблему с помощью interfaces.

interface — это контракт, который определяет, что может делать класс, не уточняя, как именно он это делает. В отличие от абстрактных классов, interfaces содержат только сигнатуры методов (по умолчанию), без реализации:

public interface Drawable {
    void draw();
}

public interface Resizable {
    void resize(int width, int height);
}

Представляй interface как обещание. Когда class реализует interface, он обещает предоставить реализации для всех methods, объявленных в этом interface. interface определяет способность, а class предоставляет поведение.

Интерфейсы объявляются с использованием ключевого слова interface вместо class. Все methods в интерфейсе implicitly public и abstract, поэтому тебе не нужно писать эти ключевые слова:

public interface Playable {
    void play();    // неявно public abstract
    void pause();
    void stop();
}

Интерфейсы также могут declare constants, которые implicitly являются public static final:

public interface GameConstants {
    int MAX_PLAYERS = 4;  // неявно public static final
}

В следующем уроке ты узнаешь, как классы реализуют интерфейсы с помощью ключевого слова implements.

challenge icon

Задание

Легко

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

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

  • Switchable.java: создайте interface, который определяет, что значит быть переключаемым устройством. Любое переключаемое устройство должно уметь включаться и выключаться. Declare два methods: turnOn() и turnOff(). Remember: methods interface неявно являются public и abstract, поэтому вам нужны только сигнатуры methods.
  • Adjustable.java: создайте ещё один interface, который определяет, что значит быть регулируемым устройством. Регулируемое устройство должно уметь устанавливать свой level. Declare method setLevel(int level). Также Include constant MAX_LEVEL со значением 100: Remember, что constants в interfaces неявно являются public static final.
  • Main.java: продемонстрируйте, что ваши interfaces правильно определены, напечатав information о них. Вы получите один input: значение level (int). Выведите следующие три строки:
    • Switchable methods: turnOn, turnOff
    • Adjustable methods: setLevel
    • Max level constant: [MAX_LEVEL value] (получите constant из interface Adjustable)
    Затем выведите: Setting level to: [input level]

Вы получите один input: значение level (int).

Эта задача посвящена исключительно определению interfaces: чертежей, описывающих возможности. В следующем уроке вы узнаете, как классы фактически реализуют эти interfaces, чтобы обеспечить реальное поведение!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Выведите информацию об интерфейсах
        // Print: "Switchable methods: turnOn, turnOff"
        // Print: "Adjustable methods: setLevel"
        // Print: "Max level constant: " followed by Adjustable.MAX_LEVEL
        // Print: "Setting level to: " followed by the input level
        
    }
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Java