Vous êtes sur la page 1sur 210

Programmation Oriente Objet application au langage Java

Version Mai 2007

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Serli informatique Serli : www.serli.com


Socit de services en informatique Fonde en 1981 Situe sur le site du Futuroscope, Poitiers Ralisation de logiciels et assistance technique

Domaines de comptences
Systmes dinformations Embarqu et temps rel
www.serli.com

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

Plateformes de dveloppement (celles qui concernent les cours)


Plateforme Java : Java EE, Java SE, Eclipse Plateforme Microsoft : C#, VB .NET
Cours POO - M. Baron - Page 2

Serli informatique Equipes impliques dans lOpen Source


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

Membre du consortium ObjectWeb


www.serli.com

Gestion de projets Open Source


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

Rapide historique concernant la POO La POO a une longue histoire


POO ? : Programmation Oriente Objet Dbut en Norvge la fin des annes 60 Simula, programmation des simulations par vnements discrets Programmation structure pas adapte

www.serli.com

Dans les annes 70


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

Rapide historique concernant la POO Au cours des annes 80


Dveloppement des ordinateurs personnels Intrt pour les interfaces graphiques Apparition de nouveaux langages Eiffel, fortement typ, entirement OO C++, extension de C, pas totalement OO Object Pascal (Delphi) dvelopp par Borland
www.serli.com

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

Programmation Structure VS POO Objectifs de la POO


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

Programmation Structure
www.serli.com

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

Principes POO Programmation par Objets


Unit logique : lobjet Objet est dfini par un tat un comportement une identit

maVoiture - couleur = bleue - vitesse = 100

www.serli.com

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

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

www.serli.com

dmarre

ma voiture

le moteur

Cours POO - M. Baron - Page 8

Principes POO Notion de classe


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

Voiture
- puissance : entier

www.serli.com

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

Mthodes - Slecteur - Modificateurs Visibilit + demarre() + acclre (rel)

Cours POO - M. Baron - Page 9

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

Voiture
www.serli.com

Moteur

Cours POO - M. Baron - Page 10

Droulement du cours Structuration du cours


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

Ceci est une alerte

Ceci est une astuce

www.serli.com

Mise en place du cours


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

Organisation ...

Partie 1 : Introduction au langage JAVA Partie 2 : Bases du langage Partie 3 : Classes et objets Partie 4 : Hritage
www.serli.com

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


Cours POO - M. Baron - Page 12

Programmation Oriente Objet application au langage Java


Introduction au langage Java

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Rapide historique de Java Origine


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

Dates cls
1991 : Introduction du langage Oak par James Gosling 1993 : Monte en puissance du Web grce Mosaic (lide dadapter Java au Web fait son chemin)
www.serli.com

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

Sun voit Java comme ... Rfrences


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

Sun dfinit le langage Java comme


Simple Orient objet
www.serli.com

Sr Portable Performant Multitches Dynamique ...

Rparti Interprt Robuste

Cours POO - M. Baron - Page 15

Principe de fonctionnement de Java Source Java


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

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

Machine Virtuelle Java


www.serli.com

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

Machines Virtuelles Java ... Navigateurs Web, Stations de travail, Network Computers WebPhones Tlphones portables Cartes puces
www.serli.com

...

Cours POO - M. Baron - Page 17

Principales tapes dun dveloppement Cration du code source


Codes Sources

A partir des spcifications (par exemple en UML)


MonProgramme.java

Outil : diteur de texte, IDE

Compilation en Byte-Code
A partir du code source Outil : compilateur Java

javac

Byte Code

Diffusion sur larchitecture cible


MonProgramme.class www.serli.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 POO - M. Baron - Page 18

Java et ses versions ... Diffrentes versions de la machine virtuelle


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

Diffrentes finalits

Dans la suite du cours, on va sintresser principalement aux API fournies par Java SE

www.serli.com

SDK (Software Development Kit) fournit un compilateur et une machine virtuelle JRE (Java Runtime Environment) fournit uniquement une machine virtuelle. Idal pour le dploiement de vos applications.

Version actuelle de Java


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

Les outils ... Simples diteurs ou environnements de dveloppement


Eclipse NetBeans JBuilder IntelliJ

www.serli.com

Les ressources sur Java


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

Cours POO - M. Baron - Page 20

LAPI de Java

Packages

Description Attributs Mthodes Classes


www.serli.com

Cours POO - 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
Auteur : Ian F. Darwin diteur : OReilly Edition : 2002 - 836 pages - ISBN : 2841772039

www.serli.com

Apprendre Java et C++ en parallle


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

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

www.serli.com

Ouvrages de rfrence de SUN aux ditions Paperback (en anglais uniquement)

Cours POO - M. Baron - Page 23

Programmation Oriente Objet application au langage Java


Bases du langage

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Premier exemple de programme en Java


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

public class PremierProg


Nom de la classe

public static void main


La fonction principale quivalent la fonction main du C/C++
www.serli.com

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

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

Mise en uvre Pas de sparation entre dfinition et codage des oprations


Un seul fichier NomDeClasse.java Pas de fichier den tte comme C/C++
Nom de la classe = Nom du fichier java

Compilation

javac NomDeClasse.java ou javac *.java quand plusieurs classes Gnration dun fichier Byte-Code NomDeClasse.class
www.serli.com

Pas ddition de liens (seulement une vrification)

Excution
java NomDeClasse Choisir la classe principale excuter

Ne pas mettre lextension .class pour lexcution

Cours POO - M. Baron - Page 26

Types primitifs de Java Ne sont pas des objets !!! Occupent une place fixe en mmoire rserve la dclaration Types primitifs :
Entiers : byte (1 octet) - short (2 octets) - int (4 octets) - long (8 octets) Flottants (norme IEEE-754) : float (4 octets) - double (8 octets) Boolens : boolean (true ou false) Caractres : char (codage Unicode sur 16 bits)
www.serli.com

Chacun des types simples possde un alter-ego objet disposant de mthodes de conversion ( voir dans la partie Classes et Objets) Lautoboxing introduit depuis la version 5.0 convertit de manire transparente les types primitifs en rfrences
Cours POO - M. Baron - Page 27

Initialisation et constantes Initialisation


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

Cette instruction joue le mme rle :


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

Penser linitialisation au risque dune erreur de compilation


int n; System.out.println(" n = " + n);

Constantes
www.serli.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 POO - M. Baron - Page 28

Structure de contrle Choix


Si alors sinon : if condition {} else {}
Il ny a pas de mot-cl then dans la structure Choix

Itrations
Tant que : while (condition) {} Faire jusqu : do {} while (condition)
www.serli.com

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

Slection borne
Selon faire : switch identificateur { case valeur0 : case valeur1 : default: } Le mot cl break demande sortir du bloc
Penser vrifier si break est ncessaire dans chaque case
Cours POO - M. Baron - Page 29

Structure de contrle Exemple : structure de contrle


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

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

www.serli.com

Valeur de n : 6 grand Adios...

Se demander si break est ncessaire


Cours POO - M. Baron - Page 30

Oprateurs sur les types primitifs Oprateurs arithmtiques


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

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

Oprateurs comparaisons
a==b, a!=b, a>b, a<b, a>=b, a<=b

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

www.serli.com

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

Conversion de type explicite (cast)


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

Oprateurs sur les types primitifs Exemple du Loto


Pas optimis mais montrer lutilisation des concepts prcdents
public class ExempleTypesPrimitifs { public static void main (String[] argv) { int compteur = 0; while(compteur != 100) { // Prend un nombre alatoire double nbreAleatoir = Math.random() * 1000; // Etablie un index de 0 10 int index = compteur % 10; www.serli.com // Construction de laffichage System.out.println("Index:" + index + "Nbre Alatoir:" + (int)nbreAleatoir); // Incrmentation de la boucle compteur+= 1; } } }

A voir plus tard

Cours POO - M. Baron - Page 32

Affectation, recopie et comparaison Affecter et recopier un type primitif


a=b signifie a prend la valeur de b a et b sont distincts Toute modification de a nentrane pas celle de b

Comparer un type primitif


a == b retourne true si les valeurs de a et b sont identiques
www.serli.com

a 1

b 2 a=b

a 2

b 2

Cours POO - M. Baron - Page 33

Les tableaux en Java Les tableaux sont considrs comme des objets Fournissent des collections ordonnes dlments Les lments dun tableau peuvent tre :
Des variables dun type primitif (int, boolean, double, char, ) Des rfrences sur des objets ( voir dans la partie Classes et Objets)

www.serli.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 POO - M. Baron - Page 34

Les tableaux en Java : Dclaration 1 Dclaration


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

null

Peut scrire galement


int monTableau[];

www.serli.com

Attention : une dclaration de tableau ne doit pas prciser de dimensions


int monTableau[5]; // Erreur

Cours POO - M. Baron - Page 35

Les tableaux en Java : Dimensionnement 2 Dimensionnement


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

www.serli.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 POO - M. Baron - Page 36

Les tableaux en Java : Initialisation 3 Initialisation


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

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


monTab[0] = 1; monTab[1] = 2; www.serli.com monTab[2] = 3; monTableau monTableau monTableau

1 1 1

0 2 2

0 0 3

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


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

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

Cours POO - M. Baron - Page 37

Les tableaux en Java : Synthse 1 Dclaration


int[] monTableau;

2 Dimensionnement
monTableau = new int[3];

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

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

www.serli.com

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

Cours POO - M. Baron - Page 38

Les tableaux en Java : Multidimensionnels Tableaux dont les lments sont eux mmes des tableaux Dclaration
type[][] monTableau; tab

null

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

. . null null

. .

. .

Tableaux non-rectangulaires
www.serli.com

Dimensionnement :
monTableau = new type[2]

tab

monTableau[0] = new type[2] monTableau[1] = new type[3]

tab

. .

. . .

Cours POO - M. Baron - Page 39

Petite prcision du System.out.println() Usages : affichage lcran


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

Diffrentes sorties possibles


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

Tout ce que lon peut afficher


Objets, nombres, boolens, caractres,
www.serli.com

Tout ce que l on peut faire


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

Cours POO - M. Baron - Page 40

Commentaires et mise en forme Documentation des codes sources :


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

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

Mise en forme
www.serli.com

Facilite la relecture Crdibilit assure !!!! Indentation chaque niveau de bloc

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

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

viter

Prfrer

Cours POO - M. Baron - Page 41

Programmation Oriente Objet application au langage Java


Classes et Objets

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Classe et dfinition Une classe est constitue :


Donnes ce qu'on appelle des attributs Procdures et/ou des fonctions ce qu'on appelle des mthodes

Une classe est un modle de dfinition pour des objets


Ayant mme structure (mme ensemble d'attributs) Ayant mme comportement (mme mthodes) Ayant une smantique commune
www.serli.com

Les objets sont des reprsentations dynamiques (instanciation), du modle dfini pour eux au travers de la classe
Une classe permet d'instancier (crer) plusieurs objets Chaque objet est instance d'une classe et une seule
Cours POO - M. Baron - Page 43

Classe et notation UML

Nom de la classe Attributs

Voiture - puissance : entier - estDmarre : boolen - vitesse : rel

Mthodes
www.serli.com

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

- Slecteur - Modificateurs

Visibilit
Cours POO - M. Baron - Page 44

Codage de la classe Voiture


Nom de la classe
public class Voiture { private int puissance; private boolean estDemarree; private double vitesse; public int deQuellePuissance() { return puissance; } public void demarre() { estDemarree = true; } www.serli.com public void accelere(double v) { if (estDemarree) { vitesse = vitesse + v } } }

Attributs

Slecteur

Modificateurs

Cours POO - M. Baron - Page 45

Classe et visibilit des attributs Caractristique dun attribut :


Variables globales de la classe Accessibles dans toutes les mthodes de la classe
public class Voiture { private int puissance; private boolean estDemarree; private double vitesse; public int deQuellePuissance() { return puissance; } www.serli.com public void demarre() { estDemarree = true; } public void accelere(double v) { if (estDemarree) { vitesse = vitesse + v } } }

Attributs visibles dans les mthodes

Cours POO - M. Baron - Page 46

Distinction entre attributs et variables Caractristique dune variable :


Visible lintrieur du bloc qui le dfinit
public class Voiture { private int puissance; private boolean estDemarree; private double vitesse; public int deQuellePuissance() { return puissance; } public void demarre() { estDemarree = true; } public void accelere(double v) { if (estDemarree) { double avecTolerance; avecTolerance = v + 25; vitesse = vitesse + avecTolerance } } }

Variable visible uniquement dans cette mthode

www.serli.com

Variable peut tre dfinie nimporte o dans un bloc

Cours POO - M. Baron - Page 47

Quelques conventions en Java : de la rigueur et de la classe Conventions de noms


CeciEstUneClasse celaEstUneMethode() jeSuisUneVariable JE_SUIS_UNE_CONSTANTE

Un fichier par classe, une classe par fichier


Classe Voiture dcrite dans le fichier Voiture.java
www.serli.com

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

Respecter les minuscules et les majuscules des noms


Cours POO - M. Baron - Page 48

Objet et dfinition Un objet est instance dune seule classe :


Se conforme la description que celle-ci fournit Admet une valeur propre lobjet pour chaque attribut dclar dans la classe Les valeurs des attributs caractrisent ltat de lobjet Possibilit de lui appliquer toute opration (mthode) dfinie dans la classe

www.serli.com

Tout objet est manipul et identifi par sa rfrence


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

Objet et notation UML maClio est une instance de la classe Voiture


Reprsentation explicite de la classe

Voiture
Relation dinstanciation instance of

Nom de lobjet, rfrence ou de linstance


www.serli.com

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


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

tats des objets Chaque objet qui est une instance de la classe Voiture possde ses propres valeurs dattributs Voiture
instance of

www.serli.com

ladaBerline110

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

205Gti
- puissance = 6 - estDmarre = true - vitesse = 250
Cours POO - M. Baron - Page 51

- puissance = 6 - estDmarre = false - vitesse = 0

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 les
www.serli.com

attributs

b a=b

Cours POO - M. Baron - Page 52

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

Voiture
Le test de comparaison (== et !=) entre objets ne concerne que les rfrence et non les attributs!!!!

instance of

www.serli.com

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

maClio
- puissance = 4 - estDmarre = true - vitesse = 179.8
Cours POO - M. Baron - Page 53

Affectation et comparaison Recopier les attributs dun objet clone()


Les deux objets a et b sont distincts Toute modification de a nentrane pas celle de b

b recopie

www.serli.com

Comparer le contenu des objets : equals(Object o)


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

Recopie et comparaison dans les parties suivantes

Cours POO - M. Baron - Page 54

Structure des objets Un objet est constitu dune partie statique et dune partie dynamique Partie statique
Ne varie pas dune instance de classe une autre Permet dactiver lobjet Constitue des mthodes de la classe
www.serli.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 POO - M. Baron - Page 55

Cycle de vie dun objet Cration


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

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

www.serli.com

Lutilisation dun objet non construit provoque une exception de type NullPointerException

Destruction et libration de la mmoire lorsque :


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

Cration dobjets : droulement La cration dun objet partir dune classe est appele une instanciation. Lobjet cr est une instance de la classe Dclaration
Dfinit le nom et le type de l objet Un objet seulement dclar vaut null (mot rserv du langage)
www.serli.com monObjet monObjet

null

Cration et allocation de la mmoire


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

Renvoi dune rfrence sur lobjet maintenant cr


monObjet != null

attribut 1 attribut n

Cours POO - M. Baron - Page 57

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

Les constructeurs portent le mme nom que la classe


public class TestMaVoiture {

Dclaration
www.serli.com

public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture; maVoiture = new Voiture(); // Dclaration et cration en une seule ligne Voiture maSecondeVoiture = new Voiture(); } }

Cration et allocation mmoire

Cours POO - M. Baron - Page 58

Cration dobjets : ralisation Exemple : construction dobjets


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

Dclaration

// Dclaration dune deuxime voiture Voiture maVoitureCopie; // Attention!! pour linstant maVoitureCopie vaut null

www.serli.com

// Test sur les rfrences. if (maVoitureCopie == null) {

Affectation par rfrence

// Cration par affectation dune autre rfrence maVoitureCopie = maVoiture // maVoitureCopie possde la mme rfrence que maVoiture } ... }}

Cours POO - M. Baron - Page 59

Le constructeur de Voiture Actuellement


On a utilis le constructeur par dfaut sans paramtre On ne sait pas comment se construit la Voiture Les valeurs des attributs au dpart sont indfinies et identique pour chaque objet (puissance, etc.)
Les constructeurs portent le mme nom que la classe et nont pas de valeur de retour

Rle du constructeur en Java


www.serli.com

Effectuer certaines initialisations ncessaires pour le nouvel objet cr

Toute classe Java possde au moins un constructeur


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

Le constructeur de Voiture Le constructeur de Voiture


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

www.serli.com

Constructeur avec un paramtre

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

Cours POO - M. Baron - Page 61

Construire une Voiture de 7 CV Cration de la Voiture :


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

Dclaration

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

www.serli.com

Cration et allocation mmoire avec Voiture(int)


} }

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

Cours POO - M. Baron - Page 62

Constructeur sans arguments Utilit :


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

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

www.serli.com

Cours POO - M. Baron - Page 63

Constructeurs multiples Intrts


Possibilit dinitialiser un objet de plusieurs manires diffrentes On parle alors de surchage (overloaded) Le compilateur distingue les constructeurs en fonction : de la position des arguments du nombre du type
www.serli.com public class Voiture { ... public Voiture() { puissance = 4; ... } public Voiture(int p) { puissance = p; ... } public Voiture(int p, boolean estDemaree) { ... } }

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

Cours POO - M. Baron - Page 64

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

public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration Voiture v1 = new Voiture(); Voiture v2 = new Voiture(); // Accs aux attributs en criture v1.puissance = 110; www.serli.com // Accs aux attributs en lecture System.out.println("Puissance de v1 = " } }

+ v1.puissance);

Il nest pas recommand daccder directement aux attributs dun objet


Cours POO - M. Baron - Page 65

Envoi de messages : appel de mthodes Pour demander un objet deffectuer un traitement il faut lui envoyer un message Un message est compos de trois parties
Une rfrence permettant de dsigner lobjet qui le message est envoy Le nom de la mthode ou de lattribut excuter Les ventuels paramtres de la mthode
www.serli.com identificationObjet.nomDeMethode( Paramtres ventuels )

Envoi de message similaire un appel de fonction


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

Envoi de messages : appel de mthodes


Voiture - Ne pas oublier les parenthses pour les appels aux mthodes + deQuellePuissance() : entier + demarre() + acclre (rel) +

public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture = new Voiture(); www.serli.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 POO - M. Baron - Page 67

Envoi de messages : passage de paramtres Un paramtre dune mthode peut tre


Une variable de type simple Une rfrence dun objet type par nimporte quelle classe

En Java tout est pass par valeur


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

Les types simples


Leur valeur est recopie
www.serli.com

Leur modification dans la mthode nentrane pas celle de loriginal

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

Envoi de messages : passage de paramtres Exemple


public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration 1 Voiture maVoiture = new Voiture(); // Dclaration puis cration 2 Voiture maSecondeVoiture = new Voiture(); // Appel de la mthode compare(voiture) qui // retourne le nombre de diffrence int p = maVoiture.compare(maSecondeVoiture); www.serli.com System.out.println("Nbre diffrence :" + p); } }

Rfrence comme paramtre

Voiture - + acclre (rel) + compare (Voiture) : entier +


Cours POO - M. Baron - Page 69

Appel dun slecteur avec passage dune rfrence

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


this = ... ; // Ne pas y penser www.serli.com

Utilit de lobjet courant


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

Lobjet courant : attributs et mthodes Dsigne des variables ou des mthodes dfinies dans une classe
public class Voiture { ... private boolean estDemarree; private double vitesse; public int deQuellePuissance() { ... } public void accelere(double vitesse) { if (estDemarree) { this.vitesse = this.vitesse + vitesse; } } }

Dsigne la variable vitesse

www.serli.com

Dsigne lattribut vitesse Dsigne lattribut demarree

this nest pas ncessaire lorsque les identificateurs de variables ne prsentent aucun quivoque
Cours POO - M. Baron - Page 71

Le retour dUML Association : les objets sont smantiquement lis


Exemple : une Voiture est conduite par un Conducteur

Agrgation : cycle de vie indpendant


Exemple : une Voiture et une Galerie
Les losanges sont attachs la classe qui contient

Composition : cycle de vie identiques


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

www.serli.com

Conducteur

Agrgation
4..5 1 0..1

Roue

Moteur

Galerie
Cours POO - M. Baron - Page 72

Codage de l'association : composition L'objet de classe Voiture peut envoyer des messages l'objet de classe Moteur : Solution 1
Attribut qui stocke la rfrence du moteur
Voiture
public class Voiture { private Moteur leMoteur; ... public Voiture(int p) { leMoteur = new Moteur(p); ... } ... }

www.serli.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 POO - M. Baron - Page 73

Codage de l'association : composition L'objet de classe Moteur n'envoie pas de message l'objet de classe Voiture : Solution 1
Attribut qui stocke la puissance
Voiture
public class Moteur { private int puissance; ... public Moteur(int p) { puissance = p; ... } ... }

www.serli.com

Moteur

La puissance est donne lors de la construction


Cours POO - M. Baron - Page 74

Codage de l'association : composition Il peut tre ncessaire que les deux objets en composition s'changent des messages : Solution 2
Lobjet Voiture voit lobjet Moteur Attribut qui stocke la rfrence du Moteur

public class Voiture {

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

www.serli.com

Moteur

Cration de lobjet Moteur

Transmission de la rfrence de lobjet courant


Cours POO - M. Baron - Page 75

Codage de l'association : composition Il peut tre ncessaire que les deux objets en composition s'changent des messages : Solution 2
Lobjet Moteur voit lobjet Voiture Attribut qui stocke la puissance

public class Moteur {

Voiture

private int puissance; private Voiture laVoiture; ... public Moteur(int p, Voiture v) { puissance = p; laVoiture = v; ... } ... }

www.serli.com

Moteur

La puissance est donne lors de la construction

Rfrence dun objet Voiture en paramtre

Cours POO - M. Baron - Page 76

Codage de lassociation : agrgation L'objet de classe Galerie nenvoie pas de message lobjet de classe Voiture
Attribut qui stocke une rfrence de Galerie
Voiture
public class Voiture { private Galerie laGalerie; ... public Voiture(Galerie g) { laGalerie = g; ... } ... }

www.serli.com

0..1

Galerie

Un objet Galerie est transmis au moment de la construction de Voiture


Cours POO - M. Baron - Page 77

Destruction et ramasse-miettes La destruction des objets se fait de manire implicite Le ramasse-miettes ou Garbage Collector se met en route
Automatiquement : Si plus aucune variable ne rfrence lobjet Si le bloc dans lequel il tait dfini se termine Si lobjet a t affect null Manuellement : Sur demande explicite du programmeur par linstruction System.gc()
www.serli.com

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

Cours POO - M. Baron - Page 78

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

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

Pour tre sr que finalize s'excute il faut absolument appeler explicitement System.gc()

Force le programme se terminer


www.serli.com

public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); maVoiture.demarre(); // maVoiture ne sert plus rien maVoiture = null; // Appel explicite du garbage collector System.gc(); // Fin du programme System.exit(0); System.out.println("Message non visible"); } }

Cours POO - M. Baron - Page 79

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

Rcuprer son type : mthode Class getClass()


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

www.serli.com

Tester son type : oprateur instanceof ou mot cl class


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

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

Cours POO - M. Baron - Page 80

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

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

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

www.serli.com

Cours POO - M. Baron - Page 82

Constructeurs multiples : le retour Appel explicite dun constructeur de la classe lintrieur dun autre constructeur
Doit se faire comme premire instruction du constructeur Utilise le mot-cl this(paramtres effectifs)
public class Voiture { ...

Exemple
Implantation du constructeur
www.serli.com

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

sans paramtre de Voiture partir du constructeur avec paramtres

Cours POO - M. Baron - Page 83

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

Possibilit d agir sur la visibilit des membres (attributs et mthodes) dune classe vis vis des autres classes Plusieurs niveaux de visibilit peuvent tre dfinis en prcdant dun modificateur la dclaration dun attribut, mthode ou constructeur
private public protected A revoir dans la partie suivante
Cours POO - M. Baron - Page 84

www.serli.com

Encapsulation : visibilit des membres dune classe + public


La classe peut tre utilise par nimporte quelle classe

- private
Utilisable uniquement par les classes dfinies lintrieur dune autre classe. Une classe prive nest utilisable que par sa classe englobante

classe

attribut
www.serli.com

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

Mthode accessible partout o sa classe est accessible.

Mthode accessible lintrieur de la dfinition de la classe

Cours POO - M. Baron - Page 85

Encapsulation Exemple
public class Voiture { private int puissance; ... public void demarre() { ... } private void makeCombustion() { ... public class TestMaVoiture { } } www.serli.com public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); // Dmarrage de maVoiture maVoiture.demarre(); maVoiture.makeCombustion(); // Erreur } }

Une mthode prive ne peut plus tre invoque en dehors du code de la classe o elle est dfinie

Cours POO - M. Baron - Page 86

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

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

Comparaison
www.serli.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 POO - M. Baron - Page 87

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

On peut les transformer en chanes normales String par :


String s = mCM.toString();

www.serli.com

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


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

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


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

Cours POO - M. Baron - Page 88

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

On obtient une StringTokenizer avec ses constructeurs


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

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

Cours POO - M. Baron - Page 89

Variables de classe Il peut tre utile de dfinir pour une classe des attributs indpendamment des instances : nombre de Voitures cres Utilisation des Variables de classe comparables aux variables globales Usage des variables de classe
www.serli.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 POO - M. Baron - Page 90

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

Attention lencapsulation. Il est dangereux de laisser cette variable de classe en public.

Pour y accder, il faut utiliser non pas un identificateur mais le nom de la classe
Voiture.nbVoitureCreees = 3; www.serli.com

Il nest pas interdit dutiliser une variable de classe comme un attribut (au moyen d un identificateur) mais fortement dconseill

Cours POO - M. Baron - Page 91

Constantes de classe Usage


Ce sont des constantes lies une classe Elles sont crites en MAJUSCULES
Une constante de classe est gnralement toujours visible

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


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

www.serli.com

Pour y accder, il faut utiliser non pas un identificateur d objet mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}

Cours POO - M. Baron - Page 92

Variables et Constantes de classe : exemple Exemple


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

Dangereux car possibilit de modification extrieure...

} www.serli.com

public Voiture(int poids, ...) { this.poids = poids; nbVoitureCrees++; ... public class TestMaVoiture { } public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(2500); ... System.out.println("Poids maxi:" + Voiture.PTAC_MAX); System.out.println(Voiture.nbVoitureCreees); ... } }

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

Cours POO - M. Baron - Page 93

Mthodes de classe Usage


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

Elles sont dfinies comme les mthodes d'instances, mais avec le mot cl static
www.serli.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 POO - M. Baron - Page 94

Mthodes de classe Exemple


public class Voiture { private static int nbVoitureCreees; ... public static int getNbVoitureCreees(){ return Voiture.nbVoitureCreees; } }

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

www.serli.com

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

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

Cours POO - M. Baron - Page 95

Mthodes de classe : erreur classique Exemple


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

Dclaration d'un objet Galerie non statique

On ne peut pas utiliser de variables d'instance dans une mthode de classe!!!!

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

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

Disponibilit de mthodes qui permettent la conversion en type simple


Integer valueObjet = new Integer(123); int valuePrimitif = valueObjet.intValue(); Ou int valuePrimitif = valueObjet; (AutoBoxing) www.serli.com

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

Attention aux erreurs de conversion. Retour dune exception. Voir dans la dernire partie du cours

Cours POO - M. Baron - Page 97

Les tableaux en Java : application Objets 1 Dclaration


Voiture[] monTableau;

2 Dimensionnement
monTableau = new Voiture[3];

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

3 Initialisation
monTableau[0] = new Voiture(5); monTableau[1] = new Voiture(7); monTableau[2] = new Voiture(8);

www.serli.com

for (int i = 0; i < monTableau.length; i++) { System.out.println(monTableau[i].demarre()); }

Cours POO - M. Baron - Page 98

Programmation Oriente Objet application au langage Java


Hritage

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Dfinition et intrts Hritage


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

Intrts
Spcialisation, enrichissement : une nouvelle classe rutilise les attributs et les oprations d une classe en y ajoutant et/ou des oprations particulires la nouvelle classe
www.serli.com

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

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

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

+ dmarre()

Relation dhritage
VehiculePrioritaire - gyrophare : boolen + allumeGyrophare() VoitureElectrique - disjoncteur : boolen + dmarre()
Cours POO - M. Baron - Page 101

Classes et sous-classes Un objet de la classe VehiculePrioritaire ou VoitureElectrique est aussi un objet de la classe Voiture donc il dispose de tous les attributs et oprations de la classe Voiture
VehiculePrioritaire - gyrophare : boolen + allumeGyrophare()
Hrit de Voiture
www.serli.com - puissance : entier - estDmarre : boolean - vitesse : flottant + deQuellePuissance() : entier + dmarre() + acclre(flottant)

VoitureElectrique - disjoncteur : boolen + dmarre()


- puissance : entier

Hrit de Voiture

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

Cours POO - M. Baron - Page 102

Classes et sous-classes : terminologie Dfinitions


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

Attention
www.serli.com

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

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

Voiture

Super-classe
VehiculePrioritaire

Sous-classe
www.serli.com

Lhritage permet
de gnraliser dans le sens abstraction de spcialiser dans le sens raffinement

VehiculePrioritaire est une Voiture

Cours POO - M. Baron - Page 104

Abstraction

Exemple dhritage Exemple


Mammifre

Ctac

Humain

www.serli.com

Baleine

Dauphin

Etudiant

Enseignant

Mobi Dick

Ecco

Raoul

Mickal
Cours POO - M. Baron - Page 105

Hritage et Java Hritage simple


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

Voiture

www.serli.com

VehiculePrioritaire - gyrophare : boolen + allumeGyrophare()

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

Hritage plusieurs niveaux


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

Voiture + dmarre()

VehiculePrioritaire + allumeGyrophare()

public class VehiculePrioritaire extends Voiture { ... public void allumeGyrophare() { ... } } public class Ambulance extends VehiculePrioritaire { private String malade; ... public void chercher(String ma) { ... } }

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

www.serli.com

Ambulance

- malade : String + chercher(String)

Cours POO - M. Baron - Page 107

Surcharge et redfinition Lhritage


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

Rappel de la surcharge : possibilit de dfinir des mthodes possdant le mme nom mais dont les arguments (paramtres et valeur de retour) diffrent
www.serli.com

Des mthodes surcharges peuvent avoir des types de retour diffrents condition quelles aient des arguments diffrents

Redfinition (overriding) : lorsque la sous-classe dfinit une mthode dont le nom, les paramtres et le type de retour sont identiques
Cours POO - M. Baron - Page 108

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

public class VoitureElectrique extends Voiture { private boolean disjoncteur; ... public void demarre() { disjoncteur = true; } ... }

www.serli.com

VoitureElectrique - disjoncteur : boolen + dmarre()

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

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

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

Redfinition

Surcharge

www.serli.com

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

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

VoitureElectrique possde au plus une mthode de moins que VehiculePrioritaire

VehiculePrioritaire possde au plus une mthode de plus que VoitureElectrique


Cours POO - M. Baron - Page 110

Redfinition avec rutilisation Intrt


La redfinition dune mthode cache le code de la mthode hrite Possibilit de rutiliser le code de la mthode hrit par le mot-cl super super permet ainsi la dsignation explicite de l instance d une classe dont le type est celui de la classe mre Accs aux attributs et mthodes redfinies par la classe courante mais que lon dsire utiliser
www.serli.com super.nomSuperClasseMethodeAppelee(...);

Exemple de la Voiture : les limites rsoudre


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

Redfinition avec rutilisation Exemple


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

La position de super na ici aucune importance

public class VoitureElectrique extends Voiture { private boolean disjoncteur; ... public void demarre() { disjoncteur = true; super.demarre(); } ... }

Mise jour de lattribut estDemarree


www.serli.com

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

Envoi dun message par appel de demarre


Cours POO - M. Baron - Page 112

Usage des constructeurs : suite Possibilit comme les mthodes de rutiliser le code des constructeurs de la super-classe Appel explicite dun constructeur de la classe mre lintrieur dun constructeur de la classe fille
Utilise le mot-cl super
www.serli.com

Lappel au constructeur de la superclasse doit se faire absolument en premire instruction

super(paramtres du constructeur);

Appel implicite d'un constructeur de la classe mre est effectu quand il n'existe pas d'appel explicite. Java insre implicitement l'appel super()
Cours POO - M. Baron - Page 113

Usage des constructeurs : suite Exemple


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

Lappel au constructeur de la superclasse doit se faire absolument en premire instruction

www.serli.com

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

Implantation du constructeur de VoiturePrioritaire partir de Voiture

public VoiturePrioritaire(int p, Galerie g) { super(p, null); this.gyrophare = false; }}

Cours POO - M. Baron - Page 114

Usage des constructeurs : suite Exemple : chanage des constructeurs


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

Usage des constructeurs : suite Rappel : si une classe ne dfinit pas explicitement de constructeur, elle possde alors un constructeur par dfaut
Sans paramtre Qui ne fait rien Inutile si un autre constructeur est dfini explicitement
public class A { public A() { public void afficherInformation() { super(); System.out.println("Des Informations..."); } } } public class B { private String pInfo; public B(String pInfo) { this.pInfo = pInfo; } } public class Test { public static void main (String[] argv) { new B("Message du main"); } } Cours POO - M. Baron - Page 116 super();

www.serli.com

Usage des constructeurs : suite Exemple


public class Voiture { ... public Voiture(int p) { this(p, new Galerie()); } public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ... } www.serli.com public class VoiturePrioritaire extends Voiture { private boolean gyrophare; super();

Constructeurs explicites dsactivation du constructeur par dfaut

Erreur : il n'existe pas dans Voiture de constructeur sans paramtre

public VoiturePrioritaire(int p, Galerie g) { this.gyrophare = false; } }

Cours POO - M. Baron - Page 117

La classe Object : le mystre rsolu La classe Object est la classe de plus haut niveau dans la hirarchie d'hritage
Toute classe autre que Object possde une super-classe Toute classe hrite directement ou indirectement de la classe Object Une classe qui ne dfinit pas de clause extends hrite de la classe Object
Object
public class Voiture extends Object { ... public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ... }

www.serli.com

+ Class getClass() + String toString() + boolean equals(Object) + int hashCode() Il n'est pas ncessaire d'crire explicitement extends Object
Cours POO - M. Baron - Page 118

La classe Object : le mystre rsolu


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

Aprswww.serli.com redfinition

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

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

Redfinition de la mthode String toString()


Cours POO - M. Baron - Page 119

Droits daccs aux attributs et mthodes Exemple de la Voiture : les limites rsoudre
La mthode dmarre() est disponible dans la classe VehiculePrioritaire Cest--dire que lon peut dmarrer sans donner le code !!! Solution : protger la mthode dmarre() de la classe Voiture

Ralisation
Utilisation du mot-cl protected devant la dfinition des mthodes et/ou attributs Les membres sont accessibles dans la classe o ils sont dfinis, dans toutes ses sous-classes
Voiture
www.serli.com

# dmarre()

dmarre() nest pas accessible publiquement dans un objet VehiculePrioritaire

VehiculePrioritaire + dmarre(int code)

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

Droits daccs aux attributs et mthodes Exemple


public class Voiture { private boolean estDemarree; ... protected void demarre() { estDemarree = true; } } } public class TestMaVoiture { www.serli.com 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 }} public class VoiturePrioritaire extends Voiture { private int codeVoiture; public void demarre(int code) { if (codeVoiture == code) { super.demarre(); }; }

Cours POO - M. Baron - Page 121

Mthodes et classes finales Dfinition


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

Classe : interdire toute spcialisation ou hritage de la classe concerne


www.serli.com

public final class VoitureElectrique extends Voiture { ... }

La classe String par exemple est finale


Cours POO - M. Baron - Page 122

Programmation Oriente Objet application au langage Java


Hritage et Polymorphisme

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

Dfinition du polymorphisme Dfinition


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

Rappel
voitureLarochelle est une instance de la classe VoitureElectrique

www.serli.com

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

Mais aussi
voitureLarochelle est une instance de la classe Voiture

Cours POO - M. Baron - Page 124

Polymorphisme et Java : surclassement Java est polymorphique


A une rfrence dclare de la classe Voiture, il est possible daffecter une valeur qui est une rfrence vers un objet de la classe VoitureElectrique On parle de surclassement ou upcasting Plus gnralement une rfrence dun type donn, soit A, il est possible daffecter une valeur qui correspond une rfrence vers un objet dont le type effectif est nimporte quelle sous classe directe ou indirecte de A
Voiture + dmarre()
www.serli.com

Objet de type sous-classe directe de Voiture


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

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

Cours POO - M. Baron - Page 125

Polymorphisme et Java : surclassement A la compilation


Lorsquun objet est surclass , il est vu par le compilateur comme un objet du type de la rfrence utilise pour le dsigner Ses fonctionnalits sont alors restreintes celles proposes par la classe du type de la rfrence
public class Test { public static void main (String[] argv) { // Dclaration et cration dun objet Voiture Voiture voitureLarochelle = new VoitureElectrique(...); // Utilisation dune mthode de la classe Voiture voitureLarochelle.demarre(); www.serli.com // Utilisation dune mthode de la classe VoitureElectrique System.out.println(voitureLarochelle.getVoltage()); // Erreur } }

Examiner le type de la rfrence

La mthode getVoltage() nest pas disponible dans la classe Voiture!!!


Cours POO - M. Baron - Page 126

Polymorphisme et Java : surclassement


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

Voiture
www.serli.com

Remarque : Quel code va tre effectivement excut lorsque le message demarre() est envoy voitureLarochelle ??

+ dmarre()

voitureLarochelle

Cours POO - M. Baron - Page 127

Polymorphisme et Java : lien dynamique


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

Lobjet voitureLarochelle initialise les attributs de la classe VoitureElectrique


Voiture + dmarre() { estDemarre = true; }

voitureLarochelle.demarre() www.serli.com

VoitureElectrique

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

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


Cours POO - M. Baron - Page 128

Polymorphisme et Java : lien dynamique


public class Point { private int x,y; public Point(int x, int y) { this.x = x; this.y = y; } public void deplace(int dx, int dy) { x += dx; y+=dy; } public void affiche() { System.out.println("Je suis en "+ x + " " + y);} } 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); } }

Point

Pointcol

www.serli.com

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

Cours POO - M. Baron - Page 129

Polymorphisme et Java : lien dynamique


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

Point

Pointcol

www.serli.com

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

Cours POO - M. Baron - Page 130

Polymorphisme et Java : lien dynamique A lexcution


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

La mthode excuter est dtermine lexcution et non pas la compilation


www.serli.com

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

Cours POO - M. Baron - Page 131

Polymorphisme et Java : bilan


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

Voiture + dmarre() { estDemarre = true; }

Surclassement (compilation)
Une variable maVoit est dclare comme tant une rfrence vers un objet de la classe Voiture 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; }

www.serli.com

Liaison dynamique (excution)


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

Cours POO - M. Baron - Page 132

Polymorphisme : ok, mais pourquoi faire ? Que des avantages


Plus besoin de distinguer diffrents cas en fonction de la classe des objets Le polymorphisme constitue la troisime caractristique essentielle dun langage orient objet aprs labstraction des donnes (encapsulation) et lhritage 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
www.serli.com

Dveloppement plus rapide Plus grande simplicit et meilleure organisation du code Programmes plus facilement extensibles Maintenance du code plus aise
Cours POO - M. Baron - Page 133

Polymorphisme : un exemple typique Exemple sur la gomtrie


Stocker des Forme de nimporte quel type (Rectangle ou Cercle) puis les afficher
Stockage Forme - positionx : int - positiony : int + afficher() - liste : Forme[ ] + ajouter(Forme) + afficherForme()

www.serli.com

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

Cercle - rayon : int + afficher()


Cours POO - M. Baron - Page 134

Polymorphisme : un exemple typique


public class Stockage { private Forme[] liste; private int taille; private int i; public Stockage(int taille) { this.taille = taille; liste = new Forme[this.taille]; i = 0; } public void ajouter(Forme f) { if (i < taille) { liste[i] = f; i++; } }

Si une nouveau type de Forme est dfini, le code de la classe Stockage nest pas modifi

www.serli.com

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

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

Cours POO - M. Baron - Page 135

Polymorphisme : downcasting Intrt


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

ClasseA

Pour que le cast fonctionne, il faut qu lexcution le type effectif de monObj soit compatible avec le type ClasseB
www.serli.com

ClasseB

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


obj instanceof ClasseB

Retourne vrai ou faux

Cours POO - M. Baron - Page 136

Polymorphisme : downcasting Exemple


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

Attention si la compatibilit est fausse et si le cast est effectu une exception de type ClassCastException est leve

Ralisation de la conversion de lobjet de type Forme en objet de type Rectangle


Cours POO - M. Baron - Page 137

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

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

Rappel de la classe Voiture

Cours POO - M. Baron - Page 138

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

Redfinition de la mthode equals de la classe Object

Voiture maVoit = (Voiture)o; return this.puissance == maVoit.puissance && this.estDmarre == maVoit.estDmarre && this.vitesse == maVoit.vitesse; } ... }

Mme valeurs darguments


www.serli.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 POO - M. Baron - Page 139

Classes abstraites : intrts On ne connat pas toujours le comportement par dfaut dune opration commune plusieurs sous-classes
Exemple : toit dune voiture dcapotable. On sait que toutes les dcapotables peuvent ranger leur toit, mais le mcanisme est diffrent dune dcapotable lautre Solution : on peut dclarer la mthode abstraite dans la classe mre et ne pas lui donner dimplantation par dfaut Mthode abstraite et consquences : 3 rgles retenir
www.serli.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 POO - M. Baron - Page 140

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

Une mthode abstraite se dclare ainsi :


public abstract void maMethode(...);
www.serli.com

Pour crer une mthode abstraite, on dclare sa signature (nom et paramtres) sans spcifier le corps et en ajoutant le mot cl abstract

Cours POO - M. Baron - Page 141

Classes abstraites : exemple VoitureDecapotable La classe VoitureDecapotable


Hrite de Voiture Dfinit un attribut protg toitRepli Dfinit une mthode abstraite replieLeToit()
VoitureDecapotable {abstraite} # toitRepli : boolen + replieLeToit() {abstraite} Voiture

Les classes DeuxChevaux et C3Pluriel hritent de VoitureDecapotable


www.serli.com

DeuxChevaux - capoteAttache : boolen + replieLeToit()

C3Pluriel - arceauxRetirs : boolen + replieLeToit()


Cours POO - M. Baron - Page 142

Classes abstraites : exemple VoitureDecapotable


public abstract class VoitureDecapotable extends Voiture { protected boolean toitRepli; public abstract void replieLeToit(); } public class DeuxChevaux extends VoitureDecapotable { private boolean capoteAttachee;

Classe abstraite

Mthode abstraite
} www.serli.com

public void replieLeToit() { this.toitReplie = true; this.capoteAttachee = true; }

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

Attention : ce nest pas de la redfinition. On parle dimplmentation de mthode abstraite


Cours POO - M. Baron - Page 143

Classes abstraites : exemple VoitureDecapotable


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

Attention : La classe VoitureDecapotable ne peut tre instancie puisquelle est abstraite


Cours POO - M. Baron - Page 144

Classes abstraites : exemple Forme 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 + deplace(x,y) + surface() : double {abstraite} + primtre() : double {abstraite}

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

Cercle - rayon : int + surface() : double + primtre() : double

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

www.serli.com

Pas dimplmentation !!

Cours POO - M. Baron - Page 145

Notion dinterface Une interface est un modle pour une classe


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

Exemple :
Les choses Dmarrable doivent possder une mthode dmarre()
Voiture Dmarrable << Interface >> + dmarre Ordinateur
Cours POO - M. Baron - Page 146

Notion dinterface et Java Mise en uvre dune interface


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

Interface : ne pas confondre avec les interfaces graphiques

Lorsquon dfinit une classe, on peut prciser quelle implmente une ou plusieurs interfaces donne(s) en utilisant une fois le mot cl implements
public class NomClasses implements Interface1,Interface3, ... { ... }

www.serli.com

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

Cours POO - M. Baron - Page 147

Notion dinterface et Java Mise en uvre dune interface


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

Une interface ne possde pas de mot cl abstract


www.serli.com

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

Cours POO - M. Baron - Page 148

Notion dinterface et Java Toute classe qui implmente linterface doit implmenter toutes les mthodes dfinies par linterface
Voiture Dmarrable << Interface >> + dmarre
public interface Dmarrable { public void dmarre(); }

Ordinateur

www.serli.com

Doit implmenter toutes les mthodes des interfaces

public class Voiture implements Dmarrable { ... public void dmarre() { estDemarree = true } }

public class Ordinateur implements Dmarrable { ... public void dmarre() { estDemarree = true } }

Une Voiture est Dmarrable Un Ordinateur est Dmarrable


Cours POO - M. Baron - Page 149

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

Une personne peut dmarrer tous les objets Dmarrable

Cours POO - M. Baron - Page 150

Notion dinterface et Java Une Voiture et un Ordinateur sont des objets Dmarrable
public class Personne { private Demarrable objetDemarrable; public Personne(Demarrable dem) { objetDemarrable = dem; } public void mettreEnRoute() { objetDemarrable.demarre(); } }

www.serli.com

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

Notion dinterface et Java Les interfaces pourront se driver


Une interface peut hriter dune autre interface : extends

Consquences La dfinition de mthodes de linterface mre (NomInte1) sont reprises dans linterface fille (NomInte2). Toute classe qui implmente linterface fille doit donner une implmentation
www.serli.com

NomInte1 << Interface >> +

NomInte2 << Interface >> +

toutes les mthodes mmes celle hrites

Utilisation Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires


Cours POO - M. Baron - Page 152

Classes abstraites versus interfaces Les classes


Elles sont compltement implmentes Une autre classe peut en hriter Les classes abstraites Elles sont partiellement implmentes Une autre classe peut en hriter mais doit donner une implmentation aux mthodes abstraites
www.serli.com

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

Linterface Cloneable Deux possibilits pour dupliquer un objet de ses classes


Crer une mthode ad-hoc public MaClasse dupliquer() qui retourne une copie de lobjet en ayant cr une nouvelle instance et initialis les attributs (en utilisant le constructeur)
saClio maClio

saClio != maClio mais le contenu est identique

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

recopie

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

Utiliser linterface Cloneable pour garder la compatibilit avec les autres classes de Java
www.serli.com

Implmenter la mthode protected Object clone() de linterface Cloneable


public class Voiture implements Demarrable, Cloneable { protected Object clone() { Voiture copie; copie = new Voiture(this.puissance, (Galerie)laGalerie.clone()); return copie; } }

Cours POO - M. Baron - Page 154

Les classes internes Inner Classes Rgle de base en Java


Une classe par fichier et un fichier par classe Classes locales ou internes Dfinies lintrieur dautres classes (Moteur dans Voiture) Classes anonymes
www.serli.com public class Voiture { ... class Moteur { ... } }

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

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

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

Cours POO - M. Baron - Page 155

Les classes internes Inner Classes


Code source : 1 fichier classe classe anonyme classe interne Gnration de byte-code : 3 fichiers classe Voiture.class anonyme Voiture$1.class interne Voiture$Moteur.class
www.serli.com
}

Classe anonyme, implmente linterface Initialisable


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

Classe interne

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

Programmation Oriente Objet application au langage Java


Les indispensables

Mickal BARON - 2007 mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com

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

Paquetage

0..*

Classe

0..*

Mthode Attribut

0..* 0..*

Interface

www.serli.com

Un package est donc un groupe de classes associes une fonctionnalit Exemples de packages
java.lang : rassemble les classes de base Java (Object, String, System, ) java.util : rassemble les classes utilitaires (Collections, Date, ) java.io : lecture et criture
Cours POO - M. Baron - Page 158

Les packages : ok, mais pourquoi faire? Lutilisation des packages permet de regrouper les classes afin dorganiser des libraires de classes Java Exemple : la classe Date est dfinie deux fois

Nom complet de la classe java.util.Date


www.serli.com

Package Sous-Package Classe

Cours POO - M. Baron - Page 159

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

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

Nom du paquetage avec le nom de la classe

Ecriture trs lourde prfrer la solution avec le mot cl import

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

Cours POO - M. Baron - Page 160

Les packages : leur existence physique A chaque classe Java correspond un fichier A chaque package (sous-package) correspond un rpertoire
Package Exemple : mesclassses.Voiture Voiture.java mesclasses Classe
Le nom des packages est toujours crit en minuscules

Un package peut contenir


www.serli.com

Des classes ou des interfaces Un autre package (sous-package) Package (mesclasses) Sous-package (ex1) Classe (Voiture.java)
Cours POO - M. Baron - Page 161

Exemple : mesclassses.ex1.Voiture ex1 mesclasses

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 dans le rpertoire src du rpertoire Java Les bytecodes (*.class) se trouvent dans larchive rt.jar du rpertoire Java
String.java

lang www.serli.com

util

math

Cours POO - M. Baron - Page 162

Les packages : cration et conseils Quand vous crer un projet (TP par exemple) nommez le package de plus haut (voiture par exemple) niveau au nom du projet (Voiture par exemple)
Sources

Vos rpertoires de travail (Pas encore de notion de package)


Voiture Geom

Package voiture :
voiture

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

www.serli.com

Vos packages. A la racine de Voiture vous pouvez y placer des informations daides lutilisation de votre package. (Fichier de lancement par exemple)

modele

test

VoitureElectrique.java

Voiture.java

Test.java

Cours POO - M. Baron - Page 163

Les packages : cration et conseils Pour spcifier une classe quelle appartient une classe utiliser le mot cl package Le mot cl package est
toujours plac en premire package voiture.modele; public class VoitureElectrique { instruction dune classe ... } package voiture.modele; public class Voiture { ... } package voiture.test; import voiture.modele.VoitureElectrique; import voiture.modele.Voiture; import ...
www.serli.com public class Test1 { public static void main(String[] argv) { ... } }

Ne confondez pas hritage et package. Pas la mme chose. VoitureElectrique est dans le mme package que Voiture

Cours POO - M. Baron - Page 164

Les packages : compilation et excution tre plac dans la racine du rpertoire Voiture
Voiture

La compilation doit prendre en compte les chemins des packages


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

www.serli.com

Lexcution se fait en indiquant la classe principale avec son chemin


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

java voiture.test.Test

Cours POO - M. Baron - Page 165

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

Essai utilise les classes Date du package java.util et ZipFile du package java.util.zip

public class Essai { ... www.serli.com public Essai() { Date myDate = new Date(...); ZipFile myZip = new ZipFile(...); ... } ... }

Cours POO - M. Baron - Page 166

Javadoc et les commentaires Deux types de commentaires


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

Classes, constructeurs, mthodes et champs : prparer le terrain


Compris entre
/**

et

*/ /**

Premire ligne : uniquement Dernire ligne : uniquement

Suivantes : un espace suivi dune toile


www.serli.com */

prcd dun espace


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

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

Cours POO - M. Baron - Page 167

Javadoc et les commentaires Javadoc et intrts


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

Utilisation
Lentit documente est prcde par son commentaire Suivre la prsentation de description des mthodes, classes, prcdente
www.serli.com

Utilisation de tags dfinit par javadoc permettant de typer certaines informations (utilisation possible de balise html)
@author @version @param @since @return @throws @deprecated @see Nom du ou des auteurs Identifiant de version Nom et signification de largument (mthodes uniquement) Version du JDK o cest apparu (utilis par SUN) Valeur de retour Classe de lexception et conditions de lancement Provoque les avertissements de dsapprobation Rfrence croise Cours POO - M. Baron - Page 168

Javadoc et les commentaires Exemple avec le source de la classe Object


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

www.serli.com

Gnration du code html partir de loutil javadoc


Pour obtenir les informations de javadoc javadoc -help
javadoc [options] nomDesClassesJava.java

Cours POO - M. Baron - Page 169

Javadoc et les commentaires Exemple de laperu html de la description de la classe Object gnre avec javadoc

www.serli.com

Cours POO - M. Baron - Page 170

Jar Jar et intrts


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

Montre les archives utilises pour excuter le programme HelloWorld

www.serli.com

Utilisation pour la cration


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

Cration Verbose Nom archive

Le . indique le rpertoire courant


Cours POO - M. Baron - Page 171

Jar Utilisation pour la cration (suite)


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

MANIFEST.MF

Cration du jar avec un fichier manifeste :


www.serli.com

jar cvfm hello.jar MANIFESTE.MF .

Utilisation pour lexcution


java jar hello.jar

La classe HelloWorld est charge par lintermdiaire du fichier MANIFESTE.MF


Cours POO - M. Baron - Page 172

Cette option permet dexcuter partir dune archive du code java

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

A quoi a sert
Grer les erreurs est indispensable : Mauvaise gestion peut avoir des consquences catastrophiques (Ariane 5) Mcanisme simple et lisible : Regroupement du code rserv au traitement des erreurs (pas de mlange avec lalgorithme) Possibilit de rcuprer une erreur plusieurs niveaux dune application (propagation dans la pile des appels de mthodes)

www.serli.com

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

Exception Premier exemple : lancer et capturer une exception


public class Point { ... // Dclaration des attributs ... // Autre mthodes et constructeurs public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; } 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

www.serli.com

Cours POO - M. Baron - Page 174

Exception : mcanisme Explication


Lorsquune situation exceptionnelle est rencontre, une exception est lance Si elle nest pas traite, elle est transmise au bloc englobant, , jusqu ce quelle soit traite ou parvienne en haut de la pile dappel. Elle stoppe alors lapplication
Mthode 1
www.serli.com bloc 2 bloc 2.1

Mthode n
bloc 1 bloc 1.1

Mthode 2
appel de mthode transmission d'exception

bloc 2.1.1

bloc 2.1.2

Mthode n

bloc 2.2

Une exception vient de se produire

Cours POO - M. Baron - Page 175

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

Permet au constructeur Point de lancer une exception ErrConst

Soit la mthode lance une exception, en crant une nouvelle valeur (un objet) dexception en utilisant le mot cl throw
public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; }

www.serli.com

Cration dune nouvelle valeur dexception

Soit la mthode appelle du code qui lance une exception


public Point(int x, int y) throws ErrConst { checkXYValue(x,y); this.x = x ; this.y = y; } private void checkXYValue(in x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); }

Cours POO - M. Baron - Page 176

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

Mthodes risques. Elles sont surveilles

www.serli.com

La gestion des risques est obtenue par des blocs catch(TypeException e) {}


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

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

Exception : capturer ou attraper Comprhension du mcanisme de capture


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

Lerreur exceptionnelle est traite par le bloc catch

www.serli.com

} ... } }

Puis, il y a poursuite de lexcution en dehors du bloc try catch Remarque : si erreur le programme sarrte (System.exit(-1))

Cours POO - M. Baron - Page 178

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

Throwable

Erreur que lon peut traiter puisque rcuprable

Error
www.serli.com

Exception

NullPointerException Pour dfinir de nouveaux types dexception, on sous-classera la classe Exception

ErrConst

Cours POO - M. Baron - Page 179

Exception : modlisation Les exceptions sont des objets nous pouvons donc dfinir
Des attributs particuliers Des mthodes
Exception - message : String
Renvoie le message derreur dcrivant lexception Contient un message derreur dcrivant lexception Constructeur avec ou sans argument

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

www.serli.com

Affiche sur la sortie erreur standard la liste des appels de mthodes ayant conduit lexeception

ErrConst

Classe trs simple, puisque rien na t redfini

public class ErrConst extends Exception { public ErrConst() { ... } }

Cours POO - M. Baron - Page 180

Exception : modlisation Utilisation de lobjet ErrConst


Erreur de type ErrConst qui hrite de Exception

public class Test { public static void main(String[] argv) { try { ... } catch (ErrConst e) { System.out.println("Erreur Construction"); System.out.println(e.getMessage()); e.printStackTrace(); System.exit(-1);

Affichage de lerreur

www.serli.com

} ... } }

Affichage de la liste des mthodes

Cours POO - M. Baron - Page 181

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

www.serli.com

Attrape la nouvelle exception de type ErrDepl

Cours POO - M. Baron - Page 182

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

Les exceptions dclares dans la clause throws dune mthode sont :


Les exceptions leves dans la mthode (Point) et non attrapes par celle-ci
www.serli.com

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

public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; }

Cours POO - M. Baron - Page 183

Exception : attrapez les tous Il faut sassurer que les exceptions sont sous contrle
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(...); } } }

www.serli.com

Ne pas oublier de traiter une exception sinon le compilateur ne vous loupe pas!!!!

Cours POO - M. Baron - Page 184

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

www.serli.com

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

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

Cours POO - M. Baron - Page 185

Exception : transmission dinformation Possibilit denrichir la classe ErrConst en ajoutant des attributs et des mthodes de faon communiquer ErrConst
- abs, ord : int + ErrConst(x,y) + getAbs : int + getOrd : int

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

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

www.serli.com

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

Cours POO - M. Baron - Page 186

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

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

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

Ces instructions sont rappeles plusieurs fois

www.serli.com

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

Cours POO - M. Baron - Page 188

Exception : pour ou contre


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

La gestion des erreurs devient trs difficile

Difficile de grer les retours de fonctions

www.serli.com

// Fermeture du fichier if (closeTheFileFailed()) { codeErreur = - 4; } } else { codeErreur = - 5; } }

Le code devient de plus en plus consquent

Cours POO - M. Baron - Page 189

Exception : pour ou contre Le mcanisme dexception permet


La concision 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) { ... } }

www.serli.com

Prfrer cette solution la prcdente. Programmation propre et professionnelle


Cours POO - M. Baron - Page 190

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

Liste de quelques exceptions


www.serli.com

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

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

Java fournit un paquetage java.io qui permet de grer les flux de donnes en entre et en sortie, sous forme de caractres (exemple fichiers textes) ou sous forme binaire (octets, byte)
Cours POO - M. Baron - Page 192

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

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

Les flux de caractres Exemple : crire du texte dans un fichier


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

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

Fermeture du flux myFile vers le fichier a_ecrire.txt

Ecriture dune ligne de texte dans le fichier a_ecrire.txt

Cours POO - M. Baron - Page 194

Les flux de caractres Exemple : lire lentre standard : enfin !!!


public class TestIO { public static void main(String[] argv) { System.out.println("Veuillez saisir votre nom :"); String inputLine = " "; try { BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); String inputLine; inputLine = is.readLine(); is.close(); } catch (Exception e) { System.out.println("Intercept : " + e); }

Convertit un objet de type InputStream en Reader

Lit la ligne jusquau prochain retour chariot

www.serli.com

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

Chane saisie
Cours POO - M. Baron - Page 195

Les flux de caractres Exemple : copie de fichier en utilisant les caractres


FileReader et FileWriter hritent de Reader et Writer et permettent de manipuler un flux texte associ un fichier texte
www.serli.com } } 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); } in.close(); out.close();

Transfert de donnes jusqu ce que in ne fournisse plus rien

Fermeture des flux et par consquent des fichiers respectifs


Cours POO - M. Baron - Page 196

Les flux binaires Exemple : copie de fichier en utilisant les binaires


Mme raisonnement que pour les caractres sauf
public class TestIO { public static void main(String[] argv) { FileInputStream in = new FileInputStream("a_lire.txt"); FileOutputStream out = new FileOutputStream("a_ecrire.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); } }

www.serli.com

Cours POO - M. Baron - Page 197

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

Attention : ne pas confondre la cration de lobjet avec la cration du fichier physique

File - name : String + File(String nf) + createNewFile() + delete() : boolen + exists() : boolen + getName() : String + isFile() : boolen +
www.serli.com

Cration du fichier portant le nom de name Vrifie si le fichier existe physiquement


File monFichier = new File("c:\toto.txt"); if (monFichier.exists()) { monFichier.delete(); } else { monFichier.createNewFile(); }

Cours POO - M. Baron - Page 198

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

Java propose depuis la version 2 des classes permettant de manipuler les principales structures de donnes
www.serli.com

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

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

TreeSet HashSet ArrayList

HashSet

www.serli.com

Depuis la version 5 de Java, possibilit dutiliser les gnriques pour typer le contenu des Collections
Avant : Voiture maVoiture = (Voiture)myList.get(2) Maintenant : Voiture maVoiture = myList.get(2)
Plus de problme de conversion explicite

Cours POO - M. Baron - Page 200

Les collections Linterface Collection permet


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

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

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

Avec les gnriques il va tre possible de fixer la construction de la collection le type du contenu stock dans les collections
www.serli.com

Avanages
Toutes les mthodes accesseurs et modifieurs qui manipulent les lments dune collection sont signs suivant le type dfini la construction de la collection Vrification des types pendant le dveloppement (avant problme de CastClassException)
Cours POO - M. Baron - Page 202

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

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

Cours POO - M. Baron - Page 203

Les collections : Iterator Itrateur monodirectionnel : interface Iterator


Par dfaut, toutes collections possdent un attribut de type Iterator Vrifie sil y a un prochain Supprime le dernier objet renvoy par next()
www.serli.com

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

Permet dobtenir lobjet courant et passe au suivant

Iterator iter = c.iterator(); while (iter.hasNext()) {

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

On vrifie sil y a possibilit de rcuprer un objet

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

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
ListIterator << Interface >> + previous() : < ? > + hasPrevious() : boolen + add(< ? >) + set(< ? >) + Iterator << Interface >>

Ajoute ou modifie la position courante un lment de la collection c est une collection et on rcupre son ListIterator Initialise en dbut de liste

www.serli.com

On vrifie sil y a possibilit de rcuprer un objet prcdemment

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

Rcupre lobjet prcdemment puis on passe au prcdent

Cours POO - M. Baron - Page 205

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

LinkedList<String> l1 = new LinkedList<String>(); ListIterator iter = l1.listIterator();

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

www.serli.com

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

Ajout des lments au travers de litrateur Lutilisation de la LinkedList est transparente


Cours POO - M. Baron - Page 206

Les collections : LinkedList Possibilit dutiliser les collections (ici LinkedList est un exemple) sans les itrateurs mais moins performant !!!
LinkedList<String> l1 = new LinkedList<String>(); l1.add("Bonjour"); l1.add("Coucou"); for (int i = 0; i < l1.size(); i++) { String o = l1.get(i); System.out.println(o); } www.serli.com

Utilisation de la mthode add de la classe LinkedList

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

Ne pas modifier la collection (add de LinkedList) pendant quon utilise litrateur (next())
Cours POO - M. Baron - Page 207

Les collections : ArrayList La classe ArrayList est une encapsulation du tableau avec la possibilit de le rendre dynamique en taille Possibilit dutiliser des ListIterator mais on prfre son utilisation un lment de rang donn
ArrayList<Object> myArrayList = new ArrayList<Object>(); myArrayList.add("Coucou"); myArrayList.add(34); for (int i = 0; i < myArrayList.size(); i++) { Object myObject = myArrayList.get(i); if (myObject instanceof String) { System.out.println("Chane:" + ((String)myObject)); } if (my_object instanceof Integer) { System.out.println("Integer:" + ((Integer)myObject)); } } Prfrer lutilisation de la classe ArrayList au lieu de la classe Vector

www.serli.com

Cours POO - M. Baron - Page 208

Les collections : HashSet La classe HashSet permet de grer les ensembles. Deux lments ne peuvent tre identiques Il faut prvoir deux choses dans vos classes :
La redfinition de la mthode hashCode() qui est utilise pour ordonnancer les lments dun ensemble (calcul la table de hachage dun objet) La redfinition de la mthode equals(Object) qui compare des objets de mme classe pour connatre lappartenance dun lment lensemble
public class TestHashSet { public static void main(String[] argv) { Point p1 = new Point(1,3), p2 = new Point(2,2); Point p3 = new Point(4,5), p4 = new Point(1,8); Point p[] = {p1, p2, p1, p3, p4, p3} HashSet<Point> ens = new HashSet<Point>(); for (int i = 0; i<p.length; i++) { System.out.println("Le Point ") ; p[i].affiche(); boolean ajoute = ens.add(p[i]); if (ajoute) System.out.println(" a t ajout"); else System.out.println("est dj prsent"); System.out.print("Ensemble = "); affiche(ens); } } } public static void affiche(HashSet ens) { Iterator iter = ens.iterator(); while(iter.hasNext()) { Point p = iter.next(); p.affiche(); } System.out.println(); }

www.serli.com

Cours POO - M. Baron - Page 209

Les collections : HashSet


public class Point { private int x,y; 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)

www.serli.com

Cours POO - M. Baron - Page 210

Vous aimerez peut-être aussi