JavaRush/Курсы/Java Core/Интерфейсы — это больше чем интерфейсы — это поведение

Интерфейсы — это больше чем интерфейсы — это поведение

Открыта

— Привет, Амиго! А вот и снова я. Хочу рассказать тебе еще об одном взгляде на интерфейсы. Понимаешь, класс – это, чаще всего модель какого-то конкретного объекта. Интерфейс же больше соответствует не объектам, а их способностям или ролям.

Интерфейсы — это больше чем интерфейсы — это поведение - 1

Например, такие вещи, как машина, велосипед, мотоцикл и колесо лучше всего представить в виде классов и объектов. А такие их способности как «могу ездить», «могу перевозить людей», «могу стоять» — лучше представить в виде интерфейсов. Смотри пример:

Код на Java Описание
interface Moveable {
   void move(String newAddress);
}
— соответствует способности передвигаться.
interface Driveable {
    void drive(Driver driver);
}
— соответствует способности управляться водителем.
interface Transport {
    void addStuff(Object stuff);
    Object removeStuff();
}
— соответствует способности перевозить грузы.
class Wheel implements Moveable {
    ...
}
— класс «колесо». Обладает способностью передвигаться.
class Car implements Moveable, Drivable, Transport {
    ...
}
— класс «машина». Обладает способностью передвигаться, управляться человеком и перевозить грузы.
class Skateboard implements Moveable, Driveable {
    ...
}
— класс «скейтборд». Обладает способностью передвигаться и управляться человеком.
3
Задача
Java Core,  2 уровень8 лекция
Недоступна
Набираем код Ӏ Java Core: 2 уровень, 8 лекция
Java Core: 2 уровень, 8 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

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

Весь смысл в том, что тебе не нужно писать код для взаимодействия со всеми классами. Тебе достаточно взаимодействовать с их ролями (интерфейсами).

Представь, что ты – робот-строитель и у тебя в подчинении есть десятки роботов, каждый из которых может иметь несколько профессий. Тебе нужно срочно достроить стену. Ты просто берешь всех роботов, у которых есть способность «строитель» и говоришь им строить стену. Тебе все равно, что это за роботы. Хоть робот-поливалка. Если он умеет строить – пусть идет строить.

Вот как это выглядело бы в коде:

Код на Java Описание
static interface WallBuilder {
    void buildWall();
}
— способность «строитель стен». Понимает команду «(по)строить стену» — имеет соответствующий метод.
static class РабочийРобот implements WallBuilder {
    public void buildWall() {}
}
static class РоботСторож implements WallBuilder {
    public void buildWall() {}
}
static class Поливалка {}
— роботы у которых есть эта профессия/особенность.

— для удобства я сделал классам имена на русском. Такое допускается в java, но крайне нежелательно.

— поливалка не обладает способностью строить стены (не реализует интерфейс WallBuilder).

public static void main(String[] args) {
    //добавляем всех роботов в список
    ArrayList robots = new ArrayList();
    robots.add(new РабочийРобот());
    robots.add(new РоботСторож());
    robots.add(new Поливалка());

    //строить стену, если есть такая способность
    for (Object robot: robots) {
        if (robot instanceof WallBuilder) {
            WallBuilder builder = (WallBuilder) robot;
            builder.buildWall();
        }
    }
}
— как дать им команду – построить стену?

— Чертовски интересно. Даже и не думал, что интерфейсы – такая интересная тема.

— А то! В совокупности с полиморфизмом – это вообще бомба.

Комментарии (310)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Rei
Уровень 27
23 февраля, 08:28
Пустая трата времени после Java Syntax Pro
yarikk
Уровень 26
23 февраля, 10:14
Пока что так реально кажется
Anonymous #3585174
Уровень 33
4 августа 2025, 07:42
Like
Andrey D
Уровень 25
20 января 2025, 10:57
У меня вопрос, что дает объявление интерфейса и класса статическим? Если это необходимо для того чтобы не создавать объекты, а обращаться по имени класса, то зачем мы создаем объекты, а статический интерфейс я вообще никогда не видел, не могу понять? Может это опечатка, может это public ,а не static?
Kostas
Уровень 30
Expert
7 октября 2024, 13:01
Скажите, а в чем фишка задач из серии: Repeat the following code? (проверить, не забыли ли студенты Cntrl-C / Ctrl V (хоть и подсветка при маркировке слегка отключена))? :)
Вадим М. Инженер Expert
7 декабря 2024, 09:46
Набить руку - лишним не будет
{Java_Shark}
Уровень 36
16 июля 2024, 14:21
++
Борис
Уровень 33
16 марта 2024, 13:22
А зачем в последнем примере это действие: WallBuilder builder = (WallBuilder) robot; вроде ж и без него работать будет если написать: robot.buildWall(); ??
Anonymous #3358190
Уровень 33
27 марта 2024, 10:16
Не уверен точно, но возможно потому что у класса Object нет реализации .buildWall() Для этого используют приведение типов, чтоб каждый объект использовал свою реализацию в классе
Максим
Уровень 25
Expert
1 апреля 2024, 09:53
В примере используется сырой тип данных - до использования дженериков, а именно ArrayList или ArrayList<Object>. То есть список хранит супертип для WallBuilder extends Object. Поэтому нужна проверка на instanceof, а также явное приведение к типу WallBuilder, чтобы иметь доступ к методам, о которых Object попросту не знает - как и ответил человек до меня.
Codemilexteacher в Тесла клуб юных инже
14 февраля 2024, 09:17
Не пойму, комментарии Amigo искренние, или нет?
Антон Карпов
Уровень 32
2 сентября 2024, 09:39
на сарказм похожи 😄
Pan Roman
Уровень 32
12 января 2024, 12:48
Второй Мегатрон за два дня 💪
Denis Gritsay
Уровень 41
18 ноября 2023, 08:39
интерфейс - описывает поведение без привязки к объекту, абстрактный класс - класс, к в котором не описаны некоторое количество методов для того, что бы при наследовании их описывали каждый раз наиболее подходящим образом.
Dmitry Vidonov
Уровень 29
Expert
1 сентября 2023, 18:03
Для тех кто не понял за интерфейсы - лучшая статья из всех что читал - ТЫЦ Суть в том, что интерфейс не описывает какой-то объект или группу объектов. Это как некое понятие в вакууме. "Летающий", "Плавающий". А летающим и плавающим может быть что угодно, совершенно друг с другом не связанное.
interface Swimmable {
    void swim();
}
А абстрактные классы описывают уже плюс-минус какую-то группу объектов, концептуально между собой связанных. Например, Автомобили:
abstract class Auto {
    Engine engine;
    Wheels[] wheels;

    abstract void move();
    abstract void stop();
}
Т.е. хоть автомобилей может быть огромное количество самых разных видов и назначения - это все равно автомобили.
Anonymous #3311550 Backend Developer
3 сентября 2023, 17:06
понял больше, чем из лекции👍