Cours Orienté Obj175
Cours Orienté Obj175
Cours Orienté Obj175
Dr Latifa DEKHICI
Maitre de conférences
1
USTO-MB, DEKHICI L. POO
Sommaire :
Page
Chapitre1. Paradigme orienté objet. 3
Chapitre 2. Bases en java 7
Chapitre 3. Classes et objets. 18
Chapitre 4. Relations entre Classe (dépendance, agrégation et composition) 29
Chapitre 5. Héritage et polymorphisme 46
Chapitre 6.Compléments en POO : Interfaces, généricité… 54
Références 62
2
Chapitre
1
Paradigme Orienté Objet
1. Introduction
La Programmation orientée objet (POO) est une philosophie de programmation basée sur des concepts
issus du monde réel. C’est ce que nous allons expliquer dans ce chapitre.
La Programmation orientée objet (POO) est une manière de résoudre un problème. C’est un paradigme,
modèle 2. L’orienté
de référence, une objet : Philosophie
façon d’aborder un problème, une manière de penser et une concrétisation
d’une philosophie de programmation.
3.
Paradigmes de programmation
a) Programmation impérative (procédurale) : Dans la programmation procédurale un programme
= algorithme + structure de données. Ses langages dédiés sont Pascal, C,…
b) Programmation fonctionnelle : Elle adopte une approche de la programmation beaucoup plus
mathématique. Ses langages dédiés sont : Lisp, Matlab, Camel…
c) Programmation logique : Dans la programmation logique, la description d’un programme est sous
forme de prédicats. Exemple de langage: Prolog.
d) Programmation Orientée Objet : Ses langages dédiés sont : java, Small talk…
4.
Comparaison entre procédurale et POO
Jusqu’ici comment avons-nous l’habitude de programmer? Et Quelle est la structure de nos codes?
3
USTO-MB, DEKHICI L. POO
Séparer les données des traitements. Manipuler un ensemble d’objets qui interagissent
Subdivision basée sur les traitements. entre eux.
Subdivision basée sur les données.
En Informatique, un objet n’est ni une simple variable ni une simple fonction mais un mélange des deux.
Il maintient son état (paramètres, caractéristique) dans des variables appelées attributs. On implémente son
comportement à l'aide de fonctions appelées méthodes. Donc :
Objet=Un
Le type d’un ensemble d’objets qui se ressemblent état
mais qui +Un
n’ont pas les mêmes valeurs est appelé Classe :
Classe=suivantes
On peut considérer par exemple les classes attributs
: + méthodes.
a) Bicyclette :
Ses caractéristiques ou son état dépend de : Marque, type, nombre de vitesses, vitesse courante,
couleur,…etc.
Alors que son comportement est de : rouler, tourner, accélérer, changer de vitesse, freiner,…
Les objets peuvent être maBicyclette , taBicyclette et touteBicyclette avec des valeurs d’états différentes.
b) Personnage dans un jeu de combat :
4
USTO-MB, DEKHICI L. POO
Il a (état) : un nom, une force, une localisation, une certaine expérience et enfin des dégâts…etc. Il peut
(comportement) : frapper un autre personnage ; gagner de l'expérience ; se déplacer..etc. Lors d’une session
de jeu, on peut créer plusieurs instances (personnages) différents du même type, chacun est appelé objet.
c) Un rectangle :
Un rectangle est caractérisé par ses attributs : longueur, largeur, couleur..etc. Son comportement est
déclenché par des méthodes telles que : Dessiner, Calculer son périmètre, Calculer sa surface..etc.
a) Visibilité publique : La première, public, est la plus simple. Si un attribut ou une méthode est
publique, alors on pourra y avoir accès depuis n'importe où, depuis l'intérieur de l'objet (dans les méthodes
qu'on a créées), comme depuis l'extérieur. Quand on crée un objet, c'est principalement pour pouvoir
exploiter ses attributs et méthodes. L'extérieur de l'objet, c'est tout le code qui n'est pas dans sa classe.
En effet, quand on crée un objet, cet objet sera représenté par une variable, et c'est à partir d'elle qu'on
pourra modifier l'objet, appeler des méthodes, etc.
b) visibilité privée : La seconde, private, impose quelques restrictions. On n'aura accès aux attributs
et méthodes seulement depuis l'intérieur de la classe, c'est-à-dire que seul le code voulant accéder à un
attribut privé ou une méthode privée écrit(e) à l'intérieur de la classe fonctionnera.
Ainsi, il est important d'interdire à l'utilisateur de modifier directement les attributs d'un objet ou les
détails des méthodes.
Remarque :
5
USTO-MB, DEKHICI L. POO
L’encapsulation existe dans d’autre domaine tel que les réseaux sociaux où la visibilité d’une publication ou du
profil entier peut être privée, destiné aux amis uniquement, aux amis et leurs amis ou publique. Aussi on peut
dire que l’encapsulation est comme une boite noire du code.
6
Chapitre
2
Langage Java : Les bases
1. Introduction
Comme je programmais en C et bien avant j’utilisais Pascal, je me demandais comment la majorité des
développeurs préfèrent java et je croyais que ça faisait partie d’une vague de mode en informatique. Peu à
peu et en touchant java, j’ai pu comprendre d’où vient le succès de ce langage relativement récent. Java
est un langage facile à apprendre et dont l’utilisation est amusante même quand il s’agit d’un simple TP en
Licence. La programmation en orienté objet est implicite puisque tout est classe et objet. Et surtout en
java, contrairement au langage c, on ne se soucie pas de pointeurs ou de références. Tout au long de ce
support de cours, nous utilisons java pour la programmation orienté objet.
2. Historique de JAVA
Java est un langage de programmation orientée objet créé par James Gosling et Patrick Naughton,
employés de Sun Microsystems, avec le soutien de Bill Joy , présenté officiellement en 1995 .La société Sun
a été ensuite rachetée en 2009 par la société Oracle qui détient et maintient désormais Java. Java
n'est pas un acronyme mais en argot américain signifie café qui est la boisson favorite de nombreux
programmeurs.
La particularité et l'objectif central de Java est que les logiciels écrits dans ce langage doivent être très
facilement portables sur plusieurs systèmes d’exploitation mobiles ou non, avec peu ou pas de modifications.
7
USTO-MB, DEKHICI L. POO
8
USTO-MB, DEKHICI PO
9
USTO-MB, DEKHICI PO
4. Programmation Java
4.1 . L’essentiel
Tous les programmes Java sont composés d'au moins une classe. Exemple :
public class Essentiel { }
int (4 octets) int tempSoleil= 15600000 ; //La température est exprimée en kelvins
1
USTO-MB, DEKHICI PO
Pour faciliter la réutilisation, il y a une convention de nommage. En fait, c'est une façon d'appeler les classe
si le nom d'une variable est composé de plusieurs mots, le premier commence par une minuscule, le ou les
1
USTO-MB, DEKHICI L. POO
le cast.
La conversion est d’écrire le nouveau type entre parenthèse avant la variable à caster. Il est parfois impossible
de faire la conversion entre certains types complexe (à voir en chapitre héritage).
a) De double à int
double nbre1 = 10, nbre2 = 3;
int resultat = nbre1 / nbre2;//impossible
int resultat = (int)(nbre1 / nbre2);//affiche 3
System.out.println("Le résultat est = " + résultat);//pour afficher
Sachez aussi qu’on peut tout à fait mettre des opérations dans un affichage :
System.out.print("Résultat = " + nbre1/nbre2); //affiche 3
b) D'un type int en type float :
int i = 2;
float t= (float)i; // =2.0f , important pour le considérer float
c) D'un type int en double :
int i = 123;
double z = (double)i; // vaut 123.0
d) Et inversement :
Le cast d’un réel n’arrondit pas le nombre.
double x = 1.23; double y = 2.9999999;
int k = (int)x; //k vaut 1
k = (int)y; //k vaut 2
e) Priorité d'opération
Si on déclare deux entiers et qu’on mette le résultat dans un double, l’opérateur s’applique sur ces entiers
avant d’être affecté
int nbre1 = 3, nbre2 = 2; double resultat1 = nbre1 / nbre2;
1
USTO-MB, DEKHICI L. POO
résultat1 est 1 au lieu de 1,5 car la division est entière selon les opérandes.
Prêt
pour voler
1
USTO-MB, DEKHICI L. POO
4.7 . Tableaux
4.7.1. Tableau à une dimension
La syntaxe de déclaration est la suivante : <type du tableau><nom du tableau> [] = {<contenu du tableau>};
Exemple :
int tableauEntier[] = {0,1,2,3,4,5,6,7,8,9};
double tableauDouble[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
char tableauCaractere[] = {TaT,TbT,TcT,TdT,TeT,TfT,TgT};
1
USTO-MB, DEKHICI L. POO
La méthode equals() permet de vérifier (donc de tester) si deux chaînes de caractères sont identiques.
C'est avec cette fonction que nous effectuerons les tests de condition sur les String. Exemple:
String str1 = new String("oran"), str2 = new String("wahran"); str3 = "ORAN";
if (str1.equals(str2))
System.out.println("Les deux chaînes sont identiques !");
else
System.out.println("Les deux chaînes sont différentes !");
Le programme affichera Les deux chaînes sont différentes.
if (str1.equals(str3))
System.out.println("villes identiques!");
else
1
USTO-MB, DEKHICI PO
System.out.println("villes différentes !");
Le programme affichera villes différentes car la méthode est sensible aux majuscules.
Le caractère à une position est par charAt et la sous chaine et avec subString.La première position est
0
String nbre = "1234567";
char carac = nbre.charAt(4); //Renverra ici ‘5’
nbr.subString(0,3) ; // sous chaine
A titre d’exemple, on peut citer la fonction aléatoire random qui diffère légèrement de celle du C++, la
fonction absolue et exponentielle. Math est une classe à importer.
double X = Math.random();// un nombre aléatoire entre 0 et 1
double abs = Math.abs(-120.25);//La fonction valeur absolue
double d = 2; double exp= Math.pow(d, 3);//La fonction puissance d3
Ces fonctions sont dites statiques c’est-à-dire ne dépendent pas d’une instance de la classe Math mais
appartiennent à la classe. (à voir la notion de statique dans un prochain chapitre).
Exercices du chapitre 2
Exercice 1 :
JRE
JDK
1
USTO-MB, DEKHICI PO
Corrections :
Exercice 1
Exercice2 :
//1)
import java.util.Scanner ;
public class Exercice2{
public static void main (String[] args)
{Scanner lu=new Scanner(System.in) ;
String ch1=lu.nextLine( ) ;
String ch2=lu.nexLine( ) ;
System.out.println(ch1+ch2) ;
//2)
int x=lu.nexInt( ) ;
int y=lu.nextInt( ) ;
System.out.println(x*y) ;
//3) System.out.println(x
%y) ;
//4)
double note1=lu.nextDouble( ) ;
double note2=lu.nextDouble( ) ;
double moyenne=(note1+note2)/2 ;
if (moyenne>=10) System.out.println(« admis ») ;
else System.out.println(« ajourné ») ;
for(int i=1 ;i<10 ;++i)
if (i!=5) System.out.println( 1/(double)(i-5)) ;//cast
obligatoire
}}
1
USTO-MB, DEKHICI PO
Chapitre
3
Classes et Objets
1. Introduction
Maintenant que nous avons compris comment écrire un programme simple de calcul, de lecture et
d’affichage en java avec une seule classe, nous passerons dans ce chapitre à l’utilisation de plusieurs
classes dont une est principale pour l’interaction avec l’utilisateur.
2. Notions de classes
2.1 . Définiton
Une classe est un type, modèle. Elle existe en fichier *.Java (code source) en mode de développement et
en fichier *.Class lors de l’utilisation. Le nom de la classe est le même que le nom du fichier.
Exemple : si le nom du fichier est Velo.java , la classe serait : public class Velo{}
1
USTO-MB, DEKHICI PO
c Méthodes : peuvent être des fonctions retournant une valeur ou des procédures , on met alors
void au début. Elles peuvent dépendre de l’objet ou non, on dit alors qu’elles sont statiques
(voir paragraphes suivants)
long immatriculation ;
float positionX,vitesseActuelle ;
on peut regrouper dans la même déclaration, les attributs de même type et modificateur (mot réservé de
la visibilité, complétude…).
3. Visibilité
1
USTO-MB, DEKHICI PO
Le principe d’encapsulation (vu en chapitre 1) en java engendre trois niveaux de visibilités publiques,
privées ou protégées qui sont respectivement définies dans la classe au moyen des mots-clés public,
private et protected.
3.1 .public
Le mot-clé public indique que les propriétés et méthodes d'un objet seront accessibles depuis
n'importe où dans le programme principal. Signe en UML peut être :+. Voir figure précédente.
3.2 . private
Le mot-clé private (Signe en UML peut être : - , Voir figure précédente.) permet de déclarer des
attributs et des méthodes qui ne seront visibles et accessibles directement que depuis l'intérieur même de
la classe. C'est à dire qu'il devient impossible de lire ou d'écrire la valeur d'un attribut privé
directement.
v1.vitesseActuelle=60 ;
On ne peut pas modifier l’attribut privé. On ne peut pas connaitre la valeur de l’attribut privé.
System.out.println(v1.vitesseActuelle) ;
On peut par contre accéder aux propriétés privées via des méthodes (fonctions) dites ACCESSESSEURS
(voir section suivante sur les méthodes)
3.3 protected
Le mot-clé protected ou protégé (Signe en UML peut être Package : pour simplifier n’est
: # ) (à voir en chapitre 5 qui concerne l’héritage). que le dossier contenant une
ou plusieurs classes
Publique O O O O
protégé O O O N
Sans O O N N
Privé O N N N
2
USTO-MB, DEKHICI PO
Voici ci-dessous à quoi ressemble une classe avec modificateurs Un programme en java peut
contenir plusieurs classes
public class Velo { principales c-à-d contenant
la fonction main. Au moment
private long immatriculation; de l’exécution, on peut
choisir une de ces classes
private float positionX, vitesseActuelle pour le lancer.
4. Notion d’objet
Il reste beaucoup de notions à détailler concernant les classes. Mais ces détails ne peuvent pas être expliqués
sans connaitre les objets.
Un objet est une instance d'une classe. Pour chaque instance d'une classe, le code est le même, seules les
données des attributs (propriétés) changent.
Il est préférable de déclarer (plus utile) les objets dans une autre classe telle qu’une classe principale ou
dans une classe générant des instances (par exemple veloFactory pour Velo). Ici, on déclare des vélos
V1,V2 dans la classe principale
Exemple :
Velo v1, v2 ; }}
5. Méthodes de classes
5.1 Définition
Une méthode est un regroupement d’instructions semblable aux fonctions et procédures sauf qu’elle
s’exécute toujours sur un objet précis. Seules les méthodes de la classe ont droit à l’accès aux attributs (privés)
de cette classe.
2
USTO-MB, DEKHICI PO
Elles sont aussi appelées fonctions par abus de langage (on utilise x.f au lieu de f(x) si x est l’objet dont
dépend la méthode f). Une méthode peut être :
publique: accessible en dehors de la classe (les autres objets) c.à.d. visible dans l’interface.
privée: nécessaire à l’implémentation interne de la classe mais n’est pas visible dans l’interface.
Une méthode peut retourner quelque chose (fonction) ou ne rien retourner (void
procédure).
Elle peut recevoir un ou plusieurs arguments entre parenthèses, qu’elle utilisera en cours de son exécution.
Exemple : dans notre classe Vélo , on peut avoir une méthode avancer dont voici le code :
Velo v1,v2 ;
Non car on ne sait pas quel objet est à avancer .On doit alors plutôt écrire, si v1 est un vélo :
v1.avancer(30);
Le nom de la méthode et
La liste des types de ses
2
USTO-MB, DEKHICI PO
2
USTO-MB, DEKHICI PO
Pour invoquer une méthode, il faut toujours respecter sa signature.
Exemple les trois méthodes suivantes sont différentes même si elles ont le même nom:
Aussi :
int aleatoire(int x)
Exemple :
v1.immatriculation= 123;
On peut alors déclarer dans Velo, 2 méthodes un setter setImmatriculation pour pouvoir modifier le numero
et un getter getImatriculation pour avoir sa valeur :
{immatriculation= nouvelleImmatriculation ;}
{return immatriculation ;}
On procède pareil pour les autres attributs privés si on veut mais pas forcément.
v1.setImmatriculation(123);
System.out.print(v1.getImmatriculation());
On peut ne pas coder de setPositionX pour obliger le passage via la méthode avancer(float durée) selon la
vitesse et la durée. On peut ne pas mettre de setter pour un attribut dont la modification est interdite
exemple prénom dans la classe Personne.
En IDE comme NetBeans , on peut insérer via un menu tous les accesseurs.
2
USTO-MB, DEKHICI PO
5.5 Constructeur
Un constructeur est une méthode particulière dont le rôle est de créer un nouvel objet.
Les constructeurs ont principalement trois tâches :
{immatriculation=immatriculationP ;
vitesseActuelle=vitesseActuelleP;
positionX=positionXP;
On peut augmenter le nombre d’arguments dans un autre constructeur dans la même classe en
ajoutant le propriétaire :
{immatriculation=immatriculationP;
vitesseActuelle=vitesseActuelleP;
positionX=positionXP;
proprietaire=pro ;
b) Notion de this
Pour pouvoir utiliser le même identificateur de paramètre que l’attribut, on utilise le mot réservé this
qui signifie ceci ou l’objet qui l’utilise :
{this.immatriculation= immatriculation ;
2
USTO-MB, DEKHICI PO
vitesseActuelle= vitesseActuelleP;
this.positionX= positionX;
proprietaire=pro ;
Le mot this peut être utilisé pour appeler un premier constructeur (par exemple this()) dans un autre
constructeur d’une différente signature.
public Velo()
vitesseActuelle=1.0f ;
positionX=0.0f;
La définition d’un constructeur n'est pas obligatoire (si on ne souhaite pas initialiser les données membres
par exemple) dans la mesure où un constructeur par défaut (appelé parfois constructeur sans argument) est
défini par le compilateur Java si la classe n'en possède pas.
5.6 Destructeur
Le destructeur est aussi une méthode spéciale de la classe mais qui est exécutée à la « mort » de l’objet.
Si aucun destructeur n’est défini, c’est le destructeur par défaut qui est exécuté.
2
USTO-MB, DEKHICI PO
Personne p1= new Personne(1,“Isam”);// supposant que Personne
possède un tel constructeur
v1.avancer(150.0);
System.out.print(v1.getPositonX( ));
}}
Une classe peut aussi avoir un modificateur. Une classe ne peut être privée que si sa déclaration est
imbriquée dans une autre.
Modificateur Rôle
abstract la classe contient une ou des méthodes abstraites, qui n'ont pas de
définition explicite. Une classe déclarée abstract ne peut pas être
instanciée : il faut définir une classe qui hérite de cette classe et qui
implémente les méthodes nécessaires pour ne plus être abstraite.
final la classe ne peut pas être modifiée, sa redéfinition grâce à l'héritage est
interdite. Les classes déclarées finales ne peuvent donc pas avoir de classes
filles.
private la classe n'est accessible qu'à partir du fichier où elle est définie
public La classe est accessible partout
Les modificateurs abstract et final ainsi que public et private sont mutuellement exclusifs.
Marquer une classe comme final peut permettre au compilateur et à la machine virtuelle de réaliser
quelques petites optimisations.
2
USTO-MB, DEKHICI PO
Exercices du chapitre 3
{ c.vitesse += 30; }
Exercice 2
1. Schématiser en diagramme de classe un livre connu par sa côte, son titre, l’année d’edition, le
nom de son auteur, nbrCopiesDisponibles ;
2. coder la classe
3. Definir le constructeur et les getters de tous les attributs et la méthode afficher()
4. Définir des setters du titre et de l’année d’édition.
5. Définir une méthode qui vérifie si deux livre sont du même auteur.
6. Définir deux méthodes emprunter() et rendre().
7. Instancier dans une classe principale deux livres en utilisant Scanner et tester les méthodes.
Exercice3
2
USTO-MB, DEKHICI PO
Correction :
Exo 1 :
Speed=160
Exo 3 :
2
USTO-MB, DEKHICI P
Chapitre
4
Relation entre Classes
1. Introduction
Jusqu’ici nous avons appris à implémenter une classe qui représente un concept et une classe principale
qui sert à l’exploiter et à l’interaction avec l’utilisateur. Mais peut-on créer plusieurs classes et les utiliser
dans une ou plusieurs classes principales et quel serait l’intérêt ?
Une association (relation) exprime une connexion sémantique entre deux classes. Elle décrit une sémantique
commune ayant un effet structurel.
L’association
L’agrégation
La composition simple ou multiple
L’héritage (non multiple en java)
Exemple
Soit une classe permettant de représenter un Cercle sur un plan. Il est défini par son centre
(chapitre3.exercice2.Point) et son rayon qui est réel. La classe possède les méthodes pour calculer sa
surface et son périmètre.
3
USTO-MB, DEKHICI P O
On peut importer la classe du package chapitre3.exercice2. au début du fichier Cercle en utilisant
l’instruction :
import chapitre3.exercice2.Point ;
import java.lang.Math ;
public class Cercle{
{return Math.pow(rayon,2)*Math.PI ;}
{return 2*rayon*Math.PI ;}
3
USTO-MB, DEKHICI PO
Essayons
Inutile de ramener un nouveau point de l’extérieur avec setter et écraser le centre actuel
centre=new Point(x,y,.....);
This.rayon=rayon ;
Dans une classe principale l’instanciation d’un cercle c1 et le test des méthodes :
3
USTO-MB, DEKHICI P O
{ centre=p;
This.rayon=rayon ; }
Il sera obligatoire d’avoir une création préalable d’un point p1 dans le programme principal avant de le
considérer comme centre :
3
USTO-MB, DEKHICI PO
Exempl
this.nom = nom;
return marie;
...
4. Agrégation et composition
4.1. Agrégation
L’agrégation exprime une association avec relation de subordination. Elle est représentée par un
trait reliant les deux classes et dont l’origine (classe contenante) se distingue par un losange de l’autre
extrémité (classe subordonnée). Une des classes "regroupe" d’autres classes. On peut dire que l’objet
T utilise des instances de la classe T’.
3
USTO-MB, DEKHICI P O
Exempl
L’énumération en java
est un fichier regroupant
des constantes.
4.2. Composition
La composition est une variante plus forte de l’agrégation. En général, le cycle de vie des deux classes en
relation est dépendant. Si la classe contenante est détruite, la classe subordonnée est détruite. Elle est
représentée par un trait reliant les deux classes et dont l’origine (classe contenante) se distingue par un losange
noir de l’autre extrémité (classe subordonnée).
Exemple : Soit le diagramme suivant. Une salle est composée de plusieurs décors Fixes et chaque objet de
décoration appartient à une salle. Si la salle est détruite , les décors fixés seront détruit.
3
USTO-MB, DEKHICI PO
private Vector<Fourniture>listeFournitures;
3
USTO-MB, DEKHICI P O
Dans le constructeur chaque liste de type Vector doit être initialisée à un vector vide new
Vector<TYPE>(nbrElement) d’une longueur connue(la mettre comme argument de Vector) ou pas. Par
exemple ci-dessous un constructeur avec un numéro comme paramètre :
this.numero=numero ;
superficie=9.0 ;nbrPortes=1 ;
c) Ajout de contenant
Pour remplir une salle par des fournitures, il suffit de ramener de l’extérieur un agrégat existant et l’ajouter
à sa liste en utilisant la méthode add.
Pour remplir une salle par un decorFixe, il faut ramener les paramètres nécessaires de l’extérieur, créer
localement le composant decorFixe dans salle et l’ajouter à la liste.
this.sesDecorFixes.add(d);
3
USTO-MB, DEKHICI PO
public Vector<DecorFixe>getSesDecorFixes(){
return sesDecorFixes;
{system.out.println(this.sesDecorsFixes.get(i).afficher() ;}
{ listeFournitures.get(i).afficher() ;}
{ d.afficher() ;}
salleConference.setNbrPortes(2);
3
USTO-MB, DEKHICI L. PO O
salleConference.ajouterFourniture(chaiseCONFOJAVA);
salleConference. ajouterDecorFixes(cadre,30,matiere.METAL,
Position.MUR ) ;
salleConference.afficher();
Exemple :
//composition
this.moteur = moteur;
this.roues = roues;
this.caisse = caisse;
this.habitacle = habitacle;
3
USTO-MB, DEKHICI L. PO
...
Exercice1 : Soit le diagramme suivant. Un Médecins soigne plusieurs Patient et chaque patient
Exercices
peut du chapitre
être chez plusieurs 4 On suppose que Medecin et Maladie sont déjà programmées.
medecins.
Donc on s’intéresse seulement à Patient ainsi que ses médecins et à une classe principale.
1. Ecrire les instructions qui permettent de déclarer la classe Patient et tous ses Attributs
6. Ecrire les getter et setter de tous les attributs de Patient et le constructeur de Médecin
7. Dans une procédure main de la classe principale , lire 2 variables ceNom, cetAge.
9. Ecrire les instructions qui ajoutent à p1 un médecin avec les propriétés (« dr Doctor », 35).
Exercice 2.Une compagnie aérienne (ex : air Algérie) offre plusieurs vols. Le vol part d’un
aéroport(exemple : Ahmed Ben Bella) d’une ville(ex :Oran) vers un autre aéroport (exemple:
Mohamed Boudiaf ) d’une ville (ex :Constantine) et peut faire escale dans un ou plusieurs
aéroports (ex :Houari Boumediene d’Alger)pour une certaine durée. Plusieurs réservations
(confirmées ou pas) peuvent se faire sur un vol. Le diagramme de classes ci-dessous montre les
relations entre les classes.
3
USTO-MB, DEKHICI P O
2. Codez en java ces classes et Testez en une classe principale des exemples d’instances.
Exercice 3:
Une salle de cinéma ayant un nom (ex : cinémathèque Larbi Ben Mhidi), se situant dans une ville
est composée de plusieurs salles ayant des codes(ex :MIRA 03). Une projection dans le calendrier
est programmée dans une salle de cinéma et concerne un film (titre, durée, genre) (ex :Essaha, 1h
,Comédie musicale).
1. Ajoutez au diagramme les attributs, les méthodes nécessaires (au cinéma projeter(….)…) et de
base (afficher….).
4
USTO-MB, DEKHICI PO
Correction :
Exercice 1 :
1. Ecrire les instructions qui permettent de déclarer la classe Patient et tous ses Attributs y compris
le(s) medecin(s).
{age= nouvelAge ;}
{m.afficher();}
{sesMedecins.add(m) ;}
6. Ecrire les getter et setter de tous les attributs de Patient et le constructeur de Médecin
4
USTO-MB, DEKHICI P O
7. Ecrire dans une procédure main de la classe principale , les instructions qui permettent de définir
un scanner et de lire 2 variables ceNom, cetAge.
8. Ecrire l’instruction qui crée une nouveau Patient p1 avec les 2 variables précédentes. et la maladie
DIABETE.
9. Ecrire les instructions qui ajoute à p1 un médecin avec les propriétés (« dr Doctor », 35).
p1.ajouterMedecin(m1);
p1.afficher() ;
Exercice 2 :
import java.sql.Time; import java.util.Date; import java.util.Vector;
/**
*
* @author Dekhici
*/
public class Vol {
private Date dateDepart,dateArrivee; private Time heureDepart,heureArrivee;
private Aeroport aeroportDepart,AeroportArrivee; private EtatVol etatVol;
private Vector<Escale>listeEscales;
private Vector<Reservation>listeReservations; private Compagnie compagnie;
public Vol(Compagnie c,Date dateDepart,Date dateArrivee,Time heureDepart,Time heureArrivee,Aero
{this.compagnie=c; // this est facultative ici this.dateArrivee=dateArrivee;
this.dateDepart=dateDepart; this.heureArrivee=heureArrivee; this.heureDepart=heureDepart; this.
listeEscales =new Vector<Escale>(); listeReservations=new Vector<Reservation>();
etatVol=EtatVol.AHEURE;//constante AHEURE de lTensemble <enum>
4
USTO-MB, DEKHICI PO
}
public void ajouterEscale(Aeroport aeroport,int duree ,Time
heureDepart,Time heureArrivee)
{ Escale e=new
Escale(aeroport,duree,heureDepart,heureArrivee);
listeEscales.add(e);
}
//getter et
Setter public void
afficher()
{ System.out.println("
"+this.aeroportDepart.getNom()+ " "+this.dateDepart+
" "+this.heureDepart+
" "+this.AeroportArrivee.getNom()+
// ajouter les autres champs
" "+this.etatVol.toString()//print peut imprimer lTobjet
sans toString
);
for (Escale e:this.listeEscales)
{ e.afficher();
}
for (Reservation r:this.listeReservations)
{ r.afficher();
}
}
void reserver(int i) {
{Reservation r=new Reservation(i,this);// son vol est
this this.listeReservations.add(r);
} }}
package GestionVol;
import
java.util.Calendar;
import java.util.Date;
/**
*
* @author Dekhici
*/
public class Reservation {
private Date
dateReservation;
private int
num; private
Vol vol;
private boolean etatRes;//ou avec
enum public Reservation(int n,Vol v)
{
dateReservation=Calendar.getInstance().getTime(); num=n;
vol=v;
etatRes=fals
e;
}
public void confirmer()
{etatRes=true;}
4
USTO-MB, DEKHICI P O
public Ville getVille() {return ville;}
public void setVille(Ville nouvelleVille){this.ville=ville;}
void afficher() {
// à remplir
}
void afficher() {
// à remplir
}
}
4
USTO-MB, DEKHICI PO
vol1.ajouterEscale(v3.getListAeroport().get(0)
,1,Time.valueOf("09:00:00"),Time.valueOf("10:00:00")); //les declarer avant,
possible
vol1.afficher();
vol1.reserver(12);
vol1.reserver(13);
vol1.afficher();
//vol1.getListReservation().get(1).confirmer();
} }
4
USTO-MB, DEKHICI PO
Chapitre
5 Héritage et Polymorphisme
1. Héritage
1. But de l’héritage
Soit le diagramme de classe qui décrit les employés d’un établissement de santé par exemple un hôpital :
On remarquera que pour chaque concept (médecin généraliste, médecin spécialiste et employé ordinaire),
une classe a été créée avec redondance de définition d’attributs. Aussi la relation entre la classe Hôpital et les
autres classes engendra 3 listes selon le type d’employé. Si on veut ajouter la date de naissance ou un
comportement sous forme de méthode, nous serons obligés de le coder partout. En terme de
modélisation de réalité, le médecin n’est-il pas un employé ? Pour ces raisons, l’héritage en POO a été
défini.
2. Définition
La relation d’héritage indique que la "sous-classe" (classe fille) est une spécification de la "super-classe" (classe
mère). La classe fille hérite de tous les attributs et méthodes de la classe mère, on va du général au particulier.
4
USTO-MB, DEKHICI
POO
En UML, Elle est représentée par un trait continu reliant les deux classes et dont l’origine (classe mère) se
distingue de l’autre extrémité (classe fille) par un triangle vide. Ci-dessous le nouveau diagramme de classe
avec héritage :
Traduction Java :
4. Héritage Multiple
4
USTO-MB, DEKHICI PO
Exemple :
Exemple :
Dans le Constructeur sans paramètre de Médecin, on utilise super() au lieu de dire Employé() , le
constructeur de la classe mère :
public Medecin(){
super();
//complément de la construction
sesCompetences=new Vector<Competence>();}
}
Pour utiliser Employé.afficher(), on écrit super.afficher() qui signifie afficher comme la classe Mère :
6. Utilisation de l’héritage
L’un des principes de la programmation orientée objet est l’utilisation parfois d’objets généralisés (ayant
des attributs et des comportements qui se ressemblent) sans se soucier des détails. Par exemple ci-
dessous, on cherche à recruter des employés et les afficher. Ces employés peuvent être des médecins ou
des médecins spécialistes.
4
USTO-MB, DEKHICI
POO
public static void main(String arg[])
{ Hopital h=new Hopital();
Medecin m=new Medecin();
Employe e=new Employe();
…
h.recruter(m); h.recruter(e);
…
h.getSesEmployes().get(9).afficher();
}}
afficher() est une méthode polymorphe qui existe partout et qui a le même objectif mais ayant un contenu
spécifique à chaque type d’employé. Il est très recommandé de garder le même nom de méthode.
2. Polymorphisme
1. Définition du polymorphisme
Le mot polymorphisme du grec signifie qui peut prendre plusieurs formes. Cette caractéristique est un des
concepts essentiels de la POO. Alors que l'héritage concerne les classes (et leur hiérarchie), le polymorphisme
est relatif aux méthodes des objets (instances).
2. Types de polymorphisme
Il y a plusieurs types de polymorphisme selon la redéfinition de signature, de paramètre ou l’utilisation
dans la même classe ou dans des classes indépendantes (ad hoc) ou pour un héritage.
coercition
ad hoc
polymorphisme
paramétrique
universel
héritage(redefinition)
Il permet d'avoir des fonctions de même nom, avec des fonctionnalités similaires, dans des classes
différentes.( exemple : toString(), ValueOf())
4
USTO-MB, DEKHICI PO
int valInt = 2;
Il est donc possible par exemple de surcharger une méthode avec un nombre de paramètres.
L’exemple de constructeur, en est un cas de surcharge. Ainsi, on peut par exemple définir plusieurs méthodes
homonymes addition() effectuant une somme de valeurs. Elle pourra retourner la somme de deux entiers,
la somme de deux flottants, la concaténation de deux caractères, de plusieurs tableaux….etc :
On appelle signature le nombre et le type (statique) des arguments d'une fonction. C'est donc la signature
d'une méthode qui détermine laquelle sera appelée.
Remarques : Il faut faire attention lorsque pour un même nom de méthode dans un même fichier, la
signification des arguments n’est pas la même mais les paramètres en nombre et en types sont identiques,
l’implémentation d’un tel cas n’est pas possible.
La possibilité de redéfinir une méthode dans des classes héritant d'une classe de base s'appelle la
spécialisation. Il est alors possible d'appeler la méthode d'un objet sans se soucier de son type intrinsèque
: il s'agit du polymorphisme d'héritage.
Exemple :
Dans un jeu d'échec comportant des Pieces : Roi, Reine, Fou, Cavalier, Tour et Pion, héritant chacun de
Piece. On a la méthode mouvement polymorphe par héritage.
5
USTO-MB, DEKHICI
POO
roi.mouvement() ; cavalier.mouvement() ;
3. Utilisation de polymorphisme
Le polymorphisme comme l’héritage permet de réduire des redondances et de prévoir l’ajout d’autres
variantes de classes et de méthodes dans le projet dans le futur.
Sans le polymorphisme
if ( monCompteBancaire
instance of (PEL)){
moncomptebancaire.calculeInteretPEL() ;}else
moncomptebancaire.calculeInteretLivretA() ;
avec le polymorphisme :
5
USTO-MB, DEKHICI PO
Exercices du chapitre 5
Exercice 1 :
Class Point
private int x, y ;
Quels résultats fournit ce programme ? Expliquer les conversions mises en jeu et les règles utilisées
pour traiter les différents appels de méthodes :
System.out.println (pn1.identique(pn2)) ;
System.out.println (p.identique(pn1)) ;
System.out.println (pn1.identique(p)) ;
5
USTO-MB, DEKHICI
POO
System.out.println (Point.identiques(pn1, pn2)) ; }}
2. Doter la classe PointNom d’une méthode statique identiques et d’une méthode identique
fournissant toutes les deux la valeur true lorsque les deux points concernés ont à la fois les
mêmes coordonnées et le même nom. Quels résultats fournira alors le programme précédent
? Quelles seront les conversions mises en jeu et les règles utilisées ?
5
Chapitre
6
Notions Complémentaires en POO
1.1. Définition
1. Abstraction
abstract signifie non complète. Une méthode ou classe abstraite doit être obligatoirement
redéfinie. Une classe est abstraite si elle contient au moins une méthode abstraite.
1.2. Exemple
On souhaite représenter une classe forme ayant un point de départ (centre, coin…. ) et prévoir
le calcul de son aire.
Point sonPoint ;
float cote;
float rayon;
{List<Formes> desFormes ;
On l’initialise vide de 40 formes maximum. Comme List de java.util contient elle aussi des
5
USTO-MB, DEKHICI PO
méthodes abstraites, il est impossible de créer une liste sans préciser exactement quel type de List,
ici ArrayList :
sesFormes=new ArrayList<Formes>(40) ;
desFormes.add(new Carre()) ;
desFormes.add(new Cercle()) ;
On affiche aisément les aires des formes sans se soucier de l’instance qui appelle la méthode
aire() ;
for(Forme f :desFormes)
System.out.println(f.aire()) ;
}}
1.3. Exercice
Une carte logique est composée de plusieurs portes logiques. Si porteLogique(And , XOR, Not…)
est active et sa carteLogique est allumée, la porte peut recevoir( ) une ou des entrées qui modifient
son attribut sortie. Une porte peut s’activer et se désactiver par son ouverture et fermeture.
5
USTO-MB, DEKHICI PO
Public CarteLogique()
7. Dans la classe CarteLogique, écrire une méthode qui vérifie si les deux éléments à la
ième et jème positions sont de même type de portes.
{if
(this.listePorteLogique.get(i).instanceOf(this.listePorteLog
ique.get(i).getClass()) return true; else return false;}
5
USTO-MB, DEKHICI PO
System.out.println(p2.recevoir(p1.recevoir(x,y),z) ; //
accepter même plusieurs instructions au lieu d’une
seule.
2. Interfaces
2.1. Définition
Une interface permets de regrouper des comportements (méthodes ) et non pas des attributs. Elle
peut contenir des constantes (static final). Et par la suite les imiter (implémenter).
Le mot abstract n’est pas forcément devant les méthodes car il y a le terme interface en prototype .
Elle résout l’héritage multiple. Aussi une interface peut hériter de plusieurs interfaces.
Une interface est une classe 100 % abstraite mais sans le mot abstract.
Aucune méthode d'une interface n'a de corps.
Une interface sert à définir un supertype et à utiliser le polymorphisme.
Une interface s'implémente dans une classe en utilisant le mot clé implements.
On peut implémenter autant d'interfaces qu’on veut dans une classe.
Il faut redéfinir toutes les méthodes de l'interface (ou des interfaces) dans la classe.
5
USTO-MB, DEKHICI PO
2.2. Exemple
Client et fournisseur herite de personne.Client en ligne , fournisseur en ligne envoie des
message par internet , nous pouvons donc créer interface comportment en ligne pour ces deux.
3.Généricité
3.1. Définition
La généricité est un concept très utile pour développer des objets travaillant avec plusieurs types
de données. On passe donc moins de temps à développer des classes traitant de façon identique
des données différentes. List est une interface générique.
3.2. Exemples
Chose est une classe générique comme ArrayList et LinkedList et Vector.
public class Chose<T> {
//Variable dTinstance
private T valeur;
System.out.print(nbre);
}}
5
USTO-MB, DEKHICI PO
Nous pouvons définir des classes génériques avec deux types
public class ChoseAvec<T, S> {
//Variable dTinstance de type T
private T valeur1;
Exercices
4. Soit l’interface surdans
qui itère lesun
interfaces et la généricité
tableau d’entier:
positionActuelle=0;
4.
Non, les interfaces n’ont pas des attributs dynamiques mais statiques et finaux
5
USTO-MB, DEKHICI PO
6
Références
1. Yakov Fain, « Programmation Java pour les enfants, les parents et les grands-
parents », Smart Data Processing, Inc., New Jersey ; Juin 2005, ISBN: 0-
9718439- 4-5.
2. HOUNGUE, Pelagie. « Programmation Orientée Objet » . Ressources UVA Fr -
Sciences Informatiques ;2018.
3. https://openclassrooms.com/fr/courses/26832-apprenez-a-programmer-en-java.
dernière consultation en 2018