Зачем нужны интерфейсы?
Зачем нужно наследование интерфейсов?
Зачем нужен полиморфизм?
Для тех, кто почитал и понял как делать интерфейсы, но не понял зачем.
Что бы обойти это «нельзя», в Java есть интерфейсы. И для привычек мы придумаем свой интерфейс. Даже два:
Выглядеть они будут так:
Смысл интерфейсов теперь должен быть понятен – в Java с помощью интерфейсов можно реализовать множественное наследование.
Если развивать ситуацию дальше, например: ведь у Папы и Мамы наверняка есть привычки, которые они не передали Пете, да и у Пети могут быть свои личные привычки. Как эту жизненную Санта-Барбару перенести в плоскость Java вы узнаете в следующих сериях.
Это не единственный пример для понимания интерфейсов.Если не читали следующие статьи, то обязательно прочтите:
Интерфейсы в Java (если не открыто, можно выйти из профиля или прочитать в режиме - инкогнито)
Для чего в Java нужны интерфейсы - тут реализуйте все примеры из статьи и поизменяйте методы и в интерфейсах и в калассах: наименования методов, сигнатуры (то что метод принимает на вход), типы вывода методов.
Разберитесь самостоятельно:
- с разницей при имплементации интерфейса с классом и абстрактным классом;
- дефолтными методами.
Дисклеймер: В этой статье и последующих, нейминги классов и методов будут приведены на русском языке.
Когда речь заходит о принципах объектно-ориентированного программирования (ООП): полиморфизм, наследование и инкапсуляция, полезно приводить аналогии из реального мира. Большой плюс ООП в том, что мы в программе можем смоделировать часть реальной вселенной. Смоделируем семью Ивановых: Папа, Мама и мальчик Петя. От Папы Петя унаследовал привычку прихлюпывать когда пьет чай, а от Мамы он унаследовал привычку поджимать губы во время чтения. Если попытаться реализовать эту ситуацию в программу, то у нас получиться три класса:
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 нельзя, потому что с множественным наследованием могут возникнуть большие проблемы: подробно пишут в интернете.

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 вполне возможна.

ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ