Menu
Coddy logo textTech

Реализация интерфейсов

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

Чтобы использовать интерфейс, класс должен реализовать его с помощью ключевого слова implements. Затем класс предоставляет конкретные реализации для всех методов, объявленных в интерфейсе:

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);
    }
}

Если класс реализует интерфейс, но не предоставляет реализации для всех его методов, компилятор выдаст ошибку. Аннотация @Override является необязательной, но рекомендуется, так как она помогает обнаруживать ошибки.

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

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, не должен знать конкретный тип класса. Ему важно только то, что объект можно отрисовать.

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

challenge icon

Задание

Легко

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

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

  • Speaker.java: Определите интерфейс с именем Speaker, который объявляет, что должен уметь делать любой динамик. Каждый динамик должен иметь метод speak(), который возвращает String — это контракт, который должны выполнять все реализующие классы.
  • Human.java: Создайте класс, реализующий интерфейс Speaker. У Human есть поле name (String). Включите конструктор для инициализации имени и реализуйте метод speak(), чтобы он возвращал: [name] says: Hello everyone!
  • Robot.java: Создайте еще один класс, реализующий интерфейс Speaker. У Robot есть поле model (String). Включите конструктор для инициализации модели и реализуйте метод speak(), чтобы он возвращал: Robot [model] says: Beep boop!
  • Main.java: Объедините все вместе, используя полиморфизм на основе интерфейсов. Вы получите два входных значения: имя человека и модель робота. Создайте Human и Robot, затем сохраните их в массиве ссылок Speaker. Пройдите циклом по массиву и выведите результат вызова speak() для каждого динамика.

Вы получите два входных значения: имя человека (String) и модель робота (String).

Ваш вывод должен содержать две строки — по одной для каждого динамика. Обратите внимание, как и Human, и Robot могут обрабатываться единообразно через интерфейс Speaker, даже если они «говорят» совершенно по-разному!

Шпаргалка

Класс использует ключевое слово implements для реализации интерфейса и должен предоставить конкретные реализации для всех методов, объявленных в интерфейсе:

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);
    }
}

Аннотация @Override является необязательной, но рекомендуется, так как она помогает обнаруживать ошибки.

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

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

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

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
    }
}
quiz iconПроверьте себя

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

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