Что такое подкласс (subclass) в Java и как он связан с наследованием?

Ответ

Подкласс (subclass, дочерний класс) в Java — это класс, который наследует поля и методы другого класса, называемого суперклассом (superclass, родительским классом). Наследование реализуется с помощью ключевого слова extends.

Основная идея: Создание иерархии классов «является» (is-a), где подкласс является специализированной версией суперкласса.

Пример:

// Суперкласс (родительский)
class Vehicle {
    protected String brand;

    public void start() {
        System.out.println("Vehicle starting...");
    }
}

// Подкласс (дочерний) наследует Vehicle
class Car extends Vehicle {
    private int numDoors;

    // Дополнительное поведение
    public void honk() {
        System.out.println("Beep beep!");
    }

    // Переопределение метода суперкласса
    @Override
    public void start() {
        System.out.println("Car engine starting with key...");
        super.start(); // Можно вызвать реализацию родителя
    }
}

// Использование
Car myCar = new Car();
myCar.brand = "Toyota"; // Поле унаследовано от Vehicle
myCar.start();          // Вызов переопределенного метода -> "Car engine starting..."
myCar.honk();           // Вызов собственного метода подкласса

Ключевые особенности наследования в Java:

  • Одиночное наследование: Класс может наследовать только от одного суперкласса.
  • Модификаторы доступа: Подкласс имеет доступ к public и protected членам суперкласса, но не к private.
  • Полиморфизм: Объект подкласса может быть использован везде, где ожидается объект суперкласса.
  • Конструкторы не наследуются, но могут вызываться через super().

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

Ответ 18+ 🔞

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

Вот смотри, есть у тебя какой-нибудь общий класс, ну, скажем, Vehicle (транспорт). Он как дед, который знает основы: у него есть бренд и он умеет заводиться. Всё, больше него нихуя не волнует.

class Vehicle {
    protected String brand; // protected — чтоб детишки могли поковыряться

    public void start() {
        System.out.println("Vehicle starting...");
    }
}

А теперь появляется его отбитый сынок Car. Он говорит: «Папа, я тоже транспорт, но я конкретно тачка». И чтобы это доказать, он наследуется через extends. То есть он получает ВСЁ, что было у папаши public или protected (приватное — нет, это личные трусы отца, туда лезть нельзя).

class Car extends Vehicle { // Всё, Герасим, ты теперь наследник. Му-му.
    private int numDoors; // А это уже его личная приблуда

    // Может добавить своё
    public void honk() {
        System.out.println("Beep beep!");
    }

    // А может и переплюнуть отцовский метод! Это называется переопределение (Override).
    @Override
    public void start() {
        System.out.println("Car engine starting with key...");
        super.start(); // Но если хочет, может и папин старый способ позвать. Уважение, блядь.
    }
}

И вот что получается в итоге:

Car myCar = new Car();
myCar.brand = "Toyota"; // Это поле он спиздил у Vehicle. Легально!
myCar.start();          // Вызовет СВОЙ переопределённый метод -> "Car engine starting..."
myCar.honk();           // А это его личная дудка, которую Vehicle в жизни не имел.

Важные нюансы, чтоб не обосраться:

  1. Один папаша. В Java нельзя быть мудаком-распиздяем и наследоваться от десяти отцов. Только один суперкласс. Многожёнство не прокатит.
  2. Доступ как в семье. К public — все, как на параде. К protected — только свои (папа и дети). К private — ваще никому, кроме самого класса. Это его личный дневник, ёпта.
  3. Полиморфизм — это магия. Объект Car ты можешь запихнуть туда, где ждут просто Vehicle. Потому что машина является транспортом (is-a relationship). Это как сказать «Вон идёт человек», а это на самом деле хитрая жопа Колян с бутылкой.
  4. Конструкторы. Их не наследуют, как фамильные драгоценности. Их нужно вызывать явно через super(), если очень надо.

Зачем весь этот цирк? А чтобы не изобретать велосипед каждый раз, блядь! Наследование — это краеугольный камень повторного использования кода. Создал один общий класс, а от него уже плодишь специализированных уродцев: Truck, Motorcycle, Boat. И все они — Vehicle. Красота, ёперный театр!

Вот и вся философия. Либо наследуйся и будь добр, соблюдай правила семьи, либо иди нахуй и пиши свой класс с нуля.