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

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

Открыта
Наследование внутренних классов - 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 Backend Developer
25 ноября 2025, 19:44
✅
🚁
Андрей
Уровень 2
9 августа 2024, 10:15
Лекция - днище!
Vadym
Уровень 34
19 декабря 2023, 04:12
На что только люди не идут ради множественного наследования
Алексей
Уровень 40
Expert
16 января 2024, 15:41
Не думаю, что это так)Вот композиция, агрегация, использование анонимных классов(внутренних классов), это да)
19Kirill89
Уровень 42
8 августа 2023, 06:39
зря шутите над северной кореей эт южные полупокеры, а вот северные отбитые на глухо)))
Даниил
Уровень 35
18 июня 2025, 10:36
Cеверная корея п****ы
13 февраля, 14:24
Северная Корея топ
Дед мороз!
Уровень 39
4 августа 2023, 17:50
Хороший переход от Кореи к Киму
partiec
Уровень 33
2 июня 2023, 13:57
До этого мы писали просто super(); А здесь класс-родитель зависит от объекта car. Вот мы его и "помечаем" словом car. car.super(); - конструктор родителя, зависимого от car.
Anonymous #2836589
Уровень 44
18 мая 2023, 03:56
"При создании внутреннего класса в нем неявно хранится ссылка на объект его внешнего класса и передается она в него в конструкторе." - здесь нужно читать: "При создании ОБЪЕКТА внутреннего класса в нем неявно хранится ссылка на объект его внешнего класса и передается она в него в конструкторе." ?
8 мая 2023, 14:08
no comments...
Mykhailo_TrofimovBackend Developer в EY
25 марта 2023, 17:00
Порядок вызовов конструкторов при :
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