Учебное пособие: Интерфейсы, обратные вызовы, внутренние классы

Nested nest = new Nested(); // Последовательно раскрываются

// три матрешки

Nested.A theA = nest.new A(); // Полное имя класса и уточненная

// операция new. Но конструктор только вложенного класса

Nested.A.AB theAB = theA.new AB(); // Те же правила. Операция

// new уточняется только одним именем

Nested.В theB = nest.new B(); // Еще одна матрешка

Nested.В.ВС theBC = theB.new BC();

theB.f(999); // Методы вызываются обычным образом

nest.m();

}

}

Дадим пояснения.

· Как видите, доступ к полям внешнего класса Nested возможен отовсюду, даже к закрытому полю pr. Именно для этого в Java и введены вложенные классы. Остальные конструкции введены вынужденно, для того чтобы увязать концы с концами.

· Язык Java позволяет использовать одни и те же имена в разных областях видимости — пришлось уточнять константу this именем класса: Nested.this, В.this.

· В безымянном классе не может быть конструктора, ведь имя конструктора должно совпадать с именем класса, — пришлось использовать имя суперкласса, в примере это класс object. Вместо конструктора в безымянном классе используется блок инициализации экземпляра.

· Нельзя создать экземпляр вложенного класса, не создав предварительно экземпляр внешнего класса, — пришлось подстраховать это правило уточнением операции new именем экземпляра внешнего класса— nest.new, theA.new, theB.new.

· При определении экземпляра указывается полное имя вложенного класса, но в операции new записывается просто конструктор класса.

Введение вложенных классов сильно усложнило синтаксис и поставило много задач разработчикам языка.

Можно ли наследовать вложенные классы? Можно.

· Как из подкласса обратиться к методу суперкласса? Константа super уточняется именем соответствующего суперкласса, подобно константе this.

· А могут ли вложенные классы быть расширениями других классов? Могут.

Механизм вложенных классов станет понятнее, если посмотреть, какие файлы с байт-кодами создал компилятор:

· Nested$l$D.class — локальный класс о, вложенный в класс Nested;

· NestedSl.class — безымянный класс;

· Nested$A$AB.class — классNested.A.AB;

· Nested$A.class — классNested.А;

· Nested$B$BC.class — классNested.B.BC;

· NestedSB.class — классNested.B;

К-во Просмотров: 498
Бесплатно скачать Учебное пособие: Интерфейсы, обратные вызовы, внутренние классы