Finora abbiamo visto ed utilizzato solo classi top level ovvero ad ogni classe, abbiamo dedicato un file a parte. Questa pratica, non è obbligatoria introduciamo infatti ora, le classi di tipo nested class: ovvero classi interne ad altre classi.

Queste nested class, possono essere di tipo static oppure non-static: nel secondo caso, vengono chiamate inner class.

Vediamo subito come si crea una inner class, in modo da spiegarla più facilmente:

public class Casa
{
    private String nome;
    public Casa(String nome)
    {
        this.nome = nome;
    }
    public String getNome()
    {
        return nome;
    }
    public class Stanze
    {
        private int numeroStanze=2;
        public String getStanzeENome()
                { 
                     return Casa.this.nome+ " ha una casa con " + numeroStanze +" stanze.";
                }
        public int getNumeroStanze(){ return this.numeroStanze;}
    }
    public static void main(String[] args)
       {
        Casa home = new Casa("Federico");
        Casa.Stanze room = home.new Stanze();
        System.out.println(room.getNumeroStanze()); //Printa 2
        System.out.println(room.getStanzeENome()); //Printa Federico ha una casa con 2 stanze.
       }
}

Per poter istanziare un oggetto della inner class dobbiamo prima istanziare un oggetto della classe top level.

Nell’esempio, abbiamo prima definito la classe toplevel Casa, una inner class Stanze che ha come attributo numeroStanze=2 e un metodo getStanze che restituisce questo numero.

Nel main di Casa, abbiamo prima di tutto istanziato un’oggetto della top level Casa (home); Poi abbiamo istanziato un oggetto della inner class:

Casa.Stanze room = home.new Stanze();

E poi infine abbiamo stampato a video il numero di stanze.

Dalla classe interna, possiamo accedere a tutte le variabili e metodi della classe superiore: a patto di usare questa sintassi:

return Casa.this.nome+ " ha una casa con " + numeroStanze +" stanze.";

Quindi la sintassi è  nomeClasseToplevel.this.variabile (o metodo) a cui vogliamo accedere.

Notate che le inner class hanno accesso anche ai campi privati della classe top level.

Le nested class statiche

Le classi nested class statiche si comportano come i metodi statici: non c’è bisogno di istanziare prima la classe top level, in quanto non contengono nessun riferimento ad esse.

Sono accessibili dall’ esterno semplicemente usando come sintassi new nomeClasse.nestedClass, e in pratica sono classi top level inserite in classi top level (dal lato del comportamento).

Una differenza con le inner class, è che queste non hanno accesso ai membri della classe top level in quanto come appena detto non contengono nessun riferimento ad esse (come metodi statici).

Perche le nested class

Le nested class le usiamo quando vogliamo organizzare meglio il codice, mettendo insieme una classe che viene usata solo da un’altra classe.

Quindi per rendere il codice più pulito e logicamente più ordinato.