Внутренний класс
В объектно-ориентированном программировании (ООП) внутренний класс или вложенный класс — это класс, полностью объявленный внутри тела другого класса или интерфейса. Он отличается от подкласса .
Обзор
[ редактировать ]Экземпляр обычного класса или класса верхнего уровня может существовать сам по себе. Напротив, экземпляр внутреннего класса не может быть создан без привязки к классу верхнего уровня.
Возьмем абстрактное понятие Car
с четырьмя Wheel
с. Наш Wheel
у нас есть особая особенность, которая зависит от того, являются ли они частью нашего Car
. Это понятие не отражает Wheel
это как Wheel
в более общей форме, которая может быть частью любого транспортного средства. Вместо этого он представляет их как специфичные для Car
. Мы можем смоделировать это понятие, используя внутренние классы следующим образом:
У нас есть класс высшего уровня Car
. Экземпляры класса Car
состоят из четырех экземпляров класса Wheel
. Эта конкретная реализация Wheel
специфичен для автомобиля, поэтому код не моделирует общее понятие колеса, которое лучше было бы представить как класс верхнего уровня. Следовательно, он семантически связан с классом Car
и код Wheel
каким-то образом связан со своим внешним классом, являясь составной частью автомобиля. Колесо конкретного автомобиля уникально для этого автомобиля, но в общем случае колесо является агрегатной единицей автомобиля.
Внутренние классы предоставляют механизм для точного моделирования этого соединения. Мы можем обратиться к нашему Wheel
класс как Car.Wheel
, Car
быть классом высшего уровня и Wheel
быть внутренним классом.
Таким образом, внутренние классы допускают объектную ориентацию определенных частей программы, которые в противном случае не были бы инкапсулированы в класс.
Более крупные сегменты кода внутри класса лучше моделировать или реорганизовать как отдельный класс верхнего уровня, а не как внутренний класс. Это сделало бы код более общим в применении и, следовательно, более пригодным для повторного использования, но потенциально могло бы стать преждевременным обобщением. Это может оказаться более эффективным, если в коде будет много внутренних классов с общей функциональностью.
Типы вложенных классов в Java
[ редактировать ]В Java существует четыре типа вложенных классов:
- Статический
- Статический класс-член, также называемый статическими вложенными классами. [1] - Они заявлены
static
. Как и другие вещи в статической области видимости (т. е. статические методы ), они не имеют включающего экземпляра и не могут получить доступ к переменным экземпляра и методам включающего класса. Они почти идентичны невложенным классам, за исключением деталей области действия (они могут ссылаться на статические переменные и методы включающего класса без уточнения имени; другие классы, которые не являются одним из включающих его классов, должны уточнять свое имя с помощью включающего его класса. имя). Вложенные интерфейсы неявно статичны.
- Нестатические/внутренние классы
Внутренний класс. Следующие категории называются внутренними классами . Каждый экземпляр этих классов имеет ссылку на включающий экземпляр (т. е. экземпляр включающего класса), за исключением локальных и анонимных классов, объявленных в статическом контексте. Следовательно, они могут неявно ссылаться на переменные экземпляра и методы включающего класса. Ссылку на включающий экземпляр можно получить явно через EnclosingClassName.this
. Внутренние классы не могут иметь статических переменных или методов, за исключением постоянных переменных времени компиляции. При создании они должны иметь ссылку на экземпляр включающего класса; это означает, что они должны быть либо созданы внутри метода экземпляра или конструктора включающего класса, либо (для членов и анонимных классов) созданы с использованием синтаксиса enclosingInstance.new InnerClass()
. [1]
- Класс-член. Они объявлены вне функции (следовательно, «член») и не объявлены «статическими».
- Локальный класс — это классы, объявленные в теле функции. На них можно ссылаться только в остальной части функции. Они могут использовать локальные переменные и параметры функции, но только те, которые объявлены «финальными». (Это связано с тем, что экземпляр локального класса должен поддерживать отдельную копию переменной, поскольку она может пережить функцию; чтобы не было путаницы двух модифицируемых переменных с одинаковым именем в одной области, переменная принудительно быть неизменяемым.) Может быть очень полезно для создания класса с полями общего типа, где переменные типа определены в методе.
- Анонимный класс . Это локальные классы, которые автоматически объявляются и создаются в середине выражения. Они могут напрямую расширять только один класс или реализовывать один интерфейс. Они могут указывать аргументы конструктору суперкласса, но не могут иначе иметь конструктор (однако это не является ограничением, поскольку он может иметь блок инициализатора экземпляра для выполнения любой инициализации).
Языки программирования
[ редактировать ]- Внутренние классы стали особенностью языка программирования Java, начиная с версии 1.1.
- Вложенные классы также являются особенностью языков программирования D , Visual Basic .NET , Ruby , C++ и C# .
- В Python можно вложить класс в другой класс, метод или функцию.
- В C++ есть вложенные классы, похожие на статические классы-члены Java, за исключением того, что они не объявлены со словом «static».
- В языке БЕТА появилось понятие вложенных классов.
Код графического интерфейса
[ редактировать ]Локальные внутренние классы часто используются в Java для определения обратных вызовов для кода графического интерфейса. Затем компоненты могут совместно использовать объект, который реализует интерфейс обработки событий или расширяет абстрактный класс адаптера, содержащий код, который будет выполняться при запуске данного события.
Также используются анонимные внутренние классы, где код обработки событий используется только одним компонентом и поэтому не нуждается в именованной ссылке.
Это позволяет избежать большого монолитного actionPerformed(ActionEvent)
метод с несколькими ветвями if-else для определения источника события. Этот тип кода часто считают беспорядочным. [ нужна ссылка ] и вариации внутреннего класса считаются лучшими во всех отношениях. [ нужна ссылка ]
Ссылки
[ редактировать ]- ^ Jump up to: а б (Oracle) Вложенные классы , Oracle.Com – Учебные пособия по Java.
Внешние ссылки
[ редактировать ]- « Внутренние классы. Так для чего вообще нужны внутренние классы?»
- Вложенные классы в D