# Programmation Java/Classes internes

* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
[ Modifier le sommaire ]
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 :
La compilation du fichier ClasseExterne.java produit deux fichiers compilés :
* ClasseExterne.class contient la classe ClasseExterne uniquement
* ClasseExterne$ClasseInterne.class contient la classe ClasseInterne

## 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) :

### 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 this seul désigne l'instance de la classe interne, tandis que le pointeur this précédé du nom de la classe externe désigne l'instance de la classe externe.

### Instanciation

Les méthodes non-statiques de la classe englobante peuvent instancier la classe interne directement :
Tandis qu'une méthode statique (pas d'instance this 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 new :
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 this.

## 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 : Toutes les classes peuvent utiliser la classe interne.
* protected : Seules les sous-classes et les classes du même paquetage peuvent utiliser la classe interne.
* : (vide = paquetage) Seules les classes du même paquetage peuvent utiliser la classe interne.
* private : Seule la classe externe peut utiliser la classe interne.

## 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 :
La classe Bissextile est ici la classe mère d'une classe anonyme. Cette classe sera automatiquement nommée par le compilateur ClasseExterne$1. 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 :
Remarques :
* Une classe anonyme est implicitement considérée comme final (et ne peut donc pas être abstract, abstraite).
* Une classe anonyme ne peut pas contenir de constructeur. Le constructeur appelé est celui qui correspond à l'instruction d'instanciation. Toutefois, elle peut avoir des blocs d'initialisation.
* Une classe anonyme ne possède pas d'identificateur et ne peut donc être instanciée qu'une seule fois (d'où son nom).