Если вы декомпилировать внутренний класс (или смотреть его с помощью отладчика) вы можете видеть, что есть сгенерированный код для доступа к экземпляру внешнего класса, который использовался для их создания. Накладные расходы для этого - больше памяти для дополнительного указателя, больше cpu для сбора мусора из-за дополнительного указателя на тест, и если вы хотите выбрать nit, больше времени компиляции. Создание экземпляров нестационарных внутренних классов немного сложнее, потому что для их создания нужен внешний экземпляр внешнего класса.
Можно контролировать видимость как статических, так и нестатических внутренних классов. Обычно они являются частными, если их реализация сильно связана с внутренними деталями внешнего класса, и разработчик не считает, что код может быть повторно использован. В этом смысле они не лучше частных. Внутренние классы могут быть общедоступными в таких случаях, как Map.Entry, где внутренний класс сильно связан с интерфейсом, открытым классом, и разработчик не считает, что Map.Entry можно использовать без какой-либо Карты. Оба типа имеют доступ к закрытым членам внешнего класса, а внешний класс имеет доступ к частным членам внутреннего класса.
Экземпляры статических и нестатических внутренних классов - это мусор, собранный как каждый другой класс.Не существует особой связи между сборкой внешнего класса и сборкой мусора внутреннего класса.
В случае реализации классов UI, таких как swing или android, вы увидите статические внутренние классы, потому что они рассматриваются как частные функции. Эти классы не разработаны для повторного использования вне внешнего класса и сильно связаны с внутренней реализацией внешнего класса. Нет причин раскрывать их и следить за тем, чтобы они могли работать в большем количестве случаев, чем конкретный контекст требований внешнего класса.
Это правда, но есть еще - иногда у вас нет ссылки на внешний класс и вы хотите создать экземпляр внутреннего (если он виден). – ognian
+1 для впечатления, что компилятор сделает из источника ввода – Seven
Невозможно, чтобы нестатический внутренний класс явно указывал ссылку на внешний (просто нужно вручную создать его экземпляр), тем самым давая лучшее из обоих миров: внешняя ссылка без затрат на статическую память? Кроме того, не является статическим внутренним классом, не являющимся реентерабельным, поэтому полезно только в том случае, когда требуется один экземпляр этого объекта? – samosaris