précédent | suivant | table des matières | s'évaluer |
|
1 Classe interne.
Le langage Java autorise la définition d’une classe à l’intérieur d’une autre classe :
class Englobante { int a; class Englobee{ . . . Englobante.this.a = 12 } . . . }
Un des intérêts de cette notation est qu’une classe interne peut avoir accès aux méthodes est attributs de la classe englobante.
Comme les attributs et les méthodes les classes internes ont :
class A { private class B{ int c; . . . } . . . B b = new B(); } A a = newA(); a.b.c = … ; // b est non visible a.b.getClass(); // b est non visible
Les créations d’instances se font de la façon suivante :
Classe interne static | Class interne non static |
public class A { int a = 321; static class B{ int b = 123; } } |
public class A { int a = 321; class B{ int b = 123; } } |
A a = new A(); A.B b = new A.B(); |
A a = new A(); A.B b = a.new B(); |
Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis le nom de la classe interne, puis “.class” : exemple : A$B.class
2 Classe locale.
Une classe interne définie dans un bloc est une classe interne dont la portée est limitée au bloc : c’est une classe interne locale. Une classe locale ne peut pas être static. Une classe locale peut accéder aux attributs de la classe englobante ainsi qu'aux paramètres et variable locales de la méthode où elle est définie, à condition que ceux-ci soit spécifiés final.
Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis un nombre, puis le nom de la classe interne, puis “.class” : exemple :
public class A { public A() { class L{ … } } … } |
Génère A$1L.class |
3 Classe anonyme.
Il est possible de définir une classe interne, sans lui donner de nom par dérivation d’un super classe, ou par implémentation d’une interface.
Dérivation de super classe | Implémentation d’interface |
SuperClasse c = new SuperClasse( ){
// méthodes redéfinies
}; |
Interface c = new Interface(){
// implementation des
// méthodes de Interface
}; |
Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis un nombre puis “.class”.
Les classes anonymes sont (surtout) utilisées pour implémenter les méthodes d’une interface Listener.
Exemple :
jTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent e) {
...
}
});