Статические вложенные классы 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
вложенные классы.
person
Ted Hopp
schedule
31.01.2011