Thilo ha aggiunto una buona risposta per la tua prima domanda "Com'è possibile?". Vorrei approfondire un po 'la seconda domanda: perché questo comportamento è permesso?
Per cominciare, chiariamo perfettamente che questo comportamento non è limitato alle classi interne, che per definizione sono tipi nidificati non statici. Questo comportamento è consentito per tutti i tipi nidificati, inclusi enumerazioni e interfacce nidificate che devono essere statiche e non possono avere un'istanza chiusa. Fondamentalmente, il modello è una semplificazione fino alla seguente dichiarazione: il codice nidificato ha pieno accesso al codice che lo racchiude - e viceversa.
Allora perché allora? Penso che un esempio illustri meglio il punto.
Pensa al tuo corpo e al tuo cervello. Se iniettate eroina nel braccio, il cervello si alza. Se la regione dell'amigdala del tuo cervello vede ciò che crede sia una minaccia per la tua sicurezza personale, ad esempio una vespa, farà girare il tuo corpo al contrario e correrà verso le colline senza che tu "ci pensi" due volte.
Quindi, il cervello è una parte intrinseca del corpo - e stranamente, anche il contrario. L'uso del controllo dell'accesso tra entità così strettamente correlate perde la loro pretesa di relazione. Se è necessario il controllo dell'accesso, è necessario separare le classi in unità veramente distinte. Fino ad allora, sono la stessa unità. Un esempio determinante per ulteriori studi sarebbe quello di osservare come Iterator
viene solitamente implementato un Java .
L'accesso illimitato dal codice racchiuso al codice nidificato rende, per la maggior parte, piuttosto inutile aggiungere modificatori di accesso a campi e metodi di tipo nidificato. In questo modo si aggiunge disordine e potrebbe fornire un falso senso di sicurezza per i nuovi arrivati del linguaggio di programmazione Java.