Menu
Coddy logo textTech

Основы наследования (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. Это отношение позволяет создавать специализированные классы, которые разделяют общую функциональность, добавляя при этом свое собственное уникальное поведение.

challenge icon

Задание

Легко

Давайте создадим простую систему транспортных средств, которая демонстрирует наследование в действии. Вы создадите родительский класс, содержащий общие свойства транспортного средства, и дочерний класс, который расширяет его специализированным поведением.

Вы организуете свой код в трех файлах:

  • 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() без их повторного написания — в этом и заключается сила наследования!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String brand = scanner.nextLine();
        
        // TODO: Создайте объект Motorcycle с брендом
        
        // TODO: Вызовите унаследованный метод start()
        
        // TODO: Вызовите метод wheelie()
    }
}
quiz iconПроверьте себя

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

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