Sobes.tech
Middle

Quelle est la différence entre les classes imbriquées (nested) et les classes internes (inner) en Java?

sobes.tech IA

Réponse de l'IA

  • Classes imbriquées (Nested classes) : Membres statiques de la classe externe. N'ont pas accès directement aux membres non statiques (champs et méthodes) de la classe externe, seulement via une instance de la classe externe. Déclarées avec le mot-clé static.

  • Classes internes (Inner classes) : Membres non statiques de la classe externe. Ont un accès complet à tous les membres (statiques et non statiques) de la classe externe, y compris privés. Pour créer une instance d'une classe interne, une instance de la classe externe est nécessaire. N'utilisent pas le mot-clé static.

Exemple :

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

    // Classe imbriquée statique
    static class StaticNestedClass {
        void display() {
            // Accès uniquement aux membres statiques de la classe externe
            System.out.println("Nested statique : " + staticOuterField);
            // Pas d'accès direct à outerField
            // System.out.println(outerField); // Erreur de compilation
        }
    }

    // Classe interne non statique
    class InnerClass {
        void display() {
            // Accès à tous les membres de la classe externe
            System.out.println("Interne : " + outerField);
            System.out.println("Interne (statique) : " + staticOuterField);
        }
    }
}

// Utilisation
public class Main {
    public static void main(String[] args) {
        // Création d'une instance de la classe imbriquée statique
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Création d'une instance de la classe interne nécessite une instance de la classe externe
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Caractéristique Classe imbriquée (Nested Class) Classe interne (Inner Class)
Mot-clé static Non
Accès aux membres de la classe externe Seulement statiques Tous
Nécessite une instance de la classe externe pour créer une instance Non Oui
Lien avec l'instance de la classe externe Non Oui