Lezione di Java 29 – Le classi Inner

Indice Lezione PrecedenteLezione Successiva


Le classi interne, dette classi inner, sono la soluzione che offre Java alle classi annidate. Questo tipo di classi offrono una maggiore chiarezza al programma e, come le interfacce, rappresentano una possibile soluzione al problema dell’eredità multipla.

La particolarità delle classi interne sta proprio nel loro nome, sono dichiarate all’interno di altre classi, tra queste possiamo distinguere:

  • Classi dichiarate all’interno della classe;
  • Classi dichiarate all’interno di un metodo.


Nel primo caso avremo che le classi possono avere qualsiasi modificatore di accesso, il loro significato non varia, se una classe interna è dichiarata private, le sottoclassi delle classe esterna non possono vederla (viene tratta come se fosse un metodo).

public class Esterna {
  private int x;

  public class Interna {
    private int y;
    public void metodoInterno() {
      //...
    }
  }
}


I nomi completi delle classi sono Esterna ed Esterna.Interna (quest’ultimo nome è solo all’interno di Java, sul disco il nome sarà Esterna$Interna). Per poter avere un’istanza della classe interna, se non dichiarata static, bisogna avere un’istanza della classe Esterna, la creazione può avvenire nel seguente modo:

Esterna.Interna a = new Esterna().new Interna();

Se la classe interna è dichiarata static, è possibile creare un’istanza della stessa direttamente in questo modo:

new Esterna.Interna ();

Nel secondo caso, la classe interna è scritto all’interno di un metodo e come accade per gli attributi, essendo locali, non possono avere modificatori di accesso (tranne abstract e final). Una particolarità di questo tipo di classi è che possono utilizzare solo gli elementi marcati final del metodo che la include, oltre a quelli della classe esterna. Vediamo un esempio:

public class Esterna {
  private int x = 0;
  public int y = 0;

  public void metodo(int a, final int b) {
    int c = a;
    final int d = a + b;

    class Interna {
      public void metodoInterno() {
        System.out.println("x=" + x); // Ok, è esterna alla classe interna
        System.out.println("y=" + y); // Ok, è esterna alla classe interna
        System.out.println("a=" + a); // Illegale, non è marcata final
        System.out.println("b=" + b); // Ok, è marcato final
        System.out.println("c=" + c); // Illegale, non è marcata final
        System.out.println("d=" + d); // Ok, è marcato final
      }
    }
    Interna punt = new Interna();
    punt.metodo();
  }
}

Ti piace l’articolo?
Diventa fan su Facebook
Indice Lezione PrecedenteLezione Successiva
Pubblicato in Guide, Guide, Java, Programmazione Taggato con: , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*