Você está na página 1de 39

Hritage, classes abstraites et interfaces

Universit de Nice - Sophia Antipolis


Version 7.0.6 1/7/13 Richard Grin

Plan de cette partie


Hritage Classe Object

Polymorphisme Classes abstraites Interfaces Rutiliser des classes Mcanisme de la liaison retarde
R. Grin Java : hritage et polymorphisme 2

Rutilisation

Hritage

Pour raccourcir les temps dcriture et de mise au point du code dune application, il est intressant de pouvoir rutiliser du code dj utilis

R. Grin

Java : hritage et polymorphisme

R. Grin

Java : hritage et polymorphisme

Rutilisation par des classes clientes


Soit une classe A dont on a le code compil Une classe C veut rutiliser la classe A Elle peut crer des instances de A et leur demander des services On dit que la classe C est une classe cliente de la classe A

Rutilisation avec modifications


On peut souhaiter modifier en partie le comportement de A avant de la rutiliser : le comportement de A convient, sauf pour des dtails quon aimerait changer on aimerait ajouter une nouvelle fonctionnalit A

R. Grin

Java : hritage et polymorphisme

R. Grin

Java : hritage et polymorphisme

Rutilisation avec modifications du code source


On peut copier, puis modifier le code source de A dans des classes A1, A2,... Problmes : code source de A pas toujours disponible les amliorations futures du code de A ne seront pas dans les classes A1, A2, (et rciproquement) ; difficile maintenir !

R. Grin Java : hritage et polymorphisme 7

Rutilisation par lhritage


Lhritage existe dans tous les langages objet classes Lhritage permet dcrire une classe B

qui se comporte dans les grandes lignes comme la classe A mais avec quelques diffrences sans toucher ni copier le code source de A On a seulement besoin du code compil de A
R. Grin Java : hritage et polymorphisme 8

Rutilisation par lhritage


Le code source de B ne comporte que ce qui a chang par rapport au code de A On peut par exemple ajouter de nouvelles mthodes modifier certaines mthodes

Vocabulaire
La classe B qui hrite de la classe A sappelle une classe fille ou sous-classe La classe A sappelle une classe mre, classe parente ou super-classe

R. Grin

Java : hritage et polymorphisme

R. Grin

Java : hritage et polymorphisme

10

Exemple dhritage - classe mre


public class Rectangle { private int x, y; // sommet en haut gauche private int largeur, hauteur; // La classe contient des constructeurs, // des mthodes getX(), setX(int) // getHauteur(), getLargeur(), // setHauteur(int), setLargeur(int), // contient(Point), intersecte(Rectangle) // translateToi(Vecteur), toString(),... . . . public void dessineToi(Graphics g) { g.drawRect(x, y, largeur, hauteur); } }

Exemple dhritage - classe fille


public class RectangleColore extends Rectangle { private Color couleur; // nouvelle variable // Constructeurs . . . // Nouvelles Mthodes public Color getCouleur() { return this.couleur; } public void setCouleur(Color c) {this.couleur = c; } // Mthode modifie public void dessineToi(Graphics g) { g.setColor(couleur); g.fillRect(getX(), getY(), getLargeur(), getHauteur()); } }
11 R. Grin Java : hritage et polymorphisme 12

R. Grin

Java : hritage et polymorphisme

Code des classes filles

Exemples dhritages
Classe mre Vehicule, classes filles Velo, Voiture et Camion Classe Avion, classes mres ObjetVolant et

Quand on crit la classe RectangleColore, on doit seulement crire le code (variables ou mthodes) li aux nouvelles possibilits ; on ajoute ainsi une variable couleur et les mthodes qui y sont lies redfinir certaines mthodes ; on redfinit la mthode dessineToi()
Java : hritage et polymorphisme 13

ObjetMotorise

Classe Polygone hrite de la classe


FigureGeometrique

Classe Image, classes filles ImageGIF et


ImageJpeg

R. Grin

R. Grin

Java : hritage et polymorphisme

14

2 faons de voir lhritage


Particularisation-gnralisation : un polygone est une figure gomtrique, mais une figure gomtrique particulire la notion de figure gomtrique est une gnralisation de la notion de polygone Une classe fille offre de nouveaux services ou enrichit les services rendus par une classe : la classe RectangleColore permet de dessiner avec des couleurs et pas seulement en noir et blanc

R. Grin Java : hritage et polymorphisme 15

Chaque langage objet a ses particularits Par exemple, C++ et Eiffel permettent lhritage multiple ; C# et Java ne le permettent pas A partir de ce point on dcrit lhritage dans le langage Java

R. Grin

Java : hritage et polymorphisme

16

Lhritage en Java
En Java, chaque classe a une et une seule classe mre (pas dhritage multiple) dont elle hrite les variables et les mthodes Le mot clef extends indique la classe mre :

Exemples dhritages
class Voiture extends Vehicule class Velo extends Vehicule class VTT extends Velo class Employe extends Personne class ImageGIF extends Image class PointColore extends Point class Polygone extends FigureGeometrique

class RectangleColore extends Rectangle

Par dfaut (pas de extends dans la dfinition dune classe), une classe hrite de la classe Object (tudie plus loin)
Java : hritage et polymorphisme 17

R. Grin

R. Grin

Java : hritage et polymorphisme

18

Ce que peut faire une classe fille


La classe qui hrite peut ajouter des variables, des mthodes et des constructeurs redfinir des mthodes (mme signature) surcharger des mthodes (mme nom mais pas mme signature) Mais elle ne peut retirer aucune variable ou mthode

R. Grin Java : hritage et polymorphisme 19

Principe important li la notion dhritage


Si B extends A , le grand principe est que tout B est un A Par exemple, un rectangle color est un rectangle ; un poisson est un animal ; une voiture est un vhicule En Java, on vitera dutiliser lhritage pour rutiliser du code dans dautres conditions

R. Grin Java : hritage et polymorphisme 20

Types en Java
Le type dune variable dtermine les donnes que la variable peut contenir/rfrencer Le type dune expression dcrit la forme du rsultat du calcul de lexpression Par exemple, si x et y sont des int, x + y est de type int Les types en Java : types primitifs, tableaux, numrations et classes On verra aussi les interfaces et les types gnriques

R. Grin Java : hritage et polymorphisme 21

Sous-type

B est un sous-type de A si on peut ranger une expression de type B dans une variable de type A

Les sous-classes dune classe A sont des soustypes de A En effet, si B hrite de A, tout B est un A donc on peut ranger un B dans une variable de type A Par exemple,

A a = new B();

est autoris
R. Grin Java : hritage et polymorphisme 22

Lhritage en notation UML


Cercle private Point centre private int rayon public Cercle(Point, int) public void setRayon(int) public int getRayon() public double surface() ...

Complments sur les constructeurs dune classe

Uniquement les lments ajouts ou modifis par la classe fille


R. Grin

CercleColore private String couleur ... public String getCouleur()


Java : hritage et polymorphisme 23

1re instruction dun constructeur

Constructeur de la classe mre


public class Rectangle { private int x, y, largeur, hauteur; public Rectangle(int x, int y, int largeur, int hauteur) { this.x = x; this.y = y; this.largeur = largeur; this.longueur = longueur; } . . . }

La premire instruction dun constructeur peut tre un appel un constructeur de la classe mre : super(...)

ou un autre constructeur de la classe : this(...) Interdit de placer this() ou super() ailleurs quen premire instruction dun constructeur
R. Grin Java : hritage et polymorphisme 25

R. Grin

Java : hritage et polymorphisme

26

Constructeurs de la classe fille


public class RectangleColore extends Rectangle { private Color couleur; public RectangleColore(int x, int y, int largeur, int hauteur Color couleur) { super(x, y, largeur, hauteur); this.couleur = couleur; } public RectangleColore(int x, int y, int largeur, int hauteur) { this(x, y, largeur, hauteur, Color.black); } . . . }
R. Grin Java : hritage et polymorphisme 27

Appel implicite du constructeur de la classe mre

Si la premire instruction dun constructeur nest ni super(...), ni this(...), le compilateur ajoute au dbut un appel implicite super()au constructeur sans paramtre de la classe mre (erreur de compilation sil nexiste pas !) toujours excut avant les autres instructions du constructeur

Un constructeur de la classe mre est


R. Grin Java : hritage et polymorphisme 28

Toute premire instruction excute par un constructeur


Mais la premire instruction dun constructeur de la classe mre est lappel un constructeur de la classe grand-mre , et ainsi de suite... Donc la toute, toute premire instruction qui est excute par un constructeur est le constructeur (sans paramtre) de la classe Object !

Complment sur le constructeur par dfaut dune classe

Ce constructeur par dfaut nappelle pas explicitement un constructeur de la classe mre un appel du constructeur sans paramtre de la classe mre est automatiquement effectu

(Cest le seul qui sait comment crer un nouvel objet en mmoire)


Java : hritage et polymorphisme 29 R. Grin Java : hritage et polymorphisme 30

R. Grin

Question

Exemples de constructeurs (1)


import java.awt.*; // pour classe Point public class Cercle { // Constante public static final double PI = 3.14; // Variables private Point centre; Plus de constructeur sans private int rayon; paramtre par dfaut ! // Constructeur public Cercle(Point c, int r) { centre = c; Appel implicite du rayon = r; constructeur Object() }
31 R. Grin Java : hritage et polymorphisme 32

Compile ? class A { Sexcute ? private int i; A(int i) { this.i = i; } } class B extends A { }

R. Grin

Java : hritage et polymorphisme

Exemples de constructeurs (2)


// Mthodes public double surface() { return PI * rayon * rayon; } public Point getCentre() { return centre; } public static void main(String[] args) { Point p = new Point(1, 2); Cercle c = new Cercle(p, 5); System.out.println("Surface du cercle:" + c.surface()); } }
R. Grin Java : hritage et polymorphisme 33 R. Grin

Exemples de constructeurs (3)


public class CercleColore extends Cercle { private String couleur; public CercleColore(Point p, int r, String c) { super(p, r); Que se passe-t-il si on couleur = c; enlve cette instruction ? } public void setCouleur(String c) { couleur = c; } public String getCouleur() { return couleur; } }
Java : hritage et polymorphisme 34

Une erreur de dbutant !


public class CercleColore extends Cercle { private Point centre; private int rayon; private String couleur; public CercleColore(Point p, int r, String c) { centre = c; rayon = r; couleur = c; } centre et rayon

Hritage problme daccs


public class Animal { String nom; // pas private ; suivre... public Animal() { } public Animal(String unNom) { nom = unNom; } public void setNom(String unNom) { nom = unNom; } public String toString() { return "Animal " + nom; } }
35 R. Grin Java : hritage et polymorphisme 36

sont hrits de Cercle ; ne pas les redclarer !


R. Grin Java : hritage et polymorphisme

Hritage problme daccs


public class Poisson extends Animal { private int profondeurMax; public Poisson(String nom, int uneProfondeur) { this.nom = nom; // Et si nom est private ? profondeurMax = uneProfondeur; } public void setProfondeurMax(int uneProfondeur) { profondeurMax = uneProfondeur; } public String toString() { return "Poisson " + nom + " ; plonge jusqu " + profondeurMax + " mtres"; } }
R. Grin Java : hritage et polymorphisme 37

Rsoudre un problme daccs


public class Poisson extends Animal { private int profondeurMax; public Poisson(String unNom, int uneProfondeur) { super(unNom); // convient mme si nom est private profondeurMax = uneProfondeur; } public void setProfondeurMax(int uneProfondeur) { profondeurMax = uneProfondeur; Accesseur obligatoire } si nom est private public String toString() { return "Poisson " + getNom() + " plonge jusqu " + profondeurMax + " mtres"; } }
R. Grin Java : hritage et polymorphisme 38

this et constructeurs

this et constructeurs
Durant la redescente dans les constructeurs des classes anctres, le type de lobjet en cours de cration (this) est son type rel Cest utile de le savoir sil y a un appel polymorphe dans un des constructeurs ( viter !)

this existe ds que lobjet a t cr par le constructeur de la classe Object this nexiste pas avant, dans la remonte vers le constructeur de la classe Object Pratiquement, this existe au retour du premier appel super() ou this(), mais pas avant Ainsi this ne peut tre utilis (explicitement ou implicitement) dans les paramtres de super() ou de this() On ne peut donc pas faire un appel une mthode dinstance dans les arguments passs super() ou this()
Java : hritage et polymorphisme 39

R. Grin

R. Grin

Java : hritage et polymorphisme

40

Appel dune mthode dinstance en argument dun constructeur

Rsoudre ce problme

Si traitement est une mthode dinstance de la classe Classe, le code new Classe(traitement(), ) est interdit depuis une autre classe Exemple (calculePrix est une mthode dinstance de la classe Lot) :
new Lot(calculePrix(article), article);

Revoir la conception ; souvent la meilleure solution, mais a nest pas toujours possible : Ne pas mettre de constructeur de Lot qui ncessite la donne du prix du lot ; pas de variable prix dans Lot ; la mthode getPrix() calcule le prix quand on le demande Utiliser un autre constructeur et faire lappel la mthode dinstance dans le constructeur
this(article); // autre constructeur prix = calculePrix(article);

2 manires interdites de rsoudre le problme :


int v = traitement(); this(v, ); // ou super(v, ); this(traitement(), );

Utiliser une mthode static (pas dutilisation de this implicite dans les paramtres du constructeur) si cest un traitement qui nest pas li une instance particulire

R. Grin

Java : hritage et polymorphisme

41

R. Grin

Java : hritage et polymorphisme

42

Ordre dexcution des initialisations au chargement dune classe


1.

Ordre dexcution des initialisations la cration dune instance


1. 2.

2.

Initialisation des variables statiques, leur valeur par dfaut, puis aux valeurs donnes par le programmeur Excution des blocs initialiseurs statiques

3.

4. 5.
R. Grin Java : hritage et polymorphisme 43 R. Grin

Initialisation des variables dinstance la valeur par dfaut de leur type Appel du constructeur de la classe mre (explicite ou implicite) ; viter les appels de mthodes redfinies car les variables dinstances ne sont pas encore initialises dans les classes filles Initialisations des variables dinstances si elles sont initialises dans leur dclaration Excution des blocs initialiseurs dinstance (tudis
plus loin)

Excution du code du constructeur


Java : hritage et polymorphisme 44

De quoi hrite une classe ? Accs aux membres hrits Protection protected
Si une classe B hrite de A (B extends A), elle hrite automatiquement et implicitement de tous les membres de la classe A Cependant la classe B peut ne pas avoir accs certains membres dont elle a implicitement hrit (par exemple, les membres private) Ces membres sont utiliss pour le bon fonctionnement de B, mais B ne peut pas les nommer ni les utiliser explicitement

45 R. Grin Java : hritage et polymorphisme 46

R. Grin

Java : hritage et polymorphisme

Protection protected

Exemple dutilisation de protected


public class Animal { protected String nom; . . . }

protected joue sur laccessibilit des membres (variables ou mthodes) par les classes

Note : il est dconseill dutiliser des variables protected (voir suite de ce cours)

filles Les classes filles de A ont accs aux membres protected de la classe A ; les autres classes non filles de A ny ont pas accs

public class Poisson extends Animal { private int profondeurMax; public Poisson(String unNom, int uneProfondeur) { nom = unNom; // utilisation de nom profondeurMax = uneProfondeur; }

R. Grin

Java : hritage et polymorphisme

47

R. Grin

Java : hritage et polymorphisme

48

protected et paquetage

Prcision sur protected


Soit m un membre dclar dans la classe A et daccs protected ; soit b1 une instance de B, classe fille de A b1 a accs

En plus, protected autorise lutilisation par les classes du mme paquetage que la classe o est dfini le membre ou le constructeur

b1.m (sous la forme m ou this.m) b2.m o b2 est une instance de B (la granularit de protection est la classe) ou dune sous-classe de B

Mais b na pas accs


a.m o a est une instance de A
Java : hritage et polymorphisme 50

R. Grin

Java : hritage et polymorphisme

49

R. Grin

Prcision sur protected (2)

Exemple dutilisation de protected


class A { . . . protected int m() { . . . } } class B extends A { . . . public int m2() { int i = m(); // toujours autoris A a = new A(); i += a.m(); // pas toujours autoris . . . a dpend de quoi ? }
R. Grin Java : hritage et polymorphisme 52

Attention, protected joue donc sur laccessibilit par B du membre m hrit (B comme sous-classe de A) mais pas sur laccessibilit par B du membre m des instances de A (B comme cliente de A)

R. Grin

Java : hritage et polymorphisme

51

Pour tre tout fait prcis avec protected

Toutes les protections daccs

Du code de B peut accder un membre protected de A (mthode m() ci-dessous) dans une instance de B ou dune sous-classe C de B mais pas dune instance dune autre classe (par exemple, de la classe est A ou dune autre classe fille D de A) ; voici du code de la classe B :
A a = new B b = new C c = new D d = new a.m(); // b.m(); // c.m(); // d.m(); // A(); // A classe mre de B B(); C(); // C sous-classe de B D(); // D autre classe fille de A interdit autoris autoris interdit
Java : hritage et polymorphisme 53

Les diffrentes protections sont donc les suivantes (dans lordre croissant de protection) :
public protected package (protection par dfaut) private

protected est donc moins restrictive que la

protection par dfaut !


R. Grin Java : hritage et polymorphisme 54

R. Grin

Protections des variables


On sait que, sauf cas exceptionnel, les variables doivent tre dclares private On peut ajouter quon peut quelquefois dclarer une variable protected, pour autoriser la manipulation directe par les futures classes filles Mais il est prfrable de lviter, car cela nuit lencapsulation dune classe mre par rapport ses classes filles Pas ce problme avec les mthodes protected

R. Grin Java : hritage et polymorphisme 55

protected et constructeur

Si un constructeur de A est dclar protected, ce constructeur peut tre appel depuis un constructeur d'une classe fille B par un appel super() mais B ne peut crer dinstance de A par new
A()
(sauf si B est dans le mme paquetage que A)

R. Grin

Java : hritage et polymorphisme

56

Classe Object
En Java, la racine de larbre dhritage des classes est la classe java.lang.Object La classe Object na pas de variable dinstance ni de variable de classe La classe Object fournit plusieurs mthodes qui sont hrites par toutes les classes sans exception Les plus couramment utilises sont les mthodes toString et equals

57 R. Grin Java : hritage et polymorphisme 58

Classe Object

R. Grin

Java : hritage et polymorphisme

Classe Object - mthode


toString()

Mthode toString() de la classe Object


Elle renvoie le nom de la classe, suivie de @ et de la valeur de la mthode hashcode La plupart du temps ( la convenance de limplmentation) hashcode renvoie la valeur hexadcimale de ladresse mmoire de lobjet Pour tre utile dans les nouvelles classes, la mthode toString() de la classe Object doit donc tre redfinie

59 R. Grin Java : hritage et polymorphisme 60

public String toString()

renvoie une description de lobjet sous la forme dune chane de caractres Elle est utile pendant la mise au point des programmes pour faire afficher ltat dun objet ; la description doit donc tre concise, mais prcise

R. Grin

Java : hritage et polymorphisme

10

Exemple
public class Livre { ... @Override public String toString() { return "Livre [titre=" + titre + ",auteur=" + auteur + ",nbPages=" + nbPages + "]"; } }
Richard Grin Classes et objets page 61

println et toString
Si p1 est un objet, System.out.println(p1) (ou System.out.print(p1)) affiche la chane de caractres p1.toString() o toString() est la mthode de la classe de p1 Il est ainsi facile dafficher une description des objets dun programme pendant la mise au point du programme

R. Grin

Java : hritage et polymorphisme

62

Oprateur + et toString

Classe Object - equals


public boolean equals(Object obj) renvoie true si et seulement si lobjet courant this a la mme valeur que lobjet obj

toString est utilise par loprateur + quand un des 2 oprandes est une String (concatnation de

chanes) :
Employe e1; . . . String s = "Employe numro " + 1 + ": " + e1;

La mthode equals de Object renvoie true si this rfrence le mme objet que obj Elle peut tre redfinie dans les classes pour lesquelles on veut une relation dgalit (dquivalence dirait-on en mathmatiques) autre que celle qui correspond lidentit des objets

R. Grin Java : hritage et polymorphisme 64

R. Grin

Java : hritage et polymorphisme

63

Problme frquent

Table de hachage
Structure de donnes qui permet de retrouver trs rapidement un objet si on connat sa cl En interne laccs aux objets utilise un tableau et une fonction de hachage applique la cl
Dessin rcupr sur Wikipedia

Rechercher des informations en connaissant une cl qui les identifie Par exemple, chercher les informations sur lemploy qui a le matricule AF823 Une table de hachage permet dimplmenter cette fonctionnalit

Fonction de hachage

R. Grin

Java : hritage et polymorphisme

65

R. Grin

Java : collections

Tableau utilis en interne

66

11

Exemple de fonction de hachage


Pour un nom, 100 x longueur + la somme des valeurs des lettres toto 400 + 15 + 20 + 15 + 20 = 470 Il se peut que 2 cls diffrentes donnent la mme valeur de hachage : toto et otto

R. Grin Java : hritage et polymorphisme 67

Cls avec une mme valeur de hachage


Techniques informatiques pour retrouver le bon objet parmi tous les objets qui ont une cl avec une mme valeur de hachage, au dtriment des performances Par exemple, ranger ces objets dans une liste chane quil faut alors parcourir pour retrouver le bon objet Une bonne fonction de hachage ne donne pas trop de valeurs gales pour des cls diffrentes

R. Grin Java : collections 68

hashCode

criture de hashCode
La valeur calcule doit ne pas tre trop longue calculer ne pas avoir trop de valeurs calcules gales, pour ne pas nuire aux performances des tables de hachage qui utilisent ces valeurs renvoyer la mme valeur pour 2 objets qui sont gaux au sens de equals Il ny a pas de formule universelle et il est souvent difficile de trouver une bonne mthode hashCode
R. Grin Java : hritage et polymorphisme 70

public int hashCode() mthode de la classe Object qui est utilise

comme fonction de hachage par les tables de hachage fournies par le JDK La spcification de Java prcise que 2 objets gaux au sens de equals doivent renvoyer le mme entier pour hashCode Toute classe qui redfinit equals doit donc redfinir hashCode
R. Grin Java : hritage et polymorphisme 69

Valeurs significatives pour equals


Il faut commencer par extraire de ltat des objets des valeurs significatives pour la mthode equals Ce sont des valeurs telles que, 2 objets sont gaux au sens de equals si et seulement sils ont les mmes valeurs Le plus souvent ce sont les valeurs de certains champs des objets (par exemple le nom et le prnom)

R. Grin Java : hritage et polymorphisme 71

Valeurs significatives pour equals


Quelquefois il faut transformer les champs des objets pour obtenir ces valeurs significatives Ainsi, dans lexemple suivre des fractions, il faut rduire les fractions

R. Grin

Java : hritage et polymorphisme

72

12

Exemple de hashCode

Exemple de hashCode
Types possibles des valeurs significatives : type primitif tableau classe Si le type est une classe qui a une mthode hashcode (on suppose quelle est correcte), utiliser la valeur renvoye par cette mthode Les transparents suivants expliquent quelles valeurs prendre pour les types primitifs et les tableaux
Java : hritage et polymorphisme 74

Il faut alors trouver partir des valeurs significatives une formule qui donne le plus de valeurs distinctes de hashcode pour des objets distincts Voici une recette (cite par le livre Effective Java ) qui montre comment combiner des valeurs significatives pour obtenir un hashcode
Java : hritage et polymorphisme 73

R. Grin

R. Grin

Exemple de hashCode types primitifs

Exemple de hashCode - tableau


Si le type du champ significatif est un tableau, combiner les lments significatifs du tableau comme sils taient des champs spars dun objet rfrenc : commencer avec la valeur 17 puis combiner itrativement les hashCodes des lments par 31 * resultat + <code lment> Si tous les lments du tableau sont significatifs, le plus simple est dutiliser la mthode static

HashCode pour les champs f de type primitif :


boolean : f ? 0 : 1 byte, char, short, int : (int)f long : (int)(f ^ (f >>> 32)) float : Float.floatToIntBits(f) double : Double.doubleToLongBits(f) et appliquer le calcul sur le type long

java.util.Arrays.hashcode(tableau)

ajoute par Java 5


R. Grin Java : hritage et polymorphisme 75 R. Grin Java : hritage et polymorphisme 76

Exemple de hashCode combiner les valeurs

Exemple de equals et toString


public class Fraction { private int num, den; . . . @Override public String toString() { return num + "/" + den; } @Override public boolean equals(Object o) { if (! (o instanceof Fraction)) return false; return num * ((Fraction)o).den == den * ((Fraction)o).num; } a/b = c/d }

Il reste combiner itrativement les valeurs obtenues pour toutes les valeurs significatives par la formule magique (voir livre Effective Java pour explications) suivante :
commencer par initialiser la variable resultat 17 (la variable qui contiendra le hashcode) puis boucler sur toutes les valeurs trouves pour chacun des champs significatifs, en calculant
31 * resultat + <valeur>

ssi

R. Grin

Java : hritage et polymorphisme

77

R. Grin

Java : hritage et polymorphisme

a*d = b*c

78

13

Exemple de hashCode
/* Rduit la fraction et applique la recette */ @Override public int hashCode() { Fraction f = reduire(); return 31 * (31 * 17 + f.num) + f.den; } }

Pour calculer hashCode


private static int pgcd(int i1, int i2) { if(i2 == 0) return i1; else return pgcd(i2, i1 % i2); } public Fraction reduire() { int d = pgcd(num, den); return new Fraction(num/d, den/d); }

R. Grin

Java : hritage et polymorphisme

79

R. Grin

Java : hritage et polymorphisme

80

Autre recette pour hashCode

Une recette simplissime qui peut convenir sil les performances ne sont pas critiques pour la recherche dans la table de hachage (moins bonne rpartition des valeurs) : transformer tous les attributs en String, concatner et appliquer la mthode hashcode de la classe
String

Mthode getClass classe java.lang.Class

public Class getClass()

renvoie la classe de lobjet (le type retour est un peu plus complexe comme on le verra dans le cours sur la gnricit) Une instance de la classe Class reprsente un type (classe, interface, type primitif, tableau, numration) utilis par lapplication
R. Grin Java : hritage et polymorphisme 82

R. Grin

Java : hritage et polymorphisme

81

Quelques instances de Class


Classe : fr.unice.employe.Employe.class Interface : java.util.List.class Types primitifs : int.class, boolean.class, double.class Tableaux : int[].class, Employe[].class

Classe Class mthode getName


La mthode getName() de la classe Class renvoie le nom complet de la classe (avec le nom du paquetage) La mthode getSimpleName() de la classe Class renvoie le nom terminal de la classe (sans le nom du paquetage)

R. Grin

Java : hritage et polymorphisme

83

R. Grin

Java : hritage et polymorphisme

84

14

instanceof

Classe java.util.Objects (1/2)


Nouvelle classe du JDK 7 Elle fournit des mthodes de classe (static) utilitaires, pour les objets en gnral Quelquefois juste une couche mince pour faciliter la manipulation des valeur null : compare, equals, toString, hashCode, requireNonNull ; par exemple, <T> int compare(T, T) retourne 0 si les 2 objets sont

Si x est une instance dune sous-classe B de A,


x instanceof A renvoie true

Pour tester si un objet o est de la mme classe que lobjet courant, il ne faut donc pas utiliser instanceof mais le code suivant :
if (o != null && o.getClass() == this.getClass())

null
R. Grin Java : hritage et polymorphisme 85 R. Grin Java : hritage et polymorphisme 86

Classe java.util.Objects (2/2)


<T> T requireNonNull(T) retourne lobjet pass en paramtre sil nest pas null et lance une NullPointerException sinon ; peut servir affecter un paramtre une variable tout en testant quil nest pas null int hash(Object) gnre un code de hachage pour les objets passs en paramtres ; utile pour gnrer le code de hachage dun objet en se basant sur les codes de hachage des champs qui le compose ; utilise Arrays.hashCode

R. Grin Java : hritage et polymorphisme 87 R. Grin

Complments sur la redfinition dune mthode

Java : hritage et polymorphisme

88

Annotation pour la redfinition

Redfinition et surcharge
Ne pas confondre redfinition et surcharge des mthodes Une mthode redfinit une mthode hrite quand elle a la mme signature que lautre mthode Une mthode surcharge une mthode (hrite ou dfinie dans la mme classe) quand elle a le mme nom, mais pas la mme signature, que lautre mthode

R. Grin Java : hritage et polymorphisme 90

Depuis Java 5 on peut annoter par @Override une mthode qui redfinit une mthode dune classe anctre, y compris une mthode abstraite (ou qui implmente une mthode dune interface depuis Java 6)
@Override public Dimension getPreferredSize() {

Utile pour la lisibilit et pour reprer des fautes de frappe dans le nom de la mthode : le compilateur envoie un message derreur si la mthode ne redfinit aucune mthode
Java : hritage et polymorphisme 89

R. Grin

15

Exemple de redfinition

Exemple de surcharge

Redfinition de la mthode de la classe Object boolean equals(Object)

Surcharge de la mthode equals de Object :

public class Entier { private int i; public Entier(int i) { this.i = i; } @Override public boolean equals(Object o) { if (o == null || (o.getClass() != this.getClass())) return false; Peut-on enlever return i == ((Entier)o).i; } cette instruction if ? }
R. Grin Java : hritage et polymorphisme 91

public class Entier { private int i; public Entier(int i) { this.i = i; } public boolean equals(Entier e) { if (e == null) return false; return i == e.i; } }

Il faut redfinir la mthode equals et ne pas la surcharger (explications la fin de cette partie du cours)

R. Grin

Java : hritage et polymorphisme

92

super.
Soit une classe B qui hrite dune classe A Dans une mthode dinstance m de B, super. sert dsigner un membre de A En particulier, super.m() dsigne la mthode m de A qui est en train dtre redfinie dans B :

Complments sur super.


On ne peut trouver super.m() dans une mthode static m() ; une mthode static ne peut tre redfinie
super.i dsigne la variable cache i de la classe mre (ne devrait jamais arriver) ; dans ce cas, super.i est quivalent ((A)this).i

@Override public int m(int i) { return 500 + super.m(i); }


R. Grin Java : hritage et polymorphisme 93 R. Grin Java : hritage et polymorphisme 94

Limite pour dsigner une mthode redfinie

On ne peut remonter plus haut que la classe mre pour rcuprer une mthode redfinie :
pas de cast (ClasseAncetre)m() pas de super.super.m()

Polymorphisme

R. Grin

Java : hritage et polymorphisme

95

16

Une question
B hrite de A B redfinit une mthode m() de A Quelle mthode m est excute, celle de A ou celle de B ? a est une variable qui contient

Polymorphisme
Le polymorphisme est le fait quune mme criture peut correspondre diffrents appels de mthodes ; par exemple,
A a = x.f(); a.m();
f peut renvoyer une instance de A ou de nimporte quelle sous-classe de A

A a = new B(5); a.m();

un objet de la classe B mais elle est dclare du type A

La mthode appele ne dpend que du type rel de lobjet rfrenc par a (B) et pas du type dclar de a (A). Cest la mthode m de B qui est excute
Java : hritage et polymorphisme 97

peut appeler la mthode m de A ou dune sousclasse de A (connue seulement lexcution) Ce concept est une notion fondamentale de la programmation objet, indispensable pour une utilisation efficace de lhritage
R. Grin Java : hritage et polymorphisme 98

R. Grin

Mcanisme du polymorphisme

Exemple de polymorphisme
public class Figure { public void dessineToi() { } Mthode vide } public class Rectangle extends Figure { public void dessineToi() { . . . } public class Cercle extends Figure { public void dessineToi() { . . . }
99 R. Grin Java : hritage et polymorphisme 100

Le polymorphisme est obtenu grce au late binding (liaison retarde) : la mthode qui sera excute est dtermine seulement lexcution, et pas ds la compilation (par le type rel de lobjet qui reoit le message, et pas par son type dclar)

R. Grin

Java : hritage et polymorphisme

Exemple de polymorphisme (suite)


public class Dessin { // dessin compos de plusieurs figures private Figure[] figures; . . . Cest la mthode public void afficheToi() { du type rel for (int i = 0; i < nbFigures; i++) de figures[i] figures[i].dessineToi(); qui est appele } public static void main(String[] args) { Dessin dessin = new Dessin(30); . . . // cration des points centre, p1, p2 dessin.ajoute(new Cercle(centre, rayon)); dessin.ajoute(new Rectangle(p1, p2)); dessin.afficheToi(); ajoute une figure . . . dans figures[]
R. Grin Java : hritage et polymorphisme 101

Typage statique et polymorphisme


Le typage statique doit garantir ds la compilation lexistence de la mthode appele : la classe dclare de lobjet (et donc toutes les sous-classes par hritage) qui reoit le message doit possder cette mthode Ainsi, la classe Figure doit possder une mthode dessineToi(), sinon, le compilateur refusera de compiler linstruction

figures[i].dessineToi()
R. Grin Java : hritage et polymorphisme 102

17

Notion importante pour la mise au point et la scurit


Java essaie de dtecter le plus possible derreurs ds lanalyse statique du code source durant la compilation Une erreur est souvent beaucoup plus coteuse si elle est dtecte lors de lexcution

Utilisation du polymorphisme

Bien utilis, le polymorphisme vite les codes qui comportent de nombreux embranchements et tests ; sans polymorphisme, la mthode dessineToi aurait d scrire :
for (int i = 0; i < figures.length; i++) { if (figures[i] instanceof Rectangle) { . . . // dessin dun rectangle } else if (figures[i] instanceof Cercle) { . . . // dessin dun cercle } }

R. Grin

Java : hritage et polymorphisme

103

R. Grin

Java : hritage et polymorphisme

104

Utilisation du polymorphisme (2)


Le polymorphisme facilite lextension des programmes : il suffit de crer de nouvelles sousclasses sans toucher au code source dj crit Par exemple, si on ajoute une classe Losange, le code de afficheToi sera toujours valable Sans polymorphisme, il aurait fallu modifier le code source de la classe Dessin pour ajouter un nouveau test :

Extensibilit
En programmation objet, une application est dite extensible si on peut tendre ses fonctionnalits sans toucher au code source dj crit Cest possible en utilisant en particulier lhritage et le polymorphisme comme on vient de le voir

if (figures[i] instanceof Losange) { . . . // dessin dun losange


R. Grin Java : hritage et polymorphisme 105 R. Grin Java : hritage et polymorphisme 106

Mcanisme de la liaison retarde


Soit C la classe relle dun objet o qui on envoie un message o.m() Si le code source de la classe C contient la dfinition (ou la redfinition) dune mthode m(), cest cette mthode qui est excute Sinon, la recherche de la mthode m() se poursuit dans la classe mre de C, puis dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode m() qui est alors excute

R. Grin Java : hritage et polymorphisme 107

Affichage et polymorphisme

System.out.println(objet)

affiche une description de tout objet grce au polymorphisme Elle est en effet quivalente
System.out.println(objet.toString())

et grce au polymorphisme cest la mthode toString() de la classe de objet qui est excute
R. Grin Java : hritage et polymorphisme 108

18

Types des paramtres dune mthode et surcharge


On sait que la mthode excute dpend de la classe relle de lobjet auquel on adresse le message Au contraire, elle dpend des types dclars des paramtres et pas de leur type rel (

Contraintes pour les dclarations des mthodes redfinies

prendre en compte en cas de mthode surcharge)

R. Grin

Java : hritage et polymorphisme

109

Raison des contraintes


Lhritage est la traduction de est-un : si B hrite de A, toute instance de B doit pouvoir tre considre comme une instance de A Donc, si on a la dclaration

A a;

on doit pouvoir ranger une instance de B dans la variable a, et toute expression o intervient la variable a doit pouvoir tre compile et excute si a contient la rfrence une instance de B
R. Grin Java : hritage et polymorphisme 111

Les transparents suivants tudient en toute logique les contraintes imposes aux mthodes redfinies dans le cas dun langage objet qui respecte le principe de base nonc dans le transparent prcdent On verra que Java est un peu plus restrictif que ne limposerait la pure logique

R. Grin

Java : hritage et polymorphisme

112

Contraintes sur le type des paramtres et le type retour

Contrainte sur le type retour


A a = new A(); R r = a.m();

Soit une mthode m de A dclare par :


R m(P p);

doit pouvoir fonctionner si on met dans a une instance de B : m mthode de B qui renvoie
une valeur de type R' A a = new B(); R r = a.m(); Quelle contrainte sur R et R' ?

et redfinie dans B par :


R' m(P' p);

Pour respecter le principe est-un , quels types R' et P' pourrait-on dclarer pour la mthode redfinie ?
Java : hritage et polymorphisme 113

R' doit tre affectable R : R' sous-type de R (on parle de covariance car B est aussi un sous-type de A) ou types primitifs affectables (short int par exemple)
Java : hritage et polymorphisme 114

R. Grin

R. Grin

19

Contrainte sur le type des paramtres


A a = new A(); P p = new P(); a.m(p);

Java et les contraintes avant JDK 5


doit pouvoir fonctionner si on met dans a une instance de B :


A a = new B(); P p = new P(); a.m(p); m mthode de B qui naccepte
que les paramtres de type P'

Java ne sembarrassait pas de ces finesses Une mthode redfinie devait avoir (par dfinition) exactement la mme signature que la mthode quelle redfinissait (sinon, ctait une
surcharge et pas une redfinition)

Quelle contrainte sur P et P' ? P doit tre affectable P' (pas linverse !):
P' super-type de P (contravariance) ou types primitifs affectables
R. Grin Java : hritage et polymorphisme 115

Elle devait aussi avoir exactement le mme type retour (sinon, le compilateur envoyait un message
derreur)

R. Grin

Java : hritage et polymorphisme

116

Covariance du type retour depuis le JDK 5


Depuis le JDK 5, une mthode peut modifier dune faon covariante, avec un sous-type (mais pas avec un type primitif affectable), le type retour de la mthode quelle redfinit Ainsi, la mthode de la classe Object

Java et les contraintes sur laccessibilit


Pour les mmes raisons que les contraintes sur le type retour et les types des paramtres la nouvelle mthode ne doit jamais tre moins accessible que la mthode redfinie Par exemple, la redfinition dune mthode public ne peut tre private mais une mthode protected peut tre redfinie en une mthode public
R. Grin Java : hritage et polymorphisme 118

Object clone()

peut tre redfinie en C clone() dans une sous-classe C de Object Pas de changement pour les paramtres (pas de contravariance)
R. Grin Java : hritage et polymorphisme 117

Vocabulaire
Classe (ou type) relle dun objet : classe du constructeur qui a cr lobjet Type dclar dun objet : type donn au moment de la dclaration de la variable qui contient une rfrence vers lobjet, ou du type retour de la mthode qui a renvoy lobjet

R. Grin Java : hritage et polymorphisme 120

Transtypage (cast)

20

Cast : conversions de classes


Le cast est le fait de forcer le compilateur considrer un objet comme tant dun type qui nest pas le type dclar ou rel de lobjet En Java, les seuls casts autoriss entre classes sont les casts entre classe mre et classe fille On parle de upcast et de downcast en faisant rfrence au fait que la classe mre est souvent dessine au-dessus de ses classes filles dans les diagrammes de classes

R. Grin Java : hritage et polymorphisme 121

Syntaxe

Pour caster un objet o en classe C :


(C) o

Exemple :
Velo v = new Velo(); Vehicule v2 = (Vehicule) v;

R. Grin

Java : hritage et polymorphisme

122

UpCast : classe fille classe mre


Upcast : un objet est considr comme une instance dune des classes anctres de sa classe relle Il est toujours possible de faire un upcast : cause de la relation est-un de lhritage, tout objet peut tre considr comme une instance dune classe anctre

Utilisation du UpCast
Il est souvent utilis pour profiter ensuite du polymorphisme :
Figure[] figures = new Figure[10]; // ou (Figure)new Cercle(p1, 15); figures[0] = new Cercle(p1, 15); . . . figures[i].dessineToi();

Le upcast est souvent implicite


Java : hritage et polymorphisme 123 R. Grin Java : hritage et polymorphisme 124

R. Grin

DownCast : classe mre classe fille

Utilisation du DownCast
Utilis pour appeler une mthode de la classe fille qui nexiste pas dans une classe anctre
Figure f1 = new Cercle(p, 10); . . . Point p1 = ((Cercle)f1).getCentre();
Parenthses obligatoires car . a une plus grande priorit que le cast

Downcast : un objet est considr comme tant dune classe fille de sa classe de dclaration Toujours accept par le compilateur Mais peut provoquer une erreur lexcution si lobjet nest pas du type de la classe fille Un downcast doit toujours tre explicite

R. Grin

Java : hritage et polymorphisme

125

R. Grin

Java : hritage et polymorphisme

126

21

Downcast pour rcuprer les lments dune liste (avant JDK 5)


// Ajoute des figures dans un ArrayList. // Un ArrayList contient un nombre quelconque // dinstances de Object

cast et late binding


Un cast ne modifie pas le choix de la mthode excute La mthode est dtermine par le type rel de lobjet qui reoit le message

ArrayList figures = new ArrayList(); figures.add(new Cercle(centre, rayon)); figures.add(new Rectangle(p1, p2));
. . .
// Le type retour dclar de get() est Object. Cast // ncessaire car dessineToi() pas une mthode de Object

((Figure)figures.get(i)).dessineToi();
. . .

R. Grin

Java : hritage et polymorphisme

127

R. Grin

Java : hritage et polymorphisme

128

Cacher une variable


Si une variable dinstance ou de classe a le mme nom quune variable hrite, elle dfinit une nouvelle variable qui na rien voir avec la variable de la classe mre, et qui cache lancienne variable Il faut viter de cacher intentionnellement une variable par une autre car cela nuit la lisibilit

Cacher une variable Cacher une mthode static

R. Grin

Java : hritage et polymorphisme

130

Cacher une mthode static


On ne redfinit pas une mthode static, on la cache (comme les variables) Si la mthode static m de Classe1 est cache par une mthode m dune classe fille, la diffrence est que

Pas de liaison retarde avec les mthodes static


La mthode qui sera excute est dtermine par la dclaration et pas par le type rel dune instance Exemple : VTT est une sous-classe de Velo. Soit nbVelos() mthode static de Velo cache par une autre mthode static nbVelos() dans VTT
Velo v1 = new VTT(); n = v1.nbVelos();
n = Velo.nbVelos();

on peut dsigner la mthode cache de Classe1 en prfixant par le nom de la classe : Classe1.m()
ou par un cast (x est une instance d'une classe fille de Classe1) : ((Classe1)x)m()

mais on ne peut pas la dsigner en la prfixant par super.


R. Grin Java : hritage et polymorphisme 131

(ou n = VTT.nbVelos(); ) est plus lisible


R. Grin

Cest la mthode nbVelo() de la classe Velo qui sera excute


132

Java : hritage et polymorphisme

22

Conclusion sur les mthodes static


Il faut essayer dviter les mthodes static qui nuisent lextensibilit et ne sont pas dans lesprit de la programmation objet Il existe videmment des cas o les mthodes static sont utiles (voir par exemple la classe java.lang.Math), mais ils sont rares

Complments : final, tableaux, appel dune mthode polymorphe dans le constructeur dune classe mre
R. Grin Java : hritage et polymorphisme 134

R. Grin

Java : hritage et polymorphisme

133

Classe final (et autres final)


Classe final : ne peut avoir de classes filles (String est final) Mthode final : ne peut tre redfinie Variable (locale ou dtat) final : la valeur ne pourra tre modifie aprs son initialisation Paramtre final (dune mthode ou dun catch) : la valeur (ventuellement une rfrence) ne pourra tre modifie dans le code de la mthode

R. Grin Java : hritage et polymorphisme 135

Tableaux et hritage
Les tableaux hritent de la classe Object Si une classe B hrite dune classe A, la classe des tableaux 1 dimension dinstances de B est une sous-classe de la classe des tableaux 1 dimension dinstances de A (idem pour toutes les

dimensions)

On peut donc crire :


A[] tb = new B[5];

R. Grin

Java : hritage et polymorphisme

136

Problme de typage avec lhritage de tableaux


Il peut sembler naturel que Cercle[] soit un sous-type de Figure[] Pourtant ce fait pose des problmes de typage

Le code suivant va passer la compilation :


Figure fig = new Carre(p1, p2); Figure[] tbFig = new Cercle[5]; tbFig[0] = fig;

Mais provoquera une erreur


java.lang.ArrayStoreException lexcution car on veut mettre dans le tableau de Cercle une valeur qui nest pas du type rel du tableau (un Carre)

R. Grin

Java : hritage et polymorphisme

137

R. Grin

Java : hritage et polymorphisme

138

23

Tableaux et cast
Object[] to1 = new String[2]; String[] ts1 = (String[])to1;
pas derreur lexcution car to1 cr avec new String[..]

viter lappel dune mthode polymorphe dans un constructeur


En effet, on a vu que lappel au constructeur de la classe mre est effectu avant que les variables dinstance ne soient initialises dans le constructeur de la classe fille Si le constructeur de la classe mre comporte un appel une mthode m (re)dfinie dans la classe fille, m ne pourra utiliser les bonnes valeurs pour les variables dinstance initialises dans le constructeur de la classe fille

R. Grin Java : hritage et polymorphisme 140

Object[] to2 = new Object[2]; to2 ne contient que des String to2[0] = "abc"; to2[1] = "cd"; mais ClassCastException ts1 = (String[])to2; lexcution car to2 cr avec
new Object[..]

Object o = (Object)ts1;
R. Grin

Un tableau peut toujours tre cast en Object (cast implicite possible)


139

Java : hritage et polymorphisme

Exemple
class M { M() { m(); } void m() { ... } } F f = new F(5); class F extends M { private int i; F(int i) { super(); this.i = i; } void m() { System.out.print( "i de F = " + i); } }
R. Grin Java : hritage et polymorphisme 141 R. Grin Java : hritage et polymorphisme 142

Classe abstraite

affichera
i de F = 0 !

Mthode abstraite

Classe abstraite
Une classe doit tre dclare abstraite (abstract class) si elle contient une mthode abstraite Il est interdit de crer une instance dune classe abstraite

Une mthode est abstraite (modificateur abstract) lorsquon la dclare, sans donner son implmentation (pas daccolades mais un simple ; la suite de la signature de la mthode) :
public abstract int m(String s);

La mthode sera implmente par les classes filles


Java : hritage et polymorphisme 143 R. Grin Java : hritage et polymorphisme 144

R. Grin

24

Complments
Si on veut empcher la cration dinstances dune classe on peut la dclarer abstraite mme si aucune de ses mthodes nest abstraite Une mthode static ne peut tre abstraite (car on ne peut redfinir une mthode static)

Exemple dutilisation de classe abstraite


On veut crire un programme pour dessiner des graphiques et faire des statistiques sur les cours de la bourse Pour cela, le programme va rcuprer les cours des actions en accdant un site financier sur le Web On souhaite crire un programme qui sadapte facilement aux diffrents formats HTML des sites financiers
145 R. Grin Java : hritage et polymorphisme 146

R. Grin

Java : hritage et polymorphisme

Exemple de classe abstraite


public abstract class CentreInfoBourse { private URL[] urlsCentre; . . . abstract protected String lireDonnees(String[] titres); . . . // suite dans transparent suivant

Suite de la classe abstraite


public abstract class CentreInfoBourse { . . . public String calcule(String[] titres) { . . . donnees = lireDonnees(titres); // Traitement effectu sur donnees // indpendant du site boursier . . . } calcule mais nest pas abstraite . . . bien quelle utilise lireDonnees

lireDonnees lira les informations sur les titres dont les noms sont passs en paramtre, et les renverra dans un format indpendant du site consult
Java : hritage et polymorphisme 147

qui est abstraite


R. Grin Java : hritage et polymorphisme 148

R. Grin

Utilisation de la classe abstraite


public class LesEchos extends CentreInfoBourse { . . . public String lireDonnees(String[] titres) { // Implantation pour le site des Echos . . . }

Modle de conception

lit les donnes sur le site des Echos et les met sous un format standard manipulable par les autres mthodes de CentreInfoBourse
lireDonnees
Java : hritage et polymorphisme 149

Lexemple prcdent utilise le modle de conception (design pattern) patron de mthode (template method) : la classe mre dfinit la structure globale (le patron) dun algorithme (mthode calcule de la classe CentreInfoBourse) elle laisse aux classes filles le soin de dfinir des points bien prcis de lalgorithme (mthode lireDonnees)
Java : hritage et polymorphisme 150

R. Grin

R. Grin

25

Dfinition des interfaces

Une interface est une classe purement abstraite dont toutes les mthodes sont abstraites et publiques

Interface

R. Grin

Java : hritage et polymorphisme

151

R. Grin

Java : hritage et polymorphisme

152

Exemples dinterfaces
public interface Figure { public abstract void dessineToi(); public abstract void deplaceToi(int x, int y); public abstract Position getPosition(); } public interface Comparable { /** renvoie vrai si this est plus grand que o */ boolean plusGrand(Object o); public abstract } peut tre implicite
R. Grin Java : hritage et polymorphisme 153 R. Grin

Les interfaces sont implmentes par des classes

Une classe implmente une interface I si elle dclare implements I dans son en-tte

Java : hritage et polymorphisme

154

Classe qui implmente une interface

Exemple dimplmentation
public class Ville implements Comparable { private String nom; Exactement la mme signature private int nbHabitants; que dans linterface Comparable . . . public boolean plusGrand(Object objet) { if (! objet instanceof Ville) { throw new IllegalArgumentException(""); } return nbHabitants > ((Ville)objet).nbHabitants; } }

public class C implements I1 { }

2 seuls cas possibles : soit la classe C implmente toutes les mthodes de I1 soit la classe C doit tre dclare abstract ; Les mthodes manquantes seront implmentes par les classes filles de C
Java : hritage et polymorphisme 155

Exceptions tudies dans le prochain cours

R. Grin

R. Grin

Java : hritage et polymorphisme

156

26

Implmentation de plusieurs interfaces


Contenu des interfaces


Une interface ne peut contenir que des mthodes abstract et public des dfinitions de constantes publiques ( public static final ) Les modificateurs public, abstract et final sont optionnels (en ce cas, ils sont implicites) Une interface ne peut contenir de mthodes static, final, synchronized ou native
157 R. Grin Java : hritage et polymorphisme 158

Une classe peut implmenter une ou plusieurs interfaces (et hriter dune classe) :
public class CercleColore extends Cercle implements Figure, Coloriable {

R. Grin

Java : hritage et polymorphisme

Accessibilit des interfaces

Les interfaces comme types de donnes


Une interface peut servir dclarer une variable, un paramtre, une valeur retour, un type de base de tableau, un cast, Par exemple,

Une interface peut avoir la mme accessibilit que les classes : public : utilisable de partout sinon : utilisable seulement dans le mme paquetage

Comparable v1;

indique que la variable v1 rfrencera des objets dont la classe implmentera linterface
Comparable
R. Grin Java : hritage et polymorphisme 159 R. Grin Java : hritage et polymorphisme 160

Interfaces et typage
Si une classe C implmente une interface I, le type C est un sous-type du type I : tout C peut tre considr comme un I On peut ainsi affecter une expression de type C une variable de type I Les interfaces shritent : si une classe C implmente une interface I, toutes les sousclasses de C limplmentent automatiquement (elles sont des sous-types de I)

R. Grin Java : hritage et polymorphisme 161

Exemple dinterface comme type de donnes


public static boolean croissant(Comparable[] t) { for (int i = 0; i < t.length - 1; i++) { if (t[i].plusGrand(t[i + 1])) return false; } return true; }

R. Grin

Java : hritage et polymorphisme

162

27

instanceof

Polymorphisme et interfaces
public interface Figure { void dessineToi(); } public class Rectangle implements Figure { public void dessineToi() { . . . } public class Cercle implements Figure { public void dessineToi() { . . . }
R. Grin Java : hritage et polymorphisme 164

Si un objet o est une instance dune classe qui implmente une interface Interface,
o instanceof Interface

est vrai

R. Grin

Java : hritage et polymorphisme

163

Polymorphisme et interfaces (suite)

Cast et interfaces
On peut toujours faire des casts (upcast et downcast) entre une classe et une interface quelle implmente (et un upcast dune interface vers la classe Object) :

public class Dessin { private Figure[] figures; . . . public void afficheToi() { for (int i = 0; i < nbFigures; i++) figures[i].dessineToi(); } . . . }

// upcast Ville Comparable

Comparable c1 = new Ville("Cannes", 200000); Comparable c2 = new Ville("Nice", 500000); . . . if (c1.plusGrand(c2)) // upcast Comparable Object
// downcast Comparable Ville

System.out.println(((Ville)c2).nbHabitant());
R. Grin Java : hritage et polymorphisme 165 R. Grin Java : hritage et polymorphisme 166

Utilisation des interfaces

A quoi servent les interfaces ?


Garantir aux clients dune classe que ses instances peuvent assurer certains services, ou quelles possdent certaines proprits (par
exemple, tre comparables dautres instances)

Plus on programme en Java, plus on dcouvre lintrt des interfaces Leurs utilisations sont trs nombreuses et varies Les transparents suivants prsentent les plus courantes

Faire du polymorphisme avec des objets dont les classes nappartiennent pas la mme hirarchie dhritage (linterface joue le rle de la
classe mre, avec upcast et downcast)

R. Grin

Java : hritage et polymorphisme

167

R. Grin

Java : hritage et polymorphisme

168

28

A quoi servent les interfaces ?


Favoriser la rutilisation : si le type dun paramtre dune mthode est une interface, cette mthode peut sappliquer toutes les classes qui implmentent l'interface, et pas seulement toutes les sous-classes dune certaine classe Il est bon dessayer de garder la bijection interface <--> service rendu : si une classe peut rendre plusieurs services de diffrentes natures, elle implmente plusieurs interfaces

R. Grin Java : hritage et polymorphisme 169

Les interfaces succdans des pointeurs de mthodes

En Java il nexiste pas de pointeurs de fonctions/mthodes comme en C (voir cependant


le cours sur la rflexivit)

Une interface peut tre utilise pour reprsenter une mthode qui nest connue qu lexcution:
linterface contient cette mthode on appelle la mthode en envoyant le message correspondant une instance dont la classe implmente linterface

R. Grin

Java : hritage et polymorphisme

170

Les interfaces succdans des pointeurs de mthodes


On verra lapplication de ce mcanisme lors de ltude du mcanisme couteur-cout dans les interfaces graphiques On pourra ainsi lancer une action (faire excuter une mthode) quand lutilisateur cliquera sur un bouton ; cette action sera reprsente par une instance dune classe qui implmente une interface couteur

R. Grin Java : hritage et polymorphisme 171

viter de dpendre de classes concrtes


Bon pour la maintenance dune application Bon pour la rutilisation de vos classes

R. Grin

Java : hritage et polymorphisme

172

Bon pour la maintenance


Si les classes dpendent dinterfaces, il y a moins de risques de devoir les modifier pour tenir compte de modifications externes En effet, une interface qui reprsente un service abstrait , sera sans doute moins souvent modifie quune classe concrte car elle dcrit une fonctionnalit et pas une implmentation particulire

R. Grin Java : hritage et polymorphisme 173

Bon pour la rutilisation

De plus, une interface peut tre implmente par de nombreuses classes, ce qui rendra vos classes plus rutilisables

R. Grin

Java : hritage et polymorphisme

174

29

Exemple typique

Code

Une classe mtier FTP est utilise par une interface graphique GUI Sil y a un problme pendant le transfert de donnes, FTP passe un message derreur GUI pour que lutilisateur puisse le lire

public class GUI { private FTP ftp; public GUI() { ftp = new FTP(); Comment ftp.setAfficheur(this); amliorer ? . . . public void affiche(String m) {...} public class FTP { private GUI gui; public void setAfficheur(GUI gui) { this.afficheur = gui; } La classe mtier FTP . . . ne pourra pas tre gui.affiche(message);
Java : hritage et polymorphisme

Quel est le problme avec ce code?

R. Grin

Java : hritage et polymorphisme

175

R. Grin

utilis avec une autre 176 interface graphique !

Code amlior (1)

Code amlior (2)

public class GUI implements Afficheur { private FTP ftp; public GUI() { ftp = new FTP(); ftp.setAfficheur(this); . . . public void affiche(String m) {...} public class FTP { private Afficheur afficheur; public void setAfficheur(Afficheur aff) { this.afficheur = afficheur; } . . . afficheur.affiche(message);
Java : hritage et polymorphisme 177

public interface Afficheur { void affiche(String message); }

Maintenant les 2 classes GUI et FTP dpendent dune interface plus abstraite quelles Consquences :

FTP aura moins de risque de devoir tre modifie

cause dune modification de lafficheur de messages


FTP sera plus facilement rutilisable, avec un afficheur dune autre classe que GUI
R. Grin Java : hritage et polymorphisme 178

R. Grin

Un autre exemple : vrification dorthographe


Un vrificateur dorthographe est reprsent par une classe Verificateur Verificateur contient une mthode verifie qui vrifie si tous les mots dun document sont contenus dans un dictionnaire Verificateur est utilis par une interface graphique reprsente par la classe GUI

R. Grin Java : hritage et polymorphisme 179

Vrificateur interactif

Si un mot nest pas dans le dictionnaire, le vrificateur demande lutilisateur ce quil doit faire de ce mot : lajouter dans le dictionnaire lignorer le corriger par un mot donn par lutilisateur

R. Grin

Java : hritage et polymorphisme

180

30

Code de GUI

Mthode verifie version 1

GUI contient une mthode corrige(String mot) qui affiche un mot inconnu lutilisateur

et renvoie le choix de lutilisateur Il passe au vrificateur le texte tap par lutilisateur et lui demande de le vrifier : Il contient ce code :
Verificateur v = new Verificateur(...); v.verifie(zoneTexte.getText(), this);

void verifie(Document doc, GUI client) { . . . if (! dico.isCorrect(mot)) { Correction corr = client.corrige(mot); // Analyse laction indique par // le client et agit en consquence . . . }

Il y a un problme avec ce code

this permettra au vrificateur dappeler la mthode corrige pour les mots inconnus
Java : hritage et polymorphisme 181 R. Grin Java : hritage et polymorphisme 182

R. Grin

Mthode verifie version 1

Solution

void verifie(Document doc, ? client) { . . . if (! dico.isCorrect(mot)) { Correction corr = client.corrige(mot); // Analyse laction indique par // le client et agit en consquence . . . }

On dclare que le client implmente linterface Correcteur qui contient une seule mthode
Correction corrige(String mot)

La mthode verifie a la signature :


Correction verifie(Document document, Correcteur correcteur);

Dans la classe du client on implmente la mthode corrige Len-tte de GUI contiendra implements Correcteur

R. Grin Java : hritage et polymorphisme 183 R. Grin Java : hritage et polymorphisme 184

Interfaces et API
Soit une classe abstraite Figure dune API Une classe C extrieure lAPI ne pourra hriter de Figure et dune autre classe A Il vaut mieux ajouter dans lAPI une interface Figure implmente par la classe abstraite

Interfaces et API
Donc, pensez ajouter des interfaces dans les API que vous crivez

FigureAbstraite La classe C pourra ainsi implmenter Figure et hriter de lautre classe A, et ventuellement rutiliser FigureAbstraite par dlgation
R. Grin Java : hritage et polymorphisme 185 R. Grin Java : hritage et polymorphisme 186

31

Inconvnient des interfaces


Il faut tre conscient que, si une interface publique dans une API est destine tre implmente par des classes clientes, il sera difficile, sinon impossible, de modifier linterface ; on ne pourra mme pas ajouter des mthodes cette interface En effet, lajout dune mthode linterface rendra non compilables toutes les classes clientes qui implmentaient lancienne version de linterface (solution venir avec Java SE 8)

R. Grin Java : hritage et polymorphisme 187

Interface classe abstraite


Une classe abstraite ne provoque pas ce problme On peut lui ajouter une mthode non abstraite sans casser le code des classes filles (elles hritent de cette mthode) Pour cette raison, bien souvent, on joint aux interfaces une classe abstraite qui implmente le maximum des mthodes de linterface pour convenir la plupart des sous-classes venir

R. Grin Java : hritage et polymorphisme 188

Exemple de couples interface classe abstraite


Dans le JDK on peut trouver de nombreux exemples Par exemple, linterface List associe la classe abstraite AbstractList On trouve de mme TableModel et

Hritage dinterfaces

Une interface peut hriter (mot-cl extends) de plusieurs interfaces :


interface i1 extends i2, i3, i4 { . . . }

AbstractTableModel

Dans ce cas, linterface hrite de toutes les mthodes et constantes des interfaces mres
Java : hritage et polymorphisme 190

R. Grin

Java : hritage et polymorphisme

189

R. Grin

Hritage et interface
La notion dhritage est relative lhritage de comportement mais aussi de structure En effet, si B hrite de A, les instances de B vont rcuprer toutes les variables dinstance des instances de A (la structure de donnes) Cest souvent une mauvaise conception dhriter dune classe si on nutilise pas toutes ses variables La notion dinterface est uniquement relative au comportement

R. Grin Java : hritage et polymorphisme 191

Hritage et interface
On peut dire que lorsquune classe hrite dune classe mre, elle hrite de son code et de son type Si elle implmente une interface, elle hrite de son type Hriter du code : viter la duplication de code Hriter du type : polymorphisme et souplesse du sous-typage

R. Grin Java : hritage et polymorphisme 192

32

Interface en notation UML


<<Interface>> Comparable
public boolean plusGrand(Object)

Rutilisation
Ville
private String nom private int nbHabitant

...
public boolean plugrand(Object)
R. Grin Java : hritage et polymorphisme 193 R. Grin Java : hritage et polymorphisme 194

Rgle pour lutilisation de lhritage

Ne sen servir que pour reprsenter la relation est-un entre classes :


un CercleColore est un Cercle une Voiture est un Vehicule

Rutilisation par une classe C2 du code dune classe C1


Soit C1 une classe dj crite dont on ne possde pas le code source On veut utiliser la classe C1 pour crire le code dune classe C2 Plusieurs moyens :

Il pourrait aussi tre utilis comme moyen pratique de rutilisation de code. Par exemple, la classe ParalllpipdeRectangle pourrait hriter de la classe Rectangle en ajoutant une variable profondeur

C2 hrite de C1 C2 peut dlguer une instance de C1 une partie de la tche quelle doit accomplir
R. Grin Java : hritage et polymorphisme 196

R. Grin

Java : hritage et polymorphisme

195

Dlgation pure

Dlgation pure - variante

Une mthode m2() de la classe C2 dlgue une partie de son travail un objet c1 de la classe C1 , cr par la mthode m2 :
public int m2() { cration dune instance de C1 C1 c1 = new C1(); utilisation de linstance r = c1.m1(); }

Lobjet c1 de la classe C1 est pass en paramtre de la mthode m2 :


public int m2(C1 c1) { r = c1.m1(); }

R. Grin

Java : hritage et polymorphisme

197

R. Grin

Java : hritage et polymorphisme

198

33

En UML

Dlgation avec composition


o1 est une variable dinstance de C2 :
public class C2 { private C1 c1; public int m2() { r = c1.m1(); }
pourra tre utilise plusieurs occasions ; cre dans le constructeur ou ailleurs

Sil y a dlgation pure, la classe C2 dpend de la classe C1 (trait en pointills)


Classe C2 Classe C1

Si C1 dpend aussi de C2 :
Classe C2 Classe C1

utilisation de o1

R. Grin

Java : hritage et polymorphisme

199

R. Grin

Java : hritage et polymorphisme

200

En UML
Il y a une association entre la classe C2 et la classe C1 (trait plein) Lassociation est unidirectionnelle si C1 ne connat pas C2:

Types dassociation
Il peut y avoir plusieurs types dassociation selon quun objet dune classe peut tre associ un ou plusieurs objets de lautre classe (mutiplicit) ou selon le nombre de classes qui interviennent dans lassociation (arit) Ces notions seront tudies dans dautres cours de conception objet

Classe C2

Classe C1

ou bidirectionnelle si C1 connat aussi C2 :


Classe C2 Classe C1

R. Grin

Java : hritage et polymorphisme

201

R. Grin

Java : hritage et polymorphisme

202

Exemples de rutilisation
Le contour dune fentre dessine sur lcran est un rectangle Comment rutiliser les mthodes dune classe Rectangle (comme {get|set}Dimension()) dans la classe Fenetre ?

Rutilisation par hritage


public class Fenetre extends Rectangle { ... // Hrite de getDimension() /** Modifie la largeur de la fentre */ public void setDimension(int largeur, int longueur) { super.setDimension(largeur, longueur); ... // replacer composants de la fentre } . . . }

R. Grin

Java : hritage et polymorphisme

203

R. Grin

Java : hritage et polymorphisme

204

34

Rutilisation par composition


public class Fenetre { private Rectangle contour; /** Renvoie la taille de la fentre */ public Dimension getDimension() { return contour.getDimension(); } /** Modifie la taille de la fentre */ public void setDimension(int largeur, int longueur) { contour.setDimension(largeur, longueur); ... // replacer composants de la fentre } . . . }
R. Grin Java : hritage et polymorphisme 205

Rutilisation par dlgation (sans composition)


public class Employe { . . . /** Calcule le salaire */ public double getSalaire() { // Dlgue le calcul un comptable Comptable comptable = new Comptable(); return comptable.calculeSalaire(this); } . . . }
R. Grin Java : hritage et polymorphisme 206

Simulation de lhritage multiple

Hritage multiple avec les interfaces

La composition/dlgation permet de simuler lhritage multiple ( hriter de Classe1 et de


Classe2 par exemple)

On hrite dune des classes, celle qui correspond le plus au critre est-un (Classe1 dans lexemple) et on utilise la dlgation pour utiliser le code des autres classes (Classe2 dans lexemple) :
class Classe extends Classe1 { private Classe2 o2; // Classe2 rutiliser // par dlgation

Pour pouvoir utiliser le polymorphisme avec les mthodes de Classe2, on peut crer une interface qui contient les mthodes de Classe2 sur lesquelles on veut faire du polymorphisme
(m21() et m22() dans cet exemple)
interface InterfaceClasse2 { public int m21(); public Object m22(); }

R. Grin

Java : hritage et polymorphisme

207

R. Grin

Java : hritage et polymorphisme

208

Hritage multiple avec les interfaces

Hritage multiple avec les interfaces

On indique alors que Classe2, et Classe1 implmentent linterface InterfaceClasse2 :


class Classe extends Classe1 implements InterfaceClasse2 { private Classe2 o2; On peut redfinir les mthodes . . . de Classe2 ou les garder telles quelles public int m21() { return o2.m21() + 10; } public Object m22() { return o2.m22(); } } class Classe2 implements InterfaceClasse2 { . . . }

On peut alors faire du polymorphisme sur les mthodes m21() et m22() ; par exemple :
InterfaceClasse2[] t = new InterfaceClasse2[10]; t[0] = new Classe(); t[1] = new Classe2(); . . . for (int i=0; i < t.length; i++) { x += t[i].m21(); }

R. Grin

Java : hritage et polymorphisme

209

R. Grin

Java : hritage et polymorphisme

210

35

Inconvnients de lhritage
Statique : une classe ne peut hriter de classes diffrentes des moments diffrents Souvent difficile de changer une classe mre sans provoquer des problmes de compatibilit avec les classes filles (mauvaise encapsulation, en particulier si on a des variables protected) Pas possible dhriter dune classe final (comme la classe String) Pas dhritage multiple en Java

R. Grin Java : hritage et polymorphisme 211

Avantages de lhritage
Facile utiliser, car cest un mcanisme de base du langage Java Souple, car on peut redfinir facilement les comportements hrits, pour les rutiliser ensuite Permet le polymorphisme (mais on peut aussi

utiliser les interfaces pour faire du polymorphisme)

Facile comprendre si cest la traduction dune relation est-un


Java : hritage et polymorphisme 212

R. Grin

Conclusion
Il est conseill dutiliser lhritage pour la traduction dune relation est-un statique (et avec hritage de la structure), mais dutiliser la composition et la dlgation dans les autres cas

Prcisions sur le mcanisme de la liaison retarde (late binding) complment rserv aux initis

R. Grin

Java : hritage et polymorphisme

213

R. Grin

Java : hritage et polymorphisme

214

Le problme :

Cas dun appel static


Appel static Classe.m(x1, x2) : la dtermination de la mthode statique m se fait uniquement partir des dclarations du programme Cette dtermination est faite en une seule tape par le compilateur Le compilateur dtermine la mthode en recherchant dans Classe la mthode la plus spcifique (compte tenu des dclarations de x1 et x2)
215 R. Grin Java : hritage et polymorphisme 216

Voici quelques appels de mthodes :


truc.m(i, j); mTruc(p1).m(i, j); t[2].m(i, j); Classe.m(i, j); // mthode static

Comment est dtermine la mthode m qui sera excute ?

R. Grin

Java : hritage et polymorphisme

36

Exemple dappel static

Cas dun appel non static


Soit le code objet.m(x1, x2) o m est une mthode non static Le plus souvent (mais a ne marche pas toujours), la rgle suivante permet de dterminer la mthode m qui sera excute : m est dtermine par le type rel de m et les types dclars de x1 et x2 En fait, la dtermination de la mthode m est faite en 2 tapes tout fait distinctes : tape 1, la compilation tape 2, lexcution

R. Grin Java : hritage et polymorphisme 218

La classe java.lang.Math contient les mthodes


public static int min(int, int) public static long min(long, long)

Si le programme contient
int a, b; . . . c = Math.min(a, b); Le compilateur ne tient pas compte de la valeur de retour

Cest la premire mthode qui sera choisie par le compilateur Si le programme avait dclar int a; long b; , cest la deuxime qui aurait t choisie
R. Grin Java : hritage et polymorphisme 217

tape 1 pour dterminer la mthode excuter


1. Pendant la compilation, le compilateur dtermine une dfinition-cadre de la mthode qui sera excute, en utilisant uniquement les dclarations du programme Le compilateur recherche dans le type dclar de e la mthode la plus spcifique, de nom m qui a une signature qui correspond aux types dclars des paramtres x1 et x2
R. Grin Java : hritage et polymorphisme 219

tape 2 pour dterminer la mthode excuter


2. Au moment de lexcution, la recherche dune mthode correspondant la dfinitioncadre part de la classe relle de lobjet qui reoit le message et remonte vers les classes mres

R. Grin

Java : hritage et polymorphisme

220

Ce que contient la dfinition-cadre lissue de la compilation

Mode dinvocation de la dfinition-cadre de la mthode

Classe ou interface T sous laquelle se fera la recherche de la mthode durant lexcution : le type dclar de objet

Signature de la mthode : celle de la mthode la plus spcifique de T qui peut convenir (selon les types dclars de x1 et x2) Type retour de la mthode Mode dinvocation

R. Grin Java : hritage et polymorphisme 221

Le mode dinvocation de la mthode peut tre : non virtuel (mthode private ; pas de late binding) super (appel de type super.m() ) interface (objet est dclar du type dune interface) virtuel (tous les autres cas)
Java : hritage et polymorphisme 222

R. Grin

37

tape 2 : lexcution (1)


Tout dabord la dfinition-cadre doit correspondre une mthode qui existe et qui est accessible depuis lendroit o se situe lappel de la mthode que lon recherche Cette condition est presque toujours remplie et on peut le plus souvent loublier pour dterminer la mthode excuter

tape 2 : lexcution (2)


Les actions de cette tape sont excutes par le bytecode engendr par le compilateur ltape prcdente 1) objet ( qui on envoie le message) est valu : a peut tre this ou un objet quelconque 2) Les valeurs des arguments dappel de la mthode sont values

R. Grin Java : hritage et polymorphisme 224

Un cas o il faut examiner cette condition : une mthode avec la protection paquetage est redfinie dans le paquetage avec la protection public
Java : hritage et polymorphisme 223

R. Grin

Dfinition cadre durant la compilation


Classe T La dfinition-cadre est dtermine en cherchant une mthode qui corresponde m(x1, x2) dans T, classe de dclaration de objet T objet; . . . objet = new T2(); . . . objet.m(x1, x2);

Recherche de la mthode durant lexcution


Classe T La recherche remonte dans les classes mres en nallant jamais plus haut que la classe de dclaration de objet T objet; . . . objet = new T2(); . . . objet.m(x1, x2); Dmarrage de la recherche dans la classe relle de objet
Java : hritage et polymorphisme 226

Classe T1

Classe T1

Classe T2
R. Grin Java : hritage et polymorphisme 225

Classe T2
R. Grin

tape 2 : lexcution (3)


3) Recherche de la mthode excuter :
(a) classe C pour dmarrer la recherche : classe relle de objet (ou classe mre si le mode dinvocation est super ) (b) si le code de la classe C contient une dfinition de mthode dont la signature est celle de la dfinitioncadre dtermine la compilation, cest la mthode que lon cherche (c) sinon, on fait la mme recherche partir de la classe mre de C, et ainsi de suite en remontant vers les classes mressans remonter au dessus de T, classe ou interface de base, donne par la compilation
R. Grin Java : hritage et polymorphisme 227

Excution de la mthode (dtail de fonctionnement de la JVM)


Quand la mthode a t dtermine, un cadre (frame en anglais) est cr, dans lequel va sexcuter la mthode Ce cadre contient :

lobjet qui le message est envoy les valeurs des arguments lespace ncessaire lexcution de la mthode (pour les variables locales, pour les appels dautres mthodes, )
R. Grin Java : hritage et polymorphisme 228

38

Le mcanisme est-il compris ?


class Entier { private int i; Entier(int i) { this.i = i; } ne redfinit pas public boolean equals(Entier e) { mais surcharge la if (e == null) return false; mthode equals() return i == e.i; de Object } public static void main(String[] args) { Entier e1 = new Entier(1); Entier e2 = new Entier(1); Object e3 = new Entier(1); Object e4 = new Entier(1); System.out.println(e1.equals(e2)); true ou false ? true System.out.println(e3.equals(e4)); true ou false ? false System.out.println(e1.equals(e3)); true ou false ? false ! System.out.println(e3.equals(e1)); true ou false ? false !! } }
R. Grin Java : hritage et polymorphisme 229

Une meilleure mthode equals()


public boolean equals(Object o) { if (! (o instanceof Entier)) return false; return i == ((Entier)o).i; }

redfinit la mthode equals() de Object

Et il aurait encore t prfrable dcrire (pour viter des problmes subtils avec des ventuelles sous-classes) :
if (o != null && o.getClass().equals(getClass())) return false; . . .

R. Grin

Java : hritage et polymorphisme

230

39

Você também pode gostar