Vous êtes sur la page 1sur 21

12/05/2023

POO en Java
Ch. VIII

Héritage & Polymorphisme

L'héritage
L'héritage est un mécanisme qui facilite la réutilisation
du code et la gestion de son évolution.

Il définit une relation entre deux classes :

1. une classe mère ou super-classe ou classe de base


2. une classe fille ou sous-classe ou classe dérivée qui
hérite de sa classe mère
Grâce à l'héritage, les objets d'une classe fille ont accès
aux données et aux méthodes de la classe parent et
peuvent les étendre.

1
12/05/2023

2
12/05/2023

L'héritage: extends
Mise en œuvre de l'héritage :

On utilise le mot clé extends pour indiquer qu'une classe


hérite d'une autre.

Exemple : class Fille extends Mere { ... }

Object est la classe mère de toutes les classes en Java.

Une classe qui n'hérite d'aucune autre classe, hérite


implicitement de Object.

3
12/05/2023

Faites attention à la notion d’ENCAPSULATION !!!

4
12/05/2023

Encapsulation des attributs


Package 1 Package 2

class A class C
public int x;
private int y;
int z;
protected w;
class B class D

Visibilité à Classe Package Classe fille Tout le


partir de: reste
A B C D
public (x)
private (y)
default (z)
protected (w)

5
12/05/2023

Encapsulation des méthodes


Package 1 Package 2

class A class C
public void meth1(){};
private void meth2(){};
void meth3(){};
protected void meth4(){};
class B class D

Visibilité à partir de: Classe Package Classe fille Tout le


reste
C D
A B
public (meth1)
private (meth2)
default (meth3)
protected (meth4)

Encapsulation des attributs


L’attribut private

Package 1 Package 2

class A class C
public int x;
private int y;
int z;
protected w;
class B class D

private int y La variable private n'est accessible que depuis l'intérieur même de la
classe.

public class A { class B { class C extends A { class D {


private int y; A a=new A(); A a=new A(); A a=new A();
A a=new A(); int t=a. y ; int t=a. y ; int t=a. y ;
int t=a. y ; … … …
… } } }
}

6
12/05/2023

L'héritage: super

Appel des méthodes héritées :

Pour invoquer une méthode d'une classe parent, il


suffit de la préfixer par super.

Pour appeler le constructeur de la classe parent il


suffit d'écrire super(paramètres) avec les
paramètres adéquats.

7
12/05/2023

ATTENTION
l'appel à super(…)
se fait en premier
avant l’initialisation
des attributs de
la classe fille.

L'héritage
Remarques :

1. Dans le constructeur de la classe fille, l'appel à


super(paramètres) se fait en premier avant l’initialisation
des attributs de la classe fille.

2. Il est possible d'affecter un objet de la classe Fille à un


objet de la classe Mère :

Exemple : ClasseMere objetFille=new ClasseFille()


Fruit clementine=new Orange()

8
12/05/2023

Solution(s) ???

9
12/05/2023

public class Personne { L'héritage: exemple


private String prenom;
private String nom;
public Personne(String nom,String prenom){
this.nom=nom; this.prenom=prenom;
}
public void afficher(){
System.out.println("Prenom= "+prenom+", Nom= "+nom);
}
}
public class Etudiant extends Personne{
private String cne;
public Etudiant (String nom, String prenom, String cne){
super(nom,prenom);
this.cne=cne;
}
public void afficherTout(){
super.afficher();
System.out.println("CNE= "+cne); public class Test{
} public static void main(String[] args) {
} Etudiant e=new Etudiant("Alami","Omar","2021801");
e.afficherTout();
Prenom= Omar, Nom= Alami }
CNE= 2021801 }

La Redéfinition: overrinding
Les sous-classes peuvent redéfinir les variables
et les méthodes héritées :
 Pour les variables : il suffit de les redéclarer
sous le même nom avec un type différent.

 Pour les méthodes : elle sont redéfinies avec


exactement la même signature des méthodes de
la classe mère, en la faisant précéder du mot clé:
@Override

10
12/05/2023

Understanding the problem without method overriding

Let's understand the problem that we may face in the program if we don't use
method overriding.

//Creating a parent class


class Vehicle{
void run(){System.out.println("Vehicle is running");}
}
//Creating a child class
class Bike extends Vehicle{
public static void main(String args[]){
//creating an instance of child class
Bike obj = new Bike();
//calling the method with child class instance
obj.run();
}
} Vehicle is running

Problem is that I have to provide a specific implementation of run() method in subclass


that is why we use method overriding.

11
12/05/2023

In this example, we have defined the run method in the subclass as defined in the
parent class but it has some specific implementation. The name and parameter of
the method are the same, and there is IS-A relationship between the classes, so
there is method overriding.

//Java Program to illustrate the use of Java Method Overriding


//Creating a parent class.
class Vehicle{
//defining a method
void run(){System.out.println("Vehicle is running");}
}
//Creating a child class
class Bike2 extends Vehicle{
//defining the same method as in the parent class
//@Override pas obligatoire
void run(){System.out.println("Bike is running safely");}

public static void main(String args[]){


Bike2 obj = new Bike2(); //creating object
obj.run();//calling method Bike is running safely
}
}

Exemple1:
Redéfinition Méthode

12
12/05/2023

La Redéfinition: Exemple 2
public class Employe { public Employe(int code, String nom) {

private int code; this.code = code;

private String nom; this.nom = nom;

public Employe() { }

this.code=0; public String getNom(){

this.nom = ""; return nom;

} }

public Employe(String nom) { public void afficher(){

this.code=0; System.out.println("Code= "+ this.code +", Nom= "+ this.nom );

this.nom = nom; }
} }

La Redéfinition: Exemple 2
public class Secretaire extends Employe{
private String code; //redéfinition de l’attribut code
public Secretaire(String code , String nom) {
super(nom);
this.code = code;
}
@Override
public void afficher(){
System.out.println("Code= "+this.code+", Nom ="+this.getNom());
}
}

13
12/05/2023

La Redéfinition: Exemple 2

public class Main {


public static void main(String[] args) {
Employe emp=new Employe("Akramine");
emp.afficher();
Secretaire sec=new Secretaire("2021-80A", "Samri");
sec.afficher();
}
} Code=0, Nom=Akramine

Code=2021-80A, Nom=Samri

Exemple 2: Redéfinition Méthode & Attribut

14
12/05/2023

La Redéfinition: remarques

 La redéfinition d'une méthode héritée doit


impérativement conserver la déclaration de la
méthode parent.

 Si la signature de la méthode change, ce n'est


plus une redéfinition mais une surcharge/surdéfinition (overloading).
Cette nouvelle méthode n'est pas héritée :
la classe mère ne possède pas de méthode
possédant cette signature.

15
12/05/2023

16
12/05/2023

Surcharge:Exemple

17
12/05/2023

18
12/05/2023

Le polymorphisme

Soit l’exemple suivant: class Test {


public static void main(String[] args) {
Humain h=new Humain();
class Humain{ Arabe a=new Arabe();
public void parler(){ //Humain h=new Arabe();
System.out.println("Je parle"); h=a; //Ecriture légale car Arabe
} h.parler(); //est une sous-classe
} } //de la classe Mère Humain
} //Quelle méthode parler()
class Arabe extends Humain{ //sera exécutée ??
@Override
public void parler(){ Réponse: la méthode parler() de
System.out.println("Je parle arabe"); la classe Arabe car la machine
} virtuelle détecte à l’exécution le
} Type de l’objet assigné à la variable
de la classe de base

Polymorphisme

19
12/05/2023

20
12/05/2023

21

Vous aimerez peut-être aussi