Spec-Zone .ru
спецификации, руководства, описания, API
|
Язык программирования Java позволяет Вам определять class в пределах другого class. Такой class вызывают вложенным class и иллюстрируется здесь:
class OuterClass { ... class NestedClass { ... } }
static
просто вызываются статическими вложенными классами. Нестатические вложенные классы вызывают внутренними классами. class OuterClass { ... static class StaticNestedClass { ... } class InnerClass { ... } }
Вложенный class является элементом своего включения class. У нестатических вложенных классов (внутренние классы) есть доступ к другим элементам включения class, даже если они объявляются частные. У статических вложенных классов нет доступа к другим элементам включения class. Как элемент OuterClass
, вложенный class может быть объявлен private
, public
, protected
, или частный пакет. (Вспомните, что внешние классы могут только быть объявлены public
или частный пакет.)
Есть несколько неопровержимых доводов использования вложенных классов среди них:
Логическая группировка классов — Если class полезен только для одного другого class, то логично встроить это в то, что class и держит два вместе. Вложение такие "классы помощника" делает их пакет более оптимизированным.
Увеличенная инкапсуляция — Рассматривает два высокоуровневых класса, A и B, где B нуждается в доступе к элементам, который был бы иначе объявлен private
. Скрывая class B в пределах class A, элементы А могут быть объявлены частные, и B может получить доступ к ним. Кроме того, сам B может быть скрыт от внешнего мира.
Больше читаемого, удобного в сопровождении кода — Вложение, маленькие классы в пределах высокоуровневых классов помещают код ближе туда, где это используется.
Как с методами class и переменными, статический вложенный class связывается с его внешним class. И как статические методы class, статический вложенный class не может обратиться непосредственно к переменным экземпляра или методам, определенным в его включении class — это может использовать их только через ссылку на объект.
К статическим вложенным классам получают доступ, используя включение имя class:
OuterClass.StaticNestedClass
Например, чтобы создать объект для статического вложенного class, используйте этот синтаксис:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Как с методами экземпляра и переменными, внутренний class связывается с экземпляром его включения class и имеет прямой доступ к методам того объекта и полям. Кроме того, потому что внутренний class связывается с экземпляром, он не может определить статические элементы самостоятельно.
Объекты, которые являются экземплярами внутреннего class, существуют в пределах экземпляра внешнего class. Рассмотрите следующие классы:
class OuterClass { ... class InnerClass { ... } }
Экземпляр InnerClass
может существовать только в пределах экземпляра OuterClass
и имеет прямой доступ к методам и полям его экземпляра включения. Следующее число иллюстрирует эту идею.
Экземпляр InnerClass Существует В пределах Экземпляра OuterClass
Чтобы инстанцировать внутреннего class, следует сначала инстанцировать внешнего class. Затем, создайте внутренний объект в пределах внешнего объекта с этим синтаксисом:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Дополнительно, есть два специальных вида внутренних классов: локальные классы и анонимные классы (также названный анонимными внутренними классами). Оба из них будут обсуждены кратко в следующем разделе.