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 } } } - Déclarées avec le mot-clé
-
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); } } } - Déclarées sans le mot-clé
-
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) |