Java LanguageClassi nidificate e interiori


introduzione

Usando Java, gli sviluppatori hanno la possibilità di definire una classe all'interno di un'altra classe. Tale classe è chiamata classe annidata . Le classi nidificate sono chiamate classi interne se sono state dichiarate non statiche, in caso contrario vengono semplicemente denominate classi nidificate statiche. Questa pagina è per documentare e fornire dettagli con esempi su come utilizzare le classi nidificate e interne di Java.

Sintassi

  • public class OuterClass {public class InnerClass {}} // Le classi interne possono anche essere private
  • public class OuterClass {public static class StaticNestedClass {}} // Le classi nidificate statiche possono anche essere private
  • public void method () {classe privata LocalClass {}} // Le classi locali sono sempre private
  • SomeClass anonymousClassInstance = new SomeClass () {}; // Le classi interne anonime non possono essere nominate, quindi l'accesso è discutibile. Se 'SomeClass ()' è astratto, il corpo deve implementare tutti i metodi astratti.
  • SomeInterface anonymousClassInstance = new SomeInterface () {}; // Il corpo deve implementare tutti i metodi di interfaccia.

Osservazioni

Terminologia e classificazione

La JLS (Java Language Specification) classifica i diversi tipi di classe Java come segue:

Una classe di primo livello è una classe che non è una classe nidificata.

Una classe annidata è una classe la cui dichiarazione si verifica all'interno del corpo di un'altra classe o interfaccia.

Una classe interna è una classe nidificata che non è dichiarata in modo esplicito o implicito statico.

Una classe interna può essere una classe membro non statica , una classe locale o una classe anonima . Una classe membro di un'interfaccia è implicitamente statica, quindi non è mai considerata una classe interiore.

In pratica i programmatori si riferiscono a una classe di livello superiore che contiene una classe interna come "classe esterna". Inoltre, c'è una tendenza ad usare "classe nidificata" per riferirsi solo a classi nidificate statiche (esplicitamente o implicitamente).

Si noti che esiste una stretta relazione tra le classi interne anonime e le lambda, ma le lambda sono classi.

Differenze semantiche

  • Le classi di livello superiore sono il "caso base". Sono visibili ad altre parti di un programma soggette a normali regole di visibilità basate sulla semantica del modificatore di accesso. Se non astratti, possono essere istanziati da qualsiasi codice che mostra dove i costruttori rilevanti sono visibili in base ai modificatori di accesso.

  • Le classi nidificate statiche seguono le stesse regole di accesso e istanziazione delle classi di primo livello, con due eccezioni:

    • Una classe nidificata può essere dichiarata come private , il che la rende inaccessibile al di fuori della classe di livello superiore che la racchiude.
    • Una classe nidificata ha accesso ai membri private della classe di livello superiore che la include e di tutta la sua classe testata.

    Ciò rende le classi nidificate statiche utili quando è necessario rappresentare più "tipi di entità" all'interno di uno stretto limite di astrazione; ad esempio quando le classi nidificate vengono utilizzate per nascondere "dettagli di implementazione".

  • Le classi interne aggiungono la possibilità di accedere a variabili non statiche dichiarate negli ambiti che racchiudono:

    • Una classe membro non statica può fare riferimento a variabili di istanza.
    • Una classe locale (dichiarata all'interno di un metodo) può anche fare riferimento alle variabili locali del metodo, a condizione che siano final . (Per Java 8 e versioni successive, possono essere effettivamente definitive .)
    • Una classe interna anonima può essere dichiarata all'interno di una classe o di un metodo e può accedere alle variabili in base alle stesse regole.

    Il fatto che un'istanza di classe interna possa fare riferimento a variabili in un'istanza di classe che include ha implicazioni per l'istanziazione. In particolare, deve essere fornita un'istanza di inclusione, implicitamente o esplicitamente, quando viene creata un'istanza di una classe interna.

Classi nidificate e interiori Esempi correlati