Title: ENSTA IN204 Introduction JAVA
1ENSTA IN204Introduction à JAVA
- Olivier Sigaud
- LIP6/AnimatLab
- olivier.sigaud_at_lip6.fr
- 01.44.27.88.53
2Plan 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
3Rappel la surcharge
- On appelle surcharge le fait davoir 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 davoir des types de
retour différents pour les mêmes paramètres
4Surcharge exemple
- class Additionneur
- static int somme(int a, int b) // 1
-
- return (ab)
-
- static int somme(int a, int b, int c) // 2
-
- return (abc)
-
- static float somme(float a, float b) // 3
-
- return (ab)
-
- static float somme(int a, int b) // interdit à
cause de 1 -
- return ((float)a(float)b)
-
5L'héritage
6L'héritage
- On peut souvent classer les objets dans des
arborescences de type de plus en plus génériques
Mot
Adj
Nom
Verbe
V_Transitif
V_Intransitif
dormir
prendre
7Un 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
8Solution
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
9Objectif 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
10Usage 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 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
11Usage de l'héritage (suite)
- Un objet de type Voiture peut utiliser toutes les
méthodes de la classe Vehicule - Il doit disposer dune 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.
12Héritage exemple 1
- class Vehicule
- // Vehicule()
-
- class Voiture extends Vehicule
- int nbPortes
- double longueur
-
- Voiture(double lg, int nbP)
-
- longueur lg
- nbPortes nbP
-
13Exemple 1 suite
- class Garagiste
- public boolean garer(Vehicule v)
-
- v.demarrer()
- for (int pl0plltnbPlacespl)
-
- if (placepl.estLibre())
-
- v.amener(placepl)
- v.arreter()
- return true
-
-
- System.out.println( Aucune place libre )
- return false
-
-
- On peut appliquer la méthode garer() à une
Voiture, un Camion
14super() et super
15La 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 lon peut initialiser les arguments
de la classe mère - On passe les paramètres nécessaires
- Si lon nindique pas super(), il y a un appel du
constructeur par défaut de la classe mère
16super() 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)
-
17Le 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 - Dans le constructeur de copie
super(copie.super)
18Héritage et appel de méthodes
19Appel de méthodes (1)
class Voiture extends Vehicule void
demarrer()
- class Vehicule
- void demarrer()
-
-
- class Main
- 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éé
Méthode appelée ici
20Appel de méthodes (2)
class Voiture extends Vehicule
- class Vehicule
- void demarrer()
-
-
- class Main
- 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
Méthode appelée ici
21Appel de méthodes (3)
class Voiture extends Vehicule void
demarrer()
- class Vehicule
- void demarrer()
-
-
- class Main
- 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.
Méthode appelée ici
22Héritage et visibilité
23Héritage et visibilité
- Une classe fille hérite des attributs et méthodes
public et protected de la classe mère - Elle nhé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 dune classe mère nhérite pas des
attributs et méthodes de ses classes filles
24Visibilité exemple
- class Vehicule
- protected double longueur
-
- class Voiture extends Vehicule
- protected int nbPortes
-
-
- On peut utiliser lattribut longueur dans
Vehicule et dans Voiture - On ne peut pas utiliser lattribut nbPortes dans
la classe Vehicule
25Final
- 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 gt le compilateur interdit de les
modifier
26La classe Object
27La 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
lutilisateur ou dans un package de lAPI, hérite
de la classe Object - Ainsi, toute classe hérite demblée des méthodes
de la classe Object
28Méthodes de la classe Object (1)
- Public final Class getClass() renvoie dans le
type de l'objet sous forme dun 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
29Méthodes de la classe Object (2)
- boolean equals(Object o) attention, teste les
références. Mais compare les références des
attributs (gt redéfinir) - Object clone() crée une copie de lobjet. Mais
copie les références des attributs (gt redéfinir) - String toString() renvoie une String décrivant
l'objet. Par défaut, renvoie le type et ladresse
de stockage (gt redéfinir) - ...
30Inté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 nimporte
quel type dobjet
31Exemple une classe Vecteur
- class Vecteur
-
- int size
- Object donnees
-
- Vecteur(int taille)
-
- size taille
- donnees new Objecttaille
-
- public boolean add(int index, Object o)
-
- if ((indexlt0) (indexgtsize)) return false
- if (donneesindex!null) return false
- else
- donneesindexo
- return true
-
32Classe Vecteur suite
- class Main
- public static void main(String ags)
-
- Vecteur v new Vecteur(10)
- Voiture v1 new Voiture(2.80)
- v.add(0,v1)
- v.add(5,v1)
-
-
- On constate que lon peut stocker un objet de
type Voiture dans un vecteur qui contient des
Object
33classe Vecteur suite
- class Vecteur
-
-
- /
- Renvoie le index_ième objet du vecteur
- _at_param index numéro de lObject cherché
- _at_return lObject trouvé ou null
- /
- public Object get(int index)
-
- if ((indexlt0) (indexgtsize)) return null
- else
- return donneesindex
-
-
34Classe Vecteur usage
- class Main
- public static void main(String ags)
-
-
- Voiture v1 (Voiture) v.get(5)
-
-
- Lobjet renvoyé étant de type Object, il faut
préciser quil sagit en fait dune voiture
35Les Wrappers
36Les 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 - Cest à cela que servent les classes enveloppes
(Wrappers)
37Les classes enveloppe (2)
- Permettent de représenter des types de base sous
forme dobjets - int entier gt Integer n
- Integer n new Integer(entier)
- entier n. intValue()
- double gtDouble, boolean gt Boolean
- intValue(), doubleValue() ...
- A utiliser aussi peu que possible
38Héritage et organisation
39Les hiérarchies complexes (1)
Vehicule
VehiculeAXRoues
VehiculeA2Roues
VehiculeA4Roues
Rollers
Mobylette
Voiture
Camion
Trottinette
Velo
Fourgonnette
Exemple de mauvais critère de classification le
nombre de roues Les descendants ont peu de chose
en commun
40Les hiérarchies complexes (2)
Vehicule
VehiculeAMoteur
VehiculeSansMoteur
Fourgonnette
Mobylette
Voiture
Camion
Trottinette
Velo
Rollers
Cette fois, le critère est structurant
41Les hiérarchies complexes (3)
VehiculeAMoteur
VehiculeSansMoteur
Moteur monMoteur int nbRoues Clef
maClef demarrer()
int nbRoues propulser()
Si lon est amené à modifier une hiérarchie
complexe cela implique des réorganisations
majeures du code En particulier, des attributs et
des traitements doivent être partagés Importance
de la phase de conception préalable
42Héritage et composition exemple
- class Sequenceur
-
- MonVecteur data
- public void reverse()
-
- data.reverse()
-
-
- class Sequenceur extends MonVecteur
-
- // pas besoin de public void reverse()
Sequenceur en hérite -
43Héritage et composition que faire ?
- Problème pas d'héritage multiple on ne peut
pas hériter de tous les composants - Eviter les hiérarchies trop importantes
- Choisir d'hériter du composant qui a le plus de
méthodes ? Non - Se demander si A est un B un peu spécial ou si A
contient un B