JavaRush /Java блог /Java Developer /Зачем нужны интерфейсы?
Павел
11 уровень

Зачем нужны интерфейсы?

Статья из группы Java Developer
Зачем нужны интерфейсы? Зачем нужно наследование интерфейсов? Зачем нужен полиморфизм? Для тех, кто почитал и понял как делать интерфейсы, но не понял зачем.

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

Когда речь заходит о принципах объектно-ориентированного программирования (ООП): полиморфизм, наследование и инкапсуляция, полезно приводить аналогии из реального мира. Большой плюс ООП в том, что мы в программе можем смоделировать часть реальной вселенной. Смоделируем семью Ивановых: Папа, Мама и мальчик Петя. От Папы Петя унаследовал привычку прихлюпывать когда пьет чай, а от Мамы он унаследовал привычку поджимать губы во время чтения. Если попытаться реализовать эту ситуацию в программу, то у нас получиться три класса:

class Папа 
class Мама 
class Петя 
У Папы и Мамы есть привычки, которые нужно передать Пете. Привычки — это какие-то действия - так что лучше всего реализовать их в программном мире как методы: Сначала Папа:

class Папа {
public void прихлюпывать() {
System.out.println("Хлюп");
    }
}
Теперь Мама:

class Мама {
public void поджимать() {
System.out.println("Поджать губки");
   }
}
Если речь идет о наследовании, то логично написать код так:

class Петя extends Папа, Мама {
@Override
public void прихлюпывать() {
     System.out.println("Хлюп");
   }

@Override
public void поджимать() {
System.out.println("Поджать губки");
    }
}
То есть унаследовать Петю от Папы и Мамы одновременно. Если так написать, то компилятор будет ругаться, потому что в Java нельзя реализовать множественное наследование классов. К слову, в С++ можно, а вот в Java нельзя, потому что с множественным наследованием могут возникнуть большие проблемы: подробно пишут в интернете. Зачем нужны интерфейсы? - 1Что бы обойти это «нельзя», в Java есть интерфейсы. И для привычек мы придумаем свой интерфейс. Даже два: Выглядеть они будут так:

public interface ПривычкиПапы {
    public void прихлюпывать();
}
public interface ПривычкиМамы {
    public void поджимать();
}
В интерфейсе мы только описали привычки, но не описали что они конкретно делают, потому что конкретную реализацию мы пропишем в классах. Сначала отдадим Папе и Маме их законные привычки.

class Папа implements ПривычкиПапы {

   @Override
    public void прихлюпывать() {
     System.out.println("Хлюп");
   }
}

class Мама implements ПривычкиМамы{

@Override
public void поджимать() {
System.out.println("Поджать губки");
    }
}
И теперь, абсолютно легально можно передать Пете привычки от Папы и Мамы одновременно

class Петя implements ПривычкиПапы, ПривычкиМамы {

@Override
public void прихлюпывать() {
     System.out.println("Хлюп");
   }

@Override
public void поджимать() {
System.out.println("Поджать губки");
    }
}
То есть множественная реализация (чаще говорят имплементация) в Java вполне возможна. Зачем нужны интерфейсы? - 2Смысл интерфейсов теперь должен быть понятен – в Java с помощью интерфейсов можно реализовать множественное наследование. Если развивать ситуацию дальше, например: ведь у Папы и Мамы наверняка есть привычки, которые они не передали Пете, да и у Пети могут быть свои личные привычки. Как эту жизненную Санта-Барбару перенести в плоскость Java вы узнаете в следующих сериях. Это не единственный пример для понимания интерфейсов.Если не читали следующие статьи, то обязательно прочтите: Интерфейсы в Java (если не открыто, можно выйти из профиля или прочитать в режиме - инкогнито) Для чего в Java нужны интерфейсы - тут реализуйте все примеры из статьи и поизменяйте методы и в интерфейсах и в калассах: наименования методов, сигнатуры (то что метод принимает на вход), типы вывода методов. Разберитесь самостоятельно: - с разницей при имплементации интерфейса с классом и абстрактным классом; - дефолтными методами.
Комментарии (26)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Fanil Magdiew Уровень 84 Expert
1 ноября 2022
Отличная статья! Спасибо!
Anonymous #3087360 Уровень 3
3 сентября 2022
Это мой первый комментарий на Java Rush. Никогда их не оставляют, но автор пишет, как боженька! Пиши ещё! P.S. прочитал и следующую статью "Зачем нужно наследование интерфейсов?". Она также шикарна
Иван Уровень 23
24 июля 2022
Спасибо за статью и за ссылки на другие варианты учебного курса Ява Раш.
Alex Boy Уровень 51
24 июля 2022
При наследовании от класса, я могу пользоваться его методами, полями. При имплементации я только обязуюсь использовать некий абстрактный метод, реализацию которого пишу сам, под свой класс. Могу ли я пользоваться методами Мамы и Папы при имплементации?
Михаил Уровень 20
9 июля 2022
отличный пример , плюс сопровождение мемами на высоте
Евгений N Уровень 23
29 июня 2022
а потомки (extends) Пети последней версии унаследуют методы "прихлюпывать" и "поджимать"?
Sergiu Pascari Уровень 89 Expert
20 июня 2022
Отличная статья! Ради неё оставляю первый комментарий на JavaRush
ListopadVlad Уровень 20
22 февраля 2022
норм
Евгения Уровень 12
27 декабря 2021
Павел, статья - ааагонь!! Хороший понятный пример - залог успешного понимания материала. Спасибо. Пишите ещё!
Arseny Klenin Уровень 22
27 декабря 2021
Это прекрасно. Спасибо.