Создание объектов вложенных статических и нестатических классов. Конструкции .this, .new
Содержание
- 1. Можно ли в охватывающем классе объявлять объект вложенного класса?
- 2. Особенности создания объектов в случае объявления вложенного (nested) статического класса
- 3. Как получить ссылку на объект внешнего (охватывающего) класса? Конструкция .this
- 4. Пример получения ссылки на объект внешнего класса
- 5. Как создать объект вложенного класса в случае нестатических вложенных классов? Конструкция .new
- 6. Пример создания объекта внутреннего класса с помощью конструкции .new
- 7. Можно ли создавать объект вложенного статического класса?
- 8. Как создать объект вложенного статического класса?
- 9. Пример, демонстрирующий создание объектов вложенных статических классов
- Связанные темы
Поиск на других ресурсах:
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 не помогает.