Внутренний класс

В объектно-ориентированном программировании (ООП) внутренний класс или вложенный класс — это класс, объявленный полностью внутри тела другого класса или интерфейса. Он отличается от подкласса .

Обзор

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

Давайте возьмем абстрактное понятие a Carс четырьмя Wheels. Наши Wheels имеют определенную особенность, которая основана на том, что они являются частью нашего Car. Это понятие не представляет Wheels как Wheels в более общей форме, которая могла бы быть частью любого транспортного средства. Вместо этого оно представляет их как специфичные для a Car. Мы можем смоделировать это понятие с помощью внутренних классов следующим образом:

У нас есть класс верхнего уровня Car. Экземпляры класса Carсостоят из четырех экземпляров класса Wheel. Эта конкретная реализация Wheelспецифична для автомобиля, поэтому код не моделирует общее понятие колеса, которое было бы лучше представить как класс верхнего уровня. Поэтому он семантически связан с классом Car, а код Wheelнекоторым образом связан с его внешним классом, являясь единицей композиции автомобиля. Колесо для конкретного автомобиля уникально для этого автомобиля, но для обобщения колесо является единицей агрегации для автомобиля.

Внутренние классы предоставляют механизм для точного моделирования этой связи. Мы можем ссылаться на наш Wheelкласс как на Car.Wheel, Carбудучи классом верхнего уровня и Wheelбудучи внутренним классом.

Таким образом, внутренние классы обеспечивают объектную ориентацию определенных частей программы, которые в противном случае не были бы инкапсулированы в класс.

Более крупные сегменты кода внутри класса могут быть лучше смоделированы или рефакторированы как отдельный класс верхнего уровня, а не как внутренний класс. Это сделало бы код более общим в своем применении и, следовательно, более пригодным для повторного использования, но потенциально может быть преждевременным обобщением. Это может оказаться более эффективным, если код имеет много внутренних классов с общей функциональностью.

Типы вложенных классов в Java

В Java существует четыре типа вложенных классов:

Статичный
  • Статический класс-член, также называемый статическими вложенными классами [1]  – Они объявлены static. Как и другие вещи в статической области действия (т. е. статические методы ), они не имеют охватывающего экземпляра и не могут получить доступ к переменным экземпляра и методам охватывающего класса. Они почти идентичны невложенным классам, за исключением деталей области действия (они могут ссылаться на статические переменные и методы охватывающего класса без указания имени; другие классы, которые не являются одним из его охватывающих классов, должны указывать свое имя именем своего охватывающего класса). Вложенные интерфейсы неявно являются статическими.
Нестатические/внутренние классы

Внутренний класс – Следующие категории называются внутренними классами . Каждый экземпляр этих классов имеет ссылку на включающий экземпляр (т. е. экземпляр включающего класса), за исключением локальных и анонимных классов, объявленных в статическом контексте. Следовательно, они могут неявно ссылаться на переменные экземпляра и методы включающего класса. Ссылку на включающий экземпляр можно получить явно через EnclosingClassName.this. Внутренние классы не могут иметь статических переменных или методов, за исключением постоянных переменных времени компиляции. Когда они создаются, они должны иметь ссылку на экземпляр включающего класса; это означает, что они должны быть либо созданы внутри метода экземпляра или конструктора включающего класса, либо (для классов-членов и анонимных классов) созданы с использованием синтаксиса enclosingInstance.new InnerClass(). [1]

  • Класс-член – они объявляются вне функции (отсюда «член») и не объявляются «статическими».
  • Локальный класс – это классы, объявленные в теле функции. На них можно ссылаться только в остальной части функции. Они могут использовать локальные переменные и параметры функции, но только те, которые объявлены как «final». (Это связано с тем, что экземпляр локального класса должен поддерживать отдельную копию переменной, поскольку она может пережить функцию; чтобы не было путаницы с двумя модифицируемыми переменными с одинаковым именем в одной области действия, переменная принудительно становится неизменяемой.) Может быть очень полезно для создания класса с полями универсального типа, где переменные типа определяются в методе.
  • Анонимный класс  – это локальные классы, которые автоматически объявляются и создаются в середине выражения. Они могут напрямую расширять только один класс или реализовывать один интерфейс. Они могут указывать аргументы для конструктора суперкласса, но не могут иметь конструктор (однако это не ограничение, поскольку он может иметь блок инициализатора экземпляра для выполнения любой инициализации).

Языки программирования

  • Внутренние классы стали особенностью языка программирования Java, начиная с версии 1.1.
  • Вложенные классы также являются особенностью языка программирования D , Visual Basic .NET , Ruby , C++ и C# .
  • В Python можно вкладывать класс в другой класс, метод или функцию.
  • В C++ есть вложенные классы, которые похожи на статические классы-члены Java, за исключением того, что они не объявляются с помощью «static».
  • В языке BETA введено понятие вложенных классов.

Код графического интерфейса пользователя

Локальные внутренние классы часто используются в Java для определения обратных вызовов для кода GUI. Затем компоненты могут совместно использовать объект, реализующий интерфейс обработки событий или расширяющий абстрактный класс адаптера, содержащий код, который должен быть выполнен при возникновении данного события.

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

Это позволяет избежать большого монолитного actionPerformed(ActionEvent)метода с несколькими ветвями if-else для определения источника события. Этот тип кода часто считается беспорядочным [ требуется цитата ] и внутренние вариации класса считаются лучшими во всех отношениях. [ требуется цитата ]

Ссылки

  1. ^ ab (Oracle) Вложенные классы, Oracle.Com – Учебники Java.
  • «Внутренние классы. Так для чего же вообще нужны внутренние классы?»
  • Вложенные классы в D
Взято с "https://en.wikipedia.org/w/index.php?title=Внутренний_класс&oldid=1128310830"