Programmation Orientée Objets
Programmation Orientée Objets
Support de cours
_________________________________
Ce cours est conçu comme une introduction aux paradigmes de la programmation orientée objet. Il
présente les notions de base de cette technologie : type abstrait de données, classe, objet, héritage simple et
multiple, objet complexe. Mécanisme d’abstraction, surcharge, généricité, polymorphisme. Les concepts
seront illustrés avec le langage JAVA.
Niveaux cibles :
Étudiants du niveau 3, toutes filières (Réseaux Informatique, Informatique de gestion, informatique
industrielle)
Pré-requis :
Algorithmique, Structures de données, Programmation I et Programmation II
Formule pédagogique :
Exposé informel
Laboratoire
Moyens pédagogiques :
Tableau
Support de cours
Méthodologie :
Cours intégré
Travaux dirigés (réalisation et correction d’exercices)
Travaux pratiques (JDK 1.5 + console MS-DOS)
Volume Horaire :
22.5 heures de cours
45 heures de travaux pratiques
Objectifs généraux :
Comprendre les origines et l’intérêt d’un nouveau style de programmation orientée objet
Maîtriser les concepts orientés objet en termes de définitions, syntaxe Java et usage
Savoir utiliser cette nouvelle approche pour modéliser des problèmes
Faire la liaison entre les différents éléments du cours (classes, objets, encapsulation,
héritage, polymorphisme, classe abstraite et les interfaces)
Traiter la gestion des exceptions afin de permettre une production du code efficace
Objectifs généraux Conditions de réalisation de la Critères d’évaluation de la
performance performance
1- S’initier aux concepts orientés A partir des notes du cours, des travaux Aucune confusion entre les
objets et leurs intérêts pratiques. dirigés et des références principes de la
bibliographiques, l’étudiant doit être programmation classique et
capable de dégager les lacunes de la programmation objet
l’approche classique de programmation
et de distinguer les principales
caractéristiques de POO
2- Comprendre les concepts A partir des notes du cours, des travaux Les exercices relatifs à
orientés objet en termes de dirigés et des références l’implémentation d’une
concept, syntaxe Java et bibliographiques, l’étudiant doit être classe en Java doivent être
utilisation. capable de concevoir des classes et des réussis
objets en Java
3- Comprendre l’utilité et A partir des notes du cours, des travaux Les exercices relatifs à l’accès
l’application des concepts dirigés et des références aux membres privés doivent
d’encapsulation et de surcharge. bibliographiques, l’étudiant doit être maîtrisés
maîtriser les concepts d’encapsulation et
surcharge
4- Comprendre la technique A partir des notes du cours, des travaux Aucune erreur n’est permise
d’héritage et ses intérêts dirigés et des références au niveau de la définition et
pratiques bibliographiques, l’étudiant doit être la manipulation d’une classe
capable de concevoir et implémenter des dérivée
classes dérivées.
5- Comprendre le concept de A partir des notes du cours, des travaux Aucune erreur n’est permise
polymorphisme et ses intérêts dirigés et des références au niveau de la liaison entre
pratiques bibliographiques, l’étudiant doit l’héritage et le
comprendre l’intérêt pratique de polymorphisme
polymorphisme et la relation avec
l’héritage
6- Comprendre et distinguer A partir des notes du cours, des travaux Aucune confusion entre les
entre les 2 concepts de classes dirigés et des références 2 concepts n’est permise
abstraites et interfaces bibliographiques, l’étudiant doit
comprendre l’utilité pratique des classes
abstraites et interfaces et distinguer les
nuances entre ces 2 concepts
7- Faire découvrir la notion de A partir des notes du cours, des travaux Les exercices relatifs à
gestion des exceptions dirigés, l’étudiant doit comprendre l’implémentation des
l’utilité pratique des exceptions. mécanismes des exceptions
en Java doivent être réussis
Semaine 1 à 4 Semaine 1 à 4
Test ou 10% ou
Semaine 8 à 15 Semaine 8 à
15
Bibliographie :
http://java.sun.com
Lemay L, Le Programmeur JAVA 2, Campus Press.
Bailly C, Chaline J.F., Ferry H.C & al, Les langages orientés objets, Cepadues éditions.
POO – INTRODUCTION A LA POO
CHAPITRE 0 :
INTRODUCTION A LA POO
Objectif spécifique
Rappel sur les types abstraits de données
Eléments de contenu
I. Rappel : les types abstraits de données
II. Exemple : comment penser en OO
Volume Horaire :
Cours : 1 heure 30
TD : 0 heure
Un type de données abstraites (TDA) peut être représenté comme l’abstraction sur les techniques de
représentation des données : fonctionnalité (opérations) avant tout. On peut dire qu’un TDA est constitué
d’un modèle mathématique et les opérations définies sur ce modèle.
Généralement, nous voulons construire des algorithmes en termes de TDA, mais la mise en œuvre d’un
algorithme dans un langage de programmation nécessite que nous trouvions un moyen de représenter les
TDA à l’aide des types de données et des opérations prédéfinis dans le langage lui-même. Pour représenter
le modèle mathématique sous jacent à un TDA : il faut recourir à des structures de données, qui sont des
ensembles de variables, à priori de types différents, reliées de multiples façons.
L’incarnation d’un TDA est la traduction, dans les termes d’un langage de programmation, la déclaration
qui définit une variable comme appartenant à ce type de données abstrait, et l’écriture dans un même
langage d’une procédure pour chaque opération relative à un TDA.
Une incarnation nécessite le choix d’une structure de données pour représenter le TDA : chaque structure
de donnée est construite à partir de types prédéfinis du langage de programmation hôte, à l’aide de ses
possibilités de structuration des donnés.
Par exemple les tableaux (array) et les enregistrements (record) sont deux outils particulièrement
importants en Pascal.
Mlle I.Sghaier - 1
POO – INTRODUCTION A LA POO
En réalité, tout informaticien utilise déjà les TADs, parfois sans le savoir. En effet, dans un algorithme il
doit manipuler des nombres entiers ou réels, il ne se préoccupe pas de la représentation de ces nombres,
mais uniquement des propriétés intrinsèques des quatre opérations habituelles (+,-,*,/).
On présente ici par l’exemple la spécification d’un type bien connu, celui des booléens : le TDA booléen.
Mlle I.Sghaier - 2
POO – INTRODUCTION A LA POO
Laboratoire
Mlle I.Sghaier - 3
POO – CONCEPTS DE BASE DE LA POO
CHAPITRE 1 :
Objectifs spécifiques
Introduire les facteurs de naissance de la POO
Introduire la définition de la POO
Introduction au concept de l’approche OO
Eléments de contenu
I. De la programmation classique vers la POO
II. Définition
III. Concepts de base de la POO
Volume Horaire :
Cours : 1 heure 30
TD : 0 heure
La programmation classique telle que étudiée au travers des langages C, Pascal… définie un programme
comme étant un ensemble de données sur lesquelles agissent des procédures et des fonctions.
Les données constituent la partie passive du programme. Les procédures et les fonctions constituent la
partie active.
Programmer dans ce cas revenait à :
- définir un certain nombre de variables (structures, tableaux…)
- écrire des procédures pour les manipuler sans associer explicitement les unes aux autres.
Exécuter un programme se réduit alors à appeler ces procédures dans un ordre décrit par le séquençage
des instructions et en leur fournissant les données nécessaires à l’accomplissement de leurs tâches.
Mlle I.Sghaier - 4
POO – CONCEPTS DE BASE DE LA POO
Dans cette approche données et procédure sont traitées indépendamment les unes des autres sans tenir
compte des relations étroites qui les unissent.
Les questions qu’on peut poser dans ce cas :
1. Cette séparation (données, procédures) est elle utile ?
2. Pourquoi privilégier les procédures sur les données (Que veut-on faire ?) ?
3. Pourquoi ne pas considérer que les programmes sont avant tout des ensembles objets
informatiques caractérisé par les opérations qu’ils connaissent ?
Les langages objets sont nés pour répondre à ces questions. Ils sont fondés sur la connaissance d’une
seule catégorie d’entités informatiques : les objets.
Un objet incorpore des aspects statiques et dynamiques au sein d’une même notion.
Avec les objets ce sont les données qui deviennent prépondérantes. On répond tout d’abord à la question
« De quoi parle-t-on ? »
Données Données
Méthodes Méthodes
Objet 1 Objet 2
Un programme est constitué d’un ensemble d’objets chacun disposant d’une partie procédures et d’une
partie données. Les objets interagissent par envoie de messages.
1.2 Définitions
1.2.1 POO
La POO est une méthode d’implémentation dans laquelle les programmes sont organisés sous formes de
collections coopératives d’objets, dont chacun représente une instance d’une classe quelconque et dont
toutes les classes sont membres d’une hiérarchie de classes unis à travers des relations d’héritage.
Mlle I.Sghaier - 5
POO – CONCEPTS DE BASE DE LA POO
1.2.4 Attributs
Les attributs d’un objet sont l’ensemble des informations se présentant sous forme de variable et
permettant de représenter l’état de l’objet.
1.2.5 Message
Un message est une demande d’activation d’une méthode envoyé à un objet.
1.2.6 Méthodes
Une méthode est une fonction ou procédure liée à un objet qui est déclenchée à la réception d’un message
particulier : la méthode déclenchée correspond strictement au message reçu. La liste des méthodes définies
au sein d’un objet constitue l’interface de l’objet pour l’utilisateur : ce sont les messages que l’objet peut
comprendre si on les lui envoie et dont la réception déclenche les méthodes correspondantes.
1.2.7 Signature
La signature d’une méthode représente la précision de son nom, du type de ses arguments et du type de
donnée retournée.
1.3.1 Encapsulation
Mlle I.Sghaier - 6
POO – CONCEPTS DE BASE DE LA POO
L’encapsulation est le faite qu’un objet renferme ses propres attributs et ses méthodes. Les détails de
l’implémentation d’un objet sont masqués aux autres objets du système à objets. On dit qu’il ya
encapsulation de données et du comportement des objets.
On précise trois modes d’accès aux attributs d’un objet.
- Le mode public avec lequel les attributs seront accessibles directement par l’objet lui même
ou par d’autres objets. Il s’agit du niveau le plus bas de protection.
- Le mode private avec lequel les attributs de l’objet seront inaccessibles à partir d’autres
objets : seules les méthodes de l’objet pourront y accéder. Il s’agit du niveau le plus fort de
protection.
- Le mode protected : cette technique de protection est étroitement associée à la notion
d’héritage (suite du cours).
1.3.2 Abstraction
C’est le faite de se concentrer sur les caractéristiques importantes d’un objet selon le point de vue de
l’observateur.
Exemple : Voiture
L’abstraction est un principe qui consiste à ignorer certains aspects d’un sujets qui ne sont pas importants
pour le problème dans le but de se concentrer sur ceux qui le sont.
Une instance d’une classe est un objet particulier d’une classe qui peut activer les méthodes de la classe
et qui a des valeurs particulières de ses attributs.
On définit l’objet comme l’instance d’une classe. La classe représente pour l’objet ce que représente le
type pour la variable. Un objet est caractérisé par :
Son identité (OID) : valeur unique et invariante qui caractérise l’objet
Son comportement : qui est défini à travers les méthodes applicables à cet objet et qui
caractérisent sa façon d’agir et de réagir dans son environnement.
Son état : qui constitue l’ensemble des valeurs des attributs de cet objet.
Une classe est un type abstrait qui encapsulent données et traitement. C’est une sorte de moule qui
permet ensuite de créer autant d’instances qu’on veut. Ces instances seront des objets de la classe
auxquelles on pourra effectivement envoyer des messages qui activeront les méthodes
correspondantes.
Mlle I.Sghaier - 7
POO – CONCEPTS DE BASE DE LA POO
Classe Etudiant
Attributs : Objet 1 : Etudiant1
Nom : char[] nom
Prenom : char[] prenom Nom : Aoun
Age : int a Prenom : Abdelkarim
Age : 20
Méthodes :
Lecture-etudiant() 3 instances de
Objet 2 : Etudiant2 la classe
Ecriture-etudiant()
Nom : Garbi Etudiant
Calcul-age()
Prenom : Wissem
Age : 19
Objet 3 : Etudiant3
Nom : Jlassi
Prenom : Imene
Age : 18
1.3.4 Héritage
La notion d’héritage est une relation entre différentes classes permettant de définir une nouvelle classe en
se basant sur les classes existantes. On parle d’héritage simple lorsqu’uen classe fille ne possède qu’une
classe mère.
On parle d’héritage multiple lorsqu’une classe fille possède plusieurs classes filles.
Héritage simple
Classe A Classe B
Classe C
Héritage Multiple
1.3.5 Polymorphisme
Le terme polymorphisme issu du grec signifie la faculté de prendre plusieurs formes.
Mlle I.Sghaier - 8
POO – CONCEPTS DE BASE DE LA POO
Une entité est polymorphe si à l’exécution elle peut se référer à des instances de classe différentes.
Exemples :
Personne Poisson
nage() nage()
Le polymorphisme est un mécanisme qui permet à une sous classe de redéfinir une méthode dont elle a
hérité tout en gardant la même signature de la méthode.
Mlle I.Sghaier - 9
POO – CONCEPTS ORIENTES OBJETS EN JAVA
CHAPITRE 2 :
Objectifs spécifiques
1. Introduire le concept de classe et sa notation (1/2 heure)
2. Maîtriser la définition des attributs et méthodes d’une classe (1 heure 30)
3. Maîtriser l’instanciation des objets et l’accès aux membres d’un objet (2 heures 30)
4. Comprendre le concept des classes internes (1 heure 30)
5. Maîtriser l’atout d’organisation « package » (1 heure 30)
Eléments de contenu
I. Notion de classe
II. Attributs et méthodes
III. Objets et Instanciation
IV. Membres statiques et mots clés final, this et null
V. Les classes internes
VI. Les packages
Volume Horaire :
Cours : 7 heures 30
Travaux Pratiques : 15 heures (5 TPs)
Mlle I.SGHAIER 10
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Les méthodes et les données sont pourvues d'attributs de visibilité qui gère leur accessibilité par les
composants hors de la classe.
2.1.2 Syntaxe
modificateur nom_classe [extends classe_mere]
[implements interface]
{
// Insérer ici les champs et les méthodes
}
Les modificateurs de classe (ClassModifiers) sont :
Modificateur Rôle
public La classe est accessible partout
private la classe n'est accessible qu'à partir du fichier où elle est définie
final La classe ne peut pas être modifiée, sa redéfinition grâce à l'héritage est interdite. Les
classes déclarées final ne peuvent donc pas avoir de classes filles.
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. Ce modificateur sera manipulé dans un prochain chapitre.
Les modificateurs abstract et final ainsi que public et private sont mutuellement exclusifs (c-à-d on ne
peut ni avoir public suivi de private ni abstract suivi de final).
Le mot clé extends permet de spécifier une superclasse éventuelle : ce mot clé permet de préciser la classe
mère dans une relation d'héritage (qui sera manipulé dans un prochain chapitre).
Le mot clé implements permet de spécifier une ou des interfaces (qui seront manipulées dans un
prochain chapitre) que la classe implémente. Cela permet de récupérer quelques avantages de l'héritage
multiple.
L'ordre des méthodes dans une classe n'a pas d'importance. Si dans une classe, on rencontre d'abord la
méthode A puis la méthode B, B peut être appelée sans problème dans A.
Remarque :
Par convention, en Java les noms de classes commencent par une lettre majuscule, si elle est composé de
plusieurs mots, ces mots doivent être liés par « _ » et commencent par une lettre majuscule.
Mlle I.SGHAIER 11
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Remarques
- Les modificateurs de visibilité sont : « public », « private » et « protected ».
- Dans la syntaxe, « expression » permet d’affecter des valeurs par défaut pour les attributs.
Ils peuvent être des variables d'instances, des variables de classes ou des constantes.
Mlle I.SGHAIER 12
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Les constantes sont définies avec le mot clé final : leur valeur ne peut pas être modifiée.
Exemple :
public class MaClasse {
final double pi=3.14 ;
}
Mlle I.SGHAIER 13
POO – CONCEPTS ORIENTES OBJETS EN JAVA
2.2.2.2 Remarques
- Toutes les méthodes sauf les «constructeurs » doivent avoir un type de retour.
- Les méthodes qui ne renvoient rien, utilisent « void » comme type de retour.
- Le code de la méthode est implémenté à la suite de l’accolade ouvrante « { ».
- Une méthode peut ne pas avoir besoin d’arguments, ni de variables à déclarer.
- Les méthodes agissent sur les attributs définis à l’intérieur de la classe.
- Sans modificateur, la méthode peut être appelée par toutes autres méthodes des classes du
package auquel appartient la classe.
- La valeur de retour de la méthode doit être transmise par l'instruction return. Elle indique la
valeur que prend la méthode et termine celle ci : toutes les instructions qui suivent return sont
donc ignorées.
Exemple :
int add(int a, int b) {
return a + b;
}
Il est possible d'inclure une instruction return dans une méthode de type void : cela permet de quitter la
méthode.
La méthode main() de la classe principale d'une application doit être déclarée de la façon suivante:
Déclaration d'une méthode main () :
public static void main (String args[]) { ... }
Si la méthode retourne un tableau alors les [] peuvent être précisés après le type de retour ou après la liste
des paramètres :
Exemple :
int[] valeurs() { … }
int valeurs()[] { … }
Mlle I.SGHAIER 14
POO – CONCEPTS ORIENTES OBJETS EN JAVA
si v est un objet alors m pourra modifier l'objet en utilisant une méthode de l'objet passé en
paramètre.
2.2.5 Constructeurs
La déclaration d'un objet est suivie d'une sorte d'initialisation par le moyen d'une méthode particulière
appelée constructeur pour que les variables aient une valeur de départ. Elle n'est systématiquement
invoquée que lors de la création d'un objet.
Le constructeur suit la définition des autres méthodes excepté que son nom doit obligatoirement
correspondre à celui de la classe et qu'il n'est pas typé, pas même void, donc il ne peut pas y avoir
d'instruction return dans un constructeur. On peut surcharger un constructeur.
La définition d'un constructeur est facultative. Si elle n'est pas définie, la machine virtuelle appelle un
constructeur par défaut vide créé automatiquement. Dès qu'un constructeur est explicitement défini, Java
considère que le programmeur prenne en charge la création des constructeurs et que le mécanisme par
défaut, qui correspond à un constructeur sans paramètres, est supprimé. Si on souhaite maintenir ce
mécanisme, il faut définir explicitement un constructeur sans paramètres.
Il existe plusieurs manières de définir un constructeur :
● Le constructeur simple : ce type de constructeur ne nécessite pas de définition explicite: son
existence découle automatiquement de la définition de la classe.
Exemple :
public MaClasse() {}
● Le constructeur avec initialisation des variables : pour spécifier les valeurs de données à
initialiser on peut les passer en paramètres au constructeur
Exemple :
public MaClasse(int valeur) {
nombre = valeur;
Mlle I.SGHAIER 15
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Exemple
class Rectangle
{private int longueur ;
private int largeur ;
Rectangle () {longueur =10 ; largeur = 5 ;} // C’est un constructeur sans paramètres
Rectangle (int x, int y) {longueur =x ; largeur = y ;} // constructeur avec 2 paramètres
Rectangle (int x) {longueur =2*x ; largeur = x ;} // constructeur avec 1 paramètre
public int calcul_surface ( ) {return (longueur*largeur) ;}
}
Mlle I.SGHAIER 16
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Exemple :
System.out.Println("bonjour");
Deux classes sont impliqués dans l'instruction : System et PrintStream. La classe System possède une
variable nommée out qui est un objet de type PrintStream.Println() est une méthode de la classe
PrintStream. L'instruction signifie : « utilise la méthode Println() de la variable out de la classe System ».
Mlle I.SGHAIER 17
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Exemple : on définit une classe Cercle, contenant entre autres un attribut rayon et un attribut
epaisseur_trait. Chaque cercle instancié de cette classe possédera son propre rayon et sa propre épaisseur
du trait.
Il est nécessaire de définir la déclaration d'une variable ayant le type de l'objet désiré. La déclaration est de
la forme classe nom_variable.
Exemple :
MaClasse m;
L'opérateur new se charge de créer une instance de la classe et de l'associer à la variable.
Exemple :
m = new MaClasse();
Mlle I.SGHAIER 18
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Mlle I.SGHAIER 19
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Mlle I.SGHAIER 20
POO – CONCEPTS ORIENTES OBJETS EN JAVA
m1 et m2 ne contiennent plus la même référence et pointent donc sur des objets différents.
Mlle I.SGHAIER 21
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Si on souhaite sauvegarder le nombre des objets crées et attribuer à chaque objet son numéro d’ordre.
Pour satisfaire à cet objectif, on a certainement besoin d’un attribut de type statique qui est commun à
tous les objets et qui sauvegarde le nombre d’objets déjà crées.
On va reformuler l’exemple précèdent, en ajoutant un attribut statique appelé count qui va indiquer le
nombre d’objets crées et un attribut qui s’appelle num qui indique le numéro d’ordre d’un objet, cet
attribut n’est pas statique car sa valeur est propre à chaque objet.
Exemple :
class Rectangle
{static int count =0;
private int longueur, larg;
private int num;
Rectangle (int x, int y) {
Count++ ; num = count ; longueur = x ; largeur = y ;}
…….Les autres méthodes
}
class Test_Rec
{
public static void main (String [] args)
{System.out.println (“Nombre des objets = ” + Rectangle.count) ; // affiche 0
Rectangle r = new Rectangle (10,5);
System.out.println (“Nombre des objets = ” + Rectangle.count) ; // affiche 1
System.out.println (“Numéro de l’objet crée = ” + r.num) ; //affiche 1
Rectangle r3;
r3= new Rectangle (14);
Mlle I.SGHAIER 22
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Exemple
On va définir une classe Math qui peut contenir des fonctions mathématiques. De préférence, on déclare
ces méthodes comme étant statiques pour pouvoir les utiliser sans instancier des objets de cette classe.
Mlle I.SGHAIER 23
POO – CONCEPTS ORIENTES OBJETS EN JAVA
This est aussi utilisé quand l'objet doit appeler une méthode en se passant lui même en paramètre de
l'appel.
Mlle I.SGHAIER 24
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Mlle I.SGHAIER 25
POO – CONCEPTS ORIENTES OBJETS EN JAVA
int x, y;
Point ( int x1, int y1)
{x=x1; y=y1;}
void affichep ()
{System.out.println ("Le centre se trouve dans " + x + " " + y);
}
}
Point p = new Point (10,5);
void affiche () {
System.out.println ("Longueur=" + longueur + " Largeur =" + larg);
}
}
class test_Rec{
public static void main(String [] args){
Rectangle r = new Rectangle (4,6);
Point p = new Point(12,14); //faux car la classe Point est invisible de l’extérieur
r.p.affichep(); //on peut accéder à une méthode de la classe interne à travers l’attribut p de l’objet r.
r.affiche() ;
}
}
Organisation
- Les classes d’un package se trouvent dans un répertoire décrit par le nom du package.
- Ainsi les classes du package Java.lang se trouvent dans un sous-répertoire java/lang accessible
par la variable d’environnement CLASSPATH.
Mlle I.SGHAIER 26
POO – CONCEPTS ORIENTES OBJETS EN JAVA
import nomPackage; les classes ne peuvent pas être simplement désignées par leur
nom et il faut aussi préciser le nom du package
import nomPackage.*; toutes les classes du package sont importées
import nomPackage.nomClasse; appel à une seule classe : l'avantage de cette notation est de
réduire le temps de compilation
Attention : l'astérisque n'importe pas les sous paquetages. Par exemple, il n'est pas possible d'écrire
import java.*.
Il est possible d'appeler une méthode d'un package sans inclure ce dernier dans l'application en précisant
son nom complet :
nomPackage.nomClasse.nomméthode(arg1, arg2 ... )
Mlle I.SGHAIER 27
POO – CONCEPTS ORIENTES OBJETS EN JAVA
Il existe plusieurs types de packages : le package par défaut (identifié par le point qui représente le
répertoire courant et permet de localiser les classes qui ne sont pas associées à un package particulier), les
packages standards qui sont empaquetés dans le fichier classes.zip et les packages personnels.
Le compilateur implémente automatiquement une commande import lors de la compilation d'un
programme Java même si elle ne figure pas explicitement au début du programme :
import java.lang.*; Ce package contient entre autre les classes de base de tous les objets java dont la classe
Object.
Un package par défaut est systématiquement attribué par le compilateur aux classes qui sont définies sans
déclarer explicitement une appartenance à un package. Ce package par défaut correspond au répertoire
courant qui est le répertoire de travail.
2.6.3 Quelques packages prédéfinis
Le package math permet d’utiliser les fonctions mathématiques ;
Dans io tout ce qu'il faut pour manipuler les entrées, les sorties, ...
sql contient les classes et méthodes pour interfacer vos applications avec des bases de données
(interface JDBC).
Mlle I.SGHAIER 28
POO – ENCAPSULATION ET SURCHARGE
CHAPITRE 3 :
Encapsulation et surcharge
Objectifs spécifiques
1. Introduire la notion d’encapsulation et ses intérêts pratiques
2. Comprendre les droits d’accès aux membres et aux classes
3. Maîtriser le concept de surcharge des méthodes
Eléments de contenu
I. L’encapsulation
II. Modificateurs de visibilité et accès
III. Surcharge des méthodes
Volume Horaire :
Cours : 3 heures
Travaux Pratiques : 9 heures
L’encapsulation
L’encapsulation est la possibilité de ne montrer de l’objet que ce qui est nécessaire à son utilisation.
L’encapsulation permet d’offrir aux utilisateurs d’une classe la liste des méthodes et éventuellement des
attributs utilisables depuis l’extérieur. Cette liste de services exportables est appelée l’interface de la classe
et elle est composée d’un ensemble des méthodes et d’attributs dits publics (Public).
Les méthodes et attributs réservés à l’implémentation des comportements internes à l’objet sont dits
privés (Private). Leur utilisation est exclusivement réservée aux méthodes définies dans la classe
courante.
Les avantages de l’encapsulation sont :
- Simplification de l’utilisation des objets,
- Meilleure robustesse du programme,
- Simplification de la maintenance globale de l’application
Mlle I.SGHAIER 29
POO – ENCAPSULATION ET SURCHARGE
Les attributs et les méthodes sont précédés lors de la déclaration par l’un des modificateurs de visibilité
suivants : « public », « private », « protected » et Néant.
- Une méthode, classe ou attribut sont déclarés comme publiques « public » s’ils doivent être
visibles à l’intérieur et à l’extérieur quelque soit leur package.
- Une méthode, classe ou attribut ne sont pas précédés par un modificateur de visibilité explicite
(Néant) ne vont être visibles qu’à l’intérieur de même package. C'est-à-dire seules les classes de
même package peuvent accéder aux attributs et méthodes de classes « amies ». Ce modificateur de
visibilité est aussi appelé « modificateur de package » ou modificateur « freindly ».
- Une méthode ou attributs définis comme étant privés « private » s’ils sont accessibles
uniquement par les méthodes de la classe en cours. Ils ne sont pas accessibles ailleurs.
- Une méthode ou attribut sont définis comme protégés « protected » s’ils ne peuvent être
accessibles qu’à travers les classes dérivées ou les classes de même package.
Tableaux récapitulatifs des droits d’accès
protected Accès possible depuis toutes les classes de même paquetage ou depuis les classes dérivées
private Accès restreint à la classe où est faite la déclaration (du membre ou de la classe interne)
- Pour accéder aux attributs de l’intérieur de la classe, il suffit d’indiquer le nom de l’attribut que
l’on veut y accéder.
<nom_méthode>.<nom_attribut>
Mlle I.SGHAIER 30
POO – ENCAPSULATION ET SURCHARGE
Exemple 1
Si longueur et largeur étaient des attributs publics de Rectangle, on peut écrire le code suivant dans la
méthode « main » de la classe Test_Rect
Si longueur et largeur étaient des attributs privés « private », les instructions suivantes seront refusées
par le compilateur
Il fallait dans le deuxième cas définir des méthodes d’accés « setlong (int) » et « setlarg (int) » qui
permettent de modifier les valeurs des attributs et les méthodes d’accès « getlong ()» et « getlarg ()» pour
retourner les valeurs de longueur et de largeur d’un objet Rectangle. Dans ce cas, les instructions seront les
suivantes :
r.setlong(20); //juste
r.setlarg(15); //juste
int la = r.getlong() ; //juste
Exemple 2
public class Rectangle
{
private int longueur;
private int larg;
Mlle I.SGHAIER 31
POO – ENCAPSULATION ET SURCHARGE
Mlle I.SGHAIER 32
POO – ENCAPSULATION ET SURCHARGE
La surcharge est la capacité des objets d’une même hiérarchie de classes à répondre
différemment à une méthode de même nom, mais avec des paramètres différents. Par exemple,
la classe Rectangle peut avoir plusieurs méthodes Allonger () acceptant des paramètres différents
en nombre et/ou en types.
Le mécanisme de surcharge permet de réutiliser le nom d’une méthode déjà définie, pour une
autre méthode qui en différera par ses paramètres.
Exemple
Mlle I.SGHAIER 33
POO – ENCAPSULATION ET SURCHARGE
Mlle I.SGHAIER 34
POO – ENCAPSULATION ET SURCHARGE
TD1
Exercice 1:
// Constructeur
public Livre(String unAuteur, String unTitre) {
auteur = unAuteur;
titre = unTitre;
}
// Accesseur
public String getAuteur() {
return auteur;
}
// Modificateur
void setNbPages(int n) {
nbPages = nb;
}
Exercice 2:
Accesseurs et modificateurs
Mlle I.SGHAIER 35
POO – ENCAPSULATION ET SURCHARGE
Exercice 3:
1) Dans La classe Livre, ajoutez une méthode afficheToi() qui affiche une description du livre
(auteur, titre et nombre de pages).
2) Ajoutez une méthode toString() qui renvoie une chaîne de caractères qui décrit le livre.Modifiez
la méthode afficheToi() pour utiliser toString().
Voyez ce qui est affiché maintenant par l'instruction System.out.println(livre).
Utilisez les 3 constructeurs (et éventuellement d'autres méthodes) pour créer 3 livres de 300 pages dans la
méthode main() de la classe TestLivre.
Exercice 4
a- Ajoutez un prix aux livres (nombre qui peut avoir 2 décimales ; type Java float ou double) avec 2
méthodes getPrix et setPrix pour obtenir le prix et le modifier.
Mlle I.SGHAIER 36
POO – ENCAPSULATION ET SURCHARGE
c- Testez. Si le prix d'un livre n'a pas été fixé, la description du livre (toString()) devra indiquer "Prix
pas encore fixé".
d- On bloque complètement les prix : un prix ne peut être saisi qu'une seule fois et ne peut être
modifié ensuite (une tentative pour changer le prix ne fait qu'afficher un message d'erreur).
Réécrivez la méthode setPrix (et autre chose si besoin est). Vous ajouterez une variable booléenne
prixFixe (pour "prix fixé") pour savoir si le prix a déjà été fixé.
e- Réécrire la méthode main () et prévoir le deux cas ( prix non fixé ou bien prix fixé plusieurs fois )
afficher le résultat de l’exécution.
Mlle I.SGHAIER 37
POO – HERITAGE
CHAPITRE 4 :
L’HERITAGE
Objectifs spécifiques
1. Introduire la technique d’héritage : intérêt et notation
2. Introduire les droits d’accès d’une classe dérivée aux membres de la classe de base
3. Comprendre la construction d’un objet dérivé
4. Maîtriser la notion de redéfinition
5. Découvrir le concept de dérivations multiples
Eléments de contenu
I. L’encapsulation
II. Modificateurs de visibilité et accès
III. Surcharge des méthodes
Volume Horaire :
Cours : 4 heures 30
Travaux Pratiques : 6 heures
L'héritage est un mécanisme qui facilite la réutilisation du code et la gestion de son évolution. Grâce à
l'héritage, les objets d'une classe ont accès aux données et aux méthodes de la classe parent et peuvent les
étendre. 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. Les méthodes sont redéfinies avec le même
nom, les mêmes types et le même nombre d'arguments, sinon il s'agit d'une surcharge. L'héritage successif
de classes permet de définir une hiérarchie de classe qui ce compose de super classes et de sous classes.
Une classe qui hérite d'une autre est une sous classe et celle dont elle hérite est une super_classe. Une
classe peut avoir plusieurs sous classes. Une classe ne peut avoir qu'une seule classe mère : il n'y a pas
d'héritage multiple en java.
Object est la classe parente de toutes les classes en java. Toutes les variables et méthodes contenues
dans Object sont accessibles à partir de n'importe quelle classe car par héritage successif toutes les classes
héritent d'Object.
4.2 Syntaxe
Mlle I.SGHAIER 38
POO – HERITAGE
Mlle I.SGHAIER 39
POO – HERITAGE
2. La classe Rectangle redéfinit la méthode surface et ajoute les attributs longueur et larg
3. La classe carré ajoute l’attribut côté et redéfinit la méthode surface.
Remarques
Le concept d’héritage permet à la classe dérivée de :
1. Hériter les attributs et les méthodes de la classe de base.
2. Ajouter ses propres définitions des attributs et des méthodes.
3. Redéfinir et surcharger une ou plusieurs méthodes héritées.
4. Tout objet peut être vu comme instance de sa classe et de toutes les classes dérivées.
5. Toute classe en Java dérive de la classe Object.
6. Toute classe en Java peut hériter directement d’une seule classe de base. Il n’y a pas la notion
d’héritage multiple en Java, mais il peut être implémenté via d’autres moyens tels que les interfaces
(Chapitre suivant).
Pour invoquer une méthode d'une classe parent, il suffit d'indiquer la méthode préfixée par super. Pour
appeler le constructeur de la classe parent il suffit d'écrire super(paramètres) avec les paramètres adéquats.
Le lien entre une classe fille et une classe parent est géré par le langage : une évolution des règles de
gestion de la classe parent conduit à modifier automatiquement la classe fille dès que cette dernière est
recompilée.
En java, il est obligatoire dans un constructeur d'une classe fille de faire appel explicitement ou
implicitement au constructeur de la classe mère.
Les variables et méthodes définies avec le modificateur d'accès public restent publiques à travers l'héritage
et toutes les autres classes.
Une variable d'instance définie avec le modificateur private est bien héritée mais elle n'est pas accessible
directement, elle peut l’être via les méthodes héritées.
Si l'on veut conserver pour une variable d'instance une protection semblable à celle assurée par le
modificateur private, il faut utiliser le modificateur protected. La variable ainsi définie sera hérité dans
toutes les classes descendantes qui pourront y accéder librement mais ne sera pas accessible hors de ces
classes directement.
Exemple1 : La classe dérivée et la classe de base sont dans le même package
package Formes_geo ;
class graphiques {
private x, y ;
public String couleur ;
void affiche () {
System.out.println (« Le centre de l’objet = ( » + x + « , » + y + « ) » ) ; }
double surface ( ) {return (0) ;} } //fin de la classe graphiques
Mlle I.SGHAIER 40
POO – HERITAGE
package Formes_geo ;
class cercle extends graphiques{
double rayon ;
void changer_centre ( int x1, int y1, double r)
{x = x1 ; y = y1 ;
// faux car x et y sont déclarés private dans la classe de base
rayon =r ;
public double surface ( ) {return (rayon * 2* 3.14) ;}
public void affichec ()
{affiche () ;
// juste car le modificateur de visibilité de ce membre est freindly
System.out.println (« Le rayon = » + rayon + « La couleur = « + couleur ) ;}
}
Interprétation :
Dans le premier cas, la classe dérivée est la classe de base sont dans le même package, donc la classe
cercle a pu accéder aux membres (attributs et méthodes) publiques (l’attribut couleur), de même elle a pu
accéder aux membres « freindly » c'est-à-dire qui n’ont pas un modificateur de visibilité (la méthode
affiche), mais elle n’a pas pu accéder aux membres privés (x et y).
Exemple 2 : La classe dérivée et la classe de base ne sont pas dans le même package
package Formes_geo ;
class graphiques {
private x, y ;
public String couleur ;
void affiche () {
System.out.println (« Le centre de l’objet = ( » + x + « , » + y + « ) » ) ; }
double surface ( ) {return (0) ;} } //fin de la classe graphiques
package FormesCirc ;
class cercle extends graphiques{
double rayon ;
void changer_centre ( int x1, int y1, double r)
{x = x1 ; y = y1 ; // faux car x et y sont déclarés private dans la classe de base
rayon =r ;
public double surface ( ) {return (rayon * 2* 3.14) ;}
public void affichec ()
{affiche () ; // FAUX car le modificateur de visibilité de ce membre est freindly
Mlle I.SGHAIER 41
POO – HERITAGE
Remarque
Dans le cas général, une classe de base et une classe dérivée possèdent chacune au moins un constructeur.
Le constructeur de la classe dérivée complète la construction de l’objet dérivé, et ce, en appelant en
premier lieu le constructeur de la classe de base.
Toutefois, il existe des cas particuliers qui sont :
cas1 : La classe de base ne possède aucun constructeur
Mlle I.SGHAIER 42
POO – HERITAGE
Dans ce cas, si la classe dérivée veut définir son propre constructeur, elle peut
optionnellement appeler dans la 1ère instruction de constructeur la clause « super () » pour
désigner le constructeur par défaut de la classe de base.
Cas2 : La classe dérivée ne possède pas un constructeur
Dans ce cas, le constructeur par défaut de la classe dérivée doit initialiser les attributs de la
classe dérivée et appeler :
- Le constructeur par défaut de la classe de base si elle ne possède aucun
constructeur.
- Le constructeur sans argument si elle possède au moins un constructeur.
- Dans le cas où il n’ y a pas un constructeur sans argument et il y a d’autres
constructeurs avec arguments, le compilateur génère des erreurs.
Exemple1 (cas1)
Class A {
// pas de constructeur
}
class B extends A {
public B(….)
{super() ; //appel de constructeur par défaut de A
………
}
B b = new B(…); // Appel de constructeur1 de A
Exemple2 (cas2)
Class A {
public A() {….} //constructeur1
public A ( int n) {…..} //constructeur2
}
class B extends A {
// …..pas de constructeur
}
B b = new B(); // Appel de constructeur1 de A
Exemple3 (cas 2)
Class A {
public A ( int n) {…..} //constructeur1
}
class B extends A {
// …..pas de constructeur
}
Mlle I.SGHAIER 43
POO – HERITAGE
B b = new B();
/* On obtient une erreur de compilation car A ne dispose pas
un constructeurs sans argument et possède un autre constructeur*/
Exemple4 (cas1 et 2)
Class A {
//pas de constructeurs
}
class B extends A {
//pas de constructeurs
}
B b = new B ();
// Appel de constructeur par défaut de B qui Appelle le constructeur par
//défaut de A.
La classe Caniche est une classe descendante directement de la classe Chien et une classe
descendante de Animal
La notion de l’héritage multiple n’existe pas directement en Java, mais elle peut être implémentée
via la notion des interfaces
Mlle I.SGHAIER 44
POO – HERITAGE
Nous avons déjà étudié la notion de surcharge (surdéfinition) de méthode à l’intérieur d’une même classe.
Nous avons vu qu’elle correspondait à des méthodes de même nom, mais de signatures différentes. Nous
montrerons ici comment cette notion se généralise dans le cadre de l’héritage : une classe dérivée pourra à
son tour surcharger une méthode d’une classe ascendante. Bien entendu, la ou les nouvelles méthodes ne
deviendront utilisables que par la classe dérivée ou ses descendantes, mais pas par ses ascendantes.
De même une classe dérivée peut fournir une nouvelle définition d’une méthode de même nom et aussi de
même signature et de même type de retour.
=>Alors que la surcharge cumule plusieurs méthodes de même nom, la redéfinition substitue une
méthode à une autre.
//classe dérivée
class cercle extends graphiques{
double rayon ;
public double surface ( ) {
return (rayon * 2* 3.14) ;} //redéfinition de « surface »
public void affiche () //redéfinition de la méthode « affiche »
{super.affiche () ; // appel de affiche de la super-classe
Mlle I.SGHAIER 45
POO – HERITAGE
A*
C*
B
D* E F
L’appel de la fonction f conduira pour chaque classe à l’appel de la méthode indiquée :
Classe A : Méthode f de A
Classe B : Méthode f de A
Classe C : Méthode f de C
Classe D : Méthode f de D
Classe E : Méthode f de A
Classe F : Méthode f de C
Class B extends A
{public void f (float n) {…..}
…}
Aa,Bb;
int n; float x;
a.f(n) // appelle f(int) de A
a.f(x) // Erreur, on a pas dans A f(float)
b.f(n) // appelle f(int) de A
Mlle I.SGHAIER 46
POO – HERITAGE
Class A
{public void f (int n) {…..}
public void f (float n) {…..}
…}
Class B extends A
{public void f (int n) {…..} // redefinition de la
méthode f( int ) de A
public void f (double n) {…..} // Surcharge de la
méthode f de A et de B
…}
Aa,Bb;
int n , float x, double y ;
a.f(n) ;//Appel de f(int) de A
a.f(x) ;//Appel de f(float) de A
a.f(y) ; //Erreur, il n’ y a pas f(double) dans A
b.f(n) ;
//Appel de f(int) de B car f(int) est redéfinie dans B
a.f(x) ;//Appel de f(float) de A
a.f(y) ;//Appel de f(double) de B
- Si une méthode d’une classe dérivée a la même signature q’une méthode d’une classe ascendante :
Les 2 méthodes doivent avoir le même type de retour.
Le droit d’accès de la méthode de la classe dérivée ne doit pas être moins élevé que celui de la classe
ascendante.
- Une méthode statique ne peut pas être redéfinie.
Mlle I.SGHAIER 47
POO – HERITAGE
* Accéder dans une méthode d’une classe dérivée à une méthode de la super-classe (optionnel
sauf dans le cas de redéfinition)
Syntaxe : super.nom_méthode (<liste des arguments>) ;
*Accéder dans une méthode dérivée à un attribut de la classe de base (optionnel)
Syntaxe : super.nom_attribut
Le modificateur « final »
Cas1 : Le modificateur « final » placé devant une classe interdit sa dérivation
Exemple
final class A {
//Méthodes et attributs }
class B extends A //Erreur car la classe A est déclarée finale
{//....}
Cas 2 : Le modificateur « final » placé devant une méthode permet d’interdire sa redéfinition
Class A {
final Public void f(int x) {…..}
//…Autres méthodes et attributs
}
Class B {
//Autres méthodes et attributs
public void f (int x) {…} // Erreur car la méthode f est déclarée finale. Pas de redéfinition
}
Les classes et les méthodes peuvent être déclarées finales pour des raisons de sécurité pour garantir que
leur comportement ne soit modifié par une sous-classe.
Mlle I.SGHAIER 48
POO – POLYMORPHISME
CHAPITRE 5 :
LE POLYMORPHISME
Objectifs spécifiques
1. comprendre Le concept de polymorphisme à travers des exemples
2. Comprendre la conversion des arguments en liaison avec le polymorphisme
3. Comprendre la conversion explicite des références en rapport avec le polymorphisme
Eléments de contenu
I. Concept de polymorphisme
II. Exemple et interprétation
III. Conversion des arguments effectifs
IV. Les conversion explicites des références
Volume Horaire :
Cours : 3 heures
Travaux Pratiques : 3 heures
Mlle I.SGHAIER 49
POO – POLYMORPHISME
private int x, y;
public graphique ( int x, int y) { this.x = x ; this.y = y ;}
public void identifie () {
System.out.println (« Je suis une forme géometrique ») ;}
public void affiche () {
this.identifie() ;
System.out.println (« Le centre de l’objet se trouve dans : » + x
+ « et » + y) ;}
double surface () {return (0) ;}
} // fin de la classe graphique
//Classe dérivée1
class Cercle extends graphique {
private double rayon =1 ;
public Cercle ( int x, int y, double r) {super(x,y) ;
rayon = r ;}
public void identifie () {
System.out.println (« Je suis un cercle ») ;}
double surface ()
{return ( rayon * 2* 3.14) ;} }
//Classe dérivée2
class Rectangle extends graphique {
private int larg, longueur ;
Rectangle ( int x, int y, int l1, int l2)
{super (x,y) ;
longueur = l1 ; larg = l2 ;}
double surface () {return (longueur*largeur) ;}
public void identifie() {
System.out.println(« Je suis un rectangle ») ;}
}// fin de la classe Rectangle
//Classe de test
class test_poly {
public static void main (String [] args) {
graphique g = new graphique (3,7);
g.identifie ();
g= new Cercle (4,8,10) ;
// compatibilité entre le type de la classe et de la classe dérivéé
g.identifie() ;
Mlle I.SGHAIER 50
POO – POLYMORPHISME
Mlle I.SGHAIER 51
POO – POLYMORPHISME
Mlle I.SGHAIER 52
POO – POLYMORPHISME
class B extends A
{// pas de redéfinition de identitie ici
}
class Test
{ static void f(A a ) {
a.identitie(); }
}
…..
A a = new A();
B b = new B ();
Test.f(a);
// OK Appel usuel; il affiche “objet de type A”
Test.f(b) ;
/*OK une référence à un objet de type B est compatible avec une
référence à un objet de type A. L’appel a.identifie affiche : « Objet
de type A » */
Exemple2
On va juste modifier le corps de la classe B par une redéfinition de la méthode « identifie »
class B {
public void identifie () {
System.out.println (« Objet de type B ») ;}
}
….
A a = new A(); B b = new B ();
Test.f (b) ;
/*OK une référence à un objet de type B est compatible avec une
référence à un objet de type A. L’appel a.identifie affiche : « Objet
de type B »*/
Cet exemple, montre que comme dans les situations d’affectation, la conversion implicite d’un type dérivé
dans un type de base n’est pas dégradante puisque grâce au polymorphisme, c’est bien le type de l’objet
référencé qui intervient.
Remarque :
Dans le cas où la méthode f est surdefinie, il y a encore des règles plus compliquées lors de la conversion
implicite des types de paramètres.
Mlle I.SGHAIER 53
POO – POLYMORPHISME
Compatibilité entre référence à un objet d’un type donné et une référence à un objet d’un type ascendant.
Dans le sens inverse, la compatibilité n’est pas implicite.
Exemple :
Class graphique {…….}
Class Cercle {……..}
…..
graphique g,g1 ;
Cercle c,c1 ;
C = new graphique (….) ; //Erreur de compilation
g= new Cercle (…) //Juste
g1 = new graphique (….) ; //évident
c1= new Cercle(…) ; //évident
c1 = g1 //faux (Conversion implicite illégale)
g1= c1 ; //juste ; (conversion implicite légale)
Il faut réaliser une conversion explicite c1 = (Cercle) g1 ;
Toutefois cette syntaxe qui est acceptée à la compilation peut être refusée à l’exécution et le traitement
peut être arrêtée si il n ‘y a pas compatibilité effective entre les types.
Mlle I.SGHAIER 54
POO – POLYMORPHISME
TD2
Exercice 2
Un fichier est caractérisé par : son nom, son extension, son emplacement et sa taille sur disque (en kilo
octets).
Les fichiers sont enregistrés dans des supports magnétiques pouvant être des disquettes ou des disques
durs
Une disquette est caractérisée par son nom logique, la taille d’un secteur en kilo octets, le nombre de
secteurs par pistes et le nombre de pistes par surface.
Un disque dur est caractérisé par son nom logique, la taille d’un secteur en kilo octets, le nombre de
secteurs par piste, le nombre de pistes par surfaces et le nombre de surfaces.
Afin de pouvoir gérer son contenu, on suppose que chaque disque contient deux tableaux
Le premier contient toutes les caractéristiques d’un fichier donné
Le second contient pour chaque fichier son adresse physique (les adresses physiques sont attribuées
automatiquement par le système)
On se propose alors de développer les classes Fichier, Disquette et DisqueDur :
La classe Fichier doit contenir :
Un constructeur paramétré qui accepte comme arguments une liste de valeurs permettant
l’initialisation des différents attributs de l’objet en question;
Des mutateurs permettant la modification des valeurs des attributs d’un objet;
Des accesseurs permettant le renvoi des valeurs des attributs d’un objet;
Chacune des deux classes Disquette et DisqueDur doit contenir :
Un constructeur paramétré qui accepte comme arguments une liste de valeurs permettant
l’initialisation des différents attributs de l’objet en question;
Mlle I.SGHAIER 55
POO – POLYMORPHISME
Mlle I.SGHAIER 56
POO – CLASSES ABSTRAITES ET INTERFACES
CHAPITRE 6 :
Objectifs spécifiques
1. Introduire la notion de classe abstraite, les règles de définition et l’intérêt pratique
2. Introduire le concept d’interfaces, leurs intérêts pratiques et leurs relations avec l’héritage
Eléments de contenu
I. Les classes abstraites
II. Les interfaces
Volume Horaire :
Cours : 3 heures
Travaux Pratiques : 3 heures
- Une classe abstraite est une classe qui ne permet pas d’instancier des objets, elle ne peut servir que de
classe de base pour une dérivation.
- Dans une classe abstraite, on peut trouver classiquement des méthodes et des champs, dont héritera
toute classe dérivée et on peut trouver des méthodes dites « abstraites » qui fournissent uniquement la
signature et le type de retour.
Syntaxe
abstract class A
public abstract void g (int n) ; //g est une méthode abstraite elle
n’est pas définie dans A
Utilisation
Aa;
a = new A (….) ;
Mlle I.SGHAIER 57
POO – CLASSES ABSTRAITES ET INTERFACES
Si on dérive une classe B de A qui définit les méthodes abstraites de A, alors on peut :
Dès qu’une classe abstraite comporte une ou plusieurs méthodes abstraites, elle est abstraite, et ce
même si l’on n’indique pas le mot clé « abstract » devant sa déclaration.
Une méthode abstraite doit être obligatoirement déclarée « public », ce qui est logique puisque sa
vacation est d’être redéfinie dans une classe dérivée.
Les noms d’arguments muets doivent figurer dans la définition d’une méthode abstraite
Une classe dérivée d’une classe abstraite n’est pas obligée de redéfinir toutes les méthodes abstraites,
elle peut ne redéfinir aucune, mais elle reste abstraite tant qu’il y a encore des méthodes abstraites non
implémentées.
Une classe dérivée d’une classe non abstraite peut être déclarée abstraite.
Le recours aux classes abstraites facilite largement la conception orientée objet. On peut placer dans une
classe abstraite toutes les fonctionnalités dont on souhaite disposer pour les classes descendantes :
● Soit sous la forme d’une implémentation complète de méthodes (non abstraites) et de champs
(privés ou non) lorsqu’ils sont communs à tous les descendants,
● Soit sous forme d’interface de méthodes abstraites dont on est alors sûr qu’elles existeront dans
toute classe dérivée instanciable.
6.1.4 Exemple
private int x, y;
void affiche () {
Mlle I.SGHAIER 58
POO – CLASSES ABSTRAITES ET INTERFACES
//Classe dérivée1
void affiche () {
Super.affiche() ; }
double surface ()
//Classe dérivée2
{super (x,y) ;
longueur = l1 ; larg = l2 ;}
// Classe de test
class test_poly2 {
public static void main (String [] args) {
graphique [] tab = new graphique [6];
//tab[0] = new graphique (3,2); Erreur car une classe abstraite ne peut
pas être instanciée
tab[0] = new Cercle (3,2,7);
tab[1] = new Cercle (10,7,3) ;
tab[2] = new Rectangle (4,7,8,6) ;
tab[3] = new Rectangle (8,10,12,10);
tab[4] = new Cercle (8,5,3) ;
tab[5] = new Rectangle (10,17,3,8) ;
for (int i=0 ; i <=5 ; i++) {tab[i].affiche();}
}
}
Mlle I.SGHAIER 59
POO – CLASSES ABSTRAITES ET INTERFACES
=> Une classe abstraite peut ne comporter que des méthodes abstraites et aucun champ. Dans ce cas, on
peut utiliser le concept de l’interface.
- Si on considère une classe abstraite n’implantant aucune méthode et aucun champ (sauf les
constantes), on aboutit à la notion d’interface.
- Une interface définit les entêtes d’un certain nombre de méthodes, ainsi que des constantes.
- L’interface est plus riche qu’un simple cas particulier des classes abstraites :
Une classe peut implémenter plusieurs interfaces (alors qu’une classe ne pouvait dériver
que d’une seule classe abstraite).
Une classe dérivée peut implémenter 1 ou plusieurs interfaces, elle peut même
réimplémenter une interface déjà implémentée par la superclasse.
6.2.1 Syntaxe
public interface I
Toutes les méthodes d’une interface sont abstraites. On peut ne pas mentionner le modificateur de
visibilité (par défaut public) et le mot clé « abstract »
- Lorsqu’on définit une classe, on peut préciser qu’elle implémente une interface donnée en utilisant le
mot clé « implements ».
Syntaxe
Mlle I.SGHAIER 60
POO – CLASSES ABSTRAITES ET INTERFACES
public interface I1
{….}
public interface I2
{…}
6.2.1.3 Exemple
interface Affichable
{void affiche() ;
{val = n ;}
{val = n ;}
Mlle I.SGHAIER 61
POO – CLASSES ABSTRAITES ET INTERFACES
Résultat de l’exécution
Une interface peut renfermer aussi des constantes symboliques qui seront accessibles à toutes les classes
implémentant l’interface :
public interface I
L’interface est totalement indépendante de l’héritage : Une classe dérivée peut implémenter une ou
plusieurs interfaces.
Exemple
interface I1 {…..}
interface I1 {…..}
Remarque2
On peut définir une interface comme une généralisation d’une autre. On utilise alors le mot clé « extends »
Exemple
interface I1
{void f(int n) ;
Mlle I.SGHAIER 62
POO – CLASSES ABSTRAITES ET INTERFACES
interface I2 extends I1
interface I2
void f(int n) ;
Remarque3
- Conflits des noms
interface I1
{void f(int n) ;
void g();
interface I2
void g();
Exemple
Mlle I.SGHAIER 63
POO – CLASSES ABSTRAITES ET INTERFACES
interface I1
interface I2
/* Erreur car void g() et int g() ne peuvent pas coexister au sein
de la même classe*/
Mlle I.SGHAIER 64
POO – LES EXCEPTIONS
CHAPITRE 7 :
LES EXCEPTIONS
Objectifs spécifiques
1. Introduire la notion d’exception, les règles d’utilisation et de définition des exceptions.
2. Distinguer entre les exceptions prédéfinies et les exceptions définies par l’utilisateur.
Eléments de contenu
I. Définition
II. Les exceptions prédéfinies
III. Les exceptions définies par l’utilisateur
IV. Exemple
Volume Horaire :
Cours : 1 heure 30
Travaux Dirigés : 1 heure
7.1 Définitions
La notion d’exception est offerte aux programmeurs Java pour résoudre de manière efficace et simple le
problème de la gestion des erreurs émises lors de l’exécution d’un programme.
Une exception est un signal qui indique qu’un événement anormal est survenu dans un programme
- La récupération (le traitement) de l’exception permet au programme de continuer son exécution.
- Une exception est un signal déclenché par une instruction et traité par une autre
• Il faut qu’un objet soit capable de signaler ou lever (throw) une exception à un autre objet
• Il faut que l’autre objet puisse saisir (catch) une exception afin de la traiter
Lorsque l’exception se produit le contrôle est transféré à un gestionnaire d’exceptions
- Séparation de l’exécution normale de l’exécution en cas de condition anormale
Exemple
int i = 3;
int j = 1;
Mlle I.SGHAIER 65
POO – LES EXCEPTIONS
try {
System.out.println("résultat = " + (i / j));
}
catch (ArithmeticException e) {
System.out.println("erreur division par zéro");
}
}
}
Une méthode qui désire gérer ce genre de problèmes peut indiquer qu’elle est disposée à intercepter
l’exception (instruction throws).
Erreurs et Exceptions
• Erreur: indications de problèmes irrécupérables dus au matériel ou au système d’exploitation
• Exception: erreurs résiduelles dans le programme qui peuvent être traitées par une sortie propre ou une
récupération (arithmétique, pointeurs, index, i/o, etc.)
Mlle I.SGHAIER 66
POO – LES EXCEPTIONS
- Les instances de la classe Error sont des erreurs internes à la machine virtuelle Java. Elles sont rares et
fatales.
- Les sous-classes de la classe Exception sont réparties en deux catégories :
- Les exceptions d’exécution (runtime) sont souvent l’effet du manque de robustesse du code. Par exemple
l’exception NullPointerException est levée lorsque l’on manipule un objet non instancié (oubli de
l’instruction new) ;
- Les autres exceptions correspondent à des événements anormaux échappant au contrôle du programme.
Par exemple, l’exception EOFException est levée si on essaie de lire au-delà d’un fichier.
Traiter les exceptions levées : les mots clés try, catch et finally :
Intercepter une exception : le mot clé throws : Si une méthode est susceptible de lever une exception
et si elle ne peut pas la traiter, elle se doit de prévenir le système qu'elle relaye cette tâche. Pour ce faire, on
utilise le mot clé throws dans la définition de la méthode. Ce mot clé permet d'avertir le système qu'une
certaine catégorie d'exception ne sera pas traitée en local (dans l'exemple suivant, l'ensemble des
exceptions liées aux entrées/sorties).
public void ma_methode (int x) throws IOEXception {
…
}
Jusqu’à présent on parlé des exceptions prédéfinies qui se déclenchent toutes seules. Java offre au
programmeur la possibilité de définir ses propres exceptions. Ces exceptions doivent hériter d’une autre
exception de la hiérarchie des classes Java. Le programmeur doit lui-même lever ses exceptions.
Mlle I.SGHAIER 67
POO – LES EXCEPTIONS
Pour se faire Java met à sa disposition le mot-clé throw (à ne pas confondre avec throws). Pour le reste
(try, catch, finally) le mécanisme est identique.
7.4 Exemple
Voici un exemple avancé réalisé par l’éditeur Jbuilder, c’est en fait une interface utilisateur qui
permet l’insertion d’une date, en faisant les contrôles nécessaires pour afficher l’intitulé du jour.
Mlle I.SGHAIER 68
POO – LES EXCEPTIONS
Appel à l’exception
else{
if((mois==4||mois==6||mois==9||mois==11)&&(jour==31)){
throw new SaisieDateException("le jour du mois est invalid.");
}
else if(mois==2&&(jour==31||jour==30)){
throw new SaisieDateException("le jour du mois est invalid.");
}
}
Déclaration de l’exception
Mlle I.SGHAIER 69
POO – LES EXCEPTIONS
Ecrire une méthode lireNombre() demandant un nombre à l’utilisateur, le lisant sous forme de chaîne de
caractère et le transformant ensuite en entier. La méthode doit recommander un nombre tant que l’entrée
est invalide.
NB : Les exceptions susceptibles d’être renvoyées par readline() est IOException et par parseInt() est
NumberFormatException
Solution :
import java.io.*;
public class Clavier {
//Méthode qui permet de lire une chaine de caractères
public static String lireString ()
{String ligne_lue = null;
try
{InputStreamReader lecteur = new InputStreamReader(System.in);
BufferedReader entree = new BufferedReader(lecteur);
ligne_lue = entree.readLine();
}
catch(IOException err)
{System.exit(0);
}
return ligne_lue;}
Mlle I.SGHAIER 70
POO – ANNEXE
ANNEXE
71
POO – ANNEXE
EXAMEN POO
Enoncé :
Une société de vente par correspondance propose des articles dans différents rayon :
habillement, électro-ménager, vidéo/hi-fi et culturel. Chaque article est caractérisé par une
désignation (son nom), une référence (incrémenté de 1 pour un nouvel article), un descriptif, un
prix HT. Il est possible d’obtenir le prix TTC d’un article et d’afficher les informations le
concernant.
Les vêtements sont en plus définis par leur composition qui énumère les matières qui les
composent et dans quelles proportions. Le taux TVA sur les vêtements est de 19.6%. Les frais de
port sont 1 dinar par vêtement.
Les articles de l’électro-ménager et de la vidéo/hi-fi possèdent une consommation électrique, une
durée de garantie, un poids (en Kg) et des dimensions (l x h x p) en cm. Le taux TVA sur les
articles est de 19.6%. Les frais du port sont de 1 dinar tous les deux kilos majorés de 10% si le
volume de l’article dépasse 0.1 m3. La garantie est de 3 ans en électro-ménager et de 5 ans en
vidéo/hi-fi. Les articles culturels sont répartis entre livres et disques. La TVA sur les livres est de
5.5 % alors qu’elle est de 19.6 % sur les disques. Les frais de port sont nuls pour les produits
culturels.
Questions :
X Y
1
public class X{
private Y y ;
public X(parameters of X){
y= new Y(parameters of Y) ;
}}
72
POO – ANNEXE
73
POO – ANNEXE
EXAMEN POO
Enoncé :
Une agence de location de voitures offre à ses clients la possibilité de choisir la voiture
louée en fonction de différents critères.
Les voitures sont définies par une marque, un nom de modèle, une année de production et un
prix de location à la journée. Pour simplifier les deux premiers paramètres seront des objets de
la classe String et les deux derniers seront des int. Deux voitures sont considérées égales si
tous leurs attributs sont égaux.
La classe Voiture pour laquelle on souhaite disposer des méthodes habituelles equals et
toString. La méthode toString retournant une chaîne de caractères reprenant la marque, le
nom du modèle et le prix de location. La méthode equals teste si une voiture est égale à une
autre.
Il est possible de sélectionner parmi les voitures à louer toutes les voitures satisfaisant un
critère donné.
On définit l'interface Critere ainsi :
public interface Critere {
//@param v la voiture dont on teste la confirmité
// @return true si et seulement si la voiture est conforme au
//critère (on dit que v satisfait le critère)
public boolean estSatisfaitPar(Voiture v);
}
La classe Agence gère des locations des voitures. Un client ne peut louer qu'un véhicule à la
fois. On supposera pour simplifier que les clients sont identifiés par une chaîne de caractères
(leur nom par exemple).
On décide de gérer ces locations par une table (java.util.Map) qui associe les clients
représentés par leurs noms (clés) avec les voitures (valeurs) qu'ils ont louées. Un client n'est
présent dans cette table que si il loue actuellement une voiture.
74
POO – ANNEXE
Travail demandé :
Donner le code d'une classe CritereMarque qui est un critère satisfait par toutes les
voitures d'une marque donnée. La marque est précisée à la construction du critère.
Donner le code d'une classe CriterePrix qui est un critère satisfait par toutes les
voitures dont le prix est inférieur à un prix fixé à la construction du critère.
Donner le code d’une classe Voiture.
NB : Les classes CritereMarque et CriterePrix implémentent toutes les deux l’interface
Critere.
On donne ici une description des méthodes de la classe Agence :
public void loueVoiture(String client, Voiture v) throws VoitureException : permet
au client de louer la voiture v ; un client ne peut louer qu’une seule voiture, il ne
peut louer une autre que s’il rend la première. L'exception est levée soit si la
voiture n'existe pas dans l'agence soit si elle est déjà Louée.
public void afficheSelection(Critere c) : permet d’afficher toutes les voitures qui
satisfont un critère c donné qui peut être évidement un CriterePrix ou un CritereMarque.
public boolean estLoueur(String client) : renvoie true si et seulement si le client est
un client qui loue actuellement une voiture.
public boolean estLoue(Voiture v) : renvoie true si et seulement si la voiture est
actuellement louée.
public void rendVoiture(String client) :le client rend la voiture qu'il a louée. Il ne se
passe rien si il n'avait pas loué de voiture.
public Iterator lesVoituresLouees() qui renvoie la collection des voitures de
l'agence qui sont actuellement louées.
75
POO – ANNEXE
76
POO – ANNEXE
DEVOIR SURVEILLE
Class employe
- String nom
- String prenom
- Double Salaire
- int NCI
-
+ Employe()
+ Employe(int n)
+ Employe(String nom,String prenom)
+ Employe(String nom,String prenom,int n, double s)
+ decrisToi()
+ String getNom()
+ String getPrenom()
+ Double getSalaire()
+ Int getNCI()
2. Créer une classe equipe qui utilise la classe Employe. La fonction main de Equipe
comprendra la création d’un tableau de quatre employés et l’affichage de leurs noms
3. Peut-on modifier la variable d’instance nom depuis l’extérieur de la classe ? et depuis
l’intérieur ?
2ème Partie :
1. Créer une classe technicien qui hérite de la classe employe. Celle-ci comprendra une
variable d’instance supplémentaire : specialite.
a. Ecrire des constructeurs : sans arguments et à 1 seul argument « String spécialité ».
Vous utiliserez les constructeurs de la classe mère.
b. Redéfinisser la méthode decrisToi(), en faisant appel à la méthode de la classe
mère. (décris toi va afficher à l’écran : nom, prénom, spécialité).
77
POO – ANNEXE
78
POO – ANNEXE
Devoir à la maison
Travail demandé
1- Ecrire en Java la classe Liste
2- Ecrire une classe Test_Liste qui permet de créer un objet de type Liste et le manipuler à travers
l’appel des méthodes de cette classe.
79
POO – ANNEXE
DEVOIR SURVEILLE
Partie I
1. Ecrire en java la classe Robot obéissant au schéma UML suivant.
80
POO – ANNEXE
81