Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI1
U n iv e rs it à d e g li S tud i d i M od e n a e R e gg io E m ili a
F ac o lt à d i I ng e gn e ri a
C O R S O D I
F O NDA M E N T I D I I N F O R M A T ICA II L ingu a gg io Java : In tr odu z ion e e C on ce tt o d i C lasse
Ing . F ra n c o Z a m bon e lli
Lu c id i rea li zz a ti i n c o ll a bo ra z ion e c on Ing . E n ri c o D e n ti - U n iv . B o logn a
A nno A cca d e m ic o 1999 /2000
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI2
IL C O NC E T T O D I C L A SSE
U n a c la ss e d es cr iv e le p rop rie tà d i un in si em e d i “ogg etti ” a v en ti: • la m ed es im a st ru tt u ra in te rna • lo st ess o p ro to co ll o d i a cce ss o ( in si em e d i op er az ion i) • lo st ess o co m po rt a m en to
R iun is ce le p ro p ri et à d i: • co m po n en te so ftw a re → può ess er e do ta to d i suo i p rop ri da ti e op er a zi on i • ti p i d i da to a st ra tt o (A D T ) → f ung e d a “ st am po ” p er cr ea re nuov e is tan ze d i ogg etti • m od u lo e ce n tr o d i se rv iz i → r iun is ce d ati e re la ti v e op er az ion i (s er v iz i) → f o rn is ce m ecca n is mi d i p ro tez ion e
I L IN G UA GG I AD OGG E TT I
F o rn is cono co m e a st raz ion e b as e la po ss ib ilit à d i d ef in ir e c la ss i, d i m ett er e in re laz ion e le c la ss i t ra mit e e re d it ar ie tà , d i i st an zi ar e ogg etti a p ar ti re d all a c la ss e.
• L ingu agg i ad O gg etti "pu ri" : l a c la ss e e g li ogg etti sono le un ic h e, o qu as i, as tr az ion i d el li ngu agg io (S m allt al k , Ja v a)
• L ingu agg i ad O gg etti "non pu ri" : agg iungono l'a st raz ion e d i cl ass e e ogg ett o ai co st ru tti t ra d iz ion ali d ell a p rog ra mm az ion e (C ++ , O b jec t P as ca l, OO C O B O L )
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI3
IL L IN G UA GG IO J A V A • È un li ngu agg io a ogg etti pu ro : t ra nn e i ti p i p rimiti v i d i b as e (int,
float, … ), tu tt o il re st o in un a a pp li caz ion e sono ogg ett o app ar te n en ti a c la ss e • È fo rte m en te is p ir at o al C ++ , m a rip rog ett at o se n za il re qu is it o d ell a p ie na co m pa ti b ilit à co l C (a c u i p er ò ass o mi g li a… ) • U n p rog ra mm a è un in si em e d i cl a ss i: non es is tono fun zi on i d ef in it e (c o m e in C ) a li v ell o es te rno : a n ch e il
main è d ef in it o d en tr o a un a cl a ss e!
J AVA : L IN G UA GG IO O ARC H ITETT URA ?
A d iff er en za d el C ++ , Ja v a v ie n e fo rn it o con un a no te vo le g er ar ch ia d i cl ass i st and ar d g ià p ron te
E ' un' ar ch it ett u ra g ià p ron ta p er l'u so ! • ind ip end en te d a ll a p ia tt a fo rm a • P ac k ag e g ra fic o (ind ip end en te d all a p ia tt af o rm a!) : A W T • P rog ra mm az ion e a e v en ti (m o lt o evo lu ta !) • S uppo rto d i re te : U R L , conn ess ion i v ia S o ck et , … • S uppo rto p er il m u lti -th rea d ing • C on ce tt o d i A PP LET = p icc o la (? ) app li caz ion e d a e se gu ir si d en tr o un b ro w se r I n te rn et • S uppo rto p er si cu rezza • M od ell o d i si cu rezza "s andbox " p er le a pp le t sca rica te v ia re te • C ifr at u ra , cr itt og ra fia , ch ia v i pubb li ch e/ p riv at e… • C onn ess ion e e in te rf acc ia m en to con d at ab as e
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI4
J A V A : S T O R IA
• N as ce n el 1994 d a un p rog ett o (f allit o !) p er la n et w o rk te le v is io n ; • S i d iff ond e sop ra tt u tt o g raz ie a ll e a pp le t, p icc o le (o rig in ar ia m en te ) app li caz ion i es egu it e d en tr o ad un b ro w se r e sca rica te d in ami ca m en te d al WWW se rv er • S i aff er m a n eg li u ltimi ann i co m e li ngu agg io g en er al e p er la p rog ra mm az ion e
M o lt o o rie n ta to al “N et w o rk C o m pu tin g ”: • In te raz ion e c on ogg etti re m o ti (R M I) • In te raz ion e c on B as i d i D ati d is tr ibu it e (J D BC ) • In te raz ion e c on si st emi C O RB A • F o rte in te rc onn ess ion e c on WWW (A pp le t, C G I, Ja v aS cr ip t) .
F u tu ro p ro m ett en te (s i rit o rn a a ll e o rig in i d el p rog ett o ) p er si st em i em b edd ed : • Ja v a C ar d • Ja v a R ing s • Ja v a O p er ati ng S y st em s p er P DA
P o rt a b ili tá o tt enu ta a tt ra v er so un a v ia in te rm ed ia tr a in te rp re taz ion e e c o m p il az ion e • I p rog ra mmi (le c la ss i) Ja v a sono co m p il at e in un li ngu agg io m acc h in a a st ra tt o (J a va b yt ec od e)
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI5
IL C O S T RU T T O “ class ” IN J A V A
D ef in iz io n e d i un a cl a ss e:
classCounter {privateint val;public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int getValue() { return val; }}
S i po tr anno po i i st an zi ar e ogg etti d ell e c la ss e C oun te r
Counter c1, c2;
E ch ie d er e lo ro se rv iz i:
c1.inc();if (c2.getValue() == 3) {……};
• D a ti ( val ) e op er a zi o n i ( reset , inc , dec , rd ) so n o ri un iti i n un un ic o co st ru tt o li n g u is ti co • Il ca m p o d a ti
valè p ri va to , e può ess er e acce du to so lo da ll e op er a zi on i (m et od i) d ell a cl a ss e ( reset , inc , dec , rd ): ogn i t en ta ti vo d i acce so d all ’e st er no v err à ind iv idu at o e re sp in to d al co m p il at o re !
c2.val = 3; /* ERRORE */•
I m et o d i
reset(),
getValue(), et c. s o n o pubb li ci , e po ss ono qu ind i ess er e invo ca ti da ch iunqu e → d all ’e st er no ,
valè m an ipo la b il e so lo tr amit e qu es ti m et od i → s i g ar an ti sce l’ in cap su la m en to . → m odo d i i nvo caz ion e
oggetto.
metodoIn g en er e: t u tti i d a ti d evono av er e v is ib ili tá p ri va ta e i m et o d i (m a non n ece ss ar ia m en te tu tti ) d evono av er e v is ib ili tá pubb li ca .
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI6
P rog ra mm i i n J A V A
• A p ar te un p icc o lo in si em e d i ti p i p rimiti v i p re d ef in iti , un p rog ra mm a Ja v a è d ef in it o d a un in si em e d i cl ass i e, du ra n te l’ es ec u zi on e, d ag li ogg etti ch e d a ta li cl ass i v err anno is ta n zi ati • L e c la ss i sono en tit á st a tic h e, ch e sono d ef in it e p rim a d ell a es ec u zi on e. N on es is te nu ll a c h e non si a d ef in it o all ’in te rno d i qu al ch e c la ss e; • G li ogg etti sono en tit á d in a m ic h e ch e a ss u m ono es is te n za a p ar ti re d all e c la ss i du ra n te l’ es ec u zi on e. • C i d ev e e ss er e un a so la c la ss e fun zi on e pubb li ca d i no m e m ai n , all ’in te rno d i un a c la ss e c on la se gu en te in te rf acc ia :
public static void main(String args[])
• S i d ic h ia ra la li st a d eg li ar go m en ti an ch e se non ce n e sono • Il m ai n d ev e n ece ss a ri a m en te ess er e d ef in it o d en tr o a un a cl ass e pubb li ca e h a obb li ga to ri a m en te la fo rm a
public static void main(String args[]){...}
• A d iff er en za d el C , non c’ è v al o re d i rit o rno , m en tr e g li ar go m en ti d all a li n ea d i co m ando sono ogg etti
String(il p rim o non è il no m e d el p rog ra mm a c o m e in C )
C O NV E N Z IO N I: • I no mi d ell e c la ss i sono p er conv en zi on e m ai u sc o li • I no mi d i m et od i, v ar ia b ili e ogg etti p er conv en zi on e sono mi nu sc o li
NO T A : U n a fun zi on e se n za p ar am et ri v ie n e d ef in it a se n za la p ar o la vo id n ell a li st a d ei p ar am et ri. E se m p io :
public void inc() { val++; }
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI7
H e ll o W o rl d (I)
/** File Esempio0.java* Applicazione Java da linea di comando* che stampa la classica frase di benvenuto@author Enrico Denti@version 1.0, 5/4/98*/
public class Esempio0 {
public static void main(String args[]){System.out.println("Hello World!");}}
E si st e un a co rr is p o nd en za b en p rec is a fr a no m i d ell e c la ss i e no m i d i fil e: • in un fil e so rg en te c i può ess er e un ’un ica c la ss e pubb li ca , c h e d ev e a v er e lo st ess o n o m e d el fil e (ca se -s en siti v e!)
O gn i fil e so rg en te im po rta a u to m ati ca m en te la li b re ria fond am en - ta le
java.lang: •
Systemè un a c la ss e d i si st em a, ch e ra pp re se n ta "il si st em a so tt o st an te ", qu al unqu e e ss o si a •
outè un ogg ett o (s ta ti c) d ell a c la ss e
System, e ra pp re se n ta il d is po siti vo st and ar d d i u sc it a • su ll 'ogg ett o
outè po ss ib il e invo ca re il m et odo
println()Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI8
H e ll o W o rl d (II )
/** File Esempio0.java
* Applicazione Java da linea di comando* che stampa la classica frase di benvenuto@author Enrico Denti@version 1.0, 5/4/98
*/// questo e’ commento su una sola linea stile C++/* questo e’ il commento stile C normale */public class Esempio0 {public static void main(String args[]){System.out.println("Hello World!");}}
• P er co m p il ar e:
javac Esempio0.java
(p rodu ce
Esempio0.class) • P er es egu ir e:
java Esempio0
• Il fo rm at o co m p il at o .c la ss (b yt ec od e J a va ) è po rt ab il e e in d ip en d en te da ll a p ia tt a fo rm a • un a c la ss e c o m p il at a su un si st em a fun zi on er à su qua lun qu e a lt ro si st em a (M ac , U n ix , W indo w s… ) p er cu i si a d is pon ib il e il Ja va R un ti m e E n vi ron m en t (n ell a st ess a v er si on e) • il fo rm at o co m p il at o d i Ja v a (b y tec o d e) v ie n e in te rp re ta to da ll a Ja va V ir tua l M a ch in e tr amit e l'i n te rp re te Ja v a • S un re nd e d i pubb li co do mi n io il co m p il at o re c h e si l an ci a java c e la m acc h in a c h e si l an ci a c on il co m ando java . N O N F O R N IS C E A M B IE N T I D I S V IL U PP O G RAF IC I I N T E G RA T I (B IS OG N A C O M PRAR L I!)
H e ll o W o rl d (III )
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI9 /** File Esempio0.java* Applicazione Java da linea di comando* che stampa la classica frase di benvenuto@author Enrico Denti@version 1.0, 5/4/98 *//* i commenti che iniziano con /** servono pergenerare i file di documentazione */public class Esempio0 {public static void main(String args[]){System.out.println("Hello World!");}}
Ja v a c on se n te d i g en er ar e a u to m ati ca m en te la do cu m en taz ion e d el le c la ss i con te nu te n el fil e (limit at am en te a qu ell e non p riv at e) :
javadoc Esempio0.java
Il ri su lt a to è un in si em e d i fil e H T M L ( il fo rm at o es att o d ip end e d all a v er si on e)
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI10
G L I AR GO M E N T I
/** File Esempio1.java* applicazione da linea di comando* stampa gli argomenti passati al programma@author Enrico Denti@version 1.0, 9/11/97*/
public class Esempio1 {
public static void main(String args[]){if (args.length== 0) System.out.println("Occorrono argomenti");else for(int i=0; i<args.length; i++)System.out.println("arg" + (i+1) + ": " + args[i]); }}
•
Stringè un a c la ss e p re d ef in it a: l e st ringh e Ja v a sono ogg etti , non p ezz i d i m em o ria a ss egn at a a un pun ta to re c o m e in C • L ’op er at o re
+è p re d ef in it o su ll e st ringh e, e se rv e a con ca te n ar le • ar g s è un v ett o re (d i st ringh e) : co m e tu tti i v ett o ri Ja v a, è un ogg ett o , il cu i ca m po (pubb li co )
lengthi nd ica il nu m er o d i el em en ti (nu m er ati d a 0 a
length-1 )
________________________________________
UNA R IF LE SS IO N E
F ino ra , g li un ic i co m pon en ti d el no st ro si st em a sono cl ass i, ci o è ogg etti d ef in iti st ati ca m en te , la c u i es is te n za è no ta a p rio ri. I si st emi rea li ric h ie dono p er ò un a m agg io re d in ami cit à.
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI11
C rea z ion e e u s o d i ogg e tt i C oun te r
/** File Esempio2.java * Prima applicazione che istanzia nuovi oggetti @author Enrico Denti @version 1.0, 5/4/98 */
classCounter {privateint val;public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int rd() { return val; }}public class Esempio2 { // contiene solo il main public static void main(String args[]){Counter c1, c2;c1 = new Counter(); c2 = new Counter();c1.reset(); c2.reset();c1.inc(); c1.inc(); c2.inc();System.out.println("c1 vale " + c1.rd());System.out.println("c2 vale " + c2.rd());}
•Compilando questo file, si ottengono due file.class, uno per ogni classe definita(Esempio2.class e Counter.class)
• L a fr as e
Counter c1;in tr odu ce un ri fe rim en to a
Counter, ci o è un a so rta d i pun ta to re c h e p er ò non è d ir ett am en te m an ipo - la b il e d all ’u te n te e si u sa se n za do ve rl o d er ef er en zi a re e sp li ci - ta m en te c o m e in C o C ++ (v ed i
*po
p->inc()) • Il
Counterv er o e p rop rio v ie n e c rea to d in ami ca m en te a ll ’a tt o d ell a
new, ed è v is ib il e fi no a ll a fi n e d el b lo cc o in cu i è d ef i- n it o . L a d ea ll o caz ion e è a u to m ati ca e g es tit a d al ga rb ag e co ll ec to r d i Ja v a sec ondo le su e po liti ch e. • u so d ell e is ta n ze m ed ia n te uno stil e a “ inv io d i m ess agg i”
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI12
I C O S T RU T T O R I
M o lti err o ri n el so ftw ar e sono ca u sa ti d a m an ca te in iz ia li zzaz ion i d i v ar ia b ili ai v al o ri i n iz ia li p re v is ti . P er ovv ia re a c iò , m o lti li ngu agg i a ogg etti d ef in is cono il con ce tt o d i m et o d o co st ru tt o re , ch e a u to m a tizz a l’ in iz ia li zz a zi o n e d ell e is ta n ze .
Il co st ru tt o re : • n o n v ie n e m a i ch ia m a to es p li ci ta m en te d a ll ’u te n te , m a so lo au to m ati ca m en te d al si st em a a ll ’a tt o d ell a c reaz ion e d i un a nuov a is ta n za . S i po ss ono qu ind i p ass ar e p ar am et ri qu ando d i cr ea un nuovo ogg ett o , co rr is pond en ti ai p ar am et ri d el m et odo co st ru tt o re • h a un n o m e fiss o (ugu al e a l no m e d ell c c la ss e) • n o n h a tip o d i ri to rn o (il suo sc opo non è ca lc o la re qu al co sa , m a in iz ia li zza re un ogg ett o ) • pu ò n o n ess ere un ic o . S p ess o v i sono p iù co st ru tt o ri, con d iv er se li st e d i ar go m en ti: il si st em a ric ono sce a u to m ati ca m en te qu al e invo ca re su ll a b as e d ei p ar am et ri p ass ati all 'a tt o d ell a cr eaz ion e.
S e non n e v ie n e d ef in it o n ess uno , si g en er a a u to m ati ca m en te un co st ru tt o re d i d ef au lt (s en za a rgo m en ti ), ch e non fa nu ll a.
E S E M P IO (r id ef in iz ion e d ell a c la ss e
counter)
classCounter {private int val;public Counter() { val=1; } // defaultpublic Counter(int x) { val=x; }public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int rd() { return val; }}
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI13
L ’E S E M P IO P R E C E D E N TE … ri st ru tt u ra to
/** FILE Counter.java * Questa classe definisce il concetto dicontatore avanti/indietro. @author Enrico Denti @version 1.0, 8/3/99 */public class Counter {private int val;public Counter() { val=1; } // defaultpublic Counter(int x) { val=x; }public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int rd() { return val; }}
/** FILE Esempio2bis.java * Prima applicazione che istanzia nuovi oggetti @author Enrico Denti @version 1.0, 8/3/99 */public class Esempio2bis { public static void main(String args[]){Counter c1, c2;c1 = new Counter(); c2 = new Counter(5);c1.inc(); c1.inc(); c2.inc();System.out.println("c1 vale " + c1.rd());System.out.println("c2 vale " + c2.rd());}}
• L a c la ss e
Counter, re sa pubb li ca , è o ra in un fil e se p ar at o n ell o st ess o d ir ett o rio • Il m ai n può u sa re la c la ss e
Counters en za d ov er in cl ud ere nu ll a : Ja v a suppo rta il co ll ega m en to d in a mi co ! A l p rim o u so d i
Counter, il fil e
Counter.classv err à ce rca to e ca rica to → a d att o a cod ice m ob il e e app li ca zi on i su In te rn et NON E S IS T E IL C ON CE TT O D I L IN K ING S T A T IC O !!!!
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI14
L ’I S T AN Z A C O RR E N T E : T H IS
L a p ar o la c h ia v e
thisc o stit u is ce un rif er im en to all ’is ta n za co rr en te , e può se rv ir e: • p er ind ica re un ca m po d ati i n ca so d i o m on imi a c on un p ar am et ro o con un a v ar ia b il e lo ca le • in un co st ru tt o re , p er r ic h ia m ar e un alt ro co st ru tt o re d ell a st ess a cl ass e.
E S E M P IO (r id ef in iz ion e d ell a c la ss e
Counter)
class Counter {private int val;
public Counter() { this(1); }
public Counter(int val) { this.val=val; }
public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int rd() { return val; }}
• Il co st ru tt o re
Counter(int val)u tili zza
thisp er d is ti n gu e- re il p ar am et ro
vald al ca m po d ati d i no m e
val( ch e v ie n e es p re ss o con la no taz ion e
this.val) • Il co st ru tt o re
Counter()u tili zza
this(1)p er d el eg ar e la co st ru zi on e d ell ’ogg ett o all ’a lt ro co st ru tt o re d ell a st ess a c la ss e • N B : l a si n ta ss i
this()p er ch ia m ar e un alt ro co st ru tt o re puó ess er e u sa ta so lo co m e p ri m a is tr u zi on e d i un co st ru tt o re .
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI15
OGG E TT I C O M P O S T I
D a qu an to d ett o fino ra dov re bb e ris u lt ar e c h ia ro ch e un ogg ett o pu ò co n te n ere (r if er im en ti a ) a lt ri ogg ett i • l’ ogg ett o "c on te n it o re " può u sa rli ... • .. m a n o n p u ò a cce d er e ai l o ro da ti p ri va ti • può p er ò acce d er e a i d ati pubb li ci e a i suo i m et od i
In fa se d i co st ru zi o n e: • p ri m a s i co st ru is ce l’ ogg ett o con te n it o re • po i si co st ru is cono , con
new, g li ogg etti i n te rn i
E S E M P IO
class Counter {int val;public Counter() { val=1; }public void inc() { val++; }public int rd() { return val; }}
public class DoppioCounter {// oggetto contenitore
Counter c; // oggetto contenuto
public DoppioCounter() {c = new Counter();}
public void inc(){c.inc(); c.inc();}
public int rd() {return c.rd();} }
}
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI16
T IP I P R IM IT IV I, C L A SS I, OGG E TT I
In Ja v a si d is ti ngu e fr a • tip i p ri m it iv i: boo lea n , ch ar , by te , sho rt, in t, long , flo at , doub le • C la ss i • ri fer im en ti a ogg ett i.
T IP I P R IM IT IV I
TipoDescrizioneDefaultSizeRangeBooleantrue o falseFalse1 bit-Charcarattere UNICODE\u000016 bit\u0000 - \uFFFFByteintero con segno08 bit-128 - 127Shortintero con segno016 bit-32768 - 32767Intintero con segno032 bit -2 31 - 2 31-1Longintero con segno064 bit -2 63 - 2 63-1FloatIEEE-754 float0.032 bit-10 -45 - 10 38
DoubleIEEE-754 double0.064 bit-10 -324 - 10 308
• i ca ra tt er i UN IC OD E sono con si d er ati se n za se gno , e o ffr ono am p io suppo rto all ’in te rn az io n ali zzaz ion e, e sono A S C II co m p ati b ili (s u i p rimi 256 ); v al gono ino lt re i cl ass ic i “e sca p e a ll a C ”:
'\n',
'\'',
'\t'• la nuov a no taz ion e
'\u0040'c on se n te d i es p rim er e un ca ra t- te re UN IC OD E tr amit e 4 ci fr e e sa d ec im ali • in Ja v a non sono a mm ess i ti p i co m e
long int,
short int, et c: i no mi co rr etti sono se m p li ce m en te
long,
short, et c.
I ti p i p rimiti v i si m an ipo la no co m e va lo ri , con la st ess a se m an ti ca d el C e d i alt ri li ngu agg i. Q u ind i, qu ando si p ass ano all e fun zi on i v engono p ass ati p er cop ia .
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI17
R IF E R IM E N T I A OGG E TT I In Ja v a, a d iff er en za d ei ti p i p rimiti v i g li ogg etti si m an ipo la no es cl u si va m en te tr a m it e rif er im en ti . N on è po ss ib il e d ef in ir e is ta n ze d i ogg etti (v ar ia b ili ) all o ca te st ati ca m en te , tu tt o d ev ’e ss er e all o ca to d in ami ca m en te c on new.
A tu tti g li eff etti i rif er im en ti sono co m e pun ta to ri, ind ir izz i d i m em o ria , m a sono d er ef er en zi a ti au to m a ti ca m en te ( non co m e in C , *p ), e non re ndono v is ib il e n é m an ipo la b il e l’ ind ir izz o .
U n a fr a se d el tip o c2 = c1 fa pun ta re i du e r if er im en ti a ll o st ess o ogg ett o , n o n d u p li ca l’ ogg ett o st ess o !
E S E M P IO
/**
* verifica il concetto di Riferimento a oggetti@author Enrico Denti@version 1.0, 5/4/98*/class Point {public int p1; public int p2; …}
class Esempio3 { // contiene solo il mainpublic static void main(String args[]){
Point p1 = new Point(100,10), p2 = p1;
System.out.println("p1: " + p1.x + "," + p1.y); System.out.println("p2: " + p2.x + "," + p2.y);
p1.x = 400;
System.out.println("p1: " + p1.x + "," + p1.y); System.out.println("p2: " + p2.x + "," + p2.y);}}
• O gn i m od if ica a
p1s i rit rov a a n ch e in
p2, a te stim on ia n za c h e i du e sono so lo rif er im en ti ch e re fe re n zi ano lo st ess o ogg ett o .
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI18
R IF E R IM E N T I A OGG E TT I e P A SS A GG IO P ARA M E T R I
I p ar am et ri p ass ati n ell e invo caz ion i d i m et od i sono p ass ati p er cop ia . N on es is te il p ass agg io d i p ar am et ri p er r if er im en to . QU IND I: ch ia m ando un m et odo a c u i p ass ia m o un rif er im en to ad ogg etti , sti am o p ass ando in v er it à la c op ia d i un rif er im en to .
E S E M P IO
// funzione di una qualche classe…void swap (Point p1, Point p2){ Point pTemp;
pTemp = p1; p1 = p2; p2 = pTemp;}
• Q u es ta fun zi on e non fa a ss o lu ta m en te n el ch ia m an te , p er ch é abb ia m o se m p li ce m en te fa tt o lo sc a m b io su ll e c op ie d ei rif er im en ti , m a i rif er im en ti o rig in ali rim angono inv ar ia ti .
E S E M P IO 2
// funzione di una qualche classe…void swap_correct (Point p1, Point p2){ Point pTemp; pTemp.x = p1.x; pTemp.y = p1.y p1.x = p2.x; p1.y = p2.y p2.x = pTemp.x; p2.y = pTemp.y;}
• Q u i abb ia m o m od if ica to i v al o ri d eg li ogg etti rif er iti , ch e sono g li st ess i d el ch ia m an te , an ch e se i rif er im en ti sono un a c op ia . Il ch ia m an te V E D E le m od if ic h e.
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI19
C L O NA Z IO N E D I OGG E TT I
P er dup li ca re un ogg ett o o cc o rr e d ef in ir e un m et odo sp ec if ic o
clone()
, ch e p rovv ed e a dup li ca re l'ogg ett o
p2 = p1.clone();
E S E M P IO
class Point {…}
class Esempio3bis {public static void main(String args[]){
Point p1 = new Point(100,10), p2=p1;
System.out.println("p1: " + p1.x + "," + p1.y); System.out.println("p2: " + p2.x + "," + p2.y);
p2 = p1.clone();
p1.x = 400;
System.out.println("p1: " + p1.x + "," + p1.y); System.out.println("p2: " + p2.x + "," + p2.y);} }
Il m et odo cl on e() sa rà qu al co sa d el g en er e:
Point public clone(){Point p2 = new Point();p2.x = x;p2.y = y;return p2;}• In qu es to m odo ,
p2r im an e in alt er at o al v al o re (100 ,10 ), m en tr e
p1
v ie n e m od if ica to in (400 ,10 ). • In v er it á il m et odo
clone() è p re d ef in it o p er tu tti g li ogg etti , m a è m o lt o co m p li ca to d a u sa re e d è tr oppo fac il e u sa rlo in m odo sc o rr ett o . M eg li o rid ef in ir lo co m p le ta m en te !!
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI20
U G UA G L IAN Z A D I OGG E TT I
P o ic h é le v ar ia b ili Ja v a sono rif er im en ti , un te st d i u g u ag li a n za d el tip o c1 == c2 v er if ic a se du e r if er im en ti pun ta n o a ll o st ess o ogg ett o , n o n se d u e ogg etti h a nn o lo st ess o va lo re !
P er con tr o ll ar e se du e ogg etti h anno lo st ess o v al o re d i u sa il m et odo
equals(), pu re p re d ef in it o p er tu tt e le c la ss i:
E S E M P IO
/**
* verifica il concetto di uguaglianza fra oggetti@author Enrico Denti*/class Point {…}
class Esempio4 {public static void main(String args[]){
Point p1 = new Point(100,10), p2=p1;
System.out.println("p1==p2? ” + (p1==p2)); System.out.println("p1.equals(p2)? ” +p1.equals(p2));
p2 = p1.clone(); p1.x = 400;
System.out.println("p1==p2? ” + (p1==p2)); System.out.println("p1.equals(p2)? ” +p1.equals(p2));} }
R is po st a:
p1==p2? truep1.equals(p2)? truep1==p2? Falsep1.equals(p2)? false
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI21
T IP I P R IM IT IV I e C L A SS I
S p ess o è n ece ss ar io tr att ar e i ti p i p rimiti v i co m e ogg etti (a d es em - p io , p er p ass ar li p er r if er im en to a un a fun zi on e, m a non so lo ).
A qu es to se rvono le “ w ra p cl a ss es ”, un a p er ogn i ti po p rimiti vo , ch e in p ra ti ca “ in ca p su la no ”un ti po p rimiti vo :
TipoClasse corrispondentebooleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble
• a p ar te l’ in iz ia le , la c la ss e h a qu as i se m p re lo st ess o no m e d el ti po p rimiti vo , tr ann e
char/
Charactere
int/
Integer• le c la ss i fo rn is cono m et od i p er conv er ti re d al ti po p rimiti vo a un ogg ett o d ell a c la ss e, e v ice v er sa
class Esempio6 { public static void main(String args[]){
int x = 35;// tipo primitivo
Integer ix = new Integer(x);
// conversione int →→Integer per costruzione
System.out.println("ix = " + ix);
// conversione implicita Integer →→String
x = ix.intValue()*4;
// conversione esplicita Integer →→int
System.out.println("x = " + x);
// conversione implicita int →→String }}
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI22
S T R IN G H E IN J A V A In Ja v a, le st ri ngh e sono ogg etti , is ta n ze d ell a c la ss e String: un a
String
r app re se n ta uno sp ec if ic o v al o re , ed è qu ind i un ogg ett o non m od ifi cab il e.
In Java un a
Stringn o n è un bu ff er m o d if ic a b il e!!
P er imm ag azz in ar e st ringh e m od if ica b ili si u sa
StringBuffer.
L e st ringh e po ss ono ess er e c on ca te n at e c on l’ o p er a to re +
L a c on ca te n az ion e d i co st an ti st ring a è fa tt a a co m p il e- ti m e, qu ind i non in tr odu ce in eff ic ie n ze .
• Q u ando si sc rivono co st an ti st ring a fr a v ir go le tt e (e s.
“ciao”), v ie n e c rea to au to m ati ca m en te un ogg ett o
Stringi n iz ia li zza to a ta le v al o re . • U n a c o st an te st ring a non può ecce d er e la rig a: dov endo sc riv er e co st an ti p iù lungh e, è oppo rtuno sp ezza rle in p ar ti p iù co rte e con ca te n ar le c on l’ op er at o re + .
A tt en zi o n e: la se lez ion e d i un ca ra tt er e si fa tr amit e il m et odo
charAt(), non con l’ op er at o re [] co m e in C o C ++ !
String s = “Nel mezzo del cammin “;char ch = s.charAt(3);
E si st ono d ec in e d i op er at o ri p re d ef in iti su
String: si v ed a la do cu m en taz ion e p er m agg io ri d ett ag li .
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI23
S T R IN G H E IN J A V A : L A L IBR E R IA
E cc o al cun e d ell e op er az ion i d is pon ib ili p er g li ogg etti d i ti po st ring a.
__________________________________________char charAt(int index)R it o rn a il ca ra tt er e a qu ell a sp ec if ica lo caz ion e _____________________________________________
boolean endsWith(String suffix)R it o rn a v er o se la st ring a te rmi n a c on qu el su ff iss o _____________________________________________
boolean beginsWith(String prefix)R it o rn a v er o se la st ring a c o mi n ci a c on qu el p re fiss o ___________________________________________
boolean equals (Object other)R it o rn a v er o se la st ring a e ' ugu al e a o th er _____________________________________________
String substring (int beginindex)String substring (int beginindex, int endindex)R it o rn a la so tt o st ring a c o m p re sa tr a in ca ra tt er e d i i nd ice b eg in ind ex e a ) la fin e b ) il ca ra tt er e d i i nd ice e nd ind ex _____________________________________________
int lenght()R it o rn a la lungh ezza d ell a st ring a _____________________________________________
String toLowerCase()String toUpperCase()T o rn a un a st ring a tu tt a in mi nu sc o lo /m ai u sc o lo
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI24
ARR A Y IN J A V A In Ja v a, g li a rr a y sono ogg etti : non es is te un v er o no m e d i cl ass e, in qu an to sono id en ti fica ti d all ’op er at o re [].
D ef in ire un a rr ay Java si g n if ic a d ef in ire un ri fe rim en to : l’ arr ay v er o e p rop rio v a c rea to con
new(a m eno ch e non si a sp ec if ica to tr amit e un a c o st an te )
L a lungh ezza d ell ’a rr ay è ind ica ta d al ca m po (pubb li co e non m od if ica b il e)
lengthd ell ’a rr ay st ess o .
E S E M P IO
/*** Primo esempio d’uso di array in Java@author Enrico Denti@version 1.0, 5/4/98 */
class Esempio5 {public static void main(String args[]){
int[] v1 = {8,12,3,4}; // vettore di 4 intint[] v2; // riferimento a un vettore di int
v2 = new int[5]; // creazione vett. di 5 int// (crea 5 celle int, inizializzate a 0)
for(int i=1; i<=v2.length; i++) v2[i-1] = i*i;
for(inti=0; i<v1.length; i++) System.out.print(v1[i] + '\t');System.out.println(“”);
for(int i=0; i<v2.length; i++) System.out.print(v2[i] + '\t');}}
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI25
ARR A Y IN J A V A (II )
A tt en zi o n e: C re a re un a rr ay (c o n
new) si g n if ic a cre a re • N ce ll e d i un ti po p rimiti vo , se l’ arr ay è d i ti p i p rimiti v i • N ri fe rim en ti a ogg ett i (t u tt i
null) se l’ a rr ay è d i ogg ett i
N el sec ondo ca so , qu ind i, i si ngo li ogg etti do vr anno ess er e c re a ti es p li cit a m en te c on
news e d el ca so .
E S E M P IO
/*** Secondo esempio d’uso di array Java@author Enrico Denti@version 1.0, 5/4/98 */
class Esempio5bis {public static void main(String args[]){
String v1[]; // RIFERIMENTO al futuro vettore// si può anche scrivere String[] v1;
v1 = new String[2]; // creazione vettore di due (rif. a) String// NB: le due String però ancora non esistono!
v1[0] = "Ciao mondo"; // una String costante
v1[1] = new String(v1[0]);// una String creata din. uguale alla prima}}
Franco Zambonelli Enrico Denti - INTRODUZIONE ALLA OOP IN JAVA: LE CLASSI26
M E T O D I D I C L A SSE
F ino ra , i m et od i d ef in iti d en tr o a un a c la ss e (a p ar te il
main… ) er ano d es ti n ati a e ss er e invo ca ti su un ’is ta n za d i qu ell a c la ss e:
class Counter {private int val;public Counter() { val=1; }public Counter(int x) { val=x; }public void reset() { val = 0; }public void inc() { val++; }public void dec() { val--; }public int rd() { return val; }}
public class Esempio2bis { public static void main(String args[]){Counter c1, c2;c1 = new Counter(); c2 = new Counter(5);c1.inc(); c1.inc(); c2.dec();System.out.println("c1 vale " + c1.rd());System.out.println("c2 vale " + c2.rd()); }}