2010-11-02 11 views
8

Ho una classe nidificata "statica privata" in Java. Qual è il significato dei modificatori di accesso per campi e metodi all'interno di questa classe? Ho provato sia pubblico che privato senza alcun effetto sulla mia applicazione.Modificatori di accesso all'interno di una classe nidificata statica privata in Java

public class MyList<T>{ 
    private static class Node{ // List node 
     private Object item; 
     private Node next; 
     private Node prev; 

     private Node(Node next){ 
      this.next = next; 
     } 

     private static Node doStuff(){} 
    } 
} 
+1

puoi postare il tuo codice e anche la tua ipotesi che cosa stai interpretando –

risposta

4

Due tipi di classi nidificate: 1. statici (classe annidata) e 2. non statici (detta anche classe interna)

Ora, classe esterna, MyList possono accedere a tutti i membri della classe interna Node, ma in realtà si utilizzano gli specificatori di accesso per i membri della classe Node (classe nidificata) quando si desidera che alcune restrizioni di alcune classi esterne accedano a tale classe.

Interessante si legge: Source1, Source2

10

Poiché si tratta di una classe annidata, tutto in Node possibile accedere MyList<T>, indipendentemente dal modificatore di accesso; poiché è una classe nidificata privata, nulla di primo dichiarato in Node sarà visibile al di fuori di MyList<T>.

Quindi, il caso in cui il modificatore di accesso può avere importanza sono i metodi che sovrascrivono un metodo di superclasse (ad esempio toString()). Non è possibile ridurre la visibilità di un metodo sottoposto a override. toString() deve sempre essere dichiarato pubblico affinché la classe possa compilare.

Si noti inoltre che quando si accede ai membri privati ​​dalla classe esterna, il compilatore crea un metodo sintetico (credo nell'ambito del pacchetto). Questo metodo sintetico è visibile solo nel file .class della classe nidificata.

+2

Buona risposta. Aggiungerei che i modificatori della classe interna sono importanti solo se la classe interna non è 'privata'. – Jorn

+0

"quando si accede ai membri privati ​​dalla classe esterna, il compilatore crea un metodo sintetico". Crea il metodo sintetico quando si accede ai membri 'statici privati ​​'della classe nidificata statica dalla classe esterna? Presumibilmente, tutti i membri statici (incluso quello delle classi nidificate statiche) vengono risolti in fase di compilazione. – andrybak

+0

@andrybak Il compilatore Java può riconoscere quando un membro privato interno è accessibile dalla classe esterna, indipendentemente dal fatto che sia statico o meno. Crea solo il metodo dell'accessorio sintetico quando è necessario. – ILMTitan

Problemi correlati