undefined

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

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

Комментарии (60)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Darth Nihilus 26 уровень, Казань
11 мая 2021
В примерах табы бы пошире, особенно на теме внутренних классов ощущается
Дмитрий Яковенко 34 уровень, Москва
1 мая 2021
Кстати, если ты попробуешь создать конструктор вообще без параметров, то программа просто не скомпилируется. Немного странно и непривычно, да? На самом деле нет, можно сделать конструктор без параметров и всё будет работать. Тут суть вот в чём. Когда мы создаём класс LamborghiniDoor - нам необходимо инициализировать поля предка Door, для этого вызывается его конструктор через super(); Но наш предок Door вложен в Car, при этом он не статичный (inner), а значит для создания Door - нужна ссылка на внешний объект Car. И тут 2 варианта. Либо этот Car нам передадут в параметре конструктора LamborghiniDoor, либо мы его создадим сами.

LamborghiniDoor() {
    new Car().super();
}

LamborghiniDoor(Car car)    {
    car.super();
}
Итого, если нам нужно создать предка Door в каком-то уникальном контексте - передаём ему этот уникальный контекст Car в параметре конструктора. Если нам пофиг на контекст и нам нужна просто Door - можем создать Car в конструкторе LamborghiniDoor. И да, тут в обоих случая вызывается конструктор Door, просто класса Door не существует, правильно он называется Car.Door, ведь он вложенный. Поэтому ссылка на его конструктор так или иначе включает Car:

    new Car().super();
    car.super();
Алексей 25 уровень, Night city
14 апреля 2021
Обратите внимание на картинку, в Северной Корее тоже Ким !
Andrei Po 32 уровень
29 декабря 2020
- Выражение car.super() обозначает - вызов конструктора родительского класса (Car.Door) в контексте экземпляра car. (стало яснее после прочтения ссылки на материал в комментарии ниже за 27 сентября 2018).
Pig Man 41 уровень
3 декабря 2020
Какого..? Я этого никогда не замечал раньше: Надпись на "смешной" картинке в начале: -Так называемая атомная бомба Северной Кореи Сразу после этого урок начинается с: — Привет, Амиго! — Привет, Ким Ну привет, Ким.. Этот урок у нас кто ведет-то?
Дмитрий 28 уровень, Тула
10 ноября 2020
Как создают машину нормальные люди: Как создаю я: Кар кар;
wan-derer.ru 40 уровень, Москва
1 октября 2020
Странная фигня :) Ведь класс - это объект, да? Значит вложенный/внутренний класс - это объект внутри класса. И можно было бы от него ожидать той же логики что и от остальных объектов: что они будут наследоваться так же как другие объекты. Но этого не происходит, а вместо этого вот этот гимор... Нелогично как-то.
30 июля 2020
Шел 4 уровень курса "Многопоточность"... ещё не было ниодной лекции по потокам
Хорс 41 уровень, Харьков
24 марта 2020
Может быть кому-то прояснит: Объект класса LamborginiDoor не может существовать сам по себе (он же унаследован от внутреннего класса). Он должен быть "прицеплен" к какому-то экземпляру класса Auto. Такая форма записи позволяет сообщить какой именно объект типа Auto будет "владельцем" объекта типа LamborginiDoor. //источник
Никита Бужинский 25 уровень, Калининград
5 марта 2020
Lamborghini пишется с "H"