IFT1025 Mikl´os Cs˝ur¨os 25 janvier 2011
5 Classes imbriqu´
ees
En Java, on peut d´
efinir des classes imbriqu´
ees (nested class) : il s’agit d’une classe dont la d´
eclaration se trouve
dans le corps d’une autre classe (outer class). La classe externe a acc`
es `
a tous les membres d’une classe imbriqu´
ee (mˆ
eme
ceux d´
eclar´
es priv´
es). La classe imbriqu´
ee peut ˆ
etre statique : dans ce cas-l`
a il s’agit d’une conv´
enience de d´
efinir une
hi´
erarchie. L’exemple ci-dessous d´
efinit la classe statique java.awt.geom.Point2D.Float. La classe peut utiliser les
m´
ethodes de la classe imbriquante selon les r`
egles d’acc`
es dans une m´
ethode statique.
package java.awt.geom;
public class Point2D
{
protected Point2D(){...}; // pas d’instanciation directe
... // m´ethodes de la classe
public static class Float extends Point2D // classe statique imbriqu´ee
{
public Float(){...}; // instanciation OK
}
5.1 Classe int´
erieure
Une possibilit´
e puissante est d’utiliser des classes imbriqu´
ees non-statiques : elles sont les classes int´
erieures (inner
class). Une classe int´
erieure est le membre d’une instance de la classe imbriquante. Une classe int´
erieure peut ˆ
etre locale
ou anonyme : voir plus tard ici.
public class Outer
{
private int x; // membre d’une instance
public class Inner
{
private void increaseX() // acc`es `a l’instance ext´erieure
{ x++; }
}
private void methode()
{
Inner inn = new Inner(); // associ´e avec cette instance (this)
}
public static void main(String[] args)
{
Outer ext = new Outer();
Outer.Inner inn = ext.new Inner(); // instance Outer
}
}
?r`
egles d’acc`
es : comme une m´
ethode dynamique
?pas de membres statiques dans la classe int´
erieure
5.2 Classe locale
Une classe int´
erieure peut ˆ
etre d´
efinie dans le corps d’une m´
ethode : il s’agit d’une classe locale (local class). Les
r`
egles de visibilit´
e sont comme pour une variable locale : on peut utiliser la classe dans le corps de la m´
ethode apr`
es sa
d´
efinition.
1
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MonPanel extends JPanel
{
public MonPanel(){super(); initComponents();}
private void initComponents() // on place un bouton dans le milieu
{
JButton bouton = new JButton("Cancel");
class ButtonListener implements ActionListener // classe locale
{
public void actionPerformed(ActionEvent ignored)
{
doCancel();
}
}
bouton.addActionListener(new ButtonListener());
this.add(bouton);
...
}
... // methode doCancel() et d’autres membres
}
5.3 Anonymous class
Finalement, on peut aussi utiliser des classes anonymes (anonymous class). Une classe anonyme est utilis´
ee lors de
sa d´
efinition pour cr´
eer une seule instance. Syntaxe pour l’utilisation :
Outer objet = new Outer(...){ ... }
Entre les accolades, on peut d´
efinir les m´
ethodes dont on a besoin. Le type Outer peut ˆ
etre une classe ou un interface.
?si Outer est une classe, il est permis de red´
efinir les m´
ethodes h´
erit´
ees (overriding)
?si Outer est un interface, il faut d´
efinir les m´
ethodes de l’interface — c’est l’usage typique d’une classe anonyme
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MonPanel extends JPanel
{
public MonPanel(){super(); initComponents();}
private void initComponents() // on place un bouton dans le milieu
{
JButton bouton = new JButton("Cancel");
bouton.addActionListener(new ActionListener()
{ // impl´ementation obligatoire de l’interface ActionListener
public void actionPerformed(ActionEvent ignored)
{
doCancel();
}
}
);
this.add(bouton);
...
}
... // methode doCancel() et d’autres membres
}
?pour acc´
eder `
a l’instance ext´
erieure dans une classe int´
erieure : ´
ecrire Outer.this (parce que this correspond
`
aInner.this).
?pour acc´
eder `
a une variable locale dans une classe int´
erieure : il faut d´
eclarer la variable final (c-`
a-d juste une
affectation permise)
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !