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».

Комментарии (89)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Евгений Уровень 37
13 октября 2025
🚁
Андрей Уровень 51
9 августа 2024
Лекция - днище!
Vadym Уровень 34
19 декабря 2023
На что только люди не идут ради множественного наследования
Алексей Уровень 40 Expert
16 января 2024
Не думаю, что это так)Вот композиция, агрегация, использование анонимных классов(внутренних классов), это да)
19Kirill89 Уровень 42
8 августа 2023
зря шутите над северной кореей эт южные полупокеры, а вот северные отбитые на глухо)))
Даниил Уровень 35
18 июня 2025
Cеверная корея п****ы
Дед мороз! Уровень 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 Уровень 42
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
Griboed Уровень 30
21 марта 2023
Для тех, кто всё же не понял. 1. В конструкторе (абсолютно любом конструкторе любого класса а Java) первой строчкой идет вызов конструктора суперкласса (класса родителя). 2. Если вы ничего такого не вызывается - компилятор эту строчку сам напишет и вызовет за вас конструктор по умолчанию (без параметров). 3. Поскольку в нашем примере с LamborghiniDoor суперклассом является класс Car.Door (написано ведь "extends Car.Door"), то первая строчка нашего конструктора LamborghiniDoor(Car car), написанная как "car.super();", вызывает как раз-таки, конструктор класса Car.Door. 4. Так а что такое car, и почему именно у него вызывается супер? car - это объект внешнего класса Car по отношению к нашему классу-предку Car.Door (напоминаю, мы сейчас говорим о конструкторе, класса-наследника LamborghiniDoor ). Данный объект car должен быть явно указан, чтобы можно было создать объект класса Car.Door (предка LamborghiniDoor). Поэтому, мы именно так и пишем первую строчку вызова конструктора класса Car.Door, поскольку именно данный конструктор мы обязаны первой строчкой вызывать.
hint1k Уровень 51
21 марта 2023
когда коменты полезнее и понятнее лекций 👍
Алексей Уровень 40 Expert
16 января 2024
Молюсь не тебя денно и ночно