В Java существуют четыре типа вложенных классов:
Static nested class не имеет доступа к нестатическим членам внешнего класса напрямую. Он компилируется как отдельный класс, его экземпляры не хранят скрытой ссылки на объект-оболочку.
Inner class (non-static) хранит неявную ссылку на внешний объект и может обращаться к его полям. Такой класс чаще используют для реализации слушателей или iterator'ов с доступом к данным внешнего объекта.
class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // доступ к полю внешнего } } int value = 42; }
Используйте static nested class для утилитарных или вспомогательных конструктов, связанных с внешним классом по смыслу, но не требующих доступа к его состоянию. Используйте inner class, если нужно иметь прямой доступ к нестатическим членам внешнего класса для более тесной интеграции.
Вопрос: "Может ли static nested class обращаться к нестатическим полям экземпляра внешнего класса напрямую?"
Ответ: Нет, static nested class не может напрямую обращаться к нестатическим полям или методам экземпляра внешнего класса, так как не содержит (и не хранит) ссылки на объект внешнего класса.
История
В библиотеке для хранения данных в кеше использовали static nested class, предполагая возможность доступа к конфигурационным настройкам внешнего класса. После попытки обращения возникла ошибка компиляции — внутренний класс не видел нестатических полей, пришлось менять архитектуру.
История
В интерфейсе графического приложения использовали inner class вместо static nested class для констант, из-за чего возникла лишняя неявная ссылка на внешний объект. В итоге сборщик мусора не мог корректно очищать память, приводя к утечкам.
История
При сериализации коллекции, содержащей внутренние классы, возникла проблема: inner class хранил ссылку на родительский объект, и при сериализации происходило сериализование всего дерева зависимостей, сильно замедляя процесс и увеличивая размер результата. После смены на static nested class проблема исчезла.