Retour au cours

Exploration des classes internes, imbriquées et anonymes

Maîtrise de Java : De Zéro à Développeur Professionnel (Un parcours en 50 leçons)

Leçon 31 : Exploration des classes internes, imbriquées et anonymes

Java permet de définir une classe à l'intérieur d'une autre classe. Cela aide à regrouper des classes logiquement liées et augmente l'encapsulation.

1. Classes imbriquées

Une classe définie à l'intérieur d'une autre classe est appelée une classe imbriquée. Elles sont divisées en deux catégories principales :

A. Classes imbriquées statiques (Static Nested Classes)

  • Déclarées avec le mot-clé static.
  • Elles se comportent comme des membres statiques : on peut y accéder sans une instance de la classe externe.
  • Elles ne peuvent accéder qu'aux membres statiques de la classe externe.

java public class Outer { static class StaticNested { // Accède uniquement aux membres statiques de Outer } } // Accès : Outer.StaticNested nested = new Outer.StaticNested();

B. Classes internes (Inner Classes - Non-statiques)

  • Ne peuvent pas être déclarées statiques.
  • Elles sont associées à une instance de la classe externe.
  • Elles ont accès à tous les membres (statiques et non statiques, même privés) de la classe externe.

java public class Outer { private int x = 10; class Inner { void display() { System.out.println("Outer x = " + x); // Accède au membre privé 'x' } } } // Pour créer un objet Inner, vous avez d'abord besoin d'un objet Outer : // Outer.Inner inner = new Outer().new Inner();

2. Classes locales

Définies à l'intérieur d'une méthode ou d'un bloc. Leur portée est strictement limitée à ce bloc.

3. Classes anonymes

Une classe sans nom, utilisée lorsque vous avez besoin de créer un objet d'une classe (ou interface) qui ne sera utilisé qu'une seule fois.

java interface Printable { void print(); }

public class Example { public void doPrint() { // Classe anonyme implémentant Printable Printable p = new Printable() { @Override public void print() { System.out.println("Impression via une classe anonyme."); } }; p.print(); } }