Vous êtes sur la page 1sur 210

Programmation Oriente Objet

application au langage Java


Version Mai 2007

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Serli informatique
 Serli : www.serli.com
 Socit de services en informatique
 Fonde en 1981
 Situe sur le site du Futuroscope, Poitiers
 Ralisation de logiciels et assistance technique

 Domaines de comptences
 Systmes dinformations

www.serli.com

 Embarqu et temps rel


 Systmes et rseaux
 Gestion Technique de Document (GED, PDM / PLM)

 Plateformes de dveloppement (celles qui concernent les cours)


 Plateforme Java : Java EE, Java SE, Eclipse
 Plateforme Microsoft : C#, VB .NET


Cours POO - M. Baron - Page 2

Serli informatique
 Equipes impliques dans lOpen Source
 Utilisation massive de briques Open Source
 Formation / diffusion de cours concernant Java et lOpen Source
 RMLL : 7me rencontres mondiales du logiciel libre
 Solutions Linux 2007 : Salon des Solutions Open Source pour lentreprise

www.serli.com

 Membre du consortium ObjectWeb


 Gestion de projets Open Source
 JaasLounge : interoprabilit JAAS pour Java EE
 JShaft : gestion de clusters Java EE
 JWT Gen : tests fonctionnels automatiss
Cours POO - M. Baron - Page 3

Rapide historique concernant la POO


 La POO a une longue histoire
 POO ? : Programmation Oriente Objet
 Dbut en Norvge la fin des annes 60
 Simula, programmation des simulations par vnements discrets

www.serli.com

 Programmation structure pas adapte

 Dans les annes 70


 Dveloppement par Xrox du premier systme Fentres, Icnes et Souris
 SmallTalk, archtype des langages objets
 Dveloppement par Apple des premiers Mac
Cours POO - M. Baron - Page 4

Rapide historique concernant la POO


 Au cours des annes 80
 Dveloppement des ordinateurs personnels
 Intrt pour les interfaces graphiques
 Apparition de nouveaux langages
 Eiffel, fortement typ, entirement OO
 C++, extension de C, pas totalement OO
www.serli.com

 Object Pascal (Delphi) dvelopp par Borland

 Dans les annes 90, vers une maturit des concepts objets
 Standardisation de C++
 Apparition de langages comme Java ou Python
Cours POO - M. Baron - Page 5

Programmation Structure VS POO


 Objectifs de la POO
 Facilit la rutilisation de code, encapsulation et abstraction
 Facilit de lvolution du code
 Amliorer la conception et la maintenance des grands systmes
 Programmation par composants . Conception dun logiciel la
manire de la fabrication dune voiture

www.serli.com

 Programmation Structure
 Unit logique : le module
 Une zone pour les variables
 Une zone pour les fonctions
 Structuration descendante du programme
 Chaque fonction rsout une partie du problme
Cours POO - M. Baron - Page 6

Principes POO
 Programmation par Objets
 Unit logique : lobjet
 Objet est dfini par

maVoiture

 un tat

- couleur = bleue

 un comportement

- vitesse = 100

www.serli.com

 une identit
 tat : reprsent par des attributs (variables) qui stockent des valeurs
 Comportement : dfini par des mthodes (procdures) qui modifient
des tats
 Identit : permet de distinguer un objet dun autre objet
Cours POO - M. Baron - Page 7

Principes POO
 Les objets communiquent entre eux par des messages
 Un objet peut recevoir un message qui dclenche :
 une mthode qui modifie son tat
et / ou

www.serli.com

 une mthode qui envoie un message un autre objet

dmarre

ma voiture

le moteur

Cours POO - M. Baron - Page 8

Principes POO
 Notion de classe
 On regroupe les objets qui ont les mmes tats et les mmes comportements :
cest une classe
 Les classes servent de moules pour la cration des objets : un objet est
une instance dune classe
 Un programme OO est constitu de classes qui permettent de crer des
objets qui senvoient des messages
Voiture

Nom de la classe

www.serli.com

- puissance : entier
Attributs

- estDmarre : boolen
- vitesse : rel
+ deQuellePuissance() : entier

Mthodes
- Slecteur

+ demarre()

- Modificateurs

+ acclre (rel)

Visibilit

Cours POO - M. Baron - Page 9

Principes POO
 Lensemble des interactions entre les objets dfini un algorithme
 Les relations entre les classes refltent la dcomposition du
programme

Moteur

www.serli.com

Voiture

Cours POO - M. Baron - Page 10

Droulement du cours
 Structuration du cours
 Prsentation des concepts
 Illustration avec de nombreux exemples
 Des bulles daide tout au long du cours :

www.serli.com

Ceci est une alerte

Ceci est une astuce

 Mise en place du cours


 Ancien cours de Francis Jambon
 Cours de Fabrice Depaulis
 Livre : Programmer en Java 2me dition Claude Delannoy - Eyrolles
 Internet : www.developpez.com
Cours POO - M. Baron - Page 11

Organisation ...

 Partie 1 : Introduction au langage JAVA


 Partie 2 : Bases du langage
 Partie 3 : Classes et objets

www.serli.com

 Partie 4 : Hritage
 Partie 5 : Hritage et polymorphisme
 Partie 7 : Les indispensables : package, collections et
exception
Cours POO - M. Baron - Page 12

Programmation Oriente Objet


application au langage Java
Introduction au langage Java

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Rapide historique de Java


 Origine
 Cr par Sun Microsystems
 Cible : les systmes embarqus (vhicules, lectromnager, etc)
utilisant des langages ddis incompatibles entre eux

 Dates cls
 1991 : Introduction du langage Oak par James Gosling
 1993 : Monte en puissance du Web grce Mosaic (lide dadapter

www.serli.com

Java au Web fait son chemin)


 1995 : Ralisation du logiciel HotJava en Java permettant dexcuter
des applets
 1996 : NetscapeTM Navigator 2 incorpore une machine virtuelle
Java 1.0 en version beta
 1997 : Un premier pas vers une version industrielle Java 1.1
 1999 : Version industrielle de Java

Cours POO - M. Baron - Page 14

Sun voit Java comme ...


 Rfrences
 WikiPedia : fr.wikipedia.org/wiki/java_%28technologie%29
 White papers : java.sun.com/docs/white/index.html

www.serli.com

 Sun dfinit le langage Java comme


 Simple

 Sr

 Orient objet

 Portable

 Rparti

 Performant

 Interprt

 Multitches

 Robuste

 Dynamique ...

Cours POO - M. Baron - Page 15

Principe de fonctionnement de Java


 Source Java
 Fichier utilis lors de la phase de programmation
 Le seul fichier rellement intelligible par le programmeur!

 Byte-Code Java
 Code objet destin tre excut sur toute Machine Virtuelle Java
 Provient de la compilation du code source

www.serli.com

 Machine Virtuelle Java


 Programme interprtant le Byte-Code Java et fonctionnant sur un
systme dexploitation particulier
 Conclusion : il suffit de disposer dune Machine Virtuelle Java
pour pouvoir excuter tout programme Java mme s il a t compil
avec un autre systme dexploitation
Cours POO - M. Baron - Page 16

Machines Virtuelles Java ...


 Navigateurs Web, Stations de travail, Network Computers
 WebPhones
 Tlphones portables

www.serli.com

 Cartes puces
 ...

Cours POO - M. Baron - Page 17

Principales tapes dun dveloppement


 Cration du code source
Codes Sources

 A partir des spcifications (par exemple en UML)


MonProgramme.java

 Outil : diteur de texte, IDE

 Compilation en Byte-Code

javac

 A partir du code source


 Outil : compilateur Java
Byte Code

 Diffusion sur larchitecture cible


www.serli.com

MonProgramme.class

 Transfert du Byte-Code seul


 Outils : rseau, disque, etc

java

 Excution sur la machine cible


 Excution du Byte-Code
 Outil : Machine Virtuelle Java

MonProgramme

Cours POO - M. Baron - Page 18

Java et ses versions ...


 Diffrentes versions de la machine virtuelle
 Java 2 Micro Edition (Java ME) qui cible les terminaux portables
 Java 2 Standard Edition (Java SE) qui vise les postes clients
 Java 2 Enterprise Edition (Java EE) qui dfinit le cadre dun serveur
dapplication

www.serli.com

 Diffrentes finalits

Dans la suite du cours, on va


sintresser principalement aux API
fournies par Java SE

 SDK (Software Development Kit) fournit un compilateur et une machine


virtuelle
 JRE (Java Runtime Environment) fournit uniquement une machine
virtuelle. Idal pour le dploiement de vos applications.

 Version actuelle de Java


 Actuellement Java SE 6.0 ou encore appele JDK 5.0
 Bientt Java SE 7.0 (nom de code Dolphin)
Cours POO - M. Baron - Page 19

Les outils ...


 Simples diteurs ou environnements de dveloppement

www.serli.com

 Eclipse
 NetBeans
 JBuilder
 IntelliJ


 Les ressources sur Java


 Site de Java chez Sun : java.sun.com
 API (rfrence) : java.sun.com/j2se/1.5.0
 Tutorial de Sun : java.sun.com/doc/bookstutorial
 Cours et exemples : java.developpez.com
 Forum : fr.comp.lang.java

Cours POO - M. Baron - Page 20

LAPI de Java

Packages

Description
Attributs
Mthodes
www.serli.com

Classes

Cours POO - M. Baron - Page 21

Ouvrages dinitiation
 Programmer en Java (2me dition)
 Auteur : Claude Delannoy
 diteur : Eyrolles
 Edition : 2002 - 661 pages - ISBN : 2212111193

www.serli.com

 Java en action
 Auteur : Ian F. Darwin
 diteur : OReilly
 Edition : 2002 - 836 pages - ISBN : 2841772039

 Apprendre Java et C++ en parallle


 Auteur : Jean-Bernard Boichat
 diteur : Eyrolles
 Edition : 2003 - 742 pages - ISBN : 2212113277
Cours POO - M. Baron - Page 22

Ouvrages de rfrence

www.serli.com

 Ouvrages thmatiques aux ditions OReilly sur une slection des


Packages Java (certains traduits en Franais)

 Ouvrages de rfrence de SUN aux ditions Paperback


(en anglais uniquement)

Cours POO - M. Baron - Page 23

Programmation Oriente Objet


application au langage Java
Bases du langage

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Premier exemple de programme en Java


public class PremierProg {
public static void main (String[] argv) {
System.out.println("Ola, mon Premier Programme");
}
}

 public class PremierProg


 Nom de la classe

 public static void main


www.serli.com

 La fonction principale quivalent la fonction main du C/C++

 String[] argv
 Permet de rcuprer des arguments transmis au programme au
moment de son lancement

 System.out.println("Ola ")
 Mthode d'affichage dans la fentre console
Cours POO - M. Baron - Page 25

Mise en uvre
 Pas de sparation entre dfinition et codage des oprations
 Un seul fichier NomDeClasse.java
 Pas de fichier den tte comme C/C++

 Compilation

Nom de la classe = Nom du fichier java

 javac NomDeClasse.java ou javac *.java quand plusieurs classes

www.serli.com

 Gnration dun fichier Byte-Code NomDeClasse.class


 Pas ddition de liens (seulement une vrification)

 Excution
 java NomDeClasse

Ne pas mettre lextension .class


pour lexcution

 Choisir la classe principale excuter


Cours POO - M. Baron - Page 26

Types primitifs de Java


 Ne sont pas des objets !!!
 Occupent une place fixe en mmoire rserve la dclaration
 Types primitifs :
 Entiers : byte (1 octet) - short (2 octets) - int (4 octets) - long (8 octets)
 Flottants (norme IEEE-754) : float (4 octets) - double (8 octets)
 Boolens : boolean (true ou false)

www.serli.com

 Caractres : char (codage Unicode sur 16 bits)

 Chacun des types simples possde un alter-ego objet disposant de


mthodes de conversion ( voir dans la partie Classes et Objets)
 Lautoboxing introduit depuis la version 5.0 convertit de manire
transparente les types primitifs en rfrences
Cours POO - M. Baron - Page 27

Initialisation et constantes
 Initialisation
 Une variable peut recevoir une valeur initiale au moment de sa dclaration :
int n = 15;
boolean b = true;

 Cette instruction joue le mme rle :


int n;
n = 15;
boolean b;
b = true;

Penser linitialisation au risque


dune erreur de compilation
int n;
System.out.println(" n = " + n);

www.serli.com

 Constantes
 Ce sont des variables dont la valeur ne peut affecte qu'une fois
 Elles ne peuvent plus tre modifies
 Elles sont dfinies avec le mot cl final
final int n = 5;
final int t;
...
t = 8;
n = 10; // erreur : n est dclar final

Cours POO - M. Baron - Page 28

Structure de contrle
 Choix
 Si alors sinon : if condition {} else {}

 Itrations

Il ny a pas de mot-cl then


dans la structure Choix

 Boucle : for (initialisation ; condition ; modification) { }


 Tant que : while (condition) {}

www.serli.com

 Faire jusqu : do {} while (condition)


 Slection borne
 Selon faire : switch identificateur { case valeur0 : case valeur1 :
default: }
 Le mot cl break demande sortir du bloc

Penser vrifier si break est


ncessaire dans chaque case
Cours POO - M. Baron - Page 29

Structure de contrle
 Exemple : structure de contrle

www.serli.com

public class SwitchBreak {


public static void main (String[] argv) {
int n = ...;
System.out.println("Valeur de n :" + n);
switch(n) {
case 0 : System.out.println("nul");
break;
case 1 :
case 2 : System.out.println("petit");
case 3 :
case 4 :
case 5 : System.out.println("moyen");
break;
default : System.out.println("grand");
}
System.out.println("Adios...");
}
}

 Faisons varier n :
Valeur de n : 0
nul
Adios...
Valeur de n : 1
petit
moyen
Adios...

Valeur de n : 6
grand
Adios...

Se demander si
break est ncessaire
Cours POO - M. Baron - Page 30

Oprateurs sur les types primitifs


 Oprateurs arithmtiques





Unaires : +a, -b
Binaires : a+b, a-b, a*b, a%b
Incrmentation et dcrmentation : a++, b--
Affectation largie : +=, -=, *=, /=

 Oprateurs comparaisons

www.serli.com

 a==b, a!=b, a>b, a<b, a>=b, a<=b

Attention : erreur
boolean t = true;
if (t == true) {...}

Prfrer :
boolean t = true;
if (t) {...}

 Oprateurs logiques
 Et : a && b , a & b
 Ou : a || b , a | b

 Conversion de type explicite (cast)


 (NouveauType)variable
Cours POO - M. Baron - Page 31

Oprateurs sur les types primitifs


 Exemple du Loto
 Pas optimis mais montrer lutilisation des concepts prcdents
public class ExempleTypesPrimitifs {
public static void main (String[] argv) {
int compteur = 0;

A voir plus tard

while(compteur != 100) {
// Prend un nombre alatoire
double nbreAleatoir = Math.random() * 1000;
// Etablie un index de 0 10
int index = compteur % 10;
www.serli.com

// Construction de laffichage
System.out.println("Index:" + index +
"Nbre Alatoir:" + (int)nbreAleatoir);
// Incrmentation de la boucle
compteur+= 1;
}
}
}

Cours POO - M. Baron - Page 32

Affectation, recopie et comparaison


 Affecter et recopier un type primitif
 a=b signifie a prend la valeur de b
 a et b sont distincts
 Toute modification de a nentrane pas celle de b
 Comparer un type primitif

www.serli.com

 a == b retourne true si les valeurs de a et b sont identiques

a=b

Cours POO - M. Baron - Page 33

Les tableaux en Java


 Les tableaux sont considrs comme des objets
 Fournissent des collections ordonnes dlments
 Les lments dun tableau peuvent tre :
 Des variables dun type primitif (int, boolean, double, char, )

www.serli.com

 Des rfrences sur des objets ( voir dans la partie Classes et Objets)

 Cration dun tableau


1 Dclaration = dterminer le type du tableau
2 Dimensionnement = dterminer la taille du tableau
3 Initialisation = initialiser chaque case du tableau
Cours POO - M. Baron - Page 34

Les tableaux en Java : Dclaration


1 Dclaration
 La dclaration prcise simplement le type des lments du tableau
int[] monTableau;

monTableau

null

 Peut scrire galement

www.serli.com

int monTableau[];

Attention : une dclaration de tableau ne doit pas


prciser de dimensions
int monTableau[5]; // Erreur

Cours POO - M. Baron - Page 35

Les tableaux en Java : Dimensionnement


2 Dimensionnement
 Le nombre dlments du tableau sera dtermin quand lobjet tableau sera
effectivement cr en utilisant le mot cl new
 La taille dtermine la cration du tableau est fixe, elle ne pourra plus tre
modifie par la suite
 Longueur dun tableau : monTableau.length

www.serli.com

int[] monTableau; // Dclaration


monTableau = new int[3]; // Dimensionnement

 La cration dun tableau par new


 Alloue la mmoire en fonction du type de tableau et de la taille
 Initialise le contenu du tableau 0 pour les types simples
monTableau

0
Cours POO - M. Baron - Page 36

Les tableaux en Java : Initialisation


3 Initialisation
 comme en C/C++ les indices commencent zro
 laccs un lment dun tableau seffectue suivant cette forme
monTab[varInt]; // varInt >= 0 et <monTab.length

www.serli.com

 Java vrifie automatiquement lindice lors de laccs (lve une exception)


monTab[0] = 1;

monTableau

monTab[1] = 2;

monTableau

monTab[2] = 3;

monTableau

 Autre mthode : en donnant explicitement la liste de ses lments entre {}


int[] monTab = {1, 2, 3}

 est quivalent
monTab = new int[3];
monTab[0] = 1; monTab[1] = 2; monTab[2] = 3;

Cours POO - M. Baron - Page 37

Les tableaux en Java : Synthse


1 Dclaration
int[] monTableau;

2 Dimensionnement
monTableau = new int[3];

Ou 12 et 3
int[] monTab = {1, 2, 3};

www.serli.com

3 Initialisation
monTableau[0] = 1;
monTableau[1] = 2;
monTableau[2] = 3;

for (int i = 0; i < monTableau.length; i++) {


System.out.println(monTableau[i]);
}

Cours POO - M. Baron - Page 38

Les tableaux en Java : Multidimensionnels


 Tableaux dont les lments sont eux mmes des tableaux
 Dclaration
type[][] monTableau;

tab

null

 Tableaux rectangulaires
 Dimensionnement :
tab
monTableau = new type[2][3]

www.serli.com

 Tableaux non-rectangulaires
 Dimensionnement :

tab

monTableau = new type[2]

monTableau[0] = new type[2]


monTableau[1] = new type[3]

null
null

tab

Cours POO - M. Baron - Page 39

Petite prcision du System.out.println()


 Usages : affichage lcran
 System.out.println() : revient la ligne
 System.out.print() : ne revient pas la ligne

 Diffrentes sorties possibles


 out sortie standard
 err sortie en cas derreur (non temporise)

 Tout ce que lon peut afficher


www.serli.com

 Objets, nombres, boolens, caractres,

 Tout ce que l on peut faire


 Concatnation sauvage entre types et objets avec le +
System.out.println("a=" + a + "donc a < 0 est " + a < 0);

Cours POO - M. Baron - Page 40

Commentaires et mise en forme


 Documentation des codes sources :
 Utilisation des commentaires
// Commentaire sur une ligne complte
int b = 34; // Commentaire aprs du code
/* Le dbut du commentaire
** Je peux continuer crire
Jusqu ce que le compilateur trouve cela */

 Utilisation de loutil Javadoc ( voir dans la partie les Indispensables)

www.serli.com

 Mise en forme
 Facilite la relecture
 Crdibilit assure !!!!
 Indentation chaque niveau de bloc

if (b == 3) {
if (cv == 5) {
if (q) {
...
} else {
...
}
...
}
...
}

Prfrer

if (b == 3) {
if (cv == 5) {
if (q) {
...
} else {...}
...
}
...
}

viter

Cours POO - M. Baron - Page 41

Programmation Oriente Objet


application au langage Java
Classes et Objets

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Classe et dfinition
 Une classe est constitue :
 Donnes ce qu'on appelle des attributs
 Procdures et/ou des fonctions ce qu'on appelle des mthodes

 Une classe est un modle de dfinition pour des objets


 Ayant mme structure (mme ensemble d'attributs)
 Ayant mme comportement (mme mthodes)

www.serli.com

 Ayant une smantique commune


 Les objets sont des reprsentations dynamiques (instanciation), du

modle dfini pour eux au travers de la classe


 Une classe permet d'instancier (crer) plusieurs objets
 Chaque objet est instance d'une classe et une seule
Cours POO - M. Baron - Page 43

Classe et notation UML

Voiture

Nom de la classe

- puissance : entier
Attributs

- estDmarre : boolen
- vitesse : rel

www.serli.com

Mthodes
- Slecteur
- Modificateurs

+ deQuellePuissance() : entier
+ demarre()
+ acclre (rel)

Visibilit
Cours POO - M. Baron - Page 44

Codage de la classe Voiture


Nom de la classe
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;

Attributs

public int deQuellePuissance() {


return puissance;
}

Slecteur

www.serli.com

public void demarre() {


estDemarree = true;
}
public void accelere(double v) {
if (estDemarree) {
vitesse = vitesse + v
}
}

Modificateurs
}

Cours POO - M. Baron - Page 45

Classe et visibilit des attributs


 Caractristique dun attribut :
 Variables globales de la classe
 Accessibles dans toutes les mthodes de la classe
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;
public int deQuellePuissance() {
return puissance;
}

Attributs visibles
dans les mthodes

www.serli.com

public void demarre() {


estDemarree = true;
}
public void accelere(double v) {
if (estDemarree) {
vitesse = vitesse + v
}
}
}

Cours POO - M. Baron - Page 46

Distinction entre attributs et variables


 Caractristique dune variable :
 Visible lintrieur du bloc qui le dfinit
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;
public int deQuellePuissance() {
return puissance;
}

www.serli.com

public void demarre() {


estDemarree = true;
}

Variable visible uniquement


dans cette mthode

Variable peut tre dfinie


nimporte o dans un bloc

public void accelere(double v) {


if (estDemarree) {
double avecTolerance;
avecTolerance = v + 25;
vitesse = vitesse + avecTolerance
}
}
}

Cours POO - M. Baron - Page 47

Quelques conventions en Java : de la rigueur et de la


classe
 Conventions de noms
 CeciEstUneClasse
 celaEstUneMethode()
 jeSuisUneVariable
 JE_SUIS_UNE_CONSTANTE

 Un fichier par classe, une classe par fichier


www.serli.com

 Classe Voiture dcrite dans le fichier Voiture.java


 Il peut exceptionnellement y avoir plusieurs classes par fichier
(cas des Inner classes)

Respecter les minuscules et


les majuscules des noms
Cours POO - M. Baron - Page 48

Objet et dfinition
 Un objet est instance dune seule classe :
 Se conforme la description que celle-ci fournit
 Admet une valeur propre lobjet pour chaque attribut dclar dans la classe
 Les valeurs des attributs caractrisent ltat de lobjet

www.serli.com

 Possibilit de lui appliquer toute opration (mthode) dfinie dans la classe

 Tout objet est manipul et identifi par sa rfrence


 Utilisation de pointeur cach (plus accessible que le C++)
 On parle indiffremment dinstance, de rfrence ou dobjet
Cours POO - M. Baron - Page 49

Objet et notation UML


 maClio est une instance de la classe Voiture
Reprsentation
explicite de la classe

Voiture
Relation dinstanciation
instance of

www.serli.com

Nom de lobjet, rfrence


ou de linstance

maClio
- puissance = 4
- estDemarre = true
- vitesse = 179.8

Valeurs des
attributs qui
caractrisent
ltat de lobjet
maClio
Cours POO - M. Baron - Page 50

tats des objets


 Chaque objet qui est une instance de la classe Voiture possde ses
propres valeurs dattributs
Voiture

www.serli.com

instance of

ladaBerline110

maClio

205Gti

- puissance = 6

- puissance = 4

- puissance = 6

- estDmarre = false

- estDmarre = true

- estDmarre = true

- vitesse = 0

- vitesse = 179.8

- vitesse = 250
Cours POO - M. Baron - Page 51

Affectation et comparaison
 Affecter un objet
 a = b signifie a devient identique b
 Les deux objets a et b sont identiques et toute modification de a entrane
celle de b

 Comparer deux objets


 a == b retourne true si les deux objets sont identiques

www.serli.com

 Cest--dire si les rfrences sont les mmes, cela ne compare pas les
attributs

a=b



Cours POO - M. Baron - Page 52

Affectation et comparaison
 Lobjet maClio et saClio ont les mmes attributs (tats identiques)
mais ont des rfrences diffrentes
 maClio != saClio
Voiture

www.serli.com

Le test de comparaison (== et !=)


entre objets ne concerne que les
rfrence et non les attributs!!!!

instance of

saClio

maClio

- puissance = 4

- puissance = 4

- estDmarre = true

- estDmarre = true

- vitesse = 179.8

- vitesse = 179.8
Cours POO - M. Baron - Page 53

Affectation et comparaison
 Recopier les attributs dun objet clone()
 Les deux objets a et b sont distincts
 Toute modification de a nentrane pas celle de b

recopie

www.serli.com

 Comparer le contenu des objets : equals(Object o)


 Renvoyer true si les objets a et b peuvent tre considrs comme
identique au vu de leurs attributs

Recopie et comparaison dans les


parties suivantes

Cours POO - M. Baron - Page 54

Structure des objets


 Un objet est constitu dune partie statique et dune partie
dynamique
 Partie statique
 Ne varie pas dune instance de classe une autre
 Permet dactiver lobjet

www.serli.com

 Constitue des mthodes de la classe

 Partie dynamique
 Varie dune instance de classe une autre
 Varie durant la vie dun objet
 Constitue dun exemplaire de chaque attribut de la classe
Cours POO - M. Baron - Page 55

Cycle de vie dun objet


 Cration
 Usage dun Constructeur
 Lobjet est cr en mmoire et les attributs de lobjet sont initialiss

 Utilisation
 Usage des Mthodes et des Attributs (non recommand)
 Les attributs de lobjet peuvent tre modifis

www.serli.com

 Les attributs (ou leurs drivs) peuvent tre consults

Lutilisation dun objet non


construit provoque une exception
de type NullPointerException

 Destruction et libration de la mmoire lorsque :


 Usage (ventuel) dun Pseudo-Destructeur
 Lobjet nest plus rfrenc, la place mmoire quil occupait est rcupre
Cours POO - M. Baron - Page 56

Cration dobjets : droulement


 La cration dun objet partir dune classe est appele une
instanciation.
 Lobjet cr est une instance de la classe

monObjet

null

 Dclaration
 Dfinit le nom et le type de l objet

www.serli.com

 Un objet seulement dclar vaut null


(mot rserv du langage)

monObjet

 Cration et allocation de la mmoire


 Appelle de mthodes particulires : les constructeurs
 La cration rserve la mmoire et initialise les attributs

 Renvoi dune rfrence sur lobjet maintenant cr

attribut 1

attribut n

 monObjet != null
Cours POO - M. Baron - Page 57

Cration dobjets : ralisation


 La cration dun objet est ralise par new Constructeur(paramtres)
 Il existe un constructeur par dfaut qui ne possde pas de paramtre
(si aucun autre constructeur avec paramtre nexiste)

Les constructeurs portent le mme


nom que la classe
public class TestMaVoiture {

Dclaration
www.serli.com

public static void main (String[] argv) {


// Dclaration puis cration
Voiture maVoiture;
maVoiture = new Voiture();

Cration et
allocation mmoire

// Dclaration et cration en une seule ligne


Voiture maSecondeVoiture = new Voiture();
}
}

Cours POO - M. Baron - Page 58

Cration dobjets : ralisation


 Exemple : construction dobjets
public class TestMaVoiture {
public static void main (String[] argv) {
// Dclaration puis cration
Voiture maVoiture;
maVoiture = new Voiture();

Dclaration

// Dclaration dune deuxime voiture


Voiture maVoitureCopie;
// Attention!! pour linstant maVoitureCopie vaut null

www.serli.com

// Test sur les rfrences.


if (maVoitureCopie == null) {

Affectation par
rfrence

// Cration par affectation dune autre rfrence


maVoitureCopie = maVoiture
// maVoitureCopie possde la mme rfrence que maVoiture
}
...
}}

Cours POO - M. Baron - Page 59

Le constructeur de Voiture
 Actuellement
 On a utilis le constructeur par dfaut sans paramtre
 On ne sait pas comment se construit la Voiture
 Les valeurs des attributs au dpart sont indfinies et identique pour chaque
objet (puissance, etc.)

 Rle du constructeur en Java

Les constructeurs portent le mme


nom que la classe et nont pas de
valeur de retour

www.serli.com

 Effectuer certaines initialisations ncessaires pour le nouvel objet cr

 Toute classe Java possde au moins un constructeur


 Si une classe ne dfinit pas explicitement de constructeur, un constructeur
par dfaut sans arguments et qui neffectue aucune initialisation particulire
est invoque
Cours POO - M. Baron - Page 60

Le constructeur de Voiture
 Le constructeur de Voiture
 Initialise vitesse zro
 Initialise estDmaree faux
 Initialise la puissance la valeur passe en paramtre du constructeur
public class Voiture {

www.serli.com

private int puissance;


private boolean estDemarree;

Constructeur
avec un
paramtre

private double vitesse;


public Voiture(int p) {
puissance = p;
estDemaree = false;
vitesse = 0;
}
...
}

Cours POO - M. Baron - Page 61

Construire une Voiture de 7 CV


 Cration de la Voiture :
 Dclaration de la variable maVoiture
 Cration de lobjet avec la valeur 7 en paramtre du constructeur
public class TestMaVoiture {
public static void main(String[] argv)

Dclaration

// Dclaration puis cration


Voiture maVoiture;

www.serli.com

maVoiture = new Voiture(7);


Voiture maSecVoiture;
// Sous entendu quil existe
// explicitement un constructeur : Voiture(int)

Cration et
allocation mmoire
avec Voiture(int)

maSecVoiture = new Voiture(); // Erreur


}
}

Cours POO - M. Baron - Page 62

Constructeur sans arguments


 Utilit :
 Lorsque lon doit crer un objet sans pouvoir dcider des valeurs de ses
attributs au moment de la cration
 Il remplace le constructeur par dfaut qui est devenu inutilisable ds quun
constructeur (avec paramtres) a t dfini dans la classe
public class Voiture {
private int puissance;
private boolean estDemarree;
private double vitesse;

public class TestMaVoiture {


public static void main (String[] argv) {

www.serli.com

public Voiture() {
puissance = 4;
estDemaree = false;
vitesse = 0;
}
public Voiture(int p) {
puissance = p;
estDemaree = false;
vitesse = 0;
}...
}

// Dclaration puis cration


Voiture maVoiture;
maVoiture = new Voiture(7);
Voiture maSecVoiture;
maSecVoiture = new Voiture(); // OK
}
}

Cours POO - M. Baron - Page 63

Constructeurs multiples
 Intrts
 Possibilit dinitialiser un objet de plusieurs manires diffrentes
 On parle alors de surchage (overloaded)
 Le compilateur distingue les constructeurs en fonction :
 de la position des arguments
 du nombre

www.serli.com

 du type

public class Voiture {


...
public Voiture() {
puissance = 4; ...
}

Chaque constructeur possde le


mme nom (le nom de la classe)

public Voiture(int p) {
puissance = p; ...
}
public Voiture(int p, boolean estDemaree) {
...
}

Cours POO - M. Baron - Page 64

Accs aux attributs


 Pour accder aux donnes dun objet on utilise une notation pointe
identificationObjet.nomAttribut

public class TestMaVoiture {


public static void main (String[] argv) {
// Dclaration puis cration
Voiture v1 = new Voiture();
Voiture v2 = new Voiture();

www.serli.com

// Accs aux attributs en criture


v1.puissance = 110;
// Accs aux attributs en lecture
System.out.println("Puissance de v1 = "

+ v1.puissance);

}
}

Il nest pas recommand daccder


directement aux attributs dun objet
Cours POO - M. Baron - Page 65

Envoi de messages : appel de mthodes


 Pour demander un objet deffectuer un traitement il faut lui
envoyer un message
 Un message est compos de trois parties
 Une rfrence permettant de dsigner lobjet qui le message est envoy
 Le nom de la mthode ou de lattribut excuter

www.serli.com

 Les ventuels paramtres de la mthode


identificationObjet.nomDeMethode( Paramtres ventuels )

 Envoi de message similaire un appel de fonction


 Le code dfini dans la mthode est excut
 Le contrle est retourn au programme appelant
Cours POO - M. Baron - Page 66

Envoi de messages : appel de mthodes


Voiture
-
Ne pas oublier les parenthses
pour les appels aux mthodes

public class TestMaVoiture {


public static void main (String[] argv) {
// Dclaration puis cration
Voiture maVoiture = new Voiture();

+ deQuellePuissance() : entier
+ demarre()
+ acclre (rel)
+

Envoi dun message


lobjet maVoiture
Appel dun modificateur

www.serli.com

// La voiture dmarre
maVoiture.demarre();
if (maVoiture.deQuellePuissance() == 4) {
System.out.println("Pas trs Rapide");
}

Envoi dun message


lobjet maVoiture

// La voiture acclre
maVoiture.acclre(123.5);

Appel dun slecteur

}
}

Cours POO - M. Baron - Page 67

Envoi de messages : passage de paramtres


 Un paramtre dune mthode peut tre
 Une variable de type simple
 Une rfrence dun objet type par nimporte quelle classe

 En Java tout est pass par valeur


 Les paramtres effectifs dune mthode
 La valeur de retour dune mthode (si diffrente de void )

 Les types simples


www.serli.com

 Leur valeur est recopie


 Leur modification dans la mthode nentrane pas celle de loriginal

 Les objets
 Leur rfrence est recopie et non pas les attributs
 Leur modification dans la mthode entrane celle de loriginal!!!
Cours POO - M. Baron - Page 68

Envoi de messages : passage de paramtres


 Exemple
public class TestMaVoiture {
public static void main (String[] argv) {
// Dclaration puis cration 1
Voiture maVoiture = new Voiture();
// Dclaration puis cration 2
Voiture maSecondeVoiture = new Voiture();

www.serli.com

// Appel de la mthode compare(voiture) qui


// retourne le nombre de diffrence
int p = maVoiture.compare(maSecondeVoiture);

Rfrence comme
paramtre

System.out.println("Nbre diffrence :" + p);


}

Voiture

Appel dun slecteur avec


passage dune rfrence

+ acclre (rel)
+ compare (Voiture) : entier
+
Cours POO - M. Baron - Page 69

Lobjet courant
 Lobjet courant est dsign par le mot cl this
 Permet de dsigner lobjet dans lequel on se trouve
 self ou current dans dautres langages
 Dsigne une rfrence particulire qui est un membre cach

Ne pas tenter daffecter une


nouvelle valeur this !!!!
www.serli.com

this = ... ; // Ne pas y penser

 Utilit de lobjet courant


 Rendre explicite laccs aux propres attributs et mthodes dfinies dans la
classe
 Passer en paramtre dune mthode la rfrence de lobjet courant
Cours POO - M. Baron - Page 70

Lobjet courant : attributs et mthodes


 Dsigne des variables ou des mthodes dfinies dans une classe
public class Voiture {
...
private boolean estDemarree;
private double vitesse;

www.serli.com

public int deQuellePuissance() {


...
}
public void accelere(double vitesse) {
if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}

Dsigne la variable vitesse

Dsigne lattribut vitesse


Dsigne lattribut demarree

this nest pas ncessaire lorsque les


identificateurs de variables ne
prsentent aucun quivoque
Cours POO - M. Baron - Page 71

Le retour dUML
 Association : les objets sont smantiquement lis
 Exemple : une Voiture est conduite par un Conducteur

 Agrgation : cycle de vie indpendant


Les losanges sont attachs
la classe qui contient

 Exemple : une Voiture et une Galerie

www.serli.com

 Composition : cycle de vie identiques


 Exemple : une Voiture possde un Moteur qui dure la vie de la Voiture
Association
Composition
Voiture

0..1

0..1

Conducteur

Agrgation
4..5

Roue

Moteur

0..1

Galerie
Cours POO - M. Baron - Page 72

Codage de l'association : composition


 L'objet de classe Voiture peut envoyer des messages l'objet de
classe Moteur : Solution 1
Attribut qui stocke la
rfrence du moteur
Voiture
public class Voiture {

www.serli.com

private Moteur leMoteur;


...
public Voiture(int p) {
leMoteur = new Moteur(p);
...
}
...

Moteur
}

A discuter : si le moteur
dune voiture est mort ,
il y a la possibilit de le
changer

Cration de l'objet
Moteur
Cours POO - M. Baron - Page 73

Codage de l'association : composition


 L'objet de classe Moteur n'envoie pas de message l'objet de
classe Voiture : Solution 1
Attribut qui stocke la
puissance
Voiture
public class Moteur {

www.serli.com

private int puissance;


...
public Moteur(int p) {
puissance = p;
...
}
...

Moteur
}

La puissance est donne


lors de la construction
Cours POO - M. Baron - Page 74

Codage de l'association : composition


 Il peut tre ncessaire que les deux objets en composition
s'changent des messages : Solution 2
 Lobjet Voiture voit lobjet Moteur

Attribut qui stocke la


rfrence du Moteur

public class Voiture {

Voiture

www.serli.com

private Moteur leMoteur;


...

Moteur

public Voiture(int p) {
leMoteur = new Moteur(p,this);
...
}
...
}

Cration de lobjet
Moteur

Transmission de la
rfrence de
lobjet courant
Cours POO - M. Baron - Page 75

Codage de l'association : composition


 Il peut tre ncessaire que les deux objets en composition
s'changent des messages : Solution 2
 Lobjet Moteur voit lobjet Voiture

Attribut qui stocke la


puissance

public class Moteur {


private int puissance;
private Voiture laVoiture;
...

www.serli.com

Voiture

public Moteur(int p, Voiture v) {


puissance = p;
laVoiture = v;
...
}
...

Moteur

La puissance est donne


lors de la construction

Rfrence dun objet


Voiture en paramtre

Cours POO - M. Baron - Page 76

Codage de lassociation : agrgation


 L'objet de classe Galerie nenvoie pas de message lobjet de
classe Voiture
Attribut qui stocke une
rfrence de Galerie
Voiture

public class Voiture {

www.serli.com

private Galerie laGalerie;


...
public Voiture(Galerie g) {
laGalerie = g;
...
}
...

0..1

Galerie

Un objet Galerie est transmis au


moment de la construction de
Voiture
Cours POO - M. Baron - Page 77

Destruction et ramasse-miettes
 La destruction des objets se fait de manire implicite
 Le ramasse-miettes ou Garbage Collector se met en route
 Automatiquement :
 Si plus aucune variable ne rfrence lobjet
 Si le bloc dans lequel il tait dfini se termine
 Si lobjet a t affect null
 Manuellement :

www.serli.com

 Sur demande explicite du programmeur par linstruction System.gc()

 Un pseudo-destructeur protected void finalize() peut tre dfini


explicitement par le programmeur
 Il est appel juste avant la libration de la mmoire par la machine virtuelle,
mais on ne sait pas quand. Conclusion : pas trs sr!!!!
Prfrer dfinir une mthode et de
linvoquer avant que tout objet ne
soit plus rfrenc : detruit()

Cours POO - M. Baron - Page 78

Destruction et ramasse-miettes
public class Voiture {
private boolean estDemarree;
...

Pour tre sr que finalize s'excute


il faut absolument appeler
explicitement System.gc()

protected void finalize() {


estDemarree = false;
System.out.println("Moteur arrt");
}
public class TestMaVoiture {
...
}

public static void main (String[] argv) {


// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture();
maVoiture.demarre();
// maVoiture ne sert plus rien
maVoiture = null;

www.serli.com

Force le programme se
terminer

// Appel explicite du garbage collector


System.gc();
// Fin du programme
System.exit(0);
System.out.println("Message non visible");
}
}

Cours POO - M. Baron - Page 79

Gestion des objets


 Afficher son type et son emplacement mmoire : System.out.println()
System.out.println(maVoiture) // Voiture@119c082

 Rcuprer son type : mthode Class getClass()


maVoiture.getClass(); // Retourne un objet de type Class
Class classVoiture = maVoiture.getClass(); // Class est une classe!!!

www.serli.com

 Tester son type : oprateur instanceof ou mot cl class


if (maVoiture instanceof Voiture) {...} // Cest vrai

ou
if (maVoiture.getClass() == Voiture.class) {...} // C est vrai galement

Cours POO - M. Baron - Page 80

Surcharge
 La surcharge (overloading) nest pas limite aux constructeurs, elle
est possible galement pour nimporte quelle mthode
 Possibilit de dfinir des mthodes possdant le mme nom mais
dont les arguments diffrent
 Quand une mthode surcharge est invoque le compilateur
www.serli.com

slectionne automatiquement la mthode dont le nombre est le type


des arguments correspondent au nombre et au type des paramtres
passs dans lappel de la mthode
Des mthodes surcharges peuvent avoir
des types de retour diffrents condition
quelles aient des arguments diffrents
Cours POO - M. Baron - Page 81

Surcharge
 Exemple

www.serli.com

public class Voiture {


private double vitesse;
...
public void accelere(double vitesse) {
if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}
public void acelere(int vitesse) {
if (estDemaree) {
this.vitesse = this.vitesse +
(double)vitesse;
public class TestMaVoiture {
}
}
public static void main (String[] argv) {
...}
// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture();
// Acclration 1 avec un double
maVoiture.accelere(123.5);
// Acclration 2 avec un entier
maVoiture.accelere(124);
}}

Cours POO - M. Baron - Page 82

Constructeurs multiples : le retour


 Appel explicite dun constructeur de la classe lintrieur dun
autre constructeur
 Doit se faire comme premire instruction du constructeur
 Utilise le mot-cl this(paramtres effectifs)
public class Voiture {
...
public Voiture() {
this(7, new Galerie());
}

 Exemple

www.serli.com

 Implantation du constructeur

public Voiture(int p) {
this(p, new Galerie());
}

sans paramtre de Voiture


partir du constructeur avec

public Voiture(int p, Galerie g) {


puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}

paramtres

...

Cours POO - M. Baron - Page 83

Encapsulation
 Possibilit daccder aux attributs dune classe Java mais pas
recommand car contraire au principe dencapsulation
 Les donnes (attributs) doivent tre protgs et accessibles pour lextrieur
par des slecteurs

www.serli.com

 Possibilit d agir sur la visibilit des membres (attributs et


mthodes) dune classe vis vis des autres classes
 Plusieurs niveaux de visibilit peuvent tre dfinis en prcdant
dun modificateur la dclaration dun attribut, mthode ou
constructeur
 private
 public
 protected

A revoir dans la partie


suivante
Cours POO - M. Baron - Page 84

Encapsulation : visibilit des membres dune classe


+ public

classe

www.serli.com

attribut

mthode

- private

La classe peut tre utilise


par nimporte quelle classe

Utilisable uniquement par les classes


dfinies lintrieur dune autre classe.
Une classe prive nest utilisable que
par sa classe englobante

Attribut accessible partout o sa


classe est accessible. Nest pas
recommand du point de vue
encapsulation

Attribut restreint la classe o


est faite la dclaration

Mthode accessible partout o


sa classe est accessible.

Mthode accessible lintrieur


de la dfinition de la classe

Cours POO - M. Baron - Page 85

Encapsulation
 Exemple
public class Voiture {

Une mthode prive ne peut plus


tre invoque en dehors du code de
la classe o elle est dfinie

private int puissance;


...
public void demarre() {
...
}

private void makeCombustion() {


...
public class TestMaVoiture {
}
}
www.serli.com

public static void main (String[] argv) {


// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture();
// Dmarrage de maVoiture
maVoiture.demarre();
maVoiture.makeCombustion(); // Erreur
}
}

Cours POO - M. Baron - Page 86

Les chanes de caractres String


 Ce sont des objets traits comme des types simples...
 Initialisation
String maChaine = "Bonjour!"; // Cela ressemble un type simple

 Longueur
maChaine.length(); // Avec les parenthses car c'est une mthode

www.serli.com

 Comparaison
maChaine.equals("Bonjour!"); // Renvoi vrai

 Concatnation
String essai = "ess" + "ai";
String essai = "ess".concact("ai");

Faites attention la comparaison


de chanes de caractres.
maChaine == "toto";

Comparaison sur les rfrences !!


Cours POO - M. Baron - Page 87

Les Chanes modifiables StringBuffer


 Elles sont modifiables par insertion, ajouts, conversions, etc
 On obtient une StringBuffer avec ses constructeurs
StringBuffer mCM = new StringBuffer(int length);
StringBuffer mCM = new StringBuffer(String str);

 On peut les transformer en chanes normales String par :

www.serli.com

String s = mCM.toString();

 On peut leur ajouter n importe (surcharge) quoi par :


mCM.append(...); // String, int, long, float, double

 On peut leur insrer n importe (surcharge) quoi par :


mCM.insert(int offset, ...); // String, int, long, float, double

Cours POO - M. Baron - Page 88

Les chanes dcomposables StringTokenizer


 Elles permettent la dcomposition en mots ou lments suivant
un dlimiteur
this is a test => this
is
a
test

 On obtient une StringTokenizer avec ses constructeurs


StringTokenizer mCM = new StringTokenize(String str); // Dlimiteur = blanc
StringTokenizer rMCM = new StringTokenizer(String str, String delim);

www.serli.com

 Un exemple :
StringTokenizer st =
new StringTokenizer("Bonjour,
le monde|de|Java",", |");
while(st.hasMoreElements())
System.out.println("Element : " + st.nextElement());

Cours POO - M. Baron - Page 89

Variables de classe
 Il peut tre utile de dfinir pour une classe des attributs
indpendamment des instances : nombre de Voitures cres
 Utilisation des Variables de classe comparables aux variables
globales

www.serli.com

 Usage des variables de classe


 Variables dont il nexiste quun seul exemplaire associ sa classe de
dfinition
 Variables existent indpendamment du nombre dinstances de la classe qui
ont t crs
 Variables utilisables mme si aucune instance de la classe nexiste
Cours POO - M. Baron - Page 90

Variables de classe
 Elles sont dfinies comme les attributs mais avec le mot-cl static
public static int nbVoitureCreees;

Attention lencapsulation. Il est


dangereux de laisser cette variable
de classe en public.

 Pour y accder, il faut utiliser non pas un identificateur mais le


nom de la classe
www.serli.com

Voiture.nbVoitureCreees = 3;

Il nest pas interdit dutiliser une


variable de classe comme un attribut
(au moyen d un identificateur) mais
fortement dconseill

Cours POO - M. Baron - Page 91

Constantes de classe
 Usage
 Ce sont des constantes lies une classe
 Elles sont crites en MAJUSCULES

Une constante de classe


est gnralement
toujours visible

www.serli.com

 Elles sont dfinies (en plus) avec le mot-cl final


public class Galerie {
public static final int MASSE_MAX = 150;
}

 Pour y accder, il faut utiliser non pas un identificateur d objet


mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}

Cours POO - M. Baron - Page 92

Variables et Constantes de classe : exemple


 Exemple
public class Voiture {
public static final int PTAC_MAX = 3500;
private int poids;
public static int nbVoitureCreees;
...

www.serli.com

Dangereux car possibilit


de modification
extrieure...

public Voiture(int poids, ...) {


this.poids = poids;
nbVoitureCrees++;
...
public class TestMaVoiture {
}
public static void main (String[] argv) {
// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture(2500);
...

Utilisation de Variables
et Constantes de classe
par le nom de la classe
Voiture

System.out.println("Poids maxi:" +
Voiture.PTAC_MAX);
System.out.println(Voiture.nbVoitureCreees);
...
}
}

Cours POO - M. Baron - Page 93

Mthodes de classe
 Usage
 Ce sont des mthodes qui ne s'intressent pas un objet particulier
 Utiles pour des calculs intermdiaires internes une classe
 Utiles galement pour retourner la valeur d'une variable de classe en
visibilit private

www.serli.com

 Elles sont dfinies comme les mthodes d'instances, mais avec le


mot cl static
public static double vitesseMaxToleree() {
return vitesseMaxAutorisee*1.10;
}

 Pour y accder, il faut utiliser non pas un identificateur d'objet


mais le nom de la classe (idem variables de classe)
Voiture.vitesseMaxToleree()

Cours POO - M. Baron - Page 94

Mthodes de classe
 Exemple
public class Voiture {
private static int nbVoitureCreees;
...
public static int getNbVoitureCreees(){
return Voiture.nbVoitureCreees;
}

Dclaration d'une
variable de classe prive.
Respect des principes
d'encapsulation.

www.serli.com

Dclaration d'une
mthode de classe pour
accder la valeur de la
variable de classe.

public class TestMaVoiture {


public static void main (String[] argv) {
// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture(2500);
...
System.out.println("Nbre Instance :" +
Voiture.getNbVoitureCreees());
}
}

Cours POO - M. Baron - Page 95

Mthodes de classe : erreur classique


 Exemple
public class Voiture {
private Galerie laGalerie;
...

Dclaration d'un objet


Galerie non statique

public Voiture(Galerie g) {
laGalerie = g;
...
}
public static boolean isGalerieInstall() {
return (laGalerie != null)
}
www.serli.com

On ne peut pas utiliser de


variables d'instance dans une
mthode de classe!!!!

Erreur : Utilisation
d'un attribut non
statique dans une zone
statique
Cours POO - M. Baron - Page 96

Mthodes de classe
 Rappel : chacun des types simples (int, double, boolean, char)
possde un alter-ego objet disposant de mthodes de conversion
 Par exemple la classe Integer encapsule le type int
 Constructeur partir dun int ou dune chane de caractres
public Integer(int value);
public Integer(String s);

 Disponibilit de mthodes qui permettent la conversion en type simple

www.serli.com

Integer valueObjet = new Integer(123);


int valuePrimitif = valueObjet.intValue();
Ou
int valuePrimitif = valueObjet; (AutoBoxing)

 Des mthodes de classe trs utiles qui permettent partir dune chane de
caractres de transformer en type simple ou type object
String maValueChaine = new String("12313");
int maValuePrimitif = Integer.parseInt(maValueChaine);

Attention aux erreurs de conversion.


Retour dune exception. Voir dans la
dernire partie du cours

Cours POO - M. Baron - Page 97

Les tableaux en Java : application Objets


1 Dclaration
Voiture[] monTableau;

2 Dimensionnement
monTableau = new Voiture[3];

www.serli.com

3 Initialisation

Ou 12 et 3
Voiture[] monTab = {
new Voiture(5),
new Voiture(7),
new Voiture(8)
};

monTableau[0] = new Voiture(5);


monTableau[1] = new Voiture(7);
monTableau[2] = new Voiture(8);

for (int i = 0; i < monTableau.length; i++) {


System.out.println(monTableau[i].demarre());
}

Cours POO - M. Baron - Page 98

Programmation Oriente Objet


application au langage Java
Hritage

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Dfinition et intrts
 Hritage
 Technique offerte par les langages de programmation pour construire une
classe partir dune (ou plusieurs) autre classe en partageant ses attributs
et oprations

 Intrts

www.serli.com

 Spcialisation, enrichissement : une nouvelle classe rutilise les


attributs et les oprations d une classe en y ajoutant et/ou des oprations
particulires la nouvelle classe
 Redfinition : une nouvelle classe redfinit les attributs et oprations dune
classe de manire en changer le sens et/ou le comportement pour le cas
particulier dfini par la nouvelle classe
 Rutilisation : vite de rcrire du code existant et parfois on ne possde
pas les sources de la classe hriter
Cours POO - M. Baron - Page 100

Spcialisation de la classe Voiture


 Un vhicule prioritaire est une voiture avec un gyrophare
 Un vhicule prioritaire rpond aux mmes messages que la Voiture
 On peut allumer le gyrophare dun vhicule prioritaire

 Une voiture lectrique est une voiture dont lopration de dmarrage


est diffrente
 Une voiture lectrique rpond aux mme messages que la Voiture
 On dmarre une voiture lectrique en activant un disjoncteur
Voiture
www.serli.com

Voiture

+ dmarre()

Relation dhritage
VehiculePrioritaire

VoitureElectrique

- gyrophare : boolen

- disjoncteur : boolen

+ allumeGyrophare()

+ dmarre()
Cours POO - M. Baron - Page 101

Classes et sous-classes
 Un objet de la classe VehiculePrioritaire ou VoitureElectrique est
aussi un objet de la classe Voiture donc il dispose de tous les attributs
et oprations de la classe Voiture
VoitureElectrique

- gyrophare : boolen

- disjoncteur : boolen

+ allumeGyrophare()

+ dmarre()

- puissance : entier

- puissance : entier

- estDmarre : boolean
- vitesse : flottant
+ deQuellePuissance() : entier
+ dmarre()
+ acclre(flottant)

Hrit de Voiture

Hrit de Voiture

www.serli.com

VehiculePrioritaire

- estDmarre : boolean
- vitesse : flottant
+ deQuellePuissance() : entier
+ dmarre()
+ acclre(flottant)

Cours POO - M. Baron - Page 102

Classes et sous-classes : terminologie


 Dfinitions
 La classe VehiculePrioritaire hrite de la classe Voiture
 Voiture est la classe mre et VehiculePrioritaire la classe fille
 Voiture est la super-classe de la classe VehiculePrioritaire
 VehiculePrioritaire est une sous-classe de Voiture

www.serli.com

 Attention
 Un objet de la classe VehiculePrioritaire ou VoitureElectrique est
forcment un objet de la classe Voiture
 Un objet de la classe Voiture nest pas forcment un objet de la classe
VehiculePrioritaire ou VoitureElectrique
Cours POO - M. Baron - Page 103

Gnralisation et Spcialisation
 La gnralisation exprime une relation est-un entre une classe et

Super-classe

www.serli.com

Sous-classe

VehiculePrioritaire

 Lhritage permet

Abstraction

Voiture

Raffinement

sa super-classe

VehiculePrioritaire est une


Voiture

 de gnraliser dans le sens abstraction


 de spcialiser dans le sens raffinement
Cours POO - M. Baron - Page 104

Exemple dhritage
 Exemple
Mammifre

www.serli.com

Ctac

Humain

Baleine

Dauphin

Etudiant

Enseignant

Mobi Dick

Ecco

Raoul

Mickal
Cours POO - M. Baron - Page 105

Hritage et Java
 Hritage simple
 Une classe ne peut hriter que dune seule autre classe
 Dans certains autres langages (ex : C++) possibilit dhritage multiple
 Utilisation du mot-cl extends aprs le nom de la classe
public class VehiculePrioritaire extends Voiture {
private boolean gyrophare;
...

www.serli.com

Voiture

VehiculePrioritaire

public void allumeGyrophare() {


gyrophare = true;
}
...
}

- gyrophare : boolen
+ allumeGyrophare()

Nessayez pas dhriter de plusieurs


classes (extends Voiture, Sante, )
a ne fonctionne pas
Cours POO - M. Baron - Page 106

Hritage plusieurs niveaux

Voiture
+ dmarre()

VehiculePrioritaire

www.serli.com

+ allumeGyrophare()

Ambulance

- malade : String
+ chercher(String)

public class Voiture {


...
public void dmarre() {
...
}
}

public class VehiculePrioritaire


extends Voiture {
...
public void allumeGyrophare() {
...
}
}

Ambulance am =
new
Ambulance(...);
am.dmarre();
am.allumeGyrophare();
am.chercher("Didier");

public class Ambulance


extends VehiculePrioritaire {
private String malade;
...
public void chercher(String ma) {
...
}
}

Cours POO - M. Baron - Page 107

Surcharge et redfinition
 Lhritage
 Une sous-classe peut ajouter des nouveaux attributs et/ou mthodes ceux
quelle hrite (surcharge en fait partie)
 Une sous-classe peut redfinir (redfinition) les mthodes ceux dont elle
hrite et fournir des implmentations spcifiques pour celles-ci

www.serli.com

 Rappel de la surcharge : possibilit de dfinir des mthodes


possdant le mme nom mais dont les arguments (paramtres et
valeur de retour) diffrent

Des mthodes surcharges peuvent


avoir des types de retour diffrents
condition quelles aient des
arguments diffrents

 Redfinition (overriding) : lorsque la sous-classe dfinit une mthode


dont le nom, les paramtres et le type de retour sont identiques
Cours POO - M. Baron - Page 108

Surcharge et redfinition
 Une voiture lectrique est une voiture dont lopration de dmarrage
est diffrente
 Une voiture lectrique rpond aux mme messages que la Voiture
 On dmarre une voiture lectrique en activant un disjoncteur
Voiture

public class VoitureElectrique extends Voiture {

www.serli.com

+ dmarre()

private boolean disjoncteur;


...
public void demarre() {
disjoncteur = true;
}
...

VoitureElectrique
- disjoncteur : boolen

+ dmarre()

Redfinition de la
mthode
Cours POO - M. Baron - Page 109

Surcharge et redfinition
public class Voiture {
...
public void demarre() {
...
}
}

www.serli.com

Redfinition

public class VoitureElectrique


extends Voiture {
...
public void demarre() {
...
}
}

VoitureElectrique possde au
plus une mthode de moins
que VehiculePrioritaire

Ne pas confondre surcharge et redfinition.


Dans le cas de la surcharge la sous-classe
ajoute des mthodes tandis que la redfinition
spcialise des mthodes existantes

Surcharge

public class VehiculePrioritaire


extends Voiture {
...
public void demarre(int code) {
...
}
}

VehiculePrioritaire possde
au plus une mthode de
plus que VoitureElectrique
Cours POO - M. Baron - Page 110

Redfinition avec rutilisation


 Intrt
 La redfinition dune mthode cache le code de la mthode hrite
 Possibilit de rutiliser le code de la mthode hrit par le mot-cl super
 super permet ainsi la dsignation explicite de l instance d une classe dont le
type est celui de la classe mre
 Accs aux attributs et mthodes redfinies par la classe courante mais que lon

www.serli.com

dsire utiliser
super.nomSuperClasseMethodeAppelee(...);

 Exemple de la Voiture : les limites rsoudre


 Lappel la mthode demarre de VoitureElectrique ne modifie que lattribut
disjoncteur
 ...

Cours POO - M. Baron - Page 111

Redfinition avec rutilisation


 Exemple
public class Voiture {

La position de super na ici


aucune importance

private boolean estDemarree;


...
public void demarre() {
estDemarree = true;
}

public class VoitureElectrique extends Voiture {


private boolean disjoncteur;
...

www.serli.com

Mise jour de lattribut


estDemarree

public void demarre() {


disjoncteur = true;
super.demarre();
}
...
}

public class TestMaVoiture {


public static void main (String[] argv) {
// Dclaration puis cration
VehiculeElectrique laRochelle =
new VehiculeElectrique(...);
laRochelle.demarre();
}
}

Envoi dun message


par appel de demarre
Cours POO - M. Baron - Page 112

Usage des constructeurs : suite


 Possibilit comme les mthodes de rutiliser le code des constructeurs de la super-classe
 Appel explicite dun constructeur de la classe mre lintrieur
dun constructeur de la classe fille

www.serli.com

 Utilise le mot-cl super

Lappel au constructeur de la superclasse doit se faire absolument en


premire instruction

super(paramtres du constructeur);

 Appel implicite d'un constructeur de la classe mre est effectu


quand il n'existe pas d'appel explicite. Java insre implicitement
l'appel super()
Cours POO - M. Baron - Page 113

Usage des constructeurs : suite


 Exemple
public class Voiture {
...

Lappel au constructeur de la superclasse doit se faire absolument en


premire instruction

public Voiture() {
this(7, new Galerie());
}

www.serli.com

public Voiture(int p) {
this(p, new Galerie());
}

Implantation du constructeur
de VoiturePrioritaire partir
de Voiture

public Voiture(int p, Galerie g) {


puissance = p;
moteur = new Moteur(puissance);
galerie = g;
public class VoiturePrioritaire
...
extends Voiture {
}
...
private boolean gyrophare;
}

public VoiturePrioritaire(int p, Galerie g) {


super(p, null);
this.gyrophare = false;
}}

Cours POO - M. Baron - Page 114

Usage des constructeurs : suite


 Exemple : chanage des constructeurs
public class A {
public A() {
System.out.println("Classe A");
}
}

www.serli.com

public class B extends A {


private String message;
public B(String message) {
super(); // Appel implicite
System.out.println("Classe B");
System.out.println(message);
}
}
public class C extends B {
public C(String debut) {
super("Message issu C" + debut);
System.out.println("Classe C");
System.out.println("Fin");
}
public class Test {
}
public static void main (String[] argv) {
new C("Message du main");
}
}
Cours POO - M. Baron - Page 115

Usage des constructeurs : suite


 Rappel : si une classe ne dfinit pas explicitement de constructeur,
elle possde alors un constructeur par dfaut
 Sans paramtre
 Qui ne fait rien
 Inutile si un autre constructeur est dfini explicitement

www.serli.com

public class A {
public A() {
public void afficherInformation() {
super();
System.out.println("Des Informations..."); }
}
}
public class B {
private String pInfo;
public B(String pInfo) {
this.pInfo = pInfo;
}

super();

}
public class Test {
public static void main (String[] argv) {
new B("Message du main");
}
}
Cours POO - M. Baron - Page 116

Usage des constructeurs : suite


 Exemple
public class Voiture {
...
public Voiture(int p) {
this(p, new Galerie());
}

Constructeurs explicites
dsactivation du constructeur
par dfaut

public Voiture(int p, Galerie g) {


puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}
...

Erreur : il n'existe pas dans Voiture de


constructeur sans paramtre

www.serli.com

}
public class VoiturePrioritaire
extends Voiture {
private boolean gyrophare;

super();

public VoiturePrioritaire(int p, Galerie g) {


this.gyrophare = false;
}
}

Cours POO - M. Baron - Page 117

La classe Object : le mystre rsolu


 La classe Object est la classe de plus haut niveau dans la hirarchie
d'hritage
 Toute classe autre que Object possde une super-classe
 Toute classe hrite directement ou indirectement de la classe Object
 Une classe qui ne dfinit pas de clause extends hrite de la classe Object
Object
public class Voiture extends Object {
...

www.serli.com

public Voiture(int p, Galerie g) {


puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}
...
}

+ Class getClass()
+ String toString()
+ boolean equals(Object)
+ int hashCode()

Il n'est pas ncessaire


d'crire explicitement
extends Object
Cours POO - M. Baron - Page 118

Aprswww.serli.com
redfinition

Avant redfinition

La classe Object : le mystre rsolu


public class Voiture {
public class Test {
...
public static void main (String[] argv) {
public Voiture(int p) {
Voiture maVoiture = new Voiture(3);
this(p, new Galerie());
System.out.println(maVoiture);
}
}
}
public Sring toString()} {
return (this.getClass().getName() +
"@" + this.hashCode());
}

public class Voiture {


...
public Voiture(int p) {
this(p, new Galerie());
}

.ln(maVoiture.toString());
public class Test {
public static void main (String[] argv) {
public String toString() {
Voiture maVoiture = new Voiture(3);
return("Puissance:" + p);
System.out.println(maVoiture);
}
}
}

Redfinition de la mthode
String toString()
Cours POO - M. Baron - Page 119

Droits daccs aux attributs et mthodes


 Exemple de la Voiture : les limites rsoudre
 La mthode dmarre() est disponible dans la classe VehiculePrioritaire
Cest--dire que lon peut dmarrer sans donner le code !!!
 Solution : protger la mthode dmarre() de la classe Voiture
 Ralisation
 Utilisation du mot-cl protected devant la dfinition des mthodes et/ou
attributs
 Les membres sont accessibles dans la classe o ils sont dfinis, dans toutes ses
sous-classes
www.serli.com

Voiture

# dmarre()

dmarre() nest pas accessible


publiquement dans un objet
VehiculePrioritaire

VehiculePrioritaire
+ dmarre(int code)

VehiculeElectrique
+ dmarre()
Cours POO - M. Baron - Page 120

Droits daccs aux attributs et mthodes


 Exemple
public class Voiture {

public class VoiturePrioritaire


extends Voiture {
private int codeVoiture;

private boolean estDemarree;


...

public void demarre(int code) {


if (codeVoiture == code) {
super.demarre();
};
}

protected void demarre() {


estDemarree = true;
}
}
}

www.serli.com

public class TestMaVoiture {


public static void main (String[] argv) {
// Dclaration puis cration de maVoiture
VehiculeElectrique laRochelle = new VehiculeElectrique(...);
larochelle.demarre(); // Appel le demarre de VehiculeElectrique
VehiculePrioritaire pompier = new VehiculePrioritaire(...);
pompier.demarre(1234); // Appel le demarre VoiturePrioritaire
pompier.demarre(); // Erreur puisque demarre nest pas public
}}

Cours POO - M. Baron - Page 121

Mthodes et classes finales


 Dfinition
 Utilisation du mot-cl final
 Mthode : interdire une ventuelle redfinition dune mthode
public final void demarre();

www.serli.com

 Classe : interdire toute spcialisation ou hritage de la classe concerne


public final class VoitureElectrique extends Voiture {
...
}

La classe String par exemple


est finale
Cours POO - M. Baron - Page 122

Programmation Oriente Objet


application au langage Java
Hritage et Polymorphisme

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Dfinition du polymorphisme
 Dfinition
 Un langage orient objet est dit polymorphique, sil offre la possibilit de
pouvoir percevoir un objet en tant quinstance de classes varies, selon les
besoins
 Une classe B qui hrite de la classe A peut tre vue comme un sous-type du
type dfini par la classe A
Voiture

www.serli.com

+ dmarre()

 Rappel
 voitureLarochelle est une instance de la
classe VoitureElectrique

VoitureElectrique
+ dmarre()
+ getVoltage() : int

 Mais aussi
 voitureLarochelle est une instance de la
classe Voiture

voitureLarochelle
Cours POO - M. Baron - Page 124

Polymorphisme et Java : surclassement


 Java est polymorphique
 A une rfrence dclare de la classe Voiture, il est possible daffecter une
valeur qui est une rfrence vers un objet de la classe VoitureElectrique
 On parle de surclassement ou upcasting
 Plus gnralement une rfrence dun type donn, soit A, il est possible
daffecter une valeur qui correspond une rfrence vers un objet dont le type
effectif est nimporte quelle sous classe directe ou indirecte de A
Voiture

Objet de type sous-classe


directe de Voiture

www.serli.com

+ dmarre()

VoitureElectrique

public class Test {


public static void main (String[] argv) {
Voiture voitureLarochelle =
new VoitureElectrique(...);

+ dmarre()
+ getVoltage() : int

}
}

voitureLarochelle

Cours POO - M. Baron - Page 125

Polymorphisme et Java : surclassement


 A la compilation
 Lorsquun objet est surclass , il est vu par le compilateur comme un objet
du type de la rfrence utilise pour le dsigner
 Ses fonctionnalits sont alors restreintes celles proposes par la classe du type
de la rfrence
public class Test {
public static void main (String[] argv) {
// Dclaration et cration dun objet Voiture
Voiture voitureLarochelle = new VoitureElectrique(...);

www.serli.com

// Utilisation dune mthode de la classe Voiture


voitureLarochelle.demarre();
// Utilisation dune mthode de la classe VoitureElectrique
System.out.println(voitureLarochelle.getVoltage()); // Erreur
}
}

Examiner le type de la
rfrence

La mthode getVoltage() nest pas


disponible dans la classe Voiture!!!
Cours POO - M. Baron - Page 126

Polymorphisme et Java : surclassement


public class Test {
public static void main (String[] argv) {
// Dclaration et cration dun objet Voiture
Voiture voitureLarochelle = new VoitureElectrique(...);
// Utilisation dune mthode de la classe Voiture
voitureLarochelle.demarre();
// Utilisation dune mthode de la classe VoitureElectrique
System.out.println(voitureLarochelle.getVoltage());
}
}

www.serli.com

Voiture

Remarque : Quel code va tre effectivement


excut lorsque le message demarre() est
envoy voitureLarochelle ??

+ dmarre()

voitureLarochelle

Cours POO - M. Baron - Page 127

Polymorphisme et Java : lien dynamique


public class Test {
public static void main (String[] argv) {
Voiture voitureLarochelle =
new VoitureElectrique(...);

Lobjet voitureLarochelle initialise


les attributs de la classe
VoitureElectrique

voitureLarochelle.demarre();
}
}

Voiture
+ dmarre() {
estDemarre = true;
}

www.serli.com

voitureLarochelle.demarre()

VoitureElectrique

Constat : Cest la mthode dmarre() de


VoitureElectrique qui est appele. Puis elle
appelle (par super) la mthode de la superclasse

+ dmarre() {
super.dmarre();
disjoncteur = true;
}
Cours POO - M. Baron - Page 128

Polymorphisme et Java : lien dynamique


public class Point {
private int x,y;
public Point(int x, int y) { this.x = x; this.y = y; }
public void deplace(int dx, int dy) { x += dx; y+=dy; }
public void affiche() { System.out.println("Je suis en "+ x + " " + y);}
}

www.serli.com

public class Pointcol extends Point {


private byte couleur;
public Pointcol(int x, int y, byte couleur) {
super(x,y);
this.couleur = couleur;
}
public void affiche() {
super.affiche();
System.out.println("et ma couleur est : " + couleur);
}
}
public class Test {
public static void main (String[] argv)
Point p = new Point(23,45);
p.affiche();
Pointcol pc = new Pointcol(5,5,(byte)12);
p = pc;
p.affiche();
p = new Point(12,45);
p.affiche();
}
}

Point

Pointcol

Cours POO - M. Baron - Page 129

Polymorphisme et Java : lien dynamique


public class Point {
private int x,y;
public Point(int x, int y) { this.x = x; this.y = y; }
public void deplace(int dx, int dy) { x += dx; y+=dy; }
public void affiche() {
this.identifie();
System.out.println("Je suis en "+ x + " " + y);
}
public void identifie() {System.out.println("Je suis un point");}
}

www.serli.com

public class Pointcol extends Point {


private byte couleur;
public Pointcol(int x, int y, byte couleur) {...}
public void affiche() {
super.affiche();
System.out.println("et ma couleur est : " + couleur);
}
public void identifie() {System.out.println("Je suis un point color");}
}

public class Test {


public static void main (String[] argv)
Point p = new Point(23,45);
p.affiche();
Pointcol pc = new Pointcol(5,5,(byte)12);
p = pc;
p.affiche();
p = new Point(12,45);
p.affiche();
}
}

Point

Pointcol

Cours POO - M. Baron - Page 130

Polymorphisme et Java : lien dynamique


 A lexcution
 Lorsquune mthode dun objet est accde au travers dune rfrence
surclasse , cest la mthode telle quelle est dfinie au niveau de la classe
effective de lobjet qui est invoque et excute

www.serli.com

 La mthode excuter est dtermine lexcution et non pas la compilation

 On parle de liaison tardive, lien dynamique, dynamic binding, late-binding ou


run-time binding

Cours POO - M. Baron - Page 131

Polymorphisme et Java : bilan


public class Test {
public static void main (String[] argv) {
Voiture maVoit = new VoitureElectrique(...);
maVoit.dmarre();
}
}

 Surclassement (compilation)
 Une variable maVoit est dclare comme tant
une rfrence vers un objet de la classe Voiture

Voiture
+ dmarre() {
estDemarre = true;
}

www.serli.com

 Un objet de la classe VoitureElectrique est cr


 Pour le compilateur maVoit reste une rfrence
dun objet de la classe Voiture, et il empche
daccder aux mthodes spcifiques
VoitureElectrique

 Liaison dynamique (excution)


 Une variable maVoit est bel et bien une
rfrence vers un objet de la classe
VoitureElectrique

VoitureElectrique
+ dmarre() {
super.dmarre();
disjoncteur = true;
}

Cours POO - M. Baron - Page 132

Polymorphisme : ok, mais pourquoi faire ?


 Que des avantages
 Plus besoin de distinguer diffrents cas en fonction de la classe des objets
 Le polymorphisme constitue la troisime caractristique essentielle dun
langage orient objet aprs labstraction des donnes (encapsulation) et
lhritage

www.serli.com

 Une plus grande facilit dvolution du code. Possibilit de dfinir de nouvelles


fonctionnalits en hritant de nouveaux types de donnes partir dune classe
de base commune sans avoir besoin de modifier le code qui manipule la classe
de base
 Dveloppement plus rapide
 Plus grande simplicit et meilleure organisation du code
 Programmes plus facilement extensibles
 Maintenance du code plus aise
Cours POO - M. Baron - Page 133

Polymorphisme : un exemple typique


 Exemple sur la gomtrie
 Stocker des Forme de nimporte quel type (Rectangle ou Cercle) puis les
afficher
Stockage
Forme
- positionx : int
- positiony : int

www.serli.com

+ afficher()

Rectangle
- largeur : int
- hauteur : int
+ afficher()

- liste : Forme[ ]
+ ajouter(Forme)
+ afficherForme()

Cercle
- rayon : int
+ afficher()

Cours POO - M. Baron - Page 134

Polymorphisme : un exemple typique


public class Stockage {
private Forme[] liste;
private int taille;
private int i;
public Stockage(int taille) {
this.taille = taille;
liste = new Forme[this.taille];
i = 0;
}

Si une nouveau type de Forme


est dfini, le code de la classe
Stockage nest pas modifi

www.serli.com

public void ajouter(Forme f) {


if (i < taille) {
liste[i] = f;
i++;
}
}

public class Test {


public static void main (String[] argv) {
public void afficherForme() {
Stockage monStock = new Stockage(10);
for (int i = 0; i < taille; i++) {
liste[i].afficher();
monStock.ajouter(new Cercle(...));
}
monStock.ajouter(new Rectangle(...));
}
}

Rectangle monRect = new Rectangle(...);


Forme tonRect = new Rectangle(...);
monStock.ajouter(monRect);
monStock.ajouter(tonRect);
}
}

Cours POO - M. Baron - Page 135

Polymorphisme : downcasting
 Intrt
 Force un objet librer les fonctionnalits caches par le surclassement
 On parle de conversion de type explicite (cast). Dj vu pour les types primitifs
ClasseA monObj = ...
ClasseB b = (ClasseB) monObj

ClasseA

www.serli.com

 Pour que le cast fonctionne, il faut qu lexcution


le type effectif de monObj soit compatible
avec le type ClasseB

ClasseB

 Compatible : on peut tester la compatibilit par le mot cl instanceof


obj instanceof ClasseB

Retourne vrai ou faux

Cours POO - M. Baron - Page 136

Polymorphisme : downcasting
 Exemple
public class Test {
public static void main (String[] argv) {
Forme maForme = new Rectangle();
// Je ne peux pas utiliser les mthodes de la classe Rectangle
// Dclaration dun objet de type Rectangle
Rectangle monRectangle;
if (maForme instanceof Rectangle) {
monRectangle = (Rectangle)maForme;
// Utilisation possible des mthodes spcifiques de Rectangle
}
}

www.serli.com

Attention si la compatibilit est fausse et


si le cast est effectu une exception de
type ClassCastException est leve

Ralisation de la
conversion de lobjet de
type Forme en objet de
type Rectangle
Cours POO - M. Baron - Page 137

La mthode equals()
 Deux possibilits pour comparer des objets dune classe
 Crer une mthode ad-hoc public boolean comparer(MaClasse c) {} qui
compare les attributs
 Redfinir la mthode public boolean equals(Object o) pour garder la
compatibilit avec les autres classes de Java.
 Re-implmenter la mthode public boolean equals(Object o) en
comparant les attributs (en utilisant une conversion de type explicite)
Object

www.serli.com

+ boolean equals(Object)

Voiture
- puissance : int
- estDmarre : int
- vitesse : reel

Rappel de la classe
Voiture

Cours POO - M. Baron - Page 138

La mthode equals()
public class Voiture extends Object {
public boolean equals(Object o) {
if (!o instanceof Voiture) {
return false;
}

Redfinition de la mthode
equals de la classe Object

Voiture maVoit = (Voiture)o;


return this.puissance == maVoit.puissance && this.estDmarre ==
maVoit.estDmarre && this.vitesse == maVoit.vitesse;
}
...
}

www.serli.com

Mme valeurs darguments


public class Test {
public static void main (String[] argv) {
Voiture maVoit = new Voiture(...);
VoitureElectrique maVoitele = new VoitureElectrique(...);
maVoit.equals(maVoitele); --> TRUE
}
}

Attention : lgalit de rfrence ==


vrifie si les rfrences sont les mmes,
cela ne compare pas les attributs

Cours POO - M. Baron - Page 139

Classes abstraites : intrts


 On ne connat pas toujours le comportement par dfaut dune
opration commune plusieurs sous-classes
 Exemple : toit dune voiture dcapotable. On sait que toutes les dcapotables
peuvent ranger leur toit, mais le mcanisme est diffrent dune dcapotable
lautre
 Solution : on peut dclarer la mthode abstraite dans la classe mre et ne
pas lui donner dimplantation par dfaut

www.serli.com

 Mthode abstraite et consquences : 3 rgles retenir


 Si une seule des mthodes dune classe est abstraite, alors la classe devient
aussi abstraite
 On ne peut pas instancier une classe abstraite car au moins une de ses mthodes
na pas dimplmentation
 Toutes les classes filles hritant de la classe mre abstraite doivent implmenter
toutes ses mthodes abstraites ou sinon elles sont aussi abstraites
Cours POO - M. Baron - Page 140

Classes abstraites et Java


 On utilise le mot cl abstract pour spcifier abstraite une classe
 Une classe abstraite se dclare ainsi :
public abstract class NomMaClasse {
...
}

 Une mthode abstraite se dclare ainsi :


www.serli.com

public abstract void maMethode(...);

Pour crer une mthode abstraite, on


dclare sa signature (nom et paramtres)
sans spcifier le corps et en ajoutant le mot
cl abstract

Cours POO - M. Baron - Page 141

Classes abstraites : exemple VoitureDecapotable


 La classe VoitureDecapotable
Voiture

 Hrite de Voiture
 Dfinit un attribut protg toitRepli
 Dfinit une mthode abstraite replieLeToit()

VoitureDecapotable {abstraite}
# toitRepli : boolen
+ replieLeToit() {abstraite}

www.serli.com

 Les classes DeuxChevaux et C3Pluriel


hritent de VoitureDecapotable

DeuxChevaux

C3Pluriel

- capoteAttache : boolen

- arceauxRetirs : boolen

+ replieLeToit()

+ replieLeToit()
Cours POO - M. Baron - Page 142

Classes abstraites : exemple VoitureDecapotable

Classe
abstraite

public abstract class VoitureDecapotable


extends Voiture {
protected boolean toitRepli;
public abstract void replieLeToit();
}
public class DeuxChevaux extends VoitureDecapotable {
private boolean capoteAttachee;
public void replieLeToit() {
this.toitReplie = true;
this.capoteAttachee = true;
}

Mthode
abstraite

www.serli.com

}
public class C3Pluriel extends VoitureDecapotable {
private boolean arceauxRetirs;
public void replieLeToit() {
this.toitReplie = true;
this.arceauxRetirs = true;
}

Attention : ce nest pas


de la redfinition. On
parle dimplmentation
de mthode abstraite

Cours POO - M. Baron - Page 143

Classes abstraites : exemple VoitureDecapotable


public class Test {
public static void main (String[] argv) {
// Dclaration et cration dune DeuxCheveaux
VoitureDecapotable voitureAncienne = new DeuxCheveaux(...);
// Envoi de message
voitureAncienne.replieLeToit();
// Dclaration et cration dune C3Pluriel
VoitureDecapotable voitureRecente = new C3Pluriel(...);
// Envoi de message
voitureRecente.replieLeToit();

www.serli.com

// Dclaration et cration dune VoitureDecapotable


VoitureDecapotable voitureDecapotable =
new VoitureDecapotable(...); // Erreur
}
}

Attention : La classe
VoitureDecapotable ne
peut tre instancie
puisquelle est abstraite
Cours POO - M. Baron - Page 144

Classes abstraites : exemple Forme


 La classe Forme
Forme {abstraite}

 Les mthodes surface() et primtre() sont abstraites

- positionx, positiony : int

 Ces mthodes nont de sens que pour les

+ deplace(x,y)
+ surface() : double {abstraite}
+ primtre() : double {abstraite}

sous-classes Cercle et Rectangle

www.serli.com

public abstract class Forme {


private int positionx, positiony;
public void deplacer(double dx, double dy){
x += dx; y += dy;
}

Cercle

Rectangle

- rayon : int

- larg, haut : int

+ surface() : double
+ primtre() : double

+ surface() : double
+ primtre() : double

public abstract double primtre();


public abstract double surface();

Pas dimplmentation !!

Cours POO - M. Baron - Page 145

Notion dinterface
 Une interface est un modle pour une classe
 Quand toutes les mthodes dune classe sont abstraites et il ny a aucun attribut
on aboutit la notion dinterface
 Elle dfinit la signature des mthodes qui doivent tre implmentes dans les
classes qui respectent ce modle
 Toute classe qui implmente linterface doit implmenter toutes les mthodes
dfinies par linterface
 Tout objet instance dune classe qui implmente linterface peut tre dclar
comme tant du type de cette interface
 Les interfaces pourront se driver
www.serli.com

 Exemple :
 Les choses Dmarrable doivent possder une mthode dmarre()
Voiture
Dmarrable << Interface >>
+ dmarre

Ordinateur
Cours POO - M. Baron - Page 146

Notion dinterface et Java


 Mise en uvre dune interface
 La dfinition dune interface se prsente comme celle dune classe. On y utilise
simplement le mot cl interface la place de class
public interface NomInterface {
...
}

Interface : ne pas
confondre avec les
interfaces graphiques

www.serli.com

 Lorsquon dfinit une classe, on peut prciser quelle implmente une ou


plusieurs interfaces donne(s) en utilisant une fois le mot cl implements
public class NomClasses implements Interface1,Interface3, ... {
...
}

 Si une classe hrite dune autre classe elle peut galement implmenter une ou
plusieurs interfaces
public class NomClasses extends SuperClasse implements Interface1, ... {
...
}

Cours POO - M. Baron - Page 147

Notion dinterface et Java


 Mise en uvre dune interface
 Une interface ne possde pas dattribut
 Une interface peut possder des constantes
public interface NomInterface {
public static final int CONST = 2;
}

www.serli.com

 Une interface ne possde pas de mot cl abstract


 Les interfaces ne sont pas instanciables (Mme raisonnement avec les classes
abstraites)
NomInterface jeTente = new NomInterface(); // Erreur!!

Cours POO - M. Baron - Page 148

Notion dinterface et Java


 Toute classe qui implmente linterface doit implmenter toutes les
mthodes dfinies par linterface
Voiture
Dmarrable << Interface >>
+ dmarre

Ordinateur

www.serli.com

public interface Dmarrable {


public void dmarre();
}

Doit implmenter toutes


les mthodes des
interfaces

public class Voiture implements Dmarrable {


...
public void dmarre() {
estDemarree = true
}
}

public class Ordinateur implements Dmarrable {


...
public void dmarre() {
estDemarree = true
}
}

Une Voiture est


Dmarrable
Un Ordinateur est
Dmarrable
Cours POO - M. Baron - Page 149

Notion dinterface et Java


 Tout objet instance dune classe qui implmente linterface peut
tre dclar comme tant du type de cette interface
public class Test {
public static void main (String[] argv) {
// Dclaration dun objet de type Dmarrable
Dmarrable dem1;
// Cration dun objet Voiture
dem1 = new Voiture();
// Dclaration et cration dun objet Personne
Personne pers1 = new Personne(dem1);
pers1.mettreEnRoute();

Une personne peut


dmarrer tous les objets
Dmarrable

www.serli.com

// Dclaration dun objet de type Dmarrable


Dmarrable dem2;
// Cration dun objet Ordinateur
dem2 = new Ordinateur();
// Dclaration et cration dun objet Personne
Personne pers1 = new Personne(dem2);
pers2.mettreEnRoute();
}
}

Cours POO - M. Baron - Page 150

Notion dinterface et Java


 Une Voiture et un Ordinateur sont des objets Dmarrable
public class Personne {
private Demarrable objetDemarrable;

www.serli.com

public Personne(Demarrable dem) {


objetDemarrable = dem;
}
public void mettreEnRoute() {
objetDemarrable.demarre();
}
}

Une personne peut dmarrer


Voiture et Ordinateur sans
connatre leur nature exacte
Cours POO - M. Baron - Page 151

Notion dinterface et Java


 Les interfaces pourront se driver
 Une interface peut hriter dune autre interface : extends

 Consquences
 La dfinition de mthodes de linterface mre

NomInte1 << Interface >>


+

(NomInte1) sont reprises dans linterface fille


(NomInte2). Toute classe qui implmente
www.serli.com

linterface fille doit donner une implmentation


toutes les mthodes mmes celle hrites

NomInte2 << Interface >>


+

 Utilisation
 Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires
Cours POO - M. Baron - Page 152

Classes abstraites versus interfaces


 Les classes
 Elles sont compltement implmentes
 Une autre classe peut en hriter
 Les classes abstraites
 Elles sont partiellement implmentes

www.serli.com

 Une autre classe peut en hriter mais doit donner une implmentation aux
mthodes abstraites
 Elles ne peuvent pas tre instancies mais peuvent avoir un constructeur

 Les interfaces
 Elles ne sont pas implmentes
 Toute classe qui implmente une ou plusieurs interfaces doit implmenter
toutes leurs mthodes (abstraites)
Cours POO - M. Baron - Page 153

Linterface Cloneable
 Deux possibilits pour dupliquer un objet de ses classes
 Crer une mthode ad-hoc public MaClasse dupliquer() qui retourne une
copie de lobjet en ayant cr une nouvelle instance et initialis les attributs
(en utilisant le constructeur)
saClio

saClio != maClio mais le


contenu est identique

- puissance = 4
- estDmarre = true
- vitesse = 179.8

maClio

recopie

- puissance = 4
- estDmarre = true
- vitesse = 179.8

www.serli.com

 Utiliser linterface Cloneable pour garder la compatibilit avec les autres


classes de Java
 Implmenter la mthode protected Object clone() de linterface
Cloneable
public class Voiture implements Demarrable, Cloneable {
protected Object clone() {
Voiture copie;
copie = new Voiture(this.puissance, (Galerie)laGalerie.clone());
return copie;
}
}

Cours POO - M. Baron - Page 154

Les classes internes Inner Classes


 Rgle de base en Java
 Une classe par fichier et un fichier par classe
 Classes locales ou internes
 Dfinies lintrieur dautres classes
(Moteur dans Voiture)

www.serli.com

 Classes anonymes
 Sont des instanciations de classes et des
implmentations dune classe abstraite
ou dune interface
 La ou les mthodes abstraites doivent tre
implmentes au moment de linstanciation

public class Voiture {


...
class Moteur {
...
}
}

Demarrable uneInstance =
new Demarrable(){
public void demarre() {
// Code ici
}
};

Les classes anonymes sont trs utilises pour


le dveloppement dIHM avec Java/Swing

Cours POO - M. Baron - Page 155

Les classes internes Inner Classes


 Code source : 1 fichier

Classe anonyme, implmente


linterface Initialisable

 classe
 classe anonyme

public class Voiture {

 classe interne
 Gnration de byte-code : 3 fichiers
 classe Voiture.class
 anonyme Voiture$1.class
www.serli.com

 interne Voiture$Moteur.class

public Voiture(...) {
monMoteur = new Moteur(...);
Initialisable monInit = new Initialisable() {
public void initialisation() {
...
}
};
}
class Moteur {
...
public Moteur(...) {
...
}
}

Classe interne

Les fichiers .class qui possdent


dans leur nom un $ ne sont pas
des fichiers temporaires!!!
Cours POO - M. Baron - Page 156

Programmation Oriente Objet


application au langage Java
Les indispensables

Mickal BARON - 2007


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Les packages
 Le langage Java propose une dfinition trs claire du mcanisme
dempaquetage qui permet de classer et de grer les API externes
 Les API sont constitues :
API

0..*

Paquetage

0..*

Classe

0..*

0..*
0..*

Mthode
Attribut

www.serli.com

Interface

 Un package est donc un groupe de classes associes une


fonctionnalit
 Exemples de packages
 java.lang : rassemble les classes de base Java (Object, String, System, )
 java.util : rassemble les classes utilitaires (Collections, Date, )
 java.io : lecture et criture


Cours POO - M. Baron - Page 158

Les packages : ok, mais pourquoi faire?


 Lutilisation des packages permet de regrouper les classes afin
dorganiser des libraires de classes Java
 Exemple : la classe Date est dfinie deux fois

www.serli.com

Nom complet
de la classe
java.util.Date

Package Sous-Package Classe

Cours POO - M. Baron - Page 159

Les packages : utilisation des classes


 Lorsque, dans un programme, il y a une rfrence une classe, le
compilateur la recherche dans le package par dfaut (java.lang)
 Pour les autres, il est ncessaire de fournir explicitement
linformation pour savoir o se trouve la classe :
 Utilisation dimport (classe ou paquetage)
import mesclasses.Point;
import java.lang.String; // Ne sert rien puisque par dfaut
import java.io.ObjectOutput;

www.serli.com

ou
import mesclasses.*;
import java.lang.*; // Ne sert rien puisque par dfaut
import java.io.*;

 Nom du paquetage avec le nom de la classe

Ecriture trs lourde


prfrer la solution avec
le mot cl import

java.io.ObjectOuput toto = new java.io.ObjectOuput(...)

Cours POO - M. Baron - Page 160

Les packages : leur existence physique


 A chaque classe Java correspond un fichier
 A chaque package (sous-package) correspond un rpertoire
Package
Exemple : mesclassses.Voiture
Voiture.java

Classe

mesclasses

www.serli.com

 Un package peut contenir

Le nom des packages


est toujours crit en
minuscules

 Des classes ou des interfaces


 Un autre package (sous-package)

Exemple : mesclassses.ex1.Voiture
ex1
mesclasses

Package (mesclasses)
Sous-package (ex1)
Classe (Voiture.java)
Cours POO - M. Baron - Page 161

Les packages : hirarchie de packages


 A une hirarchie de packages correspond une hirarchie de
rpertoires dont les noms concident avec les composants des noms
de package
 Exemple : la classe String
java

 Bibliothque pure Java

www.serli.com

lang

util

math

 Les sources (*.java) se trouvent


dans le rpertoire src du rpertoire Java
 Les bytecodes (*.class) se trouvent dans
larchive rt.jar du rpertoire Java

String.java

Cours POO - M. Baron - Page 162

Les packages : cration et conseils


 Quand vous crer un projet (TP par exemple) nommez le package
de plus haut (voiture par exemple) niveau au nom du projet
(Voiture par exemple)
Sources

Vos rpertoires de travail


(Pas encore de notion de
package)
Voiture

Geom

Package voiture :
voiture.modele.VoitureElectrique
voiture.modele.Voiture
voiture.test.Test

www.serli.com

voiture

Vos packages. A la racine


de Voiture vous pouvez y
placer des informations
daides lutilisation de
votre package.
(Fichier de lancement par
exemple)

modele

VoitureElectrique.java

test

Voiture.java

Test.java

Cours POO - M. Baron - Page 163

Les packages : cration et conseils


 Pour spcifier une classe quelle appartient une classe utiliser le
mot cl package
Le mot cl package est

www.serli.com

toujours plac en premire


package voiture.modele;
public class VoitureElectrique {
instruction dune classe
...
}
package voiture.modele;
public class Voiture {
...
}
package voiture.test;
import voiture.modele.VoitureElectrique;
import voiture.modele.Voiture;
import ...
public class Test1 {
public static void main(String[] argv) {
...
}
}

Ne confondez pas hritage et package.


Pas la mme chose. VoitureElectrique est dans
le mme package que Voiture

Cours POO - M. Baron - Page 164

Les packages : compilation et excution


 tre plac dans la racine du rpertoire Voiture
Voiture

 La compilation doit prendre en compte les chemins des packages

www.serli.com

javac voiture\modele\*.java voiture\test\*.java

 Lexcution se fait en indiquant la classe principale avec son


chemin

java voiture.test.Test

La sparation entre package,


sous-packages et classes se fait
laide de point . et non de
anti-slash \

Cours POO - M. Baron - Page 165

Les packages : visibilit


 Linstruction import nomPackage.* ne concerne que les classes du
package indiqu.
Elle ne sapplique pas aux classes des sous-packages
Packages diffrents
import java.util.zip.*;
import java.util.*;

www.serli.com

public class Essai {


...
public Essai() {
Date myDate = new Date(...);
ZipFile myZip = new ZipFile(...);
...
}
...

Essai utilise les classes Date du


package java.util et ZipFile du
package java.util.zip

Cours POO - M. Baron - Page 166

Javadoc et les commentaires


 Deux types de commentaires
 Commentaires de traitements : prcision sur le code lui-mme
 Commentaires de documentation (outil javadoc de la JDK : gnration
automatique de pages html)

 Classes, constructeurs, mthodes et champs : prparer le terrain


 Compris entre

/**

et

*/

 Premire ligne : uniquement

/**

www.serli.com

 Suivantes : un espace suivi dune toile


 Dernire ligne : uniquement

*/

/**
* Description de la mthode
* Autres caractristiques
*/
public Voiture(...) {
...
}
}

prcd dun espace


Ajouter du sens et des
prcision vos codes.
Expliquer nest pas traduire!!

Cours POO - M. Baron - Page 167

Javadoc et les commentaires


 Javadoc et intrts
 Javadoc est aux classes ce que les pages de manuel (man) sont Unix ou ce
que Windows Help est aux applications MS Windows
 Rdaction de la documentation technique des classes au fur et mesure du
dveloppement de ces mmes classes puis gnration finale du html

 Utilisation
 Lentit documente est prcde par son commentaire

www.serli.com

 Suivre la prsentation de description des mthodes, classes, prcdente


 Utilisation de tags dfinit par javadoc permettant de typer certaines
informations (utilisation possible de balise html)
@author
@version
@param
@since
@return
@throws
@deprecated
@see

Nom du ou des auteurs


Identifiant de version
Nom et signification de largument (mthodes uniquement)
Version du JDK o cest apparu (utilis par SUN)
Valeur de retour
Classe de lexception et conditions de lancement
Provoque les avertissements de dsapprobation
Rfrence croise
Cours POO - M. Baron - Page 168

Javadoc et les commentaires

www.serli.com

 Exemple avec le source de la classe Object


package java.lang;
/**
* Class <code>Object</code> is the root of the class hierarchy.
* Every class has <code>Object</code> as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @version 1.58, 12/03/01
* @see
java.lang.Class
* @since
JDK1.0
*/
public class Object {
/**
* Returns the runtime class of an object. That <tt>Class</tt>
* object is the object that is locked by <tt>static synchronized</tt>
* methods of the represented class.
*
* @return the object of type <code>Class</code> that represents the
*
runtime class of the object.
*/
public final native Class getClass();
...

 Gnration du code html partir de loutil javadoc


Pour obtenir les
informations de javadoc
javadoc -help

javadoc [options] nomDesClassesJava.java

Cours POO - M. Baron - Page 169

Javadoc et les commentaires

www.serli.com

 Exemple de laperu html de la description de la classe Object


gnre avec javadoc

Cours POO - M. Baron - Page 170

Jar
 Jar et intrts
 Larchiveur jar est loutil standard pour construire les archives qui ont le
mme objectif que les bibliothques de programmes utilises par certains
langages de programmation (lib par exemple)
java verbose HelloWorld

Montre les archives utilises


pour excuter le programme
HelloWorld

www.serli.com

 Utilisation pour la cration


 Utilisation de loutil jar
 Pour crer un fichier .jar contenant tous les fichiers du rpertoire courant
jar cvf hello.jar .

Cration Verbose Nom archive

Le . indique le
rpertoire courant
Cours POO - M. Baron - Page 171

Jar
 Utilisation pour la cration (suite)
 Utilisation dun fichier manifeste (MANIFEST.MF) qui prcise un ensemble
dattributs pour excuter dans de bonnes conditions lapplication
 Lattribut Main-class par exemple permet de connatre la classe principale
excuter
Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-class: HelloWorld

MANIFEST.MF

www.serli.com

 Cration du jar avec un fichier manifeste :


jar cvfm hello.jar MANIFESTE.MF .

 Utilisation pour lexcution


java jar hello.jar

Cette option permet dexcuter


partir dune archive du code java

La classe HelloWorld est


charge par lintermdiaire
du fichier MANIFESTE.MF
Cours POO - M. Baron - Page 172

Exception
 Dfinition
 Une exception est un signal qui indique que quelque chose dexceptionnel
(comme une erreur) sest produit. Elle interrompt le flot dexcution normal
du programme

 A quoi a sert
 Grer les erreurs est indispensable :
 Mauvaise gestion peut avoir des consquences catastrophiques (Ariane 5)

www.serli.com

 Mcanisme simple et lisible :


 Regroupement du code rserv au traitement des erreurs (pas de
mlange avec lalgorithme)
 Possibilit de rcuprer une erreur plusieurs niveaux dune
application (propagation dans la pile des appels de mthodes)

 Vocabulaire
 Lancer ou dclencher (throw) une exception consiste signaler les erreurs
 Capturer ou attraper (catch) une exception permet de traiter les erreurs
Cours POO - M. Baron - Page 173

Exception
 Premier exemple : lancer et capturer une exception
public class Point {
... // Dclaration des attributs
... // Autre mthodes et constructeurs
public Point(int x, int y) throws ErrConst {
if ((x < 0) || (y < 0)) throw new ErrConst();
this.x = x ; this.y = y;
}

www.serli.com

public void affiche() {


System.out.println("Coordonnes : " + x + " " + y);
}
public class Test {
public static void main(String[] argv) {
try {
Point a = new Point(1,4);
a.affiche();
a = new Point(-2, 4);
a.affiche();
} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.exit(-1);
}
}
}

La classe
ErrConst nest
pas encore
dfinie. A voir
plus tard

Cours POO - M. Baron - Page 174

Exception : mcanisme
 Explication
 Lorsquune situation exceptionnelle est rencontre, une exception est lance
 Si elle nest pas traite, elle est transmise au
bloc englobant, , jusqu ce quelle soit
traite ou parvienne en haut de la pile dappel.

Mthode n
bloc 1
bloc 1.1

Elle stoppe alors lapplication


bloc 2

www.serli.com

Mthode 1

bloc 2.1
bloc 2.1.1

Mthode 2

appel de
mthode
transmission
d'exception

bloc 2.1.2

Mthode n

Une exception vient


de se produire

bloc 2.2

Cours POO - M. Baron - Page 175

Exception : lancer ou dclencher


 Une mthode dclare quelle peut lancer une exception par le
mot cl throws
public Point(int x, int y) throws ErrConst {
...
}

Permet au constructeur
Point de lancer une
exception ErrConst

 Soit la mthode lance une exception, en crant une nouvelle valeur


(un objet) dexception en utilisant le mot cl throw

www.serli.com

public Point(int x, int y) throws ErrConst {


if ((x < 0) || (y < 0)) throw new ErrConst();
this.x = x ; this.y = y;
}

Cration dune
nouvelle valeur
dexception

 Soit la mthode appelle du code qui lance une exception


public Point(int x, int y) throws ErrConst {
checkXYValue(x,y);
this.x = x ; this.y = y;
}

private void checkXYValue(in x, int y)


throws ErrConst {
if ((x < 0) || (y < 0))
throw new ErrConst();
}

Cours POO - M. Baron - Page 176

Exception : capturer ou attraper


 On parle ici de gestionnaire dexception. Il sagit de traiter par des
actions la situation exceptionnelle
 On dlimite un ensemble dinstructions susceptibles de dclencher
une exception par des blocs try {}
try {
Point a = new Point(1,4);
a.affiche();
a = new Point(-2, 4);
a.affiche();
}

Mthodes risques. Elles


sont surveilles

www.serli.com

 La gestion des risques est obtenue par des blocs


catch(TypeException e) {}
} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.exit(-1);
}

 Ces blocs permettent de capturer les exceptions dont le type est spcifi et
dexcuter des actions adquates
Cours POO - M. Baron - Page 177

Exception : capturer ou attraper


 Comprhension du mcanisme de capture
public class Test {
public static void main(String[] argv) {
try {
Point a = new Point(1,4);
a.affiche();
a = new Point(-2, 4);
a.affiche();
} catch (ErrConst e) {
System.out.println("Erreur Construction");

www.serli.com

System.exit(-1);

Lerreur exceptionnelle est


traite par le bloc catch

}
...
}
}

Puis, il y a poursuite de lexcution en


dehors du bloc try catch
Remarque : si erreur le programme
sarrte (System.exit(-1))

Cours POO - M. Baron - Page 178

Exception : modlisation
 Les exceptions en Java sont considres comme des objets
 Toute exception doit tre une instance dune sous-classe de la classe
java.lang.Throwable
Erreurs non rcuprables.
Plantage de lapplication

www.serli.com

Error

Throwable

Erreur que lon peut traiter


puisque rcuprable

Exception

NullPointerException

ErrConst

Pour dfinir de nouveaux types


dexception, on sous-classera
la classe Exception
Cours POO - M. Baron - Page 179

Exception : modlisation
 Les exceptions sont des objets nous pouvons donc dfinir
 Des attributs particuliers
 Des mthodes
Exception
- message : String

www.serli.com

Renvoie le message derreur


dcrivant lexception

Affiche sur la sortie erreur


standard la liste des appels de
mthodes ayant conduit
lexeception

+ Exception()
+ Exception(String)
+ getMessage() : String
+ printStackTrace()
+

ErrConst

Contient un message derreur


dcrivant lexception
Constructeur avec ou sans
argument

Classe trs simple, puisque


rien na t redfini

public class ErrConst extends Exception {


public ErrConst() {
...
}
}

Cours POO - M. Baron - Page 180

Exception : modlisation
 Utilisation de lobjet ErrConst

Erreur de type ErrConst


qui hrite de Exception

public class Test {


public static void main(String[] argv) {
try {
...
} catch (ErrConst e) {
System.out.println("Erreur Construction");

Affichage de lerreur

System.out.println(e.getMessage());
e.printStackTrace();

www.serli.com

System.exit(-1);
}
...
}

Affichage de la liste des


mthodes

Cours POO - M. Baron - Page 181

Exception : attraper les tous


 Il est possible de capturer plus dune exception. Un bloc try et
plusieurs blocs catch
public class Point {
public void deplace(int dx, int dy) throws ErrDepl {
if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl();
x += dx ; y +=dy;
}
public Point(int x, int y) throws ErrConst {
if ((x < 0) || (y < 0)) throw new ErrConst();
this.x = x ; this.y = y;
}

www.serli.com

...
public class Test {
public static void main(String[] argv) {
try {
... // Bloc dans lequel on souhaite dtecter
les exceptions ErrConst et ErrDepl
} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.exit(-1);
} catch (ErrDepl e) {
System.out.println("Erreur Dplacement");
System.exit(-1);
}
}
}

Dfinition dune
nouvelle mthode qui
lance une exception

Attrape la nouvelle
exception de type
ErrDepl

Cours POO - M. Baron - Page 182

Exception : attrapez les tous


 Toute mthode susceptible de lever une exception doit :
 Soit lattraper (bloc try catch)
 Soit dclarer explicitement quelle peut lancer une exception (mot cl throws)

 Les exceptions dclares dans la clause throws


dune mthode sont :

www.serli.com

Les exceptions leves dans la mthode


(Point) et non attrapes par celle-ci

public Point(int x, int y) throws ErrConst {


if ((x < 0) || (y < 0)) throw new ErrConst();
this.x = x ; this.y = y;
}

Les exceptions leves dans des


mthodes (checkXYValue) appeles par
la mthode (Point) et non attrapes par
celle-ci
public Point(int x, int y) throws ErrConst {
checkXYValue(x,y);
this.x = x ; this.y = y;
}
private void checkXYValue(in x, int y) throws
ErrConst {
if ((x < 0) || (y < 0))
throw new ErrConst();
}

Cours POO - M. Baron - Page 183

Exception : attrapez les tous


 Il faut sassurer que les exceptions sont sous contrle

www.serli.com

public class Point {


public void deplace(int dx, int dy) throws ErrDepl {
if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl();
x += dx ; y +=dy;
}
public class ErrDepl extends Exception {
public ErrDepl() {
public void transformer() {
...
...
}
this.deplace(...);
}
}
}

Ne pas oublier de traiter une


exception sinon le compilateur
ne vous loupe pas!!!!

Cours POO - M. Baron - Page 184

Exception : attrapez les tous


 Pour garantir une bonne compilation deux solutions
public class Point {
public void deplace(int dx, int dy) throws ErrDepl {
if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl();
x += dx ; y +=dy;
}
public void transformer() {
...
this.deplace(...);
}

www.serli.com

Soit en ajoutant explicitement


linstruction throws la
mthode transformer de faon
rediriger lerreur
public void transformer()
throws ErrDepl {
...
this.deplace(...);
}

Soit en entourant dun bloc


try catch la mthode qui
peut poser problme
public void transformer() {
try {
...
this.deplace(...);
} catch (ErrDepl e) {
e.printStackTrace();
}
}

Cours POO - M. Baron - Page 185

Exception : transmission dinformation


 Possibilit denrichir la classe ErrConst en ajoutant des attributs et
des mthodes de faon communiquer
ErrConst
public class Point {
public Point(int x, int y) throws ErrConst {
if ((x < 0) || (y < 0)) throw new ErrConst(x,y);
this.x = x ; this.y = y;
}
public class ErrConst extends Exception {
...
private int abs, ord;
}

- abs, ord : int


+ ErrConst(x,y)
+ getAbs : int
+ getOrd : int

public ErrConst(int x, int y) {


this.abs = x;
this.ord = y;
}

www.serli.com

public int getAbs() { return this.abs; }


public int getOrd() { return this.ord; }
}
public class Test {
public static void main(String[] argv) {
try {
...
a = new Point(-2, 4);
} catch (ErrConst e) {
System.out.println("Erreur Construction point");
System.out.println("Coordonnes souhaites : "
+ e.getAbs() + " " + e.getOrd());
System.exit(-1);
}
...

ErrConst permet de
connatre les valeurs
qui ont fait chouer la
construction de Point

Cours POO - M. Baron - Page 186

Exception : finally
 Bloc finally : cest une instruction optionnelle qui peut servir de
nettoyage . Elle est excute quelle que soit le rsultat du bloc try
(cest--dire quil ait dclench une exception ou non)
 Permet de spcifier du code dont lexcution est garantie quoi quil
arrive

www.serli.com

 Intrt double :
 Rassembler dans un seul bloc un ensemble dinstructions qui autrement
auraient du tre dupliques
 Effectuer des traitements aprs le bloc try, mme si une exception a t leve
et non attrape par les blocs catch
Cours POO - M. Baron - Page 187

Exception : finally
public class Test {
public static void main(String[] argv) {
try {
... // Bloc dans lequel on souhaite dtecter
les exceptions ErrConst et ErrDepl
} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.out.println("Fin du programme");
System.exit(-1);
} catch (ErrDepl e) {
System.out.println("Erreur Dplacement");
System.out.println("Fin du programme");
System.exit(-1);
}
}
public class Test {
}
public static void main(String[] argv) {
try {
... // Bloc dans lequel on souhaite dtecter
les exceptions ErrConst et ErrDepl
} catch (ErrConst e) {
System.out.println("Erreur Construction");
} catch (ErrDepl e) {
System.out.println("Erreur Dplacement");
} finally {
System.out.println("Fin du programme");
System.exit(-1);
}
}
}

www.serli.com

Ces instructions sont


rappeles plusieurs
fois

Au moyen du mot cl
finally, il est possible
de factoriser

Cours POO - M. Baron - Page 188

Exception : pour ou contre

www.serli.com

erreurType lireFichier() {
int codeErreur = 0;
// Ouvrir le fichier
if (isFileIsOpen()) {
// Dtermine la longueur du fichier
if (getFileSize()) {
// Vrification de lallocation de la mmoire
if (getEnoughMemory()) {
// Lire le fichier en mmoire
if (readFailed()) {
codeErreur = -1;
}
} else {
codeErreur = -2;
}
} else {
codeErreur = -3;
}
// Fermeture du fichier
if (closeTheFileFailed()) {
codeErreur = - 4;
}
} else {
codeErreur = - 5;
}

La gestion des erreurs


devient trs difficile

Difficile de grer les


retours de fonctions

Le code devient de plus


en plus consquent

Cours POO - M. Baron - Page 189

Exception : pour ou contre


 Le mcanisme dexception permet
 La concision

www.serli.com

 La lisibilit

void lireFichier() {
try {
// Ouvrir le fichier
// Dtermine la longueur du fichier
// Vrification de lallocation de la mmoire
// Lire le fichier en mmoire
// Fermer le fichier
} catch (FileOpenFailed) {
...
} catch (FileSizeFailed) {
...
} catch (MemoryAllocFailed) {
...
} catch (FileReadFailed) {
...
} catch (FileCloseFailed) {
...
}
}

Prfrer cette solution la


prcdente. Programmation
propre et professionnelle
Cours POO - M. Baron - Page 190

Exception : les exceptions courantes


 Java fournit de nombreuses classes prdfinies drives de la classe
Exception
 Ces exceptions standards se classent en deux catgories
 Les exceptions explicites (celles que nous avons tudies), mentionnes par le
mot cl throws
 Les exceptions implicites qui ne sont pas mentionnes par le mot cl throws

www.serli.com

 Liste de quelques exceptions


 ArithmeticException (division par zro)
 NullPointerException (rfrence non construite)
 ClassCastException (problme de cast)
 IndexOutOfBoundsException (problme de dpassement dindex dans tableau)
Cours POO - M. Baron - Page 191

Les flux
 Pour obtenir des donnes, un programme ouvre un flux de donnes
sur une source de donnes (fichier, clavier, mmoire, etc)
 De la mme faon pour crire des donnes dans un fichier, un
programme ouvre un flux de donnes
www.serli.com

 Java fournit un paquetage java.io qui permet de grer les flux de


donnes en entre et en sortie, sous forme de caractres (exemple
fichiers textes) ou sous forme binaire (octets, byte)
Cours POO - M. Baron - Page 192

Les flux
 En Java, le nombre de classes intervenant dans la manipulation des
flux est important (plus de 50)
 Java fournit quatre hirarchies de classes pour grer les flux de
donnes
 Pour les flux binaires :
 La classe InputStream et ses sous-classes pour lire des octets
(FileInputStream)

www.serli.com

 La classe OuputStream et ses sous-classes pour crire des octets


(FileOuputStream)
 Pour les flux de caractres :
 La classe Reader et ses sous-classes pour lire des caractres
(BufferedReader, FileReader)
 La classe Writer et ses sous-classes (BufferedWriter, FileWriter)
Cours POO - M. Baron - Page 193

Les flux de caractres


 Exemple : crire du texte dans un fichier

FileReader hrite de
Reader et permet de
manipuler un flux texte
associ un fichier

public class TestIO {


public static void main(String[] argv) {
FileWriter myFile = new FileWriter("a_ecrire.txt");
myFile.write("Voil ma premire ligne dans un fichier");
myFile.close();
www.serli.com

}
}

Fermeture du flux
myFile vers le fichier
a_ecrire.txt

Ecriture dune ligne de


texte dans le fichier
a_ecrire.txt

Cours POO - M. Baron - Page 194

Les flux de caractres


 Exemple : lire lentre standard : enfin !!!

Convertit un objet
de type InputStream
en Reader

public class TestIO {


public static void main(String[] argv) {
System.out.println("Veuillez saisir votre nom :");
String inputLine = " ";
try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
String inputLine;
inputLine = is.readLine();

www.serli.com

is.close();
} catch (Exception e) {
System.out.println("Intercept : " + e);
}

Lit la ligne jusquau


prochain retour
chariot

if (inputLine != null)
System.out.println("Votre nom est :" + inputLine);
}
}

Chane saisie
Cours POO - M. Baron - Page 195

Les flux de caractres


 Exemple : copie de fichier en utilisant les caractres
FileReader et
FileWriter hritent de
Reader et Writer et
permettent de
manipuler un flux

public class TestIO {


public static void main(String[] argv) {
FileReader in = new FileReader("a_lire.txt");
FileWriter out = new FileWriter("a_ecrire.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}

texte associ un

www.serli.com

fichier texte

in.close();
out.close();

Transfert de donnes
jusqu ce que in ne
fournisse plus rien

}
}

Fermeture des flux et


par consquent des
fichiers respectifs
Cours POO - M. Baron - Page 196

Les flux binaires


 Exemple : copie de fichier en utilisant les binaires
Mme raisonnement
que pour les
caractres sauf
public class TestIO {
public static void main(String[] argv) {
FileInputStream in = new FileInputStream("a_lire.txt");
FileOutputStream out = new FileOutputStream("a_ecrire.txt");
int c;

www.serli.com

while ((c = in.read()) != -1) {


out.write(c);
}
in.close();
out.close();
}
}

Cours POO - M. Baron - Page 197

La classe File
 Java dispose dune classe File qui offre des fonctionnalits de gestion
de fichiers
 La cration dun objet de type File
File monFichier = new File("truc.dat");

File

Attention : ne pas confondre


la cration de lobjet avec la
cration du fichier physique

Cration du fichier
portant le nom de name

www.serli.com

- name : String
+ File(String nf)
+ createNewFile()
+ delete() : boolen
+ exists() : boolen
+ getName() : String
+ isFile() : boolen
+

Vrifie si le fichier
existe physiquement
File monFichier = new File("c:\toto.txt");
if (monFichier.exists()) {
monFichier.delete();
} else {
monFichier.createNewFile();
}

Cours POO - M. Baron - Page 198

Les collections
 Pour linstant nous avons tudi le tableau pour structurer les
donnes
 Taille statique
 Lent pour la recherche dlments particuliers
 Impossibilit dutiliser un pattern de dplacement dans les lments

www.serli.com

 Java propose depuis la version 2 des classes permettant de manipuler


les principales structures de donnes
 Les tableaux dynamiques implmentes par ArrayList et Vector
 Les listes implmentes par LinkedList
 Les ensembles implmentes par HashSet et TreeSet
Cours POO - M. Baron - Page 199

Les collections
 Ces classes implmentent toutes indirectement une mme interface
Collection quelles compltent de fonctionnalits propres
Collection << Interface >>

HashSet

TreeSet

www.serli.com

HashSet

LinkedList

ArrayList

 Depuis la version 5 de Java, possibilit dutiliser les gnriques pour


typer le contenu des Collections
 Avant : Voiture maVoiture = (Voiture)myList.get(2)
 Maintenant : Voiture maVoiture = myList.get(2)
Plus de problme de
conversion explicite

Cours POO - M. Baron - Page 200

Les collections
 Linterface Collection permet
 La gnricit et rfrences : possibilit de stocker des lments de type
quelconque, pour peu quil sagisse dobjets. Un nouvel lment introduit dans
une collection Java est une rfrence lobjet et non une copie
 Les itrateurs : ils permettent de parcourir un par un les diffrents lments

www.serli.com

dune collection
 Efficacit des oprations sur des collections
 Oprations communes toutes les collections : les collections que nous allons
tudier implmentent toutes au minimum linterface Collection, de sorte
quelle disposent de fonctionnalits communes
Cours POO - M. Baron - Page 201

Les collections : les gnriques Java


 Avec la version 5 de Java possibilit dexploiter les gnriques dans
les collections et pour dautres aspects du langage galement
 Une syntaxe particulire a t rajoute de manire prendre en
considration les gnriques
 < ? > : signale quil faut prciser le type de la classe
 < ? , ? > : signale quil faut prciser deux types

www.serli.com

 Avec les gnriques il va tre possible de fixer la construction de la


collection le type du contenu stock dans les collections
 Avanages
 Toutes les mthodes accesseurs et modifieurs qui manipulent les lments
dune collection sont signs suivant le type dfini la construction de la
collection
 Vrification des types pendant le dveloppement (avant problme de
CastClassException)

Cours POO - M. Baron - Page 202

Les collections : Iterator


 Les itrateurs permettent de parcourir les lments dune collection
sans connaissance prcise du type de la collection : Polymorphisme
 Il existe deux familles ditrateurs :
 monodirectionnels
Le parcours de la collection se fait dun dbut vers une fin; on ne passe quune
seule fois sur chacun des lments
www.serli.com

 bidirectionnels
Le parcours de la collection peut se faire dans les deux sens ; on peut avancer
et reculer sa guise dans la collection
La notion dIterator fait
partie de lensemble des
Design Patterns

Cours POO - M. Baron - Page 203

Les collections : Iterator


 Itrateur monodirectionnel : interface Iterator
 Par dfaut, toutes collections possdent un attribut de type Iterator
Vrifie sil y a un
prochain

Iterator << Interface >>


+ hasNext() : boolen
+ next() : < ? >
+ remove()

www.serli.com

Supprime le dernier
objet renvoy par
next()

Iterator iter = c.iterator();

Permet dobtenir
lobjet courant et
passe au suivant

c est une collection


et on rcupre son
Iterator

while (iter.hasNext()) {

On vrifie sil y a
possibilit de
rcuprer un objet

??? o = iter.next();
...
}

On rcupre lobjet
courant puis on
passe au suivant
Cours POO - M. Baron - Page 204

Les collections : Iterator


 Itrateur bidirectionnel : interface ListIterator
 Cela concerne les listes et les tableaux dynamiques

Iterator << Interface >>

 Permet dajouter et de supprimer des objets

www.serli.com

Vrifie sil y a un
prcdent

On vrifie sil y a
possibilit de
rcuprer un objet
prcdemment

Rcupre lobjet
prcdemment puis on
passe au prcdent

ListIterator << Interface >>


+ previous() : < ? >
+ hasPrevious() : boolen
+ add(< ? >)
+ set(< ? >)
+

Ajoute ou modifie la
position courante un
lment de la collection

Iterator iter = c.listIterator();


while (iter.hasPrevious()) {

c est une collection


et on rcupre son
ListIterator
Initialise en dbut
de liste

??? o = iter.previous();
...
}

Cours POO - M. Baron - Page 205

Les collections : LinkedList


 Cette classe permet de manipuler des listes dites doublement
chanes .
A chaque lment de collection, on associe implicitement deux
informations qui sont les rfrences llment prcdent et suivant

www.serli.com

LinkedList<String> l1 = new LinkedList<String>();


ListIterator iter = l1.listIterator();

Plus rien
aprs ses
lments,
on fait un
retour en
arrire

iter.add("Bonjour");
iter.add("Coucou");
while(iter.hasPrevious()) {
String o = iter.previous();
System.out.println(o);
}

Ajout des lments


au travers de
litrateur
Lutilisation de la
LinkedList est
transparente
Cours POO - M. Baron - Page 206

Les collections : LinkedList


 Possibilit dutiliser les collections (ici LinkedList est un exemple)
sans les itrateurs mais moins performant !!!
LinkedList<String> l1 = new LinkedList<String>();
l1.add("Bonjour");
l1.add("Coucou");

www.serli.com

for (int i = 0; i < l1.size(); i++) {


String o = l1.get(i);
System.out.println(o);
}

Utilisation
de la
mthode
add de la
classe
LinkedList

Lutilisation
de la
LinkedList
nest pas
transparente.
Connaissance
obligatoire de
ces mthodes

Ne pas modifier la collection (add


de LinkedList) pendant quon
utilise litrateur (next())
Cours POO - M. Baron - Page 207

Les collections : ArrayList


 La classe ArrayList est une encapsulation du tableau avec la
possibilit de le rendre dynamique en taille
 Possibilit dutiliser des ListIterator mais on prfre son utilisation
un lment de rang donn
ArrayList<Object> myArrayList = new ArrayList<Object>();

www.serli.com

myArrayList.add("Coucou");
myArrayList.add(34);
for (int i = 0; i < myArrayList.size(); i++) {
Object myObject = myArrayList.get(i);
if (myObject instanceof String) {
System.out.println("Chane:" + ((String)myObject));
}
if (my_object instanceof Integer) {
System.out.println("Integer:" + ((Integer)myObject));
}
}
Prfrer
lutilisation de la
classe ArrayList au lieu de la
classe Vector

Cours POO - M. Baron - Page 208

Les collections : HashSet


 La classe HashSet permet de grer les ensembles. Deux lments ne
peuvent tre identiques
 Il faut prvoir deux choses dans vos classes :
 La redfinition de la mthode hashCode() qui est utilise pour ordonnancer les
lments dun ensemble (calcul la table de hachage dun objet)

www.serli.com

 La redfinition de la mthode equals(Object) qui compare des objets de mme


classe pour connatre lappartenance dun lment lensemble
public class TestHashSet {
public static void main(String[] argv) {
Point p1 = new Point(1,3), p2 = new Point(2,2);
Point p3 = new Point(4,5), p4 = new Point(1,8);
Point p[] = {p1, p2, p1, p3, p4, p3}
HashSet<Point> ens = new HashSet<Point>();
for (int i = 0; i<p.length; i++) {
System.out.println("Le Point ") ; p[i].affiche();
boolean ajoute = ens.add(p[i]);
if (ajoute) System.out.println(" a t ajout");
else System.out.println("est dj prsent");
System.out.print("Ensemble = "); affiche(ens);
}

public static void affiche(HashSet ens) {


Iterator iter = ens.iterator();
while(iter.hasNext()) {
Point p = iter.next();
p.affiche();
}
System.out.println();
}

}
}

Cours POO - M. Baron - Page 209

Les collections : HashSet


public class Point {
private int x,y;

www.serli.com

Point(int x, int y) {
this.x = x; this.y = y;
}
public int hashCode() {
return x+y;
}
public boolean equals(Object pp) {
Point p = (Point)pp;
return ((this.x == p.x) &
(this.y == p.y));
}
public void affiche() {
System.out.print("[" + x + " "
+ y + "] ");
}

Redfinition des
mthodes hashCode() et
equals(Object)

Cours POO - M. Baron - Page 210

Vous aimerez peut-être aussi