pdf/4
Transcription
pdf/4
Java Cours 3 Résumé des cours précédents Premier cours : Programmation Orientée Objet Bertrand Estellon Département d’Informatique de Luminy Aix-Marseille Université I Objets, classes et instances I Variables de type “référence” I Définir et instancier une classe I Tableaux, chaı̂nes de caractères I Packages Deuxième cours : 26 avril 2012 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java 26 avril 2012 1 / 379 I Description et implémentation d’interfaces I Polymorphisme d’objet I Transtypage (vers le haut et vers le bas) Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Java Rappel : Interfaces et formes cliquables 26 avril 2012 78 / 379 Cours 3 Rappel : Interfaces et formes cliquables G1 G2 Interface pour les échanges entre les formes et les observateurs : R3 R2 D1 public interface C l i c k L i s t e n e r { G3 R5 D3 onClick() /∗ ∗ ∗ Invoquée quand l’objet est cliqué. ∗/ public void o n C l i c k ( C l i q u a b l e c ) ; D2 onClick() onClick() onClick() } Observeur1 Bertrand Estellon (DIL – Aix-Marseille) Observeur2 Observeur3 Programmation Orientée Objet 26 avril 2012 79 / 379 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 80 / 379 Java Cours 3 Java Rappel : Interfaces et formes cliquables Rappel : Interfaces et formes cliquables c l a s s D i s q u e implements C l i q u a b l e { .... C l i c k L i s t e n e r [ ] l i s t e n e r s = new C l i c k L i s t e n e r [ 1 0 0 ] ; int nbListeners = 0; ... void a d d C l i c k L i s t e n e r ( C l i c k L i s t e n e r l ) { l i s t e n e r s [ n b L i s t e n e r s ] = l ; n b L i s t e n e r s ++; } c l a s s R e c t a n g l e implements C l i q u a b l e { .... C l i c k L i s t e n e r [ ] l i s t e n e r s = new C l i c k L i s t e n e r [ 1 0 0 ] ; int nbListeners = 0; ... void a d d C l i c k L i s t e n e r ( C l i c k L i s t e n e r l ) { l i s t e n e r s [ n b L i s t e n e r s ] = l ; n b L i s t e n e r s ++; } } p u b l i c boo lean t r a i t e r C l i c ( i n t x , i n t y ) { i f ( x>=x1 && x<=x2 && y>=y1 && y<=y2 ) { f o r ( i n t i = 0 ; i < n b L i s t e n e r s ; i ++) l i s t e n e r s [ i ] . onClick ( this ); return true ; } return f a l s e ; } } Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java Cours 3 26 avril 2012 81 / 379 p u b l i c b o ole a n t r a i t e r C l i c ( i n t x , i n t y ) { i n t dx = x − t h i s . x , dy = y − t h i s . y ; i f ( Math . s q r t ( dx ∗ dx + dy ∗ dy ) <= r ) { f o r ( i n t i = 0 ; i < n b L i s t e n e r s ; i ++) l i s t e n e r s [ i ] . onClick ( this ); return true ; } return f a l s e ; } Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Java Abstraction et extension 26 avril 2012 82 / 379 Cours 3 Extension Le service associé aux listeners est identique. On aimerait : I définir une classe FormeCliquable qui implémente ce service ; I sans perdre les spécificités d’un disque ou d’un rectangle. traiterClic() Observateur L’extension permet de créer une classe qui : I conserve les services (propriétés et méthodes) d’une autre classe ; I ajouter ses propres services (propriétés et méthodes). Interface Cliquable onClick() En Java : addClickListener() Interface ClickListener traiterClic() I On utilise le mot-clé extends pour étendre une classe ; I Une classe ne peut étendre qu’une seule classe. traiterClic() Ne pas étendre quand une implémentation d’interface suffit ! Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 83 / 379 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 84 / 379 Java Cours 3 Java La classe FormeCliquable Utilisation de l’extension – La classe Rectangle p u b l i c c l a s s F o r m e C l i q u a b l e implements C l i q u a b l e { public class Rectangle extends FormeCliquable { private ClickListener [ ] l i s t e n e r s ; private int nbListeners ; p u b l i c i n t x1 , y1 , x2 , y2 , numero ; public FormeCliquable () { l i s t e n e r s = new C l i c k L i s t e n e r [ 1 0 0 ] ; nbListeners = 0; } R e c t a n g l e ( i n t x1 , t h i s . x1 = x1 ; t h i s . y1 = y1 ; t h i s . numero = } public void a d d C l i c k L i s t e n e r ( C l i c k L i s t e n e r l ) { l i s t e n e r s [ n b L i s t e n e r s ] = l ; n b L i s t e n e r s ++; } } Cours 3 p u b l i c b o o lea n t r a i t e r C l i c ( i n t x , i n t y ) { f o r ( i n t i = 0 ; i < n b L i s t e n e r s ; i ++) l i s t e n e r s [ i ] . onClick ( this ); return true ; } Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java } 26 avril 2012 85 / 379 p u b l i c b oo le a n t r a i t e r C l i c ( i n t x , i n t y ) { i f ( x >= x1 && x <= x2 && y >= y1 && y <= y2 ) { super . t r a i t e r C l i c (x , y ) ; return true ; } return f a l s e ; } Bertrand Estellon (DIL – Aix-Marseille) Cours 3 26 avril 2012 86 / 379 Cours 3 Transtypage vers le haut (upcasting) L’upcasting est toujours possible : p u b l i c c l a s s Disque extends FormeCliquable { Si la classe B étend la classe A, l’affectation d’une référence de type “B” dans une variable de type “A” est toujours possible. p u b l i c i n t x , y , r , numero ; p u b l i c D i s q u e ( i n t x , i n t y , i n t r , i n t numero ) { this . x = x ; this . y = y ; this . r = r ; t h i s . numero = numero ; } (car tout ce qu’une instance de A sait faire, une instance de B sait le faire) Exemple : public class A { p u b l i c v o i d method1 ( ) { System . o u t . p r i n t l n ( ”m1 ” ) ; } } p u b l i c b oo lean t r a i t e r C l i c ( i n t x , i n t y ) { i n t dx = x − t h i s . x , dy = y − t h i s . y ; i f ( Math . s q r t ( dx ∗ dx + dy ∗ dy ) <= r ) { return super . t r a i t e r C l i c (x , y ) ; } return f a l s e ; } p u b l i c c l a s s B extends A { p u b l i c v o i d method2 ( ) { System . o u t . p r i n t l n ( ”m2 ” ) ; } } B b = new B ( ) ; A a = b ; //upcasting a . method1 ( ) ; // la méthode est implémenté a . method2 ( ) ; // erreur à la compilation : la classe A ne définit pas cette méthode } Programmation Orientée Objet Programmation Orientée Objet Java Utilisation de l’extension – La classe Disque Bertrand Estellon (DIL – Aix-Marseille) i n t y1 , i n t x2 , i n t y2 , i n t numero ) { t h i s . x2 = x2 ; t h i s . y2 = y2 ; numero ; 26 avril 2012 87 / 379 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 88 / 379 Java Cours 3 Java Transtypage vers le bas (downcasting) Cours 3 Redéfinition de méthodes et polymorphisme L’upcasting n’est pas toujours possible : Si la classe B étend la classe A, l’affectation d’une référence de type “A” dans une variable de type “B” n’est pas toujours possible. Exemple : Dans la classe Rectangle, nous avons redéfini la méthode traiterClic : I La méthode existe dans la classe FormeCliquable ; I Une nouvelle implémentation est donnée dans la classe Rectangle. public class A { p u b l i c v o i d method1 ( ) { System . o u t . p r i n t l n ( ”m1 ” ) ; } } public class A { p u b l i c v o i d a f f i c h e r N o m ( ) { System . o u t . p r i n t l n ( ”A ” ) ; } } p u b l i c c l a s s B extends A { p u b l i c v o i d method2 ( ) { System . o u t . p r i n t l n ( ”m2 ” ) ; } } p u b l i c c l a s s B extends A { p u b l i c v o i d a f f i c h e r N o m ( ) { System . o u t . p r i n t l n ( ”B ” ) ; } } A B A B B a1 b1 a2 b2 b3 = = = = = new A ( ) ; new B ( ) ; b1 ; // upcasting ! (B) a2 ; // downcasting possible ! (B) a1 ; // downcasting impossible (erreur à l’exécution) Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java B b = new B ( ) ; b . a f f i c h e r N o m ( ) ; // affiche B A a = new A ( ) ; a . a f f i c h e r N o m ( ) ; // affiche A a = b ; a . a f f i c h e r N o m ( ) ; // affiche B 26 avril 2012 89 / 379 Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Java 26 avril 2012 Mot-clé super Mot-clé super Le mot-clé super permet d’utiliser une méthode définie au dessus : Le mot-clé super permet d’utiliser une propriété définie au dessus : public class A public class A { p u b l i c S t r i n g getName ( ) { r e t u r n ”A ” ; } } p u b l i c c l a s s B1 e x t e n d s A { p u b l i c S t r i n g t e s t ( ) { r e t u r n getName ( ) ; } { p u b l i c S t r i n g name = ”A ” ; } p u b l i c c l a s s B1 e x t e n d s A { p u b l i c S t r i n g t e s t ( ) { r e t u r n name ; } /∗A∗/ } /∗A∗/ } p u b l i c c l a s s B2 e x t e n d s A { p u b l i c S t r i n g getName ( ) { r e t u r n ”B ” ; } p u b l i c S t r i n g t e s t ( ) { r e t u r n getName ( ) ; /∗B∗/ } } p u b l i c c l a s s B2 e x t e n d s A { p u b l i c S t r i n g name = ”B ” ; p u b l i c S t r i n g t e s t ( ) { r e t u r n name ; /∗B∗/ } } p u b l i c c l a s s B3 e x t e n d s A { p u b l i c S t r i n g getName ( ) { r e t u r n ”B ” ; } p u b l i c S t r i n g t e s t ( ) { r e t u r n s u p e r . getName ( ) ; /∗A∗/ } } p u b l i c c l a s s B3 e x t e n d s A { p u b l i c S t r i n g name = ”B ” ; p u b l i c S t r i n g t e s t ( ) { r e t u r n s u p e r . name ; /∗A∗/ } } Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 91 / 379 90 / 379 Cours 3 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 92 / 379 Java Cours 3 Java Rappel : Constructeur par défaut Construction des instances et extension Si aucun constructeur n’est défini, la classe a un constructeur par défaut public class A { int a = 1; int b = 2; } Si une classe B etend une classe A, la construction d’une instance de A est nécessaire lors de la construction d’une instance de B Un appel au constructeur de A est effectué au début du constructeur de B : public class Rectangle extends FormeCliquable { est équivalent à p u b l i c i n t x1 , y1 , x2 , y2 , numero ; public class A { int a ; int b ; } R e c t a n g l e ( i n t x1 , i n t y1 , i n t x2 , i n t y2 , i n t numero ) { /∗ Appel du constructeur sans paramètre de la classe FormeCliquable ∗/ t h i s . x1 = x1 ; t h i s . x2 = x2 ; t h i s . y1 = y1 ; t h i s . y2 = y2 ; t h i s . numero = numero ; } ... p u b l i c A( ) { a = 1; a = 2; } Bertrand Estellon (DIL – Aix-Marseille) } Programmation Orientée Objet Java 26 avril 2012 93 / 379 Programmation Orientée Objet Java 94 / 379 Le modificateur final permet de bloquer l’extension d’une classe ou la redéfinition d’une méthode. p u b l i c c l a s s ClasseAvecNom { S t r i n g nom ; p u b l i c ClasseAvecNom ( S t r i n g nom ) { t h i s . nom = nom ; } } Exemple 1 : f i n a l public class A { } p u b l i c c l a s s B e x t e n d s A { } /∗Impossible car la classe A est finale∗/ p u b l i c c l a s s M aCl a sse e x t e n d s ClasseAvecNom { Exemple 2 : p u b l i c M aCl a sse ( ) { s u p e r ( ”MaCl as se ” ) ; ... } public class A Remarque : la classe ClasseAvecNom n’a pas de constructeur vide car un constructeur avec un paramètre est défini. Programmation Orientée Objet 26 avril 2012 Cours 3 Modificateur final S’il n’y a pas de constructeur vide dans la classe A, il faut préciser les paramètres du constructeur de A en utilisant le mot-clé super : Bertrand Estellon (DIL – Aix-Marseille) Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Mot-clé super lors de la construction } Cours 3 26 avril 2012 95 / 379 { f i n a l p u b l i c v o i d method ( ) { } } p u b l i c c l a s s B extends A { p u b l i c v o i d method ( ) { } /∗Impossible car la methode est finale dans A ∗/ } Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 96 / 379 Java Cours 3 Java Classes abstraites Utilisation des classes abstraites I Une classe dont l’implémentation est incomplète est dite abstraite. I Les méthodes non-implémentées sont dites abstaites. I Une classe abstraite n’est pas instanciable. public a b s t r a c t c l a s s FormeCliquable implements C l i q u a b l e { ClickListener [] listeners ; int nbListeners ; public FormeCliquable () { l i s t e n e r s = new C l i c k L i s t e n e r [ 1 0 0 ] ; nbListeners = 0; } Exemple : p u b l i c a b s t r a c t c l a s s SansNom { v o i d a f f i c h e r N o m ( ) { System . o u t . p r i n t l n ( o bt en i r N o m ( ) ) ; } a b s t r a c t S t r i n g obt e ni r No m ( ) ; } void a d d C l i c k L i s t e n e r ( C l i c k L i s t e n e r l ) { l i s t e n e r s [ n b L i s t e n e r s ] = l ; n b L i s t e n e r s ++; } p u b l i c c l a s s A e x t e n d s SansNom { S t r i n g o b t en ir N o m ( ) { r e t u r n ”A ” ; } } public void p r o c e s s L i s t e n e r () { f o r ( i n t i = 0 ; i < n b L i s t e n e r s ; i ++) l i s t e n e r s [ i ] . onClick ( this ); } A a = new A ( ) ; a . a f f i c h e r N o m ( ) ; // affiche “A” Bertrand Estellon (DIL – Aix-Marseille) public abstract boolean t r a i t e r C l i c ( i n t x , i n t y ) ; Programmation Orientée Objet Java 26 avril 2012 97 / 379 } Bertrand Estellon (DIL – Aix-Marseille) Cours 3 98 / 379 I Par défaut, une classe ou une méthode est non-publique : elle n’est accessible que depuis les classes du même paquet. I Une classe ou un membre publics est accessible de n’importe où. I Pour rendre une classe ou un membre public : i n t x , y , r , numero ; p u b l i c D i s q u e ( i n t x , i n t y , i n t r , i n t numero ) { this . x = x ; this . y = y ; this . r = r ; t h i s . numero = numero ; } public class ClassePublique { public int proprietePublique ; public void methodePublique ( ) { } } p u b l i c b o o lea n t r a i t e r C l i c ( i n t x , i n t y ) { i n t dx = x − t h i s . x , dy = y − t h i s . y ; i f ( Math . s q r t ( dx ∗ dx + dy ∗ dy ) <= r ) { processListener (); return true ; } return f a l s e ; } Programmation Orientée Objet 26 avril 2012 Cours 3 Rappel : Packages et modificateur public p u b l i c c l a s s Disque extends FormeCliquable { } Programmation Orientée Objet Java Utilisation des classes abstraites Bertrand Estellon (DIL – Aix-Marseille) Cours 3 26 avril 2012 99 / 379 I Si fichier contient une classe publique, le nom du fichier doit être formé du nom de la classe suivi de “.java”. I Un fichier ne peut contenir qu’une seule classe publique. Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 100 / 379 Java Cours 3 Java Rappel : Modificateur private et encapsulation Modificateur protected I I I Un membre privé n’est accessible que par les méthodes de la classe qui le contient. I I Pour rendre un membre privé, on utilise le modificateur private : Programmation Orientée Objet Java les méthodes de la classe qui le contient ; des méthodes des classes qui étendent la classe qui le contient. Pour rendre un membre protégé, on utilise le modificateur protected : public class ClassePublique { protected i n t p r o p r i e t e P r o t e g e e ; protected void methodeProtegee ( ) { } } Encapsulation : Tout ce qui participe à l’implémentation des services doit être privé (afin de permettre la modification de l’implémentation des services sans risquer d’impacter les autres classes) Bertrand Estellon (DIL – Aix-Marseille) Un membre protégé est accessible depuis : I public class ClassePublique { private int proprietePrivee ; private void methodePrivee ( ) { } } I Cours 3 26 avril 2012 101 / 379 I Utilisation possible : Commencer l’implémentation d’un service dans une classe et la terminer dans les classes qui l’étendent . I Possible représentation : Les membres protégés forment une interface entre une classe et les classes qui l’étendent. Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Java Utilisation du modificateur protected 26 avril 2012 102 / 379 Cours 3 La classe Object p u b l i c a b s t r a c t c l a s s F o r m e C l i q u a b l e implements C l i q u a b l e { ClickListener [] listeners ; int nbListeners ; Par défaut, les classes étendent la classe Object public FormeCliquable () { l i s t e n e r s = new C l i c k L i s t e n e r [ 1 0 0 ] ; nbListeners = 0; } Consequence : le upcasting vers Object est toujours possible void a d d C l i c k L i s t e n e r ( C l i c k L i s t e n e r l ) { l i s t e n e r s [ n b L i s t e n e r s ] = l ; n b L i s t e n e r s ++; } Ma Cla sse Object o Object [ ] for ( int protected void p r o c e s s L i s t e n e r () { f o r ( i n t i = 0 ; i < n b L i s t e n e r s ; i ++) l i s t e n e r s [ i ] . onClick ( this ); } } c = new M a Cl asse ( ) ; = c; t = new O b j e c t [ 1 0 ] ; i = 0 ; i < t ; i ++) { i f ( i %2==0) t [ i ] = new U n e C l a s s e ( ) ; e l s e t [ i ] = new U n e D e u x i e m e C l a s s e ( ) ; p u b l i c a b s t r a c t b oolean t r a i t e r C l i c ( i n t x , i n t y ) ; } Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 103 / 379 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 104 / 379 Java Cours 3 Java La méthode toString() Rappel : Chaı̂nes de caractères Une implémentation possible des String.valueOf(...) Deux classes permettent de gérer les chaı̂nes de caractères : I la classe String : chaı̂ne invariable ; I la classe StringBuffer : chaı̂ne destinée à être modifiée (voir API). Déclaration et création : S t r i n g h = ”H e l l o ” ; S t r i n g w = ”World ” ; class String { ... public s t a t i c S t r i n g valueOf ( Object obj ) { i f ( o b j==n u l l ) r e t u r n ” n u l l ” ; else return obj . toString () ; } p u b l i c s t a t i c S t r i n g v a l u e O f ( bo o lea n b ) { i f ( b ) return ”t r u e ”; e l s e return ”f a l s e ”; } ... Concaténation : S t r i n g hw = h + ” ”+ w + ” ! ” ; int c = 13; S t r i n g hw12c = h + ” ”+ w + ” ” + 12 + ” ” + c ; } Une implémentation possible des System.out.print(...) : La conversion est effectée en utilisant l’une des méthodes statiques valueOf de la classe String. Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java Cours 3 26 avril 2012 p u b l i c v o i d p r i n t ( S t r i n g s ) { écrire “s” sur la sortie ; } p u b l i c v o i d p r i n t ( b o o le a n b ) { p r i n t ( S t r i n g . v a l u e O f ( b ) ) ; } public void p r i n t ( Object obj ) { p r i n t ( S t r i n g . valueOf ( obj ) ) ; } 105 / 379 Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Java 26 avril 2012 106 / 379 26 avril 2012 108 / 379 Cours 3 Redéfinir la méthode toString() Extension d’interfaces Redéfinition de la méthode toString() : Il est également possible d’étendre une interface : p u b l i c c l a s s M aCl a sse { p r i v a t e i n t numero ; p u b l i c M aCl a sse ( i n t numero ) { t h i s . numero = numero ; } public String toString () { r e t u r n ”MaCla sse ”+numero ; } interface I t e r a t o r { boolean h a s N e x t ( ) ; Object next ( ) ; } } Exemple d’utilisation : i n t e r f a c e L i s t I t e r a t o r extends I t e r a t o r { boolean h a s P r e v i o u s ( ) ; Object p r e v i o u s ( ) ; } MaClasse c1 = new M aClasse ( 1 ) ; MaClasse c2 = new M aClasse ( 2 ) ; System . o u t . p r i n t l n ( c1 . t o S t r i n g ( ) + ” ” + c2 . t o S t r i n g ( ) ) ; System . o u t . p r i n t l n ( c1 + ” ” + c2 ) ; Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 107 / 379 Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet Java Cours 3 Java Extension d’interfaces Extension d’interfaces c l a s s V e c t o r I t e r a t o r implements L i s t I t e r a t o r { Exemples d’utilisation : f i n a l private Vector v ; private int p ; V e c t o r v = new V e c t o r ( ) ; ... L i s t I t e r a t o r i t e r a t o r = new V e c t o r I t e r a t o r ( v ) ; while ( i t e r a t o r . hasNext ( ) ) System . o u t . p r i n t l n ( i t e r a t o r . n e x t ( ) ) ; while ( i t e r a t o r . hasPrevious ( ) ) System . o u t . p r i n t l n ( i t e r a t o r . p r e v i o u s ( ) ) ; ... I t e r a t o r i t e r a t o r = new V e c t o r I t e r a t o r ( v ) ; while ( i t e r a t o r . hasNext ( ) ) System . o u t . p r i n t l n ( i t e r a t o r . n e x t ( ) ) ; public V e c t o r I t e r a t o r ( Vector v ) { this . v = v ; p = 0; } p u b l i c b o ole an h a s P r e v i o u s ( ) { r e t u r n ( p > 0 ) ; } p u b l i c O b j e c t p r e v i o u s ( ) { p−−; r e t u r n v . g e t ( p ) ; } p u b l i c b o ole an h a s N e x t ( ) { r e t u r n p < v . s i z e ( ) ; } public Object next () { Object o = v . get (p ) ; } } Bertrand Estellon (DIL – Aix-Marseille) p++; r e t u r n o ; Programmation Orientée Objet Java 26 avril 2012 109 / 379 26 avril 2012 111 / 379 Cours 3 Résumé I Abstraction I Etendre une classe I Transtypage (vers le haut et vers le bas) I Redéfinition de méthodes et polymorphisme I mot-clé super I Construction des instances I Modificateurs final et protected I Classes et méthodes abstraites I La classe Object I La méthode toString() Bertrand Estellon (DIL – Aix-Marseille) Cours 3 Programmation Orientée Objet Bertrand Estellon (DIL – Aix-Marseille) Programmation Orientée Objet 26 avril 2012 110 / 379