Объясните кто может, как происходит наследование вложенных non-static классов. На примере следующего кода:
public class Auto {
public class Door {
private double height;
public Door(double height) {
this.height = height;
}
}
}
public class LadaDoor extends Auto.Door {
public LadaDoor(Auto auto) {
auto.super(0);
}
}
Почему конструктор выглядит именно так. Почему вызов super() на объекте внешнего класса вызывает конструктор внутреннего??
Ответ
Экземпляр нестатического внутреннего класса всегда связан с экземпляром внешнего. В вашем случе Door не может существовать без какого-то конкретного экземпляра Auto
Поэтому при создании экземпляра класса дочернего по-отношению к внутреннему необходимо связать его с объектом, который будет им владеть.
Выражение auto.super(0) обозначает вызов конструктора родительского класса (Auto.Door) в контексте экземпляра auto
В терминологии языка Java это называется Qualified Superclass Constructor Invocation (конкретизированный вызов родительского класса).
Qualified superclass constructor invocations begin with a Primary expression or an ExpressionName. They allow a subclass constructor to explicitly specify the newly created object's immediately enclosing instance with respect to the direct superclass (§8.1.3). This may be necessary when the superclass is an inner class.
Адаптированный перевод:
Конкретизированный вызов конструктора родительского класса начинается с выражения. Оно позволяет конструктору дочернего класса явно указать экземпляр, который будет содержать в себе создаваемый объект. Это может быть необходимо, когда родительский класс является внутренним.
Комментариев нет:
Отправить комментарий