Основы наследования (extends)
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 20 из 87.
Наследование — один из основных столпов ООП. Оно позволяет классу приобретать свойства и методы другого класса, способствуя повторному использованию кода и устанавливая естественную иерархию между классами.
В Java вы создаете отношение наследования, используя ключевое слово extends. Класс, который наследует, называется подклассом (или дочерним классом), а класс, от которого происходит наследование, — суперклассом (или родительским классом).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Вызывает конструктор родительского класса
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Класс Dog автоматически наследует метод eat() и метод getName() от Animal. Он также может определять свои собственные методы, такие как bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Наследуется: "Buddy is eating"
myDog.bark(); // Собственный метод: "Buddy says woof!"Представьте наследование как отношение «is-a». Dog является Animal, поэтому для Dog логично расширять Animal. Это отношение позволяет создавать специализированные классы, которые разделяют общую функциональность, добавляя при этом свое собственное уникальное поведение.
Задание
ЛегкоДавайте создадим простую систему транспортных средств, которая демонстрирует наследование в действии. Вы создадите родительский класс, содержащий общие свойства транспортного средства, и дочерний класс, который расширяет его специализированным поведением.
Вы организуете свой код в трех файлах:
Vehicle.java: Создайте родительский класс, представляющий любое транспортное средство. Он должен иметь:- Приватное поле для марки транспортного средства
brand(String) - Конструктор, который принимает название бренда (использование
super()здесь не требуется, так как Vehicle является родительским классом) - Метод
getBrand(), который возвращает бренд - Метод
start(), который выводит:[brand] is starting
- Приватное поле для марки транспортного средства
Motorcycle.java: Создайте подкласс, который расширяет Vehicle. Мотоцикл — это транспортное средство, поэтому отношение "является" (is-a) делает наследование уместным. Ваш Motorcycle должен:- Использовать
extendsдля наследования от Vehicle - Иметь конструктор, который принимает бренд и передает его родителю с помощью
super(brand) - Добавить собственный метод
wheelie(), который выводит:[brand] is doing a wheelie!
- Использовать
Main.java: Объедините все вместе, создав объект Motorcycle и продемонстрировав как унаследованное, так и уникальное поведение. Вы получите один входной параметр: название бренда. Выведите две строки, вызвав:- Унаследованный метод
start() - Собственный метод мотоцикла
wheelie()
- Унаследованный метод
Вы получите один входной параметр: название бренда (String) для вашего мотоцикла.
Обратите внимание, как ваш Motorcycle автоматически получает доступ к start() и getBrand() без их повторного написания — в этом и заключается сила наследования!
Шпаргалка
Используйте ключевое слово extends для создания отношения наследования между классами:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Вызывает конструктор родителя
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Подкласс (дочерний класс) наследует все методы суперкласса (родительского класса) и может добавлять свои собственные:
Dog myDog = new Dog("Buddy");
myDog.eat(); // Унаследованный метод
myDog.bark(); // Собственный методИспользуйте super() в конструкторе подкласса для вызова конструктора родительского класса.
Наследование представляет собой отношение «является» (is-a) между классами.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Создайте объект Motorcycle с переменной brand
// TODO: Вызовите унаследованный метод start()
// TODO: Вызовите метод wheelie()
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»