Vous êtes sur la page 1sur 217

Programmation Oriente Objet

application au langage Java


Version Novembre 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
 Embarqu et temps rel

keulkeul.blogspot.com

 Systmes et rseaux
 Gestion Electronique 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 Java - 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

keulkeul.blogspot.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 Java - 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
 Programmation structure pas adapte

 Dans les annes 70


keulkeul.blogspot.com

 Dveloppement par Xrox du premier systme Fentres, Icnes


et Souris
 SmallTalk, archtype des langages objets
 Dveloppement par Apple des premiers Mac
Cours Java - 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

keulkeul.blogspot.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 Java - 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

 Programmation Structure
keulkeul.blogspot.com

 Unit logique : le module


 Une zone pour les variables
 Une zone pour les fonctions
 Chaque fonction rsout une partie du problme
 Structuration descendante du programmeCours Java - M. Baron - Page

Principes POO : programmation par objets


 Unit logique : lobjet
 Objet est dfini par

maVoiture

 un tat

- couleur = bleue

 un comportement

- vitesse = 100

 une identit

 tat : reprsent par des attributs (variables) qui stockent

keulkeul.blogspot.com

des valeurs
 Comportement : dfini par des mthodes (procdures) qui
modifient des tats
 Identit : permet de distinguer un objet dun autre objet
Cours Java - 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

keulkeul.blogspot.com

 une mthode qui envoie un message un autre objet

dmarre

ma voiture

le moteur

Cours Java - M. Baron - Page 8

Principes POO : notion de classe


 Les objets qui ont les mmes tats et les mmes comportements sont regroups : 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

- puissance : entier

keulkeul.blogspot.com

Attributs

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

Mthodes
- Slecteur

+ demarre()

- Modificateurs

+ acclre (rel)

Visibilit

Cours Java - 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

keulkeul.blogspot.com

Voiture

Cours Java - 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 :

Ceci est une alerte

Ceci est une astuce

keulkeul.blogspot.com

 Mise en place du cours


 Cours de Francis Jambon (ancien MdC lUniversit de Poitiers)
 Cours de Fabrice Depaulis (ancien ATER lUniversit de Poitiers)
 Livre : Programmer en Java 2me dition Claude Delannoy - Eyrolles
 Internet : www.developpez.com
Cours Java - M. Baron - Page 11

Organisation ...

 Partie 1 : Introduction au langage JAVA


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

keulkeul.blogspot.com

 Partie 4 : Hritage
 Partie 5 : Hritage et polymorphisme
 Partie 7 : Les indispensables : package,collections
et exception

Cours Java - 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

keulkeul.blogspot.com

 1993 : Monte en puissance du Web grce Mosaic (lide dadapter


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 Java - 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

keulkeul.blogspot.com

 Sun dfinit le langage Java comme


 Simple

 Sr

 Orient objet

 Portable

 Rparti

 Performant

 Interprt

 Multitches

 Robuste

 Dynamique ...

Cours Java - 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

keulkeul.blogspot.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 Java - M. Baron - Page 16

Machines Virtuelles Java ...


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

keulkeul.blogspot.com

 Cartes puces
 ...

Cours Java - 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

 Diffusion sur larchitecture cible

Byte Code

MonProgramme.class

keulkeul.blogspot.com

 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 Java - 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

 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
keulkeul.blogspot.com

 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 Java - M. Baron - Page 19

Les outils ...


 Simples diteurs ou environnements de dveloppement
 Eclipse
 NetBeans
 JBuilder
 IntelliJ


 Les ressources sur Java


keulkeul.blogspot.com

 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 Java - M. Baron - Page 20

LAPI de Java

Packages

keulkeul.blogspot.com

Classes

Description
Attributs
Mthodes

Cours Java - M. Baron - Page 21

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

 Java en action

keulkeul.blogspot.com

 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 Java - M. Baron - Page 22

Ouvrages de rfrence
 Ouvrages thmatiques aux ditions OReilly sur une slection
des Packages Java (certains traduits en Franais)

keulkeul.blogspot.com

 Ouvrages de rfrence de SUN aux ditions Paperback


(en anglais uniquement)

Cours Java - 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

keulkeul.blogspot.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 Java - 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


 Gnration dun fichier Byte-Code NomDeClasse.class

keulkeul.blogspot.com

 Pas ddition de liens (seulement une vrification)

 Excution
 java NomDeClasse

Ne pas mettre lextension .class


pour lexcution

 Choisir la classe principale excuter

Cours Java - 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)

keulkeul.blogspot.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 Java - M. Baron - Page

27

Initialisation et constantes
 Initialisation
 Une variable peut recevoir une valeur 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);

 Constantes
keulkeul.blogspot.com

 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 Java - M. Baron - Page 28

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

 Itrations

Il ny a pas de motcl then dans la


structure Choix

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


 Boucle (for each) : for (Type var : Collection) { }
 Tant que : while (condition) { }

Nouveaut Java 5

keulkeul.blogspot.com

 Faire jusqu : do { } while (condition)

 Slection borne
 Selon faire : switch ident { case valeur0 : case valeur1 :
default: }

Penser vrifier si break est


ncessaire dans chaque case

 Le mot cl break demande sortir du bloc

Cours Java - M. Baron - Page 29

Structure de contrle
 Exemple : structure de contrle
 Faisons varier n

keulkeul.blogspot.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...");
}
}

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 Java - 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
 a==b, a!=b, a>b, a<b, a>=b, a<=b

keulkeul.blogspot.com

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

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

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

 Ou : a || b , a | b

 Conversion de type explicite (cast)


 (NouveauType)variable

Cours Java - M. Baron - Page 31

Oprateurs sur les types primitifs


 Exemple : simulation du Loto
 Pas optimis mais montre 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;

keulkeul.blogspot.com

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

Cours Java - 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

keulkeul.blogspot.com

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

a=b

Cours Java - 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, )
 Des rfrences sur des objets ( voir dans la partie Classes et Objets)

keulkeul.blogspot.com

 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 Java - 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

keulkeul.blogspot.com

int monTableau[];

Attention : une dclaration de tableau ne doit


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

Cours Java - 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
int[] monTableau; // Dclaration
monTableau = new int[3]; // Dimensionnement

keulkeul.blogspot.com

 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 Java - 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

keulkeul.blogspot.com

 Java vrifie automatiquement lindice lors de laccs (exception leve)


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 Java - 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};

3 Initialisation
monTableau[0] = 1;
monTableau[1] = 2;
keulkeul.blogspot.com

monTableau[2] = 3;
for (int i = 0; i < monTableau.length; i++) {
System.out.println(monTableau[i]);
}
for (int current : monTableau) {
System.out.println(curent);
}

Mme chose avec


lutilisation du for each
Cours Java - 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]

 Tableaux non-rectangulaires
keulkeul.blogspot.com

 Dimensionnement :

tab

monTableau = new type[2]

monTableau[0] = new type[2]


monTableau[1] = new type[3]

null
null

tab

Cours Java - 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


keulkeul.blogspot.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 Java - 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)

keulkeul.blogspot.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 Java - 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)

keulkeul.blogspot.com

 Ayant une smantique commune

 Les objets sont des reprsentations dynamiques, du modle


dfini pour eux au travers de la classe (instanciation)
 Une classe permet d'instancier (crer) plusieurs objets
 Chaque objet est instance d'une classe et une seule
Cours Java - M. Baron - Page

43

Classe et notation UML

Voiture

Nom de la classe

- puissance : entier
Attributs

- estDmarre : boolen
- vitesse : rel

keulkeul.blogspot.com

Mthodes
- Slecteur
- Modificateurs

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

Visibilit
Cours Java - 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;
}

keulkeul.blogspot.com

Slecteur

public void demarre() {


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

Modificateurs
}

Cours Java - 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;

keulkeul.blogspot.com

public int deQuellePuissance() {


return puissance;
}

Attributs visibles
dans les mthodes

public void demarre() {


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

Cours Java - 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;
}

keulkeul.blogspot.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 Java - M. Baron - Page 47

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


 Classe Voiture dcrite dans le fichier Voiture.java
keulkeul.blogspot.com

 Il peut exceptionnellement y avoir plusieurs classes par fichier


(cas des Inner classes)

Respecter les minuscules et


les majuscules des noms
Cours Java - 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
 Possibilit de lui appliquer toute opration (mthode) dfinie dans la

keulkeul.blogspot.com

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 Java - M. Baron - Page 49

Objet et notation UML


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

Voiture
instance of

Relation dinstanciation

Nom de lobjet, rfrence


ou de linstance

keulkeul.blogspot.com

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

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

tats des objets


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

instance of

keulkeul.blogspot.com

ladaBerline110

maClio

205Gti

- puissance = 6

- puissance = 4

- puissance = 6

- estDmarre = false

- estDmarre = true

- estDmarre = true

- vitesse = 0

- vitesse = 179.8

- vitesse = 250

Cours Java - 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
 Cest--dire si les rfrences sont les mmes, cela ne compare pas

keulkeul.blogspot.com

les attributs

a=b



Cours Java - M. Baron - Page 52

Affectation et comparaison
 Lobjet maClio et saClio ont les mmes attributs (tats
identiques) mais ont des rfrences diffrentes
 maClio != saClio
Le test de comparaison
(== et !=) entre objets
ne concerne que les
rfrence et non les
attributs!!!!

keulkeul.blogspot.com

saClio

Voiture
instance of

maClio

- puissance = 4

- puissance = 4

- estDmarre = true

- estDmarre = true

- vitesse = 179.8

- vitesse = 179.8
Cours Java - 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


keulkeul.blogspot.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 Java - 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
 Constitue des mthodes de la classe

keulkeul.blogspot.com

 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 Java - 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

keulkeul.blogspot.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 occupe est rcupre
Cours Java - 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
 Un objet seulement dclar vaut null
(mot rserv du langage)

monObjet

keulkeul.blogspot.com

 Cration et allocation de la mmoire


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

attribut 1

attribut n

 Renvoi dune rfrence sur lobjet maintenant cr


 monObjet != null

Cours Java - M. Baron - Page 57

Cration dobjets : ralisation


 La cration dun nouvel objet est obtenue par lappel
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 {

keulkeul.blogspot.com

Dclaration

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 Java - 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

keulkeul.blogspot.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 Java - 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

keulkeul.blogspot.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 Java - M. Baron - Page 60

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

keulkeul.blogspot.com

Constructeur
avec un
paramtre

private boolean estDemarree;


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

Cours Java - 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;

keulkeul.blogspot.com

maVoiture = new Voiture(7);

Cration et
allocation
mmoire
avec Voiture(int)

Voiture maSecVoiture;
// Sous entendu quil existe
// explicitement un constructeur : Voiture(int)
maSecVoiture = new Voiture(); // Erreur
}
}

Cours Java - 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 {

keulkeul.blogspot.com

public static void main (String[] argv) {


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 Java - 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

keulkeul.blogspot.com

 du type

public class Voiture {


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

Chaque constructeur
possde le mme nom
(le nom de la classe)

public Voiture(int p, boolean estDemaree) {


...
}
}

Cours Java - 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();

keulkeul.blogspot.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 Java - 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

keulkeul.blogspot.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 Java - M. Baron - Page

66

Envoi de messages : appel de mthodes


Voiture
Ne pas oublier les
parenthses pour les
appels aux mthodes
public class TestMaVoiture {

-
+
+
+
+

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

public static void main (String[] argv) {


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

keulkeul.blogspot.com

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

Envoi dun message


lobjet maVoiture
Appel dun modificateur

Envoi dun message


lobjet maVoiture
Appel dun slecteur

}
}

Cours Java - 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


keulkeul.blogspot.com

 Leur valeur est recopie


 Leur modification dans la mthode nentrane pas celle de loriginal

 Les objets
 Leur modification dans la mthode entrane celle de loriginal!!!
 Leur rfrence est recopie et non pas les attributs

Cours Java - M. Baron - Page 68

Envoi de messages : passage de paramtres


 Exemple : passage de paramtres
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();
// 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);


keulkeul.blogspot.com

Voiture

Appel dun slecteur avec


passage dune rfrence

+ acclre (rel)
+ compare (Voiture) : entier
+
Cours Java - 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 !!!!

keulkeul.blogspot.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 Java - M. Baron - Page 70

Lobjet courant : attributs et mthodes


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

keulkeul.blogspot.com

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 Java - 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

 Composition : cycle de vie identiques

 Exemple : voiture possde un moteur qui dure la vie de la voiture


Association

keulkeul.blogspot.com

Composition
Voiture

0..1

0..1

Conducteur

Agrgation
4..5

Roue

Moteur

0..1

Galerie
Cours Java - 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 {
private Moteur leMoteur;
...
public Voiture(int p) {
leMoteur = new Moteur(p);
...
}
...

keulkeul.blogspot.com

Moteur

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

Cration de l'objet
Moteur
Cours Java - 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 {
private int puissance;
...
public Moteur(int p) {
puissance = p;
...
}
...

keulkeul.blogspot.com

Moteur
}

La puissance est donne


lors de la construction
Cours Java - 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

keulkeul.blogspot.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 Java - 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;
...

keulkeul.blogspot.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 Java - 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 {


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

keulkeul.blogspot.com

0..1

Galerie

Un objet Galerie est transmis


au moment de la
construction de Voiture
Cours Java - 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

Prfrer dfinir une


mthode et de
 Si plus aucune variable ne rfrence lobjet
linvoquer avant que
 Si le bloc dans lequel il est dfini se termine tout objet ne soit
plus rfrenc :
 Si lobjet a t affect null
detruit()

 Manuellement :

keulkeul.blogspot.com

 Sur demande explicite 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!!!!

Cours Java - M. Baron - Page 78

Destruction et ramasse-miettes
public class Voiture {

Pour tre sr que finalize


s'excute il faut absolument
appeler explicitement
System.gc()

private boolean estDemarree;


...

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;

keulkeul.blogspot.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 Java - M. Baron - Page 79

Gestion des objets


 Afficher son type et sa place 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!!!

keulkeul.blogspot.com

 Tester son type : oprateur instanceof mot cl class


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

ou
if (maVoiture.getClass() == Voiture.class) {...} // C est vrai
// galement
Cours Java - 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

keulkeul.blogspot.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 Java - M. Baron - Page 81

Surcharge
 Exemple : une voiture surcharge

keulkeul.blogspot.com

public class Voiture {


private double vitesse;
...
public void accelere(double vitesse) {
if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}
public void accelere(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 Java - 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)

 Exemple
 Implantation du constructeur

public class Voiture {


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

sans paramtre de Voiture

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

keulkeul.blogspot.com

partir du constructeur avec

public Voiture(int p, Galerie g) {


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

paramtres

...

Cours Java - 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

keulkeul.blogspot.com

 Possibilit dagir 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 Java - M. Baron - Page 84

Encapsulation : visibilit des membres dune classe


+ public
classe

keulkeul.blogspot.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 Java - M. Baron - Page 85

Encapsulation
 Exemple : encapsulation
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 {
}
}

keulkeul.blogspot.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 Java - 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

 Comparaison
keulkeul.blogspot.com

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 Java - 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


String s = mCM.toString();

keulkeul.blogspot.com

 On peut leur ajouter nimporte (surcharge) quoi


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

 On peut leur insrer nimporte (surcharge) quoi


mCM.insert(int offset, ...); // String, int, long, float, double
Cours Java - 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);

keulkeul.blogspot.com

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

Cours Java - 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
 Usage des variables de classe

keulkeul.blogspot.com

 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 Java - 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

keulkeul.blogspot.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 Java - 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

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

keulkeul.blogspot.com

public class Galerie {


public static final int MASSE_MAX = 150;
}

 Pour y accder, il faut utiliser non pas un identificateur


dobjet mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}
Cours Java - M. Baron - Page 92

Variables et Constantes de classe


 Exemple : constantes de classe
public class Voiture {
public static final int PTAC_MAX = 3500;
private int poids;
public static int nbVoitureCreees;
...
public Voiture(int poids, ...) {
this.poids = poids;
nbVoitureCrees++;
...
public class TestMaVoiture {
}

keulkeul.blogspot.com

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

Dangereux car
possibilit de
modification
extrieure...

public static void main (String[] argv) {


// Dclaration puis cration de maVoiture
Voiture maVoiture = new Voiture(2500);
...
System.out.println("Poids maxi:" +
Voiture.PTAC_MAX);
System.out.println(Voiture.nbVoitureCreees);
...
}
}

Cours Java - 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

 Elles sont dfinies comme les mthodes d'instances, mais


avec le mot cl static

keulkeul.blogspot.com

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 Java - M. Baron - Page 94

Mthodes de classe
 Exemple : mthode de classe
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.

keulkeul.blogspot.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 Java - M. Baron - Page 95

Mthodes de classe : erreur classique


 Exemple (suite) : mthode de classe
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)
}

keulkeul.blogspot.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 Java - M. Baron - Page 96

Mthodes de classe
 Rappel : les types simples (int, double, etc.) 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

keulkeul.blogspot.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 Java - M. Baron - Page

97

Les tableaux en Java : application Objets


1 Dclaration
Voiture[]
monTableau;

2 Dimensionnement
monTableau = new Voiture[3];

3 Initialisation

keulkeul.blogspot.com

monTableau[0] = new Voiture(5);


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

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

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


System.out.println(monTableau[i].demarre());
}
Cours Java - M. Baron - Page 98

Varargs : passage de paramtres en nombre indfini


 Varargs est une nouveaut Java 5 permettant de passer en
paramtre un nombre indfini de valeurs de mme type
 Pour ceux qui ont connu le langage Turbo Pascal, lquivalent
du System.out.println() le permettait dj
 Avant la version Java 5, il fallait passer en paramtre un

keulkeul.blogspot.com

tableau dun type donn pour raliser la mme chose


public ajouterPassager(String[] tab)

 La syntaxe de varargs est la suivante : utilisation de


public ajouterPassager(String... tab)
Cours Java - M. Baron - Page 99

Varargs : passage de paramtres en nombre indfini


 Du ct de la mthode o le varargs est dfini, les donnes
sont manipules comme un tableau
public ajouterPassager(String... tab) {
for (String current : tab) {
System.out.println(current)
}
}

 Du ct client qui fait un appel la mthode, les donnes


peuvent tre envoyes comme un

keulkeul.blogspot.com

 Tableau
String passagers = {"Tony", "Luck", "John"};
maVoiture.ajouterPassager(passagers);

 Ensemble de paramtres
maVoiture.ajouterPassager("Tony", "Luck", "John");
Cours Java - M. Baron - Page 100

Varargs : passage de paramtres en nombre indfini


 Comme un varargs est considr comme un tableau le
contenu peut tre vide
public Voiture(int... carac) {
...
}
public static void main(String[] argv) {
new Voiture();
}

 Si un varargs est accompagn dun ou plusieurs autres para-

keulkeul.blogspot.com

mtres, le varargs doit obligatoirement tre plac en dernier


public Voiture(String mod, int... carac) {
...
}

public Voiture(int... Carac, String mod) {


...
}

Cours Java - M. Baron - Page 101

Varargs : passage de paramtres en nombre indfini


 Problmatiques lies la surcharge dune mthode utilisant
un varargs
 Dans le cas de la surcharge dune mthode la mthode contenant le
varargs a la priorit la plus faible
public class Voiture {
public Voiture(int... carac) {
}

keulkeul.blogspot.com

public Voiture(int caract1, int caract2) {


...
}
public static void main(String[] argv) {
new Voiture(12, 23);
new Voiture(12);
}
}
Cours Java - M. Baron - Page 102

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
 Spcialisation, enrichissement : une nouvelle classe rutilise les
attributs et les oprations d une classe en y ajoutant et/ou des

keulkeul.blogspot.com

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 Java - M. Baron - Page

104

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

keulkeul.blogspot.com

Voiture

+ dmarre()

Relation dhritage
VehiculePrioritaire

VoitureElectrique

- gyrophare : boolen

- disjoncteur : boolen

+ allumeGyrophare()

+ dmarre()
Cours Java - M. Baron - Page 105

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

keulkeul.blogspot.com

VehiculePrioritaire

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

Cours Java - M. Baron - Page 106

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

keulkeul.blogspot.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 Java - M. Baron - Page 107

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

Super-classe

keulkeul.blogspot.com

Sous-classe

VehiculePrioritaire

 Lhritage permet

Abstraction

Voiture

Raffinement

classe et sa super-classe

VehiculePrioritaire est
une Voiture

 de gnraliser dans le sens abstraction


 de spcialiser dans le sens raffinement
Cours Java - M. Baron - Page 108

Exemple dhritage
 Exemple : espces
Mammifre

keulkeul.blogspot.com

Ctac

Humain

Baleine

Dauphin

Etudiant

Enseignant

Mobi Dick

Ecco

Raoul

Mickal

Cours Java - M. Baron - Page 109

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;
...

Voiture

keulkeul.blogspot.com

public void allumeGyrophare() {


gyrophare = true;
}
...

VehiculePrioritaire

- gyrophare : boolen
+ allumeGyrophare()

Nessayez pas dhriter de plusieurs


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

Hritage plusieurs niveaux

Voiture
+ dmarre()

VehiculePrioritaire

keulkeul.blogspot.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("Raoul");

public class Ambulance


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

Cours Java - M. Baron - Page 111

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

keulkeul.blogspot.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 Java - M. Baron - Page 112

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 {

keulkeul.blogspot.com

+ dmarre()

private boolean disjoncteur;


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

VoitureElectrique
- disjoncteur :
boolen
+ dmarre()

Redfinition de la
mthode
Cours Java - M. Baron - Page 113

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

keulkeul.blogspot.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 Java - M. Baron - Page 114

Redfinition avec rutilisation


 Intrt
 La redfinition dune mthode cache le code de la mthode hrite
 Rutiliser le code de la mthode hrit par le mot-cl super
 super permet ainsi la dsignation explicite de linstance dune
classe dont le type est celui de la classe mre
 Accs aux attributs et mthodes redfinies par la classe courante
mais que lon dsire utiliser
keulkeul.blogspot.com

super.nomSuperClasseMethodeAppelee(...);

 Exemple de la Voiture : les limites rsoudre


 Lappel la mthode demarre de VoitureElectrique ne modifie que
lattribut disjoncteur
Cours Java - M. Baron - Page 115

Redfinition avec rutilisation


 Exemple : rutilisation de mthode
La position de super
na ici aucune
importance

public class Voiture {


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

public class VoitureElectrique extends Voiture {


private boolean disjoncteur;
...

Mise jour de lattribut


estDemarree

public void demarre() {


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

keulkeul.blogspot.com

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

Envoi dun message par


appel de demarre
Cours Java - M. Baron - Page 116

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

keulkeul.blogspot.com

Lappel au constructeur de la superclasse doit se faire absolument en


 Utilise le mot-cl super
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 Java - M. Baron - Page 117

Usage des constructeurs : suite


 Exemple : constructeurs voiture
Lappel au constructeur de
la super-classe doit se
faire absolument en
premire instruction

public class Voiture {


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

Implantation du constructeur
de VoiturePrioritaire partir
de Voiture

keulkeul.blogspot.com

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

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 Java - M. Baron - Page 118

Usage des constructeurs : suite


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

keulkeul.blogspot.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 Java - M. Baron - Page 119

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
public class A {
public A() {
public void afficherInformation() {
super();
System.out.println("Des Informations..."); }
}
}

keulkeul.blogspot.com

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 Java - M. Baron - Page 120

Usage des constructeurs : suite


 Exemple : constructeur explicite
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

keulkeul.blogspot.com

public class VoiturePrioritaire


extends Voiture {
private boolean gyrophare;

super();

public VoiturePrioritaire(int p, Galerie g) {


this.gyrophare = false;
}
}

Cours Java - M. Baron - Page 121

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

keulkeul.blogspot.com

public class Voiture extends Object {


...
public Voiture(int p, Galerie g) {
puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}
...
}

Object
+
+
+
+

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

Il n'est pas ncessaire


d'crire explicitement
extends Object
Cours Java - M. Baron - Page 122

Aprs redfinition

keulkeul.blogspot.com

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 Java - M. Baron - Page 123

Droits daccs aux attributs et mthodes


 Exemple de la Voiture : les limites rsoudre
 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
Voiture
toutes ses sous-classes
keulkeul.blogspot.com

# dmarre()

dmarre() nest pas accessible


publiquement dans un
objet VehiculePrioritaire

VehiculePrioritaire

VehiculeElectrique

+ dmarre(int code)

+ dmarre()

Cours Java - M. Baron - Page 124

Droits daccs aux attributs et mthodes


 Exemple : accs aux mthodes
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;
}
}
}

keulkeul.blogspot.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 Java - M. Baron - Page 125

Mthodes et classes finales


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

keulkeul.blogspot.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 Java - M. Baron - Page 126

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
+ dmarre()

 Rappel

keulkeul.blogspot.com

 voitureLarochelle est une instance de la


classe VoitureElectrique
VoitureElectrique
+ dmarre()
+ getVoltage() : int

voitureLarochelle

 Mais aussi
 voitureLarochelle est une instance de la
classe Voiture
Cours Java - M. Baron - Page 128

Polymorphisme et Java : surclassement


 Java est polymorphique
 A une rfrence de la classe Voiture, possible daffecter une valeur qui
est une rfrence vers un objet de la classe VoitureElectrique
 On parle de surclassement ou upcasting
 A 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

keulkeul.blogspot.com

+ dmarre()

VoitureElectrique

public class Test {


public static void main (String[] argv) {

+ dmarre()
+ getVoltage() : int

Voiture voitureLarochelle =
new VoitureElectrique(...);
}
}

voitureLarochelle

Cours Java - M. Baron - Page 129

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(...);

keulkeul.blogspot.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 Java - M. Baron - Page 130

Polymorphisme et Java : surclassement


 Exemple : 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());
}
}

keulkeul.blogspot.com

Voiture

Remarque : Quel code va tre


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

+ dmarre()

voitureLarochelle

Cours Java - M. Baron - Page 131

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;
}

keulkeul.blogspot.com

voitureLarochelle.demarre()

VoitureElectrique

Constat : Cest la mthode dmarre()


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

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

Cours Java - M. Baron - Page 132

Polymorphisme et Java : lien dynamique


 Exemple : 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);}
}

keulkeul.blogspot.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 Java - M. Baron - Page 133

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");}
}

keulkeul.blogspot.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 Java - M. Baron - Page 134

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

keulkeul.blogspot.com

 La mthode excuter est dtermine lexcution et non pas la


compilation
 On parle de liaison tardive, lien dynamique, dynamic binding,
latebinding ou run-time binding

Cours Java - M. Baron - Page 135

Polymorphisme et Java : bilan


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

Voiture
+ dmarre() {
estDemarre = true;
}

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

keulkeul.blogspot.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

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

 Liaison dynamique (excution)


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

Cours Java - M. Baron - Page 136

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

keulkeul.blogspot.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 Java - M. Baron - Page 137

Polymorphisme : un exemple typique


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

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

keulkeul.blogspot.com

+ afficher()
...

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

Cercle
- rayon : int
+ afficher()

Cours Java - M. Baron - Page 138

Polymorphisme : un exemple typique


 Exemple (suite) : la gomtrie
public class Stockage {
private Forme[] liste;
private int taille;
private int i;

Si une nouveau type de


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

public Stockage(int taille) {


this.taille = taille;
liste = new Forme[this.taille];
i = 0;
}

keulkeul.blogspot.com

public void ajouter(Forme f) {


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

public class Test {


public static void main (String[] argv) {
Stockage monStock = new Stockage(10);
monStock.ajouter(new Cercle(...));
monStock.ajouter(new Rectangle(...));

public void afficherForme() {


for (int i = 0; i < taille; i++) {
liste[i].afficher();
}
}
}

Rectangle monRect = new Rectangle(...);


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

}
}

Cours Java - M. Baron - Page 139

Polymorphisme : downcasting
 Intrt
 Force un objet librer les fonctionnalits caches
par le surclassement
 Conversion de type explicite (cast). Dj vu pour les types primitifs
ClasseA

ClasseA monObj = ...


ClasseB b = (ClasseB) monObj

 Pour que le cast fonctionne, il faut qu lexcution


le type effectif de monObj soit compatible
avec le type ClasseB

keulkeul.blogspot.com

ClasseB

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


obj instanceof ClasseB

Retourne vrai ou faux

Cours Java - M. Baron - Page 140

Polymorphisme : downcasting
 Exemple : downcasting
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
}
}

keulkeul.blogspot.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 Java - M. Baron - Page 141

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

Object

keulkeul.blogspot.com

+ boolean equals(Object)

Voiture

Rappel de la classe
Voiture

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

Cours Java - M. Baron - Page 142

La mthode equals()
 Exemple : redfinition de 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;
}
...

Mme valeurs darguments

keulkeul.blogspot.com

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 Java - M. Baron - Page 143

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

 Mthode abstraite et consquences : 3 rgles retenir

keulkeul.blogspot.com

 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 Java - M. Baron - Page 144

Classes abstraites et Java


 Le mot cl abstract est utilis pour spcifier abstraite une
classe
 Une classe abstraite se dclare ainsi
public abstract class NomMaClasse {
...
}

 Une mthode abstraite se dclare ainsi

keulkeul.blogspot.com

public abstract void maMethode(...);

Pour crer une mthode abstraite, la


signature (nom et paramtres) est
dclare sans spcifier le corps et en
ajoutant le mot cl abstract
Cours Java - M. Baron - Page 145

Classes abstraites : exemple VoitureDecapotable


 La classe VoitureDecapotable
 Hrite de Voiture

Voiture

 Dfinit un attribut protg toitRepli


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

keulkeul.blogspot.com

 Les classes DeuxChevaux et C3Pluriel


hritent de VoitureDecapotable
C3Pluriel
DeuxChevaux
- capoteAttache : boolen
+ replieLeToit()

- arceauxRetirs : boolen
+ replieLeToit()

Cours Java - M. Baron - Page 146

Classes abstraites : exemple VoitureDecapotable


 Exemple : une voiture dcapotable
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

keulkeul.blogspot.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 Java - M. Baron - Page 147

Classes abstraites : exemple VoitureDecapotable


 Exemple (suite) : une voiture dcapotable
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();
// Dclaration et cration dune VoitureDecapotable
VoitureDecapotable voitureDecapotable =
new VoitureDecapotable(...); // Erreur
keulkeul.blogspot.com

}
}

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

Classes abstraites : exemple Forme


 Exemple : la classe Forme
 Les mthodes surface() et primtre() sont abstraites
 Ces mthodes nont de sens que pour les
sous-classes Cercle et Rectangle

Forme {abstraite}
- positionx, positiony : int

Cercle
- rayon : int

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

keulkeul.blogspot.com

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

public abstract class Forme {


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

Rectangle
- larg, haut : int
+ surface() : double
+ primtre() : double

Pas dimplmentation !!
Cours Java - M. Baron - Page 149

Notion dinterface
 Une interface est un modle pour une classe
 Quand toutes les mthodes dune classe sont abstraites et quil ny a
aucun attribut nous aboutissons 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
keulkeul.blogspot.com

 Les interfaces pourront se driver

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

Cours Java - M. Baron - Page 150

Notion dinterface et Java


 Mise en uvre dune interface
 La dfinition dune interface se prsente comme celle dune classe.
Le mot cl interface est utilis la place de class
public interface NomInterface {
...
}

Interface : ne pas
confondre avec les
interfaces graphiques

keulkeul.blogspot.com

 Lorsquon dfinit une classe, on peut prciser quelle implmente


une ou plusieurs interface(s) 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 Inter1, ... {
...
}
Cours Java - M. Baron - Page 151

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;
}

keulkeul.blogspot.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 Java - M. Baron - Page 152

Notion dinterface et Java


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

Ordinateur

public interface Dmarrable {


public void dmarre();
}

keulkeul.blogspot.com

Doit implmenter
toutes les mthodes
des interfaces

public class Voiture implements Dmarrable {


...
public void dmarre() {
moteurAllum = true;
}
}

public class Ordinateur implements Dmarrable {


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

Une Voiture est


Dmarrable
Un Ordinateur est
Dmarrable
Cours Java - M. Baron - Page 153

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();

keulkeul.blogspot.com

// Dclaration et cration dun objet Personne


Personne pers1 = new Personne(dem1);
pers1.mettreEnRoute();

Une personne peut


dmarrer tous les
objets Dmarrable

// 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 Java - M. Baron - Page 154

Notion dinterface et Java


 Exemple : une Voiture et un Ordinateur sont des objets

Dmarrable
public class Person {
private Demarrable objetDemarrable;

keulkeul.blogspot.com

public Person(Demarrable dem) {


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

Une personne peut dmarrer


Voiture et Ordinateur sans
connatre leur nature exacte
Cours Java - M. Baron - Page 155

Notion dinterface et Java


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

NomInte1 << Interface >>


+

 La dfinition de mthodes de linterface mre NomInte1


sont reprises dans linterface fille NomInte2. Toute classe qui
implmente linterface fille doit donner une implmentation
keulkeul.blogspot.com

toutes les mthodes mmes celle hrites


 Utilisation

NomInte2 << Interface >>


+

 Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires

Cours Java - M. Baron - Page 156

Classes abstraites versus interfaces


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

 Les classes abstraites


 Sont partiellement implmentes
 Une autre classe non abstraite peut en hriter mais doit donner une
implmentation aux mthodes abstraites

keulkeul.blogspot.com

 Une autre classe abstraite peut en hriter sans forcment donner une
implmentation toutes les mthodes abstraites
 Ne peuvent pas tre instancies mais peuvent fournir un constructeur

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

157

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 != maClio mais

le contenu est identique

saClio

maClio

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

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

recopie

keulkeul.blogspot.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 Java - M. Baron - Page 158

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)

public class Voiture {


...
class Moteur {
...
}
}

 Classes anonymes
 Sont des instanciations de classes et

keulkeul.blogspot.com

des implmentations dune classe


abstraite ou dune interface
 La ou les mthodes abstraites doivent

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

tre implmentes au moment de linstanciation


Les classes anonymes sont trs utilises pour
le dveloppement dIHM avec Java/Swing

Cours Java - M. Baron - Page 159

Les classes internes Inner Classes


 Code source : 1 fichier

Classe anonyme, implmente


linterface Init

 classe
 classe anonyme

public class Voiture {


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

 classe interne
 Gnration de byte-code : 3 fichiers
 classe Voiture.class

Classe interne

 anonyme Voiture$1.class
keulkeul.blogspot.com

 interne Voiture$Moteur.class
}

Les fichiers .class qui


possdent dans leur nom un $
ne sont pas des fichiers
temporaires!!!
Cours Java - M. Baron - Page 160

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..*

Mthode

0..*

Attribut

0..*

keulkeul.blogspot.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, )
 java.util : rassemble les classes utilitaires (Collections, Date, )
 java.io : lecture et criture

Cours Java - M. Baron - Page 162

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

keulkeul.blogspot.com

Nom complet
de la classe
java.util.Date

Package Sous-Package Classe

Cours Java - M. Baron - Page 163

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;

keulkeul.blogspot.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 Java - M. Baron - Page 164

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

 Un package peut contenir

 Des classes ou des interfaces


keulkeul.blogspot.com

 Un autre package (sous-package)

Exemple : mesclassses.ex1.Voiture
ex1

mesclasses

Le nom des
packages est
toujours crit en
minuscules

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

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


 Les sources (*.java) se trouvent

keulkeul.blogspot.com

lang

util

math

dans le rpertoire src du rpertoire Java


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

String.java

Cours Java - M. Baron - Page 166

Les packages : cration et conseils


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

Voiture

Vos rpertoires de travail


(Pas encore de notion de
package)
Geom

Package voiture :

voiture.modele.VoitureElectrique
voiture.modele.Voiture
voiture.test.Test

keulkeul.blogspot.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)

test
modele

Test.java
VoitureElectrique.java

Voiture.java

Cours Java - M. Baron - Page 167

Les packages : cration et conseils


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

keulkeul.blogspot.com

package voiture.modele;
toujours plac en
public class VoitureElectrique {
premire 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 Java - M. Baron - Page 168

Les packages : compilation et excution


 tre plac dans la racine du rpertoire Voiture
Voiture

 La compilation doit prendre en compte les chemins des


packages

keulkeul.blogspot.com

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

 Lexcution se fait en indiquant la classe principale avec son


chemin
La sparation entre
java voiture.test.Test

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

Cours Java - M. Baron - Page 169

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.*;

Essai utilise les classes Date


du package java.util et

keulkeul.blogspot.com

public class Essai {


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

ZipFile du package
java.util.zip

Cours Java - M. Baron - Page 170

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


 Compris entre

/**

et

*/

 Premire ligne : uniquement /**


 Suivantes : un espace suivi dune toile
keulkeul.blogspot.com

 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 Java - M. Baron - Page 171

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

keulkeul.blogspot.com

 Suivre la description des mthodes, classes,


 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
Cours Java - M. Baron - Page 172
Rfrence croise

Javadoc et les commentaires

keulkeul.blogspot.com

 Exemple : 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 Java - M. Baron - Page 173

Javadoc et les commentaires

keulkeul.blogspot.com

 Exemple : aperu html de la description de la classe Object


gnre avec javadoc

Cours Java - M. Baron - Page 174

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

keulkeul.blogspot.com

 Utilisation pour la cration


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

Cration Verbose Nom archive

Le . indique le
rpertoire courant
Cours Java - M. Baron - Page 175

Jar
 Utilisation pour la cration (suite)
 Utilisation dun fichier manifeste (MANIFEST.MF) pour prciser un
ensemble dattributs pour excuter
 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

 Cration du jar avec un fichier manifeste :

MANIFEST.MF

keulkeul.blogspot.com

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 Java - M. Baron - Page 176

Exception
 Dfinition
 Une exception est un signal indiquant que quelque chose dexceptionnelle (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)
 Mcanisme simple et lisible

keulkeul.blogspot.com

 Regroupement du code rserv au traitement des erreurs


 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
Cours Java - M. Baron - Page
erreurs

177

Exception
 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;
}

keulkeul.blogspot.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 Java - M. Baron - Page 178

Exception : mcanisme
 Explication
 Lorsquune situation exceptionnelle est rencontre, une exception est
Mthode n
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. Elle stoppe alors lapplication

bloc 1
bloc 1.1

bloc 2
bloc 2.1

Mthode 1

bloc 2.1.1

keulkeul.blogspot.com

Mthode 2
bloc 2.1.2

appel de
mthode
transmission
d'exception

Mthode n

Une exception vient


de se produire

bloc 2.2

Cours Java - M. Baron - Page 179

Exception : lancer ou dclencher


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

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

keulkeul.blogspot.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 Java - M. Baron - Page 180

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

keulkeul.blogspot.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 Java - M. Baron - Page

181

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");
System.exit(-1);
}
...

Lerreur exceptionnelle
est traite par le bloc
catch

keulkeul.blogspot.com

}
}

Puis, il y a poursuite de lexcution en


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

Cours Java - M. Baron - Page 182

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

keulkeul.blogspot.com

Error

Erreur que lon peut


traiter puisque
rcuprable

Throwable

Exception

NullPointerException

Pour dfinir de nouveaux


types dexception, on sousclassera la classe
Exception

ErrConst

Cours Java - M. Baron - Page 183

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

Exception

Contient un message
derreur dcrivant
lexception

- message : String

keulkeul.blogspot.com

Renvoie le message derreur


dcrivant lexception

Affiche sur la sortie erreur


standard la liste des appels
de mthodes ayant conduit
lexception

+
+
+
+
+

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

ErrConst

Constructeur avec ou
sans argument

Classe trs simple,


puisque rien na t
redfini

public class ErrConst extends Exception {


public ErrConst() {
...
}
}

Cours Java - M. Baron - Page 184

Exception : modlisation
 Exemple : 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();
System.exit(-1);
}
...

keulkeul.blogspot.com

Affichage de la liste des


mthodes

Cours Java - M. Baron - Page 185

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;
}

keulkeul.blogspot.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 Java - M. Baron - Page 186

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

keulkeul.blogspot.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 Java - M. Baron - Page 187

Exception : attrapez les tous


 Il faut sassurer que les exceptions soient sous contrle

keulkeul.blogspot.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 Java - M. Baron - Page 188

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(...);
}
}

keulkeul.blogspot.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 Java - M. Baron - Page 189

Exception : transmission dinformation


 Possibilit denrichir la classe ErrConst en ajoutant des
attributs et des mthodes de faon communiquer
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;
}
public ErrConst(int x, int y) {
this.abs = x;
this.ord = y;
}

keulkeul.blogspot.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
- abs, ord : int
+ ErrConst(x,y)
+ getAbs : int
+ getOrd : int

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

Cours Java - M. Baron - Page 190

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

keulkeul.blogspot.com

 Lintrt est 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 Java - M. Baron - Page 191

Exception : finally
 Exemple : terminer correctement avec 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);
}
}
}

keulkeul.blogspot.com

Ces instructions sont


rappeles plusieurs
fois

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

Cours Java - M. Baron - Page 192

Exception : pour ou contre


 Exemple : grer les erreurs sans les exceptions

keulkeul.blogspot.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 Java - M. Baron - Page 193

Exception : pour ou contre


 Le mcanisme dexception permet
 La concision

keulkeul.blogspot.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 Java - M. Baron - Page 194

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

keulkeul.blogspot.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 Java - M. Baron - Page 195

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,

keulkeul.blogspot.com

un programme ouvre un flux de donnes


 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 Java - M. Baron - Page 196

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)

keulkeul.blogspot.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 Java - M. Baron - Page 197

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();
keulkeul.blogspot.com

}
}

Fermeture du flux
myFile vers le fichier
a_ecrire.txt

Ecriture dune ligne de


texte dans le fichier
a_ecrire.txt
Cours Java - M. Baron - Page 198

Les flux de caractres


 Exemple : lire lentre standard : enfin !!!
public class TestIO {
public static void main(String[] argv) {
System.out.println("Veuillez saisir votre nom :");

Convertit un objet
de type InputStream
en Reader

String inputLine = " ";


try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
String inputLine;
inputLine = is.readLine();

keulkeul.blogspot.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 Java - M. Baron - Page 199

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
fichier texte

keulkeul.blogspot.com

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 Java - M. Baron - Page

200

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;

keulkeul.blogspot.com

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


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

Cours Java - M. Baron - Page 201

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

keulkeul.blogspot.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 Java - M. Baron - Page 202

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

 Java propose depuis la version 2 des classes permettant de


keulkeul.blogspot.com

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 Java - M. Baron - Page 203

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

LinkedList

HashSet

TreeSet

keulkeul.blogspot.com

HashSet

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 Java - M. Baron - Page 204

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

keulkeul.blogspot.com

lments 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 Java - M. Baron - Page 205

Les collections : les gnriques Java


 Avec la version 5 de Java possibilit dexploiter les gnriques
dans les collections et pour dautres aspects du langage
 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

keulkeul.blogspot.com

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


construction de la collection le type du contenu stock dans
les collections
 Avantages
 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 Java - M. Baron - Page 206

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; laccs un
lment ne se fait quune seule fois

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 207

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()

Supprime le dernier
objet renvoy par
next()

keulkeul.blogspot.com

Iterator iter = c.iterator();

On vrifie sil y a
possibilit de
rcuprer un
objet

while (iter.hasNext()) {
??? o = iter.next();
...
}

Permet dobtenir
lobjet courant et
passe au suivant

c est une
collection et on
rcupre son
Iterator
On rcupre
lobjet courant
puis on passe au
suivant
Cours Java - M. Baron - Page 208

Les collections : Iterator


 Itrateur bidirectionnel : interface ListIterator
 Cela concerne les listes et les tableaux dynamiques
 Permet dajouter et de supprimer des objets
Vrifie sil y a un
prcdent

keulkeul.blogspot.com

On vrifie sil y a
possibilit de
rcuprer un objet
prcdemment

Iterator << Interface >>

ListIterator << Interface >>


+
+
+
+
+

Ajoute ou modifie
la position courante
un lment de la
collection

previous() : < ? >


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

Iterator iter = c.listIterator();

Rcupre lobjet
prcdemment puis
on passe au
prcdent

while (iter.hasPrevious()) {
??? o = iter.previous();
...
}

c est une
collection et on
rcupre son
ListIterator
Initialise en dbut
de liste

Cours Java - M. Baron - Page 209

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

keulkeul.blogspot.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 Java - M. Baron - Page 210

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");

keulkeul.blogspot.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 Java - M. Baron - Page 211

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>();

keulkeul.blogspot.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));
}

} lutilisation de
Prfrer
la classe ArrayList au
lieu de la classe Vector

Cours Java - M. Baron - Page 212

Les collections : HashSet


 La classe HashSet permet de grer les ensembles
 Deux lments ne peuvent tre identiques
 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

keulkeul.blogspot.com

dun objet)
 La redfinition de la mthode equals(Object) qui compare des objets
de mme classe pour connatre lappartenance dun lment
lensemble
Cours Java - M. Baron - Page 213

Les collections : HashSet


 Exemple : gestion de points avec HashSet
public class TestHashSet {
public static void main(String[] argv) {
Point p1 = new Point(1,3); Point p2 = new Point(2,2);
Point p3 = new Point(4,5); Point 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);
}

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 214

Les collections : HashSet


 Exemple : gestion de points avec HashSet
public class Point {
private int x,y;

keulkeul.blogspot.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 Java - M. Baron - Page 215

Programmation Oriente Objet


application au langage Java
Bilan

Mickal BARON - 2007


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

Bilan
 Ce que nous avons appris
 Se familiariser avec la programmation oriente objet avec Java
 Les concepts principaux de loriente objet (encapsulation, hritage
et polymorphisme)
 Aperu des API les plus importantes de la plateforme Java

 Perspectives futures
 Le langage Java est en constante volution. Chaque nouvelle
keulkeul.blogspot.com

version apporte son lot de nouvelles fonctionnalits


 Structurer les classes en appliquant les patterns de conception
(Design Pattern)
 Le langage Java est un point de dpart pour concevoir des
applications serveur avec Java Entreprise Edition

Cours Java - M. Baron - Page 217