You are on page 1of 216

Programmation Oriente Objet application au langage Java

Version Aot 2009

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

Licence

Creative Commons
Contrat Paternit Partage des Conditions Initiales l'Identique
2.0 France

keulkeul.blogspot.com

http://creativecommons.org/licenses/by-sa/2.0/fr
Cours Java - M. Baron - Page 2

Rapide historique concernant la POO La POO a une longue histoire


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

Dans les annes 70


Dveloppement par Xrox du premier systme Fentres, Icnes
keulkeul.blogspot.com

et Souris SmallTalk, archtype des langages objets Dveloppement par Apple des premiers Mac
Cours Java - M. Baron - Page 3

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

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

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
Unit logique : le module
keulkeul.blogspot.com

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

Principes POO : programmation par objets Unit logique : lobjet Objet est dfini par
un tat un comportement une identit

maVoiture - couleur = bleue - vitesse = 100

tat : reprsent par des attributs (variables) qui stockent des valeurs
keulkeul.blogspot.com

Comportement : dfini par des mthodes (procdures) qui modifient des tats Identit : permet de distinguer un objet dun autre objet
Cours Java - M. Baron - Page 6

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

keulkeul.blogspot.com

demarre

ma voiture

le moteur

Cours Java - M. Baron - Page 7

Principes POO : notion de classe Les objets qui ont les mmes tats et les mmes comportements sont regroups : cest une classe Les classes servent de moules pour la cration des objets Un objet est une instance dune classe Un programme OO est constitu de classes qui permettent de crer des objets qui senvoient des messages
Nom de la classe Attributs keulkeul.blogspot.com

Voiture
- puissance : entier - estDemarree : boolen - vitesse : rel + deQuellePuissance() : entier

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

Cours Java - M. Baron - Page 8

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

Voiture
keulkeul.blogspot.com

Moteur

Cours Java - M. Baron - Page 9

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

Mise en place du cours


Cours de Francis Jambon (ancien MdC lUniversit de Poitiers) Livre : Programmer en Java 2me dition Claude Delannoy - Eyrolles
keulkeul.blogspot.com

Internet : www.developpez.com

Remerciements pour les relectures


Laurent Guittet, ENSMA, Futuroscope de Poitiers Developpez.com : Jrmie Habasque, No Kimz
Cours Java - M. Baron - Page 10

Organisation ...

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

mbaron.developpez.com/javase/java

Disponible galement en version espagnole ladresse :

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


Cours Java - M. Baron - Page 11

Programmation Oriente Objet application au langage Java

Introduction au langage Java

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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) 1995 : Ralisation du logiciel HotJava en Java permettant dexcuter des applets 1996 : NetscapeTM Navigator 2 incorpore une machine virtuelle Java 1.0 en version beta 1997 : Un premier pas vers une version industrielle Java 1.1 1999 : Version industrielle de Java
Cours Java - M. Baron - Page 13

keulkeul.blogspot.com

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 Rparti Interprt Robuste Sr Portable Performant Multitches Dynamique ...

keulkeul.blogspot.com

Cours Java - M. Baron - Page 14

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


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

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

...

Cours Java - M. Baron - Page 16

Principales tapes dun dveloppement Cration du code source


Outil : diteur de texte, IDE
Codes Sources

A partir des spcifications (par exemple en UML)


MonProgramme.java javac

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

Diffusion sur larchitecture cible


Transfert du Byte-Code seul
keulkeul.blogspot.com

Byte Code

MonProgramme.class java

Outils : rseau, disque, etc

Excution sur la machine cible


Excution du Byte-Code Outil : Machine Virtuelle Java
MonProgramme Cours Java - M. Baron - Page 17

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
Dans la suite du cours, on va sintresser principalement aux API fournies par Java SE

Diffrentes finalits
machine virtuelle

SDK (Software Development Kit) fournit un compilateur et une JRE (Java Runtime Environment) fournit uniquement une machine
keulkeul.blogspot.com

virtuelle. Idal pour le dploiement de vos applications.

Version actuelle de Java


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

Les outils ... Simples diteurs ou environnements de dveloppement


Eclipse NetBeans JBuilder IntelliJ

Les ressources sur Java


Site de Java chez Sun : java.sun.com
keulkeul.blogspot.com

API (rfrence) : java.sun.com/j2se/1.5.0 Tutorial de Sun : java.sun.com/doc/bookstutorial Cours et exemples : java.developpez.com Forum : fr.comp.lang.java
Cours Java - M. Baron - Page 19

LAPI de Java

Packages

Classes
keulkeul.blogspot.com

Description Attributs Mthodes

Cours Java - M. Baron - Page 20

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

Apprendre Java et C++ en parallle


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

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

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


keulkeul.blogspot.com

Cours Java - M. Baron - Page 22

Programmation Oriente Objet application au langage Java

Bases du langage

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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

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


Un seul fichier NomDeClasse.java Pas de fichier den tte comme C/C++

Compilation

Nom de la classe = Nom du fichier java

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


Gnration dun fichier Byte-Code NomDeClasse.class Pas ddition de liens (seulement une vrification)
keulkeul.blogspot.com

Excution
java NomDeClasse

Ne pas mettre lextension .class pour lexcution

Choisir la classe principale excuter

Cours Java - M. Baron - Page 25

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)

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

26

Initialisation et constantes Initialisation


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

Cette instruction joue le mme rle :


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

Penser linitialisation au risque dune erreur de compilation


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

Constantes
Ce sont des variables dont la valeur ne peut affecte qu'une fois
keulkeul.blogspot.com

Elles ne peuvent plus tre modifies Elles sont dfinies avec le mot cl final
final int n = 5; final int t; ... t = 8; n = 10; // erreur : n est dclar final

Cours Java - M. Baron - Page 27

Structure de contrle Choix


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

Itrations

Boucle : for (initialisation ; condition ; modification) { } Boucle (for each) : for (Type var : Collection) { } Tant que : while (condition) { } Faire jusqu : do { } while (condition)
keulkeul.blogspot.com

Nouveaut Java 5

Slection borne
Selon faire : switch ident { case valeur0 : case valeur1 : default: }
Penser vrifier si break est ncessaire dans chaque case
Cours Java - M. Baron - Page 28

Le mot cl break demande sortir du bloc

Structure de contrle Exemple : structure de contrle Faisons varier n


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

keulkeul.blogspot.com

Valeur de n : 6 grand Adios...

Se demander si break est ncessaire


Cours Java - M. Baron - Page 29

Oprateurs sur les types primitifs Oprateurs arithmtiques


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

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

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

Oprateurs logiques
keulkeul.blogspot.com

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

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

Conversion de type explicite (cast)


(NouveauType)variable
Cours Java - M. Baron - Page 30

Oprateurs sur les types primitifs Exemple : simulation du Loto


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

A voir plus tard

keulkeul.blogspot.com

Cours Java - M. Baron - Page 31

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

keulkeul.blogspot.com

a 1

b 2 a=b

a 2

b 2

Cours Java - M. Baron - Page 32

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)

Cration dun tableau


keulkeul.blogspot.com

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

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[];

keulkeul.blogspot.com

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


int monTableau[5]; // Erreur

Cours Java - M. Baron - Page 34

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

La cration dun tableau par new


keulkeul.blogspot.com

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

0
Cours Java - M. Baron - Page 35

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


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

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

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

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

Mme chose avec lutilisation du for each


Cours Java - M. Baron - Page 37

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

null

Tableaux rectangulaires
Dimensionnement :
tab

. . null null

. .

. .

monTableau = new type[2][3]

Tableaux non-rectangulaires
Dimensionnement :
keulkeul.blogspot.com tab

monTableau = new type[2]

monTableau[0] = new type[2]


tab

monTableau[1] = new type[3]

. .

. . .

Cours Java - M. Baron - Page 38

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

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

Prfrer

Programmation Oriente Objet application au langage Java

Classes et Objets

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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

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

Classe et notation UML

Nom de la classe Attributs

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

Mthodes
keulkeul.blogspot.com

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

- Slecteur - Modificateurs

Visibilit
Cours Java - M. Baron - Page 43

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

Attributs

Slecteur

public void demarre() { estDemarree = true; } public void accelere(double v) { if (estDemarree) { vitesse = vitesse + v } } }
Cours Java - M. Baron - Page 44

keulkeul.blogspot.com

Modificateurs

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; } public void demarre() { estDemarree = true; } public void accelere(double v) { if (estDemarree) { vitesse = vitesse + v } } }

Attributs visibles dans les mthodes

keulkeul.blogspot.com

Cours Java - M. Baron - Page 45

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; } keulkeul.blogspot.com public void accelere(double v) { if (estDemarree) { double avecTolerance; avecTolerance = v + 25; vitesse = vitesse + avecTolerance } } }

Variable visible uniquement dans cette mthode

Variable peut tre dfinie nimporte o dans un bloc

Cours Java - M. Baron - Page 46

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 Il peut exceptionnellement y avoir plusieurs classes par fichier
keulkeul.blogspot.com

(cas des Inner classes)

Respecter les minuscules et les majuscules des noms


Cours Java - M. Baron - Page 47

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

Objet et notation UML

maClio est une instance de la classe Voiture


Reprsentation explicite de la classe

Voiture
instance of Relation dinstanciation

Nom de lobjet, rfrence ou de linstance

maClio
keulkeul.blogspot.com

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

Valeurs des attributs qui caractrisent ltat de lobjet

maClio

Cours Java - M. Baron - Page 49

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

instance of

ladaBerline110
keulkeul.blogspot.com

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

205Gti - puissance = 6 - estDemarree = true - vitesse = 250

- puissance = 6 - estDemarree = false - vitesse = 0

Cours Java - M. Baron - Page 50

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

b a=b

Cours Java - M. Baron - Page 51

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

Voiture
instance of

saClio
keulkeul.blogspot.com

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


Cours Java - M. Baron - Page 52

- puissance = 4 - estDemarree = true - vitesse = 179.8

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

Comparer le contenu des objets : equals(Object o)


keulkeul.blogspot.com

Renvoyer true si les objets a et b peuvent tre considrs comme identique au vu de leurs attributs
Recopie et comparaison dans les parties suivantes

Cours Java - M. Baron - Page 53

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

Partie dynamique
keulkeul.blogspot.com

Varie dune instance de classe une autre Varie durant la vie dun objet Constitue dun exemplaire de chaque attribut de la classe
Cours Java - M. Baron - Page 54

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
Lutilisation dun objet non construit provoque une exception de type NullPointerException

keulkeul.blogspot.com

Destruction et libration de la mmoire lorsque


Usage (ventuel) dun Pseudo-Destructeur Lobjet nest plus rfrenc, la place mmoire occupe est rcupre
Cours Java - M. Baron - Page 55

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

null

Cration et allocation de la mmoire


keulkeul.blogspot.com

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

attribut 1 attribut n

Renvoi dune rfrence sur lobjet maintenant cr


monObjet != null
Cours Java - M. Baron - Page 56

Cration dobjets : ralisation La cration dun nouvel objet est obtenue par lappel new Constructeur(paramtres)
Il existe un constructeur par dfaut qui ne possde pas de paramtre (si aucun autre constructeur avec paramtre nexiste)
Les constructeurs portent le mme nom que la classe
public class TestMaVoiture {

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

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

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

Affectation par rfrence

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

Cours Java - M. Baron - Page 58

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

Effectuer certaines initialisations ncessaires pour le nouvel objet cr


keulkeul.blogspot.com

Toute classe Java possde au moins un constructeur


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

Le constructeur de Voiture Le constructeur de Voiture


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

Constructeur avec un paramtre


keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 60

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 {

Dclaration

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

keulkeul.blogspot.com

Cration et allocation mmoire avec Voiture(int)


}

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

Cours Java - M. Baron - Page 61

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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 62

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
public class Voiture { ... public Voiture() { puissance = 4; ... } public Voiture(int p) { puissance = p; ... } public Voiture(int p, boolean estDemaree) { ... } }

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 63

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; // Accs aux attributs en lecture System.out.println("Puissance de v1 = " } }

keulkeul.blogspot.com

+ v1.puissance);

Il nest pas recommand daccder directement aux attributs dun objet

Cours Java - M. Baron - Page 64

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

Envoi de messages : appel de mthodes


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

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

public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture = new Voiture(); // La voiture dmarre maVoiture.demarre(); keulkeul.blogspot.com if (maVoiture.deQuellePuissance() == 4) { System.out.println("Pas trs Rapide"); } // La voiture acclre maVoiture.acclre(123.5); } }

Envoi dun message lobjet maVoiture Appel dun modificateur

Envoi dun message lobjet maVoiture Appel dun slecteur


Cours Java - M. Baron - Page 66

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

Leur modification dans la mthode nentrane pas celle de loriginal

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

Envoi de messages : passage de paramtres Exemple : passage de paramtres


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

Rfrence comme paramtre

Voiture -

Appel dun slecteur avec passage dune rfrence

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


Cours Java - M. Baron - Page 68

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

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

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

Dsigne la variable

vitesse

Dsigne lattribut

vitesse

Dsigne lattribut

demarree

lorsque les identificateurs de variables ne prsentent aucun quivoque


Cours Java - M. Baron - Page 70

this nest pas ncessaire

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

Composition : cycle de vie identiques

Les losanges sont attachs la classe qui contient

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


keulkeul.blogspot.com

Association
Voiture
0..1 0..1

Conducteur

Agrgation
4..5 1 0..1

Roue

Moteur

Galerie
Cours Java - M. Baron - Page 71

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

Attribut qui stocke la rfrence du moteur

Moteur
keulkeul.blogspot.com

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

Cration de l'objet Moteur


Cours Java - M. Baron - Page 72

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

keulkeul.blogspot.com

Moteur

La puissance est donne lors de la construction


Cours Java - M. Baron - Page 73

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

keulkeul.blogspot.com

Moteur

Cration de lobjet Moteur

Transmission de la rfrence de lobjet courant


Cours Java - M. Baron - Page 74

Codage de l'association : composition Il peut tre ncessaire que les deux objets en composition s'changent des messages : Solution 2
Lobjet 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; ... } ... }

keulkeul.blogspot.com

Moteur

La puissance est donne lors de la construction

Rfrence dun objet Voiture en paramtre


Cours Java - M. Baron - Page 75

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

Voiture

0..1

keulkeul.blogspot.com

Galerie

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


Cours Java - M. Baron - Page 76

Destruction et ramasse-miettes La destruction des objets se fait de manire implicite Le ramasse-miettes ou Garbage Collector se met en route
Automatiquement
Prfrer dfinir une mthode et de Si plus aucune variable ne rfrence lobjet linvoquer avant que Si le bloc dans lequel il est dfini se termine tout objet ne soit plus rfrenc : Si lobjet a t affect null

Manuellement :

detruit()

Sur demande explicite par linstruction System.gc()


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

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

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

Pour tre sr que finalize s'excute il faut absolument appeler explicitement

Force le programme se terminer


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

Gestion des objets Afficher son type et sa place mmoire : System.out.println()


System.out.println(maVoiture) // Voiture@119c082

Rcuprer son type : mthode Class getClass()


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

Tester son type : oprateur instanceof mot cl class


keulkeul.blogspot.com

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

ou
if (maVoiture.getClass() == Voiture.class) {...} // C est vrai // galement
Cours Java - M. Baron - Page 79

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

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

Surcharge Exemple : une voiture surcharge


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

Cours Java - M. Baron - Page 81

Constructeurs multiples : le retour Appel explicite dun constructeur de la classe lintrieur dun autre constructeur
Doit se faire comme premire instruction du constructeur Utilise le mot-cl this(paramtres effectifs)
public class Voiture { ... public Voiture() { this(7, new Galerie()); } public Voiture(int p) { this(p, new Galerie()); } public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ...

Exemple
Implantation du constructeur sans paramtre de Voiture partir du constructeur avec
keulkeul.blogspot.com

paramtres

Cours Java - M. Baron - Page 82

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 dagir sur la visibilit des membres (attributs et mthodes) dune classe vis vis des autres classes Plusieurs niveaux de visibilit peuvent tre dfinis en prcdant dun modificateur la dclaration dun attribut, mthode ou constructeur
private public protected A revoir dans la partie suivante
Cours Java - M. Baron - Page 83

keulkeul.blogspot.com

Encapsulation : visibilit des membres dune classe + public classe


La classe peut tre utilise par nimporte quelle classe Attribut accessible partout o sa classe est accessible. Nest pas recommand du point de vue encapsulation

- private
Utilisable uniquement par les classes dfinies lintrieur dune autre classe. Une classe prive nest utilisable que par sa classe englobante Attribut restreint la classe o est faite la dclaration

attribut
keulkeul.blogspot.com

mthode

Mthode accessible partout o sa classe est accessible.

Mthode accessible lintrieur de la dfinition de la classe


Cours Java - M. Baron - Page 84

Encapsulation Exemple : encapsulation


public class Voiture { private int puissance; ... public void demarre() { ... } private void makeCombustion() { ... public class TestMaVoiture { } } public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); keulkeul.blogspot.com // 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 Java - M. Baron - Page 85

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
maChaine.equals("Bonjour!"); // Renvoi vrai
keulkeul.blogspot.com

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

Faites attention la comparaison de chanes de caractres.


maChaine == "toto";

Comparaison sur les rfrences !!


Cours Java - M. Baron - Page 86

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

On peut les transformer en chanes normales String


String s = mCM.toString();

On peut leur ajouter nimporte (surcharge) quoi


keulkeul.blogspot.com

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

On peut leur insrer nimporte (surcharge) quoi


mCM.insert(int offset, ...); // String, int, long, float, double, boolean, char
Cours Java - M. Baron - Page 87

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
keulkeul.blogspot.com StringTokenizer st = new StringTokenizer("Bonjour, le monde|de|Java",", |"); while(st.hasMoreElements()) System.out.println("Element : " + st.nextElement());

Cours Java - M. Baron - Page 88

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
Variables dont il nexiste quun seul exemplaire associ sa classe
keulkeul.blogspot.com

de dfinition Variables existent indpendamment du nombre dinstances de la classe qui ont t crs Variables utilisables mme si aucune instance de la classe nexiste
Cours Java - M. Baron - Page 89

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

Il nest pas interdit dutiliser une variable de classe comme un attribut (au moyen d un identificateur) mais fortement dconseill
Cours Java - M. Baron - Page 90

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

Pour y accder, il faut utiliser non pas un identificateur dobjet mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}
Cours Java - M. Baron - Page 91

Variables et Constantes de classe Exemple : constantes de classe


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

Dangereux car possibilit de modification extrieure...

keulkeul.blogspot.com

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

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

Cours Java - M. Baron - Page 92

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
public static double vitesseMaxToleree() { return vitesseMaxAutorisee*1.10; }
keulkeul.blogspot.com

Pour y accder, il faut utiliser non pas un identificateur d'objet mais le nom de la classe (idem variables de classe)
Voiture.vitesseMaxToleree()
Cours Java - M. Baron - Page 93

Mthodes de classe Exemple : mthode de classe


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

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

keulkeul.blogspot.com

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

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

Cours Java - M. Baron - Page 94

Mthodes de classe : erreur classique Exemple (suite) : mthode de classe


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

Dclaration d'un objet Galerie non statique

keulkeul.blogspot.com

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

Erreur : Utilisation d'un attribut non statique dans une zone statique

Cours Java - M. Baron - Page 95

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

Disponibilit de mthodes qui permettent la conversion en type simple


Integer valueObjet = new Integer(123); int valuePrimitif = valueObjet.intValue(); Ou int valuePrimitif = valueObjet; (AutoBoxing)
keulkeul.blogspot.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 Java - M. Baron - Page 96

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

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


Cours Java - M. Baron - Page 97

Varargs : passage de paramtres en nombre indfini Varargs est une nouveaut Java 5 permettant de passer en paramtre un nombre indfini de valeurs de mme type Pour ceux qui ont connu le langage Turbo Pascal, lquivalent du System.out.println() le permettait dj Avant la version Java 5, il fallait passer en paramtre un tableau dun type donn pour raliser la mme chose
keulkeul.blogspot.com

public ajouterPassager(String[] tab)

La syntaxe de varargs est la suivante : utilisation de


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

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

Du ct client qui fait un appel la mthode, les donnes peuvent tre envoyes comme un
Tableau
keulkeul.blogspot.com

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

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

Varargs : passage de paramtres en nombre indfini Comme un varargs est considr comme un tableau le contenu peut tre vide
public Voiture(int... carac) { ... } public static void main(String[] argv) { new Voiture(); }

Si un varargs est accompagn dun ou plusieurs autres paramtres, le varargs doit obligatoirement tre plac en dernier
keulkeul.blogspot.com

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

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

Cours Java - M. Baron - Page 100

Varargs : passage de paramtres en nombre indfini Problmatiques lies la surcharge dune mthode utilisant un varargs
Dans le cas de la surcharge dune mthode la mthode contenant le varargs a la priorit la plus faible
public class Voiture { public Voiture(int... carac) { } public Voiture(int caract1, int caract2) { ... }
keulkeul.blogspot.com

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

Programmation Oriente Objet application au langage Java

Hritage

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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

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

+ demarre()

Relation dhritage
VehiculePrioritaire - gyrophare : boolen + allumeGyrophare() VoitureElectrique - disjoncteur : boolen + demarre()
Cours Java - M. Baron - Page 104

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
- estDemarree : boolean - vitesse : flottant + deQuellePuissance() : entier + demarre() + accelere(flottant)

VoitureElectrique - disjoncteur : boolen + demarre()


Hrit de Voiture
- puissance : entier - estDemarree : boolean - vitesse : flottant + deQuellePuissance() : entier + demarre() + accelere(flottant)

- puissance : entier

keulkeul.blogspot.com

Cours Java - M. Baron - Page 105

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

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

Super-classe
VehiculePrioritaire

Sous-classe

keulkeul.blogspot.com

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

VehiculePrioritaire est une Voiture

Cours Java - M. Baron - Page 107

Raffinement

Abstraction

Exemple dhritage Exemple : espces


Mammifre

Ctac

Humain

keulkeul.blogspot.com

Baleine

Dauphin

Etudiant

Enseignant

Mobi Dick

Ecco

Raoul

Mickal

Cours Java - M. Baron - Page 108

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

Voiture

VehiculePrioritaire - gyrophare : boolen + allumeGyrophare()

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

Hritage plusieurs niveaux


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

Voiture + demarre()

VehiculePrioritaire + allumeGyrophare()

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

Ambulance am = new Ambulance(...); am.demarre(); am.allumeGyrophare(); am.chercher("Raoul");

keulkeul.blogspot.com

Ambulance - malade : String + chercher(String)

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

Cours Java - M. Baron - Page 110

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

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

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

keulkeul.blogspot.com

VoitureElectrique - disjoncteur : boolen + demarre()

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

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
public class VoitureElectrique extends Voiture { ... public void demarre() { ... } }

Surcharge

keulkeul.blogspot.com

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

au plus une mthode de moins que VehiculePrioritaire

VoitureElectrique possde

au plus une mthode de plus que VoitureElectrique


Cours Java - M. Baron - Page 113

VehiculePrioritaire possde

Redfinition avec rutilisation Intrt


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

Exemple de la Voiture : les limites rsoudre


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

Redfinition avec rutilisation Exemple : rutilisation de mthode


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

keulkeul.blogspot.com

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

Envoi dun message par appel de demarre


Cours Java - M. Baron - Page 115

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
Lappel au constructeur de la superclasse doit se faire absolument en Utilise le mot-cl super premire instruction super(paramtres du constructeur);
keulkeul.blogspot.com

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

Usage des constructeurs : suite Exemple : constructeurs voiture


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

Lappel au constructeur de la super-classe doit se faire absolument en premire instruction

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

Usage des constructeurs : suite Exemple : chanage des constructeurs


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

keulkeul.blogspot.com

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 extends A { private String pInfo; keulkeul.blogspot.com public B(String pInfo) { this.pInfo = pInfo; } } public class Test { public static void main (String[] argv) { new B("Message du main"); } } super();

Cours Java - M. Baron - Page 119

Usage des constructeurs : suite Exemple : constructeur explicite


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; ... } ... } public class VoiturePrioritaire extends Voiture { keulkeul.blogspot.com 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 Java - M. Baron - Page 120

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
public class Voiture extends Object { ... keulkeul.blogspot.com public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ... }

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

Il n'est pas ncessaire d'crire explicitement

extends Object

Cours Java - M. Baron - Page 121

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(5); this(p, new Galerie()); System.out.println(maVoiture); } } } public Sring toString() { } return (this.getClass().getName() + "@" + this.hashCode()); }

Aprs redfinition

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

keulkeul.blogspot.com

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

Redfinition de la mthode

String toString()

Cours Java - M. Baron - Page 122

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

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

demarre() nest pas accessible

publiquement dans un objet VehiculePrioritaire

VehiculePrioritaire + demarre(int code)

VehiculeElectrique + demarre()

Cours Java - M. Baron - Page 123

Droits daccs aux attributs et mthodes Exemple : accs aux mthodes


public class Voiture { private boolean estDemarree; ... protected void demarre() { estDemarree = true; } } } public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration de maVoiture VehiculeElectrique laRochelle = new VehiculeElectrique(...); larochelle.demarre(); // Appel le demarre de VehiculeElectrique VehiculePrioritaire pompier = new VehiculePrioritaire(...); pompier.demarre(1234); // Appel le demarre VoiturePrioritaire pompier.demarre(); // Erreur puisque demarre nest pas public }} public class VoiturePrioritaire extends Voiture { private int codeVoiture; public void demarre(int code) { if (codeVoiture == code) { super.demarre(); }; }

keulkeul.blogspot.com

Cours Java - M. Baron - Page 124

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


public final class VoitureElectrique extends Voiture { ... }

keulkeul.blogspot.com

La classe String par exemple est finale


Cours Java - M. Baron - Page 125

Programmation Oriente Objet application au langage Java

Hritage et Polymorphisme

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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

Rappel
voitureLarochelle est une instance de la classe VoitureElectrique

keulkeul.blogspot.com

VoitureElectrique + demarre() + getVoltage() : int

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

voitureLarochelle

Polymorphisme et Java : surclassement Java est polymorphique


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

Objet de type sous-classe directe de Voiture


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

keulkeul.blogspot.com

VoitureElectrique + demarre() + getVoltage() : int

voitureLarochelle

Cours Java - M. Baron - Page 128

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(); keulkeul.blogspot.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 Java - M. Baron - Page 129

Polymorphisme et Java : surclassement Exemple : surclassement


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

Voiture
keulkeul.blogspot.com

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

+ demarre()

voitureLarochelle

Cours Java - M. Baron - Page 130

Polymorphisme et Java : lien dynamique


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

Lobjet voitureLarochelle initialise les attributs de la classe VoitureElectrique

voitureLarochelle.demarre()

keulkeul.blogspot.com

VoitureElectrique

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

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

Cours Java - M. Baron - Page 131

Polymorphisme et Java : lien dynamique Exemple : lien dynamique


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

Point

Pointcol

keulkeul.blogspot.com

Cours Java - M. Baron - Page 132

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");} } public class Test { public static void main (String[] argv) { Point p = new Point(23,45); p.affiche(); Pointcol pc = new Pointcol(5,5,(byte)12); p = pc; p.affiche(); p = new Point(12,45); p.affiche(); } }

Point

Pointcol

keulkeul.blogspot.com

Cours Java - M. Baron - Page 133

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

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

Cours Java - M. Baron - Page 134

Polymorphisme et Java : bilan


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

Voiture + demarre() { 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 + demarre() { super.demarre(); disjoncteur = true; }

keulkeul.blogspot.com

VoitureElectrique

Liaison dynamique (excution)


Une variable maVoit est bel et bien une rfrence vers un objet de la classe VoitureElectrique
Cours Java - M. Baron - Page 135

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

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

Polymorphisme : un exemple typique Exemple : la gomtrie


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

keulkeul.blogspot.com

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

Cercle - rayon : int + afficher()


Cours Java - M. Baron - Page 137

Polymorphisme : un exemple typique Exemple (suite) : la gomtrie


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 un nouveau type de Forme est dfini, le code de la classe Stockage nest pas modifi

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

keulkeul.blogspot.com

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

} }

Cours Java - M. Baron - Page 138

Polymorphisme : downcasting Intrt


Force un objet par le surclassement librer les fonctionnalits caches

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

ClasseB

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


obj instanceof ClasseB

Retourne vrai ou faux

Cours Java - M. Baron - Page 139

Polymorphisme : downcasting Exemple : downcasting


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

keulkeul.blogspot.com

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

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


Cours Java - M. Baron - Page 140

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

Voiture - puissance : int - estDemarree : boolean - vitesse : reel

Rappel de la classe

Voiture

Cours Java - M. Baron - Page 141

La mthode equals() Exemple : redfinition de la mthode equals


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

Redfinition de la mthode equals de la classe Object

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

Mme valeurs darguments

keulkeul.blogspot.com

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

Attention : lgalit de rfrence == vrifie si les rfrences sont les mmes, cela ne compare pas les attributs

Cours Java - M. Baron - Page 142

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


Si une seule des mthodes dune classe est abstraite, alors la classe devient aussi abstraite
keulkeul.blogspot.com

On ne peut pas instancier une classe abstraite car au moins une de ses mthodes na pas dimplmentation Toutes les classes filles hritant de la classe mre abstraite doivent implmenter toutes ses mthodes abstraites ou sinon elles sont aussi abstraites Cours Java - M. Baron - Page 143

Classes abstraites et Java Le mot cl abstract est utilis pour spcifier quune classe est abstraite Une classe abstraite se dclare ainsi
public abstract class NomMaClasse { ... }

Une mthode abstraite se dclare ainsi


public abstract void maMethode(...);
keulkeul.blogspot.com

Pour crer une mthode abstraite, la signature (nom et paramtres) est dclare sans spcifier le corps et en ajoutant le mot cl abstract
Cours Java - M. Baron - Page 144

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


keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 145

Classes abstraites : exemple VoitureDecapotable Exemple : une voiture dcapotable


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

Mthode abstraite
} keulkeul.blogspot.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 Java - M. Baron - Page 146

Classes abstraites : exemple VoitureDecapotable Exemple (suite) : une voiture dcapotable


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

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


Cours Java - M. Baron - Page 147

Classes abstraites : exemple Forme Exemple : la classe Forme


Les mthodes surface() et primtre() sont abstraites Ces mthodes nont de sens que pour les sous-classes Cercle et Rectangle
Cercle - rayon : int + surface() : double + primtre() : double Forme {abstraite} - positionx, positiony : int + deplace(x,y) + surface() : double {abstraite} + primtre() : double {abstraite}

keulkeul.blogspot.com

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

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

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

Notion dinterface Une interface est un modle pour une classe


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

Exemple
Les choses Demarrable doivent possder une mthode demarre()
Voiture Demarrable << Interface >> + demarre Ordinateur

Cours Java - M. Baron - Page 149

Notion dinterface et Java Mise en uvre dune interface


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

Interface : ne pas confondre avec les interfaces graphiques

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

keulkeul.blogspot.com

Si une classe hrite dune autre classe elle peut galement implmenter une ou plusieurs interfaces
public class NomClasse extends SuperClasse implements Inter1, ... { ... } Cours Java - M. Baron - Page 150

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 Les interfaces ne sont pas instanciables (Mme raisonnement avec les
keulkeul.blogspot.com

classes abstraites)
NomInterface jeTente = new NomInterface(); // Erreur!!

Cours Java - M. Baron - Page 151

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

Ordinateur

Doit implmenter toutes les mthodes des interfaces


keulkeul.blogspot.com

public class Voiture implements Demarrable { ... public void demarre() { moteurAllum = true; } }

public class Ordinateur implements Demarrable { ... public void demarre() { estDemarree = true; } }

Une Voiture est Demarrable Un Ordinateur est Demarrable


Cours Java - M. Baron - Page 152

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 Demarrable Demarrable dem1; // Cration dun objet Voiture dem1 = new Voiture(); // Dclaration et cration dun objet Personne Personne pers1 = new Personne(dem1); pers1.mettreEnRoute(); // Dclaration dun objet de type Demarrable Demarrable dem2; // Cration dun objet Ordinateur dem2 = new Ordinateur(); // Dclaration et cration dun objet Personne Personne pers2 = new Personne(dem2); pers2.mettreEnRoute(); } }

Une personne peut demarrer tous les objets Demarrable

keulkeul.blogspot.com

Cours Java - M. Baron - Page 153

Notion dinterface et Java Exemple : une Voiture et un Ordinateur sont des objets

Demarrable
public class Person { private Demarrable objetDemarrable; public Person(Demarrable dem) { objetDemarrable = dem; } public void mettreEnRoute() { objetDemarrable.demarre(); } }

keulkeul.blogspot.com

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

Notion dinterface et Java Les interfaces pourront se driver


Une interface peut hriter dune autre interface : extends Consquences
NomInte1 << Interface >> +

La dfinition de mthodes de linterface mre NomInte1 sont reprises dans linterface fille NomInte2. Toute classe qui implmente linterface fille doit donner une implmentation toutes les mthodes mmes celle hrites
keulkeul.blogspot.com

Utilisation

NomInte2 << Interface >> +

Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires


Cours Java - M. Baron - Page 155

Classes abstraites versus interfaces Les classes


Elles sont compltement implmentes Une autre classe peut en hriter

Les classes abstraites


Sont partiellement implmentes Une autre classe non abstraite peut en hriter mais doit donner une implmentation aux mthodes abstraites Une autre classe abstraite peut en hriter sans forcment donner une implmentation toutes les mthodes abstraites
keulkeul.blogspot.com

Ne peuvent pas tre instancies mais peuvent fournir un constructeur

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

156

Linterface Cloneable Deux possibilits pour dupliquer un objet


Crer une mthode ad-hoc public MaClasse dupliquer() qui retourne une copie de lobjet en ayant cr une nouvelle instance et initialis les attributs (en utilisant le constructeur)
saClio != maClio mais
saClio - puissance = 4 - estDemarree = true - vitesse = 179.8 maClio - puissance = 4 - estDemarree = true - vitesse = 179.8

le contenu est identique

recopie

Utiliser linterface Cloneable pour garder la compatibilit avec les autres classes de Java Implmenter la mthode protected Object clone() de linterface
keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 157

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 Sont des instanciations de classes et des implmentations dune classe
keulkeul.blogspot.com Demarrable uneInstance = new Demarrable(){ public void demarre() { // Code ici } }; public class Voiture { ... class Moteur { ... } }

abstraite ou dune interface La ou les mthodes abstraites doivent

tre implmentes au moment de linstanciation


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

Cours Java - M. Baron - Page 158

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

Classe anonyme, implmente linterface Init


public class Voiture { public Voiture(...) { monMoteur = new Moteur(...); Init monInit = new Init() { 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 Java - M. Baron - Page 159

Programmation Oriente Objet application au langage Java

Les indispensables

Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

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

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

161

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

keulkeul.blogspot.com

Package Sous-Package Classe

Cours Java - M. Baron - Page 162

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
keulkeul.blogspot.com import mesclasses.*; import java.lang.*; // Ne sert rien puisque par dfaut import java.io.*;

Nom du paquetage avec le nom de la classe


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

Ecriture trs lourde prfrer la solution avec le mot cl import

Cours Java - M. Baron - Page 163

Les packages : leur existence physique A chaque classe Java correspond un fichier A chaque package (sous-package) correspond un rpertoire
Exemple : mesclassses.Voiture
Voiture.java

Package Classe
Le nom des packages est toujours crit en minuscules

Un package peut contenir

mesclasses

Des classes ou des interfaces Un autre package (sous-package)


keulkeul.blogspot.com

Package (mesclasses) Exemple : mesclassses.ex1.Voiture


ex1

Sous-package (ex1) Classe (Voiture.java)


Cours Java - M. Baron - Page 164

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

lang keulkeul.blogspot.com

util

math

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

String.java

Cours Java - M. Baron - Page 165

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

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


Geom

Voiture

Package voiture :
voiture

keulkeul.blogspot.com

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

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


test

modele

Test.java VoitureElectrique.java Voiture.java

Cours Java - M. Baron - Page 166

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

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 167

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

keulkeul.blogspot.com

Lexcution se fait en indiquant la classe principale avec son chemin La sparation entre
java voiture.test.Test

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

Cours Java - M. Baron - Page 168

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 Essai utilise les classes Date du package java.util et
public class Essai { ... keulkeul.blogspot.com public Essai() { Date myDate = new Date(...); ZipFile myZip = new ZipFile(...); ... } ... }

import java.util.zip.*; import java.util.*;

ZipFile du package java.util.zip

Cours Java - M. Baron - Page 169

Javadoc et les commentaires Deux types de commentaires


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

Classes, constructeurs, mthodes et champs


Compris entre
/**

et

*/

Premire ligne : uniquement /** Suivantes : un espace suivi dune toile Dernire ligne : uniquement
keulkeul.blogspot.com /** * Description de la mthode * Autres caractristiques */ public Voiture(...) { ... } } */

prcd dun espace


Ajouter du sens et des prcisions vos codes. Expliquer nest pas traduire!!
Cours Java - M. Baron - Page 170

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 description des mthodes, classes,
keulkeul.blogspot.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 Cours Java - M. Baron - Page 171 Rfrence croise

Javadoc et les commentaires Exemple : source de la classe Object


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

keulkeul.blogspot.com

Gnration du code html partir de loutil javadoc


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

Cours Java - M. Baron - Page 172

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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 173

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

Utilisation pour la cration


keulkeul.blogspot.com

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

Cration Verbose Nom archive

Le . indique le rpertoire courant


Cours Java - M. Baron - Page 174

Jar Utilisation pour la cration (suite)


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

Cration du jar avec un fichier manifeste :

MANIFEST.MF

jar cvfm hello.jar MANIFESTE.MF .


keulkeul.blogspot.com

Utilisation pour lexcution


java jar hello.jar

Cette option permet dexcuter partir dune archive du code java

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


Cours Java - M. Baron - Page 175

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

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

keulkeul.blogspot.com

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

Exception Exemple : lancer et capturer une exception


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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 177

Exception : mcanisme Explication


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

bloc 1 bloc 1.1

bloc 2 bloc 2.1


bloc 2.1.1


appel de mthode transmission d'exception

Mthode n Mthode n

bloc 2.2

Une exception vient de se produire

Cours Java - M. Baron - Page 178

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

constructeur Point de lancer une exception

ErrConst

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

Cration dune nouvelle valeur dexception

keulkeul.blogspot.com

Soit la mthode appelle du code qui lance une exception


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

Cours Java - M. Baron - Page 179

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

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


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

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

Exception : capturer ou attraper Comprhension du mcanisme de capture


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

Lerreur exceptionnelle est traite par le bloc catch

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 181

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

Exception

keulkeul.blogspot.com

NullPointerException

ErrConst

Pour dfinir de nouveaux types dexception, on sousclassera la classe

Exception

Cours Java - M. Baron - Page 182

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 + + + + + Exception() Exception(String) getMessage() : String printStackTrace() Constructeur avec ou sans argument Contient un message derreur dcrivant lexception

keulkeul.blogspot.com

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

ErrConst

Classe trs simple, puisque rien na t redfini

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

Cours Java - M. Baron - Page 183

Exception : modlisation Exemple : utilisation de lobjet ErrConst


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

Affichage de lerreur

Affichage de la liste des mthodes

keulkeul.blogspot.com

Cours Java - M. Baron - Page 184

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

keulkeul.blogspot.com

Attrape la nouvelle exception de type

ErrDepl

Cours Java - M. Baron - Page 185

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
keulkeul.blogspot.com
public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; }

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

Cours Java - M. Baron - Page 186

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

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 187

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

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

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

Cours Java - M. Baron - Page 188

Exception : transmission dinformation Possibilit denrichir la classe ErrConst en ajoutant des attributs et des mthodes de faon communiquer
public class Point { public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(x,y); this.x = x ; this.y = y; } public class ErrConst extends Exception { ... private int abs, ord; } public ErrConst(int x, int y) { this.abs = x; this.ord = y; } public int getAbs() { return this.abs; } public int getOrd() { return this.ord; } } public class Test { public static void main(String[] argv) { try { ... a = new Point(-2, 4); } catch (ErrConst e) { System.out.println("Erreur Construction point"); System.out.println("Coordonnes souhaites : " + e.getAbs() + " " + e.getOrd()); System.exit(-1); }...

ErrConst - abs, ord : int + ErrConst(x,y) + getAbs : int + getOrd : int

keulkeul.blogspot.com

connatre les valeurs qui ont fait chouer la construction de Point

ErrConst permet de

Cours Java - M. Baron - Page 189

Exception : finally Bloc finally : cest une instruction optionnelle qui peut servir de nettoyage Elle est excute quel que soit le rsultat du bloc try (cest-dire quil ait dclench ou non une exception) Permet de spcifier du code dont lexcution est garantie quoi quil arrive Lintrt est double
keulkeul.blogspot.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 Java - M. Baron - Page 190

Exception : finally Exemple : terminer correctement avec finally


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

Ces instructions sont rappeles plusieurs fois

keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 191

Exception : pour ou contre Exemple : grer les erreurs sans les exceptions
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

keulkeul.blogspot.com

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

Le code devient de plus en plus consquent

Cours Java - M. Baron - Page 192

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

keulkeul.blogspot.com

Prfrer cette solution la prcdente. Programmation propre et professionnelle

Cours Java - M. Baron - Page 193

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


keulkeul.blogspot.com

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

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 Java fournit un paquetage java.io qui permet de grer les flux de donnes en entre et en sortie, sous forme de caractres (exemple fichiers textes) ou sous forme binaire (octets, byte)
Cours Java - M. Baron - Page 195

keulkeul.blogspot.com

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) Pour les flux de caractres La classe Reader et ses sous-classes pour lire des caractres (BufferedReader, FileReader) La classe Writer et ses sous-classes (BufferedWriter, FileWriter)
Cours Java - M. Baron - Page 196

keulkeul.blogspot.com

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


FileWriter hrite de Writer et
permet de manipuler un flux texte associ un fichier

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

Fermeture du flux myFile vers le fichier

a_ecrire.txt

Ecriture dune ligne de texte dans le fichier a_ecrire.txt


Cours Java - M. Baron - Page 197

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


public class TestIO { public static void main(String[] argv) { System.out.print("Veuillez saisir votre nom :");

Convertit un objet de type InputStream en Reader

String inputLine = " "; try { BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); inputLine = is.readLine(); is.close(); } catch (Exception e) { System.out.println("Intercept : " + e); }

Lit la ligne jusquau prochain retour chariot

keulkeul.blogspot.com

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

Chane saisie
Cours Java - M. Baron - Page 198

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 Transfert de donnes jusqu ce que in ne fournisse plus rien
} }

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

keulkeul.blogspot.com

Fermeture des flux et par consquent des fichiers respectifs Cours Java - M. Baron - Page

199

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(); } }
Cours Java - M. Baron - Page 200

keulkeul.blogspot.com

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

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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 201

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

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

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

TreeSet HashSet ArrayList

HashSet

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

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
keulkeul.blogspot.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 quelles disposent de fonctionnalits communes


Cours Java - M. Baron - Page 204

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

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

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

Les collections : Iterator Les itrateurs permettent de parcourir les lments dune collection sans connaissance prcise du type de la collection : Polymorphisme Il existe deux familles ditrateurs
monodirectionnels
Le parcours de la collection se fait dun dbut vers une fin; laccs un lment ne se fait quune seule fois

bidirectionnels
keulkeul.blogspot.com

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

Cours Java - M. Baron - Page 206

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
Iterator << Interface >> + hasNext() : boolen + next() : < ? > + remove()

Permet dobtenir lobjet courant et passe au suivant

next()

c est une Iterator

collection et on rcupre son

Iterator iter = c.iterator(); keulkeul.blogspot.com

On vrifie sil y a possibilit de rcuprer un objet

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

On rcupre lobjet courant puis on passe au suivant


Cours Java - M. Baron - Page 207

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
Iterator << Interface >>

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

On vrifie sil y a possibilit de rcuprer un objet prcdemment


keulkeul.blogspot.com

Ajoute ou modifie la position courante un lment de la collection

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

Rcupre lobjet prcdemment puis on passe au prcdent

ListIterator

collection et on rcupre son

Initialise en dbut de liste


Cours Java - M. Baron - Page 208

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

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

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

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

Cours Java - M. Baron - Page 209

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

Lutilisation de la

LinkedList

Utilisation de la mthode add de la classe

nest pas transparente. Connaissance obligatoire de ces mthodes

LinkedList

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

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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 211

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

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

Les collections : HashSet Exemple : gestion de points avec HashSet


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

keulkeul.blogspot.com

Cours Java - M. Baron - Page 213

Les collections : HashSet Exemple : gestion de points avec 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)

keulkeul.blogspot.com

Cours Java - M. Baron - Page 214

Programmation Oriente Objet application au langage Java

Bilan
Mickal BARON - 2008 (Rv. Aot 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

Bilan Ce que nous avons appris


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

Perspectives futures
Le langage Java est en constante volution. Chaque nouvelle version apporte son lot de nouvelles fonctionnalits
keulkeul.blogspot.com

Structurer les classes en appliquant les patterns de conception (Design Pattern) Le langage Java est un point de dpart pour concevoir des applications serveur avec Java Entreprise Edition
Cours Java - M. Baron - Page 216

You might also like