Добрый день, кто может подсказать почему когда мы в классе объявляем класс, то вложенный класс должен быть объявлен как static или это не обязательно?
И еще вопрос, какие модификаторы доступа должны быть и могут быть у конструктора? Спасибо.
anmani2007
22 уровень
Статические классы и конструкторы
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Alex
17 января 2019, 14:12
Смотря какой у вас класс-обертка - статический или не статический.
0
Александр Неклеса Backend Developer
21 декабря 2017, 10:50решение
Вложенные классы делятся на два вида: статические и не статические. Вложенные классы, объявленные как статические называются Вложенными статическими (static nested classes). Не статические называются Внутренними (inner classes).
Со статическими Вложенными static nested classes меньше мороки
если нужно создать объект такого static nested class ВНУТРИ внешнего, то создаёшь как обычно :
StaticNestedClass saticNestedClass = new StaticNestedClass();
если нужно создать объект такого static nested class за пределами внешнего класса, то вот так
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Т.е. снаружи нужно будет всегда указывать сначала внешний класс и через точку вложенный. Это такое получается составное имя. Как Map.Entry
статическими Вложенными static nested class имеет доступ ТОЛЬКО К СТАТИЧЕСКИМ полям и методам внешнего класса (даже к ПРИВАТНЫМ)
А вот для создания Внутреннего не статического inner class нужно сначала создать объект внешного класса. Поэтому в СТАТИЧЕСКОМ main нельзя просто так Карл создать не статический внутр класс, в отличии от статического. А в нестатическом методе можно, т.к. нестатичкские методы принадлежат объекту а не классу. В нестатическом методе можно создать нутренними inner classes как обычно
InnerClass iner = new InnerClass();
А в статическом методе или из других классов так:
Сначала нужно создать объект внешнего класса
OuterClass outerObject = new OuterClass();
а потом через объект внешнего класса создаём внутренний
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Объект Внутреннего не статического inner class принадлежит внешнему OuterClass объекту и имеет доступ ко всем его полям и методам (статик, не статик и даже ПРИВАТНЫМ)
http://easy-code.ru/lesson/java-nested-classes
http://www.quizful.net/post/inner-classes-java
у конструктора есть все модификаторы доступа
+24
hidden #1278682
21 декабря 2017, 10:17
/* Комментарий удален */
+1
anmani2007
21 декабря 2017, 10:29
Это понятно =) ключевой вопрос почему?
0
hidden #1278682
21 декабря 2017, 10:55
если почему относится к вопросу про внутренние классы - они не обязательно должны быть статическими.
+1
hidden #598481
17 января 2019, 14:16
По тому же принципу, что и с методами.
Нельзя обратиться к нестатическому вложенному классу без создания объекта внешнего класса.
+1
Eugen
6 июля 2019, 06:25
не стоит писать код так или иначе, "потому что среда разработки не ругается".
нужно именно понимать как все работает.
-3