JavaRush /Курсы /Java Multithreading /Наследование внутренних классов

Наследование внутренних классов

Java Multithreading
4 уровень , 3 лекция
Открыта
Наследование внутренних классов - 1

— Привет, Амиго!

— Привет, Ким.

— Я хочу рассказать тебе о наследовании внутренних и вложенных классов.

— Я готов.

— На самом деле с наследованием вложенных классов (те, которые со словом static) никаких проблем нет. Они наследуются так же как и обычные классы:

Пример
public class Car
{
 public static class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
}

— А мы можем наследовать вложенные классы от других вложенных классов?

— Почему бы и нет?

Пример
public class Car
{
 public static class Door
 {

 }
}

public class Lamborghini extends Car
{
 public static class LamborghiniDoor extends Car.Door
 {
 }
}

— Ок, понятно. Просто наследуем как обычные классы, да?

— Да. А вот внутренние классы наследуются не так просто.

При создании внутреннего класса в нем неявно хранится ссылка на объект его внешнего класса и передается она в него в конструкторе.

Поэтому в объект класса, который унаследовался от внутреннего класса, нужно передать нужный объект явно.

Вот как это выглядит:

Код
public class Car
{
 public class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
 LamborghiniDoor(Car car)
 {
  car.super();
 }
}

В конструктор класса Door нужно неявно передать объект класса Car, это делается с помощью специальной конструкции: «car.super()».

Кстати, если ты попробуешь создать конструктор вообще без параметров, то программа просто не скомпилируется. Немного странно и непривычно, да?

— Ага. Есть пара моментов, но в целом не «rocket science».

Комментарии (91)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Li Уровень 1
25 ноября 2025
Евгений Уровень 5
13 октября 2025
🚁
Андрей Уровень 51
9 августа 2024
Лекция - днище!
Vadym Уровень 34
19 декабря 2023
На что только люди не идут ради множественного наследования
Алексей Уровень 40 Expert
16 января 2024
Не думаю, что это так)Вот композиция, агрегация, использование анонимных классов(внутренних классов), это да)
19Kirill89 Уровень 42
8 августа 2023
зря шутите над северной кореей эт южные полупокеры, а вот северные отбитые на глухо)))
Даниил Уровень 35
18 июня 2025
Cеверная корея п****ы
13 февраля 2026
Северная Корея топ
Дед мороз! Уровень 39
4 августа 2023
Хороший переход от Кореи к Киму
partiec Уровень 33
2 июня 2023
До этого мы писали просто super(); А здесь класс-родитель зависит от объекта car. Вот мы его и "помечаем" словом car. car.super(); - конструктор родителя, зависимого от car.
Anonymous #2836589 Уровень 44
18 мая 2023
"При создании внутреннего класса в нем неявно хранится ссылка на объект его внешнего класса и передается она в него в конструкторе." - здесь нужно читать: "При создании ОБЪЕКТА внутреннего класса в нем неявно хранится ссылка на объект его внешнего класса и передается она в него в конструкторе." ?
very junior java developer Уровень 51
8 мая 2023
no comments...
Mykhailo_Trofimov Уровень 1
25 марта 2023
Порядок вызовов конструкторов при :

class Lamborghini extends Car.Door{
    public Lamborghini(Car car) {
        car.super();
        System.out.println("Invoke Lamborghini constructor");
    }

    public static void main(String[] args) {
        Lamborghini lamborghini = new Lamborghini(new Car());
    }
}
1) Invoke Car constructor - потому что обьект Door нельзя создать без обьекта Car; 2) Invoke Door constructor - потому что lamborghini в этом случае это Door; 3) Invoke Lamborghini constructor