
— Привет, Амиго!
— Привет, Ким.
— Я хочу рассказать тебе о наследовании внутренних и вложенных классов.
— Я готов.
— На самом деле с наследованием вложенных классов (те, которые со словом 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».
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ