Sobes.tech
Middle

Qual è la differenza tra classi annidate (nested) e classi interne (inner) in Java?

sobes.tech AI

Risposta dell'AI

  • Classi annidate (Nested classes): Membri statici della classe esterna. Non hanno accesso diretto ai membri non statici (campi e metodi) della classe esterna, solo tramite un'istanza della classe esterna. Sono dichiarate con la parola chiave static.

  • Classi interne (Inner classes): Membri non statici della classe esterna. Hanno accesso completo a tutti i membri (statici e non statici) della classe esterna, inclusi quelli privati. Per creare un'istanza di una classe interna, è necessaria un'istanza della classe esterna. Non usano la parola chiave static.

Esempio:

// Classe esterna
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Classe annidata statica
    static class StaticNestedClass {
        void display() {
            // Accesso solo ai membri statici della classe esterna
            System.out.println("Nested statico: " + staticOuterField);
            // Nessun accesso diretto a outerField
            // System.out.println(outerField); // Errore di compilazione
        }
    }

    // Classe interna non statica
    class InnerClass {
        void display() {
            // Accesso a tutti i membri della classe esterna
            System.out.println("Interna: " + outerField);
            System.out.println("Interna (statica): " + staticOuterField);
        }
    }
}

// Utilizzo
public class Main {
    public static void main(String[] args) {
        // Creazione di un'istanza della classe annidata statica
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Creazione di un'istanza della classe interna richiede un'istanza della classe esterna
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Caratteristica Classe annidata (Nested Class) Classe interna (Inner Class)
Parola chiave static No
Accesso ai membri della classe esterna Solo statici Tutti
Richiede un'istanza della classe esterna per creare un'istanza No
Connessione con l'istanza della classe esterna No