28
1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

Embed Size (px)

Citation preview

Page 1: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

1

COURS DE PROGRAMMATION ORIENTEE OBJET :

Classes internes

Page 2: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

2

LES CLASSES INTERNES

Une classe interne est une classe qui est définie à l’intérieur d’une autre classe.

Intérêts d’utiliser des classes internes– Elles peuvent être cachées aux autres classes

du même package.– Leurs méthodes peuvent accéder aux données

de la classe ou de l’interface où elles sont définies, même les données privées.

– Les classes internes anonymes sont utiles pour implémenter certaines interfaces ou étendre des classes abstraites de manière efficace.

Page 3: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

3

Types de classes internes

Classes internespublic class A { private (ou public) class B { }}

Classes internes statiquespublic class A { public static class B {

}}

Classes internes locales

public class A { public void m(){ class B {

}

} }

Classes internes anonymespublic class A {

public void m(){ new SuperType() {

};

}}

LES CLASSES INTERNES

Page 4: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

4

Classe interne– Une classe interne possède une référence

sur sa classe englobante.– Une classe englobante a accès à tous les

membres de sa classe interne (même privés).

– Une classe interne a accès à tous les membres d'une classe englobante.

LES CLASSES INTERNES

Page 5: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

5

Classe interne– Référence à la classe externe dans la classe interne : ClasseExterne.this

– Appel du constructeur de l’objet interne :

• Dans la classe externe : new ClasseInterne(…)

• Hors de la classe externe, si la classe interne est publique

ClasseExterne objetExterne = new ClasseExterne(…);

ClasseExterne.ClasseInterne objetInterne= objetExterne .new ClasseInterne(…);

LES CLASSES INTERNES

Page 6: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

6

Classe interne - Exemple1

public class Suite {private final char[] tab;public class SousSuite { private final int debut; private final int longueur; public SousSuite (int debut, int lng)

{ this.debut=debut; this.longueur=longueur;

} public char charAt ( int index ) { if ( index<0 || index>=lng ) throw new

IllegalArgumentException(...); return tab[debut+index]; }}

}

LES CLASSES INTERNES

Page 7: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

7

Classe interne – Exemple1

Instanciation de la classe SousSuite à l’extérieur de la classe Suite :

Suite s = new Suite("toto");

SousSuite sub = s.new SousSuite(1,3);System.out.println( sub.charAt(0) );

LES CLASSES INTERNES

Page 8: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

8

Classe interne – Exemple1Instanciation de la classe SousSuite à l’intérieur de la classe Suite public class Suite { private final char[] tab; public class SousSuite {

public SousSuite(int debut,int longueur) {

}…

} public SousSuite extraireSousSuite(int

debut) {return new

SousSuite(debut,tab.longueur-debut);// return Suite.this.new SousSuite(...)}

}

LES CLASSES INTERNES

Page 9: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

9

Classe interne – Exemple2

Modifier la classe CompteBancaire de manière à rajouter un champ derOperation qui mémorise la dernière opération réalisée (retrait ou dépôt) ainsi que le montant de l’opération.

On souhaite pouvoir afficher, pour un compte donné, le numéro du compte suivi de la dernière opération réalisée sur le compte et le montant de celle-ci.

LES CLASSES INTERNES

Page 10: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

10

Classe interne – Exemple2public class CompteBanquaire{

private String nom ;private String adresse ;private int numero ;private int solde; private Operation derOperation;public class Operation{

private String op;private long montant;Operation(String op, int montant){

this.op=op;this.montant= montant;

}public String toString(){

return numero"+":"+op+" "+montant;//return

CompteBancaire.this.numero"+":"+op+" "+montant;

}}

LES CLASSES INTERNES

Page 11: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

11

Classe interne – Exemple2

public void crediter(int montant){solde += montant;derOperation=new Operation("depot",montant);

}public void debiter(int montant){

solde -= montant;derOperation=new Operation("retrait",montant);

}}//fin de la classe CompteBancaire

LES CLASSES INTERNES

Page 12: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

12

Classe interne et compilateur

Les classes internes sont traduites en fichiers de classes réguliers par le compilateur.

Le compilateur ajoute un champs vers la

classe englobante et change l'appel au

constructeur.

LES CLASSES INTERNES

Page 13: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

13

Classe interne locale

Dans certains cas, on ne doit utiliser un objet de la classe interne que dans une seule méthode de la classe englobante.

On peut alors définir une classe interne locale à une méthode.

LES CLASSES INTERNES

Page 14: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

14

Classe interne locale– La portée de la classe interne est réduite au

bloc dans laquelle elle est déclarée.– Une classe interne locale est analogue à une

variable locale, elle n'est pas membre de la classe.

– La classe est complètement cachée au reste du code de la classe englobante et aux autres objets.

LES CLASSES INTERNES

Page 15: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

15

Classe interne locale– Utilisation1 : créer des instances qui peuvent

être passées en paramètres.– Utilisation2 : créer des objets d'une extension

d'une classe qui n'a de sens que localement (en particulier dans les interfaces graphiques).

LES CLASSES INTERNES

Page 16: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

16

Classe interne localeExemple : Dans l’étude des Collections Java,

nous fournirons plusieurs implémentations de la méthode public Iterator iterator() permettant de parcourir chaque élément d’une collection d’éléments.

Cette méthode retourne un objet de type Iterator qui est une interface.

LES CLASSES INTERNES

Page 17: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

17

Classe interne localepublic interface Iterator{

//renvoie true si l’objet de l’itération possède encore//au moins un élément

public boolean hasNext();public Object next()

throws NoSuchElementException;

public void remove()throws

UnsupportedOperationException;

}

LES CLASSES INTERNES

Page 18: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

18

Classe interne locale public Iterator iterator(){

class Iterateur implements Iterator{ public boolean hasNext(){…}

public Object next() throws NoSuchElementException{…}public void remove()

throws UnsupportedOperationException{…}

}return new Iterateur();

}

LES CLASSES INTERNES

Page 19: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

19

Classe interne anonymeLors de l’utilisation d’une classe interne locale, si on ne souhaite créer qu’un seul objet de cette classe, il n’est pas nécessaire de donner un nom à la classe.

On définit une classe interne anonyme.

LES CLASSES INTERNES

Page 20: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

20

Classe interne anonyme – Syntaxe

public class A{…

public void methodeDeA(…, final type parametre){SuperType s = new SuperType(paramètres de construction) {

méthodes et données de la classe interne

};}

}

LES CLASSES INTERNES

Page 21: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

21

Classe interne anonyme – Syntaxe– SuperType peut être

•une interface; la classe interne implémente alors cette interface.

•une classe; la classe interne étend alors cette classe.

– Une classe interne anonyme ne peut pas avoir de constructeurs propres.

LES CLASSES INTERNES

Page 22: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

22

Classe interne anonyme – Syntaxe– Dans le cas d’une interface, il n’y aura pas de

paramètres de construction.New TypeInterface () {

méthodes et données

}– La classe interne anonyme peut appeler les

paramètres définis dans la méthode englobante avec le modificateur final.

LES CLASSES INTERNES

Page 23: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

23

Classe interne anonyme Exemple avec l’interface Iterator :public Iterator iterator(){

return new Iterator(){ public boolean hasNext(){…}

public Object next() throws NoSuchElementException{…}

public void remove() throws UnsupportedOperationException{…}

};}

LES CLASSES INTERNES

Page 24: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

24

Classe interne statique – utile pour cacher des détails

d’implémentation.– elle ne va pas utiliser de référence à un

objet de la classe englobante.– elle accède uniquement aux champs

statiques de la classe englobante.

LES CLASSES INTERNES

Page 25: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

25

Classe interne statique – ExempleOn souhaite calculer les valeurs minimales etmaximales d’un tableau en ne parcourant letableau qu’une seule fois.

On déclare une classe TableauOperation et on crée une méthode statique minMax avec comme paramètre un tableau de double. minMax doit retourner deux nombres. Pour cela on déclare une classe Pair qui stocke deux valeurs numériques.

LES CLASSES INTERNES

Page 26: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

26

Classe interne statique – Exemplepublic class TableauOperations{public static Pair minMax (double[] values){

double max = Double.MAX_VALUE;double min = Double.MIN_VALUE;for (double v : values){

if (min > v) min = v; if (max < v) max = v;

}return new Pair (min, max);

} L’objet de la classe interne Pairest construit dans une méthodestatique. La classe Pair doit êtrestatique.

LES CLASSES INTERNES

Page 27: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

27

Classe interne statique – Exemplepublic static Pair {

private double premier;private double second;public Pair (double p, double s)

{premier = p; second = s;

}public double getPremier(){

return premier;}public double getSecond(){

return second;}}

}//fin de la classe TableauOperations

La classe Pair nepossède pas de référence à l’objetexterne qui l’a créé.

LES CLASSES INTERNES

Page 28: 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Classes internes

28

Classe interne statique – Exemplepublic class minMaxTest{

public static void main (String[] args){ double[] d= new double[20]; for (int i =0; i< d.length; i++)

d[i] = 100* Math.random(); TableauOperations.Pair p = TableauOperations.minMax(d);

System.out.println(" min = " + p.getPremier());

System.out.println(" max = " + p.getSecond());

}

}

LES CLASSES INTERNES