У мові програмування Java, коли клас євизначений всередині іншого класу, тоді такий клас називається вкладеним класом або внутрішнім класом. Вкладені класи - це унікальна особливість Java, яка була включена з jdk1.1. Завжди пам’ятайте, що ця функція вкладання - це відносини лише між класами, а не між об'єктами Java. Раніше ми говорили про те, як інстанціювати змінну екземпляра на Java, а тепер ми розглянемо, як інстанціювати внутрішній клас у Java.
Як інсталювати внутрішній клас - вкладений клас на Java
- Типи вкладених класів
- Нестатичний
- Статичний
- Доступ до модифікаторів для вкладених або внутрішніх класів
- Особливості вкладеного класу
- Переваги
- Приклад коду, пояснення коду та вихід
Типи вкладених класів на Java
Нестатичний вкладений клас
Нестатичні вкладені класи називають внутрішніми класами. Він має доступ до всіх даних екземплярів класу, що додається, включаючи приватні поля та методи.
Синтаксис
[modifiers] class OuterClassName { code... [modifiers] class InnerClassName { code.... } }
Створення
<OuterClassName> outerObj = new <OuterClassName>(arguments); <OuterClassName>.<InnerClassName> innerObj = outerObj.new <InnerClassName> (arguments);
Властивості
- Зовнішній клас (клас, що містить внутрішній клас), може створювати стільки номерів об'єктів внутрішнього класу, скільки хоче, всередині свого коду.
- Якщо внутрішній клас є загальнодоступним, а також містить клас, то код у іншому непов'язаному класі також може створити екземпляр внутрішнього класу.
- Жоден об'єкт внутрішнього класу автоматично інстанціюється із зовнішнім об'єктом класу.
- Код внутрішнього класу має вільний доступ до всіхелементи об'єкта зовнішнього класу, який містить його, за назвою (незалежно від рівня доступу елементів), якщо внутрішній клас має змінну з тим самим іменем, то до змінної зовнішнього класу можна отримати доступ:
<OuterClassName> .це. <variableName> - Зовнішній клас може викликати навіть приватні методи внутрішнього класу.
- Об'єкт внутрішнього класу повинен бути пов'язаний з екземпляром зовнішнього класу.
Статичний вкладений клас
Вкладені класи, які оголошені статичними, просто називаються статичними вкладеними класами. Статичний клас не має доступу до конкретних даних про примірник.
Синтаксис
<access-specifier> class OuterClassName { public static class <StaticInnerClassName> { code. . . } code . . . }
Створення
<OuterClassName>.<InnerClassName> innerObj = new <OuterClassName>.<InnerClassName>(arguments);
Властивості
- Для статичного внутрішнього класу, тоді статичний внутрішній клас можна створити без екземпляра зовнішнього класу.
- Статичні члени зовнішнього класу видно статичному внутрішньому класу, яким би не був рівень доступу.
- Нестатичні члени зовнішнього класу недоступні, оскільки немає примірника зовнішнього класу.
- Внутрішній клас може не мати статичних членів, якщо внутрішній клас сам не позначений як статичний.
- Іноді статичні вкладені класи взагалі не називають внутрішнім класом, оскільки вони не вимагають екземпляра зовнішнього класу.
- Статичний внутрішній клас подібно до будь-якого іншого внутрішнього класу, але він не має посилання на його зовнішній клас, який його породжував.
Доступ до модифікаторів для вкладених або внутрішніх класів
- громадські
- захищені
- приватний
- за замовчуванням
Особливості вкладеного класу
Об'єкт внутрішнього класу має неявне значенняпосилання на об'єкт зовнішнього класу, який його створив. За допомогою цього вказівника він отримує доступ до будь-якої змінної зовнішнього об'єкта. Тільки статичні внутрішні класи не мають цього покажчика, але можуть отримати доступ до всіх статичних членів лише за допомогою зовнішнього імені класу. Це насправді непомітно, коли ми пишемо код, але компілятор дбає про нього. Внутрішні класи насправді є явищем компілятора, а не JVM. Ця функція робить внутрішні класи Java багатшими та кориснішими.
Переваги вкладеного класу
- Це спосіб логічного групування класів, які використовуються лише в одному місці.
- Це збільшує інкапсуляцію.
- Вкладені класи можуть призвести до більш читабельного та збереженого коду.
- Логічне групування класів - якщо клас єкорисний лише для одного іншого класу, тоді логічно вбудувати його в цей клас і тримати їх разом. Гніздування, наприклад "допоміжні класи", робить їхній пакет більш спрощеним.
- Підвищена інкапсуляція - розгляньте два найвищих рівнякласи, A і B, де B потрібен доступ до членів A, які в іншому випадку були б оголошені приватними. Приховуючи клас B у класі A, члени A можуть бути приватними, але B можуть отримувати доступ до них. Також сам B може бути прихований від зовнішнього світу.
Програма 1
/* within the scope of outer class */ class Outer{ int var1 = 2; int var2 = 3; /* Inner Class */ class Inner{ void add(){ System.out.println("Addition is:"+(var1+var2)); } } void show(){ Inner in = new Inner(); in.add(); } } class NestedClassDemo{ public static void main(String args[]){ Outer out = new Outer(); out.show(); } }
Вихід 1
Програма 2
/* Outside the scope of outer class */ class Outer{ int var1 = 2; int var2 = 3; /* Inner Class */ class Inner{ void add(){ System.out.println("Addition is:"+(var1+var2)); } } } class NestedClassDemo1{ public static void main(String args[]){ Outer.Inner in = new Outer().new Inner(); in.add(); } }
Вихід 2
Пояснення коду та виводу
У першій програмі ми інстанціювали вкладений клас Inner методом, оголошеним у межах Зовнішнього класу, тобто
в межах зовнішнього класу. Ми спеціально запровадимо внутрішні класи в межах зовнішнього класу. Внутрішній клас є приватним, оскільки нам відомо, що приватні члени не будуть доступні за межами цього класу, що містить приватних членів.
У другій програмі ми інстанціювали вкладений клас Inner за межами класу Зовнішній. Синтаксис здається важким, але це не так. Це занадто просто:
Ми розділимо це твердження на два:
Outer out = new Outer(); Outer.Inner in = out.new Inner();
По-перше, ми повинні створити об’єкт для зовнішньогоклас. Тоді ми створимо об'єкт для класу Внутрішній, оскільки Внутрішній клас є членом Зовнішнього класу, тому ми маємо однозначно розпізнати Внутрішній клас, це можна зробити з Зовнішній. Внутрішня тоді ми повинні створити об'єкт, який робиться новим оператором, а за ним конструктором саме цього класу. Те ж саме робиться і тут.
Спалах увімкнено
Після компіляції вкладеного класу будуть створені два файли .class із Outer.class та Outer $ Inner.class (тут клас Inner знаходиться всередині класу Зовнішній).
Отримайте більше корисних навчальних посібників та остаточних рекомендацій щодо програмування Java.
Коментарі