Programmation Java/Classes internes
Une classe interne est déclarée à l'intérieur d'une autre classe.
Elle peut donc accéder aux membres de la classe externe.
Classe interne statique.
Une classe interne statique ne peut accéder qu'aux membres statiques de sa classe contenante, représentée par "ClassExterne" dans l'exemple suivant :
public class ClasseExterne
 private int compteur = 0;
 private static String nom = "Exemple";
 static class ClasseInterne
 private int index = 0;
 public ClasseInterne()
 System.out.println("Création d'un objet dans "+nom);
 // compteur ne peut être accedé
La compilation du fichier codice_1 produit deux fichiers compilés :
Classe interne non statique.
Une classe interne non statique peut accéder aux membres statiques de la classe ainsi qu'aux membres de l'objet qui l'a créée.
En fait, le compilateur crée un membre supplémentaire dans la classe interne référençant l'objet qui l'a créé.
Une telle classe interne peut être déclarée de manière globale dans l'objet ; elle sera accessible par l'ensemble des méthodes de l'objet.
Elle peut aussi être déclarée de manière locale à une méthode de l'objet.
Elle sera alors accessible depuis cette seule méthode.
Exemple (Classe non statique globale) :
public class ClasseExterne
 private int compteur = 0;
 class ClasseInterne
 private int index = 0;
 public ClasseInterne()
 compteur++;
Référence aux membres de la classe englobante.
Depuis la classe interne, dans le cas où plusieurs variables ou méthodes portent le même nom dans la classe interne et la classe externe, le pointeur codice_6 seul désigne l'instance de la classe interne, tandis que le pointeur codice_6 précédé du nom de la classe externe désigne l'instance de la classe externe.
public class ClasseExterne
 private int compteur = 10;
 class ClasseInterne
 private int compteur = 0;
 public void count()
 this.compteur++; // -> 1
 ClasseExterne.this.compteur--; // -> 9
Instanciation.
Les méthodes non-statiques de la classe englobante peuvent instancier la classe interne directement :
public class ClasseExterne
 class ClasseInterne
 // ...
 public void action()
 ClasseInterne obj = new ClasseInterne();
Tandis qu'une méthode statique (pas d'instance codice_6 de la classe externe) ou une méthode définie dans une autre classe doit utiliser une instance de la classe externe pour préfixer l'opérateur codice_9 :
public class ClasseExterne
 class ClasseInterne
 // ...
 public static void main(String[] args)
 ClasseExterne ext = new ClasseExterne();
 ClasseInterne obj = ext.new ClasseInterne();
Les méthodes non-statiques de la classe englobante peuvent également instancier la classe interne de cette manière pour que l'instance soit liée à une instance de la classe externe autre que codice_6.
Accès.
Comme tous les membres de la classe externe, la déclaration des classes internes peut être préfixée par un Modificateur d'accès :
public class ClasseExterne
 private class ClasseInterne
 // ...
 public void action()
 ClasseInterne obj = new ClasseInterne();
Classe anonyme.
Une classe peut être déclarée au moment de l'instanciation de sa classe parente.
On parle alors de classe anonyme.
Exemple :
public class ClasseExterne
 Bissextile b = new Bissextile()
 public boolean evaluer(int annee)
 if ((annee%4==0 && annee%100!=0) || annee%400==0) 
 return true;
 else
 return false;
 };
 public static void main(String args[])
 int an = Integer.parseInt(args[0]);
 if (b.evaluer(an))
 System.out.println("L'année entrée est bissextile");
 else
 System.out.println("L'année entrée n'est pas bissextile");
La classe Bissextile est ici la classe mère d'une classe anonyme. Cette classe sera automatiquement nommée par le compilateur codice_15. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa déclaration.
Cette méthode de création de sous-classe peut également s'appliquer aux interfaces. En utilisant la syntaxe suivante, la classe anonyme créée implémente l'interface spécifiée :
 new "Interface"()
 "...implémentation des méthodes de l'interface..."
Remarques :

Programmation Java/Processus légers et synchronisation