Académique Documents
Professionnel Documents
Culture Documents
l Objectifs
- Connaître les limites de la programmation modulaire
- Comprendre les avantages de la programmation orientée-objet
- Connaître les principes de la programmation orientée-objet :
l’encapsulation, l’héritage, le polymorphisme
- Connaître les caractéristiques de java concernant la programmation
orientée-objet
© Karim Bouzoubaa 1
Chapitre 6 : La programmation Orientée-Objet
l Sommaire
- Limites de la programmation modulaire
- Principes de la programmation orientée-objet
- Contrôle d’accès aux données
- Utilisation de la référence this
- Surcharge des constructeurs
- Premier principe de la POO : Encapsulation
- Composition de classes
- Données et méthodes statiques
- Ramasse miettes et la méthode finalize
- Deuxième principe de la POO : L’héritage
- Données avec modificateur d’accès protected
- Constructeurs dans les sous classes
- Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 2
6.1 Limites de la programmation modulaire
© Karim Bouzoubaa 3
6.1 Limites de la programmation modulaire
struct professeur {
char [50] nom ;
char [50] prenom ;
int nombreHeures ;
}
struct etudiant e1 ;
struct professeur p1 ;
© Karim Bouzoubaa 4
6.1 Limites de la programmation modulaire
© Karim Bouzoubaa 5
6.1 Limites de la programmation modulaire
© Karim Bouzoubaa 6
6.1 Limites de la programmation modulaire
© Karim Bouzoubaa 7
6.1 Limites de la programmation modulaire
© Karim Bouzoubaa 8
6.1 Limites de la programmation modulaire
l 5 ) Problème de redondance de traitement
- Structures Etudiant et Professeur partagent le nom et l’adresse
comme données communes
- Fonction d’ajout :
l Instructions relatives à ces deux données sont pareilles et sont répétées
- Même raisonnement pour les autres fonctions (modification,
suppression, etc.)
© Karim Bouzoubaa 10
6.2 Principes de la programmation orientée-objet
struct etudiant {
char [50] nom
char [50] prenom class Etudiant {
double note1 String nom
double note2 String prenom
double note1
}
struct professeur { double note2
char [50] nom
char [50] prenom ajouter()
int nombreHeures supprimer()
} modifier()
}
ajouter(struct etudiant)
…
ajouter(struct professeur) class professeur {
String nom
…
supprimer(struct etudiant) String prenom
… int nombreHeures
supprimer(struct professeur)
… ajouter()
supprimer()
modifier(struct etudiant)
… modifier()
modifier(struct professeur) }
…
main()
main()
© Karim Bouzoubaa 11
6.2 Programmation orientée-objet
© Karim Bouzoubaa 12
6.2 Programmation orientée-objet
© Karim Bouzoubaa 13
6.2 Programmation orientée-objet
© Karim Bouzoubaa 14
6.2 Programmation orientée-objet
© Karim Bouzoubaa 15
6.2 Programmation orientée-objet
© Karim Bouzoubaa 17
6.2 Programmation orientée-objet
8. String nomCompletEt, nomCompletPr;
9. int sal;
10. double moy;
12. Etudiant e1 ;
13. Professeur p1 ;
© Karim Bouzoubaa 18
6.2 Programmation orientée-objet
© Karim Bouzoubaa 19
6.2 Programmation orientée-objet
l Ajouter un étudiant à trouver de l’espace mémoire pour stocker toutes les données
d’un étudiant
l Mot clé new : chercher de l’espace mémoire
15. e1 = new Etudiant();
© Karim Bouzoubaa 21
6.2 Programmation orientée-objet
l Lignes 21 à 24
- créer en mémoire l’objet p1
- donner des valeurs à ses différentes données
© Karim Bouzoubaa 22
6.2 Programmation orientée-objet
l Ligne 26
- Appel de la méthode getNomComplet() de l’objet e1
- Résultat : Affectation "Merzaki Ali" à nomCompletEt
© Karim Bouzoubaa 23
6.2 Programmation orientée-objet
l Ligne 30
- Appel de la méthode getNomComplet() de p1
- Résultat : Affectation "Tachfine Hamid" à
nomCompletPr
© Karim Bouzoubaa 24
6.2 Programmation orientée-objet
l Autre Avantage de POO par rapport à la programmation
modulaire :
- Modulaire : structure de données & fonctions associées (pb
nomination, maintenance, etc.)
- POO : problème absent
l méthode définie à l’intérieur de la classe même
l mise à jour : le programmeur connaît l’endroit où la méthode est définie
l pas de problème de nomination car l’appel est précédé par l’objet qui
l’appelle (getNomComplet() par e1 et p1)
© Karim Bouzoubaa 25
6.2 Programmation orientée-objet
l Exécution du programme
- Trois classes dans trois fichiers différents : 1) Etudiant.java, 2) Professeur.java et
3) TestEtudiantProfesseur.java
- 3) utilise 1) et 2) à nécessité de compiler 1) et 2) avant 3)
© Karim Bouzoubaa 26
6.3 Contrôle d’accès aux données
public class Etudiant {
l Classe Etudiant
public String nom ;
- Données précédées par public public
public
String
double
prenom ;
note1 ;
public double note2 ;
- Modificateur d’accès : indique la manière
public String getNomComplet() {
avec laquelle il est possible d’accéder à return nom + " " + prenom;
une donnée/méthode/classe }
public double getMoyenne() {
return (note1 + note2)/2;
- Syntaxe générale : }
}
modificateur_d’acces type donnée/méthode/classe
}
}
© Karim Bouzoubaa 27
6.3 Contrôle d’accès aux données
l Instructions suivantes : public class Etudiant {
}
}
© Karim Bouzoubaa 28
6.3 Contrôle d’accès aux données
l Que faire pour permettre public class Etudiant {
private String nom ;
private String prenom ;
quand même de changer la private double note1 ;
private double note2 ;
valeur d’une donnée d’une public String getNom() { return nom ; }
donnée au sein de la }
public double getMoyenne() {
méthode }
return (note1 + note2)/2;
© Karim Bouzoubaa 29
6.3 Contrôle d’accès aux données
l Programme de test
public class TestEtudiant2 {
public static void main(String args[]) {
String nomCompletEt;
double moy;
Etudiant e1, e2 ;
e1 = new Etudiant();
e1.setNom("Merzaki");
e1.setPrenom("Ali");
e1.setNote1(12);
e1.setNote2(14);
e2 = new Etudiant ();
e2.setNom("Hamdane");
e2.setPrenom("Youssef");
e2.setNote1(-6);
e2.setNote2(24);
nomCompletEt = e1.getNomComplet();
moy = e1.getMoyenne();
System.out.println("La moyenne de l’étudiant "+ nomCompletEt +" est :« + moy);
System.out.println("La moyenne de l’étudiant " + e2.getNom() + " " + e2.getPrenom() + " est :" +
(e2.getNote1()+e2.getNote2())/2);
}
}
© Karim Bouzoubaa 30
6.4 Utilisation de la référence this
public class Etudiant {
private String nom ;
private String prenom ;
l Classe Etudiant : utilisation de nouvelles variables private double note1 ;
pour la nomination des paramètres des getters et private double note2 ;
…
setters (n, p, n1 et n2) public void setNote1(double n1)
{
if (n1<0 || n1>20)
l Lorsque la classe contient plus que ces quatre note1 = 0;
données à trouver d’autres appellations de }
else note1 = n1;
© Karim Bouzoubaa 31
6.5 Surcharge des constructeurs
l Rappel sur chapitre 5
- Surcharge des méthodes : déclarer plusieurs méthodes avec le même nom mais avec
des paramètres ou un type de retour différents
l Surcharge du constructeur
- constructeur par défaut : nom de la classe précédée du mot clé new sans paramètres
(nécessite un travail supplémentaire)
- La surcharge du constructeur
l redéfinir le constructeur afin d’attribuer aux données de la classe des valeurs par défaut
l redéfinir le constructeur avec les paramètres voulues
e1 = new Etudiant();
e2 = new Etudiant ("Hamdane", "Youssef", -6, 24 );
System.out.println(
"La moyenne de l’étudiant " + e1.getNomComplet() + " est :" + e1.getMoyenne() );
System.out.println(
"La moyenne de l’étudiant " + e2.getNomComplet() + " est :" + e2.getMoyenne() );
}
}
© Karim Bouzoubaa 33
6.6 Premier principe de la POO : Encapsulation
l Programmation modulaire
- Déclarer des données générales / un ensemble de fonctions destinées à les gérer de
manière séparée
Variable Objet
Variable
Donnée Donnée Donnée
Fonction
Fonction
Méthode Méthode
Variable
© Karim Bouzoubaa 34
6.6 Premier principe de la POO : Encapsulation
l En théorie : les données et les
traitements peuvent être aussi bien
publiques que privées
l Bonnes pratiques recommandent de :
public class C {
- mettre les données qui définissent une classe …
private double data ;
comme étant privées …
public void setData(double data)
- mettre des méthodes d’accès à ces données …
public double getData()
(getters et setters) comme étant publiques et …
private type methodeInterne(param)
de les implémenter de manière à assurer …
l’intégrité des données public type methodeExterne(param)
…
}
- mettre les méthodes qui ne vont servir qu’à
une gestion interne d’une classe donnée
comme étant privées
- mettre les méthodes qui sont appelées à être
utilisées par des programmes externes
comme étant publiques
© Karim Bouzoubaa 35
6.7 Composition de classes
l Une donnée d’une classe peut public class Date {
private int jour;
être private int mois ;
private int annee ;
- un type déjà connu en Java
public Date()
- un objet d’une autre classe
public Date(int jour, int mois, int annee)
l Exemple : date de naissance
d’un étudiant public void setJour(int jour) {
if (jour < 1 || jour > 31)
- Déclarer une nouvelle classe this.jour = 1;
else this.jour = jour;
nommée Date }
- Données : jour, mois et année public void setMois(int mois)
- Constructeur public void setAnnee(int annee)
- Accesseurs avec code qui public String toString()
assure l’intégrité des données return "[" + jour + "/" + mois + "/"
(jour dans [1, 31], etc.) + annee + "]";
}
© Karim Bouzoubaa 36
6.7 Composition de classes
l Etape 2 : Redéfinir la classe Etudiant
- Rajouter une date de naissance comme étant une donnée de type Date
© Karim Bouzoubaa 37
6.7 Composition de classes
l Etape 3 : classe de public class TestEtudiant4 {
etudiant date
mois
11
nom
Hamdane annee
Prenom 1980
Youssef
note1
12
note2
14
dateDeNaisssance
C98A
© Karim Bouzoubaa 38
6.7 Composition de classes
l Exécution
l Normalement, l’exécution serait "L’étudiant est 5BC8" (5BC8 adresse de l’objet
etudiant
l Cependant, fonctionnement de Java lors de la concaténation d’une chaîne avec
une autre variable non chaîne de caractères
- Appel de la méthode toString() du paramètre en question pour le transformer en une
chaîne de caractères (etudiant est remplacé par etudiant.toString())
- Par défaut, toString() retourne la valeur de son adresse en mémoire
- Sauf si redéfinit par le programmeur (cas des classes Etudiant et Date)
© Karim Bouzoubaa 39
6.8 Données et méthodes statiques
l Supposons : connaître à tout moment le nombre d’étudiants qui ont
été créés
l Rajouter dans la classe Etudiant une donnée appelé compteur
- initialisée à 0
- incrémentée de 1 à chaque nouvel appel au constructeur
© Karim Bouzoubaa 40
6.8 Données et méthodes statiques
l Programme de test : problème
public class TestEtudiant5 {
public static void main(String args[]) {
Etudiant e1, e2 ;
e2 nom
e1 nom
A49D Merzaki
4AC5 Tachfine
prenom prenom
Hamid Ali
note note
12 15
compteur compteur
1 1
© Karim Bouzoubaa 41
6.8 Données et méthodes statiques
l Pour pallier au problème :
- Solution : permettre à plusieurs objets de partager une même donnée
- Considérer cette donnée comme étant statique
- Donnée statique peut changer de valeur mais possède cette même valeur pour tous les
objets de la classe même
- Méthode peut également être statique (e.g. pour accéder à une donnée statique privée)
© Karim Bouzoubaa 42
6.8 Données et méthodes statiques
l Même programme de test : sauf Etudiant.getCompteur()
public class TestEtudiant6 {
public static void main(String args[]) {
Etudiant e1, e2 ;
e2 nom
e1 nom
A49D Merzaki
4AC5 Tachfine
prenom prenom
Hamid Ali
note note
12 2 15
compteur compteur
© Karim Bouzoubaa 43
6.9 Ramasse miettes et la méthode finalize
l Variable compteur statique: connaître le nombre d’étudiants à jour
- A chaque nouvel étudiant, le compteur est incrémenté de un
l Que se passerait-il si un étudiant est supprimé ?
- Aucune instruction pour décrémenter compteur de un
l Supprimer un étudiant : e1 = null ;
- Deux problèmes :
l Objet (Tachfine, Hamid, 12, 2) existe toujours en mémoire
l compteur = 2
e2 nom
e1 nom
A49D Merzaki
null Tachfine
prenom prenom
Hamid Ali
note note
12 2 15
compteur compteur
© Karim Bouzoubaa 44
6.9 Ramasse miettes et la méthode finalize
© Karim Bouzoubaa 45
6.9 Ramasse miettes et la méthode finalize
public class TestEtudiant7 {
public static void main(String args[]) {
Etudiant e1, e2 ;
System.out.println("Le nombre d’étudiants créé est" + Etudiant.getCompteur());
e1 = new Etudiant("Hamdane", "Youssef", 12);
System.out.println("Le nombre d’étudiants créé est" + e1.getCompteur());
e2 = new Etudiant("Marzaki", "Ali", 15);
System.out.println("Le nombre d’étudiants créé est" + e2.getCompteur());
e1 = null ;
System.gc() ;
}
}
e1 e2 nom
A49D Merzaki
null
prenom
Ali
note
2 15
compteur
© Karim Bouzoubaa 46
6.9 Ramasse miettes et la méthode finalize
l Solution Java : méthode finalize()
- s’exécute à chaque fois qu’un objet est sur le point d’être éliminé de la
mémoire
public class Etudiant {
private String nom ;
private String prenom ;
private double note ;
private static int compteur = 0 ;
© Karim Bouzoubaa 47
6.9 Ramasse miettes et la méthode finalize
public class TestEtudiant8 {
© Karim Bouzoubaa 48
6.10 Deuxième principe de la POO : L’héritage
l Principe d’héritage : faire hériter à une classe toutes les propriétés d’une autre
classe de laquelle elle hérite
- Rapidité de développement
- Réutilisation d’un code
l A cela peut s’ajouter d’autres classes telles que administrateurs, associés, etc.
© Karim Bouzoubaa 50
6.10 Deuxième principe de la POO : L’héritage
l Classe Etudiant hérite de la classe Personne
public class Etudiant extends Personne
public class Etudiant extends Personne {
private double note1 ;
l extends : private double note2 ;
- Etudiant possède note1, note2 mais également public void setNote1(double note1) {
les données nom et prenom if (note1<0 || note1>20)
this.note1 = 0;
- Etudiant possède les méthodes else this.note1 = note1;
}
l getNom() , getPrenom() public void setNote2(double note1) {
if (note2<0 || note2>20)
l setNom() , setPrenom()
this.note2 = 0;
l toString() else this.note2 = note2;
}
l super : public double getMoyenne() {
return (note1 + note2)/2;
- Méthode toString() définie dans les deux }
classes public String toString() {
return super.toString() + " "
l toString() : Etudiant + note1 + " " + note2;
}
l super.toString() : Person
}
© Karim Bouzoubaa 51
6.10 Deuxième principe de la POO : L’héritage
l Même chose pour la classe Professeur
© Karim Bouzoubaa 52
6.10 Deuxième principe de la POO : L’héritage
Personne
Etudiant Professeur
© Karim Bouzoubaa 53
6.10 Deuxième principe de la POO : L’héritage
l Autre hiérarchie plus élaborée
l Type d’héritage
- Héritage direct : une classe est une sous classe directe d’une autre sous classe
(Professeur et ProfesseurPermanent, Ressources et Personne)
- Héritage indirect : une classe hérite d’une autre classe à travers des classes
intermédiaires (Professeur et Ressources, Ressources et ProfesseurVacataire)
- Aucun lien d’héritage (RessourcesMaterielles et Professeur)
Ressources
RessourcesMaterielles Personne
Etudiant Professeur
ProfesseurVacataire ProfesseurPermanent
© Karim Bouzoubaa 54
6.10 Deuxième principe de la POO : L’héritage
l Java possède une hiérarchie des toutes les classes que ses développeurs ont
implémentée
l Classe mère est la classe nommée Object
l Lorsque nous définissons nos propres classes en Java avec des relations
d’hiérarchie entre elles, cette dernière est obligatoirement rattachée à la
hiérarchie initiale du langage Java
- Ceci est réalisé en rattachant la classe mère de la hiérarchie développée à l’une des
classes définies dans la hiérarchie du langage Java
- Si non spécifiée, par défaut la classe mère du programmeur devient une sous classe
de la classe Object
l En cas de besoin d’héritage multiple, Java utilise le concept d’Interface (ch 7)
© Karim Bouzoubaa 55
6.10 Deuxième principe de la POO : L’héritage
© Karim Bouzoubaa 56
6.10 Deuxième principe de la POO : L’héritage
public class TestEtudiantEtProfesseur2 {
© Karim Bouzoubaa 57
6.11 Données avec modificateur d’accès protected
© Karim Bouzoubaa 58
6.11 Données avec modificateur d’accès protected
public class Personne {
protected String nom ;
protected String prenom ;
© Karim Bouzoubaa 59
6.11 Les données avec modificateur d’accès protected
© Karim Bouzoubaa 60
6.12 Les constructeurs dans les sous classes
© Karim Bouzoubaa 61
6.12 Constructeurs dans les sous classes
l Constructeur dans Etudiant public Etudiant (String nom, String prenom,
int note1, int note2) {
super(nom, prenom) ;
l Appel au constructeur de la classe mère this.note1 = note1 ;
this.note2 = note2 ;
Personne }
© Karim Bouzoubaa 62
6.12 Constructeurs dans les sous classes
© Karim Bouzoubaa 63
6.13 Troisième principe de la POO : Le polymorphisme
l Principe du polymorphisme
- programmer dans le « général » plutôt que le « spécifique »
- consiste à programmer par utilisation d’objets qui partagent la même
superclasse dans une hiérarchie comme s’ils étaient tous des instances de
cette superclasse
- Capacité à ce qu’un type A apparaisse et soit utilisé comme un autre type B
l Utilisation primaire : des objets de divers types réagissent à un
appel de méthode du même nom mais avec un comportement
différent
© Karim Bouzoubaa 64
6.13 Troisième principe de la POO : Le polymorphisme
l Exemple plus réel de polymorphisme
- besoin du concept "Classe et méthode abstraites"
l Classe et méthode abstraites
- Classe abstraite : classe qui ne peut être instanciée (abstract)
- Objectif : fournir une superclasse (abstraite) à partir de laquelle des sous
classes peuvent hériter et par conséquent partager une conception commune
- Par exemple
l Classe Animal abstraite car il n’existe pas concrètement des instances de type
Animal
l Il existe plutôt des instances de sous classes de Animal telles que Chien et Chat
l Chien et Chat sont appelées des classes concrètes
© Karim Bouzoubaa 65
6.13 Troisième principe de la POO : Le polymorphisme
l Classe et méthode abstraites
- Classe abstraite contient une ou plusieurs méthodes abstraites
- Méthode abstraite ne fournit pas d’implémentation
- Toute classe qui contient au moins une méthode abstraite doit être déclarée également
abstraite
© Karim Bouzoubaa 66
6.13 Troisième principe de la POO : Le polymorphisme
l Exemple de polymorphisme
- Fonctionnalités du programme de gestion d’un établissement d’enseignement :
l payer toutes les personnes qu’elle emploie à la fin du mois
- Personnes de l’établissement : employés, professeurs et étudiants
- Employés : salaire fixe
- Étudiants : nombre d’heures travaillées * taux horaire
- Professeur
l permanent : salaire fixe
l vacataire : nombre d’heures enseignées * taux horaire
Ressources
RessourcesMaterielles Personne
ProfesseurVacataire ProfesseurPermanent
© Karim Bouzoubaa 67
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 68
6.13 Troisième principe de la POO : Le polymorphisme
public class Etudiant extends Personne {
private double note1 ;
private double note2 ;
private static final double TAUX_HORAIRE = 50 ;
l Classe Etudiant private double nombreHeures ;
© Karim Bouzoubaa 69
6.13 Troisième principe de la POO : Le polymorphisme
- poste et salaire d’un employé public Employe (String nom, String prenom,
double salaire, String poste) {
super(nom, prenom) ;
- constructeur this.salaire = salaire ;
this.poste = poste;
- setters et getters pour le salaire et le }
public double getSalaire () { return salaire ; }
poste public void setSalaire (double salaire) {
if (salaire <0)
- toString() redéfinie pour afficher, en this.salaire = 0 ;
else this.salaire = salaire ;
plus du nom et prénom par héritage, }
les informations concernant l’employé public String getPoste () { return poste ; }
© Karim Bouzoubaa 70
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 71
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 72
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 73
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 74
6.13 Troisième principe de la POO : Le polymorphisme
l Création d’un objet de chaque type des quatre classes concrètes
Etudiant, Employe, ProfesseurPermanent et ProfesseurVacataire
© Karim Bouzoubaa 75
6.13 Troisième principe de la POO : Le polymorphisme
© Karim Bouzoubaa 76
6.13 Troisième principe de la POO : Le polymorphisme
l Dans cette boucle, grâce au polymorphisme
- Développeur n’a pas à se soucier du spécifique (connaître à chaque fois le type d’objet)
mais programme dans le général
- 4 objets Etudiant, Employe, ProfesseurPermanent et ProfesseurVacataire partagent la
même superclasse Personne et nous les avons traité dans la boucle comme étant des
instances de cette superclasse
- 4 objets ont réagi tous aux appels des méthodes toString() et calculSalaire() chacun
avec un comportement différent
!
© Karim Bouzoubaa 77