Sobes.tech
Middle

Quels sont les types de classes imbriquées?

sobes.tech IA

Réponse de l'IA

Classes internes statiques et classes internes (classes internes non statiques).

  • Classes internes statiques :

    • Déclarées avec le mot-clé static.
    • N'ont accès qu'aux membres statiques (champs et méthodes) de la classe externe, y compris les privés.
    • N'ont pas accès direct aux membres non statiques de la classe externe.
    • Peuvent être instanciées sans instance de la classe externe.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Var statique : " + staticVar);
                // System.out.println("Var d'instance : " + instanceVar); // Erreur de compilation
            }
        }
    }
    
  • Classes internes (classes internes non statiques) :

    • Déclarées sans le mot-clé static.
    • Ont un accès complet à tous les membres (statiques et non-statiques) de la classe externe, y compris privés.
    • Ne peuvent pas contenir de membres statiques (champs ou méthodes), sauf les constantes finales.
    • Nécessitent une instance de la classe externe pour leur création.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Var statique : " + staticVar);
                System.out.println("Var d'instance : " + instanceVar);
            }
        }
    }
    
  • Classes locales :

    • Déclarées à l'intérieur de méthodes, constructeurs ou blocs d'initialisation.
    • Ont accès à toutes les variables locales finales et effectivement finales, ainsi qu'aux membres de la classe externe dans laquelle elles sont définies.
    • Leur portée est limitée au bloc dans lequel elles sont déclarées.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Effectivement final
    
            class LocalInner {
                void display() {
                    System.out.println("Var locale : " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Classes anonymes :

    • Classes locales sans nom.
    • Créées et instanciées simultanément.
    • Souvent utilisées pour créer des implémentations d'interfaces ou étendre des classes.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Faire quelque chose de manière anonyme.");
                }
            };
            anon.doSomething();
        }
    }
    

Principales différences entre classes internes statiques et classes internes :

Caractéristique Classe interne statique Classe interne
Mot-clé static Absente
Accès aux membres Seulement aux membres statiques de la Tous les membres de la classe
classe externe externe
Création d'instance Sans instance de la classe externe Nécessite une instance de la classe externe
Membres statiques Peuvent contenir Ne peuvent pas contenir (sauf constantes)