Java consente di scrivere classi all’interno di altre classi - classi annidate, nested class. Le nested class possono essere:
static
non-static
- vengono dette inner class.
inner class
- possono essere
public
,protected
oprivate
. - per poter creare un oggetto della inner class è necessario istanziare un oggetto della classe top-level che la contiene.
- ciascuna classe interna ha un riferimento implicito all’oggetto della classe che la contiene
- dalla classe interna è possibile accedere a tutte le variabili e metodi della classe esterna.
Per istanziare la classe interna da quella esterna è sufficiente new
.
Per istanziare la classe interna da un’altra classe si usa la sintassi:
riferOggClassEsterna.new ClasseInterna()
L’accesso a campi e metodi degli oggetti di classe interna e esterna avviene normalmente.
disambiguare
In casi di ambiguità come campi con lo stesso nome:
- se dalla classe interna viene usato
this
, si fa riferimento a campi e metodi di quella classe- per far riferimento alla classe esterna - prima di
this
si inserisce il nome della classe esterna e un punto (Classe.this
)
classi annidate statiche
Se la classe interna è statica, essa non richiede l’esistenza di un oggetto della classe esterna e non ha un riferimento implicito ad essa.
- come per i metodi statici, non ha accesso allo stato degli oggetti della classe esterna. A livello di comportamento, sono equivalenti a classi top-level inserite in altre classi top-level.
Sono accessibili con la sintassi:
new ClassEsterna.ClasseAnnidataStatica()
why?
- raggruppamento logico delle classi (se due classi sono utili solo una per l’altra, ha senso raggrupparle)
- incapsulamento (una classe B annidata può essere nascosta all’esterno)
- codice più leggibile e mantainability