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 HelloWorld Manager Expert
1 ноября 2022, 11:14
Отличная статья! Спасибо!
Anonymous #3087360
Уровень 3
3 сентября 2022, 08:41
Это мой первый комментарий на Java Rush. Никогда их не оставляют, но автор пишет, как боженька! Пиши ещё! P.S. прочитал и следующую статью "Зачем нужно наследование интерфейсов?". Она также шикарна
Иван
Уровень 23
24 июля 2022, 12:49
Спасибо за статью и за ссылки на другие варианты учебного курса Ява Раш.
Alex Boy
Уровень 51
24 июля 2022, 11:47
При наследовании от класса, я могу пользоваться его методами, полями. При имплементации я только обязуюсь использовать некий абстрактный метод, реализацию которого пишу сам, под свой класс. Могу ли я пользоваться методами Мамы и Папы при имплементации?
Павел
Уровень 11
25 июля 2022, 06:20
Погугли про дефолтные методы в интерфейсах
Михаил
Уровень 20
9 июля 2022, 14:55
отличный пример , плюс сопровождение мемами на высоте
Евгений N
Уровень 23
29 июня 2022, 03:44
а потомки (extends) Пети последней версии унаследуют методы "прихлюпывать" и "поджимать"?
Sergiu Pascari
Уровень 89
Expert
20 июня 2022, 10:40
Отличная статья! Ради неё оставляю первый комментарий на JavaRush
ListopadVlad Составитель поездов в Завод Мечел
22 февраля 2022, 12:31
норм
Евгения
Уровень 12
27 декабря 2021, 12:59
Павел, статья - ааагонь!! Хороший понятный пример - залог успешного понимания материала. Спасибо. Пишите ещё!
Arseny Klenin
Уровень 22
27 декабря 2021, 08:23
Это прекрасно. Спасибо.