Створення об’єктів вкладених статичних та нестатичних класів. Конструкції .this, .new

Створення об’єктів вкладених статичних та нестатичних класів. Конструкції .this, .new


Зміст



1. Чи можна в охоплюючому класі оголошувати об’єкт вкладеного класу?

Так, можна. Нижче наведено приклад оголошення об’єкту з іменем ic вкладеного класу InClass в тілі охоплюючого класу OutClass.

// охоплюючий нестатичний клас
class OutClass {
    int d;
    InClass ic = new InClass(); // об'єкт вкладеного класу

    // вкладений нестатичний клас
    class InClass {
        int d1;
    }
}

Створення та використання екземпляру класу OutClass може бути, наприклад таким

OutClass obj = new OutClass();      
obj.ic.d1 = 23;

 

2. Особливості створення об’єктів у випадку оголошення вкладеного (nested) статичного класу

Якщо у нестатичному класі оголошується вкладений статичний клас, то:

  • для того, щоб створити об’єкт вкладеного статичного класу не потрібно створювати об’єкт охоплюючого класу. Доступ до імені вкладеного статичного класу з іменем InClass здійснюється за зразком OutClass.InClass, де OutClass – ім’я охоплюючого класу;
  • не можна звертатись до членів охоплюючого класу зі статичного вкладеного класу.

 

3. Як отримати посилання на об’єкт зовнішнього (охоплюючого) класу? Конструкція .this

Для отримання посилання на об’єкт зовнішнього класу використовується конструкція виду

OutClass.this

де OutClass – ім’я зовнішнього (охоплюючого) класу. Конструкція .this підходить тільки для вкладених нестатичних класів.

 

4. Приклад отримання посилання на об’єкт зовнішнього класу

У прикладі оголошується охоплюючий клас OutClass. В цьому класі оголошується нестатичний клас InClass, який містиь метод ReturnObjOutClass(). Цей метод повертає посилання на об’єкт охоплюючого класу OutClass з допомогою конструкції .this.

// охоплюючий нестатичний клас
class OutClass {
    int d;
    InClass ic = new InClass(); // об'єкт вкладеного класу

    // вкладений нестатичний клас
    class InClass {
        int d1;

        // метод повертає посилання на об'єкт зовнішнього класу OutClass
        OutClass ReturnObjOutClass() {
            // повернути посилання на об'єкт класу OutClass
            return OutClass.this;
        }
    }
}

Нижче демонструєтья використання класу OutClass та методу ReturnObjOutClass() в іншому методі

// демонстрація використання покажчика .this на об'єкт охоплюючого класу
OutClass obj = new OutClass(); // створити екземпляр (об'єкт) класу OutClass
int t;

// заповнити значення внутрішніх даних об'єкту
obj.d = 76;
obj.ic.d1 = 23;

// оголосити нове посилання типу OutClass
OutClass obj2;      

// викликати метод, що повертає посилання на об'єкт охоплюючого класу
obj2 = obj.ic.ReturnObjOutClass(); // тепер obj2 та obj посилаються на той самий об'єкт

// перевірка
t = obj2.ic.d1; // t = 23,висновок: obj2 та obj посилаються на той самий об'єкт
t = obj2.d; // t = 76

 

5. Як створити об’єкт вкладеного класу у випадку нестатичних вкладених класів? Конструкція .new

Щоб створити об’єкт вкладеного класу потрібно використати конструкцію виду

ObjOutClass.new

де ObjOutClass – ім’я об’єкту зовнішнього (охоплюючого) класу.

У випадку, якщо вкладений клас оголошений як нестатичний (внутрішній клас), то для нього діє наступне правило:

  • для того, щоб створити об’єкт вкладеного класу, обов’язково має бути створений об’єкт охоплюючого класу. Без об’єкту охоплюючого класу, створити об’єкт вкладеного класу не вдасться. Це пояснюється тим, що об’єкт вкладеного класу незамітно зв’язується з об’єктом зовнішнього класу.

 

6. Приклад створення об’єкту внутрішнього класу з допомогою конструкції .new

Нижче демонструється створення об’єкту внутрішнього класу у функції main(). Задано клас OutClass, в якому оголошується внутрішній клас InClass.

package Package1;

// охоплюючий нестатичний клас
class OutClass {
    int d;

    // об'єкт вкладеного класу, створений стандартним способом
    InClass ic = new InClass();

    // вкладений нестатичний клас
    class InClass {
        int dd;
    }
}

public class NestedClasses {
    public static void main(String[] args) {
        // демонстрація використання конструкції .new на об'єкт вкладеного класу
        OutClass oc = new OutClass(); // створити об'єкт класу OutClass
        int t;

        // виклик конструкції .new для створення об'єкту вкладеного класу
        OutClass.InClass ic = oc.new InClass();

        // використання об'єкту вкладеного класу
        ic.dd = 37;
        t = ic.dd; // t = 37

        System.out.println("t = " + t);      
    }
}

 

7. Чи можна створювати об’єкт вкладеного статичного класу?

Так можна. При цьому в охоплюючому класі статичний вкладений клас має бути оголошений як public. Якщо статичний клас оголошений як private, то об’єкт цього класу створювати не можна.

 

8. Як створити об’єкт вкладеного статичного класу?

Якщо вкладений клас оголошений як статичний, то можна об’єкт вкладеного статичного класу оголошується стандартним способом

OutClass.InClass obj = new OutClass.InClass();

оскільки, статичний вкладений OutClass.InClass клас має глобальну область видимості.

 

9. Приклад, що демонструє створення об’єктів вкладених статичних класів

Задано клас OutClass в якому оголошено два вкладені статичні класи з іменами InClass1, InClass2. Клас InClass1 за замовчуванням оголошений має тип доступу public. Другий клас InClass2 оголошений як private.

// охоплюючий нестатичний клас
class OutClass {
    int d;

    // вкладений статичний public-клас
    static class InClass1 {
        int d1;
    }    

    // вкладений статичний private-клас
    private static class InClass2 {
        int d2;
    }
}

Нижче демонструється створення та використання об’єктів класів OutClass, InClass1 з інших методів, які розміщені в інших класах

public class MyStaticClass {
    public static void main(String[] args) {
        // демонстрація використання конструкції .new на об'єкт вкладеного класу
        OutClass oc = new OutClass(); // створити об'єкт класу OutClass
        int t;

        // доступ до даних класу OutClass через об'єкт oc
        oc.d = 233;

        // створити об'єкт вкладеного статичного public-класу OutClass.InClass1()
        OutClass.InClass1 ic1 = new OutClass.InClass1();

        // доступ до даних класу OutClass.InClass1() через об'єкт
        ic1.d1 = 777;

        // створити об'єкт вкладеного статичного private-класу - заборонено
        // OutClass.InClass2 ic2 = new OutClass.InClass2(); - помилка
        System.out.println("t = " + t);
    }
}

Як видно з вищенаведеного коду, можна оголошувати об’єкти класів OutClass та InClass1 з інших методів. Однак, немає доступу до прихованого (private) статичного класу InClass2. У цьому випадку, ключове слово static не допомагає.

 


Зв’язані теми