Java this in nested class
Объясните кто знает что за модификатора доступа (package private)? Чем он отличается от обычного private? Могу предположить что автор имел ввиду default access modifier, поправьте если не прав.
Продолжение про нестатические вложенные (анонимные) классы (2/3 часть): https://javarush.com/groups/posts/2193-anonimnihe-klassih Продолжение про статические вложенные классы (3/3 часть): https://javarush.com/groups/posts/2183-staticheskie-vlozhennihe-klassih
Зачем давать не актуальную информацию? Внутренний класс МОЖЕТ содержать статические переменные и методы но с JAVA 16.
В шестом пункте написано » Если у внутреннего класса нет модификатора доступа (package private), объекты внутреннего класса можно создавать внутри «внешнего» класса;» , а если есть, то нельзя?
Так же protected работает и для внутренних классов. Объекты protected внутреннего класса можно создавать: внутри «внешнего» класса; в его классах-наследниках; в тех классах, которые находятся в том же пакете. Может кто подсказать, что за хрень творится с этим модификатором доступа? Почему я не могу создать экземпляр внутреннего класса в классе-наследнике (наследование от внешнего класса, так как от внутреннего protected компилятор не дает наследоваться) в другом пэкадже? Хотя в статье говориться, что я могу это сделать.
Вообще не понимаю что тут написано 🤷🏽♂️ «Объект внутреннего класса нельзя создать в статическом методе «внешнего» класса. Это объясняется особенностями устройства внутренних классов. У внутреннего класса могут быть конструкторы с параметрами или только конструктор по умолчанию. Но независимо от этого, когда мы создаем объект внутреннего класса, в него незаметно передается ссылка на объект «внешнего» класса. Ведь наличие такого объекта — обязательное условие. Иначе мы не сможем создавать объекты внутреннего класса. Но если метод внешнего класса статический, значит, объект внешнего класса может вообще не существовать! А значит, логика работы внутреннего класса будет нарушена. В такой ситуации компилятор выбросит ошибку:
public static Seat createSeat() < //Bicycle.this cannot be referenced from a static context return new Seat(); >
Объект внутреннего класса нельзя создать в статическом методе «внешнего» класса. Может быть его нельзя создать не потому что есть или нет объекта внешнего класса, который можно создать по дефолту, а потому что в статических методах нельзя использовать нестатические переменные? public class Main < public static void main(String[] args) < Outer obj = new Outer(); Outer.Inner obj1 = obj.getObj(); System.out.println(obj1.a); >> class Outer < static class Inner < int a = 5; >static Inner getObj() < return new Inner(); >>
Java. Создание объектов вложенных статических и нестатических классов. Конструкции .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 color: #333300;">⇑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 из других методов, которые размещены в других классах