You are on page 1of 42
Capitolul 10 numere, variabile si metode statice Numerele conteaza Operatii matematice. utiizarea numerelor in Java nu se limiteaza la operat aritmetice primitive. Uneori, trebuie s afli valoarea absolut a unui numér,s8 rotunjesti un numar sau sd afli care este mai mare dintre dou numere. Poate vies afigezi numerele cu exact doud pozitii zecimale sau s8 separ grupurile de mi pentru a face numerele mai usor de citit.Dar ce spul despre datele calendaristice? Poate vrei s3 afisezi datele in diferite moduri sau chiar s3 manipulezidatele, astfel incét s8 poti spune ceva de genul,adauga trei saptamani la data de azi".Ce parere ai despre decelarea unui obiect Strin r-un num&r? Sau despre transformarea unui numar Intr-un obiect String? Ai noroc. Biblioteca Java API este plina de metode pentru manipularea numerelor,pregatite siusor de folosit. Dar cele mai multe dintre ele sunt statice, asa c8 ar fi bine s8 incepem prin a invata ce inseamna ca 0 varlabild sau o metods fie statice,incluzand aici i constantele din Java ~ variabilele statice finale, este uncapitolnou» 273 Scanned with CamScanner metode din clasa Math Metode din clasa MATH: metode globale, atat cat este posibil... exceptind faptul ci in Java nu exist nimic global. Dar windeste-te putin: ce-ar fi daci am avea o metodi al cirei comportament nu depinde de valoarea nici unei variabile de instanta? Si luzim, ca exemplu, metoda round() din clasa Math. De fiecare dati face acelasi lucru ~ rotunjeste un numar in sirguld mobili (argumentul metodei) Ia cel mai apropiat numir , intreg. De fiecare dati. Daca ai avea 10.000 de instante ale clasei Metedele din clasa Math Math si ai rula metoda round(42.2), ai obfine acelagi rezultat, lo: eaLe adick valoarea intreaga 42. Cu alte cuvinte, metoda actioneaza nu folosese Variabile de asupra argumentului si nu este niciodata afectatd de starea unei 4 A variabile de instanta. Singura valoare care afecteaz4 modul de instanfi. $i, deoarece executie al metodei round() este argumentul transmis metodei! metodele sunt statice, nu Nu tise pare ci instantele clasei Math nu ar face decat si ocupe det . spatiu pretios din zona heap, doar pentru a rula metoda ai nevoie de 9 instanfia round()? Si ce spui despre celelalte metode Math, cum ar fi min(), e Somer care primeste doud primitive numerice i rewurmeazd valoarea clasei Math. Tot ce-fi ‘mai micd? Sau metoda max(). Sau abs(), care returneaza 5 valoarea absolut a unui numir. trebufe este clasa Math. Aceste metode nu folosesc niciodatai valori ale variabilelor de instanté. De fapt,clasa Math niai nu ae variable de instant. Ca urmare, Roe a o wath soana(42-2)) as al ie i cdstigat prin crearea une! natn a clase! Math int y = Mathomin(56, 12)7 ice crezi? Nici nu este nevoie. De fapt, nici nu este posibil pelt = aeceate saa i —_ o * este meta Daca incerci sa creezi o instanta pels ver fobsese a clasei Math: conptd Sa heat treb 'oMentu lor Math mathObject = new Math(); oa soe ‘eget ates ob Obtii urmatoarea eroare: Pepe Sor ree User) PoereCe rec WCcen rts) are orata 9. construe oe SIE wmatoru baru: Pree eer ss Aceasta henge Se! Math este privat! R MCLODATA hainaac ct Pel folsi linea new pentry Casa) a Math ca sa Crees! im obit Math, aco 274 capitolul 10 a i Scanned with CamScanner Viferenta dintre metodele obisnuite si metodele statice Java este un limbaj orientat spre obiecte, ‘azspecial, de obicei o metodi utilitars ( numere, variabile $i metode statice dar, din cand in cand, apare un (cum ar fi metodele clasei Math), in care nu este necesara existen{a unei instante a clasei. Cuvantul cheie static permite rularea unei metode fairé nici o instanfa a clasei. O metoda staticd se traduce prin ,comportamentul nu este dependent de o variabila de instant, asa ci nu este nevoie de un obiect, ci mumai de o clasi. metode obisnuite (nestatice) i de, public class Cantec { Yoloorea ee String titlu; <— stone rent public Cantec(string t) ¢ “fodel conta”: tity public void canta() ( SoundPlayer player = new SounéPlayer(); Player.playSound(titiu); ) rent a varicblel : c yaecronta atu’ reprezhta Cantes j centecul redat ta apelares metodel contd. tity canta) is sf a bie Dow instante ale close! Cantee Cantec Cantec s3.canta(); s82.canta(); a cane’ Peto Apetes metode cortad refering EY aceasts pentru aceasta referinta rege Setemges determna redarea plese! el Poitye My Way". metode sta‘ public [@E&E1Z) ine min (int a, int b) ( 1/ returneaza valoaren cea mai mica // @intre cele dova mumere furnizate // ca parametri Math il 0 varabhs de mind iston{a. Comportement max) retodelor nu se mode abs) ‘in functie de starea Variabieler de instonté. Math.min(42, oN Folosestl numele clasel, nu numele unel referinfe. 36); egtlalcl> 275 Scanned with CamScanner metode statice O metoda sta’ numele clasei \Math.min(88, 86)7 4 este apelata folosind O metoda obisnuita este apelata folosind numele unei referinte Ce inseamna sa ai o clasa cu metode statice Deseori (dar nu intotdeauna), o clasi cu metode statice nu este conceputa pentru a fi instangiata. in capitolul 8 am discutat despre clase abstracte si despre faptul ca folosirea modificatorului abstract face imposibilé folosirea instructiunii new pentru tipul clasei respective. Cu alte cuvinte, este imposibild instantierea nei clase abstracte. Dar poti impiedica restul codului si instantieze 0 clasi care nu este abstract prin marcarea construc- torului clasei ca private, Adu4i aminte ci 0 metoda marcati ca privat inseamna ci metoda poate fi ape- até numai de codul din clasa respectiva. Un construc: tor marcat ca privat inseamni, in esent, acelasi lucru =numai codul din aceeasi clasi poate si apeleze constructorul. Nimeni nu poate folosi instructiunea new din afara clase. Astfel functioneazi clasa Math, de exemplu, Constructorul este privat si nu poti crea noi instange ale clasei Math. Compilatorul stie ci nu ai acces din cod la acel constructor privat. 276 capitolul 10 Se Cantec t2 eo new Cantec(); le2.canta(); Aceasta nu inseamna cé o clas cu una sau mai multe metode statice nu ar trebui si fie instantiata niciodatd. De fapt, orice clasi in care scrii o metoda main() este 0 clasi care contine o metoda statica! De obicei, creezi o metoda main() pentru a putea si Jansezi si si testezi o alti clasi, aproape intotdeauna prin instantierea unei clase in metoda main(), apoi prin apelarea metodelor pentru instanta creati. Poti si combini cum vrei metodele statice si nestatice intr-o clasi, desi existenta unei singure metode nestatice inseamni ca trebuie si existe 0 modalitatede crea o instanti a clasei. Singurele modalititi de creare a noilor obiecte sunt instructiunea ,new* $i deserializarea (sau ceva numit Java Reflection API, despre care nu vom discuta aici). Nu existi o alti cale. Dar cine anume executa instructiunea new poate fio intrebare interesantd, despre care vom discula ceva mai tarziu in acest capitol. Scanned with CamScanner Metodele statice nu pot folosi variahile vestatice (de instantal! Metodele statice ruleazi fark sa ie nimic despre o anumiti instangiia clasei din care face parte metoda staticd. $i, asa cum afi vizut in paginile anterioare, este posibil nici si nu existevreo instanti a clasei respective. Deoarece o metodi statici este apelati folosind clasa (Math.random()), nu 0 nferin{a a instantei (t2,canta()), nu poate si refere nici una din variabilele de instanta ale clasei, Metoda static nici nu stie pe care dintre valorile variabilelor de instant ar trebui si 0 foloseasca. Daca incerci sa compilezi acest cod: public class Rata { care AS ne? private int marime; agro public static vold main (stringt] args) ( System.cut.printin ("Marimea ratei este * + marime) ; , Chlar daca exsté un obiect Rata Public vold setiarime(int 9) ( Zone heop: ene ge marime = 9; nimlc despre el, , public int getmarime() ( return marime; Vei obtine urmatoarea eroar Peron erry POMS UCC Lec ea Tet marime cannot be referenced from Cierra Cron reste run Pacis trea Sunt sigurdi c& este vorba despre , marimea MEA. numere, variabile si metode statice Dack incerei si folosesti © Vantabila de instangi in interforul unei metode statice, compilatorul se gandeste: ,Nu stiu cataf obfect i apartine varfabila de instanfi despre care Yorbegti!™ Daci in zona heap exist zece obfecte Rata, metoda statica nu stie nimic despre nfcf unul dintre acestea. Banu, sunt foarte sigurd c& este vorba despre marimea MEA. estialcl> 27 Scanned with CamScanner metode statice Metodele statice nu pot folosi nici metode nestatice! Ce fac metodele nestatice? De obicei, folosese starea variabilelor de instanfa pentru a afecta comportamentul metodei. O metod’ getNume() returneazi valoarea variabilei nume. Al cui nume? Al obiectului folosit pentru apelarea metodei getNume() Codul de mai jos nu va putea fi compilat: Apelare ic class Rate 9 metodel gettar public cla: t fore decahsa one beng private int marine; — vorigbia Se primed foloseste instant maria, public static void main (stringl] args) ( System.out.printin ("Marimea ratei este “ + getMarime()); » public void setMarime(int s) { public int getéarime() ( return marime; Serer ES eee Ces ce§ PCS Re Scere ere! erent System.out.printin ("Marimea Pec oR earrcrctr EY) junto onda Teneo? siplinlderres wd eatice a ideinstantt ato aie stares 278 capitolul 10 a nuyextst _ intrebari stupide Tz ceosetntampts dacs incerc sé apeleg ‘ometodd nestaticd dintr-o metodi state, darmetoda nestaticd nu folosestenicio variabilé de instanfa? Va permite compllatorul aga ceva? R: nu.compitatoru nu stie dacs foloseyy sau nu variabile de instanga intr-o metods nestaticd, ci doar c& ai putea s8 o faci. Gandeste-te la implicatil.ce s-arintémpla acd ai avea voie s8 compilezi un asemenea scenariu si intro te hotdrdst s8 modi implementarea, astfelincét metoda nestaics 88 foloseascd o variabilS de instanta? Sau, ‘mai rau, ce se intémpls dacs o subclass suprascrie metoda sifoloseste o variabila de Instanta in versiunea suprascrisa? A: As putea jura c& am vizut un program care apela o metoda statica folosind o refering in locul numelui unei clase, Re potifece acest ueru da.ase cum spunea si mama ta,,nutot ce este legal este sibun*. Desi un program care apeleaza 0 metods staticd folosind o instants clase functioneaza, codul este derutant si mai gu de citit. De exemplu,ai putea scrie ceva de genul Rata d = new Rata(); String!] s = 07 d.main(s); Codul de mai sus este valid, dar compilatorul oricum rezolva expresia ajungand la casa real (OK, deci deste de tip Rata iar maind este 0 metoda statics, aga c& voi apela metoda main( din clasa Rata’).Cualte cuvinte,folosirea referinfei dpentru apelare® metodei main() nu inseamna c& metoda rmain() va avea vreo informatie despre J, obiectulreferit de d.Aceasta nu este decat 0 alta cale de apelare a unei metode statice- dar metoda ramane statics! Scanned with CamScanner numere, variabile si metode statice Variabile statice: valoarea este aceeasi pentru TOATE instantele clasei Imagineazi-ti cd trebuie si numeri céte instante Rata sunt create in timpul rulirii programului. Cum ai putea si o faci? Poate folosind o variabili de instant pe care si o incrementezi in constructor? private (static) int numaraRate = 0; Acun variabia va fi class Rata ( public Rata() ( —ncrementcia ay int coearafate © (0; numaraRatet+; pe flecare data cénd est, public Rata) € aceasta pst ) ‘iat constcsend numareRatet+; —inlaza rotate VO Rated, Geoarece Variabil otdeauna Variabila ni i oF ec ntnarRte eu | este sated sors Creal un shan Gand ene rehtiaata dye ‘Nu, aceasta solutie nu este bund, deoarece variabila public void setMarime(int s) ( numaraRate va incepe de la 0 pentru fiecare obiect marime = s; Rata. Ai putea incerca si apelezi o metodi dintr-o alta ? clasi, dar aceasta ar fi o solutie greoaie. Ai nevoie de o clasi care confine o singura copie a variabilei, astfel incat toate instantele si foloseasca in comun copia, . public int getMarime() { return marine; i pune a dispozitie o variabila static&: 0 valoare partajati de toate instantele unei clase. Cu alte cuvinte, o singurd valoare pentru clasd, in loc de 0 valoare pentru fiecare instanfd. Rata ‘marime static numaraRate Scanned with CamScanner ad variabile statice Variabia static’ opi, hstonta_nghetata rumérul | 280 capitolul 10 ae = Copil, mstanta numérul 2 yy Vasiabilele statice sunt partajate. Teate instantele unei clase partajeazd o singura copie a Variabilelor statice. Variabile de instanfa: una pentru fiecare instanta Variabile statice: una pentru fiecare clas Mai devreme in acest capitol, am vazut ca declararea unui constructor ca privat Inseamné cé respectiva clasa nu poate fi instaniata de codul din afara clasei.Cu alte cuvinte,numai codul din interiorul clasei Poate crea o noua instanta a clasei prin folosirea unui constructor privat. (Aver aici © problema de tip, oul si gaina”) Dar cum poti scrie o clas astfel incat si nu Poatd ficreata decato singura instanta a lasei respective, si oricine vrea sa foloseasca acea clasa sé fie obligat sa foloseasca acea instanta unica? Scanned with CamScanner jy numere, variabile si metode statice Initializarea unel variabile statice Variabilele statice sunt init lizate la inctircarea unei clase. O clas este incircatd atunci cind masina virtual Java decide ci este Toate variabilele impul si incarce clasa respectiva. De obicei, masina JVM incarea ' i i oe eeoaiehts J pica statice dintr-o clasi deoarece un program incearci si creeze o noul instant a t za clasei, pentru prima dati, sau foloseste o metodi ori o variabili clasa sunt a clasei, Ca programator, ai po: ilitatea si ceri masini JVM initializate inainte slincarce 0 clasi, dar aceasti situatie este rareori intalnita. in cele 5 i bine si creat ‘mai multe cazuri, este mai bine si lasi masina JVM si decida cand de a putea fi trebuie incarcataé o clasi. vreun obiect al Inifilizarea variabilelor statice garanteaz dowd lucruri ; clasel respective. Variabilele statice dintro clas sunt initializate inainte de a fi creat wreun obiect al clasei respective. Variabilele statice dintr-o clas sunt initializate inainte de a fi apelatd vreo metoda staticd'a clasei respective. ta ncarcarea close! initialaaté esol, class Jucator ( sjucatori este inf desi nu era nec Varicbia numer sriabila Cu 2er0, re | static tnt mumarsucatort = 0; KX dmaiseel OPIN YES bia ren ETS iy private string mune; Senate biel sate priest Val public Jucator(String n) { ca $i voriabaele de instanta- mune = ny nunargucatori++: Valorie prestaban < fe ent instanta declarate, A nen eee state de : , Stat ace y ~ Printive tres (ong, short etey:0 east rin i : Me h VigUs, mobta (oat 5 d ub public class JucatorTestDrive { booleene: fase ¥ double): 09 Public static void main (string[] args) ( referinte: nut System.out.printin (Jucator-numarJucatori) ; Sucator unu = new Jucator(*Tiger Woods"); System.out.printin (Jucator-numarducatori) ; , AN a stale la fel ea 11a 0 voriabila stolca se face peceny a de se jalizate la incrcarea clasei. Daci nu initializezi explicit o variabili statica (atribuinduii o valoare in ‘momentul declararii), primeste o valoare prestabilit’, asa ci Yariabilele de tip int primesc valoarea zero, ceea ce inseamni ci nu ¢ranecesari initializarea explicit ,numarJucatori = 0°. Declararea nei variabile statice fara initializare inseamna ca variabila statica \4 primi valoarea prestabilita pentru tipul respectiv, exact Ia fel um variabilele de instant primesc valori prestabilite la declarare. Fie eat Wecon nap Whe? Pewee r ery ee Rare ee 1 eC oye aay estlaiciy 281 Scanned with CamScanner constante statice finale Variabilele statice finale sunt constante Ovariabild marcati ca £inal inseamné cA - dupa inifializare - nu mai poate fi modificati. Cu alte cuvinte, valoarea unci variabile statice finale va riméne acecagi atat timp cat clasa este incarcati. Dac vei ciuta variabila Math.PI in biblioteca API, vei gisi urmétoarea declaratie: public static final double PI = 3.141592653589793; Variabila este marcatii ca public, astfel incat si fie accesibila din orice cod. Variabila este marcati ca static, astfel incat si nu fie necesari o instant: a clasei Math (pe care, asa cum iti aduci aminte, nici nu 0 poti crea). Variabila este marcata ca final, deoarece PI nu-si modificd valoarea (cel putin din punctul de vedere al limbajului Java). Nu exist nici o alti modalitate de desemnare a variabilelor ca fiind constante, dar exist o conventie de denumire care te ajutd si identifici constantele. Numele variabilelor constante ar trebui sa fie scrise numai cu litere mari! Initializarea unei variabile statice finale: @ in momentul declardiri public class Foo ( public static final int Foo_x 23; Y observa conv ven Varobiele Stace Tae ort i ) 950 C& numele ar eget Constante, SAU © intr-un bloc de initializare staticd: public class Bar ( public static final double BAR_SIGN; sie) ¢ BAR SIGN = (double) Math.random() 7 PTTL ' ES ‘aceasta si imediat dupa Pass © Pulea fi foloste variablele states 282 capitolul 10 Tie eon Wincor | Un bloc de iii) (static initializer) este un bloc de cod rulat la incarcarea unei clase, inainte ca orice alta secventd de cod sa poata folosi clasa, asa ca este un loc potrivit pentru initializarea unei variabile statice finale. class Foo { final static int x; “static ( x)= 427 Daca nu atribui o valoare unei variabile finale in unul din aceste moduri public class Bar ( public static final double BAR_SIGN; f6r8 ntiatearey Compilatorul va semnala 0 eroare: acer ren ser Soest SCS Ne Co might not have been initialized — Scanned with CamScanner yee Modificatorul final nu este doar pentru variabilele statice... Folosirea cuvantului cheie final nu este limitatd la ‘modificarea variabilelor statice; £inal poate fi folosit. sipentru alte variabile, inclusiv variabile de instanta, yariabile locale si chiar parametri ai metodelor. in orice situatie, semnificatia este aceeasi: valoarea variabilei nu mai poate fi modificata. Dar Poti folosi modificatorul final si pentru a impiedica suprascrierea unei metode sau crearea unei subclase. variabile finale nestatice class Foof { final int size = 3; @— final int whuffie; ‘cum, voriebia ste nu poate fi modificata Foof() ( whuffie = 42; € acum, varisbila whuifle nu ) poole fi modificata void dostuff (final int x) ( J «nu poate fi modificat ) void doore() { final int 2 = 7; // z nu poate £1 modificat d y metode finale class Poof ( final void calewhuffie() ( 11 operatii importante fie clase finale final class ClasaMeaabsolutPerfecta { 41 nu poate £1 extinga numere, variabile si metode statice Unei variabile finale nu ise poate schimba valoarea. O metoda finala nu poate fi suprascrisa. O clasa finala nu poate fi extinsa (ceea ce inseamna cA nu poti crea subclase). Totul este atat de...de final. Vreau s& spun, dac& as fi stiut cdi nu voi mai putea schimba estiaicl> 283 Scanned with CamScanner static si final _uhexist intrebari stupide & PUNCTE CHEIE L 1 O metoda statica ar trebui s8 fie apelatafolosind numele 2 Ometoda staticd nu are acces lao clase, ru o refering a unui obiect: variabild nestaticd. Dar o metodé nestaticé are ee ame acces la o variabila statica? Tn loc de myFoo.90() R: Desigur.O metods nestatica dintr-o clas m0 metoda static’ poate fi apelatd far8 ca in zona heap s8 existe o instant a clasel din care face parte meloda. 1m Ometoda staicd este bund ca metoda utlitard care nu depinde riciodaté de valoarea unei anu variable de instan. poate apela oricdnd o metoda statica a clasei si are acces la variabilele statice ale cla 1m Ometoda statics nu este asocialS cu 0 anumit instank—c Tz. comotiveas avea si declar oclasi ca uma cu clasa ~ aga c& nu poate avea acces la valorile finala? Nu este o asemenea declarasie contrara ‘atabllor de intan( ale casel. Nua sce valor ale ‘tocmai scopului programarii orientate spre vatiabilelor de Instanta s8 foloseasca. obsecte m O metoda static nu poate avea acces la o metoda nestatca, deoarece metodele nestatice sunt asociate, de obicei,custrea varabilelor de instanf. ie Peter Seca 1s Dacd aio clas care confine nual metode static su wei si Re oa sinun motive nei clase ca finale este asigurarea securitati.De ae elanovca dnulrspete, po sided exemplu,nu poti crea o subclasa a claset String. Poe nord aig \ 23-fihaosul pe care Far crea cineva care ae apne hoon pe cae a cain Secu edd vane pri tl oes aeeiedl ibdair soa oh baamortam, nel anumite clase. Exist osingur& copie a variatill state in 5 Ae mn Pew clas, nu o copie a variabilei pentru fiecare obiect, asa cum se obiectele String asteptate. Daca trebuie s3 te Sara coed vuteb Oe eat bazezi pe o anumita implementare a metodelor ; = Ometoda stticd are acces la vaiabilele statice. dintr-o clasa, declar& clasa ca finals. 1m Penirua crea 0 constanta in Java, declar o variabilé ca staticd i finals, leclararea metodelor 1m Ovariabilé final staticd trebuie 88 primeascd o valoae fea ca finale intr-o clasi finala? decarate, fe Int-an bloc deiniiazare static. static { DOG_CODE = 420; R: acs intreaga casa este declarats finals, nu ) este necesar 8 declari si metodele ca finale. i : '™ Convenjia de denumire a constantelor (variable statice finale) Gandeste-te putin - dacd 0 class este final, nu cerca al cela oo sre ae culitere mari. poate fiextins3, deci nici una dintre metode nu va putea fi vreodata suprascris8. = Dupd inijaizare,o variabl fnald nu-gimai poate schimba valoarea. Pe de alts parte, daca vrei s3 permiti extinderea a 2 unei case sive a alt programatr sa poats Fee caret eee ea ae suprascrie unele dintre metode,darnu pe toate, nu declari clasa ca finals, ci doar metodele = Ometoda finald nu poate fi suprascrisé. specifice.O metods finala nu poate fi suprascrisi O clasé finalé nu poate fiextinsa (subdlasatd. Int-o subclass. 284 capltolul 10 _f Scanned with CamScanner quan enesst seen eget creionul Ce este permis? | KEEP and de ceal invi Kspeseteniccac | urméatoarele clase pot fi compilate? RI G HT numere, variabile si metode statice @ vuite crass roo ¢ static ine x public void got) ¢ public class Foot ¢ + pepeencenre sean ° static final int x = 12; public void go() ( System. out .print1n (x); ) Q punts cians roo2 int Public static void go) ( @ wetic tins reosccani 5 System. out.print1n(x); nee etek 7 if ) 2 public void go(final int x) ( Systen.out -printin (x); , , @ unite cians ro02 ¢ final int public void go() { ° Rapp Stes Fost Ant x = 12 System. out .printin(x); z , public static void go(final int x) ( , System.out .printin(x); ? estiaicly 285 ——— oa seat Le Scanned with CamScanner metode din clasa Math Metode din clasa Math Acum stim cum, functioneazi metodele statice, aga ci este timpul si vedem citeva metode din clasa Math. Nu vom discuta despre toate, ci doar despre cele care meriti sd fie scoase in evident. Consult documentatia API pentru celelalte, care includ sqrt(), tan(), ceil(), floor() si asin(). 286. capitolul 10 Math.random() Returneazti o valoare de tip double, de la 0.0 la 1.0 (exclusiv). double r1 = Math.random(); int x2 = (int) (Math.random() * 5)7 Math.abs() Returneazti o valoare de tip double, reprezenténd valoarea absolutt a argumentului. Metoda este suprainctircatd, aga ct dacti-i transmiti o valoare int, obtii 0 valoare int. Dac&-i transmiti o valoare double, obfii o valoare double. dnt * = Math.abs(-240); // returneaza 240 double d = Math.abs(-240.45); // returneaza 240.45 Math.round() Returneaz& o valoare de tip int sau long (In functie de tipul argumentului, care poate fi float sau double), obtinut& prin rotunjirea argumentului la cel mai apropiat intreg. Ant x = Math.round (-24.8£); // returneaza -25 int y = Math.round (24.45£); // returneaza 24 8 valorile tn vir nsiderate a fi ae WW adaugi prefixu) ,¢* mobild sunt double, daca n Math.min() Returneazd o valoare reprezentand numiirul cel mai mic dintre cele doud argumente. Metoda este supranctrcaté, astfel incat sd accepte valori de tip int, long, float sau double. Aint x = Math.min(24, 240); // returneaza 24 double y = Math.min(90876.5, 90876.49); // returneaza 90876.49 Math.max() Returneazi o valoare reprezenténd numirul cel mai mare dintre cele dou argumente. Metoda este suprainctircata, astfel incat st accepte valori de tip int, long, float sau double. ant x = Math.max(24, 240); // returneaza 240 double y = Math.max(90876.5, 90876.49); // returneaza 90876-5 — Scanned with CamScanner yen numere, variabile si metode statice jmpachetarea unei primitive Uneori vrei si tratezi o valoare primitivd ca si cum ar fi un obiect. De exemplu, in nici o versiune Java mai veche de 5.0 nu poi adiuga direct o primitiva inte-o colectie precum ArrayList sau HashMap: int x = 32; ArrayList list = new Arraytist(); List -add (x) X. ; a os ‘Aceasté metoda nu fnctioneaza decat daca folses ave 80 sou 6 vershine mai novi In caso Arrays x61 nici o metoda addiint), care sé accepte o val a us fs Sete Tl (Closa Arroyibt confine numa metode odd0 primitiva care accepta refernte catre obiecte, nu 3 primitive) Daca trebuie sd tratezi o valoare primitiva ca pe un Exist o clasi de impachetare (wrapper class) pentru fiecare tip primitiv si, deoarece aceste clase fac parte din pachetul java.lang, nu este necesar si fie importate. Poti i fi i Ghuledeinpahcure dewarecenumekineaeeeia Obiect, 0 impachetezi, dup numel prime! impacheate da majo Daca folosesti o versiune i ‘it sd respecte conventia de denumi vr % an ee Bade Genumireaclaselor. — Tava mai veche de 5.0, di Pe care nu le cunoaste foarte bine nimeni de : x > escent planed, denlator biblteci APlaudeissina ‘tebuie sa faci acest lucru foloseascd pentru clase exact aceleasi nume ca pentru tipuril t Primiive impachetate. Vei vedea imediat ce wem si spunem: inainte de a stoca 0 Boolean valoare primitiva intr-o Character colectie, precum ArrayList By a e yte Went Gee 28 ne sau HashMap. Short Ty Savelor, Numele. C15e10° Integer nu sunt prescutate, primtiva nt Long Float ‘oblect Int, Double i — mitt valoares primitive ie constord cle de *, impachetarea unei valori irpachelse A512 © ect Trtese™ int 4 = 288; Integer iWrap = new Integer(4); rote clasele de Mmpachetare functioneazé astfel, Casa Boolean fre 0 metods booleanValve0, 8 Character are o meted —_Notd:imagines de sus reprezinta o bucats de despachetarea unei valori / charvcted etc. oieiRieninseietetin, Te-ai prins? Impachetats? Uni ered c8 seamana cu un 4 int uniirapped = iWrap.intValus() + cartofcopt Merge shapa estialci> 287 Scanned with CamScanner impachetarea primitivelor intregi 288 capitolul 10 sspui cli nu pot si creez o lista ArrayList de prépadi despachetez cénd vreau st-! scot din lista Este de-a dreptul stupid. Vrei sti 2? Adicd trebuie si Tmpachetez fiecare intreg ‘intr-un nou obiect Integer, opoi s-I ‘ArrayList? Nu e deciit o pierdere de timp iun motiv in plus de a lisa erorile s& aparé... jnainte de Java 50, trebuia sa faci toata munca... Are dreptate. In toate versiunile Java mai vechi de 5.0, primitivele erau primitive si referintele obiectelor erau referinte de obiecte; NICIODATA nu puteau fi tratate interschimbabil. Intotdeauna era sarcina ta, ca programator, sd faci impachetarea si despachetarea primitivelor. Nu exista nici o modalitate de a transmite direct 0 primitiva cdtre o metoda care astepta o referinta a unui obiect si nici de a atribui rezultatul unei metode care returna 0 referintd cdtre variabild primitiva — chiar daca referinfa returnati era de tip Intege: variabila primitiva era de tip int. Pur si simply, intre clasa Integer si tipul int nu exista nici o legiturd, exceptind faptul cd in clasa Integer exista o variabili de instanti de tip int (pentru a stoca primitiva impachetata de obiectul Integer). ‘Toati munca era lsat in seama programatorului. O lista ArrayList de primitive int reeas wn obiect : cee Se Farad autoincasetare (versiuni Java mai vechi de 5.0) ete 18 Es public void trateazaNumerePrinvecheaMetoda() (89. erau ise bee!) ArrayList listaDeNumere = new ArrayList (); i adeuga prima oF EIS pee a ste! ListaDeNumere.add(new Integer(3))7 <_—— 19,4 rebve ae feces run obi +. Integer unu = (Integer) listaDeNumere.get (0); £—— Flementul extras dn Std este de tip Divect, ee takes ‘i foc o converse ts In sfargt, poti sa ext Integer. Dot SB o Prinfiva dn oblectu fr int dntUnu = unu.intvalue(); 9! Valoarea Integer. Scanned with CamScanner numere, variabile $i metode statice Autoincasetarea: stergerea diferentelor dintre primitive si obiecte Caracteristica de autoincasetare (autoboxing), adiugati in Java 5.0, realizeazi automat conversia intre primitive si obiectele de impachetare corespondente. Sivedem ce se intémpld atunci cdnd vrem si creim lista ArrayList pentru stocarea valorilor int. O lista ArrayList de primitive int Cu autoincasetare (incepand cu versiunea Java 5.0) nteger public void trateazaNumerePrinNouaMetoda() ( Creeazd wn object Arraylist de tip Integer ArrayList listaDeNumere = new ArrayList(); listaDeNumere .add(3) ; Adauga Desi n closa Arraylst NU exstd 0 metoda addiint), compiatorul face mpachetarea (ncasetarea) ‘A | int unu = listaDeNumere.get (0); lecul tau. Cu alte cuvinte, mn ista Arraylbt ESTE stocat un obiect Integer, dar poli sé ,pretar cd Ista Arrayist accepta valor int, Gntro Weta ) Array\stcinteger> poti s8 adaugi atat valori in Complatorul despacheteaza automat obiectul cal # obiecte Integer) Integer, astfel incat pofi alrbu direct voloarea nt Wei primtive, fara sa fie necesara apelared melodel intValue a obiectuld Integer, ist , intebasy stupide > Decenu declaram un obiect ArrayListcint> dacé vrem s& astrim in lista valori int? RR pert cs pute. Amintestic8eql pent tiple Senerice este 3 pot specifica numai tipur de clase sau de interfete,nu siprimitive.Ca urmare, declaratia Arraylist nu va putea fi ompilata,Dat,asa cum poti vedea in exemplul de cod anterior, nici nu ‘onteaz8 prea mult,deoarece pofi adauga valor! int intr-o lista ArrayListcinteger>.De fapt, n cazul unui compilator compatibil cu 22185.0,nuexisté nici o modalitate de a impiedica adsugarea Primitivelor intro lista ArrayList, daca lista este de tipul casei de Impachetare a primitivelor, deoarece impachetarea se face automat. Ca \utmare,poti adéuga valori booleene intro lista ArrayList si ‘Gractere intro lists ArrayList. 4 estiaicly 289 J ee Scanned with CamScanner autoincasetarea Avtoincasetarea functioneaza aproape oriunde Autoincasetarea iti permite si faci multe alte lucruri, pe ling’ operatiile evidente de impachetare si despachetare, la folosirea primitivelor in colectii. iti permite si folosesti © primitiva sau clasa de impachetare a acesteia oriunde este asteptati una sau cealalta. Gandeste-te la acest lucru! Distractie cu autoincasetarea Argumente pentru metode Dacdi o metod’ accept un tip de impachetare, poti sé-i transmifi o referinf’ ctitre un obiect de ‘mpachetare sau o primitiva de tipul corespondent. Desigur, este adeviratd si afirmatia inverst - dacti o metoda accepta o valoare primitiva, pofi si-i transmiti fie 0 primitiva compatibila, fie o referinta caitre un obiect de impachetare pentru tipul respectiv. Valori returnate Dacdi o metoda declaré o primitiva ca tip de valoare returnaté, poti returna fie o primitiva compatibila, fie o referinfa ciitre un obiect de ‘impachetare pentru tipul respectiv. act o metoda declardi o referinfiia unui obiect de ‘mpachetare ca tip de valoare returnata, poti returna o referinfa caitre obiectul de tmpa- chetare sau o primitiva de tipul corespondent. Expresii booleene in orice loc unde este asteptatd o valoare boolean’, poti folosi o expresie care poate fi evaluat intr-o valoare booleand (42), 0 pri booleand sau o referinta catre un obiect de ‘mpachetare Boolean. 290 capitolul 10 void acceptaUnNumar (Integer 4) 3 oO ¥ rea gh {} void returneazaUnNumar (Integer i) ( ) Nei 7, Q *biect Inte if (bool) { System.out.printIn ("true"); <— Scanned with CamScanner vee operatii cu numere Aceasta este, probabil, situatia cea mai ciudata - da, poti folosi un tip de tmpachetare ca operand in operatii unde este asteptat tipul primitiv respectiv. Aceasta tnseamni ca poti aplica, de exemplu, operatorul de incrementare asupra unei referinte a unui obiect Integer! Dar nu-fi face griji - acesta nu este decat un truc al compilatorului. Limbajul nu a fost modificat astfel ‘ncdit s& permitd folosirea operatorilor pentru obiecte. Inainte de efectuarea operatiei, compilatorul transform® obiectul in tipul primitiv corespunzitor. Totugi, operatia aratai destul de ciudat. Integer i= new Integer(42); Si aceasta inseamndi ci poti face gi ceva de genul: Integer j = new Integer(5); Integer k= j +3; Atribuiri Unei variabile declarate ca fiind un obiect de ‘mpachetare sau un tip primitiv i poti atribui referinta unui obiect de tmpachetare sau o primitiva de tipul corespunzittor. De exemplu, o primitiva int poate fi atribuita unei variabile referinfa Integer si invers, 0 referinté a unui obiect Integer poate fi atribuita unei variabile declarate ca primitiva int. numere, variabile $i metode statice 8,...9 int ite ~ 3 B, g a Double d = x; en creionul public cla Integer 4; int 37 Ya putea fi compilat acest cod? Va putea firulat? Daca poate firulat,ce rezultate va afisa? 'a.o pauza sigandeste-te la acest exercitiu; » autoincasetare despre care nu am discutat. TestBox { public static void main (string[] args) ( TestBox t = new TestBox(); 4 t. videntiaz8 0 implicatie a caracteristicii de gout Va trebui s3 folosesti compilatorul pentru a gasi ‘spunsurile.(Da, te oblig&m s experimentezi - esigur, pentru binele tau.) Public void got) ( ge 4s System.out.printin (3); System.out.printin (1); d estlalcl» 294 Scanned with CamScanner metode de impachetare Asteapta putin! Mai este ceva! Clasele de impachetare contin si metode utilitare statice! Pe Lang’ faptul ci functioneazi ca si cum ar fi clase obisnuite, clasele de impachetare contin o multime de metode statice cu adevirat utile. Am folosit carte ~ Integer.parselnt(). deja o asemenea metoda Metodele de decelare a sirurilor de caractere accept ca argument un obiect String si returneazii o valoare primitiva. Transformarea unui String intr-o valoare primitiva este foarte simpla: string s = "2"; nich pbs 8 int x = Integer.parseInt(s); — tronsforme double d = Double.parseDouble ("420.24"); boolean b = new Boolean(*true”) .booleanValue(); a tod ' exbta o metocs west. Al putea rede O cn0, nied aga? Hi Dhe, We Boole, exsta un constructor Bool ¢ L care va fi metodo format. formatat, a > format ("Mai am %.2£ erori de corectat.”, 476578.09876); Rezuttat de corectat Observé ca “8 om pierdut cate Sale hed rch zee ial Mi pec Tscamnd Set odes bana Simbolul ,%" cere metodei si insereze celilalt argument (al doilea argument al metodei format(), adici numarul) in punctul respectiv $I sé-l formateze folosind specificatorul ,,2¢", aflat dupa simbolul procent. Restul sirului de caractere pentru le corectat", este adaugat la rezultatul final. formatare, ,erori Adaugarea unei virgule 476578 .09876) ; format (“Mai am %,.2£ erori de corectat [OMCs Mai am 476,578.10 erori de corectat fin modificorea lu Gin arth car, heer 0 vl separare numarul formatat. structiutor de formatare instruct wrqua de 296 capitolul 10 Scanned with CamScanner numere, variabile si metode statice Dar de unde STIE metoda: unde se termina instructiunile i de un: ‘incep restul caracterelor? Cum se face cé nu este tiparit si caracterul .f* din .%.2F°? o\ Sau cifra .2"? De unde stie metoda ci. 2F ° este o parte a instructiunii si NU o parte a sirului de caractere? Sirul de caractere pentru formatare foloseste propria sintaxa Evident, nu poti scrie orice dupa simbolul ,%6". Sintaxa specificatorilor inserati dup’ simbolul procent respect reguli stricte si descrie modul de formatare a argu- mentului ce va fi inserat in punctul respectiv in obiectul String (formatat) rezultat. ‘Am vazut deja trei exemple: %, d inseamni , insereazi virgule de separare si formateazi numérul ca intreg zecimal". %.2£ inseamna ,formateaza argumentul ca numar in virgula mobili cu o precizie de doua pozitii zecimale*. %,.2£ inseamni ,insereaza virgule si formateazi argumentul ca numir in virguli mobili cu o precizie de doua pozitii zecimale*. Adevarata intrebare este: ,De unde stiu ce si pun dupi simbolul procent pentru a obfine cea ce vreau?* Aici intra atét cunoasterea simbolurilor (precum ,d" pentru numere zecimale si," pentru numere in virgula mobili), cat si ordinea in care trebuie plasate instructiunile dupi simbolul procent. De exemplu, daci scrii virgula dup’ ,d", adica 96d," in loc de .%,d", instructiunile de formatare nu mai functioneazi. Sau poate ci merge si-asa? Ce rezultat crezi ci vei obtine cu urmitorul apel: format ("Mai am %.2£, erori de corectat.”, 476578.09876); (Vom raspunde la aceasti intrebare pe pagina urmitoare.) egtlaiciy 297 Scanned with CamScanner

You might also like