Наследование в Java: концепции, типы и практические примеры
Наследование в Java: полное руководство
Изучите наследование в Java в глубину — поймите его принципы, реальные примеры и как применять его для чистого, повторно используемого кода.
Наследование — краеугольный камень объектно-ориентированного программирования, позволяющий создавать новый класс на основе существующего.
Производный класс называется подклассом (child или derived), а класс, который он расширяет — суперклассом (parent или base). Ключевое слово extends устанавливает эту связь.
class Animal { // методы и поля } class Dog extends Animal { // Dog наследует поля и методы от Animal }
Здесь Dog наследует все члены Animal — подкласс получает функциональность родителя.
Пример 1: Базовое наследование
class Animal { String name; public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { public void display() { System.out.println("My name is " + name); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.name = "Rohu"; labrador.display(); labrador.eat(); } }
Вывод:
My name is Rohu I can eat
В этом примере Dog наследует name и eat() от Animal, поэтому объект Dog может обращаться к ним напрямую.

Отношение is-a (является)
Наследование в Java представляет отношение is-a: подкласс является специализированной формой своего суперкласса.
- Car is a Vehicle (Автомобиль является Транспортным средством)
- Orange is a Fruit (Апельсин является Фруктом)
- Surgeon is a Doctor (Хирург является Врачом)
- Dog is an Animal (Собака является Животным)
Эти естественные иерархии обосновывают использование наследования.
Переопределение методов
Когда подкласс определяет метод с той же сигнатурой, что и в суперклассе, метод подкласса переопределяет версию суперкласса. Это позволяет полиморфизму во время выполнения.
Пример 2: Переопределение eat()
class Animal { public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { @Override public void eat() { System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.eat(); labrador.bark(); } }
Вывод:
I eat dog food I can bark
Вызов eat() на labrador разрешается в переопределенный метод в Dog.
@Override опциональна, но настоятельно рекомендуется — она заставляет компилятор проверить, что вы действительно переопределяете метод.Использование super для доступа к суперклассу
При переопределении ключевое слово super позволяет вызвать реализацию родителя.
Пример 3: super в eat()
class Animal { public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { @Override public void eat() { super.eat(); System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.eat(); labrador.bark(); } }
Вывод:
I can eat I eat dog food I can bark
Здесь super.eat() вызывает метод, определенный в Animal, перед выполнением логики подкласса.
Аналогично, super может вызывать конструкторы суперкласса.
Protected-члены в наследовании
Поля или методы, помеченные protected, доступны подклассам независимо от пакета.
Пример 4: Доступ к protected-членам
class Animal { protected String name; protected void display() { System.out.println("I am an animal."); } } class Dog extends Animal { public void getInfo() { System.out.println("My name is " + name); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.name = "Rocky"; labrador.display(); labrador.getInfo(); } }
Вывод:
I am an animal. My name is Rocky
Подкласс может свободно читать и изменять защищенное поле name и вызывать display().
Зачем использовать наследование?
- Повторное использование кода: Дочерний класс автоматически наследует все public и protected члены родителя.
- Полиморфизм: Переопределение обеспечивает динамическую диспетчеризацию методов, ключевую особенность полиморфизма во время выполнения.
Типы наследования
Java поддерживает пять концептуальных моделей наследования — каждая полезна в разных сценариях.
1. Одиночное наследование (Single Inheritance)
Класс расширяет только один суперкласс.

2. Многоуровневое наследование (Multilevel Inheritance)
Подкласс становится суперклассом для другого класса, создавая цепочку.

3. Иерархическое наследование (Hierarchical Inheritance)
Несколько подклассов наследуют от одного суперкласса.

4. Множественное наследование (Multiple Inheritance)
Java не позволяет классу расширять более одного класса, но интерфейсы предоставляют способ реализовать этот паттерн.

5. Гибридное наследование (Hybrid Inheritance)
Сочетание двух или более типов наследования — например, комбинация иерархического и множественного.

java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Наследование в C#: базовые и производные классы, интерфейсы