Главная » Java » Доступ к внешним объектам Java

0

Вы, вероятно, обратили внимание, что метод toString класса Action обращается к полю number внешнего класса BankAccount непосредственно. Вложенные классы обладают полными правами доступа ко всем членам внешнего класса – включая методы и поля private, – без необходимости дополнительных разъяснений, поскольку сами являются членами этого класса. Чтобы обратиться к члену внешнего класса, в коде внутреннего класса достаточно задать только Имя этого члена. Имена членов внешнего класса, как принято говорить, находятся в контексте этого класса. Внешний класс, в свою очередь, способен обращаться к приватным членам своего внутреннего класса, но только посредством явной ссылки на соответствующий объект внутреннего класса – такой как LastAct. Хотя объект внутреннего класса всегда ассоциирован с объектом Внешнего класса, обратное утверждение, строго говоря, не верно. Объект внешнего класса не обязательно должен обладать ссылками на объекты собственного внутреннего класса – таких ссылок, возможно, не будет вовсе или их может быть несколько.

Когда в теле метода deposit создается объект Action, в последнем автоматически cохраняется ссылка на текущий внешний объект класса BankAccount. Пользуясь этой неявной ссылкой, объект Action позже всегда может обратиться, скажем, к полю пате "родного" объекта BankAccount просто по имени, как показано в тексте метода toString. Полная ссылка на текущий объект внешнего класса выглядит как слово this, которому предшествуют строка имени класса и оператор точки. Так, например, метод toString вправе адресовать поле number объекта внешнего класса BankAccount, задавая выражение полной ссылки:

return BankAccount.this.number + ": " + act + " " + amount; Подобная конструкция позволяет еще раз подчеркнуть, что объекты внутреннего и внешнего классов тесно связаны в рамках реализации внешнего класса.

Вложенный класс способен содержать собственные вложенные классы и интерфейсы. Правила формирования ссылок на внешние объекты при любом уровне вложенности классов одинаковы: необходимо задать имя класса и ссылку this. Так, например, если в классе Х содержится класс У, в котором, в свою очередь, содержится класс Z, то код класса Z может явно обращаться к членам класса Х, пользуясь ссылкой

Х. this.

Допустимый уровень вложенности классов и интерфейсов формально не ограничен – подобные вопросы относятся, в большей мере, к сфере здравого смысла, хорошего вкуса и стиля программирования. Класс, такой как Z, дважды "упрятанный" в другие классы, имеет дело с тремя пространствами имен – собственным, а также пространствами имен непосредственного "начальника" У и "руководителя верхнего звена" Х. Читатель, разбирающий код класса Z, должен быть хорошо осведомлен о структуре всех трех классов, чтобы отчетливо понимать, какому контексту принадлежит каждый встреченный в тексте идентификатор и на какие объекты внешних классов указывают ссылки из объектов внутренних классов. Мы рекомендуем в большинстве ситуаций не применять классы более одного уровня вложенности. В противном случае проблемы, связанные с не возможностью восприятия и практического использования кода, не заставят себя ждать.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии