Programmation orientée objet avec Java: Sous-classes, héritage et polymorphisme

Page 1 sur 36Lecteur de document UniversityLib

Programmation orientée objet avec Java: Sous-classes, héritage et polymorphisme

Computer Science - Object-Oriented Programming · notes

Browse all programmation documents

Informatique / Programmation

Programmation orient e objet avec Java

12 : Sous-classes, h ritage et polymorphisme

Jacques Bapst

[email protected]

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