PROGRAMMAZIONE 2 3.Primi passi in Java

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