« Programmation Java/Classes internes » : différence entre les versions
Classes anonymes |
|||
Ligne 68 : | Ligne 68 : | ||
Une classe peut être déclarée au moment de son instanciation. On parle alors de classe anonyme. Exemple : |
Une classe peut être déclarée au moment de son instanciation. On parle alors de classe anonyme. Exemple : |
||
⚫ | |||
<tt> |
|||
Bisextile b = new Bisextile() { |
|||
⚫ | |||
public boolean evaluer(annee) { |
|||
if ((annee%4==0 && annee%100!=0) || annee%400==0) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
}; |
|||
⚫ | |||
⚫ | |||
long an = Long.parseLong(args[0]); |
|||
if (b.evaluer(an)) { |
|||
⚫ | |||
System.out.println("L'année entrée est bisextile"); |
|||
} else { |
|||
System.out.println("L |
System.out.println("L"année entrée n'est pas bisextile"); |
||
} |
} |
||
⚫ | |||
System.out.println("L"année entrée n'est pas bisextile"); |
|||
⚫ | |||
} |
|||
} |
|||
⚫ | |||
</tt> |
|||
La classe Bisextile est ici une classe anonyme. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa déclaration. |
La classe Bisextile est ici une classe anonyme. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa déclaration. |
Version du 10 septembre 2006 à 21:31
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 la classe externe.
Exemple :
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 ClasseExterne.java
produit deux fichiers compilés :
ClasseExterne.class
contient la classeClasseExterne
uniquementClasseExterne$ClasseInterne.class
contient la classeClasseInterne
Classe interne non statique
Une classe interne non statique peut accéder aux membres statique de la classe ainsi qu'au membres de l'objet qui l'a créé. En fait, le compilateur créé un membre supplémentaire dans la classe interne référençant l'objet qui la crée.
Exemple :
public class ClasseExterne { private int compteur = 0; class ClasseInterne { private int index = 0; public ClasseInterne() { compteur++; } } }
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.
public class ClasseExterne { private int compteur = 10; class ClasseInterne { private int compteur = 0; public void count() { this.compteur++; ClasseExterne.this.compteur--; } } }
Classe anonyme
Une classe peut être déclarée au moment de son instanciation. On parle alors de classe anonyme. Exemple :
public class ClasseExterne { Bisextile b = new Bisextile() { public boolean evaluer(annee) { if ((annee%4==0 && annee%100!=0) || annee%400==0) { return true; } else { return false; } } }; public static void main(String args[]) { long an = Long.parseLong(args[0]); if (b.evaluer(an)) { System.out.println("L'année entrée est bisextile"); } else { System.out.println("L"année entrée n'est pas bisextile"); } } }
La classe Bisextile est ici une classe anonyme. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa déclaration.
Remarques :
- Une classe anonyme est implicitement considérée comme final (et ne peut donc pas être abstract).
- Une classe anonyme ne peut pas contenir de constructeur. Le seul constructeur est le contructeur fournit par le langage.
- Une classe anonyme ne peut pas être abstraite.
- Une classe anonyme ne possède pas d'identificateur et ne peut donc être instanciée qau'une seule fois (d'où son nom).