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
unpeucommetypedefstructenC
Enplusdelamaniredontsontstructursleursobjets,les
classesdfinissentlesactionsqu'ilspeuventprendreencharge
etlamaniredontcesactionsaffectentleurtat
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
Toutevariabledoittredclareavecuntype
Lecompilateurvrifiequelesutilisationsdesvariablessont
compatiblesavecleurtype(notammentviaunsoustypagecorrect)
Lestypessontd'unepartfournisparlelangage,maisgalementpar
ladfinitiondesclasses
estcompil
Enbytecode,i.e.,codeintermdiaireindpendantdelamachine
estinterprt
LebytecodeestinterptparunemachinevirtuelleJava 8
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 9
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Compilation,bytecodeetJVM
Compilationdulangagesource>excutiondubytecode
FichierHelloWorld.java BonjourvouslesIR1!
publicclassHelloWorld{
/*Unstyledecommentaire
surplusieurslignes.*/ Pile Tas
publicstaticvoidmain(String[]args){
//Uncommentairesuruneseuleligne
System.out.println("BonjourvouslesIR1!");
Linux
} JavaVirtualMachine
}
Interprtation/excution
javacHelloWorld.java javaHelloWorld (writeonce,runeverywhere)

FichierHelloWorld.class BonjourvouslesIR1!
Compilation Compiledfrom"HelloWorld.java"

(uneseulefois)
publicclassHelloWorldextendsjava.lang.Object{
publicHelloWorld(); Pile Tas
Code:
0: aload_0
1:
4:
invokespecial
return
#1;//Methodjava/lang/Object."<init>":()V
Windows
JavaVirtualMachine
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
javaHelloWorld 10
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Lebytecode
LelangagesourceJavaestdfiniparlaJLS(JavaLanguage
Specification)diteparSunOracle
Danssasyntaxeetsasmantique
Lecodesourced'uneclassecontenuedansunfichierest
compilaveclacommandejavac
Celaproduituncodeintermdiaire,appelbytecode,quiestle
langagemachinedelamachinevirtuelleJava
Lebytecoded'uneclasseestdestintrechargparune
machinevirtuellequidoitl'excuteraveclacomandejava
Soitparinterprtation,soitparcompilationjustetemps
(justintimeouJIT)
L'argumentestlenomdelaclasse(sansl'extension.class)
11
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Lamachinevirtuelle(JVM)
Sonrleestd'abstrairelecomportementd'unemachine
Pourlerendrele+possibleindpendantdelaplateforme
SoncomportementestdfiniparlaJVMSpecditparSun
Oracle
UneJVMestuneimplmentationdecettespec
Quipeuttreadapteuneplateformed'accueil(Windows,
Linux,Mac...)
QuipeuttredveloppeparSun(HotSpot:opensourceGPL
depuis2006)oupard'autres:IBM,Jikes,etc.
UneJVMtraduitlebytecodedanslelangagemachinedela
plateformed'accueil

12
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Java:unlangageetuneplateforme
DanslatechnologieJava,onadoncbesoin
Dulangagedeprogrammationetducompilateur
Etpleindecommandesbienutiles:jar,javap,javadoc,etc
DelaJVMetdesAPIs(ApplicationProgrammingInterfaces)
regroupesdansuneplateforme:
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
Lacompilationd'unprogrammequicontientuneclasseToto
produiraunfichierToto.class
LadfinitiondutypeToto
IlpeutservirdclarerdesvariablescommeTotot;
Unmoulepourlacrationd'objetsdetypeToto
Celancessiteengnralladfinitiond'unensembledechamps
(fields)dcrivantl'tatd'unobjetdecetypeetd'unensemblede
mthodesdfinissantsoncomportementousesfocntionnalits
ChaqueobjetdelaclasseToto
Disposedesonpropretat(lavaleurdeseschamps)
Rpondaummecomportement(vialesmthodesdelaclasse) 16
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Structured'uneclasse
Uneclasseestdfinieparsonnometsonpackage
d'appartenance(ex:java.lang.String)
Enl'absencededirective,lesclassessontdansunpackagedit
pardfaut(i.e.,pasdepackge).
Uneclassepeutcontenirtroissortesdemembres
Deschamps(fields)ouattributs
Desmthodes(methods)etconstructeurs
Desclassesinternes
Lesmembresstatiques(static)sontditsmembresdeclasse
Ilssontdfinissurlaclasseetnonsurlesobjets
Lesmembresnonstatiques(oud'instance)nepeuventexister
sansunobjet 17
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
public class Pixel {
public final static int ORIGIN = 0;
private int x; Exemple
private int y;
public Pixel(int x, int y) {
Constante
this.x = x;
this.y = y;
}
public void reset() {
Champs
x = ORIGIN;
y = ORIGIN;
} Constructeur
public void printOnScreen() {
System.out.println("("+x+","+y+")"); Mthodes
} 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) {
Pixel p0 = new Pixel(0,0); Variableslocales
Pixel p1 = new Pixel(1,3); lamthode
p1.printOnScreen(); // (1,3) mainet
System.out.println(same(p0,p1)); // false objetsdela
p1.reset();
System.out.println(same(p0,p1)); // true classePixel
} 18
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}
Lesobjetssontmanipulsviades
rfrences(sortesd'adressesmmoire)
ClassePixel
Lorsquelamthode
p1.reset(); #s ORIGIN=0

estappele,lecodedela constructeur

Chaqueobjetconnaitsaclasse
mthodedfinidansla mthodes
classecomme main

public void reset() {


x = ORIGIN;
y = ORIGIN; Pixelp1 #1
} #1 @classPixel

Pixelp2 #2 x=1 0
estexcutsurlapileavecles
rfrences#1laplacedep1 y=3 0
et#slaplacedeORIGIN
#2 @classPixel

public void reset() { x=0


#1.x = #s;
Cequiapoureffetde y=0
#1.y = #s;
} mettrep1.xetp1.y0 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; #1 @classPixel
p1=newPixel(1,3); #1 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.
#1 @classString
Stringchaine="toto"; #1
#2
DiffrentduC!
...
Enplus,lesStringsontconstantes
#2 t o t o \n
soitdestypescachs
Tableaudetypesprimitifsoud'autrestypesobjets
#1 @classint[]
int[]tab={3,5,7,9}; #1 length=4
String[]args; null #2 @classPixel[] 3
Pixel[]array=newPixel[2]; #2 length=2 5
null 7
soitdestypesdfinisparl'utilisateur
null 9
Pixelp=newPixel(0,0); 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 5 6


i++;
}

public static void main(String[] args) {


int entier = 5;
m1(entier); entier 5
System.out.println(entier); // 5
}

26
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Passagedeparamtre:typerfrence
Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode
Lesmodificationseffectuesensuivantcetterfrence(e.g.
modificationd'unchampdel'objet)sontrpercutsdansla
mmoireetsontdoncvisiblessurl'argument

#1 @classBox
public static void m2(Box b) { b #1 field=5
b.field++;
} 6
public static void main(String[] args) {
Box box = new Box(); box #1
box.field = 5;
m2(box); class Box {
System.out.println(box.field); // 6 int field;
} } 27
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Passagedeparamtre:typerfrence
Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode
Enrevanche,lamodificationdelarfrenceellemmeest
sanseffetsurl'argument(c'enestunecopie)

#2 @classBox

field=6
tmp #2
public static void m3(Box b) {
Box tmp = new Box();
tmp.field = b.field+1; #1 @classBox
b = tmp; b #1 #2
field=5
}
public static void main(String[] args) {
Box box = new Box();
box.field = 5; box #1
m3(box); class Box {
System.out.println(box.field); // 5 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
Demandeparl'oprateurnew
Larcuprationdelaplaceoccupeparlesobjetsmorts
(devenusinaccessibles)
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
destinationdesclasses
Sparerlessourcesdesclasses
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
Laclasseseraaccessibledepuistouteslesclassesdumme
paquetagequ'elle(onparlequelquefoisdevisibilitde
paquetage)
publicclassMyClass
Laclasseseraaccessibleden'importeo(pourvuqu'onindique
sonnomdepaquetagecompletouqu'onutiliseladirective
import)

Cettenotiond'accessibilitsertdfinirdescomposantsde
plusgrandegranularitquelesclasses,
Permetdelimiterl'accs
Peutviterdesconflitsdenoms 35
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Lesmembres:champsetmthodes
Dansuneclasse,ilyagrossirement
Unezoneavecdesdclarationsdechamps
Ilsdfinissentcequiserastockdanschaqueobjetdecetteclasse
Unezoneavecdesdclarationsdemthodes
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:
public class Pixel {
p.x,p0.sameAs(p1); private int x;
private int y;
Lecompilateurregarde public Pixel(int x, int y) {
letypedclardela this.x = x;
this.y = y;
variable(icipoup0)et }
vrifiequelemembre public boolean sameAs(Pixel p) {
return (this.x==p.x) && (this.y==p.y);
(icixousameAs)existe. }
public static void main(String[] args) {
Lecompilateurvrifie Pixel p0 = new Pixel(0,0);
galementlesdroits Pixel p1 = new Pixel(1,3);
boolean b = p0.sameAs(p1); // false
d'accessibilit }
}
Unchampetune
mthodepeuventavoir class OtherClass {
public static void main(String[] args) {
lemmenom Pixel p0 = new Pixel(0,0);
p.sameAs(p); // true
thisreprsente p0.x = 1; // error: x has private
l'instancecourante } // access in Pixel 41
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
class Box {
constructeurexplicitement private int field;
public static void main(String[] a){
dfini,lecompilateurajoute Box b = new Box();
unconstructeurpublic }
}
sansparamtre 43
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Appelunautreconstructeur
Plusieursconstructeurspeuventcohabiterdanslammeclasse
Ilsonttypiquementdesrlesdiffrentsetoffrentdesservices
complmentairesl'utilisateur,parexemple:
newPixel(1,3)creunpixelaveclescoordonnesexplicites
newPixel()creunpixelaveclescoordonnesl'origine
newPixel(1)creunpixelsurladiagonale(x==y),etc.
public class Pixel {
Quandc'estpossible,ilest private int x;
prfrablequ'ilyenaitun private int y;
leplusgnraletque public Pixel(int x, int y) {
this.x = x;
lesautresyfassentappel this.y = y;
}
Pluttquededupliquerlecode public Pixel() {
dansplusieursconstrcuteurs this(0,0);
}
L'appelunautreconstructeurdela public Pixel(int v) {
mmeclassesefaitparthis(...) this(v, v); 44
}
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}
Champconstant
Commepourlesvariableslocales,ilestpossiblededclarerun
champaveclemodificateurfinal.
public class Pixel {
Celasignifiequ'ildoitavoir private final int x;
uneaffectationunique private int y;
public Pixel(int x, int y) {
Lecompilateurvrifieque this.x = x;
this.y = y;
ilabientinitialis,etce }
quelquesoitleconstructeur public Pixel() {
// error: final field x may not
maisgalementqu'iln'at // have been initialized
affectqu'uneseulefois }
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
Liauxclasses,auxinterfaces,auxclassesabstraites,l'hritage...
Surlestypesprimitifs,onparledeconversionimplicite
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
estappele.CQFD. 52
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 { x:int
private int x; y:int
private int y;
public void moveTo(int newX, int newY) { moveTo(int,int)
this.x = newX;
this.y = newY;
}
} ColoredPixel
public class ColoredPixel extends Pixel {
private byte[] rgb; rgb:byte[]
public byte getRed() { return rgb[0]; } getRed():byte
public byte getGreen() { return rgb[1]; }
getGreen():byte
public byte getBlue() { return rgb[2]; }
} getBlue():byte 57
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Quesontlesobjetsdelaclassedrive?
Toutobjetd'uneclassedriveestconsidrcommetant
avanttoutunobjetdelaclassedebase
Unpixelcolorestavanttoutunpixel
Toutobjetd'uneclassedrivecumuleleschampsdrivs
danslaclassedebaseavecceuxdfinisdanssapropreclasse
IlyaunintxetunintydansunobjetdelaclasseColoredPixel

public static void main(String[] args) { #1 @classPixel


Pixel p = new Pixel(); #1 x:1
p.moveTo(1, 1);
y:1
ColoredPixel cp = new ColoredPixel(); #2
cp.moveTo(2, 2); #2 @classColoredPixel
x:2
cp.getRed(); // NullPointerException 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 { public class ColoredPixel extends Pixel {
int x; private byte[] rgb;
private int y; 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
class A {
super,c'estthisvuavec int x = 1;
letypedelasuperclasse }

super.super.xn'existepas... class B extends A {


String x = "zz";
Pasplusqueref.super }
niref.super.x... class C extends B {
boolean x = true;
Enrevanche,le public static void main(String[] args) {
transtypage(cast) C c = new C();
permetd'accderen System.out.println(c.x); // true
System.out.println(((B)c).x); // zz
changeantletypedclar System.out.println(((A)c).x); // 1
delarfrenceref } 61
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
}
Transtypage,typedclarettyperel
Letranstypagederfrenceestlefaitdeconsidrer
explicitement(forcer)unerfrencecommetantd'untype
donn(quin'estpasncessairementletypedel'objet
accessibleviacetterfrence)
Lamachinevirtuellevrifiera,l'excution,queletypeen
questionestbiencompatibleetquevoircetterfrencecomme
tantdecetypelestpossible;danslecascontraire,
l'excutionprovoqueuneClassCastException
class A { } Object o;
class B extends A { } if(Math.random() > 0.5)
class C extends B { } o = "toto";
else
B b = new B(); o = new Object();
A a = b; String s = (String) o;
// B b2 = a; // incompatible types // Compile toujours mais a une
B b2 = (B) a; // OK // chance sur deux de lever une
C c = (C) a; // ClassCastException // ClassCastException...
62
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
L'oprateurinstanceof
Ilestpossibled'assureruntranstypagesansexceptionen
utilisantl'oprateurxinstanceofT
xdoittreune(variablecontenantune)rfrenceounull
Tdoitrerpsenteruntype
Lersultatvauttruesixn'estpasnullets'ilpeuttreaffectdans
TsansClassCastException;sinonc'estfalse.
class A { }
class B extends A { } Object o; String s;
class C extends B { } if(Math.random()>0.5)
o = "toto";
else
A ab = null; o = new Object();
System.out.println(ab instanceof A); // false if (o instanceof String)
ab = new B(); s = (String) o; // OK...
System.out.println(ab instanceof A); // true
System.out.println(ab instanceof B); // true
System.out.println(ab instanceof C); // false 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() { ... } // redefinition
void m2(int a) { ... } // surcharge
@Override ColoredPixel m3() { ... } // redefinition
@Override void m4(Pixel p) { ... } // redefinition
void m4(ColoredPixel p) { ... } // 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!
// Il faut utiliser instanceof... 71
} EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Lamthodeequals()
Delammemanirequ'ilexisteunemthodetoString()dansla
classeObject,quetoutesousclassepeutredfinir
IlexistedansObjectunemthodeequals(Objectobj)dontle
contratestclairementtabliparladocumentation
Pardfaut,elletestel'galitprimitivedesrfrences(mmeobjet)
C'estcellelqu'ilfautredfinir!
public class Pixel { public class ColoredPixel extends Pixel {
private int x, y; private byte[] rgb;
// ... @Override
@Override public boolean equals(Object obj) {
public boolean equals(Object obj) { if(!(obj instanceof ColoredPixel))
if(!(obj instanceof Pixel)) return false;
return false; ColoredPixel cp = (ColoredPixel) obj;
Pixel p = (Pixel) obj; return super.equals(obj) &&
return (x==p.x) && (y==p.y); rgb[0]==cp.rgb[0] &&
} rgb[1]==cp.rgb[1] &&
} rgb[2]==cp.rgb[2];
} 72

} EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Lecontratdelamthodeequals()
Dfinitunerelationd'quivalencesurlesrfrencesnonnulles
Reflexive
Pourtouterfrencexnonnulle,x.equals(x)vauttrue
Symtrique
Pourtoutesrfrencesxetynonnulles,x.equals(y)ssiy.equals(x)
Transitive
Pourtoutesrfrencesx,yetznonnulles, Bofbof...dansnotrecasde
six.equals(y)ety.equals(z)alorsx.equals(z) ColoredPixel,c'estlimite...
Cohrente
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!
Iltesteuniquementlescoordonnes...
DemandezunColoredPixelmagentaen(2,2)s'ilestgalun
Pixelen(2,2),ildiraquenon!
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
classenepeuventpastregaux
DansPixel:
@Override
public boolean equals(Object obj) {
instanceofnesuffitplus if(obj.getClass() != Pixel.class)
return false;
Ilfautconnatrelaclasse Pixel p = (Pixel) obj;
return (x==p.x) && (y==p.y);
exactedel'objet( }
runtime) @Override
public boolean equals(Object obj) {
MthodeClassgetClass() if(obj.getClass() != ColoredPixel.class)
delaclasseObject return false;
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 DansColoredPixel:
System.out.println(o2.equals(o1)); // false 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()
HashSet set = new HashSet();
set.add(zero); ethashCode()

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

System.out.println(zero.hashCode()); // 1522065175
System.out.println(def.hashCode()); // 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 {
abstractpublic double surface(); // equivaut
public abstract double surface();
mmesinonspcifi }
Peuventdfinirdeschampspubliquesconstants
Tousleschampssont public interface I {
int field = 10; // equivaut
publicfinalstatic public final static int field = 10;
Lecompilateurajoute }
lesmotcls
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 public interface Paintable extends Surfaceable {
double paint(byte[] color, int layers);
}
LetypePaintableestunsoustypedeSurfaceable
Surfaceable[] array = new Surfaceable[3]; // On peut crer des tableaux!
Paintable p = null;
array[0] = p; // OK: Paintable < Surfaceable
p = array[1]; // Cannot convert from Surfaceable to Paintable
Sparerlessupertypes public interface SurfaceableAndMoveable
avecdesvirgules 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
Dfiniesavecleurcode
Lemodificateurdevisibilitnepeutpastreautrechoseque
public
Mmesionamislavisibilitpardfautdansl'interface,le
compilateuryajoutepublicabstract
Quesepassetilsiplusieursmthodesdemmenometmme
signaturedediffrentesinterfacesdoiventtreimplmentes
danslammeclasse?

88
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Pourquoipashriterdeplusieursclasses
Object
Acausedeschamps(diamant)
Quipourraientprovenir A B
#1 @classC
dedeuxclassesdont x:int x:int
x=1 ?
onhriteetquidevraient
x=2 ?
coexisterdansun C
x=3 ?
mmeobjet! x:int Cc #1
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
Lemotclabstractfaitqu'ellen'estpasinstanciable 91
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))
bigger = array[i]; Maisjepeuxcrireuncodepour
} 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
surface(). public abstract class Surfaceable {
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 public class CatchExceptionExample {


public static void main(String[] args) {
d'attraperlesexceptions 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");
Sinon cela ne
e.printStackTrace(); compile pas
return;
} catch(NumberFormatException e) {
car value n'est
value=0; pas intitialise
}
System.out.println("value "+value);
}
}

101
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Attraperuneexception

Attention,lesblocscatchsonttests
dansl'ordred'criture!
Uncatchinatteignableestuneerreur
Exception
public class CatchExceptionExample {
public static void main(String[] args) {
int value;
try {
value=... IOException
} catch(Exception e) {
value=1;
} catch(IOException e) { // jamais appel
value=0;
}
System.out.println("value "+value);
}
}
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]; Pr-condition
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; Post-condition
}
public int pop() {
if (top<=0)
throw new IllegalStateException("stack is empty");
int value=array[--top];
assert top>=0 && top<=array.length;
return value; Invariant
}
private int top;
private final int[] array;
}

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 C {
} public void m(A a) {
class B extends 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); // [I@10b62c9
System.out.println(Arrays.toString(array)); // [2, 3, 5, 6]
System.out.println(array.hashCode()); // 17523401
System.out.println(Arrays.hashCode(array)); // 986147
int[] array2=new int[]{2,3,5,6};
System.out.println(array2.hashCode()); // 8567361
System.out.println(Arrays.hashCode(array2)); // 986147
System.out.println(array.equals(array2)); // false
System.out.println(Arrays.equals(array,array2)); // 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 sithisestgalt
>0 sithisestsuprieurt
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)
return dFirstName; compareTo()et
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...
// ...
public static void main(String[] args) {
Person[] array = { };
Arrays.sort(array); Ordrenaturel
System.out.println(Arrays.toString(array));
Arrays.sort(array, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) { Ordrede
return o1.year - o2.year; l'agede
}
naissance
}) ;
System.out.println(Arrays.toString(array));
}
}
Affiche:

[(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 Map

Set List Queue Deque ConcurrentMap SortedMap

SortedSet BlockingQueue NavigableMap

NavigableSet 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

Hirarchiedesensembles
Collection

AbstractCollection
Set

AbstractSet
SortedSet

NavigableSet

TreeSet CopyOnWriteArraySet HashSet EnumSet

LinkedHashSet 149
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Queue&Deque

Collection

AbstractCollection
Queue
AbstractQueue
BlockingQueue Deque

LinkedList PriorityQueue
BlockingDeque
ArrayDeque ConcurrentLinkedQueue
150
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
List

Greleslistessquentielles
Collection etindexes

AbstractCollection
List
AbstractList RandomAccess

AbstractSequentialList

LinkedList ArrayList Vector CopyOnWriteArrayList

StackEtienneDURISESIPEMLVUniversitParisEstMarnelaValle
151
Map
Associationentreunecletunevaleur

Map
AbstractMap
ConcurrentMap SortedMap

ConcurrentNavigableMap Hashtable IdentityHashMapWeakHashMap


EnumMap HashMap
NavigableMap
ConcurrentHashMap
TreeMap LinkedHashMap
152
ConcurrentSkipListMap 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 OutputStream

FileInputStream FileOutputStream

ObjectInputStream ObjectOutputStream

FilterInputStream FilterOutputStream

BufferedInputStream BufferedOutputStream

PushBackInputStream PrintOutputStream 154


EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
InputStream
Fluxdebyteenentre
Litunbyteetrenvoiecebyteou1sic'estlafinduflux
abstractintread()
Lituntableaudebyte(plusefficace)
int read(byte[]b)
int read(byte[]b,intoff,intlen)
Sauteunnombredebytes
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
abstractvoidwrite(intb)
Ecrituntableaudebyte(plusefficace)
voidwrite(byte[]b)
voidwrite(byte[]b,intoff,intlen)
Demanded'crirecequ'ilyadanslebuffer
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 OutputStreamWriter

FilterReader FilterWriter

BufferedReader BufferedWriter

PushBackReader PrintWriter 162


EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Reader
Fluxdecharenentre(mthodebloquante)
Lituncharetrenvoieceluiciou1sic'estlafinduflux
abstractintread()
Lituntableaudechar(plusefficace)
int read(char[]b)
int read(char[]b,intoff,intlen)
Sauteunnombredecaractres
longskip(longn)
Fermeleflux
voidclose()

163
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Writer
Fluxdecaractreensortie
Ecrituncaractre,unintpourqu'ilmarcheavecleread
abstractvoidwrite(intc)
Ecrituntableaudecaractre(plusefficace)
voidwrite(char[]b)
voidwrite(char[]b,intoff,intlen)
Demanded'crirecequ'ilyadanslebuffer
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

Vous aimerez peut-être aussi