Объясните кто может, как происходит наследование вложенных 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.
Адаптированный перевод:
Конкретизированный вызов конструктора родительского класса начинается с выражения. Оно позволяет конструктору дочернего класса явно указать экземпляр, который будет содержать в себе создаваемый объект. Это может быть необходимо, когда родительский класс является внутренним.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня есть такой запрос:
Вообщем проблема такая, есть TabLayout и ViewPager, всего вкладок у меня 5, на первых двух вкладках идет RecyclerView с данными, а на 3 избранные, по началу...