Вкладені, внутрішні класи

У літературі Java зустрічаються такі терміни, як "внутрішні класи"inner classesі "вкладені класи"nested classes. Для вкладених класів inner класи є підмножиною. Проте часто під внутрішніми класами маються на увазі всі вкладені - ось такий парадокс.

Визначення класу може розміщуватись усередині визначення іншого класу. Такі класи прийнято називати вкладеними чи внутрішніми. Область видимості вкладеного класу обмежена областю видимості зовнішнього класу. Тому, якщо створюється клас B усередині класу A, то клас B неспроможна існувати незалежно від класу A. Вкладені класи дозволяють групувати класи, що логічно належать одне одному, і керувати доступом до них.

Існують два типи вкладених класу – статичні (static-nested-class) та нестатичні (non-static). Власне нестатичні вкладені класи мають іншу назву - внутрішні класи. Зовнішній клас іноді називають ще оточуючим класом.

Вкладені класи, nested classes

Якщо зв'язок між об'єктом внутрішнього класу та об'єктом зовнішнього класу не потрібний, можна зробити внутрішній клас статичнимstatic. Такий клас називають вкладенимnested. Застосування статичного внутрішнього класу означає таке:

  • до створення об'єкта статичного внутрішнього класу не потрібен об'єкт зовнішнього класу;
  • з об'єкта вкладеного класу не можна звертатися до нестатичних членів зовнішнього класу.

Вкладений клас має доступ до членів свого зовнішнього класу, зокрема і до закритих членів. Однак зовнішній клас не має доступу до членів вкладеного класу. Вкладений клас при цьому є членом зовнішнього класу.

Статичний класоголошується ключовим словомstatic. У цьому клас повинен звертатися до нестатичних членів свого зовнішнього класу з допомогою об'єкта, тобто. він може звертатися безпосередньо на нестатичні члени свого зовнішнього класу. На практику такі класи використовуються рідко.

Внутрішні класи, inner classes

Нестатичні вкладені класи називають також внутрішніми класамиinner class. Внутрішній клас має доступ всім змінним і методам свого зовнішнього класу і може безпосередньо посилатися ними. Внутрішні класи створюються всередині навколишнього класу:

Внутрішній класInnerвизначений в області видимості класуOuter. Тому будь-який код у класіInnerможе безпосередньо звертатися до змінних x1, x2 зовнішнього класу. Після створення екземпляра класуOuterвикликається його методsumma ()з параметрами, який створює екземпляр класуInnerз викликом методуdisplay().

Внутрішній класможна визначити не тільки на рівні класу, а й усередині методу або всередині тіла циклу. Якщо потрібно створити об'єкт внутрішнього класу не в статичному методі зовнішнього класу, тип цього об'єкта повинен задаватися у форматіІм'яЗовнішньогоКласу.Ім'яВнутрішньогоКласу.

Об'єкт внутрішнього класу пов'язаний із зовнішнім об'єктом-творцем і може звертатися до його членів без будь-яких додаткових описів. Для внутрішніх класів є всі елементи зовнішнього класу. Якщо необхідно отримати посилання на об'єкт зовнішнього класу, слід використовувати найменування зовнішнього класу з ключовим словомthis, розділених точкою, наприклад : Outer.this.

Статичні внутрішні класи

Статичні внутрішні класи декларуються всередині основного класу та позначаються ключовим словомstatic. Вони мають доступу до членам зовнішнього класу крім статичних.

Статичний внутрішній клас може містити статичні поля, методи та класи, на відміну від інших типів внутрішніх класів. Приклад:

Локальні класи

Локальні класи оголошуються усередині методів основного класу і можуть бути використані лише усередині цих методів. Вони мають доступ до членів зовнішнього класу, а також як до локальних змінних, так і параметрів методу за однієї умови - змінні та параметри використовувані локальним класом повинні бути задекларованіfinal. Локальні класи що неспроможні містити визначення (але можуть успадковувати) статичних полів, методів і класів (крім констант). Приклад:

У локальних класів є кілька обмежень:

Анонімні класи, anonymous class

Анонімні класи декларуються всередині методів основного класу та можуть бути використані лише усередині цих методів. На відміну від локальних класів, анонімні класи немає назви. Головна вимога до анонімного класу - він має наслідувати існуючий клас або реалізовувати існуючий інтерфейс. Анонімні класи що неспроможні містити визначення статичних полів, методів і класів (крім констант), але їх успадковувати. Приклад:

Анонімні класи широко використовуються Java програмістами.Анонімний класнемає імені. Класичний приклад анонімного класу:

З анонімного класу створюється потік і запускається з допомогою методу start класуThread. Синтаксис створення анонімного класу базується на використанні оператораnewз ім'ям класу (інтерфейсу) та тілом новоствореного анонімного класу.

Основне обмеження при використанні анонімних класів – це неможливість описуконструктора, оскільки клас не має імені. Аргументи, вказані у дужках, автоматично використовуються для виклику конструктора базового класу з тими самими параметрами. Ось приклад :

Оскількианонімний класє локальним класом, він має ті самі обмеження, що й локальний клас.

Використання анонімних класів виправдане у багатьох випадках, зокрема коли: