Middle
Quali sono i tipi di classi annidate?
sobes.tech AI
Risposta dell'AI
Classi annidate statiche e classi interne (classi annidate non statiche).
-
Classi annidate statiche:
- Sono dichiarate con la parola chiave
static. - Hanno accesso solo ai membri statici (campi e metodi) della classe esterna, inclusi quelli privati.
- Non hanno accesso diretto ai membri non statici della classe esterna.
- Possono essere istanziate senza un'istanza della classe esterna.
class Outer { private static int staticVar = 10; private int instanceVar = 20; static class StaticNested { void display() { System.out.println("Variabile statica: " + staticVar); // System.out.println("Variabile di istanza: " + instanceVar); // Errore di compilazione } } } - Sono dichiarate con la parola chiave
-
Classi interne (classi interne non statiche):
- Sono dichiarate senza la parola chiave
static. - Hanno accesso completo a tutti i membri (statici e non statici) della classe esterna, inclusi quelli privati.
- Non possono contenere membri statici (campi o metodi), tranne costanti finali.
- Richiedono un'istanza della classe esterna per essere create.
class Outer { private static int staticVar = 10; private int instanceVar = 20; class Inner { void display() { System.out.println("Variabile statica: " + staticVar); System.out.println("Variabile di istanza: " + instanceVar); } } } - Sono dichiarate senza la parola chiave
-
Classi locali:
- Sono dichiarate all'interno di metodi, costruttori o blocchi di inizializzazione.
- Hanno accesso a tutte le variabili locali finali e effective final, così come ai membri della classe esterna in cui sono definite.
- La loro visibilità è limitata al blocco in cui sono dichiarate.
class Outer { void myMethod() { final int localVar = 5; // Effective final class LocalInner { void display() { System.out.println("Variabile locale: " + localVar); } } LocalInner local = new LocalInner(); local.display(); } } -
Classi anonime:
- Classi locali senza nome.
- Sono create e istanziate contemporaneamente.
- Sono spesso usate per creare implementazioni di interfacce o estendere classi.
interface MyInterface { void doSomething(); } class Outer { void myMethod() { MyInterface anon = new MyInterface() { @Override public void doSomething() { System.out.println("Fare qualcosa in modo anonimo."); } }; anon.doSomething(); } }
Principali differenze tra classi interne statiche e classi interne:
| Caratteristica | Classe interna statica | Classe interna |
|---|---|---|
| Parola chiave | static |
Assente |
| Accesso ai membri | Solo ai membri statici della | Tutti i membri della classe |
| classe esterna | esterna | |
| Creazione di istanze | Senza un'istanza della classe esterna | Richiede un'istanza della classe esterna |
| Membri statici | Possono contenerli | Non possono contenerli (tranne costanti) |