Вложенные и внутренние классы Java

Вложенные и внутренние классы JavaВ языке Java определены вложенные классы. Вложенным называется такой класс, который объявляется в другом классе.

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

Вложенный класс не может существовать независимо от класса, в который он вло­жен. Следовательно, область действия вложенного класса ограничена его внешним классом. Если вложенный класс объявлен в пределах области действия внешнего класса, то он становится членом последнего. Имеется также возможность объявить вложенный класс, который станет локальным в пределах блока.

Существуют два типа вложенных классов. Одни вложенные классы объявляются с помощью модификатора доступа static, а другие — без него. Классы такого типа называются внутренними. Внутренний класс имеет доступ ко всем переменным и мето­дам внешнего класса, в который он вложен, и может обращаться к ним непосредствен­но, как и все остальные нестатические члены внешнего класса.

Иногда внутренний класс используется для предоставления ряда услуг внешнему клас­су, в котором он содержится. Ниже приведен пример применения внутреннего класса для вычисления различных значений, которые используются включающим его классом.

Результат выполнения данной программы выглядит следующим образом.

В данном примере внутренний класс Inner обрабатывает массив nums, являющий­ся членом класса Outer.

Вложенный класс имеет доступ к членам объемлющего клас­са, и поэтому он может непосредственно обращаться к массиву nums. А вот обратное несправедливо. Так, например, метод Analyze() не может непосредственно вызвать метод min() , не создав объект типа Inner.

Класс можно вложить в области действия блока. В итоге полу­чается локальный класс, недоступный за пределами блока. В следующем примере про­граммы мы преобразуем класс ShowBits, таким образом, чтобы он стал локальным.

Выполнение этой программы дает следующий результат.

В данном примере класс ShowBits недоступен за пределами метода main(), а следо­вательно, попытка получить доступ к нему из любого метода, кроме main(), приведет к ошибке.

И последнее замечание: внутренний класс может быть безымянным. Экземпляр безымянного, или анонимного, внутреннего класса создается при объявлении класса с по­мощью оператора new.

Чем же статический вложенный класс отличается от нестатического в языке программирования Java?

Статический вложенный класс объявляется с помощью модификатора static. Являясь статическим, он может непосредственно обращаться к любому статическому члену своего внешнего класса. Другие члены внешнего класса до­ступны ему посредством ссылки на объект.

Интересное видео для наших постоянных читателей: