Как root, root.next и т. Д. Связаны с одним и тем же экземпляром Outer
?
Раздел Спецификация языка Java по определению включающих экземпляров во время состояний создания экземпляра класса:
Пусть C
будет классом, являющимсясоздание экземпляра, и пусть i
будет создаваемым экземпляром . Если C
является внутренним классом, то i
может иметь непосредственно включающий экземпляр (§8.1.3), определяемый следующим образом:
- [...]
- Если
C
является внутренним классом-членом , то: - Если выражение создания экземпляра класса равно unqualified , тогда:
- Если выражение создания экземпляра класса происходит в статическом контексте, то возникает ошибка времени компиляции.
В противном случае, если C
является членом класса, охватывающего класс, в которомВыражение создания экземпляра класса появляется , тогда пусть O
будет непосредственно включающим класс, членом которого является C
. Пусть n
будет целым числом таким, чтобы O
было n-ным объявлением лексического типа для класса, в котором появляется выражение создания экземпляра класса.
Непосредственно включающий экземпляр i
является n-м лексически включающим экземпляром this
.
- В противном случае возникает ошибка времени компиляции.
Другими словами, когда вы выполняете
next = (Math.random() > 0.5)? new Inner(): null;
Inner
это классбыть воплощенным в жизнь;Inner
является членом класса, включающего в себя класс (Inner
, т. Е. Сам), где появляется new Inner()
;Outer
- это сразу включающий класс Inner
;поскольку Inner
является внутренним классом Outer
, должен быть this
, и что this
гарантированно будет иметь Outer
включающий экземпляр;и, наконец, этот включающий экземпляр становится включающим экземпляром i
, при этом создается новый Inner
экземпляр.
Короче говоря, он повторно использует тот же экземпляр Outer
.
Добавляет ли компилятор параметр в конструктор Inner
?
В разделе Спецификация языка Java по формальным параметрам конструкторов говорится:
Конструктор не закрытого внутреннего класса-члена неявно объявляет в качестве первого формального параметра переменную, представляющую непосредственно включающий экземпляр класса (§15.9.2, §15.9.3).
Итак, да.