Карта / ООП / ООП — четыре принципа

ООП — четыре принципа

ООП — это когда программа собрана из объектов. Объект хранит вместе свои данные и поведение (методы). Держится ООП на четырёх принципах:

1
Инкапсуляция
Прячем внутренности, наружу — только нужные кнопки.
🔹 Банкомат: жмёшь кнопки, в механизм не лезешь.
2
Наследование
Новый класс берёт свойства и поведение родителя.
🔹 Кот наследует от Животного — уже умеет есть и спать.
3
Полиморфизм
Один и тот же вызов — разное поведение.
🔹 animal.sound(): кот мяукает, собака лает.
4
Абстракция
Показываем «что делает», прячем «как».
🔹 Руль: крутишь, не зная устройства машины.

Наследование и полиморфизм проще всего увидеть на иерархии:

Животное ест, спит, sound() Кот sound() → «мяу» Собака sound() → «гав»
class Animal {
    private String name;          // инкапсуляция: поле спрятано
    String getName() { return name; }
    String sound() { return "..."; }
}

class Cat extends Animal {         // наследование
    @Override String sound() { return "мяу"; }   // полиморфизм
}
Копнуть глубже

Переопределение vs перегрузка — главная путаница:

Перегрузка одно имя, разные параметры print(int n) print(String s)

Переопределение наследник заменяет метод Animal.sound() Cat.sound() @Override

  • Перегрузка — выбор метода на компиляции (по типам аргументов).
  • Переопределение — выбор в рантайме (по реальному типу объекта).

this и super: this — текущий объект (свои поля/методы); super — обращение к родителю (его конструктор или метод).

Интерфейс и абстрактный класс — оба нельзя создать через new. Интерфейс — контракт «что умеет», абстрактный класс — полузаготовка «часть готова, часть наследнику». Детальная разница — ниже, под капотом.

Под капотом

1. Инкапсуляция. private/protected/public — правила времени компиляции: компилятор не даст залезть в private снаружи. Смысл — класс сам стережёт состояние через геттеры/сеттеры, чтобы не сломать свои инварианты.

2. Наследование. В Java единичное наследование классов (один родитель — чтобы не было «ромбовидной» неоднозначности). При создании объекта сначала отрабатывает конструктор родителя (super()), потом свой.

3. Полиморфизм — главная магия. У каждого класса есть таблица виртуальных методов (vtable) с адресами его методов. JVM в рантайме смотрит на реальный тип объекта и вызывает его версию — это динамическое связывание.

Animal a = new Cat(); a.sound(); в рантайме JVM смотрит реальный тип объекта объект Cat · vtable sound() → «мяу» вызвалась версия Cat, а не Animal

4. Абстракция — абстрактный класс vs интерфейс:

Абстрактный классИнтерфейс
Что этополузаготовкачистый контракт
Состояние (поля)данет (только константы)
Готовые методыдатолько default / static
Сколько наследуешьодин (extends)много (implements)
Когда братьобщее состояние + базовая логика родственных классовспособность для разных несвязанных классов

Реализация: наследник пишет extends АбстрактныйКласс и обязан дописать абстрактные методы; класс пишет implements Интерфейс и реализует все его методы. Если нужна и общая база, и несколько способностей — комбинируют: class Cat extends Animal implements Comparable.

🎤 Закрыл тему, если можешь объяснить:
• назвать 4 принципа ООП своими словами;
• разницу переопределения и перегрузки, this и super (если дошёл до 2-го слоя);
• как работает динамическое связывание и чем абстрактный класс отличается от интерфейса (если дошёл до 3-го слоя).