Informatique / Programmation
Programmation orient e objet avec Java
12 : Sous-classes, h ritage et polymorphisme
Jacques Bapst
Java / Sous-classes, h ritage et polymorphisme
Java /
Sous-classe et h ritage
L'h ritage est une propri t essentielle de la programmation
orient e objet.
Ce m canisme permet d'ajouter des fonctionnalit s une classe
(une sp cialisation) en cr ant une sous-classe qui h rite des
propri t s de la classe parente et laquelle on peut ajouter des
propri t s nouvelles.
La classe qui h rite est appel e sous-classe (ou classe d riv e)
de la classe parente (qui est galement appel e super-classe).
L'h ritage permet une sous-classe d' tendre les propri t s
de la classe parente tout en h ritant des champs (attributs) et
des m thodes (comportement) de cette classe parente.
En Java, une classe ne peut h riter que d'une seule classe parente.
On parle dans ce cas d'h ritage simple (par opposition l'h ritage
multiple qui permet une classe d'h riter de plusieurs classes parentes).
EIA-FR / Jacques Bapst
PR1_12
2
Java / Sous-classes, h ritage et polymorphisme
Java /
Arborescence de classes
L'h ritage induit une relation arborescente entre les classes.
A
B
C
D
En notation UML, le symbole
signifie
"est une sous-classe de"
"h rite de"
- La classe A est la classe parente (super-classe) de B
- La classe B est la classe parente de C et D
- La classe B est une sous-classe de A
- Les classes C et D sont des sous-classes de B
B joue plusieurs r les
EIA-FR / Jacques Bapst
PR1_12
3
Java / Sous-classes, h ritage et polymorphisme
Java /
Exemple : classe Vehicule
Pour illustrer le concept, prenons l'exemple d'une classe Vehicule
permettant de d crire (tr s sommairement) les propri t s et les
comportements d'un v hicule du monde r el.
Avec une mod lisation tr s simpliste, la classe pourrait tre
repr sent e de la mani re suivante :
Vehicule
marque
couleur
vitesse
etat
demarrer()
arreter()
accelerer()
freiner()
EIA-FR / Jacques Bapst
PR1_12
4
Java / Sous-classes, h ritage et polymorphisme
Java /
Impl mentation classe Vehicule
public class Vehicule {
private String marque;
private String couleur;
private double vitesse; // Vitesse actuelle
private int
etat; // 0:arr t, 1:marche, ...
public Vehicule(String marque, String couleur) {
this.marque = marque;
this.couleur = couleur;
vitesse = 0.0;
etat
= 0;
}
public void demarrer() { etat = 1; }
public void arreter() { if (vitesse == 0) etat = 0; }
public void accelerer() {
if (etat == 1) vitesse += 5.0;
}
public void freiner() {
if (vitesse >= 5.0) vitesse -= 5.0;
vitesse = 0.0;
else
}
}
EIA-FR / Jacques Bapst
PR1_12
5
Java / Sous-classes et h ritage
Java /
Sous-classes de Vehicule
A partir de la classe
Vehicule on peut, en
utilisant l'h ritage, cr er
de nouvelles classes
(Voiture et Camion) qui
sp cialisent la classe
Vehicule en y ajoutant
de nouvelles propri t s.
Vehicule
marque
couleur
vitesse
etat
demarrer()
arreter()
accelerer()
freiner()
Dans le langage UML, un tel
diagramme est appel
"Diagramme de classes".
Il montre les relations entre
les classes d'une application
Voiture
modele
nbPortes
Camion
chargeMax
poidsChargement
charger()
decharger()
EIA-FR / Jacques Bapst
PR1_12
6
Java / Sous-classes, h ritage et polymorphisme
Java /
Sous-classes Voiture et Camion
La classe Voiture est une sous-classe de Vehicule.
Elle h rite de tous les attributs et m thodes de Vehicule (marque,
couleur, ..., freiner()) en y ajoutant deux nouveaux attributs
(modele et nbPortes).
La classe Camion est galement une sous-classe de Vehicule et
h rite de tous ses attributs et m thodes. La classe Camion tend la
classe parente (Vehicule) en y ajoutant deux nouveaux attributs
(chargeMax et poidsChargement) ainsi que deux nouvelles
m thodes (charger() et decharger()) .
Dans les sous-classes Voiture et Camion, on peut utiliser les
attributs et les m thodes h rit es (par exemple couleur ou
freiner()) comme si ces membres avaient t d clar s dans
chacune des sous-classes (sous r serve, naturellement, que les
droits d'acc s le permettent).
EIA-FR / Jacques Bapst
PR1_12
7
Java / Sous-classes, h ritage et polymorphisme
Java /
D claration de sous-classe
La d claration d'une sous-classe s'effectue en utilisant le mot-cl
extends suivi du nom de la classe parente :
public class Voiture extends Vehicule {
private String modele; // Nouveau champ
nbPortes; // Nouveau champ
private int
public Voiture(String marque, // Constructeur
String modele,
String couleur,
int
nbPortes) {
super(marque, couleur); // Appelle le constructeur de la classe parente
this.modele
this.nbPortes = nbPortes;
= modele;
Advertisement
}
}
EIA-FR / Jacques Bapst
PR1_12
8
Java / Sous-classes, h ritage et polymorphisme
Java /
Relations entre classes [1]
L'h ritage entre une sous-classe et sa classe parente est
caract ris par une relation de type
"Est un..."
"Est une sorte de..."
("Is a...")
("Is kind of...")
ou
" Une voiture est un v hicule
" Un camion est un v hicule
Attention : l'inverse n'est pas forc ment vrai !
Une sous-classe cr e une sp cialisation de la classe parente.
A l'inverse, on parle de g n ralisation lorsqu'on passe des sous-
classes leur classe parente.
Point retenir lors de la conception d'une application :
"Est un..." H ritage
EIA-FR / Jacques Bapst
PR1_12
9
Java / Sous-classes, h ritage et polymorphisme
Java /
G n ralisation / Sp cialisation
n
o
i
t
a
s
i
l
a
i
c
p
S
Oeuvre
Livre
Film
Opera
n
o
i
t
a
s
i
l
a
r
n
G
Roman
BD
Opera-Rock
EIA-FR / Jacques Bapst
PR1_12
10
Java / Sous-classes, h ritage et polymorphisme
Java /
Relations entre classes [2]
Il existe une autre relation importante qui peut exister entre deux
classes. Il s'agit de la relation de composition (ou agr gation) qui
est caract ris e par une relation de type
"A un..."
"Poss de un..."
"Est compos de..."
"Contient..."
ou
ou
ou
("Has a...")
" Une voiture poss de un moteur
" Une voiture a un propri taire
"A un..." Composition
Agr gation
En Java, les relations de composition sont r alis es en cr ant
dans la classe "contenant" une r f rence vers un objet de la
classe "contenu".
public class Voiture extends Vehicule {
private Personne propri taire;
private FuelMotor moteur;
. . .
EIA-FR / Jacques Bapst
PR1_12
11
Java / Sous-classes, h ritage et polymorphisme
Java /
Relations entre classes [3]
En notation UML, la relation "A un", "Poss de un", & est
repr sent e de la mani re suivante :
Voiture
Agr gation
Composition
1
Propri taire
4
Roue
La distinction s mantique entre composition et agr gation ne se
traduit pas (en Java) par des diff rences d'impl mentation.
public class Voiture extends Vehicule {
. . .
private Personne leProprietaire;
private Roue[] lesRoues;
. . .
}
EIA-FR / Jacques Bapst
PR1_12
12
t
n
e
m
l
p
m
o
C
Java / Sous-classes, h ritage et polymorphisme
Java /
G n ralisation
La relation d'h ritage ("Est un...") permet de traiter les objets
des sous-classes comme s'ils taient des objets de leur classe
parente (par g n ralisation).
!
t
n
a
t
r
o
p
m
I
Camion c1 = new Camion(...);
Vehicule v1 = c1; // Ok, un camion est un v hicule
Camion c2 = v1; // ERREUR, un v hicule n'est pas forc ment un camion !
Camion c3 = (Camion)v1; // Ok, v1 r f rence effectivement un camion
Si n cessaire, le syst me effectue donc une conversion
largissante (automatique) de la sous-classe vers la classe
parente (Upcasting).
Une conversion explicite (transtypage, casting) d'un objet de la
classe parente vers un objet de la sous-classe (Downcasting) est
possible si l'instance convertir r f rence effectivement (au moment
de l'ex cution) un objet de la sous-classe consid r e (sinon, il y aura
une erreur ClassCastException l'ex cution).
EIA-FR / Jacques Bapst
PR1_12
13
Java / Sous-classes, h ritage et polymorphisme
Java /
Op rateur instanceof
L'op rateur instanceof permet de tester ( l'ex cution)
l'appartenance d'un objet une classe (ou une interface) donn e.
Dans l'exemple pr c dent, on aurait pu crire :
if (v1 instanceof Camion) {
Advertisement
c3 = (Camion)v1;
}
else {
... // v1 ne r f rence pas un Camion
}
Un tel test permet d' viter une erreur fatale ( l'ex cution) si la
variable v1 ne r f rence pas un objet de type Camion.
Remarque 1 : (v1 instanceof Vehicule) est galement vrai !
Remarque 2 : L'upcasting et le downcasting n'engendrent aucune op ration
ni changement en m moire (c'est une autre "vue" de l'objet)
EIA-FR / Jacques Bapst
PR1_12
14
Java / Sous-classes, h ritage et polymorphisme
Java /
Classe Object
En Java, chaque classe que l'on cr e poss de une classe parente.
Si l'on ne d finit pas explicitement une classe parente (avec
extends), la super-classe par d faut est Object (qui est d clar e
dans le paquetage java.lang).
La classe Object est donc l'anc tre de toutes les classes Java
(c'est la racine unique de l'arbre des classes).
La classe Object est la seule classe Java qui ne poss de pas de
classe parente.
Toutes les classes h ritent donc des m thodes de la classe Object
(par exemple toString(), equals(), finalize(), etc).
La classe Object constitue la g n ralisation ultime :
Tous les objets sont des Object !
EIA-FR / Jacques Bapst
PR1_12
15
Java / Sous-classes, h ritage et polymorphisme
Java /
Cha nage des constructeurs
Un constructeur d'une sous-classe peut faire appel un
constructeur de la classe parente en utilisant le mot r serv
super selon la syntaxe suivante :
super(Expr1, Expr2, ...);
Si un constructeur d'une sous-classe invoque explicitement un
constructeur de la classe parente, l'instruction super(...) doit tre
la premi re instruction du constructeur.
Si l'on ne fait pas explicitement appel un constructeur de la
classe parente, une invocation du constructeur par d faut de
la super-classe (constructeur sans param tre) sera
automatiquement ajout e (comme premi re instruction). Si un tel
constructeur n'existe pas dans la classe parente, une erreur sera
g n r e la compilation.
Le langage garantit ainsi que tous les l ments des classes
parentes aient t labor s avant la cr ation d'un objet de la
classe consid r e.
EIA-FR / Jacques Bapst
PR1_12
16
Java / Sous-classes, h ritage et polymorphisme
Java /
Masquage des champs
Si une sous-classe d finit un champ avec le m me nom qu'un
champ de sa classe parente (une pratique viter), alors le champ
de la super-classe est masqu dans le corps de la sous-classe.
Dans ce cas, on peut, dans le corps de la sous-classe acc der
au champ de la classe parente en utilisant le mot-cl super suivi
d'un point et du nom du champ.
Si les classes A et B d finissent toutes deux un champ x et que B
est une sous-classe de A alors, dans les m thodes de B, on peut
utiliser :
x
this.x
super.x
((A)this).x
Champ x de la classe B
Champ x de la classe B
Champ x de la classe A
Champ x de la classe A (par transtypage)
t
n
e
m
l
p
m
o
C
La notation super.super.x n'est pas autoris e, seul le casting (((A)c).x) permet
d'acc der un champ masqu d'une classe anc tre.
Les champs statiques peuvent galement tre masqu s mais ils
restent accessibles en les pr fixant avec le nom de la classe.
EIA-FR / Jacques Bapst
PR1_12
17
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [1]
Lorsqu'une classe d finit une m thode d'instance en utilisant
la m me signature (m me nom, type de retour [ v. une sous-classe],
param tres, etc.) qu'une m thode de sa classe parente, cette
m thode red finit (overrides) la m thode de sa super-classe.
Par exemple :
public class Polygon {
. . .
public double area() {
. . . // Calcul de la surface d'un polygone quelconque
Polygon
}
. . .
}
public class Rectangle extends Polygon {
Rectangle
. . .
public double area() {
. . . // Calcul de la surface du rectangle (longueur*largeur)
}
. . .
}
EIA-FR / Jacques Bapst
PR1_12
18
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [2]
Les classes Polygone et Rectangle d finissent toutes deux une
m thode area() avec une signature identique.
La m thode invoqu e par un appel obj.area() d pendra du type
de l'objet r f renc par la variable obj lors de l'ex cution
de cette instruction.
C'est toujours la m thode associ e au type effectif de l'objet
r f renc qui est ex cut e, m me si l'objet est enregistr dans
une variable d clar e avec le type d'une classe parente :
Rectangle r = new Rectangle(2.6, 5.3);
Polygon
p = r; // Conversion largissante (Upcasting)
double s = p.area(); // Invoque r.area() et non pas area() de la
// classe Polygon car la variable p r f rence
// un objet de type Rectangle
EIA-FR / Jacques Bapst
PR1_12
19
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [3]
Dans la sous-classe Rectangle, il est possible d'invoquer la
m thode area() de la classe parente Polygon en utilisant
la notation suivante :
super.area()
Remarque : La notation super.super.f() n'est pas autoris e et il est
impossible d'acc der une m thode masqu e d'une classe
anc tre (autre que la classe parente).
A l'ext rieur de la classe de d claration, il n'est, par contre, pas
possible pour un objet de type Rectangle, d'invoquer la m thode
area de la classe Polygon.
Attention bien distinguer (et ne pas confondre) les notions de
surcharge (overloading) et de red finition (overriding) de
m thodes.
EIA-FR / Jacques Bapst
PR1_12
20
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [4]
Lannotation @Override peut tre utilis e pour indiquer
explicitement lintention de red finir une m thode.
Bien qu tant facultative, elle apporte deux avantages :
" Si on se trompe en crivant le nom de la m thode lors de la
red finition, le compilateur peut alors informer le programmeur
de son erreur.
" La red finition tant explicite, le code est plus clair.
Advertisement
@Override
public double area() { & }
t
n
e
m
l
p
m
o
C
EIA-FR / Jacques Bapst
PR1_12
21
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [5]
Les m thodes statiques (m thodes de classe) peuvent tre
masqu es, dans des sous-classes, par des m thodes statiques
poss dant le m me nom ( une pratique viter ).
t
n
e
m
l
p
m
o
C
Ces m thodes masqu es restent cependant accessibles en
les pr fixant avec le nom de la classe dans laquelle elles sont
d finies (comme il est recommand de le faire avec toutes les m thodes
statiques).
On ne peut donc pas sp cialiser une m thode statique dans une
sous-classe (comme les m thodes statiques ne sont jamais
associ es un objet, le polymorphisme de s'applique pas).
En outre, une m thode statique ne peut pas masquer une
m thode d'instance d'une super-classe (erreur la compilation).
EIA-FR / Jacques Bapst
PR1_12
22
Java / Sous-classes, h ritage et polymorphisme
Java /
Red finition des m thodes [6]
Si une m thode est red finie dans une sous-classe, le type de
retour doit tre identique celui de la m thode correspondante
de la classe parente.
En red finissant une m thode, il est possible d' tendre sa zone de
visibilit (private package protected public) mais non de la
restreindre.
Une m thode red finie ne peut pas g n rer plus d'exceptions
contr l es que celles qui sont d clar es dans la m thode de la
classe parente (mais elle peut en d clarer moins).
viter de :
" surcharger une m thode qui est red finie
" red finir une partie des m thodes surcharg es
car cela provoque des risques de confusion et cr e des pi ges lors
des modifications ult rieures des classes.
t
n
e
m
l
p
m
o
C
EIA-FR / Jacques Bapst
PR1_12
23
Java / Sous-classes, h ritage et polymorphisme
Java /
Modificateur final
Dans la d claration d'une classe, le modificateur final indique
que la classe ne peut pas tre sous-class e (on ne peut pas cr er
de classes d riv es).
Dans la d claration d'un champ, le modificateur final indique
que la valeur du champ ne peut pas tre modifi e apr s l'affectation
initiale (dans la d claration ou dans le constructeur). Permet de
d finir des valeurs constantes.
Dans la d claration d'une m thode, le modificateur final indique
que la m thode ne peut pas tre red finie dans une sous-classe.
Dans la d claration des param tres d'une m thode, le
modificateur final indique que la valeur de ces param tres ne peut
pas tre modifi e (il s'agit de param tres d'entr e de la m thode).
Remarque : L'utilisation du modificateur final permet en outre au compilateur
d'effectuer certaines optimisations : mise en ligne de m thodes
(inlining), suppression de la recherche dynamique (late binding), etc.
EIA-FR / Jacques Bapst
PR1_12
24
Java / Sous-classes, h ritage et polymorphisme
Java /
Modificateur protected
Le modificateur protected appliqu aux membres (champs
ou m thodes) d'une classe indique que ces champs ne sont
accessibles que dans la classe de d finition, dans les classes
du m me paquetage et dans les sous-classes de cette classe
(ind pendamment du paquetage).
Il s'agit d'un acc s plus restrictif que public mais - contrairement
ce que son nom pourrait laisser croire - moins restrictif que
l'acc s par d faut (package).
Le modificateur protected devrait tre utilis avec les champs et
les m thodes qui ne sont pas requis par les utilisateurs de la classe
mais qui pourraient s'av rer utiles la cr ation de sous-classes
dans d'autres paquetages.
EIA-FR / Jacques Bapst
PR1_12
25
Java / Sous-classes, h ritage et polymorphisme
Java /
Modificateur private
Le modificateur private, appliqu aux membres (champs ou
m thodes) d'une classe, indique que ces champs ne sont
accessibles que dans la classe de d finition.
M me s'il ne sont pas accessibles dans les sous-classes, les
champs priv s sont malgr tout h rit s dans les sous-classes
(une zone m moire leur est allou e).
Il s'agit de l'acc s le plus restrictif.
Le modificateur private devrait tre utilis avec les champs et
les m thodes qui ne sont utilis s qu'au sein de la classe de
d finition et qui devraient tre cach s partout ailleurs.
Conseil : D'une mani re g n rale il vaut mieux commencer par un acc s
restrictif aux membres d'une classe ( private).
Si n cessaire, il est toujours possible de rel cher les restrictions dans
des versions ult rieures de la classe.
Un rel chement des restrictions pr serve la compatibilit ascendante
(ce qui n'est pas le cas si l'on restreint les droits d'acc s).
EIA-FR / Jacques Bapst
PR1_12
26
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [1]
Si l'on consid re le diagramme de classes suivant :
Animal
age
poids
mange()
dort()
Chien
nom
mange()
joue()
Poisson
mange()
nage()
EIA-FR / Jacques Bapst
PR1_12
27
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [2]
On peut d duire du diagramme de classes les consid rations
suivantes :
" Chien et Poisson sont des sous-classes d'Animal
" Animal est la classe parente de Chien et de Poisson
" Chien h rite des membres d'Animal (age, poids, dort())
" Chien ajoute le champ nom
" Chien ajoute la m thode joue()
" Chien red finit la m thode mange()
" Poisson h rite des membres d'Animal (age, poids, dort())
" Poisson ajoute la m thode nage()
Advertisement
" Poisson red finit la m thode mange()
EIA-FR / Jacques Bapst
PR1_12
28
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [3]
Si l'on impl mente les classes Animal, Chien et Poisson
et que l'on crit le code suivant :
Chien milou = new Chien(...);
milou.mange();
La m thode mange() qui sera invoqu e est celle qui est d finie
dans la sous-classe Chien (car milou est du type Chien et la
m thode mange() est red finie pour cette sous-classe).
Si la sous-classe Chien ne red finissait pas la m thode mange(),
ce serait alors la m thode mange() d'Animal qui serait invoqu e
(la classe Chien en h riterait).
EIA-FR / Jacques Bapst
PR1_12
29
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [4]
Comme un Chien est un Animal (relation d'h ritage) on peut crire
le code suivant :
Animal toutou = new Chien(...);
toutou.mange();
Quelle m thode mange() sera invoqu e dans ce cas ?
C'est toujours la m thode mange() d finie dans la sous-classe
Chien qui sera invoqu e.
M me si toutou est une r f rence de type Animal, c'est le type de
l'objet r f renc qui d termine la m thode qui sera appel e
(comportement d crit sous "Red finition des m thodes").
EIA-FR / Jacques Bapst
PR1_12
30
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [5]
En Java, dans la plupart des situations o il y a des relations
d'h ritage, la d termination de la m thode invoquer n'est pas
effectu e lors de la compilation.
C'est seulement l'ex cution que la machine virtuelle d terminera
la m thode invoquer selon le type effectif de l'objet r f renc ce
moment l .
Ce m canisme s'appelle "Recherche dynamique de m thode"
(Late Binding ou Dynamic Binding).
Ce m canisme de recherche dynamique (durant l'ex cution
de l'application) sert de base la mise en oeuvre de la propri t
appel e polymorphisme.
EIA-FR / Jacques Bapst
PR1_12
31
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme [6]
On pourrait d finir le polymorphisme comme la propri t
permettant un programme de r agir de mani re diff renci e
l'envoi d'un m me message (invocation de m thode) en
fonction des objets qui re oivent ce message.
Il s'agit donc d'une aptitude d'adaptation dynamique du
comportement selon les objets en pr sence.
Avec l'encapsulation et l'h ritage, le polymorphisme est une des
propri t s essentielles de la programmation orient e objet.
Remarque : La surcharge de m thodes peut galement tre consid r e
comme une forme de polymorphisme. Le choix de la m thode
invoquer est cependant d termin la compilation
EIA-FR / Jacques Bapst
PR1_12
32
Java / Sous-classes, h ritage et polymorphisme
Java /
Exemple de polymorphisme [1]
L'exemple qui suit est destin illustrer le principe du
polymorphisme. Il se base sur les classes pr c demment
d finies (Animal, Chien et Poisson).
Si l'on souhaite enregistrer et manipuler une collection d'animaux
(une m nagerie) on peut cr er et alimenter le tableau suivant :
// D claration et cr ation du tableau
Animal[] menagerie = new Animal[6];
// Alimentation du tableau
menagerie[0] = new Poisson(...);
menagerie[1] = new Chien(...);
menagerie[2] = new Chien(...);
menagerie[3] = new Animal(...);
menagerie[4] = new Poisson(...);
menagerie[5] = new Chien(...);
EIA-FR / Jacques Bapst
PR1_12
33
Java / Sous-classes, h ritage et polymorphisme
Java /
Exemple de polymorphisme [2]
Le polymorphisme nous permet d' crire une m thode nourrir dont
la fonction est de donner manger chaque animal contenu dans
le tableau pass en param tre en appelant successivement
la m thode mange() pour chacun d'eux.
//---------------------------------------------------
// Appelle la m thode mange() pour chaque animal contenu
// dans le tableau pass en param tre
//---------------------------------------------------
public static void nourrir(Animal[] tabAnimaux) {
if (tabAnimaux == null) return;
for (int i=0; i<tabAnimaux.length; i++) {
if (tabAnimaux != null) {
tabAnimaux .mange();
}
}
}
EIA-FR / Jacques Bapst
PR1_12
34
Java / Sous-classes, h ritage et polymorphisme
Java /
Exemple de polymorphisme [3]
On peut ensuite appeler la m thode nourrir() en lui passant en
param tre la m nagerie pr c demment cr e :
nourrir(menagerie);
Sur la base du contenu de menagerie, la m thode nourrir()
appellera successivement :
mange() de la classe Poisson
mange() de la classe Chien
mange() de la classe Chien
mange() de la classe Animal
mange() de la classe Poisson
mange() de la classe Chien
La m thode nourrir() n'a pas besoin de d terminer elle-m me
quelle m thode doit tre appel e pour chaque animal.
Le polymorphisme fera en sorte que le message mange() soit
interpr t ( l'ex cution) de mani re appropri e selon les objets
qui le re oivent (ainsi chaque animal mangera selon ses go ts !).
EIA-FR / Jacques Bapst
PR1_12
35
Java / Sous-classes, h ritage et polymorphisme
Java /
Polymorphisme Synth se du m canisme
En Java, les variables sont typ es. Avec la notion d'h ritage,
plusieurs types peuvent tre compatibles avec une d claration
de variable.
short s; // Ne peut rien contenir d'autre qu'un short
Object o; // Peut contenir une r f rence vers un Object,
// ou un objet dune sous-classe
Le compilateur sassure que les instructions sont compatibles avec
la d claration :
Object o;
o = "ah";
int i=o.length(); // Refus , car length() Object
int i=((String)o).length(); // Ok si o r f rence un String
A lex cution, Java suit toujours la fl che pour atteindre les
m thodes :
Animal a;
a = new Chien();
a.mange(); // Ce sera bien la m thode red finie par la
// classe Chien qui sera ex cut e
public class Animal {
void mange() {...}
}
public class Chien extends Animal {
void mange() {...} // Red finition !
}
EIA-FR / Jacques Bapst
PR1_12
36