Ключевое слово super
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 21 из 87.
Ключевое слово super предоставляет подклассу способ обращения к своему родительскому классу. Это необходимо, когда вам нужно получить доступ к членам или конструкторам родительского класса из дочернего класса.
Наиболее распространенное использование super — это вызов конструктора родительского класса. Это должно быть первой инструкцией в конструкторе подкласса:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // Должно быть первой строкой
this.doors = doors;
}
}Вы также можете использовать super для вызова родительских методов, что особенно полезно, когда подкласс имеет метод с тем же именем:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Вызывает версию Animal
System.out.println("Meow!");
}
}Думайте о super как о противоположности this. В то время как this ссылается на текущий объект, super ссылается на часть этого объекта, относящуюся к родительскому классу. Это различие становится критически важным при построении иерархий классов, где дочерним классам необходимо расширять, а не полностью заменять поведение родителя.
Задание
ЛегкоДавайте создадим систему бытовой техники, которая демонстрирует, как дочерние классы могут использовать super для вызова конструкторов родительского класса и расширения поведения родительских методов.
Для организации кода вы создадите три файла:
Appliance.java: Создайте родительский класс, представляющий любой бытовой прибор. Он должен содержать:- Приватное поле для бренда прибора
brand(String) - Приватное поле для мощности
wattage(int) - Конструктор, который принимает оба значения и инициализирует их
- Метод
getBrand(), который возвращает бренд - Метод
getWattage(), который возвращает мощность - Метод
getInfo(), который возвращает:[brand] - [wattage]W
- Приватное поле для бренда прибора
WashingMachine.java: Создайте подкласс, который расширяет Appliance. У стиральной машины есть все то же самое, что и у обычного прибора, плюс свои особенности:- Приватное поле для
capacity(int), представляющее вместимость в кг - Конструктор, который принимает brand, wattage и capacity — используйте
super(brand, wattage)для инициализации родительской части, а затем установите capacity - Метод
getCapacity(), который возвращает вместимость - Метод
getInfo(), который вызывает родительскийgetInfo()с помощьюsuper.getInfo()и расширяет его, чтобы вернуть:[parent info], Capacity: [capacity]kg
- Приватное поле для
Main.java: Создайте объект WashingMachine и выведите полную информацию о нем. Вы получите три входных значения: brand (String), wattage (int) и capacity (int). Выведите результат вызоваgetInfo()для вашей стиральной машины.
Вы получите три входных значения: название бренда, мощность и вместимость.
Обратите внимание, как super служит здесь двум целям: вызову родительского конструктора для инициализации унаследованных полей и вызову родительского метода для дополнения его поведения, а не полной его замены.
Шпаргалка
Ключевое слово super ссылается на родительский класс из подкласса.
Используйте super() для вызова конструктора родительского класса. Это должно быть первой инструкцией в конструкторе подкласса:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // Должно быть первой строкой
this.doors = doors;
}
}Используйте super.methodName() для вызова методов родительского класса, что полезно, когда подкласс переопределяет метод:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Вызывает версию Animal
System.out.println("Meow!");
}
}super относится к части объекта, принадлежащей родительскому классу, в то время как this относится к текущему объекту.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Считать входные данные
String brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: Создать объект WashingMachine с входными значениями
// TODO: Вывести результат вызова getInfo() для стиральной машины
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»