Статические вложенные классы 1 точно так же, как внешние классы, за исключением того, что они имеют доступ ко всем членам внешнего класса, независимо от квалификатора доступа. Они существуют отдельно от любого экземпляра внешнего класса, поэтому необходима ссылка на экземпляр для доступа к любым переменным экземпляра или нестатическим методам внешнего класса.
Нестатические вложенные классы (называемые внутренними классами ) возникают только в контексте экземпляра внешнего класса. После создания у них автоматически создается второе поле this
, к которому вы можете получить доступ из внутреннего класса, используя синтаксис Outer.this
. Каждый экземпляр внутреннего класса заключен в один экземпляр внешнего класса. Опять же, все привилегии доступа статических вложенных классов применяются к внутренним классам. Но так как у них уже есть доступный экземпляр внешнего класса, они могут автоматически обращаться к переменным экземпляра и методам внешнего класса.
Для хорошего (и очень подробного) обсуждения внутренних классов и спецификаторов доступа вы можете прочитать Внутреннюю спецификацию класса . Среди прочего, он описывает, как вложенный класс получает доступ к private
членам своего внешнего класса (классов). Более мягкое прочтение - учебник Вложенные классы .
Не по теме: предположим, у вас есть структура этого класса:
public class O {
public O() { ... }
public class I { // an inner class
public I() { ... }
...
}
...
}
и вы создали экземпляр O
:
O outer = new O();
Теперь предположим, что вы хотите создать экземпляр O.I
. вы не можете просто использовать new O.I()
, потому что новый экземпляр I
должен быть заключен в конкретный экземпляр O
. Для этого Java предоставляет следующий синтаксис:
O.I inner = outer.new O.I();
Тогда inner
будет иметь второе поле this
, установленное на outer
.
Обратите внимание, что этот синтаксис "квалифицированного new
оператора" используется только для внутренних классов; было бы ненужным (фактически, ошибкой), если бы I
был static
вложенным классом.
1 Вам часто встречается фраза "статический внутренний класс" (в том числе, смущающе, в более ранней версии этого ответа). Это неверная терминология. В Java «внутренние классы» - это, в частности, не static
вложенные классы.