AA2016-2017 PROGRAMMAZIONE2 3.PrimipassiinJava WhyJava? Javaoffretan6ssimecoseu6li o o o Usatoalivelloindustriale Librerievas6ssime Complicatomanecessariamentecomplicato ObieDvodiProgrammazioneII PresentarelecaraIeris6cheessenzialidella programmazioneObject-Oriented o IllustrarecomeletecnicheOOaiutanonellasoluzione diproblemi o SperimentareconJava o OggeDeclassi Ogge$o:insiemestruIuratodivariabilidi istanza(stato)emetodi(operazioni) Classe:modello(template)perlacreazionedi oggeD OBJECT STATO(NASCOSTO) METODI(PUBBLICO) OggeDeclassi Ladefinizionediunaclassespecifica TipoevaloriinizialidellostatolocaledeglioggeD (levariabilidiistanza) o Insiemedelleoperazionichepossonoessereeseguite (metodi) o CostruIori(unoopiù):codicechedeveessere eseguitoalmomentodellacreazionediunoggeIo o OgnioggeIoèunaistanzadiunaclasseepuò (opzionalmente)implementareunainterfaccia OggeDeclassi OggeDeclassi Unprimoesempio publicclassCounter{//nomedellaclasse privateintcnt;//lostatolocale //metodocostruIore publicCounter(){cnt=0;} //metodo publicintinc(){cnt++;returncnt;} //metodo publicintdec(){cnt--;returncnt;} } DICHIARAZIONE DICLASSE public=visibilefuori dell’oggeIo private=visibilesolo all’internodell’oggeIo EsecuzionediJava UnprogrammaJavaèmandatoinesecuzione invocandounmetodospecialechiamatomain publicclassFirst{ publicsta6cvoidmain(String[]args){ Counterc=newCounter(); System.out.println(c.inc()); System.out.println(c.dec()); } } Compilareedeseguire prompt$javacCounter.java VienecreatoilbytecodeCounter.class prompt$javacFirst.java VienecreatoilbytecodeFirst.class prompt$javaFirst 1 0 prompt$ CosaèilJavabytecode? ÈillinguaggiodellaJavaVirtualMachine Load&store(e.g.aload_0,istore) Arithme6c&logic(e.g.ladd,fcmpl) Objectcrea6on&manipula6on(new,pulield) Operandstackmanagement(e.g.swap,dup2) Controltransfer(e.g.ifeq,goto) Methodinvoca6on&return(e.g.invokespecial, areturn) Visualizzabileconjavap!! CreareoggeD Dichiarareunavariabiledi6poCounter InvocareilcostruIorepercrearel’oggeIodi6poCounter Counterc; c=newCounter() Soluzionealterna6va:faretuIoinunpasso!! Counterc=newCounter(); CostruIoriconparametri publicclassCounter{//nomedellaclasse privateintcnt;//lostatolocale //metodocostruIore publicCounter(intv0){cnt=v0;} //metodo publicintinc(){cnt++;returncnt;} //metodo publicintdec(){cnt--;returncnt;} } DICHIARAZIONE DICLASSE public=visibilefuori dell’oggeIo private=visibilesolo all’internodell’oggeIo CostruIoriconparametri publicclassFirst{ publicsta6cvoidmain(String[]args){ Counterc=newCounter(25); System.out.println(c.inc()); System.out.println(c.dec()); } } StruIuremutabili OgnivariabiledioggeIoinJavadenotaunaen6tàmutabile CounterC; C=newCounter(5); C=newCounter(10); C.inc(); //qualeèilvaloredellostatolocale? IlvaloreNULL Ilvalorenullègenericoepuòessereassegnatoaqualunque variabiledi6poriferimento. Res6tuisceunoggeIodi6poCounter onullsenonlotrova Counterc=cercaContatore(); if(C==null) System.out.println(“contatorenontrovato”); AIenzione:comeinC =singolo:assegnamento ==doppio:testdiuguaglianza Nelloheap… GlioggeDJavasonomemorizza6nelloheap Nelloheapvengonoallocate o o variabilidiistanza,quandosicreaunoggeIo variabilista6che(odiclasse),quandoècaricataunaclasse Levariabiliallocatenelloheapsonoinizializzatedalsistema o o o con0(zero),perlevariabilidi6pinumerici confalse,perlevariabilidi6poboolean connull,perlevariabilidi6poriferimento Levariabilidichiaratelocalmenteinmetodi/costruIorinon vengonoinizializzateperdefault:bisognaassegnarloroun valoreprimadileggerle Statolocale Modificatori:meccanismopercontrollare l’accessoallostatolocaledell’oggeIo Public:visibile/accessibiledaognipartedel programma o Private:visibile/accessibilesoloall’internodellaclasse o DesignPaIern(suggerimentogrossolano) o o TuIelevariabilidiistanza:private CostruIoriemetodi:public Riassunto… Il“frammentoimpera6vo”diJavarichiamadavicino lasintassidelC o o o λ λ λ λ λ intx=3; //dichiaraxeloinizializzaalvalore3 inty;//dichiarayeglivieneassegnatoilvaloredidefault0 y=x+3;//assegnaayilvaloredixincrementatodi3 //dichiaraunoggeIoCdi6poCountereloinizializzacon //ilcostruIore Counterc=newCounter(); Counterd;//dichiaradeilsuovaloredidefaultènull d=c;//assegnaadl’oggeIodenotatodac=>Aliasing! Alcunicomandi… Condizionali if(cond)stmt1; o if(cond){stmt1;stmt2;} o if(cond){stmt1;stmt2;}else{stmt3;stmt4;} o Itera6vi while(exp){stmt1;stm2;} o do{stmt1;stm2;}unUl(exp); o for(init;term;inc}{stmt1;stm2;} o Demo classWhileDemo{ publicsta6cvoidmain(String[]args){ intcount=1; while(count<11){ System.out.println("Countis:"+count); count++; } } } classForDemo{ publicsta6cvoidmain(String[]args){ for(intI=1;I<11;i++) System.out.println("Countis:"+i); } } Demo2 classBreakDemo{ publicsta6cvoidmain(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); else System.out.println(searchfor+"notfoundinthearray"); } } Tipiprimi6vi int//standardintegers byte,short,long//otherflavorsofintegers char,float//unicodecharacters double//floa;ng-pointnumbers boolean//trueandfalse Stringnonsono*piprimi*vi!!! InterfacceinJava TipiinJava Javaèunlinguaggiofortemente6pato (ognien6tàhaun6po) Leclassidefinisconoil6podeglioggeD o ClassecomedefinizionedelcontraIodiuso deglioggeDcheappartengonoaquellaclasse Javaprevedeunulterioremeccanismoper associareil6poaglioggeD:leinterfacce JavaInterface Unainterfacciadefinisceil6podeglioggeDin mododichiara6vo:nonvienepresentatoil deIagliodellaimplementazione Interfaccia=ContraIod’usodell’oggeIo Esempio Nome publicinterfaceDisplaceable{ publicintgetX(); publicintgetY(); publicvoidmove(intdx,intdy); } Dichiarazione dei6pideimetodi Unaimplementazione… publicclassPointimplementsDisplaceable{ privateintx,y; publicPoint(intx0,inty0){ x=x0; y=y0; } publicintgetX(){returnx;} publicintgetY(){returny;} publicvoidmove(intdx,intdy){ x=x+dx; y=y+dy; } } Devonoessere implementa6 tuDimetodi dell’interfaccia Un’altra!! classColorPointimplementsDisplaceable{ privatePointp; OggeDcheimplementano privateColorc; lastessainterfacciapossono averestatolocaledifferente ColorPoint(intx0,inty0,Colorc0){ p=newPoint(x0,y0);c=c0; } publicvoidmove(intdx,intdy){ Delegaall’oggeIopoint p.move(dx,dy); } publicintgetX(){returnp.getX();} Numeromaggioredimetodi publicintgetY(){returnp.getY();} diquelliprevis6dalcontraIo publicColorgetColor(){returnc;} } Tipieinterfacce Dichiararevariabilichehannoil6podiunainterfacce Diplaceabled; d=newPoint(1,2); d.move(-1,1) Assegnareunaimplementazione d=newColorPoint(1,2,newColor("red")); d.move(-1,1); SoIo6pi LasituazionedescriIaillustrailfenomenodel subtyping(soIo6po):Un6poAèunsoIo6po diBseunoggeIodi6poAingradodi soddisfaretuDgliobblighichepotrebbero essererichiestodall’interfacciaounaclasseB. Intui6vamente,unoggeIodi6poApuòfare qualsiasicosacheunoggeIoBpuòfare. MaggiorideIagliinseguito Interfaccemul6ple publicclassCircleimplementsDisplaceable,Area{ privatePointcenter; privateintrad; publicinterfaceArea{ publicCircle(intx0,inty0,intr0){ publicdoublegetArea(); 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);} Esempid’uso Circlec=newCircle(10,10,5); Displaceabled=c; Areaa=c; Rectangler=newRectangle(10,10,5,20); d=r; a=r; MetodistaUci Unaprimaanalisi AlcunecaraIeris6chediJavarichiedonouna conoscenzadeIagliatadellelibrerie Sistemidisupportofornisconomol6strumen6 perprogrammareconJava(Eclipseèunesempio significa6vo) Lanostrarisposta:affron6amoilproblemain terminidiproblemsolving Espressionivs.Comandi Javahasiaespressionichecomandi! o o Leespressionires6tuisconovalori Icomandioperanoviasideeffect Metodista6ci publicclassMax{ Lsimilealla publicsta6cintmax(intx,inty){ definizionediuna if(x>y){returnx;} funzione else{returny;} } publicsta6cintmax3(intx,inty,intz){ returnmax(max(x,y),z); } } publicclassMain{ publicsta6cvoidmain(String[]args){ System.out.println(Max.max(3,4)); return; } } Metodista6ci Sonometodiindipenden6dall’oggeIo(valgono pertuDglioggeDdellaclasse) o Nonpossonodipenderedaivaloridellevariabilidi istanza Quandodevonoessereusa6? o o PerlaprogrammazionenonOO Perilmetodomain Imetodinonsta6cisonoen6tàdinamiche! o Devonoconoscereelavoraresullevariabilidiistanza deglioggeD Metodista6ci Imetodista6cisono“funzioni”definite globalmente Variabilidiistanzasta;csonovariabiliglobali accessibiletramiteilnomedellaclasse Variabilidiistanzasta6chenonpossonoessere inizializzatenelcostruIoredellaclasse(datoche nonpossonoessereassociateaoggeDistanza dellaclasse) Esempio publicclassC{ privatesta6cintbig=23; publicsta6cintm(intx){ returnbig+x;//OK } } publicclassC{ privatesta6cintbig=23; privateintnonSta6cField; privatevoidsetIt(intx){nonSta6cField=x+x;} publicsta6cintm(intx){ setIt(x);//Errore:unmetodosta;cnonpuò //accedereametodinonsta;ciea //variabilidiistanzanonsta;che } } Quindi? Imetodista6cisonou6lizza6perimplementare quellefunzionalitàchenondipendonodallo statodell’oggeIo Esempisignifica6vinellaAPIMathchefornisce funzionimatema6checomeMath.sin Altriesempiosonoda6dallefunzionidi conversione:Integer.toStringeBoolean.valueOf JavaDemo ListeinJava 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("Bunga",newCons("bunga",newNil())) Regolepragma6chegenerali o o Perogni6podidatodefinirelarela6vainterfaccia AggiungereunaclasseperognicostruIore Operaresuliste Conricorsione… publicsta6cintnumberOfSongs(StringListpl){ if(pl.isNil()){return0;} else{return1+numberOfSongs(pl.tl());} } …oiterazione! publicsta6cintnumberOfSongs(StringListpl){ intcount=0; StringListcurr=pl; while(!Curr.isNil()){ count=count+1; curr=curr.tl(); } Usarevariabilidiistanzaper returncount; value-orientedprogramming } Higher-order?!? publicsta6cStringListMap(???f,StringListpl){ if(pl.isNil()){returnnewNil();} else{returnnewCons(???,Map(f,pl.tl()));} } publicsta6ctestMap(){ StringListx=newCons(“bungabunga”,newNil()): StringListy=map(???,x); assertEqual(y.hd(),“BUNGABUNGA”); } Conleinterfacce!! InterfaceFun{publicsta6cStringapply(Stringx);} ClassUpperCaseFunimplementsFun{ publicsta6cStringapply(Stringx){ returnx.toUpperCase(); } } publicsta6cStringListMap(Funf,StringListpl){ if(pl.isNil()){returnnewNil();} else{returnnewCons(f.apply(pl.hd()),Map(f,pl.tl()));} } publicsta6ctestMap(){ StringListx=newCons(“bungabunga”,newNil()): StringListy=map(newUpperCaseFun(),x); assertEqual(y.hd(),“BUNGABUNGA”); } LestringheinJava JavaString Lestringhe(sequenzedicaraIeri)inJavasono unaclassepredefinita o o "3"+""+"Volte3"equivalea"3Volte3" Il"+"èpurel’operatorediconcatenazionedistringhe LestringhesonooggeDimmutabili(alàOCaml) Uguaglianza Javahadueoperatoripertestarel’uguaglianza o1==o2res6tuiscetrueselevariabilio1eo2 denotanolostessoriferimento(pointerequality) o o1.equals(o2)res6tuiscetrueselevariabilio1eo2 denotanodueoggeDiden6ci(deepequality) o Esempio o o o String("test").equals("test")-->true newString("test")=="test"-->false newString("test")==newString("test")-->false Unquesitointeressante… Strings1="java"; Strings2="java"; s1.equals(s2)//true…perché? s1==s2//true…perché? Unaltroquesito… Stringstr1=newString("Java"); Stringstr2=newString("Java"); str1.equals(str2)//true:stessocontenuto str1==str2//false:oggeDdifferen6 String:oggeDimmutabili! publicclassMain{ publicsta6cvoidmain(String[]args){ Strings1="Programmarein"; if(s1.equals(s1.concat("Java"))) System.out.println("True!"); else System.out.println("False!"); } } JavaAssert Assert Javafornisceunaprimi6valinguis6caper “testare”proprietàdiunprogramma Ilcomandoassert o o o assert booleanExpression; valutal’espressionebooleana sel’espressionevienevalutatatrueilcomandonon modificalostato,sel’espressioneres66tuiscefalse vienesollevatal’eccezioneAsser6onError Assert assertbooleanExpression:expression; Inquestocaso,sel’espressionebooleanaviene valutatafalselasecondaespressioneèu6lizzata all’internodelmessaggiodiAsser6onError Lasecondaespressionepuòaverequalunque 6poconl’eccezionedel6povoid Invarian6 if(i%3==0){ ... }elseif(i%3==1){ ... }else{//weknow(i%3==2) ... } SelavariabileihavalorenegaUvo l’assertsollevaunerrore if(i%3==0){ ... }elseif(i%3==1){ ... }else{ asserti%3==2:i; } AssertecontraD Noiu6lizzeramoilcomandoassertper supportarelaprogrammazione“bycontract” o o o Precondizioni Postcondizioni Invarian6dirappresentazione Esempio privatevoidsetRefreshRate(intrate){ @REQUIRES(rate<=0||rate>MAX_REFRESH_RATE) : : } privatevoidsetRefreshInterval(intrate){ assertrate>0&&rate<=1000:rate; : : } Abilitareassert Ilcomandoassertnellanormaleesecuzionedi applicazioniJavanonhaalcuneffeIo Leasserzionidevonoessereabilitate o o prompt$java-enableasser6onsprog prompt$java-eaprog