Для чего используется ключевое слово `extends` в Java?

«Для чего используется ключевое слово `extends` в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово extends в Java используется для реализации наследования классов и ограничения типов в дженериках.

1. Наследование классов

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

// Суперкласс (родительский)
class Vehicle {
    protected String brand;
    public void honk() {
        System.out.println("Beep!");
    }
}

// Подкласс (дочерний) наследует Vehicle
class Car extends Vehicle {
    private int doors;
    public Car(String brand, int doors) {
        this.brand = brand; // Поле унаследовано
        this.doors = doors;
    }
    // Метод honk() также унаследован
}

// Использование
Car myCar = new Car("Toyota", 4);
myCar.honk(); // Вывод: Beep!

Почему это нужно? Наследование поддерживает принцип DRY (Don't Repeat Yourself), позволяет создавать иерархии и реализовывать полиморфизм.

2. Ограничение типов в дженериках (Upper Bounded Wildcard)

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

// Метод принимает список любых чисел (Number или его подклассы: Integer, Double)
public double sumOfList(List<? extends Number> list) {
    double sum = 0.0;
    for (Number num : list) {
        sum += num.doubleValue();
    }
    return sum;
}
// Можно вызвать с List<Integer> или List<Double>

Почему это важно? Обеспечивает безопасность типов на этапе компиляции, позволяя писать гибкий, но типобезопасный код.