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

Шпаргалка

Используйте ключевое слово 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 myDog = new Dog("Buddy");
myDog.eat();   // Унаследованный метод
myDog.bark();  // Собственный метод

Используйте super() в конструкторе подкласса для вызова конструктора родительского класса.

Наследование представляет собой отношение «является» (is-a) между классами.

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

import java.util.Scanner;

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

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

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