Upload
ledien
View
215
Download
0
Embed Size (px)
Citation preview
1PR22017-2018
PROGRAMMAZIONE23.PrimipassiinJava
WhyJava?
• Java offre moltissime cose utili – Usato a livello industriale – Librerie vastissime – Complicato ma necessariamente complicato
• Obiettivo di Programmazione II – Presentare le caratteristiche essenziali della programmazione
Object-Oriented – Illustrare come le tecniche OO aiutano nella soluzione di
problemi – Sperimentare con Java
2PR22017-2018
Ogge.eclassi
• Ogge$o:insiemestru:uratodivariabilidiistanza(stato)emetodi(operazioni)
• Classe:modello(template)perlacreazionediogge.
OBJECT
STATO(NASCOSTO)
METODI(PUBBLICI)
3PR22017-2018
Ogge.eclassi
• Ladefinizionediunaclassespecificao Tipoevaloriinizialidellostatolocaledegliogge.
(levariabilidiistanza)o Insiemedelleoperazionichepossonoessereeseguite(metodi)
o Costru:ori(unoopiù):codicechedeveessereeseguitoalmomentodellacreazionediunogge:o
• Ogniogge:oèunaistanzadiunaclasseepuò(opzionalmente)implementareunainterfaccia
4PR22017-2018
Ogge.eclassi
5PR22017-2018
Ogge.eclassi
6PR22017-2018
Unprimoesempio
publicclassCounter{//nomedellaclasseprivateintcnt;//lostatolocale//metodocostru:orepublicCounter(){cnt=0;}//metodopublicintinc(){cnt++;returncnt;}//metodopublicintdec(){cnt--;returncnt;}}
DICHIARAZIONEDICLASSE
public=visibilefuoridell’ogge:oprivate=visibilesoloall’internodell’ogge:o
7PR22017-2018
EsecuzionediJava
UnprogrammaJavaèmandatoinesecuzioneinvocandounmetodospecialechiamatomain
publicclassFirst{publicstaccvoidmain(String[]args){Counterc=newCounter();System.out.println(c.inc());System.out.println(c.dec());}}
8PR22017-2018
Compilareedeseguire
prompt$javacCounter.java
VienecreatoilbytecodeCounter.classprompt$javacFirst.java
VienecreatoilbytecodeFirst.classprompt$javaFirst10prompt$
9PR22017-2018
CosaèilJavabytecode?
• ÈillinguaggiodellaJavaVirtualMachine• Load&store(e.g.aload_0,istore)• Arithmecc&logic(e.g.ladd,fcmpl)• Objectcreacon&manipulacon(new,puqield)• Operandstackmanagement(e.g.swap,dup2)• Controltransfer(e.g.ifeq,goto)• Methodinvocacon&return(e.g.invokespecial,areturn)• Visualizzabileconjavap!!
– Eancheeditabile:adesempiol’appenarilasciatoBCEL
10PR22017-2018
Creareogge.
DichiarareunavariabiledicpoCounterInvocareilcostru:orepercrearel’ogge:odicpoCounter
Counterc;c=newCounter()
Soluzionealternacva:faretu:oinunpasso!!
Counterc=newCounter();
11PR22017-2018
Costru:oriconparametri
publicclassCounter{//nomedellaclasseprivateintcnt;//lostatolocale//metodocostru:orepublicCounter(intv0){cnt=v0;}//metodopublicintinc(){cnt++;returncnt;}//metodopublicintdec(){cnt--;returncnt;}}
DICHIARAZIONEDICLASSE
public=visibilefuoridell’ogge:oprivate=visibilesoloall’internodell’ogge:o
12PR22017-2018
Costru:oriconparametri
publicclassFirst{publicstaccvoidmain(String[]args){Counterc=newCounter(25);System.out.println(c.inc());System.out.println(c.dec());}}
13PR22017-2018
Stru:uremutabili
Ognivariabilediogge:oinJavadenotaunaenctàmutabile
CounterC;C=newCounter(5);C=newCounter(10);C.inc();//qualeèilvaloredellostatolocale?
14PR22017-2018
IlvaloreNULL
Ilvalorenullègenericoepuòessereassegnatoaqualunquevariabiledicporiferimento
Counterc=cercaContatore();if(C==null)System.out.println("contatorenontrovato");
A:enzione:comeinC=singolo:assegnamento==doppio:testdiuguaglianza
Resctuisceunogge:odicpoCounteronullsenonlotrova
15PR22017-2018
Nelloheap…
• Gliogge.Javasonomemorizzacnelloheap• Nelloheapvengonoallocate
o variabilidiistanza,quandosicreaunogge:oo variabilistacche(odiclasse),quandoècaricataunaclasse
• Levariabiliallocatenelloheapsonoinizializzatedalsistemao con0(zero),perlevariabilidicpinumericio confalse,perlevariabilidicpobooleano connull,perlevariabilidicporiferimento
• Levariabilidichiaratelocalmenteinmetodi/costru:orinonvengonoinizializzateperdefault:bisognaassegnarelorounvaloreprimadileggerle
16PR22017-2018
Statolocale
• Modificatori:meccanismopercontrollarel’accessoallostatolocaledell’ogge:oo Public:visibile/accessibiledaognipartedelprogrammao Private:visibile/accessibilesoloall’internodellaclasse
• DesignPa:ern(suggerimentogrossolano)o Tu:elevariabilidiistanza:privateo Costru:oriemetodi:public
17PR22017-2018
Riassunto…
• Il“frammentoimperacvo”diJavarichiamadavicinolasintassidelC
– intx=3; //dichiaraxeloinizializzaalvalore3– inty;//dichiarayeglivieneassegnatoilvaloredidefault0– y=x+3;//assegnaayilvaloredixincrementatodi3
λ //dichiaraunogge:oCdicpoCountereloinizializzaconλ //ilcostru:oreλ Counterc=newCounter();
λ Counterd;//dichiaradeilsuovaloredidefaultènull
λ d=c;//assegnaadl’ogge:odenotatodac=>Aliasing!
18PR22017-2018
Alcunicomandi…
• Condizionali– if(cond)stmt1;– if(cond){stmt1;stmt2;}– if(cond){stmt1;stmt2;}else{stmt3;stmt4;}
• Iteracvi– while(exp){stmt1;stm2;}– do{stmt1;stm2;}unYl(exp);– for(init;term;inc}{stmt1;stm2;}
19PR22017-2018
Demo
classForDemo{publicstaccvoidmain(String[]args){
for(inti=1;i<11;i++)System.out.println("Countis:"+i);}}
classWhileDemo{publicstaccvoidmain(String[]args){ intcount=1; while(count<11){ System.out.println("Countis:"+count);
count++; }}}
20PR22017-2018
Demo2
classBreakDemo{publicstaccvoidmain(String[]args){int[]arrayOfInts={32,87,3,589,12,1076,2000,8,622,127};inti,searchfor=12;booleanfoundIt=false;for(i=0;i<arrayOfInts.length;i++){ if(arrayOfInts[i]==searchfor){ foundIt=true; break; }}if(foundIt)System.out.println("Found"+searchfor+"atindex"+i);elseSystem.out.println(searchfor+"notfoundinthearray");}}
21PR22017-2018
Tipiprimicvi
• int//standardintegers• byte,short,long//otherflavorsofintegers• char,float//unicodecharacters• double//floa;ng-pointnumbers• boolean//trueandfalse• Stringnonèun+poprimi+vo(maquasi…)
22PR22017-2018
InterfacceinJava
23PR22017-2018
TipiinJava
• Javaèunlinguaggiofortementecpato(ognienctàhauncpo)
• Leclassidefinisconoilcpodegliogge.o Classecomedefinizionedelcontra:odiusodegliogge.cheappartengonoaquellaclasse
• Javaprevedeunulterioremeccanismoperassociareilcpoagliogge.:leinterfacce
24PR22017-2018
JavaInterface
• Unainterfacciadefinisceilcpodegliogge.inmododichiaracvo:nonvienepresentatoilde:agliodellaimplementazione
• Interfaccia=Contra:od’usodell’ogge:o
25PR22017-2018
Esempio
publicinterfaceDisplaceable{publicintgetX();publicintgetY();publicvoidmove(intdx,intdy);}
Nome
Dichiarazionedeicpideimetodi
26PR22017-2018
PR22017-2018
Unaimplementazione…
publicclassPointimplementsDisplaceable{privateintx,y;publicPoint(intx0,inty0){ x=x0; y=y0;}publicintgetX(){returnx;}publicintgetY(){returny;}publicvoidmove(intdx,intdy){ x=x+dx; y=y+dy;}}
Devonoessereimplementactu.imetodidell’interfaccia
27
Un’altra!!
classColorPointimplementsDisplaceable{privatePointp;privateColorc;ColorPoint(intx0,inty0,Colorc0){ p=newPoint(x0,y0);c=c0;}publicvoidmove(intdx,intdy){ p.move(dx,dy);}publicintgetX(){returnp.getX();}publicintgetY(){returnp.getY();}publicColorgetColor(){returnc;}}
Ogge.cheimplementanolastessainterfacciapossonoaverestatolocaledifferente
Delegaall’ogge:opoint
Numeromaggioredimetodidiquellipreviscdalcontra:o
28PR22017-2018
Tipieinterfacce
• Dichiararevariabilichehannoilcpodiunainterfacce
Diplaceabled; d=newPoint(1,2); d.move(-1,1)
• Assegnareunaimplementazione
d=newColorPoint(1,2,newColor("red")); d.move(-1,1);
29PR22017-2018
So:o-cpi
• Lasituazionedescri:aillustrailfenomenodelsubtyping(so:o-cpo):uncpoAèunso:o-cpodiBseunogge:odicpoAingradodisoddisfaretu.gliobblighichepotrebberoessererichiescdall’interfaccia(ounaclasse)B
• Intuicvamente,unogge:odicpoApuòfarequalsiasicosa
chepuòfare(unogge:odicpo)B• Maggioride:agliinseguito(quandoColorPointpotrà
essereso$o-classediPoint!!)
30PR22017-2018
Interfaccemulcple
publicinterfaceArea{publicdoublegetArea();}
publicclassCircleimplementsDisplaceable,Area{privatePointcenter;privateintrad;
publicCircle(intx0,inty0,intr0){ rad=r0;center=newPoint(x0,y0);}
publicdoublegetArea(){returnMath.PI*rad*rad;
}
publicintgetRadius(){returnrad;}publicgetX(){returncenter.getX();}publicgetY(){returncenter.getY();}publicmove(intdx,intdy){center.move(dx,dy);}}
31PR22017-2018
Esempid’uso
Circlec=newCircle(10,10,5);Displaceabled=c;Areaa=c;Rectangler=newRectangle(10,10,5,20);d=r;a=r;
32PR22017-2018
MetodistaYci
33PR22017-2018
Unaprimaanalisi
• Alcunecara:eriscchediJavarichiedonounaconoscenzade:agliatadellelibrerie
• SistemidisupportofornisconomolcstrumencperprogrammareconJava(Eclipseèunesempiosignificacvo)
• Lanostrarisposta:affroncamoilproblemainterminidiproblemsolving
34PR22017-2018
Espressionivs.Comandi
• Javahasiaespressionichecomandi!o Leespressioniresctuisconovalorio Icomandioperanoviasideeffect
35PR22017-2018
Metodistacci
publicclassMax{publicstaccintmax(intx,inty){if(x>y)returnx;elsereturny;}publicstaccintmax3(intx,inty,intz){returnmax(max(x,y),z);}}
publicclassTest{publicstaccvoidmain(String[]args){System.out.println(Max.max(3,4));}}
similealladefinizionediunafunzione
36PR22017-2018
Metodistacci
• Sonometodiindipendencdall’ogge:o(valgonopertu.gliogge.dellaclasse)– Nonpossonodipenderedaivaloridellevariabilidiistanza
• Quandodevonoessereusac?– PerlaprogrammazionenonOO– Perilmetodomain
• Imetodinonstaccisonoenctàdinamiche!– Devonoconoscereelavoraresullevariabilidiistanzadegliogge.
37PR22017-2018
Metodistacci
• Imetodistaccisono“funzioni”definiteglobalmente• Variabilidiistanzasta;csonovariabiliglobaliaccessibilitramiteilnomedellaclasse
• Variabilidiistanzastacchenonpossonoessereinizializzatenelcostru:oredellaclasse(datochenonpossonoessereassociateaogge.istanzadellaclasse)
38PR22017-2018
Esempio
publicclassC{privatestaccintbig=23;publicstaccintm(intx){returnbig+x;//OK}}
39PR22017-2018
publicclassC{privatestaccintbig=23;privateintnonStaccField;privatevoidsetIt(intx){nonStaccField=x+x;}publicstaccintm(intx){setIt(x); //Errore:unmetodosta;cnonpuò
//accedereametodinonsta;ciea //variabilidiistanzanonsta;che
}}
Quindi?
• Imetodistaccisonouclizzacperimplementarequellefunzionalitàchenondipendonodallostatodell’ogge:o
• EsempisignificacvinellaAPIMathcheforniscefunzionimatemacchecomeMath.sin
• Altriesempiosonodacdallefunzionidiconversione:Integer.toStringeBoolean.valueOf
40PR22017-2018
JavaDemo
41PR22017-2018
42
ListeinJava(àlaOCaML)interfaceStringList{publicbooleanisNil();publicStringhd();publicStringListtl();}
classConsimplementsStringList{privateStringhead;privateStringListtail;publicCons(Stringh,StringListt){head=h;tail=t;}publicbooleanisNil(){returnfalse;}publicStringhd(){returnhead;}publicStringListtl(){returntail;}}
classNilimplementsStringList{publicbooleanisNil(){returntrue;}publicStringhd(){returnnull;}publicStringListtl(){returnnull;}}
Operaresuliste
StringListx=newCons(”Cowa",newCons(“Bunga",newNil()))
• Regolepragmacchegeneralio Perognicpodidatodefinirelarelacvainterfacciao Aggiungereunaclasseperognicostru:ore
43PR22017-2018
44PR22017-2018
Operaresuliste
• Conricorsione…
• …oiterazione!
publicstaccintnumberOfStrings(StringListpl){if(pl.isNil()){return0;}else{return1+numberOfStrings(pl.tl());}}
publicstaccintnumberOfStrings(StringListpl){intcount=0;StringListcurr=pl;while(!Curr.isNil()){count=count+1;curr=curr.tl();}returncount;}
Usarevariabilidiistanzapervalue-orientedprogramming
Higher-order?!?
publicstaccStringListMap(???f,StringListpl){if(pl.isNil()){returnnewNil();}else{returnnewCons(???,Map(f,pl.tl()));}}publicstacctestMap(){StringListx=newCons(“CowaBunga”,newNil()):StringListy=map(???,x);assertEqual(y.hd(),“COWABUNGA”);}
45PR22017-2018
PR22017-2018
Conleinterfacce!!InterfaceFun{publicstaccStringapply(Stringx);}ClassUpperCaseFunimplementsFun{publicstaccStringapply(Stringx){returnx.toUpperCase();}}
publicstaccStringListMap(Funf,StringListpl){if(pl.isNil()){returnnewNil();}else{returnnewCons(f.apply(pl.hd()),Map(f,pl.tl()));}}publicstacctestMap(){StringListx=newCons(“CowaBunga”,newNil()):StringListy=map(newUpperCaseFun(),x);assertEqual(y.hd(),“COWABUNGA”);}
LestringheinJava
47PR22017-2018
JavaString
• Lestringhe(sequenzedicara:eri)inJavasonounaclassepredefinitao "3"+""+"Volte3"equivalea"3Volte3"o Il"+"èanchel’operatorediconcatenazionedistringhe
• Lestringhesonoogge.immutabili(alàOCaml)
48PR22017-2018
Uguaglianza
• Javahadueoperatoripertestarel’uguaglianzao o1==o2resctuiscetrueselevariabilio1eo2denotanolostessoriferimento(pointerequality)
o o1.equals(o2)resctuiscetrueselevariabilio1eo2denotanodueogge.idencci(deepequality)
• Esempioo String("test").equals("test")-->trueo newString("test")=="test"-->falseo newString("test")==newString("test")-->false
49PR22017-2018
Unquesitointeressante…
Strings1="Java";Strings2="Java";
s1.equals(s2)//true…perché?s1==s2//true…perché?
50PR22017-2018
[approfondiregli“Stringliterals”]
Unquesitopiùstandard…
Stringstr1=newString("Java");Stringstr2=newString("Java");str1.equals(str2)//true:stessocontenutostr1==str2//false:ogge.differenc
51PR22017-2018
String:ogge.immutabili!
publicclassTest{publicstaccvoidmain(String[]args){ Strings1="Cowa"; if(s1.equals(s1.concat("Bunga"))System.out.println("True!"); else System.out.println("False!");}}
52PR22017-2018
JavaAssert
53PR22017-2018
Assert
• Javafornisceunaprimicvalinguisccaper“testare”proprietàdiunprogramma
• Ilcomandoasserto assertbooleanExpression;o valutal’espressionebooleanao sel’espressionevienevalutatatrueilcomandonon
modificalostato,sel’espressionerescctuiscefalsevienesollevatal’eccezioneAsserYonError
54PR22017-2018
Assert
• assertbooleanExpression:expression;• Inquestocaso,sel’espressionebooleanavienevalutatafalselasecondaespressioneèuclizzataall’internodelmessaggiodiAsserYonError
• Lasecondaespressionepuòaverequalunquecpoconl’eccezionedelcpovoid
55PR22017-2018
Invarianc
if(i%3==0){...}elseif(i%3==1){...}else{//weknow(i%3==2)...}
if(i%3==0){...}elseif(i%3==1){...}else{asserti%3==2:i;}
SelavariabileihavalorenegaYvol’assertsollevaunerrore
56PR22017-2018
Assertecontra.
• Noiuclizzeramoilcomandoassertpersupportarelaprogrammazione“bycontract”– Precondizioni– Postcondizioni– Invariancdirappresentazione
57PR22017-2018
Esempio
privatevoidsetRefreshRate(intrate){@REQUIRES(rate<=0||rate>MAX_REFRESH_RATE)
::
}
privatevoidsetRefreshInterval(intrate){assertrate>0&&rate<=1000:rate;
::
}
58PR22017-2018
Abilitareassert
• IlcomandoassertnellanormaleesecuzionediapplicazioniJavanonhaalcuneffe:o
• Leasserzionidevonoessereabilitateo prompt$java-enableasserconsprogo prompt$java-eaprog
59PR22017-2018