Vous êtes sur la page 1sur 312

Introduction

- p. 1

Fonctionnement

1 heures de cours par semaine

1.5 heures de TD par semaine

2 heures de TP tous les 15 jours

3 devoirs surveills (1 feuille A4 recto verso autorise)

1 ou 2 projets faire en TP

Le tout pendant 17 semaines !

- p. 2

Prsentation de JAVA

Langage de Programmation dvelopp chez Sun Microsystems


(www.sun.com)

Premire version : Dbut 96.

1998 : version 1.2 (java 2)

fin 2004 : version 1.5, encore appel Java 5

http://java.sun.com

http://penserenjava.free.fr

- p. 3

Java est

Objet

Simple

efficace

du point de vue du dveloppement

du point de vue de la rapidit ( voir !)

complet

gratuit

portable

- p. 4

Java est orient objet

Java est fortement objet : Tout est objet except certains types primitifs
Plus proche de SmallTalk que de C++

Pas de variables et de fonctions en dehors des objets

Attention : C++ pour garder les utilisateurs de C

- p. 5

Java est Simple

Mise profit de 20 ans de programmation

Allg des sources derreurs de C/C++ (pointeur, gestion mmoire)

OUF : Syntaxe TRES similaire celle de C/C++ qui a fait ses preuves

Mmes instructions, structures de contrles

Mais pas de pr-processeur, ni de fichiers en-tte, ni de structures/union

Attention Langage de Programmation + Objet : Pas aussi simple que cela

- p. 6

Java est Efficace (Dveloppement)

Dvelopper en JAVA est 2 fois plus rapide quen C++

Beaucoup de vrifications sont faites la compilation

Pas de de gestion mmoire Pas de fuites

Beaucoup dAPI : Gestion des threads, du fentrage...

AIE : JAVA peut tre 2 fois plus lent que C++

Pour de nombreuses applis la vitesse nest pas importante

Java et Internet : Dbit rseau/Vitesse processeur

- p. 7

Java est complet et gratuit

Tlchargeable sur java.sun.com

Java SDK : Outils de base permettant


de crer/debugger/excuter des applications

IDE : Environnement de dveloppement JAVA

Tutorial, API...

Attention Microsoft Java nest pas standard

- p. 8

Java est portable

INTEL
Linux

Source

INTEL

INTEL

Linux

Linux

Linux

MAC

MAC

MAC

SPARC

SPARC

SPARC

Compilateur

Executable

Classique

INTEL

Source

Compilateur
JAVAC

Indpendant
de
larchi

MAC

SPARC

Pseudo Code
(Byte Code)

Interprteur

JAVA
Machine Virtuelle Java (JVM)

- p. 9

Java est portable

Tout fichier .class peut tre export vers une autre machine

La JVM effectue de nombreuses vrifications

La JVM doit interprter les instructions

Java est donc un langage interprt.


Mais attention, il est plus proche de C/C++ que du Basic

- p. 10

Le futur de Java

JAVA futur standard ?

Un rel engouement : de nombreux postes sur le march du travail

Lutilisation du rseau

Les puces Java (tlphone portable....)

Problme de compatibilit

Java est jeune : 15 ans

Inertie du monde de la programmation : La plus


grande communaut de programmeurs est celle du COBOL ! !

- p. 11

Rappels

- p. 12

Conventions de nommage

Un nom de classe commence par une majuscule

Un nom de variable (champ) ou de mthodes commence par une minuscule.

Si le nom est compos de plusieurs mots, les suivants commencent par une
majuscule

Documentation disponibles :
http://java.sun.com/docs/codeconv/

non respect des conventions points en moins aux DS

- p. 13

Pourquoi des conventions

Amlioration de la lisibilit

80 % du temps pass sur un logiciel va vers la maintenance

Lauteur original peut tre substitu

Portabilit : Grandes quantits dAPI : sans conventions, point de salut

- p. 14

Types Primitifs

Java est fortement objet

Oui, mais....Pour simplifier la programmation, il existe des types primitifs

Les types primitifs sont : boolean, char, byte, short, int, long, float, double

On en dduit les variables primitives

Tout type primitif est sign (pas de unsigned comme en C)

Tout type primitif est invariant en taille quelque soit la machine

- p. 15

Type Primitifs en C/C++

Le type int est cod :

sur 2 octets sur un 8086 (processeur 16 bits)

sur 4 octets sur un Sparc

sur 2 octets sur un Pentium sous Dos/Win3.1

sur 4 octets sur un pentium sous Win95/NT...

Obligation de compiler le code suivant larchitecture

Pas de portabilit

Un peu plus de rapidit

- p. 16

Nombres flottants et Comparaison

Il est ncessaire dtre trs prudent avec les valeurs relles lorsquelles sont
utilises au niveau de condition de structures de contrles
double a = 1.0 ;
double b = 1.0 ;
while (((a + 1.0) - a) - 1.0 == 0.0) a = 2*a ;
while ((((a + b) - a) - b) != 0.0) b = b + 1.0 ;
return b ;

Que vaut b ? ?
LAPI java fournit une fonction pour comparer des doubles ! !
La connaissance de lAPI et la recherche dinformation est essentielle

- p. 17

Le transtypage

(typeCast) expression

Cette opration permet de convertir le type de lexpression en typeCast

UpCasting : augmente la gnralit du type : aucune risque

DownCasting : diminue la gnralit du type : comporte des risques

Du moins gnral au plus gnral, on a :

byte short int long float double

- p. 18

Le transtypage implicite

Lors dune affectation, une opration de upcasting implicite peut avoir lieu.

Exemple
double x = 15 ;

La valeur 15 est transforme automatiquement en valeur


double 15.0 avant dtre affecte x

- p. 19

Le transtypage explicite

Lors de certaines oprations, il est parfois ncessaire dutiliser explicitement


une opration de transtypage

Exemple
int x = 3, y = 2 ;
double z = x/y ; /* z = 1.0 */

Pour que z est la valeur 1.5, il faut faire


double z = (double)x/y ;

- p. 20

Oprateurs

- p. 21

Les oprateurs

Arithmtiques classiques : +, -, *, /, % (modulo)

Attention la division de deux nombres entiers est un nombre entier

incrmentation et dcrmentation : ++,-

Oprateurs unaires

En position prfixe, ou postfixe

A utiliser avec prcaution

Oprateurs relationnels , <, , >, ==, ! =

On ne peut pas utiliser = la place de == (OUF)

- p. 22

Les oprateurs

Oprateurs logiques : &&, ||, !

Oprateurs bits bits : &, |, ,

Ils sont valus de manire optimise (comme en C)

Ils sutilisent avec des entiers

Oprateurs de dcalage : ,

Ils sutilisent avec des entiers

Dcaler dune position gauche revient multiplier le nombre par 2.

- p. 23

Les oprateurs

Oprateurs daffectation =

il peut tre combin avec des oprateurs arithmtiques

il peut tre combin avec des oprateurs bits bits

Oprateur ternaire ( cond ? opVrai : opFaux)

Oprateurs et priorit : Mieux vaut mettre des parenthses

- p. 24

Les instructions

- p. 25

Les instructions

Une instruction peut tre

Une affectation : var = expr ;

Une structure de contrle

Conditionnelle : if, switch

Itrative : while, for, do/while

de saut : break continue

de retour de fonction : return

dappel de mthodes dobjets

de cration dobjets

Un bloc dinstructions est une squence dinstructions dlimite par des


accolades

Possibilit de dclarer des variables locales un bloc


- p. 26

Porte de variables locales

{
int x = 12 ;
// Seul x est accessible
{
int q = 96 ;
// x et q sont accessibles
...
}
// seul x est accessible
// q est hors de porte
...

- p. 27

Variables homonymes

Cacher une variable de porte plus tendue


Programmation confuse, Source derreurs, Intrt limit (nul)
{
int x = 12 ;
{
int x = 96 ;
...
}
...

Autoris en C/C++, Interdit en Java

- p. 28

Initialisation des variables locales

Nombreuses erreurs de programmation sont dues un oubli dinitialisation

Erreurs trs difficiles trouver

En Java : Obligation dinitialiser les variables locales


{
int x ;
x = x + 1;
// Erreur de compilation
...
}

- p. 29

Instruction non accessibles

...
if(1 2) return a ;
a = a + 1;
...
Erreur de compilation

- p. 30

Conception Procdurale
vs
Conception Objet

- p. 31

Les langages : O en est ton ?

But dun langage : Fournir de labstraction pour simplifier les problmes.

Machine

Assembleur

Procdural

Objet

- p. 32

Programmation Procdurale

Reprsentation dune solution algorithmique en terme de procdures

Permet de reprsenter et de structurer


les instructions (sous forme de procdures)

et les donnes (sous forme de types)

Utilisable pour de petites applications

Difficiles utiliser pour de grosses applications : Problmes de


maintenance....

- p. 33

Programmation Objet

Tout problme se ramne des objets

Modlisation plus naturelle et plus aise

Permet plus facilement de concevoir une architecture crateur/utilisateur


dans le sens serveur : crateur de classe
client : utilisateur de classe

Adapt la conception de GROSSES applications

- p. 34

Pourquoi ?

Code robuste

Code rutilisable (plus que dans la programmation procdurale)

Faon de penser intuitive : que contient un objet, que fait un objet...

- p. 35

Un petit problme

On doit crer un programme assurant que chaque lve connat la salle de


classe o se tiendra son prochain cours et quil sait comment sy rendre

- p. 36

Programmation procdurale

Voici les diffrentes tapes


1. Dresser La liste des lves
2. Pour chaque lve
(a) Identifier la salle o se droule son prochain cours
(b) Trouver lemplacement de cette salle
(c) Dterminer le chemin y conduisant
(d) Indiquer llve la faon de sy rendre

allerEnClasseSuivante(Eleve e,Chemin c)

- p. 37

Une autre approche

Afficher la liste des salles hbergeant les prochains cours

Afficher les itinraires conduisant aux diverses salles

Demander aux lves, censs connatre leur prochain cours, de se rendre


dans leur salle

e.allerEnClasseSuivante()

- p. 38

Diffrence des deux approches

Dans la premire, en donnant des directives spcifiques, vous endossez


toutes les responsabilits. Vous devez vous proccuper de tous les dtails.

Dans la seconde, en ne fournissant que des instructions gnrales, vous


responsabilisez les acteurs. Vous pouvez vous concentrer sur la globalit du
problme

Dlgation de responsabilit

- p. 39

Une modification

Supposons que certains lves (les 2emes annes) doivent passer par le
secrtariat. Quels changements cela impose t il ?

Dans le premier cas, il convient de distinguer les 2emes annes des


autres lves, afin de les faire passer par le secrtariat. Ceci peut
entraner un gros bouleversement du programme

Dans le second cas, les lves sont responsables. Vous navez qu


crire une procdure supplmentaire pour les 2emes annes, et ceci,
sans modifier le programme principal

- p. 40

Points importants

La russite de cette approche dpend de trois facteurs :


1. Les individus sont responsables deux mmes
2. Le programme moniteur doit communiquer de faon unique avec tous les
individus (1ere, 2eme, et AS)
3. Le programme moniteur na pas se soucier des dtails individuels
concernant les lves lors de leur dplacement

- p. 41

Les objets

- p. 42

Quest ce quun objet ? ?

Un objet peut tre vu comme un ensemble de donnes et de fonctions qui lui


sont associes
Variables

Mthodes

Un objet est responsable de ses donnes

Un objet a connaissance de son type, et par ses donnes propres, de son


tat

Le comportement dun objet est dict par le code de ses mthodes

- p. 43

Interface

Afin dassumer leurs responsabilits, les objets doivent disposer dun moyen
de communication

Les donnes dont ces objets disposent

Les mthodes qui ralisent leurs fonctionnalits

Notre objet Eleve contient la mthode allerEnClasseSuivante()

Pas de paramtre dans la mthode

Lobjet sait ce quil lui faut pour se dplacer

Sait trouver les infos pour accomplir cette tche

- p. 44

Un peu de terminologie

On appelle Classe toute description dobjet. Cest le patron de lobjet. Elle


dfinit ses donnes et ses mthodes.
Une classe peut tre vue comme un type de donne particulier

On appelle instance, un objet particulier cr partir dune classe


Les diffrents tudiants seront des instances de la classe Eleve

- p. 45

Conception Objet

Le choix des objets est primordial

Ncessite une phase de rflexion ! !

Pour faciliter la tache : le gnie logiciel....

Diagrammes UML

Designs patterns

- p. 46

Apart

On distingue 3 niveaux dans le dveloppement dun logiciel


1. Conceptuel : Seuls les concepts relatifs aux problmes sont tudis
Lobjet reprsente un ensemble de responsabilits
2. Spcification : Prise en compte du logiciel, dfinition des interfaces
Lobjet devient un ensemble de mthodes
3. Implmentation : Le code arrive

- p. 47

Apart

On distingue 3 niveaux dans le dveloppement dun logiciel


1. Conceptuel : Seuls les concepts relatifs aux problmes sont tudis
Lobjet reprsente un ensemble de responsabilits
2. Spcification : Prise en compte du logiciel, dfinition des interfaces
Lobjet devient un ensemble de mthodes
3. Implmentation : Le code arrive
FAITES DES PETITES FONCTIONS ! ! !

Noubliez pas lutilit des fonctions :


viter dcrire plusieurs fois le mme code

dcomposer une action en plusieurs petites actions ! ! !

- p. 47

Java et les objets

Les objets sont manipuls par des rfrences

Les identificateurs des objets sont en fait des rfrences

Les objets sont instancis par allocation dynamique (oprateur new). On a


alors cr une instance dobjet

Il peut exister plusieurs instances dun mme objet (classe)

- p. 48

Java et les rfrences

Les instances dobjets sont manipules laide de rfrence


Eleve toto ;

On a cr une rfrence de lobjet Eleve, mais on ne peut encore sen


servir
toto = new Eleve() ;

On a associ cette rfrence une instance de lobjet. Maintenant, on peut


utiliser cette rfrence.

- p. 49

La rfrence null

La valeur initiale dune rfrence est null


Elle ne pointe sur rien

Eleve toto ; /* toto pointe sur null*/

- p. 50

Reprsentation

class Test {
public static void main(String[] s) {
Objet monObjet ; // La rfrence
monObjet = new Objet() ; // On cre linstance
Objet autre = new Objet() ; // Autre faon
Objet encore = autre ;
}
Objet

monObjet

int champ1

champ1 = 10
mthode1

mthode1
autre

champ1 = 123
mthode1

encore

- p. 51

Accs aux champs et aux mthodes

A lintrieur dune classe, on les appelle directement par


leur nom

Class Toto {
int champ1 ;
void incChamp1() {
champ1++ ;
}
...
}

- p. 52

Accs aux champs et aux mthodes

Les autres classes accdent gnralement aux membres dun objet par
lintermdiaire dune rfrence

Toto monObjet ;
monObjet = new Toto() ;
monObjet.champ1 = 2 ;
char c = monObjet.incChamp1() ;

- p. 53

Lencapsulation

- p. 54

Exemple

On propose une implmentation toute simple de lobjet Date

On se trouve ici du cot concepteur (programmeur de la classe Date)

class Date {
int j,m,a ;
void afficher() {
System.out.print(j+.+m+.+a) ;
}
}

- p. 55

Exemple ... Suite

On se trouve ici du cot client (utilisateur de la classe Date)

public static void main(String [] args) {


Date inst = new Date() ;
inst.j = 31 ;
inst.m = 2 ; /* Erreur de cohrence*/
inst.a = 2002 ;
inst.afficher() ;
}

- p. 56

Exemple II - Le retour

Pour des raisons obscures, on souhaite

coder le jour et le mois sur un seul entier


Utilisation de et

coder lanne sur un autre entier

class Date {
int jm ;
int a ;
void afficher() {
System.out.print((jm16)+.
+((jm16) 16)+.+a) ;
}
}

- p. 57

Exemple II - le retour ... Suite

public static void main(String [] args) {


Date inst = new Date() ;
inst.j = inst.j | (31 16) ;
inst.m = inst.j | 2 ; /* Toujours PB*/
inst.a = 2002 ;
inst.afficher() ;
}
}

Solution Catastrophique

- p. 58

Remarques

internet : Une multitude de bibliothques (API) prtes lemploi

Les utilisateurs dune bibliothque doivent tre sur quils nauront pas

rcrire du code si une nouvelle version de celle-ci sort.


On doit tout prix prserver la cohrence

Ne pas supprimer des mthodes existantes

Rendre la partie interface (utilisateur) aussi simple que possible


Sparer la partie utilisateur (interface) et la partie implmentation

- p. 59

Lencapsulation

Cacher les donnes dune classe. Seules certaines mthodes sont


accessibles

Meilleure structuration

Meilleure gestion de la cohrence

Maintenance beaucoup plus facile


Les Spcificateurs Java : public, private

- p. 60

Les spcificateurs

public : une mthode ou un champ dclar public est accessible partir de


nimporte quelle classe

private : une mthode ou un champ private nest pas accessible en dehors


de la classe

En pratique : tous les champs seront dclars private

utilisation de mthodes get et set pour accder aux diffrents champs


(convention)

Attention : Mettre les getters et setters uniquement si cela est


NCESSAIRE

- p. 61

Visibilit

class Vision {
prvate int a;
private int b;
private int f() {
...
}
public void visible1() {
....
}
public int visible2(int c) {
....
}
}

- p. 62

Visibilit

111111111
000000000
000000000
111111111
000000000
111111111
000000000
111111111
000000000
111111111
000000000
111111111

class Vision {
prvate int a;
private int b;

private int f() {


...
}

public void visible1() {


....
}

public int visible2(int c) {


....
}
}

- p. 62

Exemple III - la dernire !

Version avec 3 entiers + fonction main

Version avec deux entiers + fonction main

ces deux versions ont toujours un problme de cohrence !

On cre une dernire version, qui change la date comme un triplet et vrifie
la cohrence

- p. 63

Les mrites de lencapsulation

Les mthodes sont simples puisquil ny a pas ce soucier des particularits


de limplmentation

Les modifications de limplmentation peuvent se faire en totale


indpendance vis vis de lappelant

- p. 64

Les mrites de lencapsulation

Plus on responsabilise les objets dans leur comportement, plus le


programme moniteur sen trouve dcharg et plus il est simple

Lencapsulation rend la modification du comportement interne dun objet


totalement transparente aux autres objets

Lencapsulation permet de rduire les effets secondaires indsirables

- p. 65

La surcharge

- p. 66

Introduction la surcharge

Redondance dans le langage humain (le sens se dduit du contexte)


exemple : conduire
conduire une moto
conduire une voiture

La plupart des langages de programmation imposent des noms uniques


pour chaque fonction
conduireMoto(une_moto)
conduireVoiture(une_voiture) ;

POURQUOI ? ?

- p. 67

La surcharge

capacit de dfinir plusieurs mthodes de mme nom dans une mme


classe.

bien entendu, il vaut mieux quelles aient le mme objectif ! !

caractristique puissante et utile

lorsque la mthode est appele, le compilateur choisit la mthode quil


convient dexcuter daprs les arguments

Chaque mthode surcharge doit prendre une liste unique de types de


paramtres

comment le dveloppeur lui-mme pourrait-il choisir entre deux mthodes


du mme nom, autrement que par le type des paramtres ?

- p. 68

Exemple

class Surcharge {
void testons() {
System.out.print(Aucun) ;}
}
void testons(int i) {
System.out.print(Un int + i) ;}
}
void testons(double i) {
System.out.print(Un double + i) ;}
}
void testons(int i,double a) {
System.out.print(Deux + i + a) ;}
}

- p. 69

Exemple

static public void main(String[] args) {


int x = 1 ;
double a=3.0 ;
Surcharge s = new Surcharge() ;
s.testons() ;
s.testons(x) ;
s.testons(2) ;
s.testons(7.0) ;
s.testons(a) ;
s.testons(x,a) ;
}

- p. 70

Exemple II - Le retour

class Surcharge {
void testons() {
System.out.print(Aucun) ;}
}
void testons(int i) {
System.out.print(Un int + i) ;}
}
void testons(int i,double a) {
System.out.print(Deux + i + a) ;}
}

- p. 71

Exemple II - Le retour

static public void main(String[] args) {


int x = 1 ;
double d=3.0 ;
Surcharge s = new Surcharge() ;
s.testons() ;
s.testons(x) ;
s.testons(2) ;
s.testons(7.0) ; /* Erreur de compilation*/
s.testons(d) ; /* Erreur de compilation*/
s.testons((int)d) ; /* ok */
s.testons(x,a) ;
}

- p. 72

Encore un exemple

Voir le programme Point.java donn en annexe

- p. 73

Surcharge de type de retour

class SurchargeType{
int f() {...} ;
void f() {...} ;
...

...

x = f() ; // OK
f() ; // ? ?

Comment savoir quelle fonction utiliser ?

Engendre des difficults de comprhension

Interdit en JAVA

- p. 74

Surcharge des oprateurs

En C++, on peut surcharger les oprateurs +, - . . .

Intressant par exemple avec la classe NbComplexe

Le code est plus lgant

Plus difficile maintenir ?

Interdit en Java

- p. 75

Initialisation et autres destruction

- p. 76

Initialisation

La programmation sans garde-fou est la principale cause des cots de


dveloppements excessifs

De nombreux bugs viennent dun oubli dinitialisation de variables.

Lutilisation de bibliothques augmente ce risque


faut il initialiser ? comment ?

Il serait intressant dutiliser une mthode dinitialisation pour chaque classe

La solution : Le constructeur

- p. 77

Les constructeurs

Objectif : initialise de faon cohrente ltat dun objet

Lors de toute cration dinstances (new),

de lespace mmoire est allou

le constructeur est appel

Lobjet sera obligatoirement initialis avant quil puisse tre manipul.

Dfinition et initialisation sont des concepts unifis. Il est impossible davoir


lun sans lautre

- p. 78

Les constructeurs II

Un constructeur est appel automatiquement. Et cest lunique appel durant


toute la vie de linstance

Il porte le mme nom que la classe (majuscules-minuscules compris). Pas


de conventions de nommage ici...

Na pas de type de retour ( pas de return)

Si aucun constructeur ne figure dans une classe, un constructeur par dfaut


est appel. Celui-ci ne contient pas darguments

- p. 79

Exemples

class Date {
private int j,m,a ;
Date() {
setDate(1,1,2002) ;
System.out.println("Le constructeur Date()
est appel") ;
}
}
Date inst = new Date() ;

Intressant ! ! !

Mais on ne peut pas choisir la date ! !

- p. 80

Exemples

class Date {
private int j,m,a ;
Date(int cj,int cm,int ca) {
setDate(cj,cm,ca) ;
System.out.println("Le constructeur Date(...)
est appel") ;
}
}
Test inst = new Test(16,9,2002) ;

on utilise les fonctions dj dfinies qui vrifient la cohrence

Et si on veut plusieurs constructeurs : La surcharge

- p. 81

Surcharge et constructeur

On peut surcharger des constructeurs

On les personalise suivant les besoins dinitialisation que lon a


class Date {
private int j,m,a ;
Date() {
setDate(1,1,2002) ;
System.out.println("Le constructeur Date()
est appel") ;
}
Date(int cj,int cm,int ca) {
setDate(cj,cm,ca) ;
System.out.println("Le constructeur Date(...)
est appel") ;
}
}
- p. 82

Constructeur sans arguments

Pour pouvoir utiliser un constructeur sans arguments, il faut que celui-ci


figure dans la classe sauf si aucun constructeur ny figure
class Date {
private int j,m,a ;
Date(int cj,int cm,int ca) {
setDate(cj,cm,ca) ;
System.out.println("Le constructeur Date(...)
est appel") ;
}
}

On ne peut pas utiliser Date inst = new Date() ;

- p. 83

Rgle pour les constructeurs

Si aucun constructeur nexiste, alors le compilateur cre un constructeur par


dfaut, celui ci ne contient pas darguments

Si au moins un constructeur est spcifi alors le compilateur nen cre pas


de supplmentaires

On remarquera que dans de nombreux cas, plusieurs constructeurs sont


dfinis, et parmi eux, un constructeur sans arguments

- p. 84

Rgle de programmation

Les constructeurs existent ! ! !

Servez vous en

TOUTES les initialisations dun objet doivent tre faites dans un constructeur

Comme dans toute rgle, il y aura des exceptions.

- p. 85

Suppression dobjet

En C, la libration de la mmoire est la charge du programmeur

En C++, il existe des destructeurs servant librer la mmoire alloue


dynamiquement

Oublier de nettoyer la mmoire peut induire un manque de ressources

En Java, On ne soccupe pas de la gestion de la mmoire

Que se passe-t-il lorsque lon a plus besoin dun objet ?

Le ramasse miette : Garbage collector

GC est un charognard ! !

Supprime les instances dobjets qui ne sont plus utiles

- p. 86

Exemple

public static void main(String[] args) {


Date inst = new Date() ;
{
Date inst2 = new Date() ;
}
Date inst3 = inst ;
inst = null ;
Date inst3 = new Date() ;
}

Etat du systme aprs lutilisation du GC ?

- p. 87

La documentation

- p. 88

Pourquoi commenter

Un programme sans commentaire est un


programme--crire-seulement

80% du temps est pass la maintenance

Utilisation par dautres personnes (bibliothques)

Modification 6 mois plus tard

La documentation de java
- p. 89

Commentaires

Trois faons de procder. Les deux classiques :


Sur une ou plusieurs lignes
/* Ceci est un commentaire
qui continue ici */

Sur une seule ligne (jusqu la fin)


// Une seule ligne

Les commentaires de documentation


/** contiennent des tags
@author Gilles */

- p. 90

Commentaires de documentation

Grand nombre dAPI

Une uniformisation des documentaires est importante

Cration de documentation HTML avec le programme javadoc

Les commentaires peuvent porter sur

Une classe

Un attribut

Une mthode. Dans la pratique, on commentera tous les champs et


toutes les mthodes publiques

- p. 91

Commentaires de documentation

Les commentaires peuvent intgrer

des balises HTML

des tags
Liste des tags
@version
@author
@param
@return
@see <class-name>
@see <class-name>#<method-name>

- p. 92

Un exemple

Code source de Point.java

Documentation gnre par javadoc

Documentation du package Math

- p. 93

this

- p. 94

Le mot cl this

this est employ dans deux contextes distincts

Pour rfrencer lobjet ayant reu un message

Pour effectuer lappel un constructeur partir dun autre

Les deux notions sont importantes et lgrement difficiles comprendre

- p. 95

this rfrence

this est une variable rfrence

Elle dsigne lobjet ayant reu le message traiter et donc pour lequel on
doit excuter la mthode

Le plus souvent this est implicite

Quelque fois, this doit tre explicite

- p. 96

this implicite

class Cuisinier{
void choisirMenu() { ... }
void faireCourse() { ... }
...
void travailler {
choisirmenu() ; /* this.choisirMenu() ; */
faireCourse() ; /* this.faireCourse() ; */
...

- p. 97

Autre exemple

On revient la classe Point

Ou peut on mettre des this

Un peu de partout...

Il faut lutiliser uniquement si ca aide la comprhension du code !

- p. 98

this explicite

class Nombre {
private double x ;
Nombre(double x) {
this.x = x ; Differencier les x */
...
}
}

- p. 99

Attention

Le procd prcdent est souvent utilis avec les costructeurs et les


modificateurs (fonctions de type set..)

Il peut tre dangeureux


class Nombre {
private double MonNombre ;
Nombre(double MonNonbre) {
this.MonNombre = MonNombre ; //Probme ! !
...
}
}

Pensez utiliser la compltion automatique

- p. 100

this constructeur

Pourquoi ne pas pouvoir appeler un constructeur depuis un autre


constructeur

La duplication de code rajoute des probabilits derreurs (satan


copi-coll)

Eviter la duplication du code

On utilise pour cela le mot cl this

Restrictions

doit tre la premire instruction du constructeur

un seul appel possible par constructeur

- p. 101

this constructeur

class Date {
private int j,m,a ;
Date() {
this(1,1,2002) ; /* Appel constructeur avec args */
System.out.println("Le constructeur Date()
est appel") ;
}
Date(int cj,int cm,int ca) {
setDate(cj,cm,ca) ; /* On vrifie la cohrence */
System.out.println("Le constructeur Date(...)
est appel") ;
}
}

- p. 102

Retour la case Point

Ecrivons les constructeurs de la classe Point

- p. 103

Les tableaux

- p. 104

Les tableaux

En java, les tableaux sont des objets particuliers

Le type des lments est appel type de base du tableau

Le nombre dlments grs est un attribut fix, appel longueur du tableau.

Ressemblance avec les tableaux en C/C++, mais plus facile ! !

On accde aux diffrents lments avec loprateur dindex []

- p. 105

Cration de tableaux

Un tableau une dimension : int t1[] ou String[] t1

Un tableau deux dimensions : double t2[][] ;

et ainsi de suite...

Les variables t1 et t2 reprsentent des variables rfrences

A ce stade, elles ne peuvent pas encore tre utilises.

- p. 106

Instanciation

Une opration dinstanciation est ncessaire pour crer le tableau


t1 = new int[3] ;
t1[0] = 9 ;
t1[1] = 12 ;
/* t1[2] = 0 ; */

Comme en C/C++, le premier lment dun tableau lindice 0

- p. 107

Instanciation et types objets

Lorsque lon cre des tableaux avec des objets non primitifs, il faut instancier
les rfrences
String tabString = new String[4] ;

tabString[0]
tabString

tabString[1]
tabString[2]
tabString[3]

null
null
null
null

tabString

tabString[0] = new String(Bonjour) ;


tabString[1] = new String(Hello) ;
tabString[2] = tabString[0] ;

tabString[0]

bonjour

tabString[1]

Hello

tabString[2]
tabString[3]

null

- p. 108

Plusieurs dimensions

Random r = new Random() ;


int t2[][] ;
t2 = new int[5][] ;
for(int i = 0 ; i< t2.length ;i++)
t2[i] = new int[i+1] ;
for(int i = 0 ; i< t2.length ;i++) {
for(int j = 0 ; j< t2[i].length ;j++)
t2[i][j] = r.nextInt(100) ;
}

t2[0]
t2[1]
t2

t2[2]

t[3][1]

t2[3]
t2[4]

- p. 109

Statique

- p. 110

Exemple

Considrons une classe Cercle. On a alors besoin du nombre

Est ce que est spcifique chaque instance de la classe Cercle

NON : est une constante gnrale

- p. 111

Exemple

public class Cercle {


double PI= 3.14116 ;
double rayon ;
public Cercle(double r) { this.rayon = r ;}
public double aire() {
return PI*rayon*rayon ;
}
...
}

- p. 112

Champs et mthodes statiques

Normalement, rien nexiste rellement avant de crer un objet avec new

il peut tre intressant davoir une zone de stockage pour les donnes
spcifiques qui soit indpendant du nombre dinstances cres (de 0 ...)
le mot-cl static

- p. 113

Exemple

public class Cercle {


double static PI= 3.14116 ;
double rayon ;
public Cercle(double r) { this.rayon = r ;}
public double aire() {
return PI*rayon*rayon ;
}
...
}

- p. 114

Remarque

Etant donn quune variable statique existe mme sans instance de la classe
o elle est dfinie

On peut utiliser cette constante tout moment

Comment faire ? ?

On utilise le nom de la classe comme rfrence ! ! !


Cercle.PI

Cest une convention

De cette manire, on sait que lon est en prsence dune variable statique

- p. 115

Mthodes statiques

De la mme manire que lon peut vouloir une variable statique, on peut
avoir besoin dune mthode statique

Celle ci est indpendante du nombre dinstances de lobjet cr

Elle sert souvent pour des mthodes gnrales (calcul de racine carr dun
double...)

- p. 116

Exemple II

class StaticTest {
static int stI= 8 ;
double d = 12 ;
static void stIncr() {stI++ ;}
...
}
public static void main(String arg[]) {
monObjet = new StaticTest() ;
autre = new StaticTest() ;
autre.stlIncr() ;
}

- p. 117

static : Exemple

stI = 10

StaticTest
monObjet

d = 123.2

static int stI = 10;


double d;
void stIncr()
stI = 10
autre

d = 34.2

- p. 118

Mthodes et static

Une mthode de classe (static) ne peut appeler une mthode dinstance


(non static)

Normal : elle existe mme si aucune instance de la classe nexiste

Une mthode dinstance peut appeler une mthode de classe

- p. 119

Pourquoi ?

Bibliothque de fonctions : Regrouper des fonctionnalits gnrales au sein


dune mme entit : les classes Math, Mediator

Voyons voir la classe Math

Vis vis de certaines classes, il nest pas possible de crer directement des
objets (avec new)
Image img = toolkit.getImage(image.jpg)

Donnes globales une classe : Compter le nombre dinstances cres,


constantes...

- p. 120

La mthode main

public static void main(String[] a)

publique : car sinon comment entrer dans le programme

statique : aucune instance nest encore cre lorsque main commence son
execution

void : elle ne renvoie rien

String[] : les arguments passs en ligne de commande sont contenus dans


un tableau de chanes de caractres

- p. 121

package

- p. 122

Composants Fondamentaux en Java

Les Classes

Les Fichiers Sources


Plusieurs classes possibles dans un mme fichier

MAIS, Une seule classe publique par fichier

Packages (Unit de bibliothque)


Plusieurs fichiers sources

API (Application Program Interface)


Plusieurs packages

- p. 123

Les Packages

Un package est un regroupement logique de plusieurs classes

Beaucoup de packages en Java

Un package correspond la notion de librairies de langages comme le C

Un package peut contenir des sous packages

- p. 124

Quelques Packages de Java 2

java.lang : classes de base de java

java.util : classes utilitaires

java.math : fonctions mathmatiques

java.io : Entres-Sorties

java.net : Applications rseau

- p. 125

Utilisation dun package

Pour utiliser un package, il faut prfixer le nom de la classe avec le nom du


package

Exemple : java.util.Date
java.util.Date d = new java.util.Date()

- p. 126

Utilisation dun package ... 2

Cela peut savrer trs lourd crire

Les informaticiens sont des feinnants


Importation

Il est possible dinclure une directive dimportation en dbut de fichier (avant


toute dfinition de classe)

On importe une classe dun package


import java.util.Date
Date d = new Date()

- p. 127

Utilisation dun package ... 3

Il est possible dimporter toutes les classes dun package


import java.util.*

la package java.lang est automatiquement import

Lutilisation sans importation est surtout intressante pour lever des


ambiguits entre deux classes de mme nom dans des packages diffrents.

- p. 128

Nom dun package

Le nom dun package est entirement dtermin par le chemin indiquant


lemplacement des classes de celui-ci

La premire partie du chemin peut-tre omise si elle appartient la variable


denvironnement CLASSPATH

Cette variable est dfinie dans le fichier dinitialisation (.bashrc, .cshrc,


autoexec.bat)

en bash : export CLASSPATH=chemin1 :chemin2

sous windows CLASSPATH=chemin1 ;chemin2...

- p. 129

Appartenance un package

On peut crer des packages personnels

On dfinit lappartenance dune classe un package par le mot cl :


package
package nomPackage
Une telle directive prcde les directives dimportation

Un package par dfaut regroupe toutes les units de compilation qui


apparaissent dans le mme rpertoire et qui nexplicitent pas
dappartenance un package

- p. 130

Cration dun package - Exemple

Je dispose dune bibliothque gnrale sauve dans le rpertoire


/home/audemard/java/mabilbio

La variable denvironnement est dfini (dans .bashrc)


CLASSPATH=. :/usr/local/java :/home/audemard/java/

La package que je dfinis va alors sappeler mabiblio

Dans chaque units de compilation de


/home/audemard/java/mabiblio, je dois dfinir lappartenance au
package :
package mabiblio

- p. 131

sous bibliothque

Que faire si je rajoute une sous bibliothque

Je cre le rpertoire /home/audemard/java/mabiblio/base

Les classes qui sont dans le rpertoire base appartiennent alors au package
mabiblio.base

Voyons voir un exemple

Eclipse simplifie tout cela....

- p. 132

Visibilit

Plusieurs niveaux de visibilit (du plus restrictif au moins restrictif)

private (dj vu)

package (pas de mot cl)

protected

public (dj vu)


Classe

Package

Sous Classe

private

package

protected

public

monde

- p. 133

Devoir surveill

La semaine 40 (dans 15 jours) durant le cours.

- p. 134

Rutilisation des classes

- p. 135

Redondance de code

Traitement similaire des endroits diffrents du code

copier/coller avec adaptation

Flau pour le dveloppement et la maintenance dapplications

Perte de temps durant lcriture du code

Perte de temps durant le dbogage

Perte de temps durant la maintenance

Handicap de la programmation procdurale

- p. 136

Rutilisation de code

La rutilisation de code est lune des ides directrices de la programmation

Elle est rendue possible grce :

au passage de paramtres

la composition

lhritage

le paradigme objet met en oeuvre le mcanisme dhritage

Renforce la lutte contre la redondance de code

- p. 137

Passage de paramtres

Possibilit de dfinir des actions paramtres

Fondamental en programmation

Tous les langages (volus) offrent ce mcansime

- p. 138

Composition

La composition consiste utiliser des variables rfrences comme champs


dune nouvelle classe

La nouvelle classe est cliente des classes des variables rfrences

La composition reprsente un lien possde un

Le diagramme UML associ


Vacances

Date

setJour
affiche

- p. 139

Exemple

public class Vacances {


private Date dpart ;
private Date arrive ;
private String lieu ;
public Vacances(Date arrive) {
this.arrivee=arrivee ;
this.depart = new Date(22,09,2003) ;
} ...

dpart et arrive sont initialiss null.

NE PAS OUBLIER dinitialiser les instances lors de lappel dun constructeur


Vacances

- p. 140

Introduction lhritage

Le langage humain permet de spcialiser des concepts

Les mamifres

Lhomme est un mamifre

La baleine est un mamifre

Disant cela, je rends implicite certains critres concernant les hommes et les
baleines

Une conversation entre personnes ncessite ces non-dits

- p. 141

Introduction lhritage II

Lhritage reprsente un lien est un ou est comme un

Permet la cration dune nouvelle classe en spcialisant une classe


existante.

Le diagramme UML associ


Mamifere

Humain

Baleine

- p. 142

Intrt de lhritage

Rutilisation du code
Sans toucher aux classes existantes (Pas de dtrioration)

En indiquant simplement les nouvelles caractristiques propres la sous


classe

En redfinissant ventuellement certaines mthodes de la super classe

Dveloppement incrmental
Trs intressant

- p. 143

Exemple

Object

Animal

Mamifre

Poisson

Oiseau

Truite

Pie

- p. 144

Exemple... Suite

public class Animal {


. . .}
public class Mamifre extends Animal {
. . .}
public class Poisson extends Animal {
. . .}
public class Oiseau extends Animal {
. . .}
public class Truite extends Poisson {
. . .}

- p. 145

Dautres dfinitions

La nouvelle classe est dite sous classe, classe drive ou classe enfant. On
dit aussi quelle hrite ou tend ou quelle est une spcialisation de la classe
de dpart

La classe de dpart est appele super-classe, classe de base ou classe


parent. On dit aussi quelle est une gnralisation de celle-ci

Hirarchie de classe ou hirarchie dhritage

Si il existe un chemin dans la hirarchie qui mne de la classe D la classe


A, alors
D est dite classe descendante de A
Truite est descendant de animal

A est dite classe anctre de D


Object est anctre de Pie (Object est anctre de tout le monde !)
- p. 146

Possibilit de lhritage

Les fonctions et champs existant dans la classe de base sont accessibles


dans la classe drive

Possibilit dtendre la dfinition de la classe de base en ajoutant :

des champs

des mthodes

des constructeurs

Possibilit de redfinir des mthodes dune super classe

- p. 147

Redfinition

Lorsque lon dfinit une nouvelle classe par hritage, il est possible de
redfinir des mthodes

Il sagit de placer dans cette classe une mthode de mme en-tte quune
mthode existante dans la super classe.

La nouvelle mthode cache alors la mthode redfinie

La redfinition, comme son nom lindique, permet de redfinir le


comportement dune mthode pa rapport la spcialisation induite par
lhritage

- p. 148

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre
int nbroues

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

VehMaritime

int nbroues

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

VehMaritime

int nbroues

void QuitterPort()
void ArriverPort()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()

Voiture

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()

Voiture
void demarrer()
void arreter()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

Voiture

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()
Avion

void demarrer()
void arreter()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

Voiture
void demarrer()
void arreter()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()
Avion
void atterir()
void decoller()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

Voiture
void demarrer()
void arreter()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()
Avion

Helico

void atterir()
void decoller()

- p. 149

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

Voiture
void demarrer()
void arreter()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()
Avion

Helico

void atterir()
void decoller()

void atterir()
void decoller()

- p. 149

Exemple

class TestA {
public void f() {System.out.println(f de testA) ;}
public void g() {System.out.println(g de testA) ;}
}
class TestB extends TestA{
public void f() {System.out.println(f de testB) ;}
public void h() {System.out.println(h de testB) ;}
}
TestA ta = new TestA() ;
TestB tb = new TestB() ;
ta.f() ; /* OK */
ta.g() ; /* OK */
ta.h() ; /* ERREUR */
tb.f() ; /* OK */
tb.g() ; /* OK */
tb.h() ; /* OK */

f de testA
g de testA
f de testB
g de testA
h de testB

- p. 150

Contraintes

La redfinition implique certaines contraintes

Sur la signature

Sur laccessibilit : La mthode redfinie ne doit jamais tre moins


accessible que la mthode prsente dans la super classe

Sur les exceptions (PLUS TARD)

Si celles ci ne sont pas respectes, une erreur de compilation est signale

- p. 151

Surcharge vs Redfinition

surcharge : Il sagit dune mthode qui possde le mme nom mais pas la
mme signature quune mthode de classe ou de super classe

Donne plusieurs possibilits dappels pour une fonction donne

Redfinition Il sagit dune mthode qui possde la mme signature quune


mthode de la classe mre

modifie le comportement dune fonction par rapport la spcialisation

- p. 152

Exemple

class TestA {
public void f() {System.out.println(f de testA) ;}
public void g() {System.out.println(g de testA) ;}
}
class TestB extends TestA{
public void f(int a) {System.out.println(f de testB + a) ;}
public void h() {System.out.println(h de testB) ;}
}
TestA ta = new TestA() ;
TestB tb = new TestB() ;
ta.f() ; /* OK */
ta.g() ; /* OK */
tb.f() ; /* OK */
tb.f(1) /* OK */
tb.g() ; /* OK */
tb.h() ; /* OK */

f de testA
g de testA
f de testA
f de testB 1
g de testA
h de testB

- p. 153

Introduction lhritage II

Lhritage reprsente un lien est un ou est comme un

Permet la cration dune nouvelle classe en spcialisant une classe


existante.

Le diagramme UML associ


Mamifere

Humain

Baleine

- p. 154

Possibilit de lhritage

Les fonctions et champs existant dans la classe de base sont accessibles


dans la classe drive

Possibilit dtendre la dfinition de la classe de base en ajoutant :

des champs

des mthodes

des constructeurs

Possibilit de redfinir des mthodes dune super classe

- p. 155

Exemple

Vehicule
int maxVitesse
int poids
void demarrer()
void arreter()
void tourner()

Voiture
void demarrer()
void arreter()

VehTerrestre

VehMaritime

VehAerien

int nbroues

void QuitterPort()
void ArriverPort()

void atterir()
void decoller()
Avion

Helico

void atterir()
void decoller()

void atterir()
void decoller()

- p. 156

La classe Object

- p. 157

Introduction

La classe Object est une classe particulire

Cest la classe Racine

toute classe est soit

Directement descendante de Object si aucun hritage nest prcis

Possde Object comme anctre sinon (ce cas englobe lautre)

- p. 158

Arborescence et classe object

Object

Animal

Mamifre

Poisson

Oiseau

Truite

Pie

- p. 159

Arborescence et classe object

public class Animal {


. . .}
public class Mamifre extends Animal {
. . .}
public class Poisson extends Animal {
. . .}
public class Oiseau extends Animal {
. . .}
public class Truite extends Poisson {
. . .}
- p. 160

Particularit

La classe Object ne possde aucun champ (variable)

Par contre, elle possde des mthodes intressantes quil est possible de
redfinir

Allons voir la javadoc de cette classe

Et rsumons les maintenant

- p. 161

La mthode toString

La mthode toSring() est dfinie dans la classe Object. Elle renvoie une
description de lobjet sous forme de chane de caractres.

Cette mthode est utilise par exemple lors de lappel de la fonction


System.out.print

Initialement, la fonction toString() renvoie ladresse en mmoire de


linstance cre. Assez peu intressant.

Essayons avec la classe Point

Cest pour cela que la mthode toString est presque toujours redfinie.

Essayons de nouveau avec la classe Point

- p. 162

Un autre Exemple

class Date {
private int j,m,a ;
public String toString() { return j + . + m + . + a ; }
}
...
d = new Date(12,5,2001) ;
System.out.println(la date est + d) ;

- p. 163

Comparaison dobjets

On souhaite comparer 2 Points. Comment Faire


Point A = new Point(3,2) ;
Point B = new Point(3,2) ;
...
if(A==B) {
}

Utiliser loprateur == ? ? NON, NON et encore NON

Il faut utiliser une fonction de comparaison

- p. 164

La mthode equals

Elle renvoie true si lobjet recevant lappel est identique celui pass en
paramtre de la mthode

La version initiale renvoie true si les deux objets ont la mme adresse. Elle
doit donc tre redfinie

Attention, la mthode doit respecter certaines contraintes :

Rflexivit : x.equals(x) est true

Transitivit : si x.equals(y) et y.equals(z) sont true alors x.equals(z) doit


mtre aussi

Symtrique : si x.equal(y) est true alors y.equals(x) doit ltre aussi

Pour toute rfrence non nulle, x.equals(null) doit tre false

- p. 165

La mthode equals 2 ... Le retour

Essayons avec la classe String

Et maintenant avec la classe Point

- p. 166

Autres mthodes

Il existe une dizaine de fonctions dans la classe Object

Clonage : La mthode clone()

Tables de hachage : hashcode()

Threads : wait(), notify(), notifyAll()

destruction de lobjet : finalize()

On reviendra sur certaines dentre eux

- p. 167

Hritage multiple

- p. 168

Introduction

Supposons une classe Rectangle et une classe Losange

Nous devons crer une classe Carre

De qui hritons nous ? ?

Certains langages comme le C++, permettent dheriter de plusieurs classes

Cest ce que lon appelle lheritage multiple

- p. 169

Hritage multiple

En Java, on ne dispose que de lhritage simple. Il ny a pas dhritage


multiple

Chaque classe hrite dune seule classe :

Soit de la classe Object

Soit dune classe dont le nom est prcis aprs le mot-cl extends

- p. 170

Hritage et constructeurs

- p. 171

Introduction

Lors de lhritage, il y a au moins deux classes concernes

La classe mre

La classe enfant

En pratique, la classe enfant contient un sous objet de la classe mre

Il est essentiel que cette sous classe soit correctement initialise

Un petit exemple...

- p. 172

Exemple

class Vehicule {
Vehicule() {System.out.println(Constructeur de Vehicule) ; }
}
class VehTerrestre extends Vehicule{
VehTerrestre() {System.out.println(Constructeur de Terrestre) ; }
}
class Voiture extends VehTerrestre{
Voiture() {System.out.println(Constructeur de Voiture) ; }
}

Que se passe t il lors de linstruction


Vehicule v = new Vehicule() ; ? ?
Voiture Deuch = new Voiture() ; ? ?

- p. 173

Constructeur

La classe de base doit et va tre correctement initialise

Que se passe t il si on supprime le constructeur de Voiture

Pas de constructeur : Un constructeur par dfaut est cr

Que faire si la classe mre possde plusieurs constructeurs

Il faut lui spcifier celui que lon veut utiliser


Le mot cl super

- p. 174

Le mot cl super

super peut tre vu comme le complmentaire de this

Il va servir appeler un constructeur de la classe mre

Il va galement servir a appeler des fonctions de la classe mre

Modifions le code des classes

Vehicule et compagnie

Quart Suprieur droit

- p. 175

Un petit exemple pour rpter

class VehTerrestre extends Vehicule {


Vehicule(int n) { System.out.println(Veh 1 arguments) ; }
}

class Moto extends VehTerrestre {


Moto() {
super(2) ;
}
}

- p. 176

Un peu de thorie : Les rgles

Si la premire instruction dun constructeur nest ni this(..) ni


super(...) alors java insre, comme premire instruction, un appel
implicite super()

Si la premire instruction dun constructeur est super(...), alors java


appelle le constructeur choisi et execute, au retour, les instructions du
constructeur choisi.

Si la premire instruction est this, alors java invoque le constructeur


slectionn et lappel au constructeur de la classe mre est fait dans le
constructeur surcharg (this).

et ainsi de suite : La toute premire instruction excute est donc le


constructeur de la classe Object

- p. 177

Exemple

class VehTerrestre {
VehTerrestre() { System.out.println(Ter 0 arguments) ; }
VehTerrestre(int n) { System.out.println(Ter 1 arguments) ; }
}
class Moto extends VehTerrestre {
Moto() {
super(2) ;
System.out.println(Moto 0 arguments) ;
}
Moto(String nom) {
System.out.println(Moto 1 arguments) ;
}
Moto(String nom,int n) {
this(nom) ;
System.out.println(Moto 2 arguments) ;
}
}
- p. 178

Autre utilisation de super

Thoriquement la redfinition cache la fonction de la classe mre

Et la redondance alors ! !

super peut tre utilis pour appeler une fonction de la classe mre

class Animal {
void manger(Nourriture f) { ... }
}
class Herbivore extends Animal {
void manger(Nourriture f) {
/*Verification si f est vert !*/
if(...)
super.mange(f)
}
}
Sans cela, redondance de code ! ! !
- p. 179

Limites

On ne peut pas remonter plus haut que la classe mre pour appeler une
fonction redfinie

pas de (classeAnctre.m())

pas de super.super.m()

- p. 180

Hritage et Tanstypage

- p. 181

Le transtypage implicite

Lors dune affectation, une opration de upcasting implicite


peut avoir lieu.

Exemple
double x = 15 ;

La valeur 15 est transforme automatiquement en valeur


double 15.0 avant dtre affecte x

- p. 182

Le transtypage explicite

Lors de certaines oprations, il est parfois ncessaire dutiliser explicitement


une opration de transtypage

Exemple
int x = 3, y = 2 ;
double z = x/y ; /* z = 1.0 */

Pour que z est la valeur 1.5, il faut faire


double z = (double)x/y ;

- p. 183

Et pour les classes

Il est possible deffectuer des oprations de transtypage de classes

Une variable rfrence dclare dune certaine classe peut parfois contenir
un lien vers un objet dune classe diffrente

la syntaxe est la mme que pour les types primitifs

on peut faire du transtypage sur les classes uniquement si lune est anctre
de lautre et vice versa.

- p. 184

Upcasting

Cette opration consiste considrer une rfrence comme tant plus


gnrale que ce quelle est

Elle peut tre fait de faon implicite

Les champs et les mthodes dune classe sont en effet valides pour la
classe drive.

Vehicule v = new Moto(Fazer 600) est un upcasting implicite

Vehicule v = (Vehicule) new Moto(Fazer 600) est un upcasting explicite


quivalent

- p. 185

DownCasting

Cette opration consiste considrer une rfrence comme tant moins


gnrale que ce quelle semble tre

Ncessairement explicite

Vehicule d = new Avion(Airbus A300) ;

d.decoller() ; /* Erreur */

((Avion)d).decoller() ; /* OK */

- p. 186

Visibilit

Object o = new Avion();

String toString()
...

- p. 187

Visibilit

Object o = new Avion();


Vehicule v = (Vehicule) o;

String toString()
...

void demarrer()
...

- p. 187

Visibilit

Object o = new Avion();


Vehicule v = (Vehicule) o;
Avion a = (Avion)o;
o

String toString()
...

void demarrer()
...
void decoller()

- p. 187

Intrt

Sans upcasting, pas besoin de downcasting

Mais, le upcasting est fondamental pour utiliser le polymorphisme

Il est toujours possible de tester la classe relle dune rfrence avec le


mot-cl instanceof
(reference instanceof Classe) retourne true si la rfrence est une instance
de la classe

- p. 188

Casting et mthode equals

Revenons la fonction equals

Maintenant tout (jespre) sclaircie..


public class Date {
int j,m,a ;
public boolean equals(Object o) {
if( ! o instanceof Date) return false ;
return (((Date)o).j==j) && (((Date)o).m==m)
&& (((Date)o).a==a) ;
}
}

Date d1 = new Date(12,12,2002) ;


Date d2 = new Date(3,3,2002) ;
String s = bonjour ;
d1.equals(d2) ;
d1.equals(d1) ;
d1.equals(s) ;
- p. 189

Les classes abstraites

- p. 190

Introduction

Plus on remonte dans la hirarchie des classes, plus celles ci deviennent


gnrales et abstraites
A un moment donn, la classe anctre devient tellement gnrale quon la
considre surtout comme un moule pour des classes drives et non plus
comme une vritable classe dote dinstances
Pourquoi ne pas spcifier ce statut de moule (dabstraction)

Les classes et les mthodes abstraites

- p. 191

Mthodes abstraites

Un mthode abstraite spcifie uniquement le prototype dune fonction.

le corps de la mthode nest pas fourni

Modle pour crer des classes dapplications spcifiques

Le mot-cl abstract

abstract void function(...)

- p. 192

Mthodes abstraites

Toute mthode abstraite doit tre implment dans au moins une classe
descendante

Une mthode static ne peut pas tre abstraite

- p. 193

Classes abstraites

Toute classe comportant au moins une mthode abstraite doit tre dclare
abstraite

Toute classe ne comportant aucune mthode abstraite peut tre dclare


abstraite

Il nest pas possible de crer des instances dune classe abstraite

- p. 194

But

Les classes abstraites sont utilises pour

Structurer lensemble des classes

Faciliter la conception des classes en amliorant leur clart

Crer des modles rigoureux pour crer des applications spcifiques

Factoriser le code

Permettre le polymorphisme

- p. 195

Exemple

Notre classe Vhicule est le type mme de classe que lon doit dclarer
abstraite
public abstract class Vehicule {
private int maxVitesse ;
private int poinds ;
public abstract void dmarrer() ;
public abstract void arreter() ;
public void tourner() { /* Non abstraite : corps ...*/ }
}
On ne peut pas crer dinstances de la classe Vehicule

- p. 196

Exemple 2

De mme, VehTerrestre doit aussi tre dclare abstraite (quest ce quun


vhicule terrestre)

public abstract class VehTerrestre {


private int nbRoues ;
}

- p. 197

Exemple 3

Et maintenant que lon cre la classe Voiture, on doit implmenter les


mthodes abstraites

public class Voiture extends VehTerrestre {


public void demarrer() { /* Corps */}
public void arreter() { /* Corps */}
public void tourner() { /* Corps si redfinition */}
}

- p. 198

Remarque

Une classe abstraite ne contient pas ncessairement que des mthodes


abstraites

La classe java.io.InputStream possde une seule mthode abstraite


appele read().

Le reste de la classe java.io.InputStream fournit des fonctionnalits


bas sur la mthode read (comme les fonctions read surcharges)

Une classe fille de java.io.InputStream (comme la classe


java.io.FileInputStream hrite de ces mthodes non abstraites
bases sur la mthode read quelle implmente

- p. 199

Le mot cl final

Il permet de rendre final une classe, un champ...

Variable finale
Les variables finales ne peuvent pas tre modifies : ce sont des
constantes. Souvent utilises avec static
static final double PI = 3.14
la valeur d une variable finale ne peut pas tre change aprs initialisation
final int i = (int)(Math.random()) ;
final int j = i/2 ;

Rfrence finale

Ne peut changer de rfrence dobjet

Lobjet peut tre modifi

- p. 200

Le mot cl final II ... Le retour

Mthode finale

Une mthode finale ne peut pas tre redfinie

Classe finale

Une classe dclare final ne peut pas tre drivee.


final class toto ...
class titi extend toto /* IMPOSSIBLE */

Toutes les mthodes d une classe final sont implicitement final

String et Vector sont des classes finales

- p. 201

Le Polymorphisme

- p. 202

Introduction

Le polymorphisme est la capacit quoffre le langage excuter une


mthode en fonction de la classe de lobjet en question et non en fonction du
type de la rfrence

Evite la redondance de code

Permet lextension des fonctionnalits sans toucher au code existant

- p. 203

Introduction 2

La notion de polymorphisme est assez difficile comprendre

Elle est simple mettre en oeuvre

Elle est une des caractristiques essentielles dun langage orient objet

- p. 204

La lutte des classes

Nous souhaitons crire le code permettant de grer les employs dune


entreprise

Les employs peuvent tre des ouvriers, des cadres, le patron...

Lusine possde la liste des employs et doit les faire travailler

- p. 205

Premire mthode

Voir Employe1 et Usine1

Le code correspondant aux diffrents employs est mlang :-(

Le code est lourd :-(

Lajout dune catgorie demploy est particulirement lourd :-(


TRES MAUVAISE SOLUTION

- p. 206

Deuxime mthode

Voir Usine2 et compagnie

Le code correspondant aux diffrents employs est spar :-)

Le code est lourd :-(

Les employs doivent tre considr comme des Object

Il est ncessaire de tester le type dappartenance :-(

Lajout dune catgorie demploy est toujours lourd :-(


MAUVAISE SOLUTION

- p. 207

Troisime tentative

Voir Usine3 et compagnie

Le code correspondant aux diffrents employs est spar :-)

Le code est toujours lourd, mais ca va mieux : Hritage ! !

Il est toujours ncessaire de tester le type dappartenance :-(

Lajout dune catgorie demploy est toujours lourd :-(


MAUVAISE SOLUTION

- p. 208

Quatrime tentative

Voir Usine4

Le code correspondant aux diffrents employs est spar :-)

Le code est simple :-)

Lajout dune catgorie demploy est simple :-)

Il est possible de construire un Employe :-(


BONNE SOLUTION

- p. 209

Cinquime tentative

Voir Usine5

Le code correspondant aux diffrents employs est spar :-)

Le code est simple :-)

Lajout dune catgorie demploy est simple :-)

Il est impossible de construire un Employe :-)

Ouvrier ne peut pas hriter dautres classes (pas dhritage multiple)


EXCELLENTE SOLUTION

- p. 210

Retour au polymorphisme

Le polymorphisme est le fait quune mme criture puisse correspondre


diffrents appels de mthodes

Ce concept est une notion fondamentale de la programmation objet,


indispensable pour une utilisation efficace de lhritage

- p. 211

Liaison tardive

Si on regarde bien le code de la version 5, on ne sait pas la compilation


quelle fonction va tre excut

Le polymorphisme est obtenu grce au mcanisme de liaison dynamique


(ou retarde)

Lorsquun objet reoit un message, la mthode qui est excute est


dtermine :

au moment de lexcution (et non celui de la compilation)

par la classe de cet objet (et non celle de la variable rfrence dsignant
cet objet)

- p. 212

Liaison tardive II ... Le retour

Soit lappel suivant : o.m() ;

Si la classe C de lobjet rfrenc par o (et non la classe de la variable


rfrence o) contient la dfinition de la mthode m() alors celle-ci est
excute,

sinon, la mthode m() est recherche dans la classe mre de C, puis, si


elle ne sy trouve pas, dans la classe mre de cette classe mre, et ainsi
de suite ...

Argl : Ce mcanisme peut ralentir sensiblement lexcution des programmes

- p. 213

Intrt du polymorphisme

Code plus clair : Plus de switch

Lextension est facilite : On peut rajouter des sous classes sans toucher au
code existant

Hritage et polymorphisme sont indissociables

- p. 214

Une dernire Version

Lusine peut croitre


On va stocker les employs dans une liste chane (LinkedList)

- p. 215

Un autre exemple

Je cre une instance de Object, je laffiche avec toString

Je cre un Ouvrier, je le caste vers Object, je laffiche !

- p. 216

Interfaces

- p. 217

Introduction

Pousse le concept dabstraction un cran plus loin

Une interface reprsente en quelques sorte une classe purement abstraite

Elle dclare : "Voil quoi ressembleront toutes les classes qui


implmenteront mon interface"

Une interface peut donc tre utilise pour tablir des protocoles entre les
classes
Une interface ne peut contenir que
des mthodes qui seront toujours par dfaut : public abstract

des champs qui seront toujours par dfaut public static final

- p. 218

Exemple

interface Figure {
public abstract void dessiner() ;
public abstract void rotation(double angle) ;
}

- p. 219

Exemple

interface ConstantesPhysiques {
public static final double AVOGADRO = 6.02214e23 ;
public static final double MASSE_ELECTRON = 9.109e-31 ;
}

- p. 220

Implmenter une Interface

Le mot cl implements permet de rendre une classe conforme une


interface particulire.

Il dit en gros : "Linterface spcifie ce quoi ressemble la classe, maintenant


on va spcifier comment cela fonctionne"

class Rectangle implements Figure {


double x1,y1,x2,y2 ;
void dessiner() { /* Corps de la mthode */
void rotation(double angle) { /* Corps de la mthode */
}

Dans la classe Rectangle, on doit trouver le corps de toutes les mthodes de


linterface Figure, sauf si Rectangle est dclare abstract

- p. 221

Implmentation et Hritage

Bien entendu, une classe peut hriter dune autre classe et en mme temps
implmenter une interface
class carre extends Rectangle {
/* ici, les mthodes dessiner et rotation existent, elles peuvent tre redfinies*/
}

class B extends A implements C {


}

- p. 222

Remarques

Il est possible dimplmenter plusieurs interfaces


class B implements I1,I2,I3...

Il est possible dimplmenter plusieurs interfaces et de driver une classe


class C extends A implements I1,I2,I3...

Si A implemente I4 alors C implmente I4 aussi et na pas besoin de le


spcifier

- p. 223

Interface et Transtypage

Il suffit de penser quune interface est une classe particulire (et abstraite)
pour grer le transtypage

Figure f = new Rectangle() ; /* Upcasting */


Rectangle r = (Rectangle)f ; /* Downcasting */

- p. 224

Exemple dutilisation

On veut crer un algorithme de tri qui puisse tre utilis par tout type dobjet

Un algorithme de tri se compose

dune partie invariante : le mcanisme de tri

dune partie variable : la comparaison de deux lments

- p. 225

Exemple dutilisation 2

La partie variable va tre code sous la forme dune interface dclarant une
mthode de comparaison dobjet

interface Comparable {
int compareTo(Object o) ;
}

obj1.compareTo(obj2)

retourne
0 si mme valeur

-1 si obj1 est plus petit que obj2

+1 si obj1 est plus grand que obj2

- p. 226

Exemple dutilisation 3

La partie invariante va tre une classe offrant diverses mthodes de tri


(bulle, quicksort...)

public class Sort {


public static void triBulles(Comparable[] t) {
for(int l = t.length-1 ;l>0 ;l) {
for(int i = 0 ;i<l ;i++) {
if(t[i].compareTo(t[i+1])>0) {
Comparable tmp = t[i] ;
t[i] = t[i+1] ;
t[i+1] = tmp ;
}
}
}
}

- p. 227

Exemple dutilisation 4

Maintenant, on va utiliser cette classe et cette interface

class Date implements Comparable {


private int j,m,a ;
...
public int compareTo(Object o) {
Date d = (Date)(o) ; /* donwcasting */
if(geta()>d.geta()) return 1 ;
if(geta()<d.geta()) return -1 ;
if(getm()>d.getm()) return 1 ;
if(getm()<d.getm()) return -1 ;
if(getj()>d.getj()) return 1 ;
if(getj()<d.getj()) return -1 ;
return 0 ;
}
}
- p. 228

Exemple dutilisation 5

Maintenant, on peut trier un tabelau de date

Date d[] = new date[15] ;


/* Remplir le tableau */
Sort.triBulle(d) ;

plus besoin de rcrire des algos de tris

Linterface Comparable existe dans lAPI de java

La mthode triBulle existe dans lapi de java : voir classe Arrays et les
diverses mthodes quelle contient(sort....)

Il est important de jeter un (GROS) coup doeil a lapi de java

- p. 229

Interface ou classe abstraite ?

Une interface reprsente un ensemble de fonctionnalits quune classe


implmentant celle ci doit fournir

Une classe abstraite reprsente la description dun objet quil est possible de
crer

Une classe abstraite permet de spcifier certaines fonctionnalits.

Les interfaces ne peuvent pas contenir des variables dinstances


(uniquement des variables de classes)

Il est prfrable dutiliser les interfaces que les classes abstraites.

Cependant, les classes abstraites sont quelques fois utiles ! !

- p. 230

Interface et constantes

On vitera dutiliser les interfaces pour coder les types

interface ConstantesPhysiques {
public static final double AVOGADRO = 6.02214e23 ;
public static final double MASSE_ELECTRON = 9.109e-31 ;
}

On prfrera

public class ConstantesPhysiques {


public static final double AVOGADRO = 6.02214e23 ;
public static final double MASSE_ELECTRON = 9.109e-31 ;
private ConstantesPhysiques() ; /* Empche toute intantiation */
}

- p. 231

Stockage des objets

- p. 232

Introduction

Cest un programme relativement simple que celui qui ne manipule que des
objets dont le nombre et la dure de vie sont connues lavance

Les collections : un concept fondamental de la programmation

On va voir :

Les tableaux (dj vu)

La classe Arrays

Les collections

- p. 233

Classe Arrays

Question : Doit on crire un algorithme de tri pour chaque type de tableau


que lon manipule ? ?

La classe Arrays contient un ensemble de mthodes statiques ralisant des


oprations utiles sur les tableaux

Remplissage

comparaison

tri

recherche

Pratique, mais montre vite ses limites


- p. 234

Remplissage de tableaux

La mthode fill autorise le remplissage dun tableau par le mme lment

4 types de signatures diffrents pour cette mthode

static void fill(<TypePrimitif>[] a, int fromIndex,


int toIndex, <TypePrimitif> val)
static void fill(Object[] a, int fromIndex, int
toIndex, Object val)
static void fill(<TypePrimitif>[] a, <TypePrimitif>
val)
static void fill(Object[] a, Object val)

- p. 235

Comparaison de 2 tableaux

La mthode statique equals de la classe Arrays compare les deux tableaux


pass en paramtres

Cette mthode possde diverses signatures suivant que le tableau est bas
sur des types primitifs ou sur des objets

Les deux tableaux seron identiques si

Il ont la mme taille

Les lements sont gaux (au sens de la mthode equals de leur classe)

- p. 236

Comparaison de 2 tableaux

Tableau bas sur des types primitifs

int t1[] = {1,2,3,4,5}


int t2[] = {1,2,3,4,5}
System.out.println(Arrays.equals(t1,t2)) ;
System.out.println(t1==t2) ;
t1[0] = 3 ;
System.out.println(Arrays.equals(t1,t2)) ;

True
False
False

- p. 237

Comparaison de 2 tableaux

Tableau bas sur des objets

Point a1 = new Point(1,2) ;


Point a2 = new Point(1,2) ;
Point t1[] = new Point[4] ;
Point t2[] = new Point[4] ;
Arrays.fill(t1,a1) ;
Arrays.fill(t2,a2) ;
System.out.println(Arrays.equals(t1,t2)) ;

Dpend de la fonction equals de la mthode Point

- p. 238

Trier un tableau

La mthode sort (proposant diverses signatures) permet de trier des


tableaux

Si le tableau est bas sur des types primitifs alors le tri est bas sur lordre
naturel

Si le tableau est constitu dobjets, alors ceux ci doivent implmenter


linterface Comparable

interface Comparable {
int compareTo(Object o) ;
}

- p. 239

Exemple

class Date implements Comparable {


private int j,m,a ;
public int compareTo(Object o) {
Date d = (Date)(o) ; /* donwcasting */
if(geta()>d.geta()) return 1 ;
if(geta()<d.geta()) return -1 ;
if(getm()>d.getm()) return 1 ;
if(getm()<d.getm()) return -1 ;
if(getj()>d.getj()) return 1 ;
if(getj()<d.getj()) return -1 ;
return 0 ;
}
}

Arrays.sort(d1) ;

- p. 240

Rechercher dans un tableau tri

La mthode binarySearch permet de rechercher des items sur un tableau


tri

Retourne lindex de litem si celui-ci existe dans le tableau, -1 sinon

- p. 241

Copie de tableau

La classe System possde la mthode arraycopy qui permet la copie de


tableaux bien plus rapidement que par une boucle for

static void
arraycopy(source,debut,destination,debut,longueur)
On a un tableau noms et on veut doubler sa taille

String tmp[] = new String[noms.length * 2] ;


System.arraycopy(noms,0,tmp,0,noms.length) ;
noms = tmp ;

- p. 242

Les conteneurs

- p. 243

Conteneurs : Introduction

Question : Doit on implmenter une file chaque fois que lon en a besoin ?

Une file de Points, une File de Date restent des files

Ensemble dinterfaces et de classes permettant de travailler sur

des ensembles

des listes chanes

de tables de hachage

Le mot cl : Rutilisation

- p. 244

Conteneurs et interfaces

Les conteneurs sont bass sur plusieurs interfaces

Linterface Collection est la mre des interfaces associs aux listes.

Linterface Map est la mre des interfaces associs aux tables de hachage
Map

Collection

Set

List

SortedMap

SortedSet

- p. 245

Interface Collection

Elle ne prcise pas si les objets peuvent apparaitre plusieurs fois

Elle ne prcise pas si les lements sont insrs suivant un ordre

Elle contient les fonctions suivantes


boolean add(Object)

Ajoute un objet. Renvoie true si lajout a t possible

void clear()

Supprime tous les lments du conteneur

void contains(Object)

renvoie true si lobjet appartient au conteneur

boolean isEmpty()

renvoie true si le conteneur est vide

Iterator iterator()

Renvoie un itrator, utilis pour parcourir les lments

boolean remove(Object)

supprime lobjet de la collection. Renvoie true si ok

int size()

renvoie le nombre dlments de la collection

Object[] toArray()

renvoie un tableau contenant tous les lments

- p. 246

Interface Set

Reprsente une collection dans laquelle la duplication dlements est


interdite

Elle ne possde pas dautres mthodes que celles hrits de Collection

Elle rajoute une rgle interdisant la duplication dobjets. add renvoie false si
on essaie de mettre deux fois le mme objet

- p. 247

Interface SortedSet

Interface associ aux ensembles (duplication dlments interdites)

Les lments de la collection sont maintenus dans lordre.

Il faut donc implmenter linterface Comparable sur les objets de la


collection

- p. 248

Interface List

Reprsente une collection dont les lments sont rangs dans un ordre
particulier

La mthode add(Object o) ajoute lobjet o en fin de liste

Plusieurs fonctions sont ajouts :

public void add(int index,Object o) ajoute lobjet un


certain endroit de la liste

public void remove(int index) supprime lobjet situ en ieme


position

public voi get(index i) retourne lobjet de la liste situ en ieme


position

- p. 249

Interface Map

Permet de grer des collections de paires cl/valeur

Elle stocke un lement de type objet et lassocie une cl (de type Object)
Les oprations de bases sont les suivantes

public Object put(Object cle,Object val) Ajoute la paire

public Object get(Object cle) Rcupre la valeur associ la cl

public int size() Nombre de paires Cl/valeurs

public Set keySet() renvoie une Set contenant toutes les cls de la carte

public Collection() renvoie une collection contenant toutes les valeurs de


la carte

- p. 250

Interface SortedMap

Cette interface entretient les paires cl/valeurs en ordre tri sur les cls

Les objets associs au cls doivent implmenter linterface Comparable

Certaines mthodes sont ajouts.

- p. 251

Implmentations

Ces diffrentes interfaces ont t implment dans lAPI


Interface

Implementation

Set

HashSet

SortedSet

TreeSet

List

ArrayList, LinkedList,Vector

Map

HashMap,HashTable

SortedMap

TreeMap

Collection

HashSet

Set

TreeSet

SortedSet

List

ArrayList

LinkedList

Map

HashMap

SortedMap

TreeMap

HashTable

Vector

- p. 252

Implmentations ... 2

ArrayList offre de bonnes performances lors dajouts frquents en fin de liste

LinkedList offre de bonnes performances lors de nombreux ajouts et


suppressions en milieu de listes

HashMap et Vector existent depuis le SDK1.0 : on les garde

- p. 253

Les itrateurs

Les itrateurs Iterator servent parcourir les collections

Comment faire ?

Rcuperer un itrateur : mthode iterator de Collection

utiliser les mthodes next() et hasNext() de Iterator

public void printElements(List listeDate) {


Iterator it = c.iterator() ;
while(it.hasNext()) {
Date d = (Date)it.next() ;
System.out.println(d) ;
}
}

- p. 254

Et maintenant

Depuis Java5, la gestion des listes a t amliore grae la gnricit

On reviendra sur ce concept plus tard

On peut crer des listes ne contenant que des Dates :

public void printElements(List<Date> listeDate) {


Iterator<Date> it = c.iterator() ;
while(it.hasNext()) {
Date d = it.next() ;
System.out.println(d) ;
}
}

- p. 255

Parcours de listes...

Et en plus on le parcours simplifi depuis java 5.


public void printElements(List<Date> listeDate) {
for(Date d : listeDate) {
System.out.println(d) ;
}
}
Ca marche aussi pour les tableaux

- p. 256

Petit Problme

Lorsque lon insre des objets dans des collections on les transtype vers un
type plus gnral (Object)
Lorsque lon voudra rcuprer lobjet de la collection il faudra surement
prvoir un cast explicite pour rcuperer le vrai type de lobjet

- p. 257

Petit problme... 2

On ne peut pas mettre directement dans un conteneur des types primitifs


(entier, double...)
Il faut les empaquets dans les classes associs (Integer, Double...)
Trs dsagrable
Un exemple
La nouvelle version de java 5.0 permet de stocker des entiers.... :-)

- p. 258

Les exceptions

- p. 259

Introduction

Linstant idal pour dtecter une erreur est la compilation

Tout ne peut pas tre rgl cette tape

Les problmes restants doivent tre grs lexcution avec un certain


formalisme

permettre linitiateur de lerreur de passer une information suffisante un


rcepteur qui va savoir comment traiter proprement cette anomalie.

- p. 260

Origine des erreurs

Les erreurs dentres sorties


Fautes de saisies de lutilisateur
Fichier corrompu / inexistant

Les erreurs de matriels


Imprimante dconnecte
Page web temporairement inaccessible

Les contraintes physiques


disque dur satur
Mmoire insuffisante

Les erreurs de programmation


index de tableau
emploi dune rfrence nulle

- p. 261

Traitement des erreurs

En prsence dune erreur, un programme peut avoir un comportement

Idal : Revenir un tat dfini et poursuivre lexcution

Honnte : Prvenir lutilisateur, sortir correctement aprs une sauvegarde

lamentable : Ecran bleu + erreur ladresse 0x7743 ! !

- p. 262

Traitement des erreurs en C

Convention de programmation : un programme retourne un code qui permet


de connatre son comportement durant lexcution

Est on sr que tout le monde programme de cette faon : NON

Les programmes C ne sont pas les plus srs du monde informatique

- p. 263

Traitement des erreurs en Java/C++

Gestion dexceptions
Si un problme survient, une exception est leve,
une exception est un objet spcialement cr pour grer les erreurs
Toute exception peut/doit tre leve
Les comportements anormaux sont grs avec les exceptions
il est important de distinguer une condition exceptionnelle dun problme
normal
Avec une condition exceptionnelle vous ne pouvez pas continuer
lexcution car vous navez pas suffisamment dinformations pour la traiter
dans le contexte courant

Le code de gestion des exceptions est part

Les exceptions sont des classes de Java

Les programmes Java sont assez srs

- p. 264

Les exceptions

Certaines mthodes peuvent lancer des exceptions

Lorsquon utilise une telle mthode , on peut

Attraper les exceptions leves

Ignorer les exceptions leves et les relancer

- p. 265

Exemple

Dans la classe InputStream (buffer dentre) se trouve la mthode read


dfinie comme suit :
public int read() throws IOException

ainsi toute instance de InputStream peut ventuellement lancer une


IOException

Toute fonction utilisant cette mthode la possibilit de lever lexception


IOException

- p. 266

Attraper une exception

Une mthode qui utilise une mthode levant une exception peut attraper
celle ci

Un bloc try{ } dlimite le code surveiller

Au moins un bloc catch{ } suit : Il gre les exceptions attrapes

Chaque bloc catch permet de rcuprer la main pour traiter un type


dexception

Ils sont considrs dans lordre jusqu ce que lexception leve


corresponde au type ou un sous type de celui indiqu en argument

un bloc finally{ } apparat ventuellement

- p. 267

Exemple

int lireAscii() {
int x = 0 ;
try { x=System.in.read() ; }
catch(IOException e) {
System.out.println("Erreur : " + e) ;
}
System.out.println("toto" + x) ;
return x ;
}

En cas derreur
Erreur : java.io.IOException : ...
toto 0
Comportement normal
toto ?
- p. 268

Exemple

try {
readFromFile("nomFile") ;
...
}
catch(FileNotFoundException) {
/* Gestion du cas : fichier introuvable */
}
catch(IOException) {
/* Gestion du cas : erreur de lecture */
}
catch(Exception) {
/* Gestion du cas : Toute autre erreur */
}

- p. 269

Exemple

Scanner sc = new Scanner(System.in) ;


int nb = 0 ; try {
nb = sc.nextInt() ;
} catch(InputMismatchException e) {
S.o.p(un entier ! ! !) ;
}

- p. 270

Laisser passer une exception

Dans certains cas, il est intressant de laisser passer lexception

Il faut alors ajouter len-tte le type de lexception devant tre relance


avec le mot-cl throws

lerreur remonte alors vers la mthode appelante qui peut elle-mme


lattraper ou la laisser remonter

Si tout le monde laisse passer lexception, y compris la mthode main, alors


le programme sarrte

- p. 271

Exemple

int lireAscii() throws IOException {


int x = System.in.read() ;
return x ;
}

- p. 272

et finally

Le bloc finally { } contient un traitement excut systmatiquement

que le bloc try est lev ou pas lexception

que lexception est t attrape ou non

utilis pour librer certaines ressources

- p. 273

Mcanisme de traitement

- p. 274

Exception lev en dehors du bloc try

1. La mthode retourne immdiatement ; lexception remonte vers la mthode


appelante
2. La main est donne la mthode appelante
3. L exception peut alors ventuellement tre attrape par cette mthode
appelante ou par une des mthodes actuellement dans la pile d excution

- p. 275

Exception leve dans un bloc try

1. Si une des instructions du bloc try provoque une exception, les instructions
suivantes du bloc try ne sont pas excutes et,

si au moins une des clauses catch correspond au type de l exception,

(a) la premire clause catch approprie est excute


(b) lexcution se poursuit juste aprs le bloc trycatch
sinon
(a) la mthode retourne immdiatement
(b) lexception remonte vers la mthode appelante

- p. 276

Pas dexception gnre dans le bloc try

Dans les cas o l excution des instructions de la clause try ne provoque pas
d erreur/exception,
1. le droulement du bloc de la clause try se droule comme s il n y avait
pas de bloc trycatch
2. le programme se poursuit aprs le bloc trycatch

- p. 277

Exemples de traitement

Fixer le problme et ressayer le traitement qui a provoqu le passage au


bloc catch

Faire un traitement alternatif

Retourner (return) une valeur particulire

Sortir de lapplication avec System.exit()

Faire un traitement partiel du problme et relancer (throw) la mme


exception (ou une autre exception)

- p. 278

Lancer une exception

On lance une exception pour signaler une situation anormale

Dans len-tte dune mthode lanant une exception se trouve le mot-cl


throws puis la liste des exceptions pouvant tre lances

Dans le corps dune mthode lanant une exception se trouvent une ou


plusieurs instruction throw permettant de lancer des exceptions

- p. 279

Exemple

int lireDenominateur() throws ArithmeticException {


int x = 12 ;
x = Mediator.readInt() ;
if(x==0) throw new ArithmeticException() ;
System.out.println("x = " + x) ;
return x ;
}

Si x = 0
naffiche rien
Si x6= 0
x =??

- p. 280

Hirarchie des exceptions

Les classes lies aux erreurs/exceptions sont des classes places dans l
arborescence d hritage de la classe Throwable

Le JDK fournit un certain nombre de telles classes

Le programmeur peut en ajouter de nouvelles

- p. 281

Arbre dhritage des exceptions

Throwable

Exception
Error

RunTimeExcepion

Paquet JDK

Excptions Controles

Dfinies par le
programmeur

- p. 282

Arbre dhritage des exceptions

Throwable

Exception
Error

RunTimeExcepion

Paquet JDK

Excptions Controles

Dfinies par le
programmeur

Les erreurs graves

- p. 282

Arbre dhritage des exceptions

Throwable

Exception
Error

RunTimeExcepion

Excptions Controles

Paquet JDK

Les erreurs graves

Les exceptions non contrles par le compilo

Dfinies par le
programmeur

- p. 282

Arbre dhritage des exceptions

Throwable

Exception
Error

RunTimeExcepion

Excptions Controles

Paquet JDK

Les erreurs graves

Les exceptions non contrles par le compilo

Les exceptions contrles par le compilo

Dfinies par le
programmeur

- p. 282

Classe Error

Une exception Error est leve si

une erreur interne se produit

un manque de ressources (mmoire ...) apparat

ne doit pas tre attrape

Assez rare

- p. 283

Types derreurs
ClassCircularityError

ClassFormatError

Object

LinkageError

ExecptionInIniatilizerError

AbstractMethodError

IncompatibleClassChangeError

IllegalAccessError

NoClassDefFoundError

InstantiationError

Throwable
UnsatisfiedLinkError

NoSuchFieldError

VerifyError

NoSuchMethodError

ThreadDeath
Error

VirtualMachineError

InternalError

OutOfMemoryError

StackOverflowError

UnknownError

- p. 284

Les exceptions non controls

issues de la classe RunTimeException : dfinies dans SDK

Peuvent tre lances par la JVM

Peuvent tre attrapes, ne doivent pas tre signales

exemple : ArrayIndexOutOfBoundsException, NullPointerExecption...

Heureusement, car sinon le code java serait rempli de try et catch et


serait extrmement lent...

- p. 285

Les exceptions controls

Hritent de la classe Exception, mais pas de RunTimeExecption

Le compilateur vrifie que les mthodes les utilisent correctement (les


attrapent ou les relancent)

Toute mthode qui peut lancer une telle exception doit le dclarer
void lance(..) throws TotoException

Exemple : ClassNotFoundException, SQLExecption

- p. 286

Types dexceptions

ArithmeticExecption
Object
ClassNotFoundExecption

ArrayStoreExecption

CloneNotSupportedExecption

ClassCastExecption

Throwable

Execption
IllegalThreadStateExecption

IllegalAccessExecption

IllegalArgumentExecption
NumberFormatExecption

InstantiationExecption

IllegalMonitorStateExecption

InteruptedExecption

IllegalStateExecption

NoSuchFieldExecption

IndexOutOfBoundExecption

ArrayIndexOutOfBoundExecption

StringIndexOutOfBoundExecption

NoSuchMethodExecption

RunTimeExecption

NegativeArraySizeExecption

NullPointerExecption

SecurityExecption
- p. 287

Crer des nouvelles exceptions

Intressant lorsque lon rencontre un problme qui ne correspond pas de


faon adquate lune des exceptions standards

Il suffit de crer une classe hritant de exception

On cre deux constructeurs


Un sans arguments

Un avec une chane de caractre comme argument qui contient un


message dtaill de lerreur

Cest tout

- p. 288

Exemple

class DivisionByZeroException extends ArithmeticException {


DivisionByZeroException() {
super(Division by 0) ;
}
DivisionByZeroException(String s) {
super(s) ;
}
}

Cest tout : DivisionByZeroException est cre, je peux la lancer avec throw

- p. 289

Exemple

int lireDenominateur() throws DivisionByZeroException {


int x = Mediator.readInt() ;
if(x==0) throw new DivisionByZeroException() ;
return x ;
}

- p. 290

Exceptions et performances

Si aucune exception nest leve, limpact sur les performances est


ngligeable

La leve d une exception peut au contraire avoir un impact non ngligeable


sur les performances

- p. 291

Conseils

Les exceptions doivent tre utilises dans des cas exceptionnels

Il existe de nombreuses exceptions, essayez de les utiliser avant den crer


des nouvelles

Elles ne doivent pas remplacer des tests simples tels que lappartenance
dun index dans les bornes dun tableau !

- p. 292

Exemple

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


System.out.println(a[i]) ;
}
try {
int i = 0 ;
while(true) {
System.out.println(a[i]) ;
i++ ;
}
catch(ArrayIndexOutOfBoundsException e) { }
1. Cest Horrible
2. Cest 20 fois plus lent lexcution

- p. 293

Exceptions et Constructeur

Aucune instance nest cre si lexception est leve dans un constructeur


Exemple..

- p. 294

Vous aimerez peut-être aussi