Наследование в Java
Создайте дочерний тип с extends, чтобы использовать метод, написанный у родителя. Поместите horn на Car, чтобы печатался beep. Напишите class Truck extends Car. В Yard.java создайте Truck и вызовите t.horn(). Скомпилируйте javac Yard.java и запустите java Yard. На экране должен быть beep. Вторая демонстрация тоже создаёт простой Car, чтобы вы увидели: родитель работает и после появления потомка. Оставьте super для следующей страницы. Не переписывайте horn в Truck на этой странице — переопределение позже.
Потомок сохраняет метод родителя
На странице paths места назывались через Paths.get. Эта страница открывает новый модуль: один класс может быть потомком другого. Откройте учебный файл Yard.java. Держите имя public-класса Yard, чтобы оно совпадало с файлом. Удалите оставшиеся демо пути Route, писатели Store, сканеры Reader и любой клавиатурный Scanner. Программа не должна ждать ввода. Для этого урока строка import не нужна.
Над public-классом объявите родительский тип package-private:
class Car {
Внутри Car напишите метод экземпляра void horn(), который печатает beep:
System.out.println("beep");
Затем объявите потомка:
class Truck extends Car {
На этой странице тело Truck оставьте пустым. Потомок не переписывает horn. Пустых скобок достаточно, чтобы сказать: Truck — вид Car.
В Yard.main создайте грузовик и вызовите унаследованный метод:
Truck t = new Truck();
t.horn();
Вызов работает, потому что extends Car связывает Truck с Car. Вы не копировали horn в Truck.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
t.horn();
}
}
Из папки с Yard.java выполните javac Yard.java. Когда скобки и точки с запятой сходятся, javac не пишет свою строку. Затем запустите java Yard — не java Yard.java. Уберите суффикс .java из команды запуска. В файле один public-класс, имя совпадает с Yard. Вспомогательные типы Car и Truck без public в этой начальной форме. Три public-класса в одном файле заставят javac отказать — помните правило со страницы classes.
Экран показывает beep. Пройдите запуск один раз. Java стартует в Yard.main. new Truck() создаёт объект truck. t.horn() находит horn у родителя Car через наследование. Метод печатает beep. Если javac не находит horn у Truck, строка extends Car пропала или с опечаткой — верните её. Если видите note.txt или печать пути, ещё запускается остаток Route — переключитесь на java Yard. Если терминал ждёт ввода, в файле остался клавиатурный Scanner — удалите.
Пишите extends внимательно. Запятая или слово implements по ошибке — не этот урок. Наследование здесь — ключевое слово extends между именами потомка и родителя. Имя потомка первым: Truck extends Car, не наоборот.
Не пишите super на этой странице. Вызов родительского конструктора через super — следующий урок. Не пишите второй horn внутри Truck; история override позже. Сегодня потомок пуст и всё равно использует метод родителя. Пустое тело — намеренное обучение, а не ошибку, которую «чинят» копированием horn в Truck.
📊 Parent and child on this page
| Piece | Role |
|---|---|
| Car | parent type that owns horn |
| Truck | child type via extends Car |
| Yard | public starter with main |
| horn | prints beep; written only on Car |
Родитель всё ещё работает сам
Вторая программа сохраняет тот же Car, тот же пустой Truck extends Car и тот же public Yard. В main создайте и Car, и Truck, и на каждом вызовите horn.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
public class Yard {
public static void main(String[] args) {
Car c = new Car();
Truck t = new Truck();
c.horn();
t.horn();
}
}
Скомпилируйте javac Yard.java, затем запустите java Yard. Экран показывает beep, затем снова beep. Первая строка от простого Car. Вторая от Truck, унаследовавшего horn. Создание потомка не удалило и не сломало родительский тип. Оба объекта могут вызывать одно тело метода, написанное раз на Car. Вы по-прежнему сами создаёте каждый объект через new; строка extends не создаёт truck автоматически.
Этот контраст — контрольная точка. Наследование добавляет дочерний путь к существующему методу. Родителя удалять не нужно. Если убрать extends Car у Truck, t.horn() не скомпилируется, потому что Truck больше не получает horn. Держите extends для учебного потомка. Файл с одним truck — когда нужен тихий beep. Файл с двумя объектами — когда нужно доказать, что родитель ещё отвечает.
Сравнение с paths на Route
На странице paths java Route называл папки и файлы. На этой странице java Yard связывает типы через extends. Файлы Route оставьте как историю, если они рядом; для демо наследования запускайте java Yard, чтобы экран совпадал с уроком.
extends, повторное использование метода родителя и пустое тело потомка — новые элементы. Вы уже знаете new и методы экземпляра с прошлых OOP-страниц. Сегодня эти части впервые встречаются с наследованием на этом пути курса. Держите учебные имена Car, Truck и Yard, чтобы команды compile и run оставались короткими.
Что эта страница оставляет для super
Эта страница показывает потомка, который использует метод родителя без super. Следующая страница вводит super, чтобы потомок намеренно обращался к родителю, особенно у конструкторов. Оставайтесь на extends и унаследованном вызове horn здесь. Пока не добавляйте super() как требование в эти демо Yard.
Перед super
Вы можете написать Truck extends Car, создать Truck и увидеть beep от horn. Можете создать простой Car и увидеть, что родитель всё ещё печатает beep. Скомпилируйте Yard.java и по очереди запустите java Yard для каждой сохранённой демо. Потомок остался пустым и всё равно использовал метод родителя. Следующая страница — super, где потомок говорит с родителем прямее.
Держите демо с одним truck для ясного унаследованного вызова. Держите демо с двумя объектами, чтобы доказать, что родитель работает сам. Пока держите super вне этой страницы. Эти три привычки — контрольная точка перед продолжением. Когда beep появляется от Truck, который никогда не писал свой horn, наследование сделало свою работу в этом уроке и вы готовы к теме super.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху