Menu
Coddy logo textTech

Ключевое слово 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 ссылается на часть этого объекта, относящуюся к родительскому классу. Это различие становится критически важным при построении иерархий классов, где дочерним классам необходимо расширять, а не полностью заменять поведение родителя.

challenge icon

Задание

Легко

Давайте создадим систему бытовой техники, которая демонстрирует, как дочерние классы могут использовать 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() для стиральной машины
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование