« Programmation Java/Classes internes » : différence entre les versions

aucun résumé des modifications
m (Révocation des modifications de 194.153.88.133 (discussion) vers la dernière version de JackPotte)
Balises : Révocation SWViewer [1.3]
Aucun résumé des modifications
 
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 :
<sourcesyntaxhighlight lang="java">
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é
}
}
}
}
}
</syntaxhighlight>
</source>
La compilation du fichier <code>ClasseExterne.java</code> produit deux fichiers compilés :
* <code>ClasseExterne.class</code> contient la classe <code>ClasseExterne</code> uniquement
 
Exemple (Classe non statique globale) :
<sourcesyntaxhighlight lang="java">
public class ClasseExterne
{
private int compteur = 0;
 
class ClasseInterne
{
{
private int index = 0;
public ClasseInterne()
{
{
compteur++;
}
}
}
}
}
</syntaxhighlight>
</source>
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 <code>this</code> seul désigne l'instance de la classe interne, tandis que le pointeur <code>this</code> précédé du nom de la classe externe désigne l'instance de la classe externe.
<sourcesyntaxhighlight lang="java">
public class ClasseExterne
{
private int compteur = 10;
 
class ClasseInterne
{
{
private int compteur = 0;
public void count()
{
{
this.compteur++; // -> 1
ClasseExterne.this.compteur--; // -> 9
}
}
}
}
}
</syntaxhighlight>
</source>
 
== 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 :
On parle alors de classe anonyme.
<source lang="java">
Exemple :
public class ClasseExterne {
<sourcesyntaxhighlight lang="java">
Bissextile b = new Bissextile() {
public class ClasseExterne {
public boolean evaluer(annee) {
{
if ((annee%4==0 && annee%100!=0) || annee%400==0) {
Bissextile b = new Bissextile() {
return true;
{
} else {
public boolean evaluer(annee) {
return false;
{
}
if ((annee%4==0 && annee%100!=0) || annee%400==0) {
}
return true;
};
else
public static void main(String args[]) {
return false;
long an = Long.parseLong(args[0]);
}
if (b.evaluer(an)) {
};
System.out.println("L'année entrée est bissextile");
public static void main(String args[]) {
} else {
{
System.out.println("L'année entrée n'est pas bissextile");
long an = Long.parseLong(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");
}
}
</syntaxhighlight>
</source>
La classe Bissextile est ici la classe mère d'une classe anonyme. Cette classe sera automatiquement nommée par le compilateur <code>ClasseExterne$1</code>. Il convient d'observer le point-virgule qui suit l'accolade fermante de sa déclaration.