Vous êtes sur la page 1sur 52

Chapitre 1 : DU FONCTIONNEL A L'ORIENTEE OBJET

Objectifs :

− Connaitre les inconvenients et les limites de 1' approche fonctionnelle

− Mettre en valeur les apports de la programmation orientee objet,

essentiellement la reutilisabilite

Eléments de contenu :

✓ L'approche fonctionnelle

✓ L'approche orientee objet

1
Chapitre 1 : DU FONCTIONNEL A L'Oriente OBJET

INTRODUCTION
Le domaine de conception et de developpement de logiciels cherche toujours a
ameliorer la productivite et la qualite du logiciel. En effet, un logiciel est dit de qualite s'il
repond aux criteres suivants :
− L'exactitude : aptitude d'un programme a fournir 1e resultat voulu et a repondre
ainsi aux specifications
− Robustesse : aptitude a bien reagir lorsque l'on s'ecarte des conditions normales
d’utilisation ;
− Extensibilite : facilite avec laquelle un programme pourra etre adapte pour
repondre a l'evolution des specifications ;
− Reutilisabilite : Le logiciel peut etre utilise integralement ou en partie dans de
nouvelles applications ;
− Compatibilite : C'est la possibilite de combiner le code du logiciel a d'autres codes
;
− Portabilite : C'est la facilite d'executer le logiciel dans differentes plates-formes ;
Efficace : Cela se traduit par la bonne utilisation des ressources (temps,
memoire, etc.)
− L'efficience : temps d'execution, taille memoire
Dans ce cadre, la Programmation Orientee Objet (POO) vient remedier aux insuffisances
de l'approche fonctionnelle et propose une approche qui consolide l'ensemble des
criteres precedemment cites.
I. L'APPROCHE FONCTIONNELLE
L'approche fonctionnelle (egalement qualifiee de methodes structurees) trouve son
origine dans les langages proceduraux, Elle met en evidence les fonctions a assurer et
proposent une approche hierarchique descendante et modulaire. L'approche
fonctionnelle dissocie 1le probleme de la representation des donnees, du probleme du
traitement de celles-ci. Sur la figure 1, les donnees du probleme sont representees sur la
gauche. Des fleches transversales materialisent la manipulation de ces donnees par des
sous- fonctions. Cet acces peut-etre direct (c'est parfois le cas quand les donnees sont

2
regroupees dans une base de donnees), ou peut etre realise par le passage des
parametres depuis le programme principal

Figure 1 : Représentation graphique d'une approche fonctionnelle.


L'approche fonctionnelle souffre d'un ensemble de problemes qui se resument dans les
points suivants :
− Deformation du probleme reel.
− Absence du controle de 1'acces aux structures de donnees.
− Absence du controle de 1' appel des fonctions.
− Pas de garantie sur le fait que l'implementation respecte I ‘hierarchie des
fonctions dans la conception.
− Difficulte de modeliser tout probleme sous forme de fonction
− Difficulte de l'extensibilite.
− Difficulte de la reutilisation.
II. PROGRAMMATION ORIENTEE OBJET
La Programmation Orientee Objet (POO) represente une façon d'architecturer une
application informatique en regroupant les donnees et leurs traitements au sein des
memes entites appelees « objets ».
Ainsi la modelisation est simplifiee vu que le monde reel n'est plus represente par des
structures de donnees et des fonctions isolees (cas de la programmation classique dans
1'approche fonctionnelle) mais par des entites informatiques appelees objets en
adoptant un haut niveau d'abstraction.
L'approche orientee objet presente plusieurs avantages qui s'illustrent dans les points
Suivants ;
− Gagner en productivite et abaisser les couts.
− Augmenter la qualite des logiciels,
− Faciliter la maintenance des applications.
− Favoriser et simplifier la reutilisation.
− Rapprocher la solution informatique du probleme reel.
3
− Encapsuler les traitements afin de liberer le concepteur des details
d'implementation
III. LES CONCEPTS DE BASE DE LA POO

La POO se base principalement sur les concepts suivants : « encapsulation »,


« objet » « classe » et « heritage »

a. ENCAPSULATION

L'encapsulation est un mecanisme


consistant a rassembler les donnees et
les methodes au sein d'une structure en
cachant l’implementation de l'objet,
c'est-a-dire en empechant l'acces aux
donnees par un autre moyen que les
services proposes. L’encapsulation
permet donc de garantir l'integrite des
donnees contenues dans l'objet.

b. OBJET

L'objet represente I ‘entite qui encapsule des donnees et des traitements coherents. Les
donnees sont appelees les attributs de l'objet, alors que les traitements sont appeles les
méthodes de l'objet. En plus, chaque objet possede une identification unique qui est
indiquee par une ou plusieurs references.

c. CLASSE

Une classe represente un modele d'objets. Elle decrit leur structure unique. Les objets
sont des variables d'un tel type de classe dont chacun possede ses propres valeurs.

d. HERITAGE

L 'heritage permet de definir une nouvelle classe a partir d'une classe existante. La
nouvelle classe comporte les memes proprietes de la classe de base, auxquelles
s'ajoutent des proprietes specifiques a cette nouvelle classe.

L'heritage facilite largement la reutilisation et l'extension des applications

4
Chapitre 2 : ELEMENTS DE BASE DDU LANGAGE JAVA

Objectifs :

− Decouvrir la machine virtuelle java

− Distinguer le code binaire du byte-code

− Connaitre les elements de base du langage Java

Eléments de contenu :

✓ Presentation du langage Java

✓ Execution d'un programme Java

✓ Structure generale d'une application independante

✓ Syntaxe de Java

✓ Les types de donnees primitifs

✓ Les variables et les constantes

✓ Les structures de controle conditionnelles

✓ Les structures iteratives

✓ Les tableaux

5
Chapitre2 : ELEMENTS DE BASE DU LANGAGE JAVA
I. PRESENTATION DU LANGAGE JAVA
Le langage de programmation Java a mis au point par James Gosling chez, Sun
Microsystems au debut des annees 1990 et signifie cafe en argot americain. L’essor du
Web a incite les developpeurs a ameliorer ce langage, il a ete enrichi et est devenu tres
populaire entre autres pour la programmation.
Ce succes est du en partie au fait qu'il ne soit lie a aucune plate-forme. Concretement,
cela signifie que le programme compile peut etre execute sur tous les ordinateurs.
Cette independance distingue Java de la plupart des langages de programmations qui ont
recours a des compilateurs differents selon le systeme d'exploitation utilise. Par
exemple, un programme en C++ compile sur une machine UNIX ne pourra pas etre
execute sous Windows.
Le projet de depart de JAVA etait de proposer un langage de de programmation
independant de la machine executant le code. Pour cela, un langage machine appele
« BYTE CODE » etait definit. Ce langage est dedie au pseudo machine nommees
« Machine virtuelle JAVA (VM) ». La JVM est un programme ecrit pour chaque plateforme
particuliere (Solaris, Mac, Windows, ...) et qui connaît et execute le Byte Code JAVA.

JAVA s`inspire particulierement des langages de programmation suivants : C/C++


(syntaxe tres proche), smailtalk (tout objet) et ADA (paquetage).
II. EXECUTION D'UN PROGRAMME JAVA
L'execution d'un programme JAVA suit 3 etapes (of Figure 1) :
1.Edition du code source JAVA :
Le fichier source d'un programme JAVA est un fichier texte ecrit avec la syntaxe du
langage JAVA. Une application se compose d'un ou de plusieurs fichiers sources. Ces
fichiers possedent l'extension « .java ».
2. Compilation :
Les sources JAVA doivent etre compilees afin de generer le Byte Code. Les fichiers
generes ont l'extension « .class ».
3. interprétation :
Pour executer une application JA VA, on doit lancer une machine virtuelle en lui
specifiant ce qu'il faut executer.
6
Celle-ci va charger dynamiquement les fichiers « .class » lies a l’application et ceux des
API necessaires. Le programme va etre interprete par le JVM.

Figure 2 : Exécution d'un programme java

III. STRUCTURE GENERALE D’UNE APPLICATION INDEPENDANTE


On peut faire differents types de programmes avec Java :
• Des applications, sous forme de fenetre ou de console,
• Des applets, qui sont des programmes Java incorpores dans des pages web,
• Des applications pour appareils mobiles, avec J2ME (Java 2 Micro Edition),
• Et bien d'autres : J2EE (Java 2 Entreprise Edition), Java Media Framework APT
(JMP), J3D pour la 3D, etc.
Certaines regles de base a respecter dans un programme JAVA se presentent comme suit:
• En JAVA, tout se trouve dans une classe. Il ne peut pas y avoir de declaration ou de
codes en dehors du corps d'une classe.
• Une classe ne contient pas directement de code. Elle contient des declarations de
variables (attributs) et des fonctions (methodes).
• Une methode peut contenir du code et des declarations des variables locales
• Tout fichier source doit porter le nom de la classe publique qu`il contient avec
l'extension « .java ».
• Les arguments passes a la methode main sont contenus dans le tableau de String
args.
Exemple :
public class Premier
{
//Declaration des attributs
// Definitions des methodes
public static void main (String args [])
{
// Declaration des variables locales
System.out.println ("mon premier programme en JAVA") ;
}
}

7
IV. LA SYNTAXE DE JAVA
• Les commentaires : Il existe trois types de commentaires :
➢ //...... : commentaires sur ce qui reste de la ligne.
➢ /*.,. */ : Commentaire sur une ou plusieurs lignes.
➢ //*...*/ : commentaires utilises pat Javadoc sur une ou plusieurs lignes. Ces
Commentaires sont a inclure dans la documentation generee
automatiquement au format HTML par l'utilitaire Javadoc.
• Toutes les instructions se terminent par un ;
• Un bloc d'instructions est delimite par des accolades « {» et «} »
• Les blancs (espaces, tabulations et sauts de lignes) sont utilises entre les
elements du code source.
• Les identificateurs : un identifiant (de lasse, d'objet, de variable ...) commence par
une lettre, un trait de soulignement « _ » ou un signe dollar « $», les caracteres qui
suivent peuvent contenir des chiffres. Les identificateurs n'ont pas de longueurs
maximales et distinguent entre minuscule et majuscule.
• Convention d'écriture des identificateurs en JAVA :
− Ecrire les noms des classes avec un identificateur commençant par une
majuscule (Ex : class Personne).
− Les identificateurs de variables ou de fonctions commencent par une
minuscule (main, i, somme...).
− Si l'identificateur consiste en la juxtaposition de mots, chaque mot interne
commence par une majuscule (ex : tabPersonne).
− Les constantes symboliques sont ecrites entierement en majuscule. (Exemple :
final double PI = 3.14)
V. LES TYPES DE DONNEES PRIMITIFS (OU DE BASE)
Le tableau suivant, illustre les types primitifs (elementaires ou de base)

8
Remarque :
• Le type chaine de caractere (String) est defini comme une classe JA VA. 11 n'est pas un
type primitif.
• Il n'existe pas de conversion automatique du type boolean vers un autre type.
Exemple : int i =5 ;if (i) c'est une instruction incorrecte.
• Exemple d'APl Java : java.lang (http://java.sun.com/j2se/1.5.0/docs/apil)

VI. VARIABLES ET CONSTANTES


1) LES VARIABLES
La declaration des variables et 1eur affectation se fait de façon similaire au langage C.
Syntaxe
Type_primitif ld _var

9
Exemple :
byte j=1;
Int s=0;
Long i=40036650
float f=3.154;
double d=45.5 e35;
char c=’b’;
boolean b=true;
2) LES CONSTANTES
Une constante est declaree avec le modificateur "final". Il est obligatoire de l'initialiser
au moment de la declaration. Les identificateurs des constantes sont par convention en
majuscule.

Syntaxe

final type_primitif ID_CST = valeur _cst ;

Exemple :

final float PI=3.14;

VII. LES EXPRESSIONS


1) DEFINITION
On appelle expression (arithmetique ou logique), une combinaison entre variables et/ou
constantes par des operateurs (arithmetique ou logique).

2) LES OPERATEURS
Types des operateurs Operateurs Types des operandes
Binaire +,-,*,/,%
Arithmetique Unaire --,++ Entiers et reels
Etendus +=, -=, *=, /=
Logique !, &&, || Boolean
De comparaison (le resultat est ==, !=, <, >, <=, >= Tout type(y compris
booleen) les references
d’objet)

10
3) CONVERSION DE TYPES : LE TRANSTYPAGE (GAST)
Le transtypage est necessaire quand il risque d'y avoir perte d'information, comme lors
de l’affectation d'un entier 1ong (64 bits) a un entier int (32 bits), ou d'un reel double
vers un reel float. On force alors le type, indiquant ainsi au compilateur qu'on est
conscient du probleme de risque de perte d’information : Les conversions implicites
autorisees en JAVA sont :
byte → short → int → long → float → double
char → int → long -> -> float → double
Les conversions pouvant provoquees une perte-de valeurs ne sont pas autorisees de
maniere implicite. Elles doivent etre demandees explicitement (exemple : float vers int.)
Exemple :
Int i,j ;
short s= 2;
float f = 1,5;
i= (int) f ; /* conversion explicite obligatoire avec perte (on s'interesse qu'a la partie
entiere du reel f*/
i=s ;// conversion implicite
f=i/2 ;/* conversion implicite par operation arithmetique*/
// soit la methode int meth (int arg)
j =objectName.meth(s) ; /* conversion lors d'un passage de parametre*/
VIII. LES STRUCTURES DE CONTROLE CONDITIONNELLES
1) LA STRUCTURE IF ... ELSE

Exemple :
public static void main(String[] args){
int a = 2 ;
boolean res = (a < 5) ? true : false ;
System.out.println(res) //true
}

11
2) LA STRUCTURE SWITCH
Syntaxe :
switch(expression){
case x: // bloc d'instructions
break;
case y: // bloc d'instructions
break;
default : // bloc d'instructions
}
3) LES STRUCTURES DE CONTROLE ITERATIVES
a) LA STRUCTURE DO...WHILE
Syntaхе :
do {
traitement ;
}while (expression booleenne) ;
b) LA STRUCTURE WHILE
Syntaxe :
while(expression booleenne){
Traitement; }
c) LA STRUCTURE FOR
Syntaxe :
for(initialisation; condition; increment){ //bloc d'instructions }
Exemple :
for(int i = 0; i <= 5; i++){ //bloc d'instructions }
IX. LES TABLEAUX
Les tableaux sont utilises pour stocker plusieurs valeurs dans une seule variable, au lieu
de declarer des variables distinctes pour chaque valeur.
1) DECLARATION
Syntaxe :
Type [] nom_ tableau
Ou bien
Type nom_ tableau [] ;

12
Exemple :
int[] mon_tableau ;
int mon_tableau2[];a
Remarque :
La declaration d'un tableau n'implique pas sa creation (reservation de memoire)
2) CREATION
Syntaxe :
nom_tableau= new type [taille] ;
Exemple:
tab=new int[20];.//creation de 20 elements dans le tableau
// On peut faire la declaration avec creation
int tab[]=new int [20] ;
// Une deuxieme forme de creation (creation avec initialisation)
int [ ]tab=(1,2,3,41,6);
Exemple2:
int [] tab;
tab=new int[5];
tab[0]=1;tab[1]=2;tab[2]=2;tab[3]=4;tab[4]= 7;
int s=0;
for(int i=0;i<tab,length;i++)
s+=tab[i] ;
System.out.println("la somme des elements du tableau est" +s ; )

Remarque :
• Pour les tableaux dont le type de donnee est primitif, chaque element est
initialise par la valeur nulle du type.
• Pour les tableaux dont les elements sont des objets, chaque element est initialise
a null. Les indices des tableaux commencent par 0.
• L'attribut length permet d'extraire la longueur d'un tableau.:
• Exemple : Soit l'instruction suivante : int N = tab.length ; //N=5

13
Chapitre 3 : CLASSES ET OBJETS EN JAVA

Objectifs :

− Acquerir la competence d'identifier les classes (attributs et

methodes) dans un probleme donne

− Savoir choisir les types et les protections adequats des attributs et des

methodes

− Pouvoir distinguer clairement entre une classe et une instance (objet)

Eléments de contenu :

✓ Les classes

✓ La notion de constructeur

✓ Les objets

14
Chapitre 3 : CLASSES ET OBJETS EN JAVA
I. CONCEPTS D'OBJET ET DE CLASSE
1) DEFINITION D'OBJET
On represente le monde qui nous entoure sous la forme d'un ensemble d'objets abstraits
qui interagissent entre eux tels que : table, chaise, personne…

De point de vue de celui qui l`utilise, un objet se comporte comme une boite noire (le
contenu est masque par des controles d`acces) qui offre un certain nombre de fonctions
(methodes)permettant d`interagir avec lui,

Les donnees d'un objet sont appelees dos attributs, Elles indiquent son etat a un instant
donne. Alors que les traitements qu'offre cet objet sont appeles des méthodes. Ils
definissent son comportement.

Un objet est caracterise par trois composantes qui sont :

• Une identité : l'objet existe independamment des valeurs de ses attributs


(Reference)
• Un état interne : la valeur de ses attributs
• Un comportement : les operations qui permettent d'agir et d'interagir avec
l'objet

Exemple :

Représentation d'une personne par un objet

• Identité : existence concrète des objets de type personne


• Etat interne : attribut, nom, date de naissance et taille
• Comportement : donner son nom, donner son âge, donner sa
taille

15
2) DEFINITION DE LA CLASSE
Une classe est le support de l'encapsulation : c'est un ensemble de donnees et de
fonctions regroupees dans une meme entite. Une classe est une description abstraite
d'un objet. Les fonctions qui operent sur les donnees sont appelees des methodes.
Instancier une classe consiste a creer un objet sur son modele. Entre classe et objet il y a,
en quelque sorte, le meme rapport qu'entre type et variable.

On appelle classe la structure d'un objet, c'est-a-dire la declaration de l'ensemble des


entites qui composeront un objet, Un objet est donc "issu" d'une classe, c'est le produit
qui sort d’une moule. En realite on dit qu'un objet est une instanciation d'une classe,
c'est la raison pour laquelle on pourra parler indifferemment d’objet ou d'instance
(eventuellement d’occurrence).

Remarque :

• Par convention (en Java, le nom de la classe commence par une lettre majuscule.
• Dans le cas des noms composes de plusieurs mots, pour chaque nouveau mot
commencer par une majuscule
II. LES CLASSES
1) DECLARATION D'UNE CLASSE
En JAVA, la syntaxe de declaration d'une classe est la suivante :

Syntaxe :

[public] [abstract/final] class NomClasse


[ extends NomSuperClasse ]
[implements NomInterfacel, Interface2, …,InterfaceN ]
{
// déclaration des attributs
// déclaration des méthodes
}

16
• public : modificateurs d'acces precisant la possibilite d'utilisation par toutes les
autres classes du meme package ou package differents
• Par défaut, la classe est visible qu'a l'interieur du package ou elle est definie.
• abstract et final :deux qualificateurs en relation avec le concept d'heritage
• extends : precise l’heritage de la classe NomSuperclasse
• implements: precise l’implementation d'une ou plusieurs interfaces par la classe

Remarque :

Il ne peut y avoir qu'une seule classe publique par fichier. Cependant, il est possible
d'avoir plusieurs classes dont une classe est publique.

2) DECLARATION DES ATTRIBUTS


En JAVA, la syntaxe de declaration d'un attribut est la suivante :

Syntaxe :

[private/public/protected] [static] [final]

type_attribut nom_attribut [= valeur];

• private, public et protected: des modificateurs d'acces l’attribut a partir d'autres


classes:
➢ private indique que l'acces est reserve aux methodes de la meme classe.
➢ public donne la possibilite d'acces toutes les methodes des autres classes
➢ protected limite I ‘acces aux methodes de la meme classe, des classes derivees et
des classes du meme package
➢ par défaut, l'acces correspond a un acces prive au package (et non prive a la
classe)
• static : precise le fait qu'il y aura une seule copie de cet attribut qui est commune a
tout objet cree a partir de la classe en question (il s'agit d'un attribut de classe)
• final : indique que l'attribut est une constante

17
3) DECLARATION DES METHODES
En JAVA, la syntaxe de declaration d'une methode est la suivante :

Syntaxe

[private/public/protected] [static] [final/abstract]

type_de_retour nom_méthode([t_paramètrel paramètrel,…,


t_paramètreN paramètreN])

// déclaration des variables locales ;

[type_de_retour var_résultat;]

// instructions de la méthode

[ return var_ résultat;]

• private, public et protected: des modificateurs d'acces autorisant l'appel des


methodes de la classe a partir d'autres classes.
• static :precise que l'execution de la methode n'est pas liee aux instances de la
classe (il s'agit d'une methode de classe)
• abstract : la methode ne comporte pas de code. Par consequent toute la classe
devient abstraite.
• final : la methode ne pourra pas etre redefinie dans une classe derivee.
• Le passage des parametres est par valeur pour les arguments de type primitif (de
base) et par reference pour les arguments de type classe (reference d'objet) et les
tableaux

18
Remarque :

• Ce nom d'une methode commence par une minuscule, Dans le cas des noms de
methodes composes de plusieurs mots, le premier commence par une minuscule
et chaque nouveau mot commencer par une majuscule (exemple : setNom ())
• Le nom d'une variable locale est en minuscule (si non final)
• Une methode peut etre surchargée : definition, au sein d'une meme classe, de
plusieurs methodes portant le meme nom mais qui sont differentes au niveau des
parametres (type, ordre et nombre d'arguments)
• Modificateur : Les methodes permettant de changer la valeur de l'attribut d'un
objet, prefixees par set. Exemple : setCouleur, setMatricule
• Accesseur : Les methodes permettant de retourner la valeur d'un attribut, sont
generalement prefixees par get. Exemple : getCouleur, getMatricule.

Exemple :

class Voiture //par defaut elle est privee au package

private int matricule;

public String couleur;

public void setMatricule(int m)

{matricuie = m;}

public void setCouleur (String c)

{couleur=c ;}

public String getCouleur ()

{ return couleur ; }

19
4) ORGANISATION DES CLASSES EN PACKAGES
• Chaque definition de classe fait partir d'un package
• Un package est considere comme une bibliotheque de classes et permet de
regrouper un certain nombre de classes ayant, generalement, des roles proches.
• Les packages sont organises hierarchiquement a la maniere des repertoires.
• On peut creer des packages, ajouter des classes dans un package existant ou
utiliser des definitions de classes a partir de leurs packages.
• Le repertoire contenant vos classes simule un package.
• L'appartenance a des packages differents d'un ensemble de classes non publiques
les rend invisibles les uns aux autres.
III. LA NOTION DE CONSTRUCTEUR
Un constructeur est une méthode spéciale qui permet de creer des objets sur le
modele de la classe. Son role est d’initialiser les données membres (les attributs)de
la classe.

Nous citons dans ce qui suit les caracteristiques liees aux constructeurs :

• Le constructeur est appele lors de l'instanciation de l'objet avec l’operateur new.


• Un constructeur porte le meme nom que la classe dans laquelle il est defini.
• Un constructeur n'a pas de type de retour (meme pas void).
• Un constructeur peut avoir des arguments.
• La definition d'un constructeur n'est pas obligatoire lorsqu'il n'est pas necessaire
• Le constructeur d'une classe est appele une seule fois par objet et ce au moment de
sa creation.
• En l'absence d'un constructeur defini par le programmeur, JAVA offre un
constructeur non parametre qui initialise les attributs de l'objet cree par les nulles
correspondant a leurs types (0 pour int, null pour les references aux objets, ...).
• Le programmeur peut definir ses propres constructeurs pour initialiser certains
attributs.

20
Surcharge de constructeur :

• Un constructeur est comme toute autre methode, sujet a la surcharge des


methodes. Ainsi, une classe pourra avoir plusieurs constructeurs, L'utilite de cela
reside dans le fait que parfois certains champs de la classe ne seront pas utilises
dans nos programmes et ainsi on n`a pas besoin de les initialiser.
• La surcharge du constructeur permet de pouvoir instancier une classe de
differentes façons (souplesse d'utilisation).
• Generalement on utilise :
− Un constructeur par defaut (sans parametres).
− Plusieurs constructeurs avec parametres.
− Un constructeur de copie qui prend en parametre un objet du meme type.

Exemple :

class Voiture {

private int matricule, puissance;

public String couleur;

public Voiture (int m,String c)

{ matricule = m; couleur =c; puissance=0 ; }

public Voiture (int m)

{ this(m, "gris"); }

public Voiture ()

{ this(0); }

public Voiture (Voiture v){

matricule= v.matricule;

puissance=v.puissance ; }

public void nouvMatricule (int m)

{matricule = m;}

public void changerCouleur (String c)

{ couleur = c; }

21
IV. LES OBJETS
1) REFERENCE D'UN OBJET
• Les references d'objets sont des variables de type classe qui permettent de
designer des Objets a la maniere des pointeurs en C (sans manipulation directe
d'adresse).
• La reference qui ne pointe sur aucun objet contient la valeur "null".
• Il est possible d'avoir a un instant t, plusieurs references pour designer un meme
objet.
• Les operateurs possibles sur les references d'objets sont : new, =, ==, ! = (si deux
references designent un meme objet) et instanceof.
2) INSTANCIATION D'UN OBJET
• La creation d'un objet se fait a l'aide de l'operateur new qui se charge de :
− Allouer l'espace memoire necessaire pour stocker les attributs de l'objet en
cours de construction.
− Appeler le constructeur de l'objet adequat pour initialiser les attributs. Le
choix du constructeur se fait en fonction des parametres passes.
− Retourner une reference sur l'objet cree.

Exemple :

public class TestVoiture

public static void main (String [] args){

Voiture v1;

v1= new Voiture ();

Voiture v2 = new Voiture (8879,"Noir") ;

22
3) UTILISATION D'UN OBJET
I. Aperçu sur les droits d'acces aux membres d'un objet
• La possibilite de creer un objet depend des restrictions d'utilisation de la classe
instancier.
• La manipulation des membres (attributs/methodes) d'un objet cree suit les
restrictions d'acces de ces membres precises dans la classe.
• On ne peut acceder (consulter ou modifier) a un attribut de l'exterieur de la
classe ou il a ete defini que si on a les droits d'acces suffisants.
• On ne peut invoquer (lancer l'execution ou encore appeler) une methode de
l'exterieur de la classe la ou elle a ete definie que si on a les droits d'acces
suffisants
• On ne s'interesse aux droits d'acces qu'au niveau de la definition des classes.
II. Manipulation des attributs

On distingue deux types d'attributs :

• Attribut d'objet : declare sans le mot reserve static, Une copie de cet attribut
existe dans chaque objet. L'existence d'un tel attribut depend de l'existence des
instances de la classe.

→Les attributs d'objet sont designes selon la syntaxe suivante :

nomObjet.nomAttribut

• Attribut de classe : declare avec le mot reserve static. L'existence de cet attribut
ne depend pas des instances de la classe. S'il y a eu une instanciation, une seule
copie de cet attribut est partagee par toutes les instances.

→Les attributs de classe sont designes selon la syntaxe suivante :


nomClasse.nomAttribut

• Au sein de la classe proprietaire, on peut designer un attribut (static ou non)


uniquement par son nom

23
III. Invocation des methodes

On distingue deux types de methodes :

• Méthode d’objet : declaree sans le mot reserve static. Une copie de cette
methode est associee a chaque objet, L'execution d'une telle methode se fait
toujours pour un objet determine.

→Les methodes d'objets sont designees selon la syntaxe suivante :

nomObjet.nomMethode ()

• Méthode de classe : declaree avec le mot reserve static. L'execution d'une telle
methode ne depend pas des objets de la classe,

→Les methodes de classe sont designees selon la syntaxe suivante :

nomClasse.nomMethode ()

• Au sein de la classe proprietaire, on peut designer une methode (static ou non)s


uniquement par son nom

Exemple:

public class TestVoiture{

public static void main (String [] args){

Voiture v1;

vl = new Voiture ();

v1.nouvMatricule(555);

vl.couleur = "gris"; // accepte car couleur est public

// vl.matricule=555; //n'est pas accepte car matricule est private

24
4) REFERENCE SUR L'OBJET COURANT : « this »
• Le mot cle this represente une reference sur l'objet courant c'est-a-dire celui qui
possede la methode qui est entrain de s'executer.
• Il existe deux utilisations de this :
o Pour acceder aux attributs.
o Pour appeler un constructeur.

Exemple :

class Voiture {

private String matricule;

public String couleur;

public int puissance ;

// pour les exemples suivants

public voiture (){

matricule = "5578TN121"

couleur ="Gris" ; }

public Voiture (int matricule, String couleur){

this.matricule = matricule;

this.couleur =couleur;

puissance=10 ; }

public Voiture(int puissance){

this();//execution des 2 initialisations du constructeur par defaut */

this.puissance-puissance ; }

5) EXTRACTION DU TYPE D'UN OBJET


L'operateur instanceof permet de tester si l'objet reference est une instance d'une classe
donnee (ou d'une de ses sous-classes voir chapitre 5).
Exemple:

if (v1 instanceof Voiture)


// resultat vrai ou faux
25
6) UN OBJET COMME ATTRIBUT DANS UN AUTRE OBJET
• Les objets peuvent etre utilises comme attributs dans d'autres objets selon les
restrictions d'utilisation.
• Si l’objet jouant le role d'attribut est deja cree (utilise ailleurs), il suffit d'effectuer
une affectation entre references pour realiser le lien a travers un passage de
parametre (au niveau du constructeur ou d'une autre methode).
• Si l'utilisation de l'objet attribut est reservee a l'objet qui l'integre, l'objet attribut
doit etre cree comme tout autre objet par l'operateur new au niveau du
constructeur de la classe qui l'utilise ou meme dans l'instruction d'appel du
constructeur (ou d'une autre methode).

7) Application

public class Moteur {


private int puissance;
private String carburant;
//constructor
public Moteur(int puissance, String carburant) {

this.puissance = puissance;
this.carburant = carburant;
}
public int getPuissance() {
return puissance;
}
public void setPuissance(int puissance) {
this.puissance = puissance;
}
public String getCarburant() {
return carburant;
}
public void setCarburant(String carburant) {
this.carburant = carburant;
}

public String toString() {


return "Moteur [puissance=" + puissance +
", carburant=" + carburant + "]";
}
}

26
public class Voiture {
//attributs
private int matricule;
private String couleur;
private Moteur moteur;//attribut objet
// constructeur
public Voiture() {
this.couleur="rouge";
this.matricule=1237878;
this.moteur=new Moteur(5,"essence");
}

public Voiture(String couleur) {


this.couleur=couleur;
}
public Voiture(String couleur,int matricule) {
this.couleur=couleur;
this.matricule=matricule;
}
public Voiture(String couleur1,int matricule1,Moteur m) {
//this(couleur1,matricule1);
//this.couleur=couleur1;
//this.matricule=matricule1;
this(couleur1,matricule1);
this.moteur=m;
}
public Voiture(Moteur moteur) {
this.moteur=moteur;
}
//getter et setter
public String getCouleur() {
return couleur;
}
public void setCouleur(String couleur) {
this.couleur = couleur;
}
public Moteur getMoteur() {
return moteur;
}
public void setMoteur(Moteur moteur) {
this.moteur = moteur;
}
public int getMatricule() {
return matricule;
}
public void setMatricule(int matricule) {
this.matricule = matricule;
}

public String toString() {


return "Voiture [couleur=" + couleur + ", moteur=" + moteur + ",
matricule=" + matricule + "]";
}
}

27
Chapitre I V : LES TABLEAUX ET LES CHAINES DE
CARACTERES

Objectifs :

− Pouvoir declarer et initialiser des tableaux contenant des types

primitifs/ ou des objets

− Utiliser des boucles sur les tableaux en tenant compte de l'attribut

length du tableau

− Apprendre quelques methodes utiles de la classe String

− Comprendre et apprendre a utiliser les classes de tableaux predefinis

(Vector, ArrayList)

Eléments de contenu :

✓ Les tableaux d'objet

✓ La classe Vector, ArrayList

✓ Les tableaux de caracteres

✓ La classe String

28
Chapitre IV : LES TABLEAUX ET LES CHAINES DE
CARACTERES
I. LES TABLEAUX STATIQUES D'OBJETS
Un tableau declare a partir d'une classe, contient des references a des objets de la classe
en question. Chaque element du tableau represente une reference a un objet. Ce tableau
dispose d'une taille qui est fixee a la creation. Cette taille, une fois fixee, ne peut plus
varier, on parle de tableaux statiques.
Exemple :

public class TestVoiture{


public static void main(string args[]){
Voiture v;
Voiture t[]=new Voiture [2] ;
t[0] = new voiture(6513, "vert") ://nouvel objet
t[0].Change_couleur ("blanc") ;
t[1]=t[0] //deux références pour un même objet
v=t [1] ;//on dispose finalement d'un seul objet

II. LES TABLEAUX DYNAMIQUES D'OBJETS HETEROGENES


Differentes classes fournies dans la librairie standard Java representent des tableaux
dynamiques, c'est-a-dire des tableaux dont la taille peut varier au cours du temps. Ce
sont les classes Vector et ArrayList. Ces classes font partie du package java.util, il ne faut
donc pas oublier d'importer le package pour utiliser ces classes. Contrairement aux
tableaux, on ne declare pas le type de donnee que va contenir le tableau dynamique. Ces
tableaux ne peuvent contenir que des references vers des objets. Ce qui fait que les
objets a mettre dans l`instance de Vector et ArrayList peuvent etres de types differents.

Plusieurs methodes sont offertes dans les classes Vector et Arraylist. Pari lesquelles :

• Informations sur l'etat de la liste :


➢ int size () : Recupere le nombre d'elements dans la liste
➢ boolean isEmpty() : Permet de savoir si la liste est vide
➢ boolean contains (Object o) : Permet de savoir si la liste contient l'objet
➢ Object get (int i) : Renvoie l’objet se trouvant a l’indice i

29
• Agir sur les elements de la liste :
➢ void add (Object o) : Ajoute l’objet o en fin de liste
➢ void add (int i, Object o) : Ajoute l'objet o a l'indice i
➢ void set (int i, Object o) :Remplace l’objet de l'indice i par l'objet o
➢ Object remove (int i) : Retire l'objet de l'indice i et le renvoie
➢ boolean remove (Object o) :Relire l’objet o de la liste et renvoie true ou false
si l’objet n'existe pas dans la liste.
➢ void clear () : vide completement la liste
• En plus des methodes deja citees, il existe d'autres methodes qui sont specifiques
a la classe Vector. Pari lesquelles :
➢ void addElement (Object obj) :ajoute obj a la fin du vecteur
➢ void insertElement (Object obj,int i) :insere obj a la position i.
➢ void setelementAt(Object obj, int i) : place obj dans la position i
➢ removeElementAt (int i):supprime l’element de la position i
➢ void removeAllElements () : supprime tous les elements
➢ object elementAt (int i):retourne une reference sur l'element de la position i
➢ boolean contains (Object obj) :teste si obj existe
➢ int indexof (Object obj) : retourne la position de obj (-1- si obj n'existe pas)

Exemple :

import java.util.ArrayList;
import java.util.Vector ;
public class TestVector {
public static void main(String args []){
Vector vec = new Vector ();
for (int i=0;i<10;i++) {
Integer element = new Integer (i);
vec.addElement (element);
System.out.println(vec);
}
String l = "java";
vec.insertElementAt (l,5);
System.out.println(vec);
System.out.println(vec.elementAt(2));
String s = "cours";
vec.setElementAt(s,3);
System.out.println(vec);
if(vec.contains (s))
System.out.println(s+ " existe dans vector");

30
System.out.println(vec.indexOf(s));
System.out.println(vec.size());
vec.removeElementAt(3);
System.out.println(vec);
ArrayList list=new ArrayList ();
list.add("un");
list.add("deux");
System.out.println(list);
System.out.println(list.size());
System.out.println (list.isEmpty());
}}
Exécution :

[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, java, 5, 6, 7, 8, 9]
2
[0, 1, 2, cours, 4, java, 5, 6, 7, 8, 9]
cours existe dans vector
3
11
[0, 1, 2, 4, java, 5, 6, 7, 8, 9]
[un, deux]
2
false
III. LES CHAINES DE CARACYERES
1) TABLEAU DE CARACTERES
• Une chaîne de caractere peut etre contenue dans un tableau de caracteres. Chaque
caractere est place dans une case du tableau sans utiliser de caracteres speciaux
comme le ‘\0'.
• Cependant, cette solution n'offre pas la possibilite d'utiliser des services de
manipulation standard de chaînes de caracteres. Elle, est donc rarement utilisee.

Exemple:

class TableauChar{
public static void main (String args []){
char [] tableau;
tableau = new char [4];
tableau[0] = 'J';
tableau[1] = 'A';
tableau[2] = 'V';
tableau [3]='A';
System.out.println(tableau) ; //affiche JAVA
}
}

31
2) LA CLASSE String
• JAVA offre dans sa librairie (API) java.lang une classe appropriee aux chaines du
caracteres nommee String, tres riche en fonctionnalites.
• La classe String offre des objets constants de chaines. Cela signifie que le contenu
de I ‘objet String ne peut pas etre modifie, cependant la meme reference de l'objet
peut etre utilisee pour designer d’autres objets String.
• Les operateurs "+" et "+=" sont utilises pour realiser la concatenation des chaines

Parmi les fonctionnalites offertes par la classe String, on distingue :

➢ char charAt (int i) :retourne le caractere dans la position i


➢ boolean equals (String s) :comparaison semantique des chaines
➢ String concat (String str) : concatenation de 2 chaines
➢ int length () :retourne la longueur de la chaine
➢ int indexof (char c, int i) : retourne la position du caractere c en partant de la
position i
➢ String substring (int i, int j ): Retoume une chaine extraite de la chaine sur
laquelle est appliquee cette methode, en partant de la position i a la position j-1

Exemple:

class TestString{
public static void main (String args []) {
String ch1,ch2;
ch1="programmation";
ch2=ch1;
System.out.println("ch1:" + ch1); //programmation
System.out.println("ch2 :" + ch2); //programmation
ch1+="en java";
System.out.println("ch1:" + ch1); //programmation en java
System.out.println("ch2 :"+ ch2); //programmation
String s1 = "bonjour";
String s2 = new String ("bonjour");
System.out.println(s1.equals(s2)); //retourne la valeur true
System.out.println(s1.indexOf('o',1)); //; retourne la valeur 1
System.out.println(s1.indexOf('o',2)); //; retourne la valeur 4
System.out.println(s1.indexOf('o',5)); //: retourne la valeur -1
System.out.println(s1.substring (1,4)); //donne "onj"
}
}

32
IV. APPLICATION
Le but de cette application est de gerer un dictionnaire qui contient un ensemble de
mots. Le dictionnaire permet en particulier d'ajouter, de supprimer et de rechercher des
mots. Le dictionnaire utilise la classe MotDictiornaire suivante :

public class MotDictionnaire {


//attributs
private String mot;
private String type;//verbe ou nom
private char genre;//M: masculin, F: féminin, '' ; pour les verbe
private String definition;
//constructeur
public MotDictionnaire(String mot,String type,char genre,String definition)
{
this.mot=mot;
this.type=type;
this.genre=genre;
this.definition=definition;
}
// getter et setter
public String getMot() {
return mot;
}
public void setMot(String mot) {
this.mot=mot;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type=type;
}
public char getGenre() {
return genre;
}
public void setGenre(char genre) {
this.genre=genre;
}
public String getDefinition() {
return definition;
}
public void setDefinition(String definition) {
this.definition=definition;
}
// methode egal: comparer une chaine e caractere "s" a la valeur Mot du
//MotDictionnaire et retourne true s'ils sont egaux et false si non
public boolean egal(String s) {
if(this.mot.equals(s))
return true;
else
return false; }
public String toString() {
return "mot = "+mot+" ,type= "+type+" ,genre= "+genre+" ,definition= +definition;
}
public void affiche() {
System.out.println(toString());
}
}

33
1- Le dictionnaire possede un seul attribut (ListeMots) de type Vector, donner cet
attribut.

2- Implementer un constructeur sans parametre du dictionnaire.

3- Implementer la methode Ajouter qui permet d`ajouter un mot au dictionnaire.

4- Implementer la methode getNbMot qui retourne le nombre de mot du dictionnaire.

5- Implementer une methode Rechercher qui prend en parametre une chaine de


caracteres et affiche le MotDictionnaire correspondant a cette chaîne si elle existe, sinon
elle affiche « Mot absent du dictionnaire ».

6- Implementer la methode Supprimer qui prend en parametre une chaine de


caracteres et supprime le MotDictionnaire correspondant.

7- Implementer.la methode SupprimerTout qui supprime tous les mots du dictionnaire.

8- Implementer la methode Premier qui affiche le premier MotDictionnaire si le


dictionnaire n'est pas vide, sinon elle affiche « Le dictionnaire est vide ».

9- Implementer la methode Dernier qui affiche le dernier MotDictionnaire si le


dictionnaire n’est pas vide, sinon elle affiche « Le dictionnaire est vide »

10- Donner une classe TestDictionnaire qui permet de :

a- Ajouter ces trois mots au dictionnaire

Fait: Nom, M, evenement chose

Vague: Nom, F, ondulation a la surface de l'eau

Reussir: V, avoir un bon resultat

b- Rechercher « Fait »

c- Supprimer « Fait »

d- Afficher le premier Mot

e- Afficher le dernier Mot

f- Rechercher « Fait »

g- Supprirner « Fait »

34
h- Supprimer tout

i- Afficher le premier Mot

11- Donner le resultat de l'execution a la main de TestDictionnaire.

35
Chapitre V : HERITAGE ET POLYMORPHISME

Objectifs :

− Acquerir la capacite d'extraire les relations d'heritage entre les


classes dans un probleme donne
− Se familiariser avec les termes super-classe, sous-classe,
generalisation, specialisation
− Connaître l'utilite de la redefinition d'une methode
− Connaître les differentes formes de polymorphisme et leur apport

Eléments de contenu :

✓ Le concept de l'heritage
✓ Redefinition de methodes heritees
✓ Re-declaration des attributs
✓ Classes et methodes finales
✓ Visibilite des membres d'une classe heritee
✓ Reference d'objet
✓ Polymorphisme en Java

36
Chapitre V. HERITAGE ET POLYMORPHISME
I. CONCEPT DE L'HERITAGE
1) PRINCIPE DE BASE
On a parfois besoin de definir un type d'objets similaire a un type existant, avec quelques
proprietes supplementaires. L'heritage permet de definir ce nouveau type sans tout
reprogrammer : il suffit donc, de declarer que le nouveau type herite du precedent et on
se borne a rediger ses fonctionnalites supplementaires. L'heritage est un mecanisme
permettant de creer une nouvelle classe a partir d'une classe existante en lui proferant
ses proprietes et ses methodes.
2) INTERET
L'interet du concept d'heritage se resume dans les points suivants :
• L'heritage minimise l'ecriture du code en regroupant les caracteristiques
communes entre classes au sein d'une seule (la classe de base) sans duplication.
Donc, il assure une localisation facile, en un point unique, des sections de code.
• La rectification du code se fait dans des endroits uniques grace a la non-
repetition de description.
• L'extension ou l'ajout de nouvelles- classes est favorisee surtout en cas d'une
hierarchie de classes bien conçue.
• Il favorise le rapprochement de la modelisation des systemes d'informations aux
cas reels.
3) CONCEPT
Le concept de l'heritage specifie une relation de spécialisation/généralisation entre les
classes.
Exemple : Document : livre, revue, journal
Personne : etudiant, employe, chef
Lorsqu'une classe Employe herite d'une classe Personne :
• Employé possede toutes les caracteristiques de Personne et aussi, d'autres
caracteristiques qui lui sont specifiques
• Employé est une specialisation de Personne (un cas particulier)
• Personne est une generalisation de Employé (cas general)
• Employe est appelee classe derivee (fille)
• Personne est appelee classe de base (mere ou super-classe)

37
• Tout objet instancie d’Employe est considere, aussi comme un objet de type
Personne
• Un objet instancie de Personne peut ne pas etre de type Employe
• La representation graphique de la relation d'heritage entre les classes Personne
et Employé est comme suit :

Remarque :

➢ L'heritage est etudie par niveau (on ne s'interesse pas si la classe de base a ete,
elle-meme, derivee d’une autre classe)
➢ Une classe peut heriter de plusieurs classes : c'est l' heritage multiple (Exemple
VehiculeAmphibie herite de VehiculeMarin et VehiculeTeresstre).
➢ Une classe de base peut etre heritee par plusieurs classes (Exemple : Document :
livre, revu, journal)
II. L'HERITAGE EN JAVA
En JAVA, l'heritage est caracterise comme suit :

• L'heritage est represente par la notion d’extension : extends


• Pas d'heritage multiple entre classes, mais, il est possible avec les interfaces.
• Toutes les classes heritent de la classe Object (meme sans l'indiquer). La classe
Object est definie dans le package java.lang de l'API de JAVA. Cette classe
comporte uniquement des methodes. Donc, tout objet est considere de type
Object.
Syntaxe
[modificateur d'acces] class ClasseDerivee extends ClasseBase

38
Exemple :

public class Point {


protected float abscisse;
private float ordonnee;
// constructeur
public Point() { }
public Point(float abscisse) {this.abscisse = abscisse;}
public Point(Point p) {
this.abscisse = p.abscisse;
this.ordonnee = p.ordonnee; }
//getter et setter
public float getAbscisse() {return abscisse;}
public void setAbscisse(float abscisse) {
this.abscisse = abscisse;}
public float getOrdonnee() {return ordonnee;}

public void setOrdonnee(float ordonnee) {


this.ordonnee = ordonnee;}
//definir la methode toString()
public String toString() {
return "Point [abscisse=" + abscisse + ", ordonnee=" + ordonnee +
"]";}
public void affiche() {
System.out.println(toString());}
}
public class PointCouleur extends Point{
// les carecteristiques specifiques pour la classe derivée : PointCou-
leur
private String couleur;
public void colorer(String c) {
this.couleur=c;
}

1) DEFINITION DU CONSTRUCTEUR DE LA CLASSE DERIVEE


Le constructeur de la classe de base se charge d'initialiser les attributs herites, il
est designe par super (). Le constructeur de la classe de base est identifie selon
les parametres de super ().
L'appel du constructeur de la classe de base doit etre la premiere instruction dans
le constructeur de la classe derivee. A defaut d'appel de super (), JAVA appelle
implicitement le constructeur sans parametres de la classe de base.

39
Exemple:
class Point{
public Point (float x, float y){
abscisse = x; ordonnee =y;}
}
class PointColore extends Point {
public PointColore (float x, float y, String c) {
super (x,y) ;
couleur = c;}
}

2) ACCES AUX MEMBRES HERITES


Si les membres (attributs et methodes) herites sont declares avec le modificateur
private dans la classe de base, la classe derivee n'a pas le droit de les manipuler
directement malgre qu'ils fassent parti de sa description.

Le modificateur protected (reserve aux membres), s'il est utilise dans la classe de base
autorise la classe derivee a acceder directement a ses membres herites (acces reserves a
toutes les classes derivees a tous les niveaux, mais aussi aux classes du meme package).

Un membre herite est designe par super.membre.(si l'acces est autorise)

Exemple:

class Point{
protected float abscisse;
private float ordonnee;
public float getOrdonnee (){
return ordonnee;}}
class PointColore extends Point {
private String couleur;
public String toString(){
return "Abscisse="+super.abscisse + "Ordonnée= "+super.
getOrdonnee ()+ "Couleur="+couleur ;}}

40
III. REDEFINITION DES METHODES HERITEES
La redefinition consiste a conserver I ‘entete de la methode et a proposer un code
different. Une methode heritee peut etre redefinie si sa version initiale n'est pas
satisfaisante pour la classe derivee

Lors de la redefinition d'une methode, l'appel de l'ancienne version (celle de la classe de


base) est possible par super.nomMéthode(); et ce dans l'endroit du nouveau code que
le programmeur juge adequat:

Remarque :
• Si une methode heritee est redefinie, 'est uniquement la nouvelle version qui fait
partie de la description de la classe derivee
• Si la methode definie au niveau de la classe derivee est de type different, ou de
parametres differents, alors il s`agit d'une nouvelle methode qui s'ajoute a celle
heritee de la classe de base.
• En cas d'une conservation totale de l'entete par fa methode de la classe derivee :
Le modificateur d`acces peut etre change selon la regle suivante : du plus
restreint au plus large.
• Une methode d'objet ne pout pas etre redefinie par une methode de classe

Exemple :

class Point{
protected float abscisse;
private float ordonnee;
public float getOrdonnee (){
return ordonnee;
}
public String toString() {
return "Point [abscisse=" + abscisse + ", ordonnee=" + ordonnee + "]";}
public void afficher (){
System.out.println(toString());
}
}
class PointColore extends Point {
private String couleur;
public String toString() //Redéfinition de la méthode de Object
{return ("Abscisse= "+super.abscisse+"Ordonnée= "+super.getOrdonnee()+
"Couleur="+couleur);}
public void afficher (){ super.afficher(); System.out.println("Couleur =
"+couleur);}
}

41
IV. REDECLARATION DES ATTRIBUTS
Il est possible de declarer deux attributs portant le meme nom dans la classe de base et
dans la classe derivee. Les types et les modificateurs d'acces peuvent aussi varier. Pour
distinguer l'attribut provenant de la classe de base,l'une des façons suivantes est utilisee:

➢ Le preceder par super


➢ Le preceder par une reference de l'instance en question : ((ClasseBase)this).
En realite, l ‘instance de la classe derivee cache une instance de la classe de
base.
• Il s'agit, dans tous les cas d'une solution a eviter car elle presente beaucoup
d'ambiguite, surtout avec plusieurs niveaux d'heritage.

Exemple :

class B {
protected int x, y;
public void afficher(){
System.out.println("x= "+x+" y= "+y);}
}
class HB extends B {
private double x;
private int y, z;
public HB (double a,int b,int c) {
super ();
x=a;y=b;z=c;}
public void a£ficher() {
System.out.println("x de base = " +super.x+
" y de base "+((B)this).y +" x= "+this.x+" y="+y+"z= "+z);
}
}
class THB{s
public static void main (String [] args) {
HB hb = new HB(6.5,7,13);
hb.afficher ();
}
}

42
V. CLASSES'ET METHODES FINALES
JAVA permet d'interdire l'heritage d'une classe en la declarant avec le modificateur final.

JAVA permet d’interdire aussi, la redefinition d’une methode (si elle est heritee) en la
declarant avec le modificateur final.

VI. VISIBILITE DES MEMBRES D'UNE CLASSE HERITEE


Si le membre herite est de modificateur protected, dans ce cas, l'acces a ce membre est
permis aux :

➢ Methodes de la classe de base (faisant partie de la meme classe de definition


du membre en question),
➢ Methodes des classes derivees quel que soit leurs emplacements.
➢ Methodes du meme package.
VII. REFERENCE D'OBJET
Il est a noter qu'une reference d'une classe de base peut designer un objet d'une classe
derivee.

L'operateur de casting peut etre utilise pour convertir une reference declaree de type
classe de base en une reference de type classe derivee (pour un objet de la classe
derivee).

Exemple:

class TestpointColore{
public static void main (String [] args) {
PointColore pc;
Point p1,p2;
p1 = new PointColore(1,2,"Bleu");
pc= (PointColore) p1;
pc.afficher(); //pl.afficher()
p2=pc; // pl,p2 et pc désignent le même objet
}}

43
VIII. POLYMORPHISME EN JAVA
1) DEFINITION
Il s'agit d'invoquer (appeler) des methodes sans connaitre la nature de l'objet
correspondant. L'appel se fait a partir d'une reference du meme type que l'objet
correspondant ou de type sa classe de base (on peut remonter a tous les niveaux de ses
classes de base).

Grace au polymorphisme, une meme ecriture peut correspondre a differents appels de


methodes.

2) INTERETs
Le polymorphisme minimise l'ecriture du code et favorise la propriete d'extension des
applications. En effet, on peut creer de nouvelles sous-classes dont les instances
pourront etre prises en compte sans toucher aux programmes deja ecrits,

3) LES METHODES POLYMORPHES


Une methode polymorphie est une methode declaree dans une super-classe et redefinie
par une sous-classe.

Les methodes polymorphes permettent de prevoir des operations similaires sur des
objets de natures differentes.

N.B. Les methodes final ne peuvent etre redefinies et ne sont donc pas polymorphes.

4) MECANISME DU POLYMORPHISME - LIAISON RETARDEE


Le polymorphisme est obtenu grace a un mecanisme dynamique appele "late binding"
(liaison retardee). La methode qui sera executee est alors determinee :

➢ Seulement a l'execution, et pas des la compilation


➢ Par le type reel de l'objet qui reçoit le message et pas par le type de la
reference qui le designe.

Soit C la classe reelle d'un objet o a qui on envoie un message : o.m ()

➢ Si le code de la classe C contient la definition (ou la redefinition) d'une methode


m (), c'est cette methode qui sera executee.

44
➢ Sinon, la recherche de la methode m() se poursuit dans la classe mere de C, puis
dans la classe mere de cette classe mere, et ainsi de suite, jusqu'a trouver la
definition d'une methode m() qui est alors executee

Exemple :

import java.util.Scanner;

class Personne{
public void quiEtesVous() {
System.out.println("personne");}}
class Etudiant extends Personne {
public void quiEtesVous() {
System.out.println("étudiant");}}
class Employe extends Personne{
public void quiEtesVous() {
System.out.println("employé");}}
class Polymorphisme{
public static void main (String [] args) {
Personne p;
int x;
System.out.println("Taper 1,2 ou 3");
Scanner sc=new Scanner(System.in);
x= sc.nextInt();
if(x ==1)
p= new Personne();
else
if (x== 2)
p= new Etudiant();
else
p=new Employe();
p.quiEtesVous();//appel polymorphe
}
}

45
IX. Application
On veut gerer une bibliotheque de sons pouvant etre soit sous la forme de fichiers WAV,
soit sous la forme de fichiers MP3. Un son se caracterise par un artiste, un album, un
titre, un numero qui repere sa position dans l'album, sa longueur en seconde et sa
frequence d'echantillonnage en khz. Un son WAV comporte en plus un nombre de bits
pour sa qualite d'echantillonnage. Un son MP3 comporte en plus un debit en kbps et 2
drapeaux (booleen) pour savoir s'il est code en VBR et si la stereo est jointe
1- Implementer les differentes classes,
2- Implementer la classe bibliotheque qui contient un tableau de sons et qui permet les
operations d`ajout, de suppression, de recherche (selon 1e titre) et d'affichage des sons
contenus,
3- Implementer la classe TestBibliotheque pour tester les differentes classes.

46
Chapitre VI : LES CLASSES ABSTRAITES ET LES
INTERFACES

Objectifs :

− Connaitre l'utilite des classes abstraites

− Acquerir la capacite d'identifier les classes abstraites dans un

probleme donne

− Connaitre l'utilite des interfaces

− Acquerir la capacite d'identifier les interfaces dans un probleme

donne

− Connaitre la relation d'implementation entre classe et interface

Eléments de contenu :

✓ Les classes abstraites


✓ Les interfaces

47
I. CLASSES ABSTRAITES
1) IDEE DE BASE
Le mecanisme des classes abstraites permet de definir des comportements (methodes)
dont l'implementation est absente. En effet, l'implementation depend fortement de sous-
classes qui vont heriter de la super-classe abstraite. Cette implementation se fait donc
dans les sous-classes. Ainsi, on a l'assurance que les sous-classes respecteront le contrat
defini par la classe mere abstraite.
Exemple :
Soit la classe ‘Humain’, a partir de laquelle derivent la classe 'Homme' et la classe
‘Femme’. En toute logique, ‘Homme' et 'Femme' sont instanciables (les objets crees ont
une existence en soi), mais la classe 'Humain' sera declaree abstraite car un objet
'Humain' n'existe pas en tant que tel, puisqu'il manque l'information sur le sexe.
Ici, la classe ‘Humain' servira a implementer des methodes qui seront utilisees a la fois
pour ‘Homme' et pour 'Femme', notamment la methode getAget(), getDateNaissance()...
2) DEFINITION
• Une classe abstraite est declaree avec le mot cle abstract
• Une classe abstraite ne peut jamais etre instanciee par l'operateur new
• On peut declarer des references de type classe abstraite
• La methode abstraite est aussi declaree avec le mot cle abstract.
Exemple :
abstract class FormeGeometrique{
Point orig ; //point origine de la forme géométrique
FormeGeometrique (Point o) {orig= new Point (o);}
abstract double perimetre(); // une méthodes abstraite
}
class Cercle extends FormeGeometrique{
double rayon ;
Cercle(Point o) { super(o); }
public double perimetre() { return 2*3.14*rayon;}
}
class Rectangle extends FormeGeometrique{
double longueur , largeur;
Rectangle(Point o) { super(o); }
public double perimetre() { return 2* (longueur+ largeur) ;}
}
class polygone extends FormeGeometrique{
double a,b,c,d,e;
polygone(Point o) { super(o); }

public double perimetre() { return a+b+c+d+e;}


}

48
3) PROPRIETES
• Par opposition a une classe concrete, une classe abstraite ne peut pas etre
instancie
• Une classe abstraite sert a definir un cadre general (type abstrait), regroupant des
caracteristiques communes aux sous classes qui en seront derivees.
• Une methode d'une classe abstraite peut ne pas avoir de code (abstraite) si le
niveau d'abstraction de la classe ne permet pas de definir un code reutilisable par
les classes derivees.
• Une classe est definie abstraite par obligation (presence d'au moins une methode
abstraite) ou par choix pour interdire la creation d'objet.
• Une classe abstraite est une classe ayant au moins une methode abstraite : donc
elle peut contenir un melange de methodes abstraites et de methodes concretes
(methodes normales contenant des instructions).
• Une classe derivee d'une classe abstraite ne redefinissant pas toutes les methodes
abstraites est elle-meme abstraite.
II. LES INTERFACES
1) DEFINITION
Comparee a une classe, une interface correspond a un type comportant uniquement des
methodes abstraites et des constantes statiques (on n'a pas a preciser les proprietes
abstract, final et static).
2) PROPRIETE
Une interface est une forme particuliere de classe comportant uniquement des
proprietes abstraites.
Le concept d'interface est propose par le langage JAVA pour resoudre le probleme de
l'heritage multiple.
Une interface peut heriter de plusieurs interfaces en meme temps en utilisant le mot cle
extends (heritage multiple)
interface NomInterface extends Interfacel,…, InterfaceN

49
• Les interfaces ne sont pas instanciables
• Les interfaces en JAVA permettent de :
o Regrouper des proprietes qui peuvent etre transferees aux classes par le
mecanisme d'implementation.
o Faire du polymorphisme avec des objets dont les classes n'appartiennent
pas a la meme hierarchie d'heritage (l'interface joue le role de la classe
mere)
• Une interface est definie d'une maniere similaire a une classe mais en utilisant le
mot cle Interface.
• La syntaxe de declaration d'une interface est la suivante :
interface NomInterface {……..}
• La syntaxe d'implementation d'une interface est la suivante :
NomClasse implements NomInterface {…….}
Exemple:

50
public interface InterfaceCalcul {

abstract double calculPerimetre ();


abstract double calculsurface ();
}
class Rectangle1 implements InterfaceCalcul {
double longueur, largeur;
public double calculPerimetre() {
return 2*(longueur+largeur);}
public double calculsurface() {
return (longueur*largeur);
}
}
class Triangle implements InterfaceCalcul {
double base, hauteur,cote1,cote2;

public double calculPerimetre() {


return (base+cote1+cote2);
}

public double calculsurface() {


return (base*hauteur)/2;
}}
class TestClcul{
public static void main() {
InterfaceCalcul [] c =new InterfaceCalcul[2];
c[0]=new Triangle ();
c[1]=new Rectangle1 ();
System.out.println ("surface du rectangle"+ c[1].calculsurface());
System.out.println("surface du triangle"+ c[0].calculsurface());

}
}

51
III. Application
Soit le diagramme de classes suivant :

• La classe ProduitMagasin est composee d'un Produit et d'un Prix.


• La classe Magasin est une agregation d'un ensemble de ProduitMagasin.
Un Vector<ProduitMagasin> sera utilise pour stocker les differents
ProduitMagasin.
• La classe ProduitMagasin et la classe Magasin implementent l'interface
CalculTotal
Questions :
4- Implementer l'interface CalculTotal,
5- Implementer la classe Produit,
6- Implementer la classe Prix,
7- Implementer la classe ProduitMagasin,
8-. Implementer la classe Magasin,
9- Implementer une classe TestMagasin qui permet de tester les differentes
classes.

52

Vous aimerez peut-être aussi