Sobes.tech
Middle

Quels sont les types de classes imbriquées dans le langage de programmation?

sobes.tech IA

Réponse de l'IA

Classes imbriquées en Java:

  1. Classes imbriquées statiques (Static Nested Classes) : Se comportent comme des membres statiques normaux de la classe. N'ont pas accès aux membres non statiques de la classe externe. Sont créées sans instance de la classe externe.

    public class Outer {
        private static String staticMsg = "Message statique";
        private String instanceMsg = "Message d'instance";
    
        static class StaticNested {
            void displayStatic() {
                // Accès aux membres statiques de la classe externe
                System.out.println(staticMsg);
                // Pas d'accès aux membres non statiques de la classe externe
                // System.out.println(instanceMsg); // Erreur de compilation
            }
        }
    }
    
  2. Classes internes (Inner Classes) : Liées à une instance de la classe externe. Ont un accès complet à tous les membres (statiques et non-statiques) de la classe externe, y compris privés. Peuvent être déclarées private, protected, package-private ou public.

    public class Outer {
        private static String staticMsg = "Message statique";
        private String instanceMsg = "Message d'instance";
    
        class Inner {
            void display() {
                // Accès aux membres statiques et non-statiques de la classe externe
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Classes locales (Local Classes) : Déclarées à l'intérieur d'un bloc (méthode, constructeur ou initialisateur statique). Disponibles uniquement dans ce bloc. Peuvent accéder aux variables locales et paramètres du bloc qui sont final ou effectifs final, ainsi qu'à tous les membres de la classe externe.

    public class Outer {
        private String instanceMsg = "Message d'instance";
    
        void methodWithLocalClass() {
            final String localVar = "Variable locale"; // ou effectif `final`
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Classes anonymes (Anonymous Classes) : Sont des classes locales sans nom. Utilisées pour déclarer et créer une instance d'une classe en même temps, qui implémente une interface ou étend une classe. Utile pour créer de petits objets à usage unique.

    public class Outer {
        void methodWithAnonymousClass() {
            // Classe anonyme implémentant l'interface Runnable
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Exécution depuis classe anonyme");
                }
            };
            new Thread(myRunnable).start();
    
            // Classe anonyme étendant la classe Thread
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Exécution depuis classe anonyme étendant Thread");
                }
            };
            myThread.start();
        }
    }
    

Comparaison des types de classes imbriquées:

Type de classe Lieu de déclaration Accès aux membres de la classe externe Nécessite une instance de la classe externe pour la créer Modificateurs d'accès
Classe imbriquée statique À l'intérieur de la classe, avec le mot-clé static. Seulement aux membres statiques. Non Tous
Classe interne À l'intérieur de la classe (non statique). À tous (statiques et non-statiques). Oui Tous
Classe locale À l'intérieur d'un bloc (méthodes, constructeurs, initialisateurs). À tous les membres de la classe externe + variables locales final ou effectives final. Oui Non (final ou abstract implicite)
Classe anonyme À l'intérieur d'un bloc (expression). À tous les membres de la classe externe + variables locales final ou effectives final. Oui Non