Classi annidate in Java

1

Perché è legale in Java dichiarare un oggetto della classe che racchiude la classe annidata? Non può essere significativo poiché la classe di inclusione non è completamente definita al momento della dichiarazione del suo oggetto. Inoltre, se A è la classe che racchiude e B è la classe annidata, allora un oggetto di classe A includerà anche membri della classe B, che include di nuovo un oggetto di classe A, e questo andrebbe avanti indefinitamente. La mia comprensione è che, poiché la classe che li include non può accedere ai membri della classe nidificata, quindi un oggetto del primo può accedere solo ai membri che non sono nella classe nidificata, il che risolve questo problema. È corretto, o c'è qualcos'altro?

    
posta A.Jha 20.03.2016 - 11:15
fonte

1 risposta

3

It cannot be meaningful as enclosing class is not completely defined at the time of the declaration of its object.

Quindi cosa? Se seguo la tua logica, non può essere significativo all'interno di un metodo di una classe dichiarare un oggetto della classe che lo include, per lo stesso motivo.

Sembra che tu abbia frainteso la differenza tra compilazione e tempo di esecuzione. Quando il codice sorgente viene analizzato per essere compilato e il tokenizzatore elabora B , allora, infatti, A potrebbe non essere ancora completamente definito. In modo simile, quando A contiene un metodo hello() che chiama world() , il tokenizzatore può elaborare il primo metodo mentre il secondo non esiste ancora.

In fase di esecuzione, tuttavia, esistono sia A che B . Puoi fare in modo che Reflection elenchi i propri membri e puoi chiamare B da A e A da B senza alcun problema.

My understanding is that since the enclosing class cannot access members of the nested class

È sbagliato. Non solo la classe che acclude può accedere ai membri della classe nidificata, ma può anche accedervi troppi , qualcosa che non è particolarmente intuitivo in Java.

L'obiettivo delle classi nidificate è di essere in grado di creare tipi che abbiano senso solo all'interno della classe genitore. Ad esempio, se la classe A utilizza strutture dati temporanee durante l'elaborazione di alcuni dati e quelle strutture sono troppo specifiche per la classe A e non vengono mai utilizzate al di fuori di essa, la creazione di classi aggiuntive che inquinano lo spazio dei nomi è piuttosto sfortunata; invece, inseriscili nella classe A e rendili privati.

    
risposta data 20.03.2016 - 11:39
fonte

Leggi altre domande sui tag