Vous êtes sur la page 1sur 166

Lesbasesdela

programmationoriente
objetavecJava
EtienneDuris

Bibliographieetsources

LescoursdeRmiForax
http://igm.univmlv.fr/~forax/
LecoursdeMariePierreBal
http://igm.univmlv.fr/~beal/
JavaetInternet
G.Roussel,E.Duris,N.BedonetR.Forax.Vuibert2002.
DocumentationsJavaOracle
http://docs.oracle.com/javase/
TheJavaLanguageSpecification,ThirdEdition:
http://java.sun.com/docs/books/jls/
TheJavaVirtualMachineSpecification,SecondEd:
http://java.sun.docs/books/jvms

2
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Ilexistediffrentsstylesdeprogrammation

Styleapplicatif

Fondsurl'valuationd'expressionsquinedpendentquedela
valeurdesarguments,etnondel'tatdelammoire

Onparleaussideprogrammationfonctionnelle

Prochedesnotationsmathmatiques,utilisebeaucouplarcursivit

Acceptedesarguments,produitunrsultat(pasd'effetdebord)

Ex:Lisp,Caml,ML,Haskel

Styleimpratif

Fondsurl'excutiond'instructionsquimodifientl'tatdela
mmoire

Utilisebeaucouplesitrationsetautresstructuresdecontrle

Lesstructuresdedonnessontfondamentales

Ex:Fortran,C,Pascal

3
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lestyleobjet

C'estunstyledeprogrammationol'onconsidrequedes
composantsautonomes(lesobjets)disposentderessourceset
demoyensd'interactionsentreeux.
Cesobjetsreprsententdesdonnesquisontmodlisespar
desclassesquidfinissentdestypes

Enplusdelamaniredontsontstructursleursobjets,les
classesdfinissentlesactionsqu'ilspeuventprendreencharge
etlamaniredontcesactionsaffectentleurtat

unpeucommetypedefstructenC

cesontdesmessagesoudesmthodes.

Javan'estpasleseullangageobjet

Simula,Smalltalk,C++,OCaml...

4
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesavantagesdelaprogrammationobjet

Lescaractristiquesdebasesprcdemmentdcritespeuvent
tremisesenoeuvredansunstyleimpratif,maisdes
fonctionnalitspropresaustyleobjetfavorisent:

laprogrammationmodulaire

l'abstraction

laspcialisation

L'objectifestdeproduireducode

faciledvelopper,maintenir,fairevoluer,

rutilisable,toutouenpartie,sansavoirbesoindeledupliquer

gnrique,etdontlesspcialisationssonttransparentes

5
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Programmationmodulaire

Laconceptionparclasses,reprsentantlafoislesdonnes,
lesactionsetlesresponsabilitsdesobjetsdecetteclasse,
permetdebiendistingueretsparerlesconcepts
Lefaitdedfinirdesinterfaces,
ausensmoyensetmodalits
decommunicationavecl'extrieur
permetdecacherlesdtails
d'implmentationetd'viter
lesdpendancestropfortes
Toutafavoriselarutilisabilitet
lacomposition/dlgation:
l'assemblagedescomposants
enrespectantleursresponsabilits
6
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

L'abstractionetlaspcialisation

L'abstractiondemandesparerladfinition(d'untype,
d'uneclasse,d'unemthode)del'implmentation

Permetd'identifierunmodlecommunplusieurscomposants
Cemodlecommunpourratrepartag
vialemcanismed'hritage

Laspcialisationtraite
descasparticuliers,
maiselledoitautant
quepossiblerester
transparente:

C'estpossiblegrce
ladrivation
7
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LelangageJava:

estnen1995chezSunMicrosystems

VersionactuelleJava8,actuellementOracle

estorientobjet

estfortementtyp

Lecompilateurvrifiequelesutilisationsdesvariablessont
compatiblesavecleurtype(notammentviaunsoustypagecorrect)
Lestypessontd'unepartfournisparlelangage,maisgalementpar
ladfinitiondesclasses

estcompil

Toutevariabledoittredclareavecuntype

Enbytecode,i.e.,codeintermdiaireindpendantdelamachine

estinterprt

LebytecodeestinterptparunemachinevirtuelleJava

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Premierexemple

DansunfichierdenomHelloWorld.java

Rgle:touteclassepubliquedoittredansunfichierquiale
mmenomquelaclasse
Rgle:toutcodedoittrel'intrieurd'uneclasse
public class HelloWorld {
/* Un style de commentaire
sur plusieurs lignes. */
public static void main(String[] args) {
// Un commentaire sur une seule ligne
System.out.println("Bonjour vous les IR1!");
}
}

adfinituneclasse,quiestuneunitdecompilation

Commeilyaunemthodemain,cetteclasseestexcutable

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Compilation,bytecodeetJVM

Compilationdulangagesource>excutiondubytecode

FichierHelloWorld.java
publicclassHelloWorld{
/*Unstyledecommentaire
surplusieurslignes.*/
publicstaticvoidmain(String[]args){
//Uncommentairesuruneseuleligne
System.out.println("BonjourvouslesIR1!");
}
}

javacHelloWorld.java
Compilation
(uneseulefois)

BonjourvouslesIR1!
Pile

Tas

Linux
JavaVirtualMachine
javaHelloWorld

FichierHelloWorld.class
Compiledfrom"HelloWorld.java"
publicclassHelloWorldextendsjava.lang.Object{
publicHelloWorld();
Code:
0:
aload_0
1:
invokespecial
#1;//Methodjava/lang/Object."<init>":()V
4:
return
publicstaticvoidmain(java.lang.String[]);
Code:
0:
getstatic #2;//Fieldjava/lang/System.out:Ljava/io/PrintStream;
3:
ldc
#3;//StringBonjourvouslesIR1!
5:
invokevirtual
#4;//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
8:
return
}

Interprtation/excution
(writeonce,runeverywhere)
BonjourvouslesIR1!
Pile

Tas

Windows
JavaVirtualMachine
javaHelloWorld

10

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lebytecode

LelangagesourceJavaestdfiniparlaJLS(JavaLanguage
Specification)diteparSunOracle

Lecodesourced'uneclassecontenuedansunfichierest
compilaveclacommandejavac

Danssasyntaxeetsasmantique

Celaproduituncodeintermdiaire,appelbytecode,quiestle
langagemachinedelamachinevirtuelleJava

Lebytecoded'uneclasseestdestintrechargparune
machinevirtuellequidoitl'excuteraveclacomandejava

Soitparinterprtation,soitparcompilationjustetemps
(justintimeouJIT)
L'argumentestlenomdelaclasse(sansl'extension.class)
11
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lamachinevirtuelle(JVM)

Sonrleestd'abstrairelecomportementd'unemachine

SoncomportementestdfiniparlaJVMSpecditparSun
Oracle

UneJVMestuneimplmentationdecettespec

Pourlerendrele+possibleindpendantdelaplateforme

Quipeuttreadapteuneplateformed'accueil(Windows,
Linux,Mac...)
QuipeuttredveloppeparSun(HotSpot:opensourceGPL
depuis2006)oupard'autres:IBM,Jikes,etc.

UneJVMtraduitlebytecodedanslelangagemachinedela
plateformed'accueil
12
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Java:unlangageetuneplateforme

DanslatechnologieJava,onadoncbesoin

Dulangagedeprogrammationetducompilateur

DelaJVMetdesAPIs(ApplicationProgrammingInterfaces)
regroupesdansuneplateforme:

Etpleindecommandesbienutiles:jar,javap,javadoc,etc

JavaSE(JavaPlatform,StandardEdition):JavaSE6pour
applicationsclassiques,desktop
JavaEE(JavaPlatform,EnterpriseEdition):JavaEE6pour
dvelopperetdployerdesapplicationsserveur,Webservices,etc.
JavaME(JavaPlatform,MicroEdition):J2MEpourlesapplications
embarques,PDA,tlphones,etc.

Sionveutjusteexcuter,ilsuffitduJRE(JavaRuntime
Execution)paroppositionauJDK(JavaDeveloppementKit)
13
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

JavaSE7PlateformataGlance
(http://docs.oracle.com/javase/7/docs/)

14
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LelangageJava

Lesvariables,lesoprateurs,lesexpressions,instructions,
blocs,contrledeflotsonttrsprochesdeceuxduC

Lesexceptionssontunenouveaut

Lestypesprimitifsontunetailleetunereprsentationnorme

S'yajoutentdesspcificitssyntaxiquesliesla
programmationobjet,auxclasses,l'hritage...
Unstyledenommage(trsfortement)conseill

Stylechameau(CamelCase)pourlesindentificateurs

Premiremajusculepourlesclasses(classHelloWorld)

Premireminusculepourlesvariables/champsetles
fonctions/mthodes(radius,getRadius())
Toutenmajusculepourlesconstantes(MAX_SIZE)

15

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Classesetobjets

UneclasseTotoreprsenteplusieurschoses:

Uneunitdecompilation

LadfinitiondutypeToto

IlpeutservirdclarerdesvariablescommeTotot;

Unmoulepourlacrationd'objetsdetypeToto

Lacompilationd'unprogrammequicontientuneclasseToto
produiraunfichierToto.class

Celancessiteengnralladfinitiond'unensembledechamps
(fields)dcrivantl'tatd'unobjetdecetypeetd'unensemblede
mthodesdfinissantsoncomportementousesfocntionnalits

ChaqueobjetdelaclasseToto

Disposedesonpropretat(lavaleurdeseschamps)

Rpondaummecomportement(vialesmthodesdelaclasse)

16

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Structured'uneclasse

Uneclasseestdfinieparsonnometsonpackage
d'appartenance(ex:java.lang.String)

Uneclassepeutcontenirtroissortesdemembres

Deschamps(fields)ouattributs

Desmthodes(methods)etconstructeurs

Desclassesinternes

Lesmembresstatiques(static)sontditsmembresdeclasse

Enl'absencededirective,lesclassessontdansunpackagedit
pardfaut(i.e.,pasdepackge).

Ilssontdfinissurlaclasseetnonsurlesobjets

Lesmembresnonstatiques(oud'instance)nepeuventexister
sansunobjet

17

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

public class Pixel {


public final static int ORIGIN = 0;
private int x;
private int y;
public Pixel(int x, int y) {
Constante
this.x = x;
this.y = y;
}
Champs
public void reset() {
x = ORIGIN;
y = ORIGIN;
Constructeur
}
public void printOnScreen() {
Mthodes
System.out.println("("+x+","+y+")");
}
d'instances
public static boolean same(Pixel p1, Pixel p2) {
return (p1.x==p2.x) && (p1.y==p2.y);
Mthode
}
declasse
public static void main(String[] args) {
Variableslocales
Pixel p0 = new Pixel(0,0);
Pixel p1 = new Pixel(1,3);
lamthode
p1.printOnScreen();
// (1,3)
mainet
System.out.println(same(p0,p1)); // false
objetsdela
p1.reset();
classePixel
System.out.println(same(p0,p1)); // true
18
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Exemple

Lesobjetssontmanipulsviades
rfrences(sortesd'adressesmmoire)
ClassePixel

Lorsquelamthode

constructeur

estappele,lecodedela
mthodedfinidansla
classecomme
public void reset() {
x = ORIGIN;
y = ORIGIN;
}

estexcutsurlapileavecles
rfrences#1laplacedep1
et#slaplacedeORIGIN
public void reset() {
#1.x = #s;
#1.y = #s;
}

mthodes
main

Pixelp1

#1

Pixelp2

#2

#1

@classPixel

x=1
y=3
#2

@classPixel

0
0

Chaqueobjetconnaitsaclasse

#s ORIGIN=0

p1.reset();

x=0

Cequiapoureffetde
mettrep1.xetp1.y0

y=0
19

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LanaturedesvariablesenJava

Lesvariableslocalescommeleschampsdesclassesetdes
objetsnepeuventtrequededeuxnatures
Detypeprimitif

Danscecas,ladclarationdelavariablerservelaplace
mmoirepourstockersavaleur(quidpenddesontype)
intentier;

longentierLong;

Detypeobjet,ourfrence

Danscecas,ladclarationdelavariablenefaitquerserverla
placed'unerfrence(unesortedepointeur)quipermettra
d'accderl'endroitenmmoireoesteffectivementstock
l'objetenluimme(vautnullsirfrenceinconnue)
Pixelp1;
p1=newPixel(1,3);

#1

#1

@classPixel

x=1

objet
20

y=3
rfrence EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lestypesprimitifs

Typesentierssigns(reprsentationencomplment2)

byte(octet)sur8bits:[128..127]

shortsur16bits[32768..32767]

intsur32bits[2147483648..2147483647](dfautpourentiers)

longsur64bits[9223372036854775808..9223372036854775807]

Typecaractrenonsign(unitsdecodeUTF16)

charsur16bits['\u0000'..'\uffff']

Typesvirguleflottante(reprsentationIEEE754)

floatsur32bits

doublesur64bits(dfautpourflottants)

Typeboolen: boolean(trueoufalse)

21

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Promotionentireetflottantsspciaux

Pourlaplupartdesoprations,lesvaleursentiressont
transformsendesint(promotionentire):

shorts=4;
s=s+s;//Typemismatch:cannotconvertinttoshort
s=(short)(s+s);//castncessaire

Lesdbordementsoucasd'erreurssontprvuspourles
flottants(InfinityetNotaNumber):

doubled=1e308;
System.out.println(d*10);//affiche:Infinity
d=0.0/0.0;
System.out.println(d);//affiche:NaN

22
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Attentionauxnombresvirguleflottante

Ilsnesontquedesapproximationdesvaleurs

Leurgalitausensdel'oprateur==n'aaucunsens
double d = 0.0; int nb = 0;
double expected = 1.0;
while (d != 1.0 /* && nb < 10 */) { // boucle infinie!!!
d += 0.1; nb++;
}
System.out.println("nb: " + nb + " d: " + d);
// Si on dcommente, affiche nb: 10 d: 0.9999999999999999

Ilfauttesterleurproximitmodulounepsilondonn
static final double EPSILON = 0.00001;
...
double d = 0.0;
double expected = 1.0;
while ( Math.abs(expected d) > EPSILON )
d += 0.1;
System.out.println(d);
// 0.9999999999999999

23

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Touslesautrestypessontobjetset
sontmanipulsviadesrfrences

soitdestypesdfinisdanslesAPIs

java.lang.Object,java.lang.String,java.util.Scanner,etc.

Stringchaine="toto";

DiffrentduC!

@classString

#2
...

Enplus,lesStringsontconstantes

#2

soitdestypescachs

#1

#1

Tableaudetypesprimitifsoud'autrestypesobjets

int[]tab={3,5,7,9};

#1

String[]args;

null

Pixel[]array=newPixel[2];

#2

Pixelp=newPixel(0,0);

#1

\n

@classint[]

length=4
#2

soitdestypesdfinisparl'utilisateur

@classPixel[]

length=2

null

null

9
24

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

TypesJavaetpassagedeparamtre

Lorsdesappelsdemthode,lesargumentssonttoujours
passsparvaleur
Danslecasdestypesprimitifs,c'estlavaleurdel'argument
quiestrecopiedansleparamtredelamthode

Lesmodificationssurleparamtredelamthodesontsans
effetsurl'argument

Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode

Lesmodificationseffectuesensuivantcetterfrence(e.g.
modificationd'unchampdel'objet)sontrpercutsdansla
mmoireetsontdoncvisiblessurl'argument
Enrevanche,lamodificationdelarfrenceellemmeest
sanseffetsurl'argument(c'enestunecopie)

25

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Passagedeparamtre:typeprimitif

Danslecasdestypesprimitifs,c'estlavaleurdel'argument
quiestrecopiedansleparamtredelamthode

Lesmodificationssurleparamtredelamthodesontsans
effetsurl'argument

public static void m1(int i) {


i++;
}
public static void main(String[] args) {
int entier = 5;
m1(entier);
System.out.println(entier); // 5
}

entier

26
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Passagedeparamtre:typerfrence

Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode

Lesmodificationseffectuesensuivantcetterfrence(e.g.
modificationd'unchampdel'objet)sontrpercutsdansla
mmoireetsontdoncvisiblessurl'argument

public static void m2(Box b) {


b.field++;
}
public static void main(String[] args) {
Box box = new Box();
box.field = 5;
m2(box);
System.out.println(box.field); // 6
}

#1

#1

@classBox

field=5

6
box

#1
class Box {
int field;
}

27

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Passagedeparamtre:typerfrence

Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode

Enrevanche,lamodificationdelarfrenceellemmeest
sanseffetsurl'argument(c'enestunecopie)
#2

tmp
public static void m3(Box b) {
Box tmp = new Box();
tmp.field = b.field+1;
b
b = tmp;
}
public static void main(String[] args) {
Box box = new Box();
box
box.field = 5;
m3(box);
System.out.println(box.field); // 5
}

field=6

#2
#1 #2

@classBox

#1

@classBox

field=5

#1
class Box {
int field;
}

28

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Typerfrenceetvaleurnull

Lorsqu'ondclareunevariabledetypeobjet,seulelaplacede
larfrenceestrservesurlapiled'excution(registre)

4octets,32bits,etcequelquesoitletypedel'objetrfrenc

Pardfaut,cetterfrencevautunevaleurparticulire,null.

Ilestinterditdetenterd'yaccder,deladrfrencer

Lecompilateurvrifiecequ'ilpeut

public static void main(String[] args) {


Box b;
System.out.println(b.field); // Variable b might not have been initialized
}

Onpeutforcerpourqueacompile=>lveuneexception

public static void main(String[] args) {


Box b = null;
System.out.println(b.field); // lve NullPointerException
29
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Allocationmmoire

Pourqu'unevariableobjetprenneuneautrevaleurquenull,il
fauttrecapabled'yaffecterunerfrence

Ellepeuttreproduite(retourne)parl'oprateurd'allocationnew
Cetoprateurbesoindeconnatrelatailledel'objetqu'ildoit
rserverenmmoire

Lenomdutype/delaclassesuitimmdiatementl'oprateur

newBox();//j'aibesoindestocker1int(field)

newint[10];//stocker10int+latailledutableau

Lazonemmoireallouedoittreinitialise(affectationdesvaleurs)

newPixel(1,3);//utiliseunconstructeur

Letermedeconstructeurestmalchoisi:initialiseurseraitmieux

Cequeretournel'oprateurnewestlarfrencequipermet
d'accderl'objetallouenmmoire
30
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Dsallocationmmoire

Ellen'estpasgreparleprogrammeur,maisparunGC
(GarbageCollector)
Lesobjetsquinesontplusrfrencspeuventtre
rcuprsparleGC,pourrecyclerl'espacemmoire
qu'ilsoccupent
Unmmeobjetpeuttrerfrencparplusieursvariables
Ilfautqu'aucunevariablenerfrenceplusunobjetpourqu'il
soitrclam
Lesvariablescessentderfrencerunobjet

Quandonleuraffecteuneautrevaleur,ounull
Quandonquitteleblocoellesonttdfinies:ellesmeurent,
disparaissent...(surlapile)

31

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

RfrencesetGarbageCollector

LaquantitidemmoiredisponibledansletasdelaVMestfix
l'avance(paramtrable):

javaXms<size>MyAppli

C'estlegestionnairedelammoirequisechargede

L'allocationdesnouveauxobjets

Larcuprationdelaplaceoccupeparlesobjetsmorts
(devenusinaccessibles)

Demandeparl'oprateurnew

Lorsqu'ilyabesoindeplacesupplmentaireouquandilledcide

Delamanired'organiserlesobjets

Pourviterunefragmentationdelammoire,ildplaceles
objetsenmmoire(zonedesvieuxdesrcents,etc.)
Lesrfrencesnesontpasdesadresses(indirection)

32

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Regardonslesclassesdeplusprs

Avantlaclasse,ilpeutyavoir2informations

Lepaquetaged'appartenancedelaclasse:

packagefr.umlv.ir1.basics;
Ilpermetdedfinirunespacedenommagequidonneunnom
completlaclasse:fr.umlv.ir1.basics.MyClass
L'organisationdesclassesdanslesrpertoiresdusystmedefichier
doiventreflterl'organisationdespaquetages:lerpertoire
fr/umlv/ir1/basicscontientlaclasseMyClass.java

Desdirectivesd'importation(loallerchercherlesclassesdont
onsesertdanslecode);cen'estpasunedirectived'inclusion!

importjava.io.*;
importjava.util.Scanner;
Lesclassesdupaquetagejava.langsontvisiblespardfaut
33
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Quelquesrglesd'hygine

(Trsvite)indispensable:regrouperlesclassesenpaquetages
Obligatoire:avoirunehirarchiederpertoireisomorphela
hirarchiedespaquetages
d:rpertoirede
Sparerlessourcesdesclasses

destinationdesclasses

cp:rpertoireotrouver
[code$]ls
lesclassescompiles
classes src
[code$]lssrc/fr/umlv/ir1/basics/
HelloWorld.javaPixel.java
[code$]javacdclassessrc/fr/umlv/ir1/basics/Pixel.java
[code$]lsclasses/fr/umlv/ir1/basics/
Pixel.class
[code$]javacpclasses/fr.umlv.ir1.basics.Pixel
(1,3)falsetrue
[code$]javaccpclassesdclassessrc/fr/umlv/ir1/basics/HelloWorld.java

[code$]javacpclasses/fr.umlv.ir1.basics.HelloWorld
BonjourvouslesIR1!
(1,3)falsetrue
Lesdeuxsilacompilation
34
abesoind'autresclasses EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Laclasseenellemme:accessibilit

classMyClass

publicclassMyClass

Laclasseseraaccessibledepuistouteslesclassesdumme
paquetagequ'elle(onparlequelquefoisdevisibilitde
paquetage)
Laclasseseraaccessibleden'importeo(pourvuqu'onindique
sonnomdepaquetagecompletouqu'onutiliseladirective
import)

Cettenotiond'accessibilitsertdfinirdescomposantsde
plusgrandegranularitquelesclasses,

Permetdelimiterl'accs

Peutviterdesconflitsdenoms

35
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesmembres:champsetmthodes

Dansuneclasse,ilyagrossirement

Unezoneavecdesdclarationsdechamps

Unezoneavecdesdclarationsdemthodes

Ilsdfinissentcequiserastockdanschaqueobjetdecetteclasse
Ellesdfinissentlesactions/fonctionnalits/comportementsaccepts
parlesobjetsdecetteclasse
Chaquemthodedeuxparties:

Sasignature(typederetour,nom,typesdesparamtres

Soncode,quiestconstitudeblocsimbriqus

Ilpeutgalementyavoiraussiquelquesblocsd'intitalisation,
constructeursouautresclassesinternes...

36
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesblocsetlesvariableslocales

Unevariablelocaleestvisibledansleblocdanslequelelleest
dclare
Lesparamtresdesmthodessontconsidrscommedes
variableslocales
2variablesdemmenomdoiventtredansdesblocsdisjoints

public class LocalVariable {


private static double sum(double[] values) {
double sum=0.0;
for(double v:values) {
sum+=v;
}
// v n'est plus accessible
return sum;
}
// values et sum pas accessible
public static void main(String[] args) {
sum(new double[]{2,3,4,5});
}
}

37
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Variablelocaleconstante

LemotclfinalsignifieenJavaaffectationunique

Ils'appliquesurlavariablequiestdclare
Unobjetouuntableaufinalpeutavoirseschampsouses
lmentsmodifis

public class FinalExample {


public static void main(String[] args) {
final int val;
if (args.length==2)
val=3;
else
val=4;
val = 0; // error: variable val might already have been assigned
final String[] tab = args;
for(int i=0;i<args.length;i++)
tab[i]="toto"; // ok, car cela ne change pas la rfrence
}
}

38
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Leschamps,parrapportauxvariables?

Leurexistenceetleurduredeviesontassociesauxobjets
(ouaupirelaclasseellemme)

Tandisquelesvariableslocalessontassociesuneexcution
delamthodequilesutilise...surlapile!

Leschampspossdentunevaleurpardfautquileurest
affectelorsdelacrationd'unobjet

0pourlestypesnumriquesprimitifs

falsepourlesboolens

nullpourlestypesrfrence

Tandisquelesvariableslocalesdoiventncessairementtre
initialisesavantd'treutilises
39
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Accessibilitdesmembres

Touslesmembresontuneaccessibilitquiestspcifiela
dclarationparunmodificateur
Demanirecomplmentaireceluidelaclasse,ilpermetde
dterminerqui,parmiceuxquiontaccslaclasseA,ont
accscemembre

private:accessibleuniquementdepuisl'intrieurdelaclasseA
Pardfaut(pasdemodificateur):accessibledepuistoutesles
classesquisontdanslemmepaquetagequeA
protected:accessibledepuistouteslesclassesquisontdans
lemmepaquetagequeA,etgalementdepuiscellesquinesont
pasdanslemmepaquetagemaisquihritentdelaclasseA
public:accessibledepuisn'importeo
40
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Accsauxmembres:champsetmthodes

Aveclepoint.surunerfrenceunobjet:

p.x,p0.sameAs(p1);

Lecompilateurregarde
letypedclardela
variable(icipoup0)et
vrifiequelemembre
(icixousameAs)existe.
Lecompilateurvrifie
galementlesdroits
d'accessibilit
Unchampetune
mthodepeuventavoir
lemmenom
thisreprsente
l'instancecourante

public class Pixel {


private int x;
private int y;
public Pixel(int x, int y) {
this.x = x;
this.y = y;
}
public boolean sameAs(Pixel p) {
return (this.x==p.x) && (this.y==p.y);
}
public static void main(String[] args) {
Pixel p0 = new Pixel(0,0);
Pixel p1 = new Pixel(1,3);
boolean b = p0.sameAs(p1); // false
}
}
class OtherClass {
public static void main(String[] args) {
Pixel p0 = new Pixel(0,0);
p.sameAs(p); // true
p0.x = 1; // error: x has private
41
}
// access in Pixel
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Crationd'instances

Uneinstance,ouunobjet,d'uneclasseestcreen3temps
Pixelp1=newPixel(1,3);

newestl'oprateurd'instanciation:commeilestsuividunomde
laclasse,ilsaitquelleclassedoittreinstancie

Ilinitialisechaquechampsavaleurpardfaut

Ilpeutexcuterunblocd'initialisationventuel

Ilretourneralarfrencedel'objetainsicr

Pixelestlenomdelaclasse
(1,3)permetdetrouverunefonctiond'initialisationparticulire
danslaclasse,qu'onappelleunconstructeur

42
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Constructeur

Unconstructeurestunemthodeparticulire,quisert
initialiserunobjetunefoisquelammoireestrserveparnew

Permetdegarantirdesinvariantssurunobjetsontconservs,par
exemplepourinitialiserunobjetavecdesvaleursparticulires

Parexemple,onveutqu'unPixelsoiten(1,1)

Lefaireavecunemthodenormalenegarantiraitpasqu'on
accdepasl'tatdel'objetavantsoninitialisation
Leconstructeuralemmenomquelaclasseetpasdetypede
retour

Enl'absencede
constructeurexplicitement
dfini,lecompilateurajoute
unconstructeurpublic
sansparamtre

class Box {
private int field;
public static void main(String[] a){
Box b = new Box();
}
}
43
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Appelunautreconstructeur

Plusieursconstructeurspeuventcohabiterdanslammeclasse

Ilsonttypiquementdesrlesdiffrentsetoffrentdesservices
complmentairesl'utilisateur,parexemple:

newPixel(1,3)creunpixelaveclescoordonnesexplicites

newPixel()creunpixelaveclescoordonnesl'origine

newPixel(1)creunpixelsurladiagonale(x==y),etc.

Quandc'estpossible,ilest
prfrablequ'ilyenaitun
leplusgnraletque
lesautresyfassentappel

Pluttquededupliquerlecode
dansplusieursconstrcuteurs
L'appelunautreconstructeurdela
mmeclassesefaitparthis(...)

public class Pixel {


private int x;
private int y;
public Pixel(int x, int y) {
this.x = x;
this.y = y;
}
public Pixel() {
this(0,0);
}
public Pixel(int v) {
this(v, v);
44
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Champconstant

Commepourlesvariableslocales,ilestpossiblededclarerun
champaveclemodificateurfinal.

Celasignifiequ'ildoitavoir
uneaffectationunique
Lecompilateurvrifieque
ilabientinitialis,etce
quelquesoitleconstructeur
maisgalementqu'iln'at
affectqu'uneseulefois

public class Pixel {


private final int x;
private int y;
public Pixel(int x, int y) {
this.x = x;
this.y = y;
}
public Pixel() {
// error: final field x may not
// have been initialized
}
public Pixel(int v) {
this(v, v);
}
public static void main(String[] a){
Pixel p = new Pixel(1);
p.x = 0; // error: final field x
// cannot been assigned
}
45
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Surcharge

Lesmthodescommelesconstructeurspeuventtre
surcharges:(overloaded)

Leurnomestlemme

Lenombreouletypedeleursparamtresvarie

Objectif:fournirplusieursdfinitionspourlammemthode
Lecompilateurdoitpouvoirtrouverceluiquiconvientlemieux
ausited'appel,c'estdireaunombreetautypedes
arguments
Siaucunemthodenecorrespondexactement,lecompilateur
peutprendreunemthodeapprocheenfonctiondutypage

46
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Letypageetlasurcharge

Lestypesdclarsdesvariablespeventquelquefoistre
ordonnsparunerelationdesoustypage

Ilyadusoustypagesurlestypesrfrences

Surlestypesprimitifs,onparledeconversionimplicite

Liauxclasses,auxinterfaces,auxclassesabstraites,l'hritage...
byte<short<int<long<float<double
char<int

Enrglegnrale,ilestprfrabled'utiliserlasurchargeentre
deuxmthodesquandellesontlammesmantique

floatsqrt(floatvalue){...}//et
doublesqrt(doublevalue){...}//OK
voidremove(Objectvalue){...}//et
voidremove(intindex){...}//KO(liste)

47

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Ambiguitdesurcharge

Lecompilateurpeutnepassavoirlaquellechoisir

public class Overloading {


public static void m(int i, long l) {
System.out.println("m(int, long)");
}
public static void m(long l, int i) {
System.out.println("m(long, int)");
}
public static void main(String[] args) {
int i = 1;
long l = 1L;
m(i,l); // m(int, long)
m(l,i); // m(long, int)
m(i,i); // reference to m is ambiguous,
// both method m(int,long) and method m(long,int)
}
}

match

48
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesmembresstatiques

Dclarsaveclemotclstatic,lesmembresstatiquessont
lislaclasseetnonuneinstanceparticulire(unobjet)

Champs:savaleurn'estpaspropreunobjetmaislaclasse
(lechampluimme,etbiensrsavaleur,estlammepourtous
lesobjetsdelaclasse)

Onyaccdepartirdunomdelaclasseoudelarfrence
n'importequelobjetdelaclasse

Mthodes:soncodenedpendpasd'unobjetdelaclasseet
peuttreexcutmmesiaucunobjetexiste(e.g.main)
Classesinternes

Toutcodeutilisdanslesmembresstatiquesnepeutpasfaire
rfrencel'instancecourante(this)
49
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lemystredeprintln()...
public static void main(String[] args) {
System.out.println("Hi les geeks!");// Hi les geeks!
voidjava.io.PrintStream.println(Stringx)

System.out.println('c');

// c

voidjava.io.PrintStream.println(charx)

System.out.println(2.5f);

// 2.5

voidjava.io.PrintStream.println(floatx)

Object o = new Object();


System.out.println(o);

// java.lang.Object@7a9664a1

voidjava.io.PrintStream.println(Objectx)

int[] tab = new int[5];


System.out.println(tab);

// [I@27a8c4e7

voidjava.io.PrintStream.println(Objectx)

Pixel p1 = new Pixel(1,3);


System.out.println(p1);
}

// Pixel@20cf2c80

voidjava.io.PrintStream.println(Objectx)

50

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Commentamarche?

Lesmthodesprintln()sontsurchargespourtreadaptes:

chaquevaleurdetypeprimitif(booleanchardoublefloatintlong)

Auxchanesdecaractres(Stringetchar[])

Auxobjets(Object)

Pardfaut,touteclasseAhritedeObject

Celainduitunerelationdesoustypage:A<Object

AdfinitunsoustypedeObject

OnpeutdoncappliquersurAcequ'onsaitfairesurObject

Quandonappelleprintln()surunPixel,aappellelamthode
surObject

AffichagePixel@20cf2c80cohrentavecjava.lang.Object@7a9664a1

51

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Cequefaitlamthodeprintln(Objectx)

Sionsuitlescommentairesdelajavadoc(oulecode)

PrintStream.println(Objectx)appelleString.valueOf(x)

String.valueOf(Objectx)retourne

"null"sijamaisl'objetxvautnull

x.toString()sixnevautpasnull

DanslaclasseObject,toString()afficheunechaneconstruitepar
getClass().getName()+'@'+Integer.toHexString(hashCode())

Pournotrecas,siPixelp=newPixel(1,3);

CommepestunsoustypedeObject,l'appelprintln(p)excutela
mthodeprintln(Objectx)surl'objetp,cequiappelle
String.valueOf(p)quiluimmeretournep.toString()
Commeiln'yapasdemthodetoString()explicitementdfiniedans
Pixel,c'estlamthodetoString()deObjecthritedansPixelqui
52
estappele.CQFD.
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Loc'estfort...

Quandunemthodem()estappelesurunevariablevqui
contientunerfrence

Lecompilateurvrifiequ'ilyabienunemthodem()dfiniepour
letypedclardelavariablev(aupire,jesaisfaire)
LaJVM(l'excution)rechercheunedfinitionpourcette
mthodem()quisoitlaplusprcisepossible,i.e.,laplusproche
dutypereldelarfrencecontenuedansv
Parexemple,siObjectv=newPixel(1,3);

C'estpossiblecarPixelestunsoustypedeObject
vestdclaredetypeObject(infocompiletime),maiscontienten
ralitunerfrenceunobjetdetypePixel(inforuntime)

Sim()estlamthodetoString(),lecompilateurditbancopour
Object.toString()etlaJVMrecherchePixel.toString()

SiPixel.toString()n'existepas,celledeObjectquiesthrite

53

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Etvoilletravail...
IlsuffitalorsdedonnersapropredfinitiondetoString()
danslaclassePixel

Onditqu'onredfinit(Override)lamthodetoString()
L'annotation@Override

public class Pixel {


demandeaucompilateurde
// ...
vrifierqu'onestbienentrain
@Override
deredfinirunemthodequi
public String toString() {
sinonseraithrite
return "("+x+","+y+")";
}
public static void main(String[] args) {
Object o = new Pixel(1,3);
System.out.println(o);
// (1,3)
voidjava.io.PrintStream.println(Objectx)

// et a fortiori
Pixel p = new Pixel(5,7);
System.out.println(p);
}
}

// (5,7)

voidjava.io.PrintStream.println(Objectx)

54

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesoustypage

L'ide(delaredfinitiondetoString())estque:

Lecomportementdpenddel'objetrellementcontenudansla
variable

L'affichaged'unobjetestdiffrentdel'affichaged'unPixel

Maislesdeuxpeuvents'afficher...

IlsdisposenttouslesdeuxdelamthodetoString()

Plusgnralement,onvoudraitavoirdestypes

Surlesquelsunensembledemthodesestdisponible

Maisdontladfinitionexactedpenddusoustype

Lamthodefinalementexcuteseralaplusprcisepossible

Exemple:toutefigureaunesurface,maislasurfaced'uncarr
nesecalculepascommelasurfaced'uncercle...

55

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Commentdfinirdessoustypes

Onavulesrelationsdeconversionsquisontautorisesentre
typesprimitifs

byte<short<int<long<float<double
char<int

OnavuquetouteclasseAhritedelaclasseObject,etdfinit
ainsiuntypeAquiestsoustypedutypeObject
L'hritagedfinitdessoustypes:

Soitexplicitement:classStudentextendsPerson{...}

SoitimplicitementPixelouint[]hritentdeObject

L'implmentationd'interfacedfinitdessoustypes

Uneinterfacedclarelesmthodesapplicablesparlesobjetsdes
classesquil'implmentent
Uneclasseimplmentel'interfaceendfinissantsesmthodes:
classCarreimplementsMesurable{...}

56

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

L'hritage

Consistedfiniruneclasse,diteclassedriveouclassefille,
partird'uneautreclasse,diteclassedebaseouclassemre,
enrcuprantautomatiquementdanslaclassedrivetousles
membresdelaclassedebase,etenluienajoutant
ventuellementdenouveauxmembres
Pixel

public class Pixel {


private int x;
private int y;
public void moveTo(int newX, int newY) {
this.x = newX;
this.y = newY;
}
}
public class ColoredPixel extends Pixel {
private byte[] rgb;
public byte getRed() { return rgb[0]; }
public byte getGreen() { return rgb[1]; }
public byte getBlue() { return rgb[2]; }
}

x:int
y:int
moveTo(int,int)

ColoredPixel
rgb:byte[]
getRed():byte
getGreen():byte
getBlue():byte 57

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Quesontlesobjetsdelaclassedrive?

Toutobjetd'uneclassedriveestconsidrcommetant
avanttoutunobjetdelaclassedebase

Unpixelcolorestavanttoutunpixel

Toutobjetd'uneclassedrivecumuleleschampsdrivs
danslaclassedebaseavecceuxdfinisdanssapropreclasse

IlyaunintxetunintydansunobjetdelaclasseColoredPixel

public static void main(String[] args) {


Pixel p = new Pixel();
p.moveTo(1, 1);
ColoredPixel cp = new ColoredPixel();
cp.moveTo(2, 2);
cp.getRed();
}

// NullPointerException

#1

#1

@classPixel

x:1
y:1

#2

#2 @classColoredPixel
x:2
y:2
rgb:null

58

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Tousleschampssonthrits

Ilspeuventtremanipulssileuraccessibilitlepermet

Sixn'estpasprivatedansPixel,onpeutdirethis.xdans
ColoredPixel

Ilspeuventtremasqusparladfinitiondechampsquiontle
mmenomdanslaclassedrive

SiStringxestdclardansColoredPixel,c'estceluiquisera
considrdanscetteclassequandonparledethis.x
Ilestpossibledemanipulerceluiquiestmasqu(s'ilestaccessible)
parlanotationsuper.x

public class Pixel {


int x;
private int y;
// ...
}

public class ColoredPixel extends Pixel {


private byte[] rgb;
String x;
void test() {
System.out.println(this.x);
// null
System.out.println(super.x); // 0
59
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Rsolutionduchampaccder

Ladterminationduchampquidoittreaccds'appelle
larsolution

ils'agitdesavoiroonirachercherlavaleurl'excution

Larsolutiondeschampsesteffectueparlecompilateur,en
fonctiondutypedclardelavariablequicontientla
rfrence

public static void main(String[] args) {


ColoredPixel cp = new ColoredPixel();
// le type dclar de cp est ColoredPixel
System.out.println(cp.x);

// null

Pixel p = cp;
// le type dclar de p est Pixel, mme si la rfrence
// contenue dans p est celle d'un ColoredPixel
System.out.println(p.x);
}

// 0

60
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lemasquagedeschamps

Sic'estpossibledecrerdansuneclassehriteunchampqui
alemmenomqu'unchampsd'unesuperclasse

C'estrarementtrsutile,souventunemauvaiseide,source
d'erreur

super,c'estthisvuavec
letypedelasuperclasse
super.super.xn'existepas...
Pasplusqueref.super
niref.super.x...

class A {
int x = 1;
}
class B extends A {
String x = "zz";
}

class C extends B {
boolean x = true;
Enrevanche,le
public static void main(String[] args) {
transtypage(cast)
C c = new C();
System.out.println(c.x);
// true
permetd'accderen
System.out.println(((B)c).x); // zz
changeantletypedclar
System.out.println(((A)c).x); // 1
61
delarfrenceref }
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Transtypage,typedclarettyperel

Letranstypagederfrenceestlefaitdeconsidrer
explicitement(forcer)unerfrencecommetantd'untype
donn(quin'estpasncessairementletypedel'objet
accessibleviacetterfrence)
Lamachinevirtuellevrifiera,l'excution,queletypeen
questionestbiencompatibleetquevoircetterfrencecomme
tantdecetypelestpossible;danslecascontraire,
l'excutionprovoqueuneClassCastException
class A { }
class B extends A { }
class C extends B { }

B b = new B();
A a = b;
// B b2 = a; // incompatible types
B b2 = (B) a; // OK
C c = (C) a; // ClassCastException

Object o;
if(Math.random() > 0.5)
o = "toto";
else
o = new Object();
String s = (String) o;
// Compile toujours mais a une
// chance sur deux de lever une
62
// ClassCastException...
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

L'oprateurinstanceof

Ilestpossibled'assureruntranstypagesansexceptionen
utilisantl'oprateurxinstanceofT

xdoittreune(variablecontenantune)rfrenceounull

Tdoitrerpsenteruntype

Lersultatvauttruesixn'estpasnullets'ilpeuttreaffectdans
TsansClassCastException;sinonc'estfalse.

class A { }
class B extends A { }
class C extends B { }
A ab = null;
System.out.println(ab
ab = new B();
System.out.println(ab
System.out.println(ab
System.out.println(ab

instanceof A);

// false

instanceof A);
instanceof B);
instanceof C);

// true
// true
// false

Object o; String s;
if(Math.random()>0.5)
o = "toto";
else
o = new Object();
if (o instanceof String)
s = (String) o; // OK...

63
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Constructeursethritage

Laconstruction(initialisation)detouteinstanced'uneclasse
dbuteparlaconstruction(initialisation)d'uneinstanced'Object

Enpratique,toutconstructeurdbuteparunappelau
constructeurdesasuperclasse:super()
Doitobligatoirementtrelapremireinstructionduconstructeur
Leconstructeurimplicite(ajoutparlecompilateur)faitappelau
constructeursansargumentdelasuperclasse

public class Pixel {


private int x;
private int y;
public Pixel(int x, int y) {
this.x = newX;
public class ColoredPixel extends Pixel {
this.y = newY;
private byte[] rgb;
}
public ColoredPixel() {
// ...
// super(); // Constructeur Pixel() is undefined
}
super(0,0); // OK; notez que x et y sont private!
rgb = new byte[3];
64
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Constructeursetinitialisations

Ilfautvoirleconstructeurd'uneclassecommeunetapedans
l'initialisationdesobjetsdecetteclasse:

Commenceparl'initialisationdeschampsdel'objetentant
qu'instancedelasuperclasse:c'estl'objectifdel'appelsuper(...)
Ensuiteilsecharged'initialiserlesobjetsquiluisontpropres(entant
qu'instancedelaclassedrive)
L'appelsupernepeutpasutiliserdeschampsdontl'existenceoula
valeurdpendraitdel'instancedelaclassedrive...

public class ColoredPixel extends Pixel {


private int v = 0;
private static int s = 0;
public ColoredPixel() {
// super(v,v);
// error: cannot reference v before supertype constructor has been called
super(s,s); // OK
}
65
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

L'hritagedesmthodes

Enplusdeschamps,entantquemembres,laclasse
drivehritedesmthodesdelaclassedebase
Seulslesconstructeursnesontpashrits

Ilsrestentpropresleurclasse

Attention:lecode(smantique)d'unemthodedelasuper
classepeutneplustrecorrectdanslaclassedrive

Pourl'exempledePixeletColoredPixel:

moveTo()hritedansColoredPixelaunesmantiquecorrecte

MaisquediredetoString()quidonneunereprsentationtextuelle?

QuediredesameAs()quicompareunpixelunautrepixel?

Danscertainscas,ilfautdonnerunenouvelledfinitiondela
mmemthodeutiliserpourlaclassedrive

66

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Redfinitiondemthode

Fournirunenouvelledfinitionpourlammemthode:

Mmenom,mmesarguments,codediffrent

L'annotation@Overridedemandeaucompilateurdevrifier

public class ColoredPixel extends Pixel {


private byte[] rgb;
// ...
@Override
public String toString() {
return super.toString()+"["+rgb[0]+":"+rgb[1]+":"+rgb[2]+"]";
}
public static void main(String[] args) {
ColoredPixel cp = new ColoredPixel(2,2);
System.out.println(cp); // (2,2)[0:0:0]
Pixel p = new Pixel(5,5);
System.out.println(p);
// (5,5)
Object o = new ColoredPixel(2,2);
System.out.println(o);
// (2,2)[0:0:0]
67
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Redfinition(mthodes)versus
masquage(champs)

Leschampsdfinisdanslesclassesdrivessonttous
prsentsdansl'objetinstancedelaclassedrive

Mmes'ilsontmmenometmmetype

Onpeutaccderceluiimmdiatementsuprieurparsuper.x

Larsolutiondpenddutypedclarduparamtre

apermetd'accderchacund'entreeuxpartranstypage

Pourlamthode,uneseuleestconserve

Onpeutaccdercelleimmdiatementsuprieureparsuper.m()

Larsolutionestfaiteendeuxtemps

Compiletime:onvrifiequec'estpossiblesurletypedclar

Runtime:oncherchelaplusprcisetantdonneletyperel

Lesautresnesontplusaccessibles

68
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Redfinitionversussurcharge

Silasignaturedelamthodequ'ondfinitdanslaclasse
driven'estpaslemmequecelledelaclassedebase,il
s'agitdesurcharge:

Lesdeuxmthodescohabitentdanslaclassedrive

class A {
void m1() { ... }
void m2() { ... }
Pixel m3() { ... }
void m4(Pixel p) { ... }
}
class B extends A {
@Override void m1() { ... }
void m2(int a) { ... }
@Override ColoredPixel m3() { ... }
@Override void m4(Pixel p) { ... }
void m4(ColoredPixel p) { ... }
}

//
//
//
//
//

redefinition
surcharge
redefinition
redefinition
surcharge
69

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesprincipesdelaredfinition

Quandonredfinitunemthodem()dansBalorsqu'elletait
dfiniedansA,oBestunsoustypedeA

L'objectifestdeluidonnerunedfinitionplusprcise(mieuxadapte
Bqu'A),desortequ'ellesoitappeleruntime,ycomprissi
compiletimelecompilateurn'avaitvuquecellequiestdfiniedansA

Lecompilateurestsensviterlesmauvaisessurprises(dcouvrir
unproblmeruntime):c'estcequigouvernelesrgles

Unemthoded'instancenepeutpasredfinirunemthodestatic

L'accessibilitdelamthoderedfinienepeutpastreplusrestrictive

Letypederetournepeutpastred'unsupertype(rfrences)

Lesexceptionspropagesnepeuventtrequed'unsoustype
70
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LecasdesameAs...

OnaredfinitlamthodetoString()

Donnerunereprsentationtextuelleplusprcisedans
ColoredPixel:c'estfacile(mmesignature)

OnvoudraitaussiredfinirsameAs()

Actuellement,lamthodehriteestfausse!

Redfinition:passisimpleaveclasignaturedesameAs()

// public boolean sameAs(ColoredPixel p) { // Surcharge et pas redfinition


@Override
public boolean sameAs(Pixel p) {
// return (x==p.x) && (y==p.y) & p.rgb[0]=rgb[0] ...
// Ae! x and y: private access in Pixel
// return super.sameAs(p) && p.rgb[0]=rgb[0] ...
// Ae! rgb is not a field
// return super.sameAs(p) && ((ColoredPixel)p).rgb[0]==rgb[0] ...
// Compile, mais si p n'en est pas un ColoredPixel... Ae!
71
// Il faut utiliser instanceof...
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Lamthodeequals()

Delammemanirequ'ilexisteunemthodetoString()dansla
classeObject,quetoutesousclassepeutredfinir
IlexistedansObjectunemthodeequals(Objectobj)dontle
contratestclairementtabliparladocumentation

Pardfaut,elletestel'galitprimitivedesrfrences(mmeobjet)

C'estcellelqu'ilfautredfinir!

public class Pixel {


private int x, y;
// ...
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Pixel))
return false;
Pixel p = (Pixel) obj;
return (x==p.x) && (y==p.y);
}
}

public class ColoredPixel extends Pixel {


private byte[] rgb;
@Override
public boolean equals(Object obj) {
if(!(obj instanceof ColoredPixel))
return false;
ColoredPixel cp = (ColoredPixel) obj;
return super.equals(obj) &&
rgb[0]==cp.rgb[0] &&
rgb[1]==cp.rgb[1] &&
rgb[2]==cp.rgb[2];
72
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Lecontratdelamthodeequals()

Dfinitunerelationd'quivalencesurlesrfrencesnonnulles

Reflexive

Symtrique

Pourtoutesrfrencesx,yetznonnulles,
six.equals(y)ety.equals(z)alorsx.equals(z)

Cohrente

Pourtoutesrfrencesxetynonnulles,x.equals(y)ssiy.equals(x)

Transitive

Pourtouterfrencexnonnulle,x.equals(x)vauttrue

Bofbof...dansnotrecasde
ColoredPixel,c'estlimite...

Tantqu'onnemodifiepaslesvaleursutilisespourtesterl'galit,lavaleurde
x.equals(y)retournetoujourslammevaleur

Pourtouterfrencexnonnulle,x.equals(null)vautfalse

Desobjetsgauxausensdeequalsdoiventavoirlemmehashcode

Redfinitiondeequals()impliqueengnralredfinitiondehashCode()

73

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lasymtriepeutsediscuter...

DemandezunPixelen(2,2)s'ilestgalunColoredPixelen
(2,2),ildiraqueoui!

DemandezunColoredPixelmagentaen(2,2)s'ilestgalun
Pixelen(2,2),ildiraquenon!

Iltesteuniquementlescoordonnes...

IlestsenstesterlacouleurquelePixeln'ammepas...

Onpeuttrouverquececodeestacceptable...ilfautjustetre
conscientdelanuance...
public class ColoredPixel extends Pixel {
// ...
public static void main(String[] args) {
Object o1 = new Pixel(2,2);
Object o2 = new ColoredPixel(2,2);
System.out.println(o1.equals(o2)); // true
System.out.println(o2.equals(o1)); // false
}
}

74

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Pourtreplusstrict...

Ilfautconsidrerquedeuxobjetsquinesontpasdelamme
@Override
classenepeuventpastregaux
DansPixel:

instanceofnesuffitplus
Ilfautconnatrelaclasse
exactedel'objet(
runtime)

public boolean equals(Object obj) {


if(obj.getClass() != Pixel.class)
return false;
Pixel p = (Pixel) obj;
return (x==p.x) && (y==p.y);
}

@Override
public boolean equals(Object obj) {
MthodeClassgetClass() if(obj.getClass() != ColoredPixel.class)
return false;
delaclasseObject
ColoredPixel cp = (ColoredPixel) obj;
return super.equals(obj) &&
Arrays.equals(this.rgb, cp.rgb);
}

public static void main(String[] args) {


Object o1 = new Pixel(2,2);
Object o2 = new ColoredPixel(2,2);
System.out.println(o1.equals(o2)); // false
System.out.println(o2.equals(o1)); // false
}

DansColoredPixel:
75
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LamthodehashCode()

Cettemthodeestutliselorsqu'onstockedesobjetsdansune
tabledehachage(exemplejava.util.HashMap)
Elletablitgalementuncontrat(depairavecequals())

publicinthashCode()
tantdonneuneexcutiondelaJVM,diffrentsappelsla
mthodehashCode()doiventretournerlammevaleurtantqu'on
nemodifiepaslesvaleursutilisespourtesterl'galit(equals())
Sideuxobjetssontgauxausensdeequals(),lamthode
hashCode()appelesurlesdeuxdoitproduirelammevaleur
Deuxobjetsdistinctsausensdeequals()peuventavoirdes
hashCode()identiques(c'estunecollision),maisfournirdes
hashCode()distinctspourdesobjetsdistinctsausensdeequals()
amliorelaperformancedestablesdehachage.
76
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

UtilisationdehashCode()etequals()

Lesensembles,lestablesdehachage,etc.

Siequalsestredfinie,maispashashCode,voilcequiarrive

import java.util.HashSet;
public class Pixel {
// ...
public static void main(String[] args) {
Pixel zero = new Pixel(0,0);
Pixel def = new Pixel();

Incohrence
entreequals()
ethashCode()

HashSet set = new HashSet();


set.add(zero);
System.out.println(set.contains(def)); // false
System.out.println(zero.hashCode());
System.out.println(def.hashCode());

// 1522065175
// 524193161

System.out.println(zero.equals(def));

// true

}
}

77
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

ExempledehashCode()pournospixels
public class Pixel {
public static void main(String[] a){
// ...
Pixel zero = new Pixel(0,0);
@Override
Pixel def = new Pixel();
public boolean equals(Object obj) {
HashSet set = new HashSet();
if(!(obj instanceof Pixel))
set.add(zero);
return false;
set.contains(def); // true
Pixel p = (Pixel) obj;
zero.hashCode();
// 0
return (x==p.x) && (y==p.y);
def.hashCode();
// O
}
zero.equals(def); // true
@Override
}
public int hashCode() {
return Integer.rotateLeft(x,16) ^ y;
}
public class ColoredPixel extends Pixel {
private byte[] rgb;
// ...
@Override
public int hashCode() {
// return super.hashCode() ^ Integer.rotateLeft(rgb[0],16)
//
^ Integer.rotateLeft(rgb[1],8) ^ rgb[0];
return super.hashCode() ^ Arrays.hashCode(rgb);
}
}

78

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesclassesetmthodesfinal

Lemotclfinalexistepourlesmthodes:

Ilsignifiequelamthodenepourrapastreredfiniedansune
sousclasse
Peuttreutilepourgarantirqu'aucuneautredfinitionnepourra
tredonnepourcettemthode(scurit)

Lemotclfinalexistepourlesclasses:

Ildevientalorsimpossibled'hriterdecetteclasse

Lesmthodessecomportentcommesiellestaientfinal

79
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesinterfaces

Uneclassedfinit:

Untype

Unestructurededonnespourlesinstances(leschamps)

Desmthodesavecleurcode(leurdfinition)

Uneinterfacedfinit:

Untype

Desmthodessansleurcode(mthodesabstraites)

Uneinterfacenepeutpastreinstancie

Elleestdestinetreimplmentepardesclasses

quielledonnerasontype

Quifournirontdesdfinitionspourlesmthodesdclares(code)

80

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Intrtdesinterfaces

Donneruntypecommundesclassesdiffrentespourenfaire
unmmeusage
Exemple:

Manipulerdestableauxdetrucsquiontchacununesurface

Fairelasommedessurfacesdestrucsquisontdansletableau
public interface Surfaceable {
public double surface();
}

public class AlgoOnTrucs {


public static double totalSurface(Surfaceable[] array) {
double total = 0.0;
for(Surfaceable truc : array)
total += truc.surface();
return total;
}
81
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Utilisationd'interface

Les2principauxavantages:

L'algodelamthodetotalSurface(Surfaceable[]array)fonctionne
indpendammentdelaclasserelledesobjetsquisontstocks
dansarray:c'estlesoustypage
Lamthodesurface()effectivementappelesurlesobjets
contenusdansletableauseralaplusprcisepossible,en
fonctiondutypereldecetobjet:c'estlepolymorphisme

public class AlgoOnTrucs {


public static double totalSurface(Surfaceable[] array) { ... }
public static void main(String[] args) {
Rectangle rectangle = new Rectangle(2,5);
Square square = new Square(10);
Circle circle = new Circle(1);
Surfaceable[] t = {rectangle, square, circle};
System.out.println(totalSurface(t)); // 113.1415926535898
}
}

82

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Implmentationd'interface
public class Square implements Surfaceable {
private final double side;
public Square(double side) {
this.side = side;
public class Rectangle implements Surfaceable {
}
private final double height;
@Override
private final double width;
public double surface() {
public Rectangle(double height, double width) {
return side * side;
this.height = height;
}
this.width = width;
}
}
@Override
public double surface() {
return height * width;
}
}
public class Circle implements Surfaceable {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double surface() {
return Math.PI * radius * radius;
83
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Lesmembresdesinterfaces

Contiennentdesdclarationsdemthodepubliques

Touteslesmthodessont public interface Surfaceable {


double surface(); // equivaut
abstractpublic

Peuventdfinirdeschampspubliquesconstants

public interface I {
Tousleschampssont
int field = 10; // equivaut
publicfinalstatic
public final static int field

mmesinonspcifi

public abstract double surface();

Lecompilateurajoute
lesmotcls

= 10;

Iln'estpaspossibled'instancieruneinterface

Onnepeutquedclarerdesvariablesavecleurtype
Cesvariablespourrontreevoirdesrfrencesdesobjetsqui
sontdesinstancesd'uneclassequiimplmentel'interface

84

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Implmentationd'interfaceetsoustypage

Uneclassepeutimplmenteruneinterface

Motclimplements
public class Rectangle implements Surfaceable {
...
}

LaclasseRectangledfinitunsoustypedeSurfaceable
Surfaceable s = null;
s = new Rectangle(2,5);

Uneinterfacenepeutpasimplmenteruneautreinterface

Onnesauraitpascommentimplmenterlesmthodes

85
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Soustypageentreinterfaces

Uneinterfacepeuthriterd'uneouplusieursautresinterfaces

Motclextends

LetypePaintableestunsoustypedeSurfaceable

Surfaceable[]
Paintable p =
array[0] = p;
p = array[1];

public interface Paintable extends Surfaceable {


double paint(byte[] color, int layers);
}

array = new Surfaceable[3]; // On peut crer des tableaux!


null;
// OK: Paintable < Surfaceable
// Cannot convert from Surfaceable to Paintable

Sparerlessupertypes
avecdesvirgules

public interface SurfaceableAndMoveable


extends Surfaceable, Moveable { ... }

LetypeSurfaceableAndMoveabledfinitunsoustypedesdeux
typesSurfaceableetdeMoveable(soustypagemultiple)

SurfaceableAndMoveable<Surfaceableet
SurfaceableAndMoveable<Moveable
Cesdeuxderniresn'ontaucunerelationentreelles

86

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Hritagedeclasseetimplmentation
d'interfaces:soustypagemultiple

Uneclassepeuthriterd'uneclasseetimplmenterplusieurs
interfaces

public class SolidCircle extends Circle implements Paintable, Moveable {


private final Point center;
public SolidCircle(Point center, double radius) {
super(radius);
this.center = center;
}
@Override // Pour pouvoir implmenter Paintable
public double paint(byte[] color, int layers) {
// doThePaintingJob(color,layers);
return layers * surface(); // SolidCircle < Circle < Surfaceable
}
@Override // Pour pouvoir implmenter Moveable
public void moveTo(int x, int y) {
center.moveTo(x,y);
}
public static void main(String[] args) {
SolidCircle sc = new SolidCircle(new Point(0,0), 3);
Circle c = sc;
double d = c.surface();
// SolidCircle < Circle
Paintable p = sc;
p.paint(new byte[]{0,0,0},2);// SolidCircle < Paintable
Moveable m = sc;
m.moveTo(1, 1);
// SolidCircle < Moveable 87
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Vrificationsducompilateur

Touteslesmthodesdclares(abstract)dansl'ensemble
desinterfacesdontonrevendiquel'implmentationdoivent
treimplantes

Lemodificateurdevisibilitnepeutpastreautrechoseque
public

Dfiniesavecleurcode

Mmesionamislavisibilitpardfautdansl'interface,le
compilateuryajoutepublicabstract

Quesepassetilsiplusieursmthodesdemmenometmme
signaturedediffrentesinterfacesdoiventtreimplmentes
danslammeclasse?
88
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Pourquoipashriterdeplusieursclasses

Acausedeschamps(diamant)

Object

Quipourraientprovenir
dedeuxclassesdont
onhriteetquidevraient
coexisterdansun
mmeobjet!

x:int

x:int
C

x:int

#1

@classC

Cc #1

x=1

x=2

x=3

L'hritagemultipled'interfacesneposepasdeproblmes

Aummetitrequel'implmentationmultipled'interfaces

Onrcupreparhritageuniquement

desdclarationsdemthodes(quinepossdentpasdedfinition)
desconstantesdontlaporteestlimitel'interfacedanslaquelle
ellessontdfinies(espacedenom)
89
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Design:interfaceouhritage

Onhrited'uneclasse

pourcrerunnouveautypequiestunesorteparticulirede
classedebase

Ondfinituneinterfaceetonl'implmente

Pourunefonctionnalittransverse

Comparable,Closeable,Mesurable,Dplacable...

Pourregrouperunensembledefonctionalitsquipourronttre
implmentespardesinstancesquienimplantentdjd'autres
(ouquihritentd'uneautreclasse)

classRandomAccessFileextendsObject
implementsDataOutput,DataInput,Closeable{...}

90
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lesclassesabstraites

Dansuneinterface,toutdoittreabstrait(mthodes)

Lesmthodesdoiventtoutestreabstraites

Ellesnepeuventtrequepubliques

Dansuneclasse,toutdoittreconcret

Lesmthodesdoiventtredfinies(leurcode)

Ellespeuventavoirdesmodificateursdevisibilitsdiffrents

Uneclasseabstraitepermetdecrerunetypemichemin

Ils'agitd'uneclassequipeutavoirdesmthodesabstraites
Elleestconsidrecommepartiellementimplante,doncnon
instanciable
Ellepeutventuellementn'avoiraucunemthodeabstraite

91
Lemotclabstractfaitqu'ellen'estpasinstanciable
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Simonalgomanipuleuntype...

...surlequeljesaisfairedeschoses,maispastout!

public class AlgoOnTrucs {


public static double totalSurface(Surfaceable[] array) {
double total = 0.0;
for(Surfaceable truc : array)
Lecodedesurface()nepeuttredfini
total += truc.surface();
quedanslaclasseconcrte
return total;
}
public static Surfaceable theBigger(Surfaceable[] array) {
Surfaceable bigger = array[0];
for(int i = 1; i<array.length; i++) {
if (array[i].biggerThan(bigger))
Maisjepeuxcrireuncodepour
bigger = array[i];
biggerThan()quinedpendpasde
}
return bigger;
cetteclasseconcrte
}
public static void main(String[] args) {
Rectangle rectangle = new Rectangle(2,5);
Square square = new Square(10);
Circle circle = new Circle(1);
Surfaceable[] t = {rectangle, square, circle};
System.out.println(totalSurface(t)); // 113.1415926535898
System.out.println(theBigger(t)); // Square@a6eb38a
92
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}
}

Exempledeclasseabstraite

L'implmentationdelamthodebiggerThan()marcherads
qu'onl'appelerasurunobjet(instance)d'uneclasseconcrte,
puisquecelleciauradonnl'implmentationdelamthode
public abstract class Surfaceable {
surface().

public abstract double surface();


public boolean biggerThan(Surfaceable bigger) {
return surface() > bigger.surface();
}

}
public class Rectangle extends Surfaceable {
...
public class Circle extends Surfaceable {
}
...
public class Square extends Surfaceable {
}
private final double side;

public Square(double side) {


this.side = side;
}
@Override
public double surface() {
return side * side;
93
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

LesExceptions

Mcanismequipermetdereporterdeserreursversles
mthodesappelantes

traverslapiled'appeldesmthodes

aveclapossibilitd'intercepter/traiteroudepropager

ProblmeenC:

prvoiruneplagedevaleursdanslavaleurderetourpour
signalerleserreurs.
Propagerleserreursmanuellement

EnJavacommeenC++,lemcanismederemontderreurest
greparlelangage.

94
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exempled'exception
Unexemplesimple
public class ExceptionExample {
public static char charAt(char[] array,int index) {
return array[index];
}

public static void main(String[] args) {


char[] array=args[0].toCharArray();
charAt(array,0);
}

Lorsdelexcution:
C:\eclipse\workspace\java-avanc>java ExceptionExample
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at ExceptionExample.main(ExceptionExample.java:18)
95
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exempled'exception(suite)
Enreprenantlemmeexemple:
public class ExceptionExample {
public static char charAt(char[] array,int index) {
if (index<0 || index>=array.length)
throw new IllegalArgumentException("bad index "+index);
return array[index];
}

public static void main(String[] args) {


char[] array=args[0].toCharArray();
charAt(array,0);
charAt(array,1000);
}

C:\eclipse\workspace\java-avanc>java ExceptionExample toto


Exception in thread "main" java.lang.IllegalArgumentException: bad index
1000
at ExceptionExample.charAt(ExceptionExample.java:13)
at ExceptionExample.main(ExceptionExample.java:20)
96
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Typesd'exceptions
IlexisteenJavatoutunehirarchiedetypesd'exceptions
Throwable

Error

Exception

RuntimeException

Arbredesoustypagedesexceptions

97
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Typesd'exceptions(2)
Throwableestlaclassemredetouteslesexceptions
LesErrorcorrespondentdesexceptionsqu'ilestrared'attraper.
LesRuntimeExceptionquel'onpeutrattrapermaisquel'onn'est
pasoblig.
LesExceptionquel'onestobligd'attraper(try/catch)oudedire
quelamthodeappelantedevras'enoccuper(throws).

98
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

ExceptionslevesparlaVM
LesexceptionslevesparlaVMcorrespondent:
Erreurdecompilationoudelancement
NoClassDefFoundError,ClassFormatError

problmed'entre/sortie:
IOException,AWTException

problmederessource:
OutOfMemoryError,StackOverflowError

deserreursdeprogrammation(runtime)
NullPointerException,ArrayIndexOutOfBoundsException,ArithmethicException

99
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Attraperuneexception
try/catchpermet
d'attraperlesexceptions

public class CatchExceptionExample {


public static void main(String[] args) {
int value;
try {
value=Integer.parseInt(args[0]);
} catch(NumberFormatException e) {
value=0;
}
System.out.println("value "+value);
}
}

100
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Attraperuneexception
try/catchdfinitobligatoirementunbloc.
public class CatchExceptionExample {
public static void main(String[] args) {
int value;
try {
value=Integer.parseInt(args[0]);
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println("no argument");
e.printStackTrace();
return;
} catch(NumberFormatException e) {
value=0;
}
System.out.println("value "+value);
}
}

Sinon cela ne
compile pas
car value n'est
pas intitialise

101
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Attraperuneexception
Attention,lesblocscatchsonttests
dansl'ordred'criture!
Uncatchinatteignableestuneerreur
Exception
public class CatchExceptionExample {
public static void main(String[] args) {
int value;
try {
value=...
} catch(Exception e) {
value=1;
} catch(IOException e) { // jamais appel
value=0;
}
System.out.println("value "+value);
}
}

IOException

102

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Nepasattrapertoutcequibouge
Commentpasserdesheuresdbugger;)
public static void aRandomThing(String[] args) {
return Integer.parseInt(args[-1]);
}
public static void main(String[] args) {
...
try {
aRandomThing(args);
} catch(Throwable t) {
// surtout ne rien faire sinon c'est pas drle
}
...
}

viterlescatch(Throwable)oucatch(Exception)!!
103
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Ladirectivethrows
Indiquequ'uneexceptionpeuttrelevedanslecodemaisque
celuicinelagrepas(pasdetry/catch).
public static void f(String author) throws OhNoException {
if ("dan brown".equals(author))
throw new OhNoException("oh no");
}
public static void main(String[] args) {
try {
f(args[0]);
} catch(OhNoException e) {
tryToRecover();
}

throwsn'estobligatoirequepourlesException
pasleserreurs(Error)
nipouroulesruntimes(RuntimeException)
104
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Alorsthrowsoucatch

Sionappelleunemthodequilveuneexceptionnonruntime

catchsil'onpeutreprendresurl'erreuretfairequelquechosede
cohrent(appliqueruneactioncorrective)
Sinonthrowspourpropagerl'exceptionversceluiquiaappella
mthodequiferacequ'ildoitfaire

105
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Unexemple
Lammeexceptionpeuttrecaptureoupropageselonle
contexte
public static Config initConfig(String userName) throws IOException {
Config conf = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(userName+"_config");
conf = new Config(userName);
} catch (FileNotFoundException e) {
// no config file for this user...
e.printStackTrace(System.err);
fis = new FileInputStream("default_config");
conf = new Config(userName);
}
readConfFromInputStream(conf,fis);
fis.close();
return conf;
}

106
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Leblocfinally
Sertexcuteruncodequoiqu'ilarrive
(fermerunfichier,uneconnexion,libreruneressources)
public class FinallyExceptionExample {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
doSomething();
} finally {
lock.unlock()
}
}
}

Lecatchn'estpasobligatoire.
107
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

ExceptionetStackTrace
Lorsdelacrationd'uneexception,laVMcalculele
StackTrace
LeStackTracecorrespondauxfonctionsempiles(danslapile)
lorsdelacration
LecalculduStackTraceestquelquechosedecoteuxen
performance.

108
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lechanagedesexceptions

Ilestpossibled'encapsuleruneexceptiondansuneautre

new Exception("msg", throwable)

new Exception("msg").initCause(throwable)

Permet de lever une exception suffisamment prcise tout en


respectant une signature fixe

109
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lechanagedesexceptions(2)
Commeclosenepeutpasrenvoyerd'Exception,onencapsule
celleci
interface Closable {
public void close() throws IOException;
}
public class DB {
public void flush() throws OhNoException {
throw new OhNoException("argh !");
}
}
public class ExceptionChain implements Closable {
private final DB db=new DB();
public void close() throws IOException {
try {
db.flush();
} catch(OhNoException e) {
throw (IOException)new IOException().initCause(e);
// ou partir de la 1.6
throw new IOException(e);
} } }

110
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lechanagedesexceptions(3)
Excutiondelexempleprcdent:
Exception in thread "main" java.io.IOException
at ExceptionChain.close(ExceptionChain.java:27)
at ExceptionChain.main(ExceptionChain.java:32)
Caused by: fr.umlv.OhNoException: argh !
at DB.fush(ExceptionChain.java:20)
at ExceptionChain.close(ExceptionChain.java:25)
... 1 more

Dsencapsulation:
public static void caller() throws OhNoException {
ExceptionChain chain=new ExceptionChain();
try {
chain.close();
} catch(IOException e) {
Thowable t=e.getCause();
if (t instanceof OhNoException)
throw (OhNoException)t;
...

111

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Lemotclassert
Lemotclassertpermetdes'assurerquelavaleurdune
expressionestvraie
Deuxsyntaxes:
assert test;

assert i==j;

assert test : mesg;

assert i==j:"i not equals to j";

Pardfaut,lesassertnesontpasexcuts,ilfautlancerjavaea
(enableassert)

112
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

assertetAssertionError
Siletestboolenduassertestfaux,laVMlveuneexception
AssertionError
public class AssertExample {
private static void check(List list) {
assert list.isEmpty() || list.indexOf(list.get(0))!=-1;
}
public static void main(String[] args) {
List list=new BadListImpl();
list.add(3);
check(list);
...
}
}

113
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exceptionsetprogrammeur

Leprogrammeurvautiliserdesexceptionspourassurer:

Quesoncodeestbienutilis(prcondition)

Quel'tatdel'objetestbon(prcondition)

Quelecodefaitcequ'ildoitfaire
(postcondition/invariant)

Ilvadeplusgrertouteslesexceptionsquinesontpas
runtime.

114
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exceptionetprog.parcontrat

Habituellement,les:

Prconditionssontutilisespour:

vrifierlesparamtres
NullPointerExceptionetIllegalArgumentException

vrifierl'tatdel'objet
IllegalStateException

Postconditionssontutilisespour:

vrifierquelesoprationsontbienteffectus
assert,AssertionError

Invariantssontutilisespour:

Vrifierquelesinvariantsdel'algorithmesontprservs.assert,
AssertionError

115
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exemple
public class Stack {
public Stack(int capacity) {
array=new int[capacity];
}
public void push(int value) {
if (top>=array.length)
throw new IllegalStateException("stack is full");
array[top++]=value;
assert array[top-1]==value;
assert top>=0 && top<=array.length;
}
public int pop() {
if (top<=0)
throw new IllegalStateException("stack is empty");
int value=array[--top];
assert top>=0 && top<=array.length;
return value;
}
private int top;
private final int[] array;
}

Pr-condition

Post-condition

Invariant

116
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exempleaveccommentaires
Lecodedoittrecomment
public class Stack {
/** This class implements a fixed size
stack of integers.
* @author remi
*/
public class Stack {
/** put the value on top of the stack.
* @param value value to push in the stack.
* @throws IllegalStateException if the stack
is full.
*/
public void push(int value) {
...
}
/** remove the value from top of the stack.
* @return the value on top of the stack.
* @throws IllegalStateException if the stack
is empty.
*/
public int pop() {
117
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

UtilisationdeJavadoc
C:\java-avanc>javadoc src\Stack.java
Loading source file src\Stack.java...
Constructing Javadoc information...
Standard Doclet version 1.5.0-beta3
Building tree for all the packages and classes...
Generating Stack.html...
Generating package-frame.html...
...

118
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Programmationparexception
Dclencheruneexceptionpourl'attraperjusteaprsesttrs
rarementperformant(lacrationdustacktracecotecher)
public class CatchExceptionExample {
public static int sum1(int[] array) { // 5,4 ns
int sum=0;
for(int v:array)
sum+=v;
return sum;
}
public static int sum2(int[] array) { // 7,2 ns
int sum=0;
try {
for(int i=0;;)
sum+=array[i++];
} catch(ArrayIndexOutOfBoundsException e) {
return sum;
}
}
}
119
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

StrackTraceetoptimisation
Pourdesquestionsdeperformance,ilestpossibledeprcrer
uneexception

public class StackTraceExample {


public static void f() {
throw new RuntimeException();
}
public static void g() {
if (exception==null)
exception=new RuntimeException();
throw exception;
}
private static RuntimeException exception;
public static void main(String[] args) {
f(); // 100 000 appels, moyenne()=3104 ns
g(); // 100 000 appels, moyenne()=168 ns
}
}
120
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Appeldemthode
L'algorithmed'appeldemthodes'effectueendeuxtemps
1) A la compilation, on cherche la mthode la mieux adapte
On recherche les mthodes applicables
(celles que l'on peut appeler)
Parmi les mthodes applicables, on recherche
s'il existe une mthode plus spcifique
(dont les paramtres seraient sous-types des
paramtres des autres mthodes)

2) l'excution, on recherche l'implmentation de cette mthode


qui soit la plus prcise tant donn le type rel de l'objet
receveur de l'appel

121
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Mthodesapplicables
Ordredanslarecherchedesmthodesapplicables:
Recherche des mthodes nombre fixe d'argument en fonction
du sous-typage & convertions primitifs
Recherche des mthodes nombre fixe d'argument en permettant
l'auto-[un]boxing
Recherche des mthodes en prenant en
compte les varargs
Dsqu'unedesrecherchestrouveuneouplusieursmthodesla
recherches'arrte

122
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exempledemthodesapplicables
Lecompilateurcherchelesmthodesapplicables
public class Example {
public void add(Object value) {
}
public void add(CharSequence value) {
}
}
public static void main(String[] args) {
Example example=new Example();
for(String arg:args)
example.add(arg);
}

Ici,add(Object)etadd(CharSequence)sontapplicables
123
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Mthodelaplusspcifique
Rechercheparmilesmthodesapplicables,lamthodelaplus
spcifique
public class Example {
public void add(Object value) {
}
public void add(CharSequence value) {
}
}
public static void main(String[] args) {
Example example=new Example();
for(String arg:args)
example.add(arg); // appel add(CharSequence)
}

Lamthodelaplusspcifiqueestlamthodedonttousles
paramtressontsoustypedesparamtresdesautresmthodes
124
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Mthodelaplusspcifique(2)
Siaucunemthoden'estplusspcifiquequelesautres,ilyaalors
ambiguit
public class Example {
public void add(Object v1, String v2) {
}
public void add(String v1, Object v2) {
}
}

public static void main(String[] args) {


Example example=new Example();
for(String arg:args)
example.add(arg,arg);
// reference to add is ambiguous, both method
// add(Object,String) and method add(String,Object) match

Dansl'exemple,lesdeuxmthodesadd()sontapplicables,aucune
n'estplusprcise
125
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Surchargeetauto[un]boxing
Leboxing/unboxingn'estpasprioritaireparrapportlavaleur
actuelle

public static void main(String[] args) {


List list=...
int value=3;
Integer box=value;

list.remove(value); // appel remove(int)


list.remove(box);
// appel remove(Object)
public class List {
public void remove(Object value) {
}
public void remove(int index) {
}
}
126
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

SurchargeetVarargs
Unemthodenombrevariable
d'argumentsn'estpasprioritaireparrapportunemthode
nombrefixed'arguments

public class VarargsOverloading {


private static int min(int... array) {
}
private static int min(double value) {
}

public static void main(String[] args) {


min(2); // appel min(double)
}

127
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

SurchargeetVarargs(2)
Surchargeentredeuxvarargs:
public class VarargsOverloading {
private static void add(Object... array) { }
private static void add(String ... array) { }

public static void main(String[] args) {


add(args[0],args[1]); // appel add(String...)
}

Choixentredeuxvarargsayantmmewrapper:
public class VarargsOverloading {
private static int min(int... array) { }
private static int min(Integer... array) {
}
public static void main(String[] args) {
min(2); // reference to min is ambiguous, both method
// min(int...) and method min(Integer...) match
}
}
128
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Latebinding
Al'excution,onrecherchel'implmentationlaplusprcise
possibledelamthodeidentifielacompilation

public class A {
public static void main(String[] args) {
B b = new B();
C c = new D();
c.m(b);
// Affiche C.m(A)
}
}
class B extends A { }

class C {
public void m(A a) {
System.out.println("C.m(A)");
}
}
class D extends C {
public void m(B b) {
System.out.println("D.m(B)");
}
}
129
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Quelquesmotssurjava.util

Contientdenombreusesclassesutilitaires

Autourdestableaux,descollections...

Contientgalementlaplupartdesclasses,classesabstraiteset
interfacessurlesstructuresdedonnespermettantdestocker
deslments

Listes

Ensembles

Tablesd'associations

Filesd'attente...

130
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Oprationsurlestableaux

Laclassejava.util.Arraysdfinitdesmthodesstatiquesde
manipulationdestableaux:

equals(),hashCode(),toString()...

binarySearch(),sort(),fill()

Pourlacopiedetableau,onutilise:

Object.clone(),System.arraycopy(),Arrays.copyOf()

131
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

equals(),hashCode(),toString()

Lesmthodesequals(),hashCode(),toString()nesontpas
redfiniessurlestableaux
Arrays.equals(),Arrays.hashCode(),Arrays.toString()marchent
pourObjectettouslestypesprimitifs

int[] array=new int[]{2,3,5,6};


System.out.println(array);
System.out.println(Arrays.toString(array));
System.out.println(array.hashCode());
System.out.println(Arrays.hashCode(array));
int[] array2=new int[]{2,3,5,6};
System.out.println(array2.hashCode());
System.out.println(Arrays.hashCode(array2));
System.out.println(array.equals(array2));
System.out.println(Arrays.equals(array,array2));

//
//
//
//

[I@10b62c9
[2, 3, 5, 6]
17523401
986147

//
//
//
//

8567361
986147
false
true
132

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

binarySearch,sort,fill

Dichotomie(letableaudoittretri)
binarySearch(byte[] a, byte key)
...
binarySearch(Object[] a, Object key)
<T> binarySearch(T[] a, T key, Comparator<? super T> c)

Tri
sort(byte[] a)
sort(byte[] a, int fromIndex, int toIndex)
...
<T> sort(T[] a, Comparator<? super T> c)
<T> sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)

Remplissage
fill(boolean[] a, boolean val)
fill(boolean[] a, int fromIndex, int toIndex, boolean val)
...
fill(Object[] a, Object val)
fill(Object[] a, int fromIndex, int toIndex, Object val)
133
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Ordrenaturel

Uneclassepeutspcifierunordrenaturelenimplantant
l'interfaceComparable<T>
public interface Comparable<T> {
int compareTo(T t);
}

Tdoittrelaclassespcifiantl'ordre

ValeurderetourdecompareTo(Tt):

<0 sithisestinfrieurt

==0

>0 sithisestsuprieurt

sithisestgalt

ExempleavecuneclassePerson
134
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

public class Person implements Comparable<Person> {


private final String name, firstName;
private final int year;
public Person(String name, String firstName, int year) {
this.name = name;
this.firstName = firstName;
this.year = year;
}
@Override
public int compareTo(Person p) {
int dName = name.compareTo(p.name);
if(dName != 0)
return dName;
int dFirstName = firstName.compareTo(p.firstName);
if(dFirstName != 0)
compareTo()et
return dFirstName;
return year - p.year;
equals()doivent
}
trecompatibles
@Override public boolean equals(Object o) {
if (!(o instanceof Person))
return false;
Person p=(Person)o;
return name.equals(p.name)
&& firstName.equals(p.firstName)
&& year == p.year;
}
@Override
public String toString() {
135
return "(" + name + " " + firstName
+
"
"
+
year
+
")";
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}

Cetordrenaturelestintrinsque

Ilestdfinidanslaclasse
public class Person implements Comparable<Person> {
// ...
@Override public boolean equals(Object o) { //...
@Override public String toString() { //...
@Override public int compareTo(Person p) { //...
public static void main(String[] args) {
Person[] array = {
new Person("Toto","Titi",1990),
new Person("Toto","Titi",1900),
new Person("Toto","Abdel",1990),
new Person("Toto","Zora",1990),
new Person("Dudu","Titi",1950),
new Person("Paupau","Seb",2010)};
System.out.println(Arrays.toString(array));
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}
}

Affiche:
[(TotoTiti1990),(TotoTiti1900),(TotoAbdel1990),(TotoZora1990),(DuduTiti1950),(PaupauSeb2010)]
[(DuduTiti1950),(PaupauSeb2010),(TotoAbdel1990),(TotoTiti1900),(TotoTiti1990),(TotoZora1990)]
136
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Comparaisonexterne

L'interfacejava.util.Comparatorpermetdespcifierunordre
externe public interface Comparator<T> {
}

int compare(T o1, T o2);

Unordreexterneestunordrevalablejusteunmomentdonn
(riendenatureletd'vident)
Lavaleurderetourdecomparesuitlesmmesrglesque
compareTo
Parexemple,pournotreclassePerson,

L'ordredeladatedenaissance

L'ordredesprnoms,outoutautreordremoinsnaturel...
137
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Peutsedcrireparuneclasseanonyme

Sionabesoindecetteclassequ'unseulendroit...

Affiche:

// ...
public static void main(String[] args) {
Person[] array = { };
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Arrays.sort(array, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.year - o2.year;
}
}) ;
System.out.println(Arrays.toString(array));
}

Ordrenaturel

Ordrede
l'agede
naissance

[(DuduTiti1950),(PaupauSeb2010),(TotoAbdel1990),(TotoTiti1900),(TotoTiti1990),(TotoZora1990)]
[(TotoTiti1900),(DuduTiti1950),(TotoAbdel1990),(TotoTiti1990),(TotoZora1990),(PaupauSeb2010)]
138
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Comparatorinverse

Ilexistedeuxmthodesstaticdanslaclasse
java.util.Collectionsquirenvoieuncomparatorcorrespondant
:

L'inversedel'ordrenaturel

<T> Comparator<T> Collections.reverseOrder();

L'inversed'unordreexternesurT
<T> Comparator<T> Collections.reverseOrder(Comparator<T> c);

139
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

L'APIdescollections

2paquetages:java.util,java.util.concurrent

2hirarchiesd'interfaces:Collection,Map

Collection

Set
SortedSet
NavigableSet

List

Queue

Map
Deque

BlockingQueue

ConcurrentMap SortedMap
NavigableMap
ConcurrentNavigableMap

140

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Design

SparationInterface/implantation
Plusieursimplantationspouruneinterface
permetd'obtenirenfonctiondel'algorithmequel'onveutcrire
lameilleurecomplexit
Deuxclassescontenantdesalgorithmescommuns(mthodes
statiquesdansjava.util.Arraysetjava.util.Collections)

141
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Interfacesdescollections

Dfinitionabstraitedescollections:

Collection

ensemblededonnes

Set

ensemblededonnessansdoublon

SortedSet

ensembleordonnetsansdoublon

NavigableSet

ensembleordonn,sansdoublonavec
prcdentsuivant

List

listeindexeousquentielle

Queue

file(FIFO)dedonnes

BlockingQueue

filebloquantededonnes

Deque

doubleendedqueue

142
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Interfacesdesmaps

Permetd'associerunobjet(lacl)unautre:

Map

associationsansrelationd'ordre

SortedMap

associationavecclstries

NavigableMap

associationavecclstriesavec
suivant/prcdent

ConcurrentMap

associationaccsconcurrent

143
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Iterator

Pourparcourirunecollection,onutiliseunobjetpermettantde
passerenrevuelesdiffrentslmentsdelacollection
java.util.Iterator<E>dfinie:

booleanhasNext()quirenvoievrais'ilyaunsuivant
Enext()quirenvoiel'lmentcourantetdcalesurl'lment
suivant
voidremove()quiretireunlmentprcdemmentenvoypar
next()oprationoptionnelle

144
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

next()etNoSuchElementException

L'oprationnext()estscuriseetlveuneexceptionruntime
NoSuchElementExceptiondanslecasoondpasselafinde
lacollection
(cadsihasNext()renvoiefalse)

public static void main(String[] args) {


Collection<Integer> c=new ArrayList<Integer>();
c.add(3);
Iterator<Integer> it=c.iterator();
it.next();
it.next(); // NoSuchElementException
}

145
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Exempled'iterateur

Conceptuellementuniterateurs'utilisecommeunpointeurque
l'ondcalesurlacollection

public static void main(String[] args) {


Collection<Integer> c=new ArrayList<Integer>();
c.add(3);
c.add(2);
c.add(4);
Iterator<Integer> it=c.iterator();
for(;it.hasNext();) {
System.out.println(it.next()*2);
} // affiche 6, 4, 8
}

146
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Intrtdesitrateurs

Pourleparcoursd'unecollection:

Pastoujourspossibled'effectuerunparcoursavecunindex(Set,
Queue,Deque)
Problmedecomplexit(Listsquential)

LesiterateursoffrentunparcoursgarantienO(n)

147
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Implantationdescollections

Chaquecollectionpossdeuneclasseabstraite

Collection

Queue

Set

List

AbstractCollection

Deque

AbstractQueue

AbstractSet

AbstractList

AbstractSequentialList

148

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Set

Collection

Hirarchiedesensembles

AbstractCollection
Set
AbstractSet
SortedSet
NavigableSet
TreeSet CopyOnWriteArraySet HashSet EnumSet
LinkedHashSet

149

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Queue&Deque

Collection
AbstractCollection
Queue
AbstractQueue
BlockingQueue

Deque

BlockingDeque

LinkedList
ArrayDeque

PriorityQueue
ConcurrentLinkedQueue
150
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

List

Collection

Greleslistessquentielles
etindexes

AbstractCollection
List
AbstractList

RandomAccess

AbstractSequentialList
LinkedList

ArrayList

Vector

CopyOnWriteArrayList

151
StackEtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Map

Associationentreunecletunevaleur
Map
AbstractMap

ConcurrentMap

SortedMap

ConcurrentNavigableMap
ConcurrentHashMap

Hashtable

NavigableMap

IdentityHashMapWeakHashMap

EnumMap

TreeMap
ConcurrentSkipListMap

HashMap
LinkedHashMap
152

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Quelquesmotssurjava.io

2versionsdesentres/sorties

InputStream/OutputStreammanipulentdesoctets
(byteenJava)doncdpendantdelaplateforme
Reader/Writermanipulentdescaractres
(charenJava)indpendantdelaplateformemaisquincessitent
d'indiqueruncodagedescaractres
Onutilisel'uneoul'autredesversionsenfonctiondecequel'on
veutfaire

Lireunfichierdeproprit(Reader)

Ecrireunfichierbinaire(OutputStream)

153
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Entres/sortiesparbyte
InputStream
FileInputStream
ObjectInputStream
FilterInputStream
BufferedInputStream
PushBackInputStream

OutputStream
FileOutputStream
ObjectOutputStream
FilterOutputStream
BufferedOutputStream
PrintOutputStream

154

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

InputStream

Fluxdebyteenentre

Litunbyteetrenvoiecebyteou1sic'estlafinduflux

Lituntableaudebyte(plusefficace)

int read(byte[]b)

int read(byte[]b,intoff,intlen)

Sauteunnombredebytes

abstractintread()

longskip(longn)

Fermeleflux

voidclose()

155
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

InputStreametappelbloquant

Lesmthodesread()surunfluxsontbloquantess'iln'yapas
aumoinsunbytelire
Ilexisteunemthodeavailable()dansInputStreamquiest
senserenvoyerlenombredebytelisiblesansquelalecture
surlefluxsoitbloque
maismauvaislesupportauniveaudesOS
(nepasutiliser)

156
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

InputStreametreadd'unbuffer

Attention,lalectureestunedemandepourremplirlebuffer,le
systmeessayederemplirlebufferaumaximummaispeutne
pasleremplircompltement

Lecturedansuntableaudebytes

intread(byte[]b)
renvoielenombredebyteslus
intread(byte[]b,intoff,intlen)
renvoielenombredebyteslus

157
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

InputStreametefficacit

ContrairementauC(stdio)pardfautenJava,lesentres
sortiesnesontpasbufferiss
Risquedegrosproblmedeperformancesionlitlesdonnes
octetsparoctest
Solution:

Lireutilisantunbuffer

UitliserunBufferedInputStreamquiutiliseunbufferintermdiaire

158
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

InputStreametIOException

Touteslesmthodesdel'inputstreampeuventleverune
IOExceptionpourindiquerque

Ilyaeuuneerreurd'entre/sortie

Quelestreamestfermaprsunappelclose()

Quelethreadcourantatinterrompuenenvoyantune
InterruptedIOException
(cfcourssurlaconcurrence)

Ilfautpenserunfaireunclose()surlestreamdanscecas

159
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

OutputStream

Fluxdebyteensortie:OutputStream

Ecritunbyte,enfaitunintpourqu'ilmarcheavecleread

Ecrituntableaudebyte(plusefficace)

voidwrite(byte[]b)

voidwrite(byte[]b,intoff,intlen)

Demanded'crirecequ'ilyadanslebuffer

abstractvoidwrite(intb)

voidflush()

Fermeleflux

voidclose()

160
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Copiedeflux

Byteparbyte(mal)
public static void copy(Inputstream in,OutputStream out)
throws IOException {

int b;
while((b=in.read())!=-1)
out.write(b);

Parbufferdebytes
public static void copy(Inputstream in,OutputStream out)
throws IOException {

byte[] buffer=new byte[8192];


int size;
while((size=in.read(buffer))!=-1)
out.write(buffer,0,size);

161
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Entres/sortiesparchar
Reader

Writer

FileReader

FileWriter

InputStreamReader
FilterReader
BufferedReader
PushBackReader

OutputStreamWriter
FilterWriter
BufferedWriter
PrintWriter

162

EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Reader

Fluxdecharenentre(mthodebloquante)

Lituncharetrenvoieceluiciou1sic'estlafinduflux

Lituntableaudechar(plusefficace)

int read(char[]b)

int read(char[]b,intoff,intlen)

Sauteunnombredecaractres

abstractintread()

longskip(longn)

Fermeleflux

voidclose()

163
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Writer

Fluxdecaractreensortie

Ecrituncaractre,unintpourqu'ilmarcheavecleread

Ecrituntableaudecaractre(plusefficace)

voidwrite(char[]b)

voidwrite(char[]b,intoff,intlen)

Demanded'crirecequ'ilyadanslebuffer

abstractvoidwrite(intc)

voidflush()

Fermeleflux

voidclose()

164
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Writeretchainedecaractres

UnWriterpossdedesmthodesspcialespourl'criturede
chanedecaractres

EcrireuneString,

voidwrite(Strings)

Voidwrite(Stringstr,intoff,intlen)

UnwriterestunAppendabledonc

EcrireunCharSequence

Writerappend(CharSequencecsq)

Writerappend(CharSequencecsq,intstart,intend)

165
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle

Copiedeflux

Caractreparcaractre(mal)
public static void copy(Reader in,Writer out)
throws IOException {

int c;
while((c=in.read())!=-1)
out.write(c);

Parbufferdecaractres
public static void copy(Reader in,Writer out)
throws IOException {
char[] buffer=new char[8192];
int size;
while((size=in.read(buffer))!=-1)
out.write(buffer,0,size);
}
166
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle