Vous êtes sur la page 1sur 16

Cours JAVA :

Le polymorphisme en Java.
Version 3.05
Julien Sopena
1
1
julien.sopena@lip6.fr
quipe REGAL - INRIA Rocquencourt
LIP6 - Universit Pierre et Marie Curie
Licence professionnelle DANT - 2013/2014
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 1 / 121
Grandes lignes du cours
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du
polymorphisme.
Le polymorphisme impose
des limites lhritage
Rednition de mthode de
classe
Classes et mthodes
abstraites
Principes des classes
abstraites
Exemple de classe abstraite
Interfaces
Prambule et dnition
Dclaration et
implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 2 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 3 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 4 / 121
Rappel principes de la POO
1. Encapsulation

Rapprochement des donnes (attributs) et traitements


(mthodes)

Protection de linformation (private et public)


2. Agrgation (et composition)

Classe A "A UN" Classe B


3. Utilisation

Classe A "UTILISE" Classe B


J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 5 / 121
Un nouveau principe POO : Hritage
Dnition
Le terme hritage dsigne le principe selon lequel une classe peut
hriter des caractristiques (attributs et mthodes) dautres classes.
Soient deux classes A et B
Relation dhritage : Classe B "EST UN" Classe A

A est la super-classe ou classe mre de B

B est la sous-classe ou classe lle de A


Exercice : Hritage, Agrgation ou Utilisation ?

Cercle et Ellipse ?

Salle de bains et Baignoire ?

Piano et Joueur de piano ?

Entier et Rel ?

Personne, Enseignant et tudiant ?


J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 6 / 121
Motivation pour un nouveau type de relation
entre classes
Une classe dcrit les services (comportements et donnes) dun
ensemble dindividus
Exemple : la classe Animal (animation graphique)
Animal
+getNom(): String
+manger(...): ...
+dormir(...): ...
+reproduire(...): ...
Problmes pour implmenter cette spcication :
Elle est trop gnrale (exemple : manger( ) est trs dirent
suivant les animaux)
Il manque les services spciques certaines catgories
danimaux (exemple : voler( ), nager( ), ...)
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 7 / 121
Les mauvaises solutions
1. Faire que la classe Animal puisse vraiment reprsenter tous les
animaux

accrotre linterface publique (tous les services possibles de


tous les animaux)

ajouter des attributs boolens pour les catgories (isOiseau,


isPoisson, ...) ou un attribut qui indique la catgorie

tester les attributs pour savoir si on peut rpondre un


message

Exemple : Animal unChat = new Animal ("chat",...); (avec un


attribut genreAnimal de type String dans la classe Animal)

code trs complexe et non maintenable


2. Faire autant de classes quil existe despces animales

beaucoup de services vont tre trs similaires entre les classes

beaucoup de factorisations perdues


J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 8 / 121
A
...
B
...
A
...
B
...
Classication hirarchise
Animal
Vertbr Invertbr
Mammifre Poisson Reptile
Homme Chat
Les sous-classes (spcialisations) de la classe Mammifre sont
les classes Homme et Chat
Les ascendants (gnralisations) de la classe Mammifre sont
les classes Vertbr et Animal
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 9 / 121
Hritage
Une sous-classe hrite des services (comportements et
donnes) de ses ascendants
Pour factoriser au mieux la programmation, il sut de placer
les services la bonne place dans la relation dhritage
Animal
getNom()
setNom()
Vertbr remuerVertbres() Invertbr
Mammifre allaiter() Poisson nager()
Homme crire() Chat
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 10 / 121
Hirarchie en Java
Une classe hrite toujours dune seule et unique classe
(hritage simple versus hritage multiple)
Cette classe est dite super-classe de la sous-classe
Par dfaut, toute classe hrite de la classe Object qui est la
racine unique de larbre dhritage
Object
Animal Question
...
Vertbr Invertbr
Mammifre Poisson Reptile
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 11 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 12 / 121
Syntaxe
Pour indiquer quune classe hrite dune autre classe, on utilise le
mot-cl extends.
publ i c cl ass Appartement extends Logement
Important
La classe Appartement ainsi dnie possde toutes les caractris-
tiques de la classe Logement (i.e., ses lments privs et publics).
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 13 / 121
Spcialisation
publ i c cl ass Logement {
f i na l publ i c double s u r f a c e ;
publ i c double p r i x ;
publ i c St r i ng p r o p r i e t a i r e ;
pr i vat e boolean vendu ;
}
publ i c cl ass Appartement extends Logement {
f i na l publ i c i nt et age ;
pr i vat e boolean cave ;
}
Les attributs de la classe Appartement sont : surface, prix,
proprietaire, vendu, etage et cave.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 14 / 121
Implmentation en Java
publ i c cl ass Homme extends Mammifre {
// a t t r i b u t s pr opr e s aux hommes uni quement
pr i vat e boolean d r o i t i e r ;
. . .
publ i c void c r i r e ( ) {
i f d r o i t i e r { . . . } el se { . . . }
}
}
Homme unHomme = new Homme ( . . . ) ;
// appel d un s e r v i c e pr opr e aux hommes
unHomme . c r i r e ( ) ;
// appel d un s e r v i c e commun aux v e r t b r s ( h r i t )
unHomme . r e mue r Ve r t br e s ( ) ;
// appel d un s e r v i c e commun aux ani maux ( h r i t )
unHomme . setNom( "Adam" ) ;
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 15 / 121
Hritage de comportements
Durant lexcution, linstruction :
unHomme . setNom( "Adam" ) ;
provoque :
La recherche de setNom() dans la classe Homme
Puisquelle nexiste pas, la recherche se poursuit en remontant
larbre dhritage jusqu trouver Animal.setNom()
Animal.setNom() est excute (dans le contexte de unHomme)
Si la mthode Animal.setNom() ntait pas dnie, une erreur
serait dtecte lorsque la classe Object serait atteinte
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 16 / 121
retenir : la classe Object
Important
En Java, toutes les classes hritent de la classe Object.
La dclaration
publ i c cl ass A { . . . }
doit donc tre comprise comme
publ i c cl ass A extends Obj ect { . . . }
mme si on ne lcrit pas ainsi.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 17 / 121
retenir : le mot-cl super
retenir
Java fournit la rfrence super qui dsigne pour chaque classe,
sa classe mre.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 18 / 121
Hritage dattributs
publ i c cl ass Ani mal {
// a t t r i b u t s pr opr e s t ous l e s ani maux
pr i vat e St r i ng nom; . . .
publ i c St r i ng getNom( ) { ret urn nom; }
publ i c void setNom( St r i ng n) { nom = n ; }
. . .
}
publ i c cl ass Ve r t br extends Animal {
// a t t r i b u t s pr opr e s aux Ve r t br s
pr i vat e i nt nbVe r t br e s ; . . .
publ i c void s e t NbVe r t br e s ( i nt n) {
nbVe r t br e s = n ;
}
publ i c void r e mue r Ve r t br e s ( ){
System . out . p r i n t l n ( this.getNom() + "remue"
+ nbVe r t br e s + " v e r t b r e s " ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 19 / 121
Hritage dattributs suite
publ i c cl ass Homme extends Mammifre {
// a t t r i b u t s pr opr e s aux hommes uni quement
pr i vat e boolean d r o i t i e r ;
. . .
publ i c Homme ( St r i n g unNom, boolean d r o i t i e r ) {
this.setNbVertebres(50) ;
this.setNom(unNom) ;
t hi s . d r o i t i e r = d r o i t i e r ;
}
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 20 / 121
Hritage dattributs n
Homme uneFemme = new Homme( "ve " , t rue ) ;
ve
true
uneFemme
50
true
uneFemme . r e mue r Ve r t br e s ( ) ;
System . out . p r i n t l n ( uneFemme . getNom ( ) ) ;
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 21 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 22 / 121
Hritage et encapsulation
Les membres (attributs et mthodes) dclars privs dans une
classe ne sont pas visibles dans une sous-classe
En dautres termes, lhritage nimplique pas la visibilit
publ i c cl ass Homme extends Mammifre {
// a t t r i b u t s pr opr e s aux hommes uni quement
pr i vat e boolean d r o i t i e r ;
. . .
publ i c Homme ( St r i n g unNom, boolean d r o i t i e r ) {
t hi s . s e t NbVe r t e br e s ( 5 0 ) ;
nom = unNom ; // e r r e u r
t hi s . d r o i t i e r = d r o i t i e r ;
}
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 23 / 121
Visibilit
Le modicateur qui prcde chaque mthode (et attribut)
dtermine sa visibilit :
private dfaut protected public
la classe elle-mme OUI OUI OUI OUI
une sous-classe, paquetage = NON OUI OUI OUI
pas une sous-classe, paquetage = NON OUI OUI OUI
une sous-classe, paquetage = NON NON OUI OUI
pas une sous-classe, paquetage = NON NON NON OUI
Rappel
Les attributs doivent toujours tre dclars private
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 24 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 25 / 121
Instantiation des attributs hrits
publ i c cl ass Homme extends Mammifre {
// a t t r i b u t s pr opr e s aux hommes uni quement
pr i vat e boolean d r o i t i e r ;
. . .
publ i c Homme ( St r i n g unNom, boolean d r o i t i e r ) {
this.setNbVertbres(50) ;
this.setNom(unNom) ;
t hi s . d r o i t i e r = d r o i t i e r ;
}
. . .
}
Problmes
Obligation dintroduire des modicateurs telles que
Vertbr.setNbVertbres()
Redondance la super-classe Mammifre doit avoir un
constructeur
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 26 / 121
Hritage et construction Correction
Pour initialiser les attributs hrits, le constructeur dune classe
peut invoquer un des constructeurs de la classe mre laide du
mot-cl super.
publ i c cl ass Homme extends Mammifre {
pr i vat e st at i c f i na l i nt NB_VERTEBRES = 50;
pr i vat e boolean d r o i t i e r ;
publ i c Homme ( St r i n g unNom, boolean d r o i t i e r ,
i nt nbVe r t br e s ) {
// s uper d o i t t r e l a pr e mi r e i n s t r u c t i o n
super (unNom, nbVe r t br e s ) ;
t hi s . d r o i t i e r = d r o i t i e r ;
}
publ i c Homme ( St r i n g unNom, boolean d r o i t i e r ) {
t hi s (unNom, d r o i t i e r , NB_VERTEBRES) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 27 / 121
Rgles dutilisation dun constructeur de la classe
mre.
Rgles
1. Lappel dun constructeur de la classe mre doit tre la
premire instruction du constructeur de la classe lle.
2. Il nest pas possible dutiliser la fois un autre constructeur
de la classe et un constructeur de sa classe mre dans la
dnition dun de ses constructeurs.
publ i c cl ass A {
publ i c A( i nt x ) {
super ( ) ;
t hi s ( ) ;
}
}
I
N
T
E
R
D
I
T
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 28 / 121
Constructeur implicite
Si aucun constructeur de la classe ou de la super-classe nest
invoqu explicitement, le compilateur ajoute un appel au
constructeur sans argument de la super-classe
publ i c cl ass B extends A {
publ i c B( i nt x ) {
// appel s uper ( ) i mp l i c i t e
t hi s . x = x ;
. . .
}
}
Attention : Dans ce cas, le constructeur sans argument doit tre
dni dans la super-classe
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 29 / 121
Constructeur implicite : exemple
publ i c cl ass A {
publ i c A ( ) {System . out . p r i n t l n ( "A" ) ; }}
publ i c cl ass B extends A {
publ i c B ( ) {System . out . p r i n t l n ( "B" ) ; }}
Le ligne de code suivante :
B c = new B ( ) ;
produira lachage suivant :
java MonProg
A
B
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 30 / 121
Constructeur implicite : erreur frquente
Etape 1 :
Jusquici tout va bien.
publ i c cl ass A {
publ i c i nt x ;
}
publ i c cl ass B extends A {
publ i c i nt y ;
publ i c B ( i nt x , i nt y ) {
t hi s . x = x ;
t hi s . y = y ;
}
}
Etape 2 :
Puis, on ajoute un constructeur.
publ i c cl ass A {
publ i c i nt x ;
public A (int x) {
this.x =x;
}
}
publ i c cl ass B extends A {
publ i c i nt y ;
publ i c B ( i nt x , i nt y ) {
t hi s . x = x ;
t hi s . y = y ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 31 / 121
Constructeur implicite : erreur frquente
javac B.java
B.java:3: cannot find symbol
symbol : constructor A()
location: class A
public B ( int x , int y ) {
^
1 error
}
publ i c cl ass B extends A {
publ i c i nt y ;
publ i c B ( i nt x , i nt y ) {
super() ; \\ Aj out du c ompi l at e ur
t hi s . x = x ;
t hi s . y = y ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 32 / 121
Constructeur implicite : Solutions
Solution 1 :
Ajout dun constructeur vide.
publ i c cl ass A {
publ i c i nt x ;
public A () {}
publ i c A ( i nt x ) {
t hi s . x = x ;
}
}
publ i c cl ass B extends A {
publ i c i nt y ;
publ i c B ( i nt x , i nt y ) {
t hi s . x = x ;
t hi s . y = y ;
}
}
Solution 2 :
Appel explicite au super(int).
publ i c cl ass A {
publ i c i nt x ;
publ i c A ( i nt x ) {
t hi s . x = x ;
}
}
publ i c cl ass B extends A {
publ i c i nt y ;
publ i c B ( i nt x , i nt y ) {
super(x);
t hi s . y = y ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 33 / 121
Constructeur dune classe drive
Un constructeur dune classe drive commence toujours :
1. soit par lappel explicite dun autre constructeur de la classe.
2. soit par lappel explicite ou implicite dun constructeur de la
classe mre.
Corollaire
Comme tout objet drive (directement ou indirectement) de la
classe Object : Tout constructeur commence par excuter
le constructeur de lObject
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 34 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 35 / 121
Dnition de la rednition.
Dnition
On appelle rednition (en anglais overriding ) dune mthode,
la possibilit de dnir le comportement dune mthode selon le
type dobjet linvoquant, i.e., de donner une nouvelle
implmentation une mthode hrite sans changer sa signature.
publ i c cl ass A {
publ i c i nt f (int x) {
. . .
}
}
publ i c cl ass B ext end A {
publ i c i nt f (int x) {
. . .
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 36 / 121
La signature dune mthode Java
publ i c cl ass Homme extends Mammifre {
. . .
publ i c void dessiner () {
System . out . p r i n t l n ( " G r i b o u i l l i s " ) ;
}
}
publ i c cl ass Leonar d extends Homme {
. . .
publ i c void dessiner () {
System . out . p r i n t l n ( " Joconde " ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 37 / 121
Overloading vs Overriding
ATTENTION
Il ne faut pas confondre la rednition (en anglais overriding )
et la surcharge (en anglais overloading ) qui a t tudie
dans le cours dintroduction et qui correspond la possibilit de
dnir des comportements dirents pour la mme mthode selon
les arguments passs en paramtres.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 38 / 121
Surcharge dune mthode rednie
On peut aussi surcharger une mthode rednie.
publ i c cl ass Logement {
publ i c void vendr e ( St r i ng ac que r e ur ) {
t hi s . p r o p r i e t a i r e = ac que r e ur ;
t hi s . vendu = t rue ;
}
}
publ i c cl ass Appartement extends Logement {
publ i c void vendr e ( St r i ng ac que r e ur ) {
t hi s ( ac que r e ur ) ;
t hi s . cave = f al se :
}
publ i c void vendr e ( St r i ng acquer eur , boolean cave ) {
t hi s ( ac que r e ur ) ;
t hi s . cave = cave :
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 39 / 121
Spcialiser une mthode hrite
La rfrence super permet de rednir une mthode f hrite en
rutilisant sa dnition dans la classe mre. On dit alors quon
spcialise la mthode hrite f.
publ i c cl ass A {
publ i c void f ( ) {
. . .
}
}
publ i c cl ass B extends A {
publ i c void f ( ) {
. . .
super.f()
. . .
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 40 / 121
Spcialiser une mthode hrite : exemple
publ i c cl ass Poi nt {
pr i vat e i nt x , y ;
. . .
publ i c St r i ng t o St r i n g ( ) {
ret urn " ( " + x + " , " + y + " ) " ;
}
}
publ i c cl ass Poi nt Coul e ur extends Poi nt {
pr i vat e byte c oul e ur ;
. . .
publ i c St r i ng t o St r i n g ( ) {
ret urn super . t o St r i n g ( ) +
"\ nCoul eur : " + t hi s . c oul e ur ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 41 / 121
Limite pour dsigner une mthode rednie
Attention
On ne peut remonter plus haut que la classe mre pour rcuprer
une mthode rednie :
pas de cast (ClasseAncetre)m()
pas de super.super.m()
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 42 / 121
Annotation pour la rednition
Depuis Java 5, on peut annoter par @Override les rednitions de
mthodes. Ceci est trs utile pour reprer des fautes de frappe dans
le nom de la mthode : le compilateur envoie un message derreur si
la mthode ne rednit aucune mthode.
publ i c cl ass Poi nt {
pr i vat e i nt x , y ;
. . .
@Override
publ i c St r i ng t o s t r i n g ( ) {
ret urn " ( " + x + " , " + y + " ) " ;
}
}
Point.java:3: method does not override or implement a method from a
supertype
@Override

J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 43 / 121


Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 44 / 121
Les fondements de la covariance
Rappels
1. La rednition dune mthode cest le fait de donner une
nouvelle implmentation en conservant la signature.
2. La signature dune mthode est compose de son nom et
des types de ses arguments.
Dnition
On appelle covariance le fait de modier le type de retour dune
mthode lors de sa rednition. En Java, elle a t introduite dans
la version : Java 1.5.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 45 / 121
Outline
Lhritage
Principes de lhritage
Syntaxe de lhritage en Java
Hritage et visibilit
Hritage et construction
La rednition
La covariance
Interdire lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 46 / 121
classes nales
Lors de la conception dune classe, le concepteur peut empcher
que dautres classes hritent delle (classe nale).
f i na l publ i c cl ass A { }
Remarque(s)
La classe String est une classe nale.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 47 / 121
Mthodes nales
On peut empcher la rednition dune mthode dinstance dune
classe dans une de ses sous-classes en la dclarant nal.
publ i c cl ass A {
f i na l publ i c void f ( ) {}
}
publ i c cl ass B extends A {
// on ne peut pas r e d f i n i r f ( ) !
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 48 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 49 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 50 / 121
Polymorphisme : dnition
Dnition
Le polymorphisme peut tre vu comme la capacit de choisir
dynamiquement la mthode qui correspond au type rel de lobjet.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 51 / 121
Principe POO : Polymorphisme
Si la classe B hrite de la classe A
Classe B "EST-UN" Classe A
toute mthode m de A peut-tre invoque sur une instance de
la classe B (+ transitivit sur lhritage de A)
Le polymorphisme consiste exploiter cela en fournissant un B dans
les expressions "qui attendent" un A.
// un homme e s t un ani mal
Ani mal ani m1 = new Homme( "Ca n" , f al se ) ;
// un chat a u s s i
Ani mal ani m2 = new Chat ( " Europen" ) ;
System . out . p r i n t l n ( ani m1 . getNom ( ) ) ;
System . out . p r i n t l n ( ani m2 . getNom ( ) ) ;
// un ani mal n e s t pas n c e s s ai r e me nt un homme
Homme h = anim1 ;
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 52 / 121
Choix de la mthode : liaison dynamique
publ i c cl ass Poi nt {
pr i vat e i nt x , y ;
. . .
publ i c St r i ng t o St r i n g ( ) {
ret urn " ( " + x + " , " + y + " ) " ;
}
}
publ i c cl ass Poi nt Coul e ur extends Poi nt {
pr i vat e byte c oul e ur ;
. . .
publ i c St r i ng t o St r i n g ( ) {
ret urn super . t o St r i n g ( ) +
"\ nCoul eur : " + t hi s . c oul e ur ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 53 / 121
Choix de la mthode : liaison dynamique (suite)
publ i c cl ass Tr aceur DeLi gne {
publ i c st at i c void mai n ( St r i ng [ ] ar gs ) {
Poi nt [ ] t ab = new Poi nt [ 3 ] ;
t ab [ 0 ] = new PointCouleur ( 2 , 3 , bl e u ) ;
t ab [ 1 ] = new PointCouleur ( 2 , 3 , v e r t ) ;
t ab [ 2 ] = new PointCouleur ( 2 , 3 , r ouge ) ;
System . out . p r i n t l n ( "Ma l i g n e : " ) ;
f or ( Poi nt p : t ab )
System . out . p r i n t l n ( "" + p . toString ( ) ) ;
}
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 54 / 121
Choix de la mthode : liaison dynamique (suite)
Si p rfrence une PointCouleur, quelle mthode toString() va
tre invoque ?
1. La mthode toString() est dnie dans Point
2. Mais elle est spcialise dans PointCouleur
Cest la version la plus spcialise (PointCouleur.toString())
qui est invoque car la recherche de la mthode dbute dans la
classe eective de lobjet rfrenc par p
La recherche est mene lexcution et ce mcanisme est appel la
liaison dynamique.
Lorsquune mthode est spcialise dans une sous-classe, sa
visibilit peut tre augmente (ex. protected public) mais elle
ne peut pas tre rduite (ex. public private)
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 55 / 121
crire du code polymorphe : le problme
On veut coder une classe Zoo qui aura plusieurs cages permettant
dacceuillir dirents types danimaux. Il faut donc implmenter une
classe Cage permettant de contenir tous ces annimaux.
publ i c cl ass Zoo {
publ i c st at i c void mai n ( St r i n g [ ] ar gs ) {
Cage uneCage1 = new Cage ( . . . ) ;
Cage uneCage2 = new Cage ( . . . ) ;
// On a j out e un l i o n
Li on unLi on = new Li on ( . . . ) ;
uneCage1 . a c c u e i l l i r ( unLi on ) ;
// On a j out e un s i ng e
Si nge unSi nge = new Si nge ( . . . ) ;
uneCage2 . a c c u e i l l i r ( unSi nge ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 56 / 121
crire du code polymorphe : la mauvaise solution
publ i c cl ass Cage {
publ i c void a c c u e i l l i r ( Li on l ) {
. . .
}
publ i c void a c c u e i l l i r ( Si nge s ) {
. . .
}
}
Ici, la surcharge est une trs mauvaise solution
Si une nouvelle espce animale doit tre prise en compte, il
faudra modier le code de la classe Cage
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 57 / 121
crire du code polymorphe : la bonne solution
La bonne solution consiste utiliser le polymorphisme, en
implmentant une mthode acceuillir gnrique pour tout les
animaux.
Son paramtre tant de type Animal on pourra lappeler avec une
rfrence de Lion ou de Singe.
publ i c cl ass Cage {
publ i c void a c c u e i l l i r ( Animal a ) {
System . out . p r i n t l n ( a . getNom( ) + " e s t en cage " ) ;
. . .
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 58 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 59 / 121
Motivation
Nouvelle spcication prendre en compte : tous les animaux ne
peuvent pas aller en cage
La mthode Cage.accueillir() doit tre mme de dtecter les
animaux ne pouvant ltre
publ i c cl ass Zoo {
publ i c st at i c void mai n ( St r i n g [ ] ar gs ) {
Cage uneCage1 = new Cage ( . . . ) ;
Homme unHomme = new Homme ( . . . ) ;
uneCage . a c c u e i l l i r (unHomme ) ; = il refuse !!!
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 60 / 121
Premire solution
publ i c cl ass Cage {
. . .
publ i c void a c c u e i l l i r ( Ani mal a ) {
i f ( a instanceof Homme )
System . out . p r i n t l n ( a . getNom( )
+ " r e f u s e d a l l e r en cage " ) ;
ret urn ;
. . .
}
}
Trs mauvaise solution
Des connaissances propres la classe Homme sont dans la
classe Cage
si une nouvelle espce animale refuse daller en cage, il faudra
modier le code de la classe Cage
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 61 / 121
Mise en place dun protocole
publ i c cl ass Cage {
. . .
publ i c void a c c u e i l l i r ( Ani mal a ) {
i f ( ! a . supporteCage ( ) ) {
System . out . p r i n t ( a . getNom ( ) ) ;
System . out . p r i n t l n ( " r e f u s e d a l l e r en cage " ) ;
ret urn ;
}
. . .
}
}
Tout animal doit pouvoir rpondre ce protocole
Nous allons implmenter le protocole dans la hirarchie de
racine Animal, en utilisant lhritage et en spcialisant lorsque
cest ncessaire
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 62 / 121
Vue de larbre dhritage
Animal
supporteCage()
false
Vertbr
supporteCage()
true
Invertbr
Mammifre Poisson
supporteCage()
false
Homme
supporteCage()
false
Lion
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 63 / 121
Mise en place dun protocole
publ i c cl ass Ani mal {
. . .
publ i c boolean s uppor t eCage ( ) { r et ur n f al se ; }
}
publ i c cl ass Ve r t br extends Ani mal {
. . .
publ i c boolean s uppor t eCage ( ) { r et ur n t r ue ; }
}
publ i c cl ass Homme extends Mammifre {
. . .
publ i c boolean s uppor t eCage ( ) { r et ur n f al se ; }
}
publ i c cl ass Zoo {
publ i c s t a t i c voi d mai n ( St r i n g [ ] ar gs ) {
Cage uneCage1 = new Cage ( . . . ) ;
uneCage1 . a c c u e i l l i r (new Li on ( . . . ) ) ;
// Gnr e un appe l Ve r t br . s uppor t eCage ( ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 64 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 65 / 121
Retour sur les protocoles standards
publ i c cl ass Zoo {
publ i c s t a t i c voi d mai n ( St r i n g [ ] ar gs ) {
Cage [ 1 0 ] l e s Cage s ;
Li on unLi on = new Li on ( . . . ) ;
l e s Cage s [ 0 ] . a c c u e i l l i r ( unLi on ) ;
Si nge unSi nge = new Si nge ( . . . ) ;
l e s Cage s [ 1 ] . a c c u e i l l i r ( unSi nge ) ;
f or ( Cage c : l e s Cage s ) {
System . out . println(c.contenu()) ;
i f ( unLi on . equals(c.contenu())
System . out . p r i n t l n ( "J a i t r ouv e l e l i o n " ) ;
}
}
}
La classe Lion ne dispose pas de mthode equals(),
pourquoi ny a-t-il pas derreur de compilation ?
O est lappel la mthode toString() de Animal ?
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 66 / 121
Le protocole toString()
publ i c c l a s s System {
publ i c s t a t i c Pr i nt St r eam out ;
. . .
}
publ i c c l a s s Pr i nt St r eam {
publ i c voi d p r i n t ( Object ar g ) {
p r i n t ( ar g . toString() ) ; }
. . .
}
publ i c c l a s s Object {
publ i c St r i n g toString ( ) {
r e t u r n g e t Cl a s s ( ) . getName ( ) + "@" + I n t e g e r . t oHe xSt r i ng ( hashCode ( ) ) ;
}
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 67 / 121
Le protocole toString() suite
La classe Object est la racine de lunique arbre dhritage
La classe Animal hrite (implicitement) de la classe Object
Il sut de spcialiser la mthode toString() dans vos classes
pour quun objet de type PrintStream (tel que System.out)
puisse acher vos instances
publ i c cl ass Ani mal {
. . .
@Over r i de
publ i c St r i ng t o St r i n g ( ) {
ret urn t hi s . getNom( ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 68 / 121
Le protocole equals()
La classe Object dispose dune mthode equals()
publ i c cl ass Object {
publ i c boolean equals ( Obj ect ar g ) {
ret urn t hi s == ar g ;
}
. . .
}
Elle ne retourne true que si les deux rfrences dsignent le mme
objet
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 69 / 121
Le protocole equals() suite
Le protocole equals() est employ dans les paquetages standards
pour comparer les objets entre eux Extrait de la documentation de
java.util.Arrays :
publ i c st at i c boolean e qua l s ( Obj ect [ ] a , Obj ect [ ] a2 )
Returns true if the two specied arrays of Objects are equal to one
another. The two arrays are considered equal if both arrays contain
the same number of elements, and all corresponding pairs of
elements in the two arrays are equal.
Two objects e1 and e2 are considered equal if
( e1==nul l ? e2==nul l : e1 . equals ( e2 ) )
In other words, the two arrays are equal if they contain the same
elements in the same order. Also, two array references are
considered equal if both are null.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 70 / 121
Spcialisation de equals() dans vos classes
publ i c cl ass Coordonne {
pr i vat e i nt x , y ;
. . .
publ i c boolean e qua l s ( Obj ect obj ) {
// t e s t s ur l e s r f r e n c e s
i f ( t hi s == obj )
ret urn t rue ;
i f ( obj == nul l )
ret urn f al se ;
// t e s t s ur l e s c l a s s e s
i f ( this.getClass ( ) != obj . getClass ( ) )
ret urn f al se ;
// t e s t s ur l e s donnes
Coordonne ot he r = (Coordonne) obj ;
ret urn ( t hi s . x == ot he r . x && t hi s . y == ot he r . y ) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 71 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 72 / 121
Upcasting : classe lle classe mre
Dnition
On appelle surclassement ou upcasting le fait denregistrer une
rfrence dune instance dune classe B hritant dune classe A dans
une variable de type A. En java, cette opration est implicite et
constitue la base du polymorphisme.
publ i c cl ass A { . . . }
publ i c cl ass B extends A { . . . }
A a = new B( ) // C e s t de l upc a s t i ng ( s ur c l a s s e me nt ) .
On dit que a1 est une rfrence surclasse (elle est du type A et
contient ladresse dune instance dune sous-classe de A).
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 73 / 121
Downcasting : classe mre classe lle
Dnition
On appelle dclassement ou downcasting le fait de convertir une
rfrence surclasse pour librer certaines fonctionnalits
caches par le surclassement. En java, cette conversion nest pas
implicite, elle doit tre force par lopprateur de cast :
(<nomClasse>).
publ i c cl ass A { . . . }
publ i c cl ass B extends A { . . . }
A a = new B( ) ; // s ur c l as s e me nt , upc as t i ng
B b = (B) a ; // downcas t i ng
Pour que la conversion fonctionne, il faut qu lexcution le type
rel de la rfrence convertir soit B ou une des sous-classe de B !
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 74 / 121
Downcasting : mise en garde !
Attention
Le downcasting ne permet pas de convertir une instance dune
classe donne en une instance dune sous-classe !
cl ass A { A( ) {}}
cl ass B extends A { B( ) {}}
A a = new A( ) ;
B b = (B) a ;
a compile, mais a plantera lexcution :
Exception in thread "main" java.lang.ClassCastException:
A cannot be cast to B
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 75 / 121
Downcasting : utilisation de instanceof
On peut utiliser le mot-cl instanceof pour savoir si une rfrence
dune classe donne ou dune de ces sous-classes.
Si a est une rfrence de type B alors lexpression a instanceof A
renvoie true si B est une sous-classe de A et false sinon.
a = new B( ) ;
i f ( a i nst anceof A) {
System . out . p r i n t ( "a r f r e n c e unA, " ) ;
System . out . p r i n t l n ( "ouune s ous c l a s s e deA. " ) ;
}
Remarque(s)
Attention, lutilisation dinstanceof est souvent la marque dun
dfaut de conception et va lencontre du polymorphisme.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 76 / 121
Exemple : classe rendant un service gnrique.
publ i c cl ass Garage {
Ve hi c ul e [ ] t ab ;
i nt nbVe hi c ul e s ;
Garage ( i nt t a i l l e ) {
t ab = new Ve hi c ul e [ t a i l l e ] ;
nbVe hi c ul e s = 0;
}
voi d e n t r e r Ve h i c u l e ( Ve hi c ul e v ) {
i f ( nbVehi cul es <t ab . l e ngt h )
t ab [ nbVe hi c ul e s ++] = v ;
}
Ve hi c ul e s o r t i r Ve h i c u l e ( ) {
i f ( nbVehi cul es >0)
r et ur n t ab[nbVe hi c ul e s ] ;
el se
r et ur n nul l ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 77 / 121
Exemple : polymorphisme dhritage
publ i c cl ass Ve hi c ul e {
. . .
}
publ i c cl ass Moto extends Ve hi c ul e {
. . .
}
publ i c cl ass Voi t ur e extends Ve hi c ul e {
i nt t emper at ur e ;
. . .
void augment er Chauf f age ( i nt deg ) {
t emper at ur e += deg ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 78 / 121
Exemple : le downcast cest la n du
polymorphisme
publ i c cl ass Main {
publ i c st at i c void mai n ( St r i n g [ ] ar gs ) {
I n d i v i d u moi = new I n d i v i d u ( . . . ) ;
Garage monGarage = new Garage ( 2) ;
// Le pol ymor phi sme permet de ga r e r des
// v h i c u l e s s ans s occuper de l e u r s t y pe s .
monGarage . e n t r e r Ve h i c u l e (new Moto ( ) ) ;
monGarage . e n t r e r Ve h i c u l e (new Voi t ur e ( ) ) ;
. . .
Ve hi c ul e unVehi cul e = monGarage . s o r t i r Ve h i c u l e ( ) ;
i f ( moi . a v o i r Fr o i d ( ) ) {
// Si on ne par t age pas l e gar age , on s a i t
// qu on v i e n t de s o r t i r une v o i t u r e
( ( Voi t ur e ) unVehi cul e ) . augment er Chauf f age ( 1 0 ) ;
}
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 79 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 80 / 121
Ce quon ne peut pas faire et ne pas faire
Pour permettre le polymorphisme :
= une sous classe doit pouvoir se faire passer pour une sur
classeur ;
= une lle doit pouvoir le faire tout ce que fait sa mre ;
On ne peut rien supprimer :
On ne peut pas supprimer un membre ;
Changer le type dun attribut ;
On ne peut pas rduire la visibilit dun membre ;
La covariance doit maintenir la compatibilit (voir suivants).
Par contre on peut toujours ajouter/modier des choses :
On peut ajouter des membres ;
On peut rednir des mthodes ;
On peut augmenter la visibilit dun membre.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 81 / 121
Problme de la covariance
Dans cet exemple de covariance, peut-on choisir Y librement ?
publ i c cl ass A {
. . .
publ i c X f ( i nt x ) {
. . .
}
}
publ i c cl ass B extends A {
. . .
@Over r i de
publ i c Y f ( i nt x ) {
. . .
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 82 / 121
Problme de la covariance
Dans cet exemple de covariance, peut-on choisir Y librement ?
publ i c cl ass A {
. . .
publ i c X f ( i nt x ) {
. . .
}
}
publ i c cl ass B extends A {
. . .
@Over r i de
publ i c Y f ( i nt x ) {
. . .
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 83 / 121
Limite de la covariance
publ i c cl ass Main {
st at i c void g (A a ) {
. . .
X x = a . f ( 3 ) ;
. . .
}
publ i c st at i c void mai n ( St r i n g [ ] ar gs ) {
A a = new A( ) ;
g ( a ) ;
a = new B( ) ;
// Que l l e v e r s i o n f s e r a e xe c ut e dans c e t appe l ?
g ( a ) ;
}
}
Cest la verion de B qui sera execute :
= La rfrence de Y retourne doit tre "compatible" avec X
= La classe Y doit tre un descendant de de la classe X
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 84 / 121
Limite de la covariance
Rgle de covariance
Lorsque lon fait de la rednition avec covariance, le nouveau
type de retour doit toujours tre un sous-type du type de retour
original.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 85 / 121
Outline
Lhritage
Polymorphisme et hritage
Principes du polymorphisme
Protocoles et polymorphisme
Les protocoles standards
Downcasting : la n du polymorphisme.
Le polymorphisme impose des limites lhritage
Rednition de mthode de classe
Classes et mthodes abstraites
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 86 / 121
Overriding vs Hiding
Dnition
On appelle en anglais hiding , la rednition dune mthode
de classe. Son comportement dire de l Overriding qui est
une rednition dune mthode dinstance.
Contrairement aux mthodes dinstance, les appels aux mthodes
de classe sont rsolus statiquement la compilation.
Si une instance est utilise pour linvocation, la classe utilise sera
celle du type dclar et non du type rel de lobjet.
= Il ny a pas de polymorphisme sur les mthodes de classe
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 87 / 121
Tout est dcid statiquement
publ i c c l a s s Fe l i d e ( ) {
s t a t i c St r i n g r u g i r ( ) {
System . out . p r i n t l n ( "Miaou ! ! ! " ) ;
}
}
publ i c c l a s s Li on ( ) {
s t a t i c St r i n g r u g i r ( ) {
System . out . p r i n t l n ( "GRRRRRR ! ! ! " ) ;
}
}
publ i c c l a s s Savane {
publ i c s t a t i c voi d mai n ( St r i n g [ ] ar gs ) {
Fe l i d e f = new Li on ( ) ;
System . out . p r i n t l n ( "Le l i o n f a i t : " + f . r u g i r ( ) ) ;
}
}
java Savane
Le lion fait : Miaou !!!
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 88 / 121
Tout est dcid statiquement
publ i c c l a s s Fe l i d e ( ) {
s t a t i c St r i n g r u g i r ( ) {
System . out . p r i n t l n ( "Miaou ! ! ! " ) ;
}
}
publ i c c l a s s Li on ( ) {
s t a t i c St r i n g r u g i r ( ) {
System . out . p r i n t l n ( "GRRRRRR ! ! ! " ) ;
}
}
publ i c c l a s s Savane {
publ i c s t a t i c voi d mai n ( St r i n g [ ] ar gs ) {
Fe l i d e f = new Li on ( ) ;
System . out . p r i n t l n ( "Le l i o n f a i t : " + f . r u g i r ( ) ) ;
}
}
java Savane
Le lion fait : Miaou !!!
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 88 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Principes des classes abstraites
Exemple de classe abstraite
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 89 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Principes des classes abstraites
Exemple de classe abstraite
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 90 / 121
Motivation
publ i c cl ass Ani mati on {
. . .
publ i c void f ai r e Mange r ( Ani mal a , No ur r i t ur e n) {
. . .
a . manger ( n ) ;
. . .
}
. . .
}
Il faut introduire une mthode manger() dans la classe Animal
pour que cela compile
problme = quel comportement y dcrire puisque la faon de
manger dpend de lespce animale ?
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 91 / 121
Spcication dun protocole sans implmentation
par dfaut
Spcication du protocole le plus haut possible dans larbre dhritage
publ i c abstract cl ass Ani mal {
. . .
publ i c abstract void manger ( No ur r i t ur e n ) ;
// pas de code a s s o c i
. . .
}
Spcialisation du protocole l o cest ncessaire dans larbre dhritage
publ i c cl ass Li on extends Mammifre {
. . .
publ i c void manger ( No ur r i t ur e n) {
. . . // code s p c i f i q u e aux l i o n s
}
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 92 / 121
Mthodes abstraites = Classe abstraite
Dnition
Un classe contenant au moins une mthode abstraite est appele
une classe abstraite et cela doit tre explicitement prcis dans la
dclaration avec : abstract class
Remarque(s)
Une classe abstraite peut contenir des mthodes concrtes.
Une classe peut tre dclare abstraite sans contenir de
mthode abstraite.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 93 / 121
Classe abstraite : instanciation et spcialisation.
Une classe abstraite constitue un type part entire :
Ani mal unAni mal ; // OK
Une classe abstraite ne peut pas tre instancie, en eet son
comportement nest pas compltement dni :
Ani mal unAni mal = new Ani mal ( . . . ) ; // ERREUR
Une sous-classe dune classe abstraite peut

implmenter toutes les mthodes abstraites de sa


super-classe. Elle pourra alors tre dclare comme concrte et
donc instancie.

ne pas implmenter toutes ces mthodes abstraite. Elle reste


alors ncessairement abstraite (abstract class ) et ne pourra
tre instancie.

ajouter dautre(s) mthode(s) abstraite(s). Elle reste alors


ncessairement abstraite (abstract class ) et ne pourra tre
instancie.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 94 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Principes des classes abstraites
Exemple de classe abstraite
Interfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 95 / 121
Exemple : besoin
Considrons la hirarchie de classes suivantes :
Figure
aire()
Cercle Rectangle
Cahier de charge : on veut que toutes les classes disposent de la
mthode aire() retournant laire de la gure gomtrique dnie
par la classe.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 96 / 121
Exemple : dclaration de la classe abstraite.
publ i c abst ract cl ass Fi gur e {
pr i vat e St r i ng nom;
// Une c l a s s e a b s t r a i t e ne peut pas t r e i n s t a n c i e ,
// mai s e l l e peut a v o i r un c o n s t r u c t e u r :
publ i c Fi gur e ( St r i ng nom) {
t hi s . nom=nom;
}
// Voi l l a mthode a b s t r a i t e compl t er :
publ i c abst ract double a i r e ( ) ;
// Toutes l e s mthodes ne s ont pas a b s t r a i t e s :
publ i c St r i ng qui Sui s J e ( ) {
System . out . p r i n t l n ( "Je s u i s un" + t hi s . nom) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 97 / 121
Exemple : premire implmentation.
publ i c cl ass Ce r c l e extends Fi gur e {
pr i vat e double r ayon ;
publ i c Ce r c l e ( double r ayon ) {
super ( " c e r c l e " ) ;
t hi s . r ayon = r ayon ;
}
publ i c double a i r e ( ) {
ret urn Doubl e . PI t hi s . r ayon t hi s . r ayon ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 98 / 121
Exemple : deuxime implmentation.
publ i c cl ass Rect angl e extends Fi gur e {
pr i vat e double l a r g e u r ;
pr i vat e double l ongue ur ;
publ i c Rect angl e ( double l a r ge ur , double l ongue ur ) {
super ( " r e c t a n g l e " ) ;
t hi s . l a r g e u r = l a r g e u r ;
t hi s . l ongue ur = l ongue ur ;
}
publ i c double a i r e ( ) {
ret urn t hi s . l a r g e u r t hi s . l ongue ur ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 99 / 121
Exemples du standard
Extrait de la documentation de java.lang.Number :
The abstract class Number is the superclass of classes
BigDecimal, BigInteger, Byte, Double, Float, Integer,
Long, and Short.
Subclasses of Number must provide methods to convert the
represented numeric value to byte, double, float, int,
long, and short.
publ i c abst ract i nt i nt Va l ue ( ) ;
publ i c abst ract long l ongVal ue ( ) ;
publ i c abst ract f l oat f l o a t Va l u e ( ) ;
. . .
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 100 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 101 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 102 / 121
Prambule
Problmes rsoudre :
assurer quun ensemble de classes ore un service minimum
commun.
faire du polymorphisme avec des objets dont les classes
nappartiennent pas la mme hirarchie dhritage.
utilisation dobjets sans connatre leur type rel.
Solution :
la dnition dun type compltement abstrait nomm
interface (notion de contrat).
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 103 / 121
Dnition
Quand toutes les mthodes dune classe sont abstraites et quil
ny a aucun attribut, on aboutit la notion dinterface.
Dnition
Une interface est un prototype de classe. Elle dnit la
signature des mthodes qui doivent tre implmentes dans les
classes construites partir de ce prototype.
Une interface est une classe purement abstraite dont toutes
les mthodes sont abstraites et publiques. Les mots-cls
abstract et public sont optionnels.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 104 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 105 / 121
Dclaration : syntaxe
La dnition dune interface se prsente comme celle dune classe,
en utilisant le mot-cl interface la place de class.
publ i c i nt er f ace Comparabl e {
publ i c abst ract boolean pl us Gr and ( Obj ect o ) ;
}
publ i c i nt er f ace Tr acabl e {
void de s s i ne Toi ( ) ;
void de pl ac e Toi ( i nt x , i nt y ) ;
}
Remarque(s)
Dans les dclarations des mthodes de la classe Tracable, les mots
cls public et abstract sont implicites, mais ce nest pas
recommand.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 106 / 121
Dclaration : rgles
Comme les classes abstraites, les interfaces ne sont pas
instanciables :
Une interface ne possde pas dattribut instance.
Une interface na pas de constructeur.
Le but des interfaces est dnir des API :
toutes leurs mthodes sont public. Elles ne dnissent pas les
mcanismes internes
public abstract int f();
tout leurs attributs de classe sont des constante, cest--dire
dnir des attributs dclares comme public static nal et
ayant une valeur constante daectation. Exemple :
public static nal float PI = 3.14f;
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 107 / 121
Implmentation dune interface
Dnition
On dit quune classe implmente une interface si elle dnit
lensemble des mthodes abstraites de cette interface. On utilise
alors, dans lentte de la classe, le mot-cl implements suivi du
nom de linterface implmete.
cl ass Per sonne implements Comparable {
pr i vat e St r i ng nom;
pr i vat e St r i ng prenom ;
. . .
publ i c boolean pl us Gr and ( Obj ect o ) {
ret urn t hi s . nom. compareTo ( ( ( Per sonne ) o ) . nom) | |
t hi s . prenom . compareTo ( ( ( Per sonne ) o ) . prenom) ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 108 / 121
Implmentation dune interface
Attention
La classe doit implmenter toutes les mthodes de linterface,
sinon elle doit tre dclare abstract.
abstract cl ass Ce r c l e implements Tr acabl e {
pr i vat e i nt xCent r e , yCent r e ;
pr i vat e i nt r ayon ;
. . .
publ i c void de pl ac e Toi ( i nt x , i nt y ) {
xCent r e += x ;
yCent r e += y ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 109 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 110 / 121
Utilisation comme type de donnes
Une interface peut remplacer une classe pour dclarer :
un attribut
une variable
un paramtre
une valeur de retour
A lexcution, la donne correspond une rfrence dun objet dont
la classe implmente linterface.
Cest suivant le type rel de cet objet que lon choisira le code des
mthodes excuter.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 111 / 121
Exemple dutilisation comme type de donnes.
publ i c cl ass Main {
publ i c st at i c void mai n ( St r i n g [ ] ar gs ) {
Comparabl e var1 , var 2 ;
. . .
i f ( var 1 . pl us Gr and ( var 2 ) ) {
System . out . p r i n t l n ( "Var1 e s t pl us gr and que var 2 " ) ;
} el se {
System . out . p r i n t l n ( "Var1 e s t pl us p e t i t que var 2 " ) ;
}
}
}
Ici les variables var1 et var2 contiennent des rfrences vers des
objets dont les classes :
peuvent tre direntes
implmentent linterface Comparable
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 112 / 121
Exemple de polymorphisme dans un tableau
publ i c cl ass Li s t e El e me nt s {
Comparabl e [ ] t ab ;
i nt nbEl ements = 0;
. . .
publ i c void addEl ement ( Comparabl e e ) {
t ab [ nbEl ements ] = e ;
nbEl ements++ ;
}
publ i c boolean c r o i s s a n t ( ) {
f or ( i nt i = 1; i < nbEl ements ; i ++) {
i f ( t ab [ i 1] . pl us Gr and ( t ab [ i ] ) )
ret urn f al se ;
}
ret urn t rue ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 113 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 114 / 121
Choix entre classe et interface : principe
Une interface peut servir faire du polymorphisme comme
lhritage, alors comment choisir entre classe et interface ?
1. Choix dict par lexistant : Lhritage nest plus possible, la
classe hrite dj dune autre classe. Il ne reste plus que celui
linterface.
2. Choix la conception : On tudie la relation entre A et B ?

Un objet de classe B "EST UN" A


= Hritage : B extends A.

Un objet de classe B "EST CAPABLE DE FAIRE" A


= Interface : B implements A.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 115 / 121
Choix entre classe et interface : exemple
Une grenouille "EST UN" amphibien :
cl ass Gr e n o u i l l e extends Amphi bi en {
. . .
}
Une grenouille "EST CAPBLE DE FAIRE" amphibie :
cl ass Gr e n o u i l l e implements Amphi bi e {
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 116 / 121
Outline
Lhritage
Polymorphisme et hritage
Classes et mthodes abstraites
Interfaces
Prambule et dnition
Dclaration et implmentation
Polymorphisme dinterface
Classe ou interface ?
Composition dinterfaces
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 117 / 121
Implmentation de plusieurs interfaces
Une classe peut hriter dune autre classe et implmenter une
interface :
cl ass Gr e n o u i l l e extends Batracien implements Amphi bi e {
. . .
}
Une classe peut implmenter plusieurs interfaces :
cl ass Gr e n o u i l l e implements SurTerre, SurEau {
. . .
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 118 / 121
Extension dune interface
Lorsquune capacit sexprime comme une extension dune autre
capacit, on peut tendre une interface en utilisant le mot cl
extends :
i nt er f ace Sav oi r Condui r e {
. . .
}
i nt er f ace S a v o i r Pi l o t e r extends Sav oi r Condui r e {
publ i c abst ract void de r ape r ( i nt degr e ) ;
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 119 / 121
Composition de plusieurs interfaces
Lorsquune capacit sexprime comme un ensemble dautres
capacits, on peut faire de la composition dinterfaces en utilisant
le mot cl extends :
i nt er f ace Amphi bi e extends Sur Ter r e , SurEau {
. . .
}
Attention
Mme si lon utilise le mme mot cl que pour lhritage, ce nest
pas de lhritage multiple qui nexiste pas en Java.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 120 / 121
Polymorphisme dinterfaces
Comme pour les classes, on peut faire du polymorphisme
dinterfaces.
publ i c cl ass Chauf f eur extends Homme implements Sav oi r Condui r e {
. . .
}
publ i c cl ass Pi l o t e extends Homme implements S a v o i r Pi l o t e r {
. . .
}
publ i c cl ass Cour se {
publ i c s t a t i c voi d mai n ( St r i n g [ ] ar gs ) {
Sav oi r Condui r e [ 1 0 ] p a r t i c i p a n t s ;
Chauf f eur j u l i e n = new Chauf f e ur ( ) ;
Pi l o t e s e ba s t i e nLoe b = new Pi l o t e ( ) ;
p a r t i c i p a n t s [ 0 ] = j u l i e n ;
p a r t i c i p a n t s [ 1 ] = s e ba s t i e nLoe b ;
}
}
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 121 / 121