Sobes.tech
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
            }
        }
    }
    
  • 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);
            }
        }
    }
    
  • 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)