Title: DEUG MIAS Option Info Introduction JAVA
1DEUG MIAS Option InfoIntroduction à JAVA
- Olivier Sigaud
- LIP6/AnimatLab
- olivier.sigaud_at_lip6.fr
- 01.44.27.88.53
2Plan du cours 5
- La surcharge
- L'héritage
- super() et super
- La classe Object
- 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(), appel du
constructeur par défaut de la classe mère
16La 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
17super() 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)
-
18Le 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)
19Appel implicite du constructeur de la classe mère
exemple
- class Vehicule
- // Vehicule()
-
- class Voiture extends Vehicule
- int nbPortes
- double longueur
-
- Voiture(double lg, int nbP)
-
- // super()
- longueur lg
- nbPortes nbP
-
20Exercice
- Ecrire une classe Animal qui dispose dun
attribut entier nbPattes. Cette classe dispose
des méthodes suivantes - le constructeur, qui prend en argument un entier
(le nombre de pattes). - String toString(), qui renvoie une chaîne de
caractères contenant le nombre de pattes de
lanimal. - affiche() qui affiche le nombre de pattes de
lanimal. - Ecrire une classe Autruche qui hérite de Animal
- Ecrire une classe Lapin qui hérite de Animal
- Ecrire une classe Main dans laquelle la méthode
main() crée un lapin et une autruche
21Corrigé
- La classe Animal
- class Animal
-
- protected int nbPattes
- Animal(int nb)//constructeur
- setNbPattes(nb)
-
- //accesseur
- public int getNbPattes()return nbPattes
- //modifieur
- public void setNbPattes(int nb)nbPattes nb
- public String toString()
- return "Ceci est un animal doté de "
getNbPattes() " pattes" -
- public void affiche()
- System.out.println(toString())
-
22Corrigé (2)
- Les classes Autruche et Lapin
- class Autruche extends Animal
-
- Autruche(int nb)//constructeur
- super(nb)
-
- public String toString()
- return "Ceci est une autruche dotée de "
getNbPattes() " pattes" -
-
- class Lapin extends Animal
-
- Lapin(int nb)//constructeur
- super(nb)
-
- public String toString()
- return "Ceci est un lapin doté de "
getNbPattes() " pattes" -
23Corrigé (3)
- La classe Main
- class Main
-
- public static void main(String args)
-
- Autruche kiki new Autruche(2)
- Lapin bunny new Lapin(4)
- kiki.affiche()
- bunny.affiche()
-
-
24Héritage et appel de méthodes
25Appel 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
26Appel 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
27Appel 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
28Héritage et visibilité
29Hé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
30Visibilité 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
31Final
- 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
32La classe Object
33La 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
34Mé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
35Mé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) - ...
36Inté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
37Exemple 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
-
38Classe 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
39classe 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
-
-
40Classe 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
41Les Wrappers
42Les 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)
43Les 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
44Héritage et organisation
45Les 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
46Les hiérarchies complexes (2)
Vehicule
VehiculeAMoteur
VehiculeSansMoteur
Fourgonnette
Mobylette
Voiture
Camion
Trottinette
Velo
Rollers
Cette fois, le critère est structurant
47Les 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
48Hé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 -
49Hé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
50Le typage dynamique
51Le typage dynamique (1)
- Il ne faut pas confondre
- le type de la référence de lobjet (ce qui
apparaît dans le code) - le type de lobjet effectivement utilisé (celui
qui est construit) - Le premier est vérifié à la compilation
- Le second est vérifié à lexécution.
- Il faut que les deux soient compatibles
52Le typage dynamique (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 lobjet - Exemple
- Point p new PointCol()
- System.out.println(p.getClass().getName())
- gt Affiche PointCol et non pas Point
- Pour que lon puisse compiler et exécuter, il
faut que le type effectif hérite du type déclaré
53Exemple une classe Point
- class Point
-
- int x,y
- Point(int a, int b)xa yb
- Point()x0 y0
- public void moveTo (int a, int b)xa yb
- public String toString()return ( x ,
y )) - public void affiche()System.out.println(toString
()) - public void distanceToOrigin()
-
- return Math.sqrt(xx yy)
-
54Exemple classe PointCol (oré)
- class PointCol extends Point
-
- String couleur
- PointCol(int abs, int ordo, String c)
- super(abs,ordo)couleurc
- PointCol(String c)couleurc // appel
implicite de super() - PointCol()super() couleur blanc
- public String getColor()return couleur
- public String toString()
-
- return super.toString()couleur
-
55Le typage dynamique exercice
- 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 ?
56Solution
- 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)
57Patience, vous finirez par comprendre...