Создание объектов вложенных статических и нестатических классов. Конструкции .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 не помогает.

 


Связанные темы