Интерфейсы (implements)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Интерфейсы в Java задают контракт: какие методы класс обязан реализовать, если он объявлен через implements. Это ключевая часть полиморфизма: переменная типа интерфейса может ссылаться на разные реализации. Интерфейс может содержать абстрактные методы, а также default и static методы. В этом уроке (уроки Java онлайн) закрепим синтаксис implements, переопределение методов и работу через тип интерфейса — на практических заданиях и тестах в интерактивном тренажере.

  • Класс реализует интерфейс: обязателен override методов
  • Полиморфизм через ссылку типа интерфейса
  • default/static методы интерфейса
Список тем

1. Реализуй метод интерфейса

id: 40495_if_02_replace_override_method

В этом задании вам нужно реализовать метод интерфейса в классе Circle. Интерфейс Drawable объявляет метод draw(), который не принимает аргументов и не возвращает значения. Класс Circle должен реализовать этот метод, выведя строку "Drawing a circle". В сигнатуре метода пропущены ключевые элементы: модификатор доступа, тип возвращаемого значения, имя метода и круглые скобки. Ваша задача — заполнить пропуски так, чтобы код компилировался и корректно работал.

Заполните пропуски
interface Drawable {
    void draw();
}

class Circle implements Drawable {
    @Override
    input1S input2S input3S input4S {
        System.out.println("Drawing a circle");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Класс не реализовал все методы

id: 40495_if_03_error_missing_method

В данном фрагменте кода на Java класс объявлен как реализующий интерфейс, но из-за ошибки в сигнатуре одного из методов компиляция не пройдёт. Найдите и исправьте строку с ошибкой, чтобы класс корректно реализовал все методы интерфейса.

Найдите ошибку и исправьте
interface Animal {
    void makeSound();
    int getAge();
}
 
class Dog implements Animal {
    private int age;
 
    public Dog(int age) {
        this.age = age;
    }
 
    public void makeSound() {
        System.out.println("Woof!");
    }
 
    public int getAge() {
        return age;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Полиморфная ссылка на интерфейс

id: 40495_if_04_select_fill_polymorphism

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

Нужно правильно расставить в пропуски предложенные варианты
// Объявление интерфейса
interface Drawable {
    void draw();
}

// Класс, реализующий интерфейс
class Circle implements Drawable {
    public void draw() {
        System.out.println("Рисую круг");
    }
}

public class Main {
    public static void main(String[] args) {
        // Создание полиморфной ссылки на интерфейс
        input1S input2S = input3S;
        // Вызов метода через интерфейсную ссылку
        input4S;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Собери пример: interface + implements + вызов

id: 40495_if_05_build_from_parts_interface_class

Из предложенных строк соберите корректную Java-программу, которая демонстрирует использование интерфейса: объявление интерфейса с методом, класс, реализующий этот интерфейс, и вызов метода из объекта этого класса в методе main. Игнорируйте лишние строки, которые не должны входить в решение. Программа должна корректно компилироваться и выполняться.

Перетяните в правильном порядке строки из одного блока в другой
interface Greeting {
    void sayHello();
}
class EnglishGreeting implements Greeting {
    public void sayHello() {
        System.out.println("Hello!");
    }
}
public class Main {
    public static void main(String[] args) {
        Greeting greeting = new EnglishGreeting();
        greeting.sayHello();
    }
}
        System.out.println("Goodbye!");
class SpanishGreeting {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Интерфейс или абстрактный класс: сопоставь свойства

id: 40495_if_06_compare_interface_vs_abstract

В левой колонке приведены утверждения, описывающие свойства и возможности в Java. В правой колонке указано, к какому типу — интерфейсу или абстрактному классу — относится каждое утверждение. Сопоставьте каждое утверждение слева с соответствующим типом справа. Обратите внимание, что в правой колонке каждый элемент уникален и содержит уточняющую информацию, чтобы избежать неоднозначности.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Может содержать только абстрактные методы и константы (без реализации).
Может содержать поля, конструкторы, абстрактные и конкретные методы.
Поддерживает множественное наследование (реализацию нескольких интерфейсов).
Поддерживает одиночное наследование (только один родительский класс).
Не может иметь конструкторов (в Java 8 и ранее).
Может иметь конструкторы (в том числе абстрактный конструктор).
Абстрактный класс (одиночное наследование)
Интерфейс (множественное наследование)
Абстрактный класс (есть конструкторы)
Абстрактный класс (поля, конструкторы, методы)
Интерфейс (только абстрактные методы и константы)
Интерфейс (нет конструкторов)
Сообщения
Проверить
Показать подсказку

6. Отметь все места, где используется интерфейс

id: 40495_if_08_click_target_interface_parts

Внимательно изучите приведённый фрагмент кода на Java. Ваша задача — отметить все места, где используется имя интерфейса (то есть там, где написано слово, обозначающее интерфейс). Не отмечайте имена классов, методов, переменных или другие элементы, если они не являются именем интерфейса.

Кликните по всем фрагментам, которые подходят под условие задания.
// Объявление интерфейса
interface {{Drawable~|~t1}} {
    void {{draw~|~t5}}();
}

// Класс, реализующий интерфейс
class {{Circle~|~t4}} implements {{Drawable~|~t2}} {
    private int radius;

    public Circle(int radius) {
        this.radius = radius;
    }

    @Override
    public void {{draw~|~t6}}() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

public class Main {
    public static void main(String[] args) {
        // Переменная интерфейсного типа
        {{Drawable~|~t3}} {{shape~|~t8}} = new Circle(5);
        {{shape~|~t8}}.{{draw~|~t7}}();
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру