Si descompilar una clase interna (o verlo usando depurador) se puede ver que existe código generado para acceder a la instancia de la clase externa que se usó para crearlos. La sobrecarga para esto es más memoria para el puntero adicional, más CPU para la recolección de basura debido a un puntero adicional para probar, y si desea nit pick, tiempo de compilación más largo. Crear instancias de clases internas no estáticas es un poco más complicado porque necesita una instancia de la clase externa para crearlas.
Se puede controlar la visibilidad de las clases internas estáticas y no estáticas. Usualmente son privados si su implementación está fuertemente relacionada con los detalles internos de la clase externa, y el desarrollador no cree que el código pueda ser reutilizado. En este sentido, no son mejores que las funciones privadas. Las clases internas pueden ser públicas en casos como Map.Entry, donde la clase interna está fuertemente conectada a la interfaz expuesta por la clase, y el desarrollador no cree que Map.Entry se pueda usar sin algún tipo de Map. Ambos tipos tienen acceso a miembros privados de la clase externa y la clase externa tiene acceso a miembros privados de la clase interna.
Las instancias de clases internas estáticas y no estáticas se recogen como cualquier otra clase.No hay una conexión especial entre la colección de grabación de la clase externa y la colección de basura de la clase interna.
En el caso de la implementación de clases UI como swing o android, verá clases internas estáticas porque se tratan como funciones privadas. Estas clases no están desarrolladas para su reutilización fuera de la clase externa y están fuertemente conectadas a la implementación interna de la clase externa. No hay ninguna razón para exponerlos y asegurarse de que puedan funcionar en más casos que el contexto específico de los requisitos de la clase externa.
Eso es cierto, pero hay más: a veces no tiene una referencia a la clase externa y aún desea crear una instancia de la parte interna (si está visible). – ognian
+1 para la impresión de lo que hará el compilador desde la fuente de entrada – Seven
No puede una clase interna no estática declarar explícitamente una referencia a la externa (solo necesita instanciarla manualmente), dando así lo mejor de ambos mundos: la referencia externa sin costos de memoria estática? Además, ¿no es una clase interna estática no reentrante, por lo tanto, es útil solo en el caso donde se requiere una sola instancia de la misma? – samosaris