Notes sur les classes imbriquees



Qu'est qu'une classe imbriquee ?


Concretement une classe imbriquee est une classe qui repond aux deux criteres suivants:
  • elle est definie a l'interieur d'une classe.
  • elle derive d'une interface.



Exemple


Fichier test.java
public class test
{
  public static void main (String[] atgv)
  {
    Classe_Superieure cs = new Classe_Superieure(10);
    cs.ci.Affiche();
    cs.Info();
    cs.ci.SetVal(100);
    cs.ci.GetVal();

    System.out.println(" ");
    
    Classe_Superieure cs_ = new Classe_Superieure(10);
    cs_.ci.Affiche();
    cs_.Info();
    cs_.ci.SetVal(200);
    cs_.ci.GetVal();

    System.out.println(" ");
    cs_.ci.SetVal(300);
    cs.ci.GetVal();
  }
}

interface Interface
{
  final static int constante = 10;
  abstract void Affiche();
}

class Classe_Superieure
{
  int val;
  Classe_Interne ci;

  class Classe_Interne implements Interface
  {
    int val;

    Classe_Interne()
    {
      System.out.println("Creation d'une instance de \"Classe_Interne\"");
    }

    public void Affiche()
    {
      System.out.println("Appel de la methode Affiche() de la classe Interne - "+ val);
    }
    
    void SetVal(int v) { val = v; }
    void GetVal() { System.out.println("--> val = "+ val); }
  }
  
  Classe_Superieure(final int v)
  {
    System.out.println("Creation d'une instance de \"Classe_Superieure\"");
    val = v;
    ci = new Classe_Interne();
  }

  void Info()
  {
    System.out.println("valeur: " + val);
    ci.Affiche();
  }
}


A l'execution, on obtient l'affichage suivant:

C:\programmes\java>java test
Creation d'une instance de "Classe_Superieure"
Creation d'une instance de "Classe_Interne"
Appel de la methode Affiche() de la classe Interne - 0
valeur: 10
Appel de la methode Affiche() de la classe Interne - 0
--> val = 100

Creation d'une instance de "Classe_Superieure"
Creation d'une instance de "Classe_Interne"
Appel de la methode Affiche() de la classe Interne - 0
valeur: 10
Appel de la methode Affiche() de la classe Interne - 0
--> val = 200

--> val = 100





Note

La compilation du fichier test.java produit les 4 classes suivantes:
  • test.class
  • Interface.class
  • Classe_Superieure.class
  • Classe_Superieure$Classe_Interne.class

Remarquer le caractere "$" dans "Classe_Superieure$Classe_Interne.classe".


La compilation du programme ci dessous produit 5 classes:
  • Interface.class
  • Classe_Superieure.class
  • Classe_Superieure$Classe_Interne.class
  • Classe_Superieure$Classe_Interne$Interne.class


Fichier test.java
public class test
{
  public static void main (String[] atgv)
  {
    Classe_Superieure cs = new Classe_Superieure(10);
    cs.ci.Affiche();
    cs.Info();
    cs.ci.SetVal(100);
    cs.ci.GetVal();
  }
}

interface Interface
{
  final static int constante = 10;
  abstract void Affiche();
}

class Classe_Superieure
{
  int val;
  Classe_Interne ci;

  class Classe_Interne implements Interface
  {
    int val;

    Classe_Interne()
    {
      System.out.println("Creation d'une instance de \"Classe_Interne\"");
    }

    public void Affiche()
    {
      System.out.println("Appel de la methode Affiche() de la classe Interne - "+ val);
    }
    
    void SetVal(int v) { val = v; }
    void GetVal() { System.out.println("--> val = "+ val); }

    class Interne implements Interface
    {
      public void Affiche()
      {
        System.out.println("Appel de la methode Affiche() de la classe Interne de second niveau");
      }
    }
    
    
  }
  
  Classe_Superieure(final int v)
  {
    System.out.println("Creation d'une instance de \"Classe_Superieure\"");
    val = v;
    ci = new Classe_Interne();
  }

  void Info()
  {
    System.out.println("valeur: " + val);
    ci.Affiche();
  }
}