Помогите разобраться, пожалуйста. Есть несколько вопросов:
1) Насколько я знаю, раньше разница между ними была такой: внутренний класс привязан к объекту внешнего класса, и не может обращаться к статик-полям внешнего класса или же объявлять свои статик-поля (или методы). А вложенный класс не привязан к объекту внешнего класса и спокойно может существовать сам по себе, а также может содержать статические методы и поля + может обращаться к статическим полям внешнего класса.
Но, кажется, с java-16 внутренний класс может наследовать статик-переменные и методы. И теперь я не понимаю, в чем между ними разница..
(статьи, которые я находила не упоминают этого)
2) Также во многих лекциях пишется, что создать объект статического вложенного класса можно только с указанием названия внешнего класса. Но если сделать это без указания внешнего класса, то компилятор не выдает ошибки:
K.
39 уровень
Внутренние и вложенные классы
Решен
Комментарии (21)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
18 января 2022, 11:09полезный
Чтобы прояснить терминологию:
Nested class = вложенный класс.
Это любой класс который находится внутри другого класса.
Анонимный класс это вложенный класс, локальный, внутренний и тд это все вложенные классы.
Inner class = внутренний класс, это частный случай / один из типов вложенного класса.
"нестатический внутренний" класс это будет путаница, поскольку статических внутренних не бывает, насколько мне известно, в 16ой вроде только статические члены класса добавили во внутренние.
Поэтому либо внутренний, либо нестатический вложенный.
Нестатические и статические бывают вложенные.
+1
K.
18 января 2022, 12:16
Она на многих сайтах разнится, но спасибо большое за пояснение. Стало понятнее!
А по самому вопросу (он был про inner classes и static nested), правильно ли поняла, что внутренний класс (самый нижний, левый) привязан к объекту внешнего класса, при этом может обращаться к статическим и нестатическим полям и методам внешнего класса, а также хранить в себе статические и нестатические поля и методы.
А статический вложенный класс не привязан к объекту внешнего класса, может обращаться только к статическим полям внешнего класса, может содержать в себе статические и нестатические поля и методы. Однако если мы в статический вложенный класс передадим ссылку на объект внешнего класса, то он сможет обращаться и к нестатическим полям и методам объекта?
(очень не уверена в правильности того, что выделила жирным)
0
Justinian Judge в Mega City One Master
18 января 2022, 14:12
да, поэтому и решил прояснить, поскольку даже на сайтах в статьях или здесь могут путать.
Источник главный один - это спецификация джава, чтобы избежать недопонимания и путаницы, и лучше понять их нужно четко в голове представлять вышеуказанную картинку. Чтобы структурировать информацию.
Да, то что ты описала так, только в части внутреннего класса:
а также хранить в себе статические и нестатические поля и методы.
здесь примечание - с 16й джавы.
Почему до 16-ой джавы там не было статических членов (переменные и методы), поскольку внутренний класс принадлежит конкретному экземпляру объекта.
Если нет экземпляра - нет внутреннего класса. А значит и смысл статических методов? Если нам нужен метод - нам и метод экземпляра покатит.
То есть - есть экземпляр внешнего класса - есть экземпляр внутреннего - мы можем использовать методы внутреннего класса
Нету экземпляра внешнего класса - нету экземпляра внутреннего метода - мы не можем использовать методы внутреннего класса, какие бы они не были
Другое дело статические вложенные классы, у которых вполне мы можем вызвать нужный статический метод, поскольку они существуют и так. Нет экземпляра внешнего класса, но мы же имеем доступ к статическому вложенному? Имеем, то и иметь там метод есть смысл, поэтому этот класс может иметь статические.
+ кто и что может, советую в Идее тоже посоздавать и попробовать
0
K.
18 января 2022, 14:32
Чуть-чуть не поняла.
То есть, до 16 java внутренний класс не мог хранить в себе статические поля и методы, с 16-ой java может, но логика при этом неизменна: обратиться к статическим полям и методам внутреннего класса (как и к нестатическим) мы можем только, если у нас существует объект внешнего класса. Верно?
0
Justinian Judge в Mega City One Master
18 января 2022, 14:44
Нет, логика изменилась. Они открыли доступ к внутренним классам как контейнерам.
Поскольку раньше не было доступа к внутренним классам в принципе, статических членов класса там не было - не имело смысла.
Но теперь, они открыли доступ к внутренним классам как контейнерам логики - и теперь там есть смысл и статические методы/переменные использовать. Ведь эти внутренние классы стало возможным использовать даже без создания экземпляра внешнего.
Ну сама подсуди,
Есть
public class Solution {
public static int age = 5;
}
может такое быть? Да может. У нас нет экземпляра класса Солюшн, но мы можем использовать его как контейнер логики - переменных и методов. С 16 джавы сделали такое для внутренних классов, чтобы синхронизировать с другими изменениями (добавление в джаву Record ов).
То есть логика немного изменилась
0
K.
18 января 2022, 15:08
Прости, я их что-то долго догоняю..
Но теперь, они открыли доступ к внутренним классам как контейнерам логики - и теперь там есть смысл и статические методы/переменные использовать. Ведь эти внутренние классы стало возможным использовать даже без создания экземпляра внешнего.
Но в чем тогда различие между вложенным статическим классом и вложенным нестатическим классом (т.е. внутренним). Верно ли, я понимаю, что:
1. Объект внутреннего класса по-прежнему не может существовать без объекта внешнего класса
2. При этом внешний класс может использовать внутренний класс как контейнер и статические переменные внешнего класса могут обращаться к статическим переменным внутреннего класса (как и статические переменные внутреннего класса могут обращаться к статическим переменным внешнего класса) без создания объектов этих классов?
0
Justinian Judge в Mega City One Master
18 января 2022, 16:13полезный
Да.
да
+1
K.
18 января 2022, 17:41
Спасибо!
Внутренний класс нужен, когда нам нужен составной объект внешнего объекта (крыло от самолета в привязке к самолету; частичка лего в привязке ко всему конструктору; велосипедное сиденье и велосипед).
А вложенный статический класс нужен для определения одноразовых, служебных и / или библиотечных классов, в которых создание экземпляров не имело бы смысла?
Может, ты знаешь какой-то простой пример необходимости вложенного статического класса? Пока для меня это что-то абстрактное..
0
Justinian Judge в Mega City One Master
18 января 2022, 19:40решение
LinkedList exercise
смысла делать внутренним и привязывать классы к конкретному экземпляру нет, просто утильный класс цель которого содержать данные, но этот класс вспомогательный, он не имеет смысла вне применения ЛинкедЛиста, и поэтому его не сделали отдельным классом
это нормально. Когда дети изучают алфавит, для них буквы тоже абстракция. Останавливаться на этом и пытаться осознать зачем эти буквы - не делают же. Просто идут дальше по программе, и когда дети видят где и как это используется, приходит осознание, с программированием точно так же, сначала изучаются какие-то основы, какие-то знания, есть вот так вот. А что и для чего..только по мере опыта, начнешь обращать внимание - там вложенный класс, сям, увидишь как и где используется, и сложится картинка.
Ты достаточно точно описала где и какой используется.
Пример вложенного статического класса, например LinkedList и вложенный статический класс Node<E>. Для закрепления можешь свой написать
+2
K.
19 января 2022, 10:54
спасибо за помощь!
+1
Justinian Judge в Mega City One Master
19 января 2022, 10:56
На здоровье, молодец, что спрашиваешь :) Успехов!
+2
Ksenia Volkova Java Developer в DXC Master
18 января 2022, 09:09решение
1) Объект нестатического класса должен быть привязан к конкретному экземпляру своего внешнего класса. А static может существовать сам по себе.
2) Ты создаешь Shop внутри родительского класса - поэтому тут нет необходимости указывать этот родительский класс.
Попробуй создать в другом классе.
+2
K.
18 января 2022, 09:14
1) То есть, несмотря на то, что сейчас внутренний класс также может содержать статические методы и поля, а также обращаться к статическим элементам внешнего класса, логика остается той же? Если не ошибаюсь, ранее логика была именно такой, что т.к. объект внутреннего класса привязан ко внешнему и не может без него существовать, то обращение к статическим полям (если объект внешнего класса не существует) может вызвать ошибку
2) Точно! Спасибо большое
0
Ksenia Volkova Java Developer в DXC Master
18 января 2022, 09:25
Статические поля класса существуют независимо от того, существуют ли объекты этого класса.
0
hidden #598481
18 января 2022, 09:31
Простой пример:
out - статическое поле в классе System, при этом System - это т.н. утилитный класс, содержащий лишь приватный конструктор, к которому ты не можешь обратиться извне. Получается, у тебя вообще нет объектов этого класса, и при этом ты обращаешься к статическим полям и методам этого класса.
Получается, что это не класс с точки зрения ООП, а просто некий набор функций, объединённый в один класс. Это и есть утилитный класс.
0
K.
18 января 2022, 09:41
да, а объект внутреннего существует только в связке с объектом внешнего класса. Т.е. если мы из внутреннего класса обратимся к статическому полю внешнего, а объекта внешнего класса нет, это не доставит проблем?
0
K.
18 января 2022, 09:41
Так ведь System не является внутренним классом
0
Ksenia Volkova Java Developer в DXC Master
18 января 2022, 09:44
Но поле out существует независимо от того, есть ли объект класса System или нет.
И если у System внутри был бы статический класс, то ему бы тоже было все равно. Поле out будет существовать в любом случае.
0
K.
18 января 2022, 10:08
Статический вложенный да. А я про нестатический внутренний. Ранее они не могли обращаться к статическим полям внешнего класса, а сейчас могут. Это никак не изменяет их логику?
0
Ksenia Volkova Java Developer в DXC Master
18 января 2022, 10:18решение
До 16 версии сами нестатические внутренние классы не могут иметь статических полей или методов.
А со статиками внешнего класса вроде ничего не менялось.
+2
K.
18 января 2022, 10:42
А! Все поняла теперь, спасибо! Я думала, с внешними тоже менялось. Спасибо!
0