Для тих, хто почитав і зрозумів, як робити інтерфейси, але не зрозумів, навіщо. Коли мова заходить про принципи об'єктно-орієнтованого програмування (ООП): поліморфізм, наслідування та інкапсуляція, корисно наводити аналогії з реального світу. Великий плюс ООП у тому, що ми в програмі можемо змоделювати частину реального всесвіту. Змоделюємо сім'ю Іванових: Тато, Мама і хлопчик Петро. Від Тата Петро успадкував звичку прихлюпувати, коли п'є чай, а від Мами він успадкував звичку піджимати губи під час читання. Якщо спробувати реалізувати цю ситуацію в програмі, то у нас вийдуть три класи:

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 не можна реалізувати множинне наслідування класів. До речі, у C++ це можна, а от у 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 потрібні інтерфейси - тут реалізуйте всі приклади зі статті та змінюйте методи і в інтерфейсах, і в класах: назви методів, сигнатури (те, що метод приймає на вхід), типи виводу методів. Розберіться самостійно: - з різницею при імплементації інтерфейсу з класом та абстрактним класом; - дефолтними методами.