DEUG MIAS Option Info Introduction JAVA - PowerPoint PPT Presentation

1 / 57
About This Presentation
Title:

DEUG MIAS Option Info Introduction JAVA

Description:

On appelle surcharge le fait d'avoir plusieurs m thodes qui ont le m me nom au sein de la ... v.amener(place[pl]); v.arreter(); return true; System.out.println ... – PowerPoint PPT presentation

Number of Views:45
Avg rating:3.0/5.0
Slides: 58
Provided by: sig9
Category:

less

Transcript and Presenter's Notes

Title: DEUG MIAS Option Info Introduction JAVA


1
DEUG MIAS Option InfoIntroduction à JAVA
  • Olivier Sigaud
  • LIP6/AnimatLab
  • olivier.sigaud_at_lip6.fr
  • 01.44.27.88.53

2
Plan 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

3
Rappel 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

4
Surcharge 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)

5
L'héritage
6
L'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
7
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

8
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

9
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

10
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 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

11
Usage 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.

12
Héritage exemple 1
  • class Vehicule
  • // Vehicule()
  • class Voiture extends Vehicule
  • int nbPortes
  • double longueur
  • Voiture(double lg, int nbP)
  • longueur lg
  • nbPortes nbP

13
Exemple 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

14
super() et super
15
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 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

16
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 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

17
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)

18
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
  • Dans le constructeur de copie
    super(copie.super)

19
Appel 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

20
Exercice
  • 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

21
Corrigé
  • 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())

22
Corrigé (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"

23
Corrigé (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()

24
Héritage et appel de méthodes
25
Appel 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
26
Appel 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
27
Appel 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
28
Héritage et visibilité
29
Hé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

30
Visibilité 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

31
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 gt le compilateur interdit de les
    modifier

32
La classe Object
33
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
    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

34
Mé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

35
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 (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)
  • ...

36
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 nimporte
    quel type dobjet

37
Exemple 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

38
Classe 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

39
classe 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

40
Classe 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

41
Les Wrappers
42
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
  • Cest à cela que servent les classes enveloppes
    (Wrappers)

43
Les 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

44
Héritage et organisation
45
Les 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
46
Les hiérarchies complexes (2)
Vehicule
VehiculeAMoteur
VehiculeSansMoteur
Fourgonnette
Mobylette
Voiture
Camion
Trottinette
Velo
Rollers
Cette fois, le critère est structurant
47
Les 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
48
Hé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

49
Hé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

50
Le typage dynamique
51
Le 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

52
Le 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é

53
Exemple 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)

54
Exemple 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

55
Le 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 ?

56
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)

57
Patience, vous finirez par comprendre...
Write a Comment
User Comments (0)
About PowerShow.com