Внутренние и вложенные классы java. Часть 1.
Метки java, вложенные, внутренние, классы
"Внутренние и вложенные классы java." (Черновик. Поверьте написать, оформить, протестировать код сделать выводы ... да и вообще решиться написать что-то не так просто.) Автор: Вячеслав Мищенко 02.03.2017 - 2019 год Часть 1. Начало. Цель статьи: Рассказать о внутренних, вложенных, локальных, анонимных классах. Показать примеры их использования. Написать и протестировать классы в коде на java. Рассказать о свойствах этих классов. Начнем с того, что же такое внутренние и вложенные классы. Посмотрим терминологию, встречающуюся в документации. Из https://ru.wikipedia.org/ : Цитата:
"В Java существуют 4 типа вложенных (nested) классов:
1. Статические вложенные классы 2. Внутренние классы 3. Локальные классы 4. Анонимные (безымянные) классы" Цитата:
"Существуют четыре категории вложенных классов:
статический класс-член (static member class), не статический класс-член (nonstatic member class), анонимный класс (anonymous class) и локальный класс (local class)." Начнем немного отдаленно, так как всё это имеет непосредственное отношение к нашим вопросам. Вспомним объектно-ориентированное программирование. Отношения композиции и наследования. В своей книге "Java 2 Руководство разработчика" Майкл Морган очень хорошо и подробно описывает взаимосвязи классов и объектов. Мы рассмотрим некоторые из них. Взаимосвязь "это - есть - то" выражается наследованием, а взаимосвязь "имеет часть" описывается композицией. В наших примерах мы в основном рассматриваем композицию. Так как вложенные классы - это и есть часть чего-то. То есть у нас есть класс оболочка и вложенный класс определенный внутри класса оболочки. Пример композиции: машина имеет двигатель, двери, 4 колеса, корпус. И мы можем описать машину с помощью внутренних (Inner)классов. Пример такого использования вы можете найти в книге Брюса Эккеля "Философия Java" Кликните здесь для просмотра всего текста
Есть некоторое предупреждение автора по использованию кода в таком виде: Цитата:
" Так как композиция объекта является частью проведенного анализа задачи (а не
просто частью реализации класса), объявление членов класса открытыми, помогает программисту-клиенту понять, как использовать класс, и упрощает создателю написание кода. Однако нужно помнить, что описанный случай является особым, и в основном поля класса нужно объявлять как private." Определение вложенных классов: Класс называется вложенным (nested), если он определен внутри другого класса. То есть класс просто определен внутри другого, даже не важно статически определен или не статически. Вложенный класс создается для того, чтобы обслуживать окружающий его класс. Если вложенный класс оказывается полезен в каком-либо ином контексте, он должен стать классом верхнего уровня. Применение Вложенные классы применяются в тех случаях, когда нужно написать небольшой вспомогательный код для другого класса. Вложенный класс создают также, чтобы скрыть его переменные и методы от внешнего мира. Таким образом, вложенный класс еще один элегантный способ ограничения области видимости. Внутренние классы также есть смысл использовать, если предполагается, что они будут использовать элементы родителя, чтобы не передавать лишнего в конструкторах. Пример вложенного класса вы можете увидеть в документации Оракле: Кликните здесь для просмотра всего текста
У нас нет, пока что, никакого контекста использования данной конструкции. С таким же успехом вложенный класс мы можем назвать вместо: "Вложенный класс" (NestedClass) - "Внутренний класс" InnerClass. Далее будем разбираться, в чем же отличия, и в каких контекстах используются классы. Брюс Эккель пишет в книге "Философия Java" так: Цитата:
"Класс называется вложенным (nested), если он определен внутри другого класса"
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html Терминология: Существует четыре категории вложенных классов: 1. Статические вложенные классы и не статические вложенные классы. Вложенные классы, объявленные статически, называются вложенными статическими классами. 2. Внутренние классы - когда объект внутреннего класса связан с объектом обрамляющего класса. Не статические вложенные классы называются внутренними классами, если они связанны с внешним классом. 3. Локальные классы - объявленные внутри блока кода и не являющиеся членом обрамляющего класса. В этом случае можно рассматривать класс как локальную переменную типа класс. 4. Анонимные классы – наследуемые, от какого либо класса, классы в которых при объявлении не задано имя класса. Причины использования вложенных классов (Nesred Classes) Зачем использовать вложенные классы? Причины использования вложенных классов такие: Если класс полезен только для одного другого класса, то вполне логично встроить его в этот класс и хранить их вместе. Использование вложенных классов увеличивает инкапсуляцию. Рассмотрим два класса верхнего уровня, A и B, где B нужен доступ к членам, которые иначе были бы объявлены закрытыми. Кликните здесь для просмотра всего текста
Скрывая класс «B» в пределах класса «А», члены класса «А» могут быть объявлены закрытыми, и «B» может получить доступ к ним. Кроме того, сам «B» может быть скрыт от внешнего мира. Продемонстрируем это в коде: Кликните здесь для просмотра всего текста
Использование вложенных классов приводит к более читабельному и поддерживаемому коду: Размещение класса ближе к тому месту, где он будет использован, делает код более читабельным. Статические Вложенные Классы Static Nested Classes Причины использования статических вложенных классов такие. Для случая, когда связь между объектом вложенного класса и объектом внешнего класса не нужна, можно сделать вложенный класс статическим(static). Так как внутренний класс связан с экземпляром, он не может определить в себе любые статические члены. Статические вложенные классы не имеют ограничений по объявлению своих данных и полей как static. /*Как с методами экземпляра и переменными, вложенный статический класс связан с экземпляром его внешнего класса и имеет прямой доступ к методам и полям экземпляра объекта этого класса. */ Из вложенного статического класса мы не имеем доступа к внешней не статической переменной внешнего класса. Приведенный ниже код демонстрирует это: Кликните здесь для просмотра всего текста
Вывод: Мы не имеем доступа к не статическому полю внешнего класса, через статический контекст вложенного класса. Но мы имеем доступ к приватным статическим полям внешнего класса из вложенного статичного класса. Приведенный ниже фрагмент кода демонстрирует это: Кликните здесь для просмотра всего текста
В этом примере кода мы создали экземпляр внутреннего класса с именем "nestedObj". То есть мы получаем доступ к приватной статической переменной внешнего класса, через экземпляр внутреннего класса. В контексте экземпляра связанного с внешним классом, у нас получился внутренний класс. |
Всего комментариев 0
Комментарии