Vous êtes sur la page 1sur 45

ENSTA IN204

Introduction à JAVA

Olivier Sigaud
LIP6/AnimatLab
olivier.sigaud@lip6.fr
01.44.27.88.53

Introduction à JAVA : héritage (1)


Page : 1
Plan du cours 4
• La surcharge
• L'héritage
• super() et super
• La classe Object
• Le mot clé "final"
• Les classes "enveloppe" (Wrappers)
• Héritage et organisation
• Le typage dynamique
Introduction à JAVA : héritage (1)
Page : 2
Rappel : la surcharge
• On appelle surcharge le fait d’avoir plusieurs
méthodes qui ont le même nom au sein de la
même classe
• Les exemplaires de la méthode ont des
paramètres différents
• Ils peuvent avoir le même type de retour
• Par contre, impossible d’avoir des types de
retour différents pour les mêmes paramètres

Introduction à JAVA : héritage (1)


Page : 3
Surcharge : exemple
class Additionneur {
static int somme(int a, int b) // 1
{
return (a+b);
}
static int somme(int a, int b, int c) // 2
{
return (a+b+c);
}
static float somme(float a, float b) // 3
{
return (a+b);
}
static float somme(int a, int b) // interdit à cause de 1
{
return ((float)a+(float)b);
}
}

Introduction à JAVA : héritage (1)


Page : 4
L'héritage

Introduction à JAVA : héritage (1)


Page : 5
L'héritage
• On peut souvent classer les objets dans des
arborescences de type de plus en plus génériques

Mot

Adj Verbe Nom

V_Transitif V_Intransitif

prendre dormir

Introduction à JAVA : héritage (1)


Page : 6
Un cas concret
• La classe Voiture représente toutes sortes de
voitures possibles
• On pourrait définir un camion comme une voiture
très longue, très haute, etc.
• Mais un camion a des spécificités vis-à-vis des
voitures : remorque, cargaison, boîte noire, etc.
• On pourrait créer une classe Camion qui ressemble
à la classe Voiture
• Mais on ne veut pas réécrire tout ce qu'elles ont en
commun

Introduction à JAVA : héritage (1)


Page : 7
Solution
Vehicule

Voiture Camion

• La classe Vehicule contient tout ce qu'il y a de


commun à Camion et Voiture
• Camion ne contient que ce qu'il y a de spécifique
aux camions

Introduction à JAVA : héritage (1)


Page : 8
Objectif de l'héritage
• On souhaite ne décrire qu'une seule fois le même
traitement lorsqu'il s'applique à plusieurs classes
• Evite de recopier (notamment les modifications)
• On crée une classe plus générique à laquelle s'applique le
traitement
• Toutes les classes plus spécifiques, héritant de cette
classe, héritent de ce traitement, elles peuvent
l'exécuter
• Le traitement n'est décrit qu'au niveau de la classe mère
• Les classes filles contiennent d'autres traitements
plus spécifiques
Introduction à JAVA : héritage (1)
Page : 9
Usage de l'héritage
• Une classe spécifique hérite des méthodes et des
attributs de sa classe mère (sauf ceux qui sont
privés)
• On n'a pas besoin de les réécrire pour la classe fille
• On peut cependant redéfinir (ou sur-définir) une
méthode de la classe mère dans la classe fille (de
même signature)
• Le constructeur d'un objet doit toujours commencer
par appeler le constructeur de sa classe mère

Introduction à JAVA : héritage (1)


Page : 10
Usage de l'héritage (suite)
• Un objet de type Voiture peut utiliser toutes les
méthodes de la classe Vehicule
• Il doit disposer d’une valeur pour tous les attributs
de la classe Vehicule
• A tout moment, une méthode qui utilise un objet
de type Vehicule peut manipuler un objet de type
Voiture en guise de Vehicule
• Cette dernière propriété est le polymorphisme.

Introduction à JAVA : héritage (1)


Page : 11
Héritage : exemple 1
class Vehicule {
// Vehicule() {}
}

class Voiture extends Vehicule {


int nbPortes;
double longueur;
Voiture(double lg, int nbP)
{
longueur = lg;
nbPortes = nbP;
}
}

Introduction à JAVA : héritage (1)


Page : 12
Exemple 1 : suite
class Garagiste {
public boolean garer(Vehicule v)
{
v.demarrer();
for (int pl=0;pl<nbPlaces;++pl)
{
if (place[pl].estLibre())
{
v.amener(place[pl]);
v.arreter();
return true;
}
}
System.out.println(« Aucune place libre »);
return false;
}
}

On peut appliquer la méthode garer() à une Voiture, un


Camion…
Introduction à JAVA : héritage (1)
Page : 13
super() et super

Introduction à JAVA : héritage (1)


Page : 14
La méthode super()
• super() permet d'appeler le constructeur de la
classe mère
• C'est la première chose à faire dans la construction
d'une sous-classe
• Appeler le constructeur de la classe mère garantit
que l’on peut initialiser les arguments de la classe
mère
• On passe les paramètres nécessaires
• Si l’on n’indique pas super(), il y a un appel du
constructeur sans paramètres de la classe mère

Introduction à JAVA : héritage (1)


Page : 15
super() : exemple
class Mot {
Mot(String chaine) { setLexeme(chaine);}
Mot renvoyerPluriel();
}

class Verbe extends Mot {


int groupe;
boolean transitif;
Verbe(String chaine, int gr, boolean trans)
{
super(chaine);
setGroupe(gr);
setTransitif(trans);
}
}
Introduction à JAVA : héritage (1)
Page : 16
Le mot clef super
• super. est une référence sur l'objet père
• super.maMethode() permet d'appeler la méthode
maMethode() de la classe mère
• Cela permet donc de contourner la sur-définition
• Dans le constructeur de copie : super(copie.super);

Introduction à JAVA : héritage (1)


Page : 17
Héritage
et appel de méthodes

Introduction à JAVA : héritage (1)


Page : 18
Appel de méthodes (1)
class Vehicule { class Voiture extends Vehicule{
void demarrer() void demarrer()
{…} {…}
} }

class Main { Méthode appelée ici


public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}

• Java commence par chercher la méthode dans la


classe de l'objet créé
Introduction à JAVA : héritage (1)
Page : 19
Appel de méthodes (2)
class Vehicule { class Voiture extends Vehicule{
void demarrer() }
{…}
}

class Main { Méthode appelée ici


public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}
• Si la méthode n'existe pas dans la classe de l'objet
créé, il va chercher dans la classe mère
Introduction à JAVA : héritage (1)
Page : 20
Appel de méthodes (3)
class Vehicule { class Voiture extends Vehicule{
void demarrer() void demarrer()
{…} {…}
} }

class Main { Méthode appelée ici


public static void main(String args[]){
Voiture v = new Voiture();
v.super.demarrer();
}
}
• Pour appeler directement la méthode de la classe
mère, utiliser le mot clef super.
Introduction à JAVA : héritage (1)
Page : 21
Héritage et visibilité

Introduction à JAVA : héritage (1)


Page : 22
Héritage et visibilité
• Une classe fille hérite des attributs et
méthodes public et protected de la classe mère
• Elle n’hérite pas des attributs et méthodes
private
• La classe mère ne voit que ce qui est public
dans la classe fille
• Un objet d’une classe mère n’hérite pas des
attributs et méthodes de ses classes filles

Introduction à JAVA : héritage (1)


Page : 23
Visibilité : exemple
class Vehicule {
protected double longueur;
}

class Voiture extends Vehicule {


protected int nbPortes;

}

• On peut utiliser l’attribut longueur dans Vehicule et dans


Voiture
• On ne peut pas utiliser l’attribut nbPortes dans la classe
Vehicule

Introduction à JAVA : héritage (1)


Page : 24
Final
• Une classe déclarée final ne peut plus être étendue
• Cela signifie qu'aucune autre classe ne peut en hériter
• Une méthode déclarée final ne peut plus être dérivée
par des sous-classes de la classe dont elle provient
• Intérêt 1 : cela permet d'interdire la redéfinition d'une
méthode par le biais de l'héritage
• ex : final boolean checkPassword()
• Intérêt 2 : cela permet de gagner du temps à la
compilation
• Une variable ou un attribut déclarés final sont
constants => le compilateur interdit de les modifier
Introduction à JAVA : héritage (1)
Page : 25
La classe Object

Introduction à JAVA : héritage (1)


Page : 26
La classe Object
• La classe Object est la classe mère dont
héritent toutes les autres classes
• Toute classe définie en Java, que ce soit par
l’utilisateur ou dans un package de l’API,
hérite de la classe Object
• Ainsi, toute classe hérite d’emblée des
méthodes de la classe Object

Introduction à JAVA : héritage (1)


Page : 27
Méthodes de la classe Object (1)
• Public final Class getClass() renvoie dans le
type de l'objet sous forme d’un objet de la
classe Class (réflexivité)
• forName() renvoie un objet du type spécifié
dans la chaîne, permet de construire un objet
sans avoir de constructeur (réflexivité)
• int hashCode() renvoie un code utilisé pour
stocker dans une Hashtable
• void finalize() force le Garbage Collector

Introduction à JAVA : héritage (1)


Page : 28
Méthodes de la classe Object (2)
• boolean equals(Object o) attention, == teste les
références. Mais compare les références des attributs
(=> redéfinir)
• Object clone() : crée une copie de l’objet. Mais copie
les références des attributs (=> redéfinir)
• String toString() renvoie une String décrivant l'objet.
Par défaut, renvoie le type et l’adresse de stockage
(=> redéfinir)
• ...

Introduction à JAVA : héritage (1)


Page : 29
Intérêt de la classe Object
• Certains traitements sont si génériques qu'ils
peuvent s'appliquer à tous les objets
• Par exemple, une liste peut contenir n'importe
quel type d'objet et les compter, les trier, etc.
• Donc il faut écrire la classe Liste pour
manipuler des objets de la classe Object
• On pourra alors stocker dans la liste n’importe
quel type d’objet

Introduction à JAVA : héritage (1)


Page : 30
Les Wrappers
(jusque JDK 1.4)

Introduction à JAVA : héritage (1)


Page : 31
Les classes « enveloppe » (1)
• Il existe en Java quantité de classes qui
ressemblent à Vecteur, permettant de
stocker, trier, retrouver…efficacement des
objets : les Conteneurs (cf. cours 7)
• Problème : les types de base (int, float,
double, boolean…ne sont pas des objets)
• On ne peut pas les stocker tels quels dans
les conteneurs
• C’est à cela que servent les classes
enveloppes (Wrappers)
Introduction à JAVA : héritage (1)
Page : 32
Les classes « enveloppe » (2)
• Permettent de représenter des types de base
sous forme d’objets
• int entier => Integer n
• Integer n = new Integer(entier);
• entier = n. intValue();
• double =>Double, boolean => Boolean…
• intValue(), doubleValue() ...
• A utiliser aussi peu que possible

Introduction à JAVA : héritage (1)


Page : 33
Le Polymorphisme

Introduction à JAVA : héritage (1)


Page : 34
Héritage et traitements
• L'héritage permet d'organiser les données sous
forme de classes de façon à coller à la
sémantique du domaine modélisé
• Mais l'héritage permet aussi d'organiser les
traitements de façon à éviter les répétitions de
code
• Pour utiliser correctement l’héritage, il faut de
l'abstraction et du polymorphisme

Introduction à JAVA : héritage (1)


Page : 35
Le polymorphisme (1)
• On appelle polymorphisme le fait qu'un objet d'une
classe puisse être manipulé comme s'il appartenait à
une autre classe
• Distinguer :
– le vrai type de l'objet : celui qui lui est donné lors de
l'appel du constructeur
– le type mentionné dans le code source
• Java peut convertir dynamiquement tout objet d'une
classe en un objet d'une classe plus générique ou
plus spécifique
• On dit que Java dispose d’un mécanisme de typage
dynamique
Introduction à JAVA : héritage (1)
Page : 36
Le polymorphisme (2)
• Les objets connaissent en permanence le type selon
lequel ils ont été créés
• Il peut donc y avoir différence entre le type de la
référence et celui de l’objet
• Exemple :
Point p = new PointCol();
System.out.println(p.getClass().getName());
=> Affiche PointCol et non pas Point
• Pour que l’on puisse compiler et exécuter, il faut que
le type effectif hérite du type déclaré

Introduction à JAVA : héritage (1)


Page : 37
Exemple : une classe Point
class Point
{
int x,y;
Point(int a, int b){x=a; y=b;}
Point(){x=0; y=0;}

public void moveTo (int a, int b){x=a; y=b;}


public String toString(){return ‘(‘ + x + « , » + y + ‘)’);}
public void affiche(){System.out.println(toString());}
public void distanceToOrigin()
{
return Math.sqrt(x*x +y*y);
}
}

Introduction à JAVA : héritage (1)


Page : 38
Exemple : classe PointCol (oré)
class PointCol extends Point
{
String couleur;
Point(int a, int b, String c){super(a,b);couleur=c;}
Point(){couleur=« blanc »;} // appel implicite de super()
public String getColor(){return couleur;}
public String toString()
{
return super.toString()+couleur;
}
}

Introduction à JAVA : héritage (1)


Page : 39
Le typage dynamique : exercice
• Quelles sont les expressions correctes ?
• Point p1 = new Point();
• Point p2 = new PointCol();
• PointCol pc1 = new PointCol();
• PointCol pc2 = new Point();

• p1.moveTo(1,2);
• String s = p1.getColor();
• pc1 = p2;
• pc2 = (PointCol) p2;

Introduction à JAVA : héritage (1)


Page : 40
Solution
• Point p1 = new Point(); // OK
• Point p2 = new PointCol(); // OK
• PointCol pc1 = new PointCol(); // OK
• PointCol pc2 = new Point(); // erreur compilation

• p1.moveTo(1,2); // OK
• String s = P1.getColor(); // erreur compilation
• pc1 = p2; // erreur compilation (!)
• pc2 = (PointCol) p2; // OK (cast)

Introduction à JAVA : héritage (1)


Page : 41
Polymorphisme : exemple (1)
class Vehicule { class Voiture extends Vehicule{
void demarrer() void demarrer()
{…} {…}
} }
class Garagiste {
public static void garer(Vehicule v)
{v.demarrer(); } Méthode appelée ici
}
class Main {
public static void main(String args[]){
Voiture voiture = new Voiture();
Garagiste.garer(voiture); }
}
• Bien que, syntaxiquement, v soit un véhicule, l'objet
est une voiture
Introduction à JAVA : héritage (1)
Page : 42
Polymorphisme : exemple (2)
class Vehicule { class Voiture extends Vehicule{
} void demarrer() {… }
class Garagiste { }
public static void garer(Vehicule v)
{v.demarrer(); } Ne compile pas !!!
}
class Main {
public static void main(String args[]){
Voiture voiture = new Voiture();
Garagiste.garer(voiture); }
}
• Javac vérifie syntaxiquement que la classe
mentionnée possède bien la méthode

Introduction à JAVA : héritage (1)


Page : 43
Polymorphisme implicite :
synthèse
• Java est capable de retrouver le vrai type de l'objet
même si ce n'est pas le type spécifié dans le code
source
• Si l'objet passé en paramètre (Vehicule v) est une
Voiture, il appellera la méthode demarrer() de la
classe Voiture
• Il suffit que Voiture hérite de Vehicule
• Si la méthode appelée existe pour les deux types,
alors Java appellera celle du vrai type de l'objet
même si le type mentionné est différent
• Si la méthode appelée n'existe pas pour le type
spécifié, alors Java refuse de compiler
Introduction à JAVA : héritage (1)
Page : 44
Patience, vous finirez par
comprendre...

Introduction à JAVA : héritage (1)


Page : 45

Vous aimerez peut-être aussi