Professional Documents
Culture Documents
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
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
entier
26
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Passagedeparamtre:typerfrence
Danslecasdestypesobjet,c'estlavaleurdelavariable,
(larfrencel'objet)quiesttransmiselamthode
Lesmodificationseffectuesensuivantcetterfrence(e.g.
modificationd'unchampdel'objet)sontrpercutsdansla
mmoireetsontdoncvisiblessurl'argument
#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
Onpeutforcerpourqueacompile=>lveuneexception
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
37
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Variablelocaleconstante
LemotclfinalsignifieenJavaaffectationunique
Ils'appliquesurlavariablequiestdclare
Unobjetouuntableaufinalpeutavoirseschampsouses
lmentsmodifis
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
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(...)
Champconstant
Commepourlesvariableslocales,ilestpossiblededclarerun
champaveclemodificateurfinal.
Celasignifiequ'ildoitavoir
uneaffectationunique
Lecompilateurvrifieque
ilabientinitialis,etce
quelquesoitleconstructeur
maisgalementqu'iln'at
affectqu'uneseulefois
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
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)
// java.lang.Object@7a9664a1
voidjava.io.PrintStream.println(Objectx)
// [I@27a8c4e7
voidjava.io.PrintStream.println(Objectx)
// 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
// 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
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
// 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
Rsolutionduchampaccder
Ladterminationduchampquidoittreaccds'appelle
larsolution
ils'agitdesavoiroonirachercherlavaleurl'excution
Larsolutiondeschampsesteffectueparlecompilateur,en
fonctiondutypedclardelavariablequicontientla
rfrence
// 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
Constructeursetinitialisations
Ilfautvoirleconstructeurd'uneclassecommeunetapedans
l'initialisationdesobjetsdecetteclasse:
Commenceparl'initialisationdeschampsdel'objetentant
qu'instancedelasuperclasse:c'estl'objectifdel'appelsuper(...)
Ensuiteilsecharged'initialiserlesobjetsquiluisontpropres(entant
qu'instancedelaclassedrive)
L'appelsupernepeutpasutiliserdeschampsdontl'existenceoula
valeurdpendraitdel'instancedelaclassedrive...
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
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()
Lamthodeequals()
Delammemanirequ'ilexisteunemthodetoString()dansla
classeObject,quetoutesousclassepeutredfinir
IlexistedansObjectunemthodeequals(Objectobj)dontle
contratestclairementtabliparladocumentation
Pardfaut,elletestel'galitprimitivedesrfrences(mmeobjet)
C'estcellelqu'ilfautredfinir!
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)
@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);
}
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()
// 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();
}
Utilisationd'interface
Les2principauxavantages:
L'algodelamthodetotalSurface(Surfaceable[]array)fonctionne
indpendammentdelaclasserelledesobjetsquisontstocks
dansarray:c'estlesoustypage
Lamthodesurface()effectivementappelesurlesobjets
contenusdansletableauseralaplusprcisepossible,en
fonctiondutypereldecetobjet:c'estlepolymorphisme
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
Peuventdfinirdeschampspubliquesconstants
public interface I {
Tousleschampssont
int field = 10; // equivaut
publicfinalstatic
public final static int field
mmesinonspcifi
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];
Sparerlessupertypes
avecdesvirgules
LetypeSurfaceableAndMoveabledfinitunsoustypedesdeux
typesSurfaceableetdeMoveable(soustypagemultiple)
SurfaceableAndMoveable<Surfaceableet
SurfaceableAndMoveable<Moveable
Cesdeuxderniresn'ontaucunerelationentreelles
86
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Hritagedeclasseetimplmentation
d'interfaces:soustypagemultiple
Uneclassepeuthriterd'uneclasseetimplmenterplusieurs
interfaces
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!
Exempledeclasseabstraite
L'implmentationdelamthodebiggerThan()marcherads
qu'onl'appelerasurunobjet(instance)d'uneclasseconcrte,
puisquecelleciauradonnl'implmentationdelamthode
public abstract class Surfaceable {
surface().
}
public class Rectangle extends Surfaceable {
...
public class Circle extends Surfaceable {
}
...
public class Square extends Surfaceable {
}
private final double side;
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];
}
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];
}
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
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").initCause(throwable)
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;
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
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)
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) {
}
}
Dansl'exemple,lesdeuxmthodesadd()sontapplicables,aucune
n'estplusprcise
125
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Surchargeetauto[un]boxing
Leboxing/unboxingn'estpasprioritaireparrapportlavaleur
actuelle
SurchargeetVarargs
Unemthodenombrevariable
d'argumentsn'estpasprioritaireparrapportunemthode
nombrefixed'arguments
127
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
SurchargeetVarargs(2)
Surchargeentredeuxvarargs:
public class VarargsOverloading {
private static void add(Object... array) { }
private static void add(String ... array) { }
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
//
//
//
//
[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
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> {
}
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
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)
145
EtienneDURISESIPEMLVUniversitParisEstMarnelaValle
Exempled'iterateur
Conceptuellementuniterateurs'utilisecommeunpointeurque
l'ondcalesurlacollection
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 {
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