ООП — четыре принципа
ООП — это когда программа собрана из объектов. Объект хранит вместе свои данные и поведение (методы). Держится ООП на четырёх принципах:
Наследование и полиморфизм проще всего увидеть на иерархии:
class Animal {
private String name; // инкапсуляция: поле спрятано
String getName() { return name; }
String sound() { return "..."; }
}
class Cat extends Animal { // наследование
@Override String sound() { return "мяу"; } // полиморфизм
}
Копнуть глубже
Переопределение vs перегрузка — главная путаница:
- Перегрузка — выбор метода на компиляции (по типам аргументов).
- Переопределение — выбор в рантайме (по реальному типу объекта).
this и super: this — текущий объект (свои поля/методы); super — обращение к родителю (его конструктор или метод).
Интерфейс и абстрактный класс — оба нельзя создать через new. Интерфейс — контракт «что умеет», абстрактный класс — полузаготовка «часть готова, часть наследнику». Детальная разница — ниже, под капотом.
Под капотом
1. Инкапсуляция. private/protected/public — правила времени компиляции: компилятор не даст залезть в private снаружи. Смысл — класс сам стережёт состояние через геттеры/сеттеры, чтобы не сломать свои инварианты.
2. Наследование. В Java единичное наследование классов (один родитель — чтобы не было «ромбовидной» неоднозначности). При создании объекта сначала отрабатывает конструктор родителя (super()), потом свой.
3. Полиморфизм — главная магия. У каждого класса есть таблица виртуальных методов (vtable) с адресами его методов. JVM в рантайме смотрит на реальный тип объекта и вызывает его версию — это динамическое связывание.
4. Абстракция — абстрактный класс vs интерфейс:
| Абстрактный класс | Интерфейс | |
|---|---|---|
| Что это | полузаготовка | чистый контракт |
| Состояние (поля) | да | нет (только константы) |
| Готовые методы | да | только default / static |
| Сколько наследуешь | один (extends) | много (implements) |
| Когда брать | общее состояние + базовая логика родственных классов | способность для разных несвязанных классов |
Реализация: наследник пишет extends АбстрактныйКласс и обязан дописать абстрактные методы; класс пишет implements Интерфейс и реализует все его методы. Если нужна и общая база, и несколько способностей — комбинируют: class Cat extends Animal implements Comparable.
• разницу переопределения и перегрузки, this и super (если дошёл до 2-го слоя);
• как работает динамическое связывание и чем абстрактный класс отличается от интерфейса (если дошёл до 3-го слоя).