Thilo agregó una buena respuesta para su primera pregunta "¿Cómo es esto posible?". Deseo profundizar un poco en la segunda pregunta: ¿Por qué se permite este comportamiento?
Para empezar, seamos perfectamente claros de que este comportamiento no se limita a las clases internas, que por definición son tipos anidados no estáticos. Este comportamiento está permitido para todos los tipos anidados, incluidas las enumeraciones e interfaces anidadas que deben ser estáticas y no pueden tener una instancia de cierre. Básicamente, el modelo es una simplificación de la siguiente declaración: el código anidado tiene acceso completo al código adjunto, y viceversa.
Entonces, ¿por qué entonces? Creo que un ejemplo ilustra mejor el punto.
Piensa en tu cuerpo y tu cerebro. Si inyectas heroína en tu brazo, tu cerebro se eleva. Si la región de la amígdala de su cerebro ve lo que él cree que es una amenaza para su seguridad personal, por ejemplo, una avispa, hará que su cuerpo gire al revés y corra hacia las colinas sin que usted "piense" dos veces al respecto.
Entonces, el cerebro es una parte intrínseca del cuerpo y, curiosamente, también al revés. El uso del control de acceso entre esas entidades estrechamente relacionadas pierde su reclamo de relación. Si necesita control de acceso, entonces necesita separar las clases más en unidades verdaderamente distintas. Hasta entonces, son la misma unidad. Un ejemplo de conducción para futuros estudios sería observar cómo Iterator
se implementa generalmente un Java .
El acceso ilimitado desde el código adjunto al código anidado hace que, en su mayor parte, sea bastante inútil agregar modificadores de acceso a los campos y métodos de un tipo anidado. Hacerlo es agregar desorden y puede proporcionar una falsa sensación de seguridad para los recién llegados del lenguaje de programación Java.