JavaRush /Курсы /Java Core /Интерфейсы

Интерфейсы

Java Core
2 уровень , 7 лекция
Открыта

— Привет, Амиго! Сегодня у тебя день открытий. Новая и интересная тема – это интерфейсы.

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

— Интерфейс – это дитя Абстракции и Полиморфизма. Интерфейс очень напоминает абстрактный класс, у которого все методы абстрактные. Он объявляется так же, как и класс, только используется ключевое слово interface. Примеры:

Код Описание и Факты
interface Drawable {
    void draw();
}
interface HasValue {
    int getValue();
}
1) Вместо слова class пишем interface.

2) Содержит только абстрактные методы (слово abstract писать не нужно).

3) На самом деле у интерфейсов все методы — public.

interface Element extends Drawable, HasValue {
    int getX();
    int getY();
}
Интерфейс может наследоваться только от интерфейсов.

Интерфейсов-родителей может быть много.

abstract class ChessItem implements Drawable, HasValue {
    private int x, y, value;

    public int getValue() {
        return value;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

}
Класс может наследоваться от нескольких интерфейсов (и только от одного класса). При этом используется ключевое слово implements.

Класс ChessItem объявлен абстрактным: он реализовал все унаследованные методы, кроме draw.

Т.е. класс ChessItem содержит один абстрактный метод: draw().

— Интересно. А зачем нужны интерфейсы? Когда их используют?

— У интерфейсов есть два сильных преимущества по сравнению с классами:

1) Отделение «описания методов» от их реализации.

Раньше я тебе рассказывал, что если ты хочешь разрешить вызывать методы своего класса из других классов, то их нужно пометить ключевым словом public. Если же хочешь, чтобы какие-то методы можно было вызывать только из твоего же класса, их нужно помечать ключевым словом private. Другими словами мы делим методы класса на две категории: «для всех» и «только для своих».

С помощью интерфейсов, это деление можно усилить еще больше. Мы сделаем специальный «класс для всех», и второй «класс для своих», который унаследуем от первого. Вот как это примерно будет:

Было
class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    private void setName(String name) {
        this.name = name;
    }
Стало
interface Student {
    public String getName();
}

class StudentImpl implements Student {
    private String name;
    public StudentImpl(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    private void setName(String name) {
        this.name = name;
    }
}
Было
public static void main(String[] args) {
    Student student =
        new Student("Alibaba");
    System.out.println(student.getName());
}
Стало
public static void main(String[] args) {
    Student student =
        new StudentImpl("Ali");
    System.out.println(student.getName());
}

Мы разбили наш класс на два: интерфейс и класс, унаследованный от интерфейса.

— И в чем тут преимущество?

— Один и тот же интерфейс могут реализовывать (наследовать) различные классы. И у каждого может быть свое собственное поведение. Так же как ArrayList и LinkedList – это две различные реализации интерфейса List.

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

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

2) Множественное наследование.

В Java все классы могут иметь только одного класса-родителя. В других языках программирования, классы часто могут иметь несколько классов-родителей. Это очень удобно, но приносит так же много проблем.

В Java пришли к компромиссу – запретили множественное наследование классов, но разрешили множественное наследование интерфейсов. Интерфейс может иметь несколько интерфейсов-родителей. Класс может иметь несколько интерфейсов-родителей и только один класс-родитель.

Комментарии (335)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сергей Уровень 40
24 августа 2025
Я В ЭТИ ИГРЫ УЖЕ ИГРАЛ!!!
Anonymous #3585174 Уровень 33
4 августа 2025
Like
j1nDo Уровень 29
7 августа 2024
ПОВТОРЕНИЕ - МАТЬ УЧЕНИЯ
Wren Уровень 29
20 августа 2024
СТРАДАНИЯ ЗАКАЛЯЮТ ХАРАКТЕР
Igoreek Уровень 43
1 августа 2024
Тут был Йа
Vlad Уровень 30
2 августа 2024
Неуловимый Игорёк. 2 лвла за день.
{Java_Shark} Уровень 36
16 июля 2024
++
Igoreek Уровень 43
1 августа 2024
зачем ты ставишь ++ под каждой лекцией?
Vlad Уровень 30
2 августа 2024
Это его фишка
{Java_Shark} Уровень 36
7 августа 2024
секрет)))
CoreOne Уровень 23 Expert
1 сентября 2024
инкрементирует свой лвл))
shakh Уровень 33
28 сентября 2024
Он ставит ++ там, где инфа повторяется
Exaltyr777 Уровень 25
30 августа 2025
чтобы понять не подсунули ли опять лекцию которую уже читал 2 недели назад😁
Илья Уровень 3
14 июля 2024
В примере с интерфейсом Student

interface Student
{
 public String getName();
}

class StudentImpl implements Student
{
 private String name;
 public StudentImpl(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
Класс Student

class Student
{
 private String name;

 public Student(String name)
 {
  this.name = name;
 }

 public String getName()
 {
  return this.name;
 }
Разница вообще минимальная. Не понял. В чем преимущество?
mrnght Уровень 28
20 июля 2024
преимущество будет видно, если мы, например, создадим список с объектами разных классов, но все они будут унаследованы от интерфейса Student. Без него мы бы не смогли такой список создать.
Semen Semenov Уровень 37
28 марта 2024
Почему класс ChessItem на приведенном примере не имплементирует интерфейс Element и при этом реализует его методы? Объясните, пожалуйста.
2 апреля 2024
тоже интересует этот вопрос, опечатка?
HOCOK_B_CMETAHE Уровень 34
13 мая 2024
В данном случае класс ChessItem не реализует методы интерфейса Element, а объявляет свои, хоть это и не обязательно.
Bohdan Уровень 2
2 июня 2024
Ну хз, написано ведь он реализовал все унаследованные методы, кроме draw, а значит не один лишь getValue
Денис Леднев Уровень 33
9 февраля 2024
ТАК, а кто мне лаву за эти лекции вернет?? одни убытки
Максим Li Уровень 40
11 ноября 2023
Полезно перечитывать иногда эти лекции, все становится понятнее и понятнее.
Denis Gritsay Уровень 41
17 ноября 2023
если вы работаете, зачем?
Максим Li Уровень 40
18 ноября 2023
Хороший вопрос. Например, освежить память или для подготовки к собеседованиям, или если нужно будет объяснить темы другому начинающиму программисту или ученику простыми словами.
Dan Уровень 23
31 октября 2023
<<Ага. День настолько чудесный, что я приду домой и приму ванну полную воды.>> Тонкий юмор)
Somethingelse Уровень 32
20 апреля 2024
Тоже оценил. Для робота не самое безопасное времяпрепровождение)