SlideShare une entreprise Scribd logo
Chapitre 4
Héritage et polymorphisme
1
Mouna Torjmen Khemakhem
Notion d’héritage
Personne
Nom
cin
anneeNaiss
Etudiant
Nom
cin
anneeNaiss
Employe
nom
cin
anneeNaiss
-Définition de 3 classes
-Duplication de code.
-Une modification faite sur un attribut (ou méthode) commun doit être
refaite dans les autres classes.
anneeNaiss
age()
anneeNaiss
note1,note2
age()
moyenne()
anneeNaiss
prixHeure
nbreHeure
age()
salaire()
2
Limites
Mouna Torjmen Khemakhem
Personne
Nom
cin
anneeNaiss
age()
Placer dans la classe mère tous les attributs et
toutes les méthodes communs à toutes les
classes.
Super-classe
Héritent de
Solution
Notion d’héritage
Les classes filles ne comportent que les
attributs ou méthodes plus spécifiques.
Les classes filles héritent automatiquement
les attributs (et les méthodes) qui n'ont pas
besoin d'être ré-écrits.
Sous-classes
Héritent de
3
Etudiant
note1,note2
moyenne()
Employe
prixHeure
nbreHeure
salaire()
Mouna Torjmen Khemakhem
+Réutilisation du code
+Une seule modification des attributs ( ou
méthodes) en commun
Notion d’héritage
Personne
Nom
cin
anneeNaiss
age()
Super-classe
Héritent de
Solution
4
Sous-classes
Héritent de
Etudiant
note1,note2
moyenne()
Employe
prixHeure
nbreHeure
salaire()
Mouna Torjmen Khemakhem
class Personne {
String nom;
int cin, anneeNaiss;
int age(){
class Etudiant extends Personne {
float note1,note2;
public float moyenne (){
L’héritage en JAVA
int age(){
return 2014- anneeNaiss;
}
public float moyenne (){
return ((note1+note2)/2);}
}
5
Mouna Torjmen Khemakhem
Une classe peut avoir plusieurs sous-classes.
Une super-classe
L’héritage en JAVA
Personne
Nom
cin
anneeNaiss
age()
Plusieurs sous-classes
Chercheur
articles
rechercher()
6
age()
Etudiant
note1,note2
moyenne()
Employe
prixHeure
nbreHeure
salaire()
Mouna Torjmen Khemakhem
Une classe ne peut avoir qu’une seule classe mère
Personne
nom
cin
anneeNaiss
age()
EtreHumain
peau
yeux
respirer()
L’héritage en JAVA
pas d'héritage multiple en java
class Etudiant extendsextendsextendsextends Personne, EtreHumain
Etudiant
Note1,note1
moyenne()
7
Mouna Torjmen Khemakhem
Etudiant hérite de Personne
EtudiantENIS hérite de Etudiant
Personne
Nom
cin
dateNaiss
age()
EtudiantENIS
hérite de Personne
L’héritage en JAVA
Héritage en cascade
Etudiant
note1,note2
moyenne()
EtudiantENIS
noteOption
moyenneOption()
Etudiant etudiant=new Etudiant()
etudiant.age();
etudiant.moyenne ()
etudiant.moyenneOption();
EtudiantENIS etudiantTelecom=new EtudiantENIS ()
etudiantENIS.age();
etudiantENIS.rmoyenne()
etudiantENIS.moyenneOption();
8
Mouna Torjmen Khemakhem
Docteur
travailHopital:boolean
traiterPatient()
•Quel est le nombre d’attributs de Chirurgien ?
•Quel est le nombre d’attributs de
MedecinDeFamille ?
Héritage en cascade
L’héritage en JAVA
traiterPatient()
MedecinDeFamille
faitVisites: boolean
donnerConseil()
Chirurgien
faireUneIncision: boolean
•Combien de méthodes Docteur a-t-il ?
•Combien de méthodes MedecinDeFamille a-t-il ?
•MedecinDeFamille peut-il invoquer
traiterPatient() ?
•MedecinDeFamille peut-il invoquer
faireUneIncision ?
9
Mouna Torjmen Khemakhem
Héritage et encapsulation
public class Personne {
public String nom;
protected String prenom;
int age;
private long cin;
Package 1 Package 2
public
class Employe extends Personne
private long cin;
}
class Etudiant extends Personne
Etudiant hérite
nom
prenom
age
Employe hérite
nom
prenom
10
Mouna Torjmen Khemakhem
Le mot-clé super
Pour manipuler un attribut de la super-classe :
super.cin
Le mot-clé super permet de désigner la superclasse,
super permet d'accéder aux attributs et méthodes de la super-classe
super.cin
Pour manipuler une méthode de la super-classe :
super.age()
Pour faire appel au constructeur de la super-classe:
super(nom, cin)
11
Mouna Torjmen Khemakhem
Constructeurs et héritage
class Personne {
private String nom;
private long cin;
class Etudiant extends Personne {
private float note1,note2;
Constructeur par défaut
private long cin;
public Presonne(){
nom=“Mohamed”;
cin=00000000;
}
}
public Etudiant(){
super();
note1=0.0f;
note2=0.0f;
}
}
super fait appel au constructeur par défaut
de la classe mère
12
Mouna Torjmen Khemakhem
Constructeurs et héritage
class Personne {
private String nom;
private long cin;
class Etudiant extends Personne {
private float note1,note2;
Constructeur surchargé
private long cin;
public Presonne(String nom, long cin){
this.nom=nom;
this.cin=cin;
}
}
public Etudiant(String nom, long cin, int
note1, int note 2){
super(nom, cin);
this.note1=note1;
this.note2=note2;
}
}
super fait appel au constructeur surchargé
de la classe mère
13
Mouna Torjmen Khemakhem
Constructeurs et héritage
public class Animal {
La première instruction dans le constructeur de la sous-classe
doit être l’appel au constructeur de la superclasse avec le mot clé
super.
Si on ne fait pas d’appel explicite au constructeur de la
superclasse, c’est le constructeur par défaut de la superclasse qui
est appelé implicitement.
public class Animal {
public int nbPattes;
public Animal(int nbPattes) {
this.nbPattes = nbPattes; }
}
public class Chat extends Animal{
}
14
Mouna Torjmen Khemakhem
Constructeurs et héritage
public class Animal {
public int nbPattes;
public Animal(int nbPattes) {
this.nbPattes = nbPattes; }
}
public class Chat extends Animal{
public Chat(){
super();
}
}
Un constructeur surchargé est crée pour la classe Animal
le constructeur par défaut n'existe pas.
Erreur à la compilation lors de l’exécution de super()
Constructeur par défaut
Appel implicite à super
15
Mouna Torjmen Khemakhem
Constructeurs et héritage
public class Animal {
public int nbPattes;
public Animal(){}
Solution 1
Déclarer explicitement le constructeur par défaut de la classe mère
public Animal(){}
public Animal(int nbPattes) {
this.nbPattes = nbPattes; }
}
public class Chat extends Animal{
}
16
Mouna Torjmen Khemakhem
Constructeurs et héritage
Solution 2
public class Animal {
public int nbPattes;
Faire un appel explicite au constructeur surchargé de la classe mère
public class Chat extends Animal{
public Chat(){
super(4);
}
}
public Animal(int nbPattes) {
this.nbPattes = nbPattes;
}
}
17
Mouna Torjmen Khemakhem
Constructeurs et héritage
Enchaînement des consctructeurs
public class Client extends Humain {
public class Humain{
public Humain() {
System.out.println(“Je suis un être humain”);
}
}
public class Client extends Humain {
public Client (){
System.out.println(“Je suis un client”);
}
}
public class ClientFidele extends Client {
public ClientFidele(){
System.out.println(“Je suis un client fidèle”);
}
}
ClientFidele cFidele=new ClientFidele(); 18
Mouna Torjmen Khemakhem
Redéfinition des méthodes
class Personne {
public void lire() {
System.out.println(“Je sais lire”);
}
}
•La classe Etudiant hérite la
méthode lire() mais on veut}
class Etudiant extends Personne {
public void lire() {
System.out.println(“Je suis un étudiant”);
System.out.println(“Je sais lire”);
}
}
méthode lire() mais on veut
changer son traitement
•On garde la même signature
de la méthode lire et on
change le corps
On parle alors de
redéfinition
(override)
19
Mouna Torjmen Khemakhem
Redéfinition des méthodes
class Personne {
public void lire() {
System.out.println(“Je sais lire”);
}
}}
class Etudiant extends Personne {
public void lire() {
System.out.println(“Je suis un etudiant”);
super.lire();
}
}
Possibilité de réutiliser le
code de la méthode
héritée (super)
20
Mouna Torjmen Khemakhem
Surchage des méthodes
class Personne {
public void lire() {
System.out.println(“Je sais lire”);
}
}
•On garde la même nom de la
méthode, le même type de
retour et on change les}
class Etudiant extends Personne {
public void lire(String titreLivre) {
System.out.println(“Je sais lire”);
System.out.println(“J’ai lu le livre ”+titreLivre);
}
}
retour et on change les
paramètres
On parle alors de
surcharge
(overload)
21
Mouna Torjmen Khemakhem
Surcharge vs redéfinition
class Personne {
public void lire() {
System.out.println(“Je sais lire”);
}
}
surcharge redéfinition
class Etudiant extends Personne {
public void lire(String titreLivre) {
System.out.println(“Je sais lire”);
System.out.println(“J’ai lu le livre ”+titreLivre);
}
}
surcharge
Etudiant possède deux méthodes
• lire()
•lire(String)
redéfinition
Etudiant possède une seule méthode
•lire()
class Etudiant extends Personne {
public void lire() {
System.out.println(“Je suis un étudiant”);
super.lire();
}
}
22
Mouna Torjmen Khemakhem
Le mot-clé final
Une classe peut protéger une méthode afin d'éviter qu'elle ne soit redéfinie
dans ses sous-classes.
En Java, on va simplement ajouter le modificateur final dans la signature
de la méthode.
public final void lire()
Empêcher la redéfinition
public final void lire()
Une classe déclarée final ne peut pas être dérivée
Permet d’interdire tout héritage pour cette classe qui ne pourra pas être
une classe mère
Toutes les méthodes à l’intérieur de la classe final seront implicitement
finales
final class Personne
Empêcher l’hériatage
23
Mouna Torjmen Khemakhem
La classe Object
Toutes les classes java héritent implicitement de la classe Object.
La classe Object est l’ancêtre de toutes les classes
Object
toString()
equals()
…
Personne
nom
cin
lire()
Etudiant
moyenne
reviser()
Employe
salaire
travailler()
Chercheur
articles
rechercher()
Docteur
travailALHopital:boolean
traiterPatient()
MedecinDeFamille
faitVisites: boolean
donnerConseil()
Chirurgien
faireUneIncision: boolean
Humain
Client
ClientFidele
24
Mouna Torjmen Khemakhem
La méthode equals
• La méthode equals détermine si deux objets sont égaux ou non.
• Son implémentation dans la classe Object vérifie que les références
d’objets sont identiques.
• On aura souvent besoin de redéfinir la méthode equals : deux objets
seront égaux quand ils auront le même état.seront égaux quand ils auront le même état.
public boolean equals(Object obj) {
if(obj instanceof Personne){
Personne personne = (Personne) obj;
if((nom.equals(personne.nom)) && (cin==personne.cin))
{ return true; }
return false;
}
Redéfinition de la méthode equals pour la classe Personne
Deux personnes sont égaux s’ils ont le même cin et le même nom
25
Mouna Torjmen Khemakhem
Polymorphisme
• N’importe quel objet en Java qui peut passer
d’une relation « est un » peut être considéré
polymorphe.
• Le polymorphisme est le fait de référencer• Le polymorphisme est le fait de référencer
une classe fille avec un référence déclaré de
type une classe mère. Animal
Dog
Animal myDog = new Dog();
Référence déclaré en
tant qu’Animal().
Objet crée en
tant que Dog(). 26
Mouna Torjmen Khemakhem
Polymorphisme
• Pourquoi?
-Ecrire un code flexible.
-Ecrire un code nettoyé :-Ecrire un code nettoyé :
–plus efficace.
–plus simple.
-Facile à développer.
-Facile à étendre.
27
Mouna Torjmen Khemakhem
Tableau polymorphique
Avec le polymorphisme : le type de la référence
peut être la classe mère de l’objet instancié.
Soit : Animal [ ] animals = new Animal [3]; AnimalSoit : Animal [ ] animals = new Animal [3]; Animal
CatDog Wolf
- Déclarer un tableau de type Animal.
- Un tableau qui contiendra des objets de type Animal.
28
Mouna Torjmen Khemakhem
Tableau polymorphique
• On peut mettre n’importe quelle classe fille de
la classe Animal() dans le tableau.
animals
animals [0] = new Dog();
animals [1] = new Cat();
animals [2] = new Wolf();
29
Mouna Torjmen Khemakhem
30
Mouna Torjmen Khemakhem
On va parcourir le tableau et appeler
n’importe quelle méthode de manière
concrète.
Tableau polymorphique
31
Mouna Torjmen Khemakhem
Argument polymorphique
-Le paramètre Animal peut être
n’importe quel animal.
-Le vétérinaire donne une piqure à
l’animal et lui demande de faire du
bruit. N’importe quel animal dans
le heap ayant la méthode
makeNoise(), fera son bruit.
La méthode giveShot() de Vet peut prendre n’importe
quel Animal tant que l’objet passé en paramètre est une
classe fille de Animal. (la méthode makeNoise() doit être
implémentée dans les classes Cat et Dog).
32
Mouna Torjmen Khemakhem
Surclassement et Substitution
Animal
public void eat(){
sout(’’je manges’’)
Animal animal;
Dog myDog = new Dog();
animal = myDog;
animal
Animal
myDog
Dog
Dog
public void
watch(){
sout(’’je gardes’’)
}
WolfCat
sout(’’je manges’’)
}
public void roam(){
sout(’’je voyages’’)
}
animal.eat() OK
animal.roam() OK
animal.watch() KO
eat()
roam()
watch()
myDog.eat() OK
myDogl.roam() OK
myDog.watch() OK
33
Mouna Torjmen Khemakhem
Surclassement et Substitution
On dit que :
- l’objet Dog crée est « surclassé ». Il est vu de type Animal de la référence déclarée
(animal).
- Les fonctionnalités de Dog sont restreintes à celles de Animal. Le chien ne pourra pas
Il faut donc substituer animal par : animal.eat() OK
animal.roam() OK
((Dog) animal).watch() OK
((Dog) animal).watch();
- Les fonctionnalités de Dog sont restreintes à celles de Animal. Le chien ne pourra pas
être un chien de garde (watch()).
34
Mouna Torjmen Khemakhem
Lien dynamique
Quelle est la méthode appelée ?
Wolf w = new Wolf();
Animal
makeNoise()
eat()
sleep()
roam()
w.makeNoise();
La méthode appelée est celle existante dans la
classe du type le plus inférieur dans
l’hiérarchie d’héritage gagne !
Canine
roam()
Wolf
makeNoise()
eat()
w.roam();
w.makeNoise();
w.eat();
w.sleep();
La machine virtuelle JVM commence tout
d’abord à voir dans la classe Wolf .
Si elle ne trouve pas une correspondance de la
version de la méthode, elle commence à
grimper l’hiérarchie de l’héritage jusqu’à
trouver la bonne méthode.
35
Mouna Torjmen Khemakhem
Exemple
class ObjetGraphique{
private int x, y ;
void setXY (int x, int y){
this.x=x ; this.y=y ; }
int getX(){return x ;}
int getY(){return y ;}int getY(){return y ;}
float surface (){return(0) ;}
}// fin de la classe ObjetGraphique
class Rectangle extends ObjetGraphique{
float largeur=3, longueur=5 ;
void allongerRect(float lg) {longueur+=lg ;}
float surface (){return(longueur*largeur) ;}
}// fin de la classe Rectangle
class Cercle extends ObjetGraphique{
float rayon=2 ;
float surface (){ return (rayon*rayon*3.14f) ;}
}// fin de la classe Cercle
36
Mouna Torjmen Khemakhem
Exemple
public class TestObjetGraphique{
public static void main(String[]args){
}
37
Mouna Torjmen Khemakhem
Exemple
class ObjetGraphique{
private int x, y ;
ObjetGraphique(int x, int y){
this.x=x; this.y=y; }
void affiche () {System.out.println(" affiche un objet graphique ");}}
class Rectangle extends ObjetGraphique{
float largeur, longueur;float largeur, longueur;
Rectangle(float la, float lo){
super(2,3);
largeur=la; longueur=lo;}
void affiche(){
super.affiche();
System.out.println(" affiche un rectangle ");}}
class Essai{
public static void main(String [] args){
Rectangle r=new Rectangle(3,5);
r.affiche(); } }
38
Mouna Torjmen Khemakhem
Exemple
ObjetGraphique d ;
switch (c){//c est une variable introduite par le clavier
case 'o' :d= new ObjetGraphique();
break ;
case 'r' : d= new Rectangle();
break ;break ;
case 'c' : d= new Cercle() ;
break ;
}
float s=d.surface();
39
Mouna Torjmen Khemakhem

Contenu connexe

Tendances

Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
Amir Souissi
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLI
JihenHedhli1
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
Maya Medjdoub
 
Exercice 2 java Héritage
Exercice 2  java HéritageExercice 2  java Héritage
Exercice 2 java Héritage
NadaBenLatifa
 
Tp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-EclipseTp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-Eclipse
Lilia Sfaxi
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeur
Abdelwahab Naji
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptions
Amir Souissi
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
Amir Souissi
 
Langage C#
Langage C#Langage C#
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
Lilia Sfaxi
 
TP2-UML-Correction
TP2-UML-CorrectionTP2-UML-Correction
TP2-UML-Correction
Lilia Sfaxi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
Aziz Darouichi
 
Support du cours : Systèmes d'exploitation 2 (linux)
Support du cours : Systèmes d'exploitation 2 (linux)Support du cours : Systèmes d'exploitation 2 (linux)
Support du cours : Systèmes d'exploitation 2 (linux)
Faycel Chaoua
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
ENSET, Université Hassan II Casablanca
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
Aziz Darouichi
 
Cours algorithmique et complexite complet
Cours algorithmique et complexite completCours algorithmique et complexite complet
Cours algorithmique et complexite complet
Chahrawoods Dmz
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
Aziz Darouichi
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
Aziz Darouichi
 
Tp n 1 linux
Tp n 1 linuxTp n 1 linux
Tp n 1 linux
Amir Souissi
 

Tendances (20)

Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLI
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Cours java
Cours javaCours java
Cours java
 
Exercice 2 java Héritage
Exercice 2  java HéritageExercice 2  java Héritage
Exercice 2 java Héritage
 
Tp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-EclipseTp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-Eclipse
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeur
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptions
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
Langage C#
Langage C#Langage C#
Langage C#
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
 
TP2-UML-Correction
TP2-UML-CorrectionTP2-UML-Correction
TP2-UML-Correction
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Support du cours : Systèmes d'exploitation 2 (linux)
Support du cours : Systèmes d'exploitation 2 (linux)Support du cours : Systèmes d'exploitation 2 (linux)
Support du cours : Systèmes d'exploitation 2 (linux)
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
Cours algorithmique et complexite complet
Cours algorithmique et complexite completCours algorithmique et complexite complet
Cours algorithmique et complexite complet
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Tp n 1 linux
Tp n 1 linuxTp n 1 linux
Tp n 1 linux
 

Similaire à POO Java Chapitre 4 Heritage et Polymorphisme

Chapitre 4 la programmation oriénté objet
Chapitre 4 la programmation oriénté objetChapitre 4 la programmation oriénté objet
Chapitre 4 la programmation oriénté objet
Säß Ŕî
 
Chapitre 5_Heritage.pptxygygilyiuhoijoijoi
Chapitre 5_Heritage.pptxygygilyiuhoijoijoiChapitre 5_Heritage.pptxygygilyiuhoijoijoi
Chapitre 5_Heritage.pptxygygilyiuhoijoijoi
inesslimane4
 
Cours5-heritage.pptx
Cours5-heritage.pptxCours5-heritage.pptx
Cours5-heritage.pptx
RihabBENLAMINE
 
Chap 4 L'heritage.pdf
Chap 4 L'heritage.pdfChap 4 L'heritage.pdf
Chap 4 L'heritage.pdf
HamzaElgari
 
Enrichissez vos classes avec extends
Enrichissez vos classes avec extendsEnrichissez vos classes avec extends
Enrichissez vos classes avec extends
Asmaa BENGUEDDACH
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
YasushiTsubakik
 

Similaire à POO Java Chapitre 4 Heritage et Polymorphisme (6)

Chapitre 4 la programmation oriénté objet
Chapitre 4 la programmation oriénté objetChapitre 4 la programmation oriénté objet
Chapitre 4 la programmation oriénté objet
 
Chapitre 5_Heritage.pptxygygilyiuhoijoijoi
Chapitre 5_Heritage.pptxygygilyiuhoijoijoiChapitre 5_Heritage.pptxygygilyiuhoijoijoi
Chapitre 5_Heritage.pptxygygilyiuhoijoijoi
 
Cours5-heritage.pptx
Cours5-heritage.pptxCours5-heritage.pptx
Cours5-heritage.pptx
 
Chap 4 L'heritage.pdf
Chap 4 L'heritage.pdfChap 4 L'heritage.pdf
Chap 4 L'heritage.pdf
 
Enrichissez vos classes avec extends
Enrichissez vos classes avec extendsEnrichissez vos classes avec extends
Enrichissez vos classes avec extends
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 

Plus de Mouna Torjmen

TIC & E-Learning
TIC & E-LearningTIC & E-Learning
TIC & E-Learning
Mouna Torjmen
 
Apprentissage Par Projet APP
Apprentissage Par Projet APPApprentissage Par Projet APP
Apprentissage Par Projet APP
Mouna Torjmen
 
Chapitre 4 no sql
Chapitre 4 no sqlChapitre 4 no sql
Chapitre 4 no sql
Mouna Torjmen
 
Chapitre 3 spark
Chapitre 3 sparkChapitre 3 spark
Chapitre 3 spark
Mouna Torjmen
 
Chapitre 2 hadoop
Chapitre 2 hadoopChapitre 2 hadoop
Chapitre 2 hadoop
Mouna Torjmen
 
Chapitre1 introduction
Chapitre1 introductionChapitre1 introduction
Chapitre1 introduction
Mouna Torjmen
 

Plus de Mouna Torjmen (6)

TIC & E-Learning
TIC & E-LearningTIC & E-Learning
TIC & E-Learning
 
Apprentissage Par Projet APP
Apprentissage Par Projet APPApprentissage Par Projet APP
Apprentissage Par Projet APP
 
Chapitre 4 no sql
Chapitre 4 no sqlChapitre 4 no sql
Chapitre 4 no sql
 
Chapitre 3 spark
Chapitre 3 sparkChapitre 3 spark
Chapitre 3 spark
 
Chapitre 2 hadoop
Chapitre 2 hadoopChapitre 2 hadoop
Chapitre 2 hadoop
 
Chapitre1 introduction
Chapitre1 introductionChapitre1 introduction
Chapitre1 introduction
 

POO Java Chapitre 4 Heritage et Polymorphisme

  • 1. Chapitre 4 Héritage et polymorphisme 1 Mouna Torjmen Khemakhem
  • 2. Notion d’héritage Personne Nom cin anneeNaiss Etudiant Nom cin anneeNaiss Employe nom cin anneeNaiss -Définition de 3 classes -Duplication de code. -Une modification faite sur un attribut (ou méthode) commun doit être refaite dans les autres classes. anneeNaiss age() anneeNaiss note1,note2 age() moyenne() anneeNaiss prixHeure nbreHeure age() salaire() 2 Limites Mouna Torjmen Khemakhem
  • 3. Personne Nom cin anneeNaiss age() Placer dans la classe mère tous les attributs et toutes les méthodes communs à toutes les classes. Super-classe Héritent de Solution Notion d’héritage Les classes filles ne comportent que les attributs ou méthodes plus spécifiques. Les classes filles héritent automatiquement les attributs (et les méthodes) qui n'ont pas besoin d'être ré-écrits. Sous-classes Héritent de 3 Etudiant note1,note2 moyenne() Employe prixHeure nbreHeure salaire() Mouna Torjmen Khemakhem
  • 4. +Réutilisation du code +Une seule modification des attributs ( ou méthodes) en commun Notion d’héritage Personne Nom cin anneeNaiss age() Super-classe Héritent de Solution 4 Sous-classes Héritent de Etudiant note1,note2 moyenne() Employe prixHeure nbreHeure salaire() Mouna Torjmen Khemakhem
  • 5. class Personne { String nom; int cin, anneeNaiss; int age(){ class Etudiant extends Personne { float note1,note2; public float moyenne (){ L’héritage en JAVA int age(){ return 2014- anneeNaiss; } public float moyenne (){ return ((note1+note2)/2);} } 5 Mouna Torjmen Khemakhem
  • 6. Une classe peut avoir plusieurs sous-classes. Une super-classe L’héritage en JAVA Personne Nom cin anneeNaiss age() Plusieurs sous-classes Chercheur articles rechercher() 6 age() Etudiant note1,note2 moyenne() Employe prixHeure nbreHeure salaire() Mouna Torjmen Khemakhem
  • 7. Une classe ne peut avoir qu’une seule classe mère Personne nom cin anneeNaiss age() EtreHumain peau yeux respirer() L’héritage en JAVA pas d'héritage multiple en java class Etudiant extendsextendsextendsextends Personne, EtreHumain Etudiant Note1,note1 moyenne() 7 Mouna Torjmen Khemakhem
  • 8. Etudiant hérite de Personne EtudiantENIS hérite de Etudiant Personne Nom cin dateNaiss age() EtudiantENIS hérite de Personne L’héritage en JAVA Héritage en cascade Etudiant note1,note2 moyenne() EtudiantENIS noteOption moyenneOption() Etudiant etudiant=new Etudiant() etudiant.age(); etudiant.moyenne () etudiant.moyenneOption(); EtudiantENIS etudiantTelecom=new EtudiantENIS () etudiantENIS.age(); etudiantENIS.rmoyenne() etudiantENIS.moyenneOption(); 8 Mouna Torjmen Khemakhem
  • 9. Docteur travailHopital:boolean traiterPatient() •Quel est le nombre d’attributs de Chirurgien ? •Quel est le nombre d’attributs de MedecinDeFamille ? Héritage en cascade L’héritage en JAVA traiterPatient() MedecinDeFamille faitVisites: boolean donnerConseil() Chirurgien faireUneIncision: boolean •Combien de méthodes Docteur a-t-il ? •Combien de méthodes MedecinDeFamille a-t-il ? •MedecinDeFamille peut-il invoquer traiterPatient() ? •MedecinDeFamille peut-il invoquer faireUneIncision ? 9 Mouna Torjmen Khemakhem
  • 10. Héritage et encapsulation public class Personne { public String nom; protected String prenom; int age; private long cin; Package 1 Package 2 public class Employe extends Personne private long cin; } class Etudiant extends Personne Etudiant hérite nom prenom age Employe hérite nom prenom 10 Mouna Torjmen Khemakhem
  • 11. Le mot-clé super Pour manipuler un attribut de la super-classe : super.cin Le mot-clé super permet de désigner la superclasse, super permet d'accéder aux attributs et méthodes de la super-classe super.cin Pour manipuler une méthode de la super-classe : super.age() Pour faire appel au constructeur de la super-classe: super(nom, cin) 11 Mouna Torjmen Khemakhem
  • 12. Constructeurs et héritage class Personne { private String nom; private long cin; class Etudiant extends Personne { private float note1,note2; Constructeur par défaut private long cin; public Presonne(){ nom=“Mohamed”; cin=00000000; } } public Etudiant(){ super(); note1=0.0f; note2=0.0f; } } super fait appel au constructeur par défaut de la classe mère 12 Mouna Torjmen Khemakhem
  • 13. Constructeurs et héritage class Personne { private String nom; private long cin; class Etudiant extends Personne { private float note1,note2; Constructeur surchargé private long cin; public Presonne(String nom, long cin){ this.nom=nom; this.cin=cin; } } public Etudiant(String nom, long cin, int note1, int note 2){ super(nom, cin); this.note1=note1; this.note2=note2; } } super fait appel au constructeur surchargé de la classe mère 13 Mouna Torjmen Khemakhem
  • 14. Constructeurs et héritage public class Animal { La première instruction dans le constructeur de la sous-classe doit être l’appel au constructeur de la superclasse avec le mot clé super. Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la superclasse qui est appelé implicitement. public class Animal { public int nbPattes; public Animal(int nbPattes) { this.nbPattes = nbPattes; } } public class Chat extends Animal{ } 14 Mouna Torjmen Khemakhem
  • 15. Constructeurs et héritage public class Animal { public int nbPattes; public Animal(int nbPattes) { this.nbPattes = nbPattes; } } public class Chat extends Animal{ public Chat(){ super(); } } Un constructeur surchargé est crée pour la classe Animal le constructeur par défaut n'existe pas. Erreur à la compilation lors de l’exécution de super() Constructeur par défaut Appel implicite à super 15 Mouna Torjmen Khemakhem
  • 16. Constructeurs et héritage public class Animal { public int nbPattes; public Animal(){} Solution 1 Déclarer explicitement le constructeur par défaut de la classe mère public Animal(){} public Animal(int nbPattes) { this.nbPattes = nbPattes; } } public class Chat extends Animal{ } 16 Mouna Torjmen Khemakhem
  • 17. Constructeurs et héritage Solution 2 public class Animal { public int nbPattes; Faire un appel explicite au constructeur surchargé de la classe mère public class Chat extends Animal{ public Chat(){ super(4); } } public Animal(int nbPattes) { this.nbPattes = nbPattes; } } 17 Mouna Torjmen Khemakhem
  • 18. Constructeurs et héritage Enchaînement des consctructeurs public class Client extends Humain { public class Humain{ public Humain() { System.out.println(“Je suis un être humain”); } } public class Client extends Humain { public Client (){ System.out.println(“Je suis un client”); } } public class ClientFidele extends Client { public ClientFidele(){ System.out.println(“Je suis un client fidèle”); } } ClientFidele cFidele=new ClientFidele(); 18 Mouna Torjmen Khemakhem
  • 19. Redéfinition des méthodes class Personne { public void lire() { System.out.println(“Je sais lire”); } } •La classe Etudiant hérite la méthode lire() mais on veut} class Etudiant extends Personne { public void lire() { System.out.println(“Je suis un étudiant”); System.out.println(“Je sais lire”); } } méthode lire() mais on veut changer son traitement •On garde la même signature de la méthode lire et on change le corps On parle alors de redéfinition (override) 19 Mouna Torjmen Khemakhem
  • 20. Redéfinition des méthodes class Personne { public void lire() { System.out.println(“Je sais lire”); } }} class Etudiant extends Personne { public void lire() { System.out.println(“Je suis un etudiant”); super.lire(); } } Possibilité de réutiliser le code de la méthode héritée (super) 20 Mouna Torjmen Khemakhem
  • 21. Surchage des méthodes class Personne { public void lire() { System.out.println(“Je sais lire”); } } •On garde la même nom de la méthode, le même type de retour et on change les} class Etudiant extends Personne { public void lire(String titreLivre) { System.out.println(“Je sais lire”); System.out.println(“J’ai lu le livre ”+titreLivre); } } retour et on change les paramètres On parle alors de surcharge (overload) 21 Mouna Torjmen Khemakhem
  • 22. Surcharge vs redéfinition class Personne { public void lire() { System.out.println(“Je sais lire”); } } surcharge redéfinition class Etudiant extends Personne { public void lire(String titreLivre) { System.out.println(“Je sais lire”); System.out.println(“J’ai lu le livre ”+titreLivre); } } surcharge Etudiant possède deux méthodes • lire() •lire(String) redéfinition Etudiant possède une seule méthode •lire() class Etudiant extends Personne { public void lire() { System.out.println(“Je suis un étudiant”); super.lire(); } } 22 Mouna Torjmen Khemakhem
  • 23. Le mot-clé final Une classe peut protéger une méthode afin d'éviter qu'elle ne soit redéfinie dans ses sous-classes. En Java, on va simplement ajouter le modificateur final dans la signature de la méthode. public final void lire() Empêcher la redéfinition public final void lire() Une classe déclarée final ne peut pas être dérivée Permet d’interdire tout héritage pour cette classe qui ne pourra pas être une classe mère Toutes les méthodes à l’intérieur de la classe final seront implicitement finales final class Personne Empêcher l’hériatage 23 Mouna Torjmen Khemakhem
  • 24. La classe Object Toutes les classes java héritent implicitement de la classe Object. La classe Object est l’ancêtre de toutes les classes Object toString() equals() … Personne nom cin lire() Etudiant moyenne reviser() Employe salaire travailler() Chercheur articles rechercher() Docteur travailALHopital:boolean traiterPatient() MedecinDeFamille faitVisites: boolean donnerConseil() Chirurgien faireUneIncision: boolean Humain Client ClientFidele 24 Mouna Torjmen Khemakhem
  • 25. La méthode equals • La méthode equals détermine si deux objets sont égaux ou non. • Son implémentation dans la classe Object vérifie que les références d’objets sont identiques. • On aura souvent besoin de redéfinir la méthode equals : deux objets seront égaux quand ils auront le même état.seront égaux quand ils auront le même état. public boolean equals(Object obj) { if(obj instanceof Personne){ Personne personne = (Personne) obj; if((nom.equals(personne.nom)) && (cin==personne.cin)) { return true; } return false; } Redéfinition de la méthode equals pour la classe Personne Deux personnes sont égaux s’ils ont le même cin et le même nom 25 Mouna Torjmen Khemakhem
  • 26. Polymorphisme • N’importe quel objet en Java qui peut passer d’une relation « est un » peut être considéré polymorphe. • Le polymorphisme est le fait de référencer• Le polymorphisme est le fait de référencer une classe fille avec un référence déclaré de type une classe mère. Animal Dog Animal myDog = new Dog(); Référence déclaré en tant qu’Animal(). Objet crée en tant que Dog(). 26 Mouna Torjmen Khemakhem
  • 27. Polymorphisme • Pourquoi? -Ecrire un code flexible. -Ecrire un code nettoyé :-Ecrire un code nettoyé : –plus efficace. –plus simple. -Facile à développer. -Facile à étendre. 27 Mouna Torjmen Khemakhem
  • 28. Tableau polymorphique Avec le polymorphisme : le type de la référence peut être la classe mère de l’objet instancié. Soit : Animal [ ] animals = new Animal [3]; AnimalSoit : Animal [ ] animals = new Animal [3]; Animal CatDog Wolf - Déclarer un tableau de type Animal. - Un tableau qui contiendra des objets de type Animal. 28 Mouna Torjmen Khemakhem
  • 29. Tableau polymorphique • On peut mettre n’importe quelle classe fille de la classe Animal() dans le tableau. animals animals [0] = new Dog(); animals [1] = new Cat(); animals [2] = new Wolf(); 29 Mouna Torjmen Khemakhem
  • 31. On va parcourir le tableau et appeler n’importe quelle méthode de manière concrète. Tableau polymorphique 31 Mouna Torjmen Khemakhem
  • 32. Argument polymorphique -Le paramètre Animal peut être n’importe quel animal. -Le vétérinaire donne une piqure à l’animal et lui demande de faire du bruit. N’importe quel animal dans le heap ayant la méthode makeNoise(), fera son bruit. La méthode giveShot() de Vet peut prendre n’importe quel Animal tant que l’objet passé en paramètre est une classe fille de Animal. (la méthode makeNoise() doit être implémentée dans les classes Cat et Dog). 32 Mouna Torjmen Khemakhem
  • 33. Surclassement et Substitution Animal public void eat(){ sout(’’je manges’’) Animal animal; Dog myDog = new Dog(); animal = myDog; animal Animal myDog Dog Dog public void watch(){ sout(’’je gardes’’) } WolfCat sout(’’je manges’’) } public void roam(){ sout(’’je voyages’’) } animal.eat() OK animal.roam() OK animal.watch() KO eat() roam() watch() myDog.eat() OK myDogl.roam() OK myDog.watch() OK 33 Mouna Torjmen Khemakhem
  • 34. Surclassement et Substitution On dit que : - l’objet Dog crée est « surclassé ». Il est vu de type Animal de la référence déclarée (animal). - Les fonctionnalités de Dog sont restreintes à celles de Animal. Le chien ne pourra pas Il faut donc substituer animal par : animal.eat() OK animal.roam() OK ((Dog) animal).watch() OK ((Dog) animal).watch(); - Les fonctionnalités de Dog sont restreintes à celles de Animal. Le chien ne pourra pas être un chien de garde (watch()). 34 Mouna Torjmen Khemakhem
  • 35. Lien dynamique Quelle est la méthode appelée ? Wolf w = new Wolf(); Animal makeNoise() eat() sleep() roam() w.makeNoise(); La méthode appelée est celle existante dans la classe du type le plus inférieur dans l’hiérarchie d’héritage gagne ! Canine roam() Wolf makeNoise() eat() w.roam(); w.makeNoise(); w.eat(); w.sleep(); La machine virtuelle JVM commence tout d’abord à voir dans la classe Wolf . Si elle ne trouve pas une correspondance de la version de la méthode, elle commence à grimper l’hiérarchie de l’héritage jusqu’à trouver la bonne méthode. 35 Mouna Torjmen Khemakhem
  • 36. Exemple class ObjetGraphique{ private int x, y ; void setXY (int x, int y){ this.x=x ; this.y=y ; } int getX(){return x ;} int getY(){return y ;}int getY(){return y ;} float surface (){return(0) ;} }// fin de la classe ObjetGraphique class Rectangle extends ObjetGraphique{ float largeur=3, longueur=5 ; void allongerRect(float lg) {longueur+=lg ;} float surface (){return(longueur*largeur) ;} }// fin de la classe Rectangle class Cercle extends ObjetGraphique{ float rayon=2 ; float surface (){ return (rayon*rayon*3.14f) ;} }// fin de la classe Cercle 36 Mouna Torjmen Khemakhem
  • 37. Exemple public class TestObjetGraphique{ public static void main(String[]args){ } 37 Mouna Torjmen Khemakhem
  • 38. Exemple class ObjetGraphique{ private int x, y ; ObjetGraphique(int x, int y){ this.x=x; this.y=y; } void affiche () {System.out.println(" affiche un objet graphique ");}} class Rectangle extends ObjetGraphique{ float largeur, longueur;float largeur, longueur; Rectangle(float la, float lo){ super(2,3); largeur=la; longueur=lo;} void affiche(){ super.affiche(); System.out.println(" affiche un rectangle ");}} class Essai{ public static void main(String [] args){ Rectangle r=new Rectangle(3,5); r.affiche(); } } 38 Mouna Torjmen Khemakhem
  • 39. Exemple ObjetGraphique d ; switch (c){//c est une variable introduite par le clavier case 'o' :d= new ObjetGraphique(); break ; case 'r' : d= new Rectangle(); break ;break ; case 'c' : d= new Cercle() ; break ; } float s=d.surface(); 39 Mouna Torjmen Khemakhem