super в Java
Используйте super внутри конструктора потомка, чтобы конструктор родителя выполнился первым. Держите Truck extends Car. В Truck() вызовите super();, затем напечатайте truck. В Car() напечатайте car. Скомпилируйте Yard.java и запустите java Yard. На экране должны быть car, затем truck. Вторая демонстрация передаёт метку через super("car") в Car(String mark). Переопределение метода оставьте для следующей страницы — этот урок про порядок конструкторов с super.
Сначала вызовите конструктор родителя
Страница наследования позволила пустому Truck использовать horn из Car. Эта страница добавляет конструкторы. Откройте Yard.java. Держите имя public-класса Yard. Удалите оставшиеся демо путей, файлы только с horn, если они путают конструкторы, писатели Store и любой клавиатурный Scanner. Программа не должна ждать ввода. Строка import не нужна.
Объявите родителя с конструктором без аргументов, который печатает car:
class Car {
Car() {
System.out.println("car");
}
}
Объявите потомка с extends Car. Внутри Truck() вызовите super(); первой инструкцией, затем напечатайте truck:
super();
System.out.println("truck");
Внутри Yard.main создайте один truck:
Truck t = new Truck();
Создание truck входит в Truck(). Этот вызов начинается с super(), который запускает Car(). После завершения родителя выполняется печать потомка.
class Car {
Car() {
System.out.println("car");
}
}
class Truck extends Car {
Truck() {
super();
System.out.println("truck");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
}
}
Из папки с Yard.java выполните javac Yard.java. Когда скобки и точки с запятой сходятся, javac не пишет свою строку. Затем запустите java Yard — не java Yard.java. Уберите суффикс .java из команды запуска. Держите один public-класс в файле, чтобы имя совпадало с Yard. Вспомогательные типы Car и Truck без public в этой начальной форме.
Экран показывает car, затем truck. Пройдите запуск один раз. Java стартует в Yard.main. new Truck() входит в Truck(). Первая инструкция — super();, поэтому выполняется Car() и печатается car. Управление возвращается в Truck(), который печатает truck. Строка родителя появляется раньше строки потомка, потому что super() выполнился первым.
Произнесите порядок вслух, глядя на экран: конструктор родителя, затем печать потомка. Этот произнесённый порядок совпадает с тем, что super() принуждает в конструкторе потомка. Если строки пришли в неверном порядке, снова откройте учебный файл и проверьте, что super(); всё ещё первая инструкция внутри Truck() до любого println.
Если вы напечатаете truck до super() в более позднем эксперименте, где конструктору родителя нужны аргументы, javac может отказать — super должен быть первой инструкцией, когда вы его пишете. В первой демонстрации родителю аргументы не нужны, и учебный файл намеренно держит super(); первым, чтобы порядок был ясен. Если видите только beep от старого демо horn, переключитесь на учебный файл конструкторов и снова запустите java Yard.
Не переписывайте horn на Truck на этой странице. Переопределение метода — следующий урок. Сегодня конструктор потомка говорит с родителем через super, затем печатает своё слово. Держите слово car на стороне родителя и слово truck на стороне потомка, чтобы каждая строка говорила, какой конструктор закончился.
Передайте значение родителю через super
Вторая программа сохраняет extends. Конструктор родителя теперь принимает String mark и печатает эту метку. Потомок вызывает super("car") и затем печатает truck.
class Car {
Car(String mark) {
System.out.println(mark);
}
}
class Truck extends Car {
Truck() {
super("car");
System.out.println("truck");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
}
}
Скомпилируйте через javac Yard.java, затем запустите java Yard. Экран снова показывает car, затем truck. На этот раз car — аргумент, который вы передали через super("car"), а не жёсткая печать внутри Car() без аргументов. Потомок выбрал строку метки; конструктор родителя её напечатал. После этого потомок напечатал truck.
Ещё раз прочитайте сигнатуру конструктора родителя: Car(String mark). Строка в кавычках внутри super("car") — это та mark. Больше ничего в файле для этой проверки не меняйте — держите extends Car, держите печать truck у потомка и держите new Truck() в main. Экран всё равно заканчивается truck под car, потому что печать потомка выполняется только после возврата из super("car").
Если вы опустите super("car"), пока у Car есть только Car(String mark), javac откажет, потому что у родителя больше нет тихого конструктора без аргументов, который можно вызвать за вас. Написание подходящего вызова super(...) — как потомок запускает родителя с нужными значениями. Держите super первой инструкцией в Truck(). Если javac жалуется на отсутствующий конструктор по умолчанию у Car, сначала посмотрите конструктор потомка и убедитесь, что строка super("car") есть и всё ещё первая.
Сравнение с простым extends на странице horn
На странице наследования пустой Truck вызвал horn без написания конструкторов. На этой странице конструкторы выполняются по порядку через super. Держите демо horn как историю, если они ещё рядом; запускайте учебный файл super через java Yard, чтобы экран показал car затем truck.
Страница horn доказала, что extends разделяет метод. Эта страница доказывает, что extends также разделяет путь построения: потомок запускает родителя через super, затем продолжает своей печатью. Оба урока держат Truck extends Car. Меняется только тело Truck — от пустых скобок с поздним вызовом horn к конструктору, который начинается с super.
super(), super("car") и порядок конструкторов — новые токены. Вам всё ещё нужен extends. Вам ещё не нужно переопределять метод. Если оставшийся вызов horn всё ещё сидит в main, уберите его для этих демо, чтобы экран показывал только печати конструкторов.
Что это оставляет для override
Эта страница запускает конструкторы родителя через super. Следующая страница показывает override, где потомок пишет свою версию метода, который уже есть у родителя. Оставайтесь здесь с вызовами super в конструкторе. Пока не заменяйте horn на Truck как требование этих демо.
Когда позже вы переопределите метод, вы всё ещё часто сначала вызовете конструктор родителя через super. Считайте эту страницу конструкторной половиной той истории. Доведите оба демо Yard до автоматического ощущения car затем truck, прежде чем открывать урок override.
Перед override
Вы можете вызвать super();, затем напечатать truck и увидеть car первым. Вы можете вызвать super("car"), когда родитель принимает mark, и всё равно увидеть car, затем truck. Скомпилируйте Yard.java и запустите java Yard для каждого сохранённого демо по очереди. Конструктор родителя закончился до печати потомка. Следующая страница — override, где потомок заменяет тело метода.
Держите демо без аргументов super() для ясного порядка. Держите демо super("car") для ясной передачи аргумента. Держите переопределение метода вне этой страницы. Эти три привычки — контрольная точка перед переходом дальше. Когда после new Truck() car появляется над truck, super сделал работу этого урока, и вы готовы к следующей теме про override.
Последний проход по папке: один public Yard, два вспомогательных типа, без ожидания клавиатуры, без остатков path, без принудительной переписи horn. Ещё раз выполните javac Yard.java и java Yard на демо, которое держите открытым. Если экран всё ещё печатает car затем truck, порядок конструкторов твёрдый, и курс может перейти к override на следующей странице.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху