Короткий ответ
Наследование — механизм ООП, при котором подкласс (наследник) создаётся на основе другого класса — суперкласса (родителя) — через ключевое слово extends и получает доступ к его не-private членам. Наследник может добавлять свои члены и переопределять унаследованные методы. В Java у класса может быть только один непосредственный родитель.
Как это работает подробнее
Отношение между наследником и родителем описывается как «является» (IS-A): Cat — это Animal. Наследование уменьшает дублирование кода и служит фундаментом полиморфизма.
- Переиспользование кода. Общие поля и методы выносятся в базовый класс, и каждый наследник не дублирует их, а просто наследует.
- IS-A и полиморфизм. Там, где ожидается
Animal, можно передатьCat: ссылка родительского типа указывает на объект наследника, и вызывается реализация метода именно наследника. - Конструкторы не наследуются. Наследник обязан вызвать конструктор родителя через
super(); компилятор добавляет такой вызов автоматически, если у родителя есть конструктор без параметров.
Пример кода
Main.java
class Animal {
void voice() {
System.out.println("Звук");
}
}
class Cat extends Animal {
@Override
void voice() {
System.out.println("Мяу");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Cat(); // IS-A: Cat — это Animal
a.voice(); // выведет «Мяу»
}
}Что использовать на практике
- Выносить в базовый класс общее состояние и поведение, избегая дублирования кода.
- Применять наследование только при отношении IS-A; в остальных случаях предпочитать композицию.
- Помнить: множественное наследование классов недоступно, для нескольких источников поведения использовать интерфейсы.
Подводные камни
- Использовать наследование ради переиспользования кода без отношения IS-A — код становится хрупким.
- Забывать, что у класса один непосредственный родитель, а
private-члены родителя наследнику не достаются. - Не вызывать
super(...), когда у родителя есть только конструктор с параметрами: код не скомпилируется.
Как отвечать на собеседовании
- Каркас ответа: дайте определение наследования через
extendsи отношение IS-A → перечислите выгоды: переиспользование, иерархия, полиморфизм → приведите код Animal и Cat → добавьте нюансы:super(), одиночное наследование классов, интерфейсы как альтернатива.