You are on page 1of 371
Google This book is provided in digital form with the permission of the rightsholder as part of a Google project to make the world's books discoverable online. The rightsholder has graciously given you the freedom to download all pages of this book. No additional commercial or other uses have been granted Please note that all copyrights remain reserved About Google Books Google's mission is to organize the world’s information and to make it universally accessible and useful. Google Books helps readers discover the world’s books while helping authors and publishers reach new audiences. You can search through the full text of this book on the web at ittp//books.google.com4 Daniel Danciu George Mardale ARTA PROGRAMARII IN JAVA vol I - Concepte fundamentale viizessy Google Cuprins Prezentarea limbajului Java Ml 12 13 14 1s Nofiuni fundamentale de programat 2 22 23 24 imbaje de programare . {nceputusile imbajului Java Caracteristici ale limbajului Java Implementiri ale limbajului Java Implementarea Sun a limbajului Java 1.5.1 Platformele Java : 1.5.2. Platforma J2SE (lava 2 Platform, Standard Edition) 1.5.3 I2SDK Java 2 SDK, Standard Edition) 1.54 J2RE (ava 2 Runtime Environment, Standard Edition) 1.5.5 Documentatia J2SE (Java 2 Standard Edition Documen- tation) 1.5.6 Licenja de utilizare a platformei J2SE Java ‘Mediu! de Iueru Java Primul program Java 2.2.1 Comentarii 2.22 Funcjiamain 2.2.3 Afigarea pe ecran Tipuri de date primitive 2.3.1 Tipurile primitive 23.2 Constante . 2.3.3 Declararea si inijalizarea tipurilor primitive in Java 2.34 Citite/scriere Ia terminal Operatori de baz’ 24.1 Operatori de atribuire 24.2 Operator aritmetici binari 3 7 a 19 2 2B . 26 . 26 27 29 32 32 32 34 35 35 36 37 37 37 37 38 39 40 4 . 42 cura 24.3 Operator aritmetici unati Conversii de ip 25 ini conditionale 25.1 Operator relajionali 25.2 Operator logict 25.3 Operator la nivel de bit 25.4 Instrucjiumea S 25.5 Instructiunea while 25.6 Instructiunea for 25.7 Instructiunea do 25.8 Instructiunile break si continue 25.9 Instrucjiunea switch . 2.5.10 Operatorul conditional 2.6 Meiode . 2... ce eeeee 26.1 Supraincirearea numelor la metode Referinte 31 Ce este oreferin . : 3.2 Fundamente despre obiecte si referinje 3.2.1 Operatorul punct (.) 3.2.2 Declararea obiectelor 3.2.3 Colectarea de gunoaie (garbage collection) 3.2.4 Semnificatia operatonutu 3.2.5 Transmiterea de parametsi 3.2.6 Semnificajia operatorului 3.2.7 Supraincdrcatea operatorilor pentru obiecte . 3.3. Siruri de caractere (stringuri) 3.3.1 Fundamentele utiliziii stringurilor 3.3.2 Concatenarea stringurilor 33.3 Compararea stringurilor 33.4 Alte metode pentru stringuri . . 3.3.5 Conversia de la string la tipusile primitive si invers 34. Sinai 34.1 Declarajie,atribuire si metode 34.2 Expansiunea dinamici a girurilor 34.3. $inuri cu mai multe dimensiuni 34.4 Argumente in linie de comand 42 4B aEEE 49 sl . SI 2 33 . 54 56 . 56 . ST 67 ao 68 a) 70 n n R 2 .B “ 18 9 BREE 4 Obiecte si clase 4.1. Ce este programarea orientata pe obiecte? 4.2 Unexemplu simplu 43° Metode zuale 4.3.1 Constructor Modificatori si accesori Afigare gi toString () Metoda equals () Metode statice Auribute statice . Metoda main () 44 cece Directiva import. Instructiunea package Variabila sistem CLASSPATH Reguli de vizibilitate package-friendly Compilarea separati 4.5 Alte operatiicu obiecte gi clase 4.5.1 Referinja this 4.5.2. Prescurtarea this pentru constructor: 4.53 Operatorul instanceof . 4.54 Inigializator statici S Mostenire SAL Ce este mostenirea? 5.2 Simaxa de bazii Java 5.2.1 Reguli de vizibilitate - : 5.22 Constructorsisuper ...... 5.23 Redefinirea metodelor, Polimorfis 5.24 Redefinirea parfiala a metodelor 5.25 Metode si clase final 5.26 Metode gi clase abstracte 5.3 Exemplu: Extinderea clasei Shape 54 Mostenine multipla 55. Interfeje 5.5.1 Definirea unei interfeye 5.5.2 Implementarea unei interfeje 5.53 _Interfeje multiple . 5.6 Implementarea de componente generice 37 BSSEss 98 -101 -101 102 103 103 105 106 106 106 108 = 108: 108: 1s 6 119 -120 -120 2122 128 128 130 133 138 139 139 139 1d sd 2145; 5.7.1 Clasificarea claselor interioare . 5.7.2 Clasele membre statice ale clase exterioare 5.7.3 Clasele membre nestatice ale clasei exterioare 5.7.4 Clase locale 5.7.5 Clase anonime . : 5.7.6 _Avantajele si dezavantajeleclaselorimerioare 5.8 Identificareatipurilor de date in faza de execusie 58.1 Identificarea standard a tipurilor de date 5.8.2. Mecanismul de reflectic 6 Tratarea exceptilor 6.1 Ce sunt excepfiile? 6.2 Tipuri deexceptii . 6.3 Definirea proprilor exceptii de cite programator 64 Prinderea si tratarea exceptilor 64.1 Blocul try 64.2 Blocul catch 643 Blocul finally 6.5 Anuncarea excepfiilor 65.1 Instructiunea throw 65.2 Clauza throws 6.46 Sugesti pentru uilizarea ficient a exceptilor | 6.7 Avantajele uilizirii excepyiilor. Coneluzii 7 Intrare si iesire (Jay 7.1 Preliminari 7.2 Operatii de baz pe Muxuri (stream-uri) 7.3 Obiectul StringTokenizer 74. Fisiere secventiale 75 Utilizarea coletilor de resurse (resource bundles) 75.1 Utilizarea fisierelor de proprietiti pentru citirea datelor vO) 8 Firede executie 8.1 Ce este un fir de executie? 8.2 Fire de execusie in Java 8.2.1 Crearea firelor de execusie 8.3 Accesul concurent la resurse 83.1 Sineronizare 83.2 Capcana metodelor nesincronizate 83.3 Instrucjiunea synchronized . -1St 151 153 153 156 159 160 163 165 178 178 = 180) 183 186 186 -187 191 195 195 2197 200 204 207 208, = 209 210 212 212 216 27 2218 2218, 222 229 233, 235 84 83.4 Competijie asupra monitoarelor . 8.35. Sincronizarea metodelor statice 8.3.6 Monitoare si atribute publice 8.3.7 Cind NU trebuie si folosim sineronizarea 8.38 Blocare circulari (deadlock) Coordonarea frelor de execujie. eee 84.1 De ce este necesar si coordonam firele de execusie? 842 wait() sinotity() 8.4.3 Exemplu de coordonate a firelor de execusie: problema consumator-producitor 8.44 Dejinerea monitoarelor 84.5 Utilizarea instru 8.4.6 Unalt exemplu: consumator si producitori multipli 84.7 Utilizarea lui InterruptedExcept ion A. Mediul Java gi uneltele ajutitoare Asl Bditarea codului sursi ALLL Editoare : A.L2. Meditintegeate IDE (Integrated Development Environ- ‘ments) A2 Instalarea mediului Java A2.1 Instalarea sub Windows A241 Instructiuni de instalare A.22Instalarea sub Linux A221 _Instrucjiuni de instalare A22.2 _Instalare cu autoextragere A223 Instalarea folosind RPM A3. Compilarea codului sursit ABA Ant AA Rularea unei aplicaii java Ad CLASSPATH AS Documentaii java . B_Conventii de notafiein Java. Utilitarul javadoc B.1Necesitatea conventiilor de scriere a programelor B.2 Tipuri de fisiere B.3 Organizarea fisierelor sursi java B3.1 Comentarile de inceput B3.2_ Instructiunile package gi import B.3.3._Declarapile clasi si interfejei 237 237 239 239 240 242 242 2244 24s 250 251 255 238 265 265 265 266 267 268 268. 270 :270 2 2m. 273 75 2 .277 2278 279 279 280 280 281 281 +282 Ba Indentarea..... . wee eee 9283 B4.1 Lungimeaunei linii de cod... oe 284 B42 "Ruperea' linilor 284 B43 Acoladele 284 B44 Spaierea 285 BS Comentarile 286 B.S.1 Comentarii de implementare 287 B52 Comentarile de documentajie 288 B6 Declariti . wees = 288) B61 Numirul de declariri pe linie . . . wee 2 288 B62 Inifilizarea variabilelor . 6. 289 B63. Loculdedeclararea variabilelor ... 289 B64 Declararea claselor sia interfojelor. ...... 289 BT Instrucyiuni 290 B.7.L _Insteucyiuni simple 290 B.7.2_ Instrucfiuni compuse 290 B73 Instrucfiunea return 291 B74 Instructiunea if-else 291 B75 Instructiunea for 292 B76 Instructiunea while 2. . 292, B77 Instrucjiuneado-while ....... 2.292 B78 Instrucjiunea switch ..... 2... 22.292 B79 Instrucjiunea try-catoh...... 2. 293 B8 Convengii de notatie . feet eee ees 2294 BO. Practici utile in programare 296 9.1 Referizea atributelor $i a metodelor statice 296 B92 Atibuirea de valori variabilelor 297 B.10 Exempla de figiersursi Java 297 BAI Utilitarul javadoc 299 B.IL1 Sintaxa javadoc 299 B.LI2 Deserierea wtilitarslui 300 B.L13 Btichete javadoc +. 303 B.114 Opjiunile comenzii javadoc»... . 25. 305 -307 C Definirea pachetelor Java, Arhive jar 310 CL Prezentare generaliia pachetelor Java predefinite 310 C2 Definirea de pachete de catre utlizator . . wee BIE C3. Athive jar (ava ARchives) 0 eee 322 C3. Utilizarea fisierelor . jar 2323) 3.2 Crearea unui figier jar... - duoapaooeys) 3.3. Vizualizarea conjinuiului unui fisier . jar oe 327 C34 Extragerea conjinutului unuifigier jar... .... 328 C35. Figioral manifest al unci arhive ar... 0... 329 €3.6 Modificarea figienului manifest al unciarhive jar. . . 331 €3.7 Modificarea conjinutului unui fier . jar 332 C38. Rularea aplicatilor Java "impachetate” int-o arhiva jar 333 D_Internafionalizarea aplicafiilor. Colecfii de resurse 335 Dal Timpul, numerele sidatele calendaristice. ss... 335 D2. Colectile de resurse in intemnajionalizarea aplicayiilor .. . . . . 341 2.1 Unexempluconcret.. . . cee 2 342, 22 Implementareacoleflorprin Li stResourceBundie344 D.2.3 Implementarea colecjilorprin Proper tyResourceBundle36 D.24 Utilizarea colectillorde resurse . ov ee 348 D3 Imternationalizarea mesajelor dinamice .. . «ss ss ss +» «351 E_ Resurse Java 356 ELL Site-ul Sun Microsystems . 356 E2_ Tutoriale despre limbajul Java disponibile pe Internet 337 3 Cagji despre limbajul Java disponibile pe Internet 357 Ed Reviste online de specialitate oe vee vv es 358 ES Liste de discufii despre limbajul Java... 6... vos ss ss 358 EG Alte resurse ava ee ee 389 viizessy Google Introducere Ce invitur pred Macstal?” seb un vziator ‘Nici una”, rispunse discipoll “Atunci de ce fine discursuri?” “Bl doar ne ara calea- nu ne vai nimi.” “Anthony de Mello, O clip de injlepciune icine a folosit cel pugin o data Internet sau acitito revisté de specalitate {n domeniu! informaticii, a auzitcu siguranga cuvantal Java. Java reprezintd un limbaj de programare, creat de compania Sun Microsystems in anul 1995. Initial Java a fost gndit petra a imbunatai continutul paginilor web prin adau- garea unui conginut dinamic: animaie, multimedia ete. In momentul lansérit sale, Java a revolujionat Internet, deoarece era prima tehnologic care oferea un astfel de conjinut. Ulterior au aparut gi alte tchnologii aseménatoare (cum ar fi Microsoft ActiveX sau Macromedia Shockwave!), dar Java gi-a pistrat importanja deosebité pe care a dobindit-o in rindul programatorior, in primul rind datortéfacilitilor pe care le oferea. incepand eu anul 1998, end a aparut versiunea 2a limbajului (engl. Java 2 Platform), Java a fost extins, acoperind gi ate diree{i de dezvoltare: programarea apical enterprise (aplicaii de tip server), precum gi a celor adresate dispo7i telefoane mobile, pager-e sau PDA-usi®. Toate acestea au reprezentat facili jelor eu resurse limitate, cum ar fi Goi cre wine mal des Itercal sunt probabil big cu contoale ActiveX sau ev ai ‘mai lash adel paginilor web. 2PDA = Personal Digital Assistant (mick dspotive de eau, de dimensiuni pun mal mas ect ale uni telefon mobi capable st ofee fit de agen, dar is uleze apical it-an od ea asemanitor cu celal unui PC)-La moment actual exist:mal mute pus de PDA. Plm-u, pockelPC-u n roi adiugate limbajului, care a pistrat insé si posiblitiile de a crea aplicait standard, de tipul aplicaiilor in linie de comands sau aplicaii bazate pe GUE. Lansarea versiunii 2 a limbajului Java a fost 0 dovada a succesului imens de care s-au bucurat versiunile anterioare ale limbajului, da sia dezvoltari limba- Jjului in sine, a evolufici sale ascendente din punct de vedere al fa care le ofera, cat si al performangelor pe care le realizeaza Cum este organizatit aceasta carte? Avand in vedere popularitatea extraordinari de care se bucuralimbajul Java in cadnul programatorilor din intreaga lume, am considerat util scrierea une lucrari in limba romana care si fie accesibila celor care dorese si fnveje sau sit aprofundeze acest limbaj. Ideea care a stat la baza realiztiiacestei cari a fost aceea de a prezenta nu numai limbajul Java in sine, ci si modul in eare se implementeaza algoritmii si structurile de date fundamentale in Java, elemente care sunt indispensable orietirui programator eu pretengii..Agadar, cartea nu este destinati numai celor care dorese si acumuleze nofiuni despre limbajul Java in sine, ci i celor care intenjioneaza si igi aprofundeze gi rafineze cunos- tinjele despre algoritmi si si igi dezvolte un stil de programare elegant. Ca 0 consecing, am structurat cartea in douti volume: prima volum (cel de fafa) este orientat spre prezentarea principalelor caracteristici ae limbajului Java, in timp ce volumul al doilea (disponibil separat) constituie oabordare a algoritmilor din perspectiva limbajului Java, Finalul primului volum cuprinde un grup de cinei ‘anexe, care prezint mai aminunjit anumite informatii cu caracter mai special, deosebit de utile pentru cei care ajung s& programeze in Java, Am ales aceasta strategie deoarece a doblndi cunostinje despre limbajul Java, fri a avea o ima- gine clara despre algoritmi, nu reprezint& un progres real pentru un programator, Iarscopul nostru este acela de a va oferi posibilitatea si deveniti un programator pentru care limbajul Java gi algoritmi si nu mai constituie © necunoscut Cele dou volume cuprind numeroase soluji Java complete ale problemelor prezentate, Mai este necesarl o remarci: deseori am optat, ait in redactarea co- etc.). in Java, operatori de egalitatefinegalitate sunt == respectiv !=, De exempla, exprStanga == exprDreapta are valoarea true daci exprStanga si exprDreapta suntegale, altfel are valoarea fa1se. Analog, expresia: exprStange != exprDeeapta are valoarea true dact exprStanga si exprDreapta sunt diferite altfel are valoarea false. Operatorii de comparatie sunt <, <=, >, >= iar semnificayia lor este cea na- ‘ural pentru tipurile fundamentale, Operatorii de comparajic au prioritate mai ‘mare decit operatorii de egalitate, Totusi, ambele categorii au prioritate mai ‘mic& decat operatoriiaritmetici, dar mai mare decat operatori de atribuire. Ast- fel, vejiconstata ei in cele mai multe cazurifolosirea parantezelor nu va fi nece- sari, Toji acesti operatori se evalueaza de la stinga la dreapta, dar cunoasterea acestui lucru nu ne foloseste prea mult. De exemplu, in expresia a > << >>> © operatorilogici: & | ~~ Fie cd fac parte din prima sau a doua categorie, operatori la nivel de bit nu pot fi utilizagi decat in cazul numerelor intregi (Variabile de tipul byte, short, int si long). De fapt, operatorii se aplicd reprezentirii binare a numerelor implicate. Cu alte cuvinte, dacd avem operajiaS & 3, aceasta inseamni cl de fapt operatorul & se aplicd reprezentiri in baza 2 a numerelor 5 si 3, adie’ 101, sill Prima grupii de operator la nivel debit, cea a operatorilor de deplasare, exe- uti manipularea bitilor primului operand, deplasdindu-i la stinga sau la dreapta, {n funcjie de tipul operatorului (vezi Tabela 2.3). Tabela 2.3: Operator la nivel de bit pentru deplasare (operator [Uiizare | Deseriere ] SS | opt >>op2 | deplasarca biflor lar opl Ta dreapta cu 0p2 poziti << | pl <>> op2 | deplasarea bififor lui opt Ta dreapia eu op? poritii, opl fiind considerat unsigned scare operator deplaseazi bifii operandului din stinga cu un numir de po- Ziti indicat de operandul din dreapta. Deplasarea se face perator (>> Ia dreapta, iar << la stinga). De exemplu, urmitoarea instrucjiune ‘deplaseaza bit numarului§ la dreapta cu o poritie: sensul indicat de o- 5 >> Reprezentarea binari a numirului 5 este 101. Prin deplasarea bifilor la dreapta cu o pozitie se objine numirul care are reprezentareabinardi 10, deoarece primul 1 (cel din stinga) trece cu o pozitie mai la dreapta, deci in locul lui 0, care trece cu 0 pozitie mai la dreapta, deci in locul celei de-a doua cifre 1, 46 2.5, INSTRUCTIUNI CONDITIONALE care se pierde, isi din stanga care au rimas descompletayi se completeazi cu 0, ceva ce conduce la rezultatul final 010, Astfel, am obsinut numrul 2 in reprezentarea zecimali. Inconcluzie,5 >> 1 = 2. Dupi cum se poate observa, pentru numerele pozitive, deplasarea la dreapta cu op2 bifi este echivalent& cu imparyirea lui op? la 2°°*. Pentru exemplul nostra, 5/2! = 2 ‘Analog se intimpli si in cazul deplasisii la stinga. Instructiunea urmatoare deplaseaza biii numirului 5, la stinga, cu o pozife: sca; Rezultatul deplasiri bisilor 101 la stinga cu o pozitie este 1010, adic ‘numrul 10 in reprezentare zecimala. Acest ucru este echivalent cu inmuljiea cu 2°. in cazul nostru, 5 +2! = 10. Col de-al treilea tip de deplasare a bitilor, >>>, este asemanatorcu >>, cu specificarea ci numarul op1 este considerat firé semn (unsigned), Cea de-a dous categorie de operator la nivel de bit realizeaza operaiilogice SI, SAU, SAU EXCLUSIV (XOR) si NEGARE: ‘Tabela 2.4; Operatori pentru operatiilogice la nivel de bit [Dperator [Uiilzare Deseriere ] &___[opl Kop? ‘Tha nivel eit T__[ opt Top? SAU Ta nivel de bif ~ [opt Sop? | SAU EXCLUSIV Ia nivel de bil = =op NEGARE la nivel de bit ‘Si presupunem cit avem dou’ numere, 5 si 3, elrora dorim si le aplicim ‘operajilogice la nivel de bili, Operaile logice la nivel de bi ‘area operafici respective perechilor de biti de pe pozitii egal rnumere (cu excepfia operajiei de negare care este unari). in situajia in care nu- mmerele nu au reprezentarea binarii de aceeasi lungime, reprezentarea mai seurti este completati cu zerouri nesemnificative (inserate tn faja reprezentirii), pant se objin dimensiuni egale. Prezentate pe scurt, operatile logice pe perechi de bi se realizeaza pe baza uurmatorului alogritm: 47 2 INSTRUCTIUNI CONDITIONALE © expresia bl & b2 are valoarea 1, daca gi numai dacit b1 gi b2 au var loarea 1 (b1 si b2 sunt 2 biti, care pot lua, evident, doar valorile 0 gi 1). Alltfel, expresia are valoarea’ © expresia bi. | 2 are valoarea 0, daci gi numai dac bi si b2 au valoa- rea 0. Altel, expresia are valoarea |; © expresia bl ~ b2 are valoarea I, dacd gi numai daca unul dintre ope- ranzi este 0, iar celilalt 1. Altfel, expresia are valoarea 0; © expresia ~b1 reprezinti negarea lui b1, dei are valoarea 1, da 0, sau are valoarea 0, daci b1 este 1 Tati citeva exemple de utilizare: e5e3e1 Was H=3 " as a3 Meat os 73-6 as a3 ns o75- 6 - Wes yas 48 2.5, INSTRUCTIUNI CONDITIONALE Aceasti operajie necesit anumite precizari, Dup cum am vizut ante- rior, un numar de tip int este reprezentat pe 32 de bij. Cu alte cuvinte, reprezentarea numérului 5 in baza 2, are de fapt 32 de cifre binare, dintre care 29 sunt zerouri nesemnificative (cele din fafa), pe care le-am omis, pina acum din motive de spatiu. La 0 operate de negare, toate zerourile rnesemnificative ale reprezentiriibinare devin I si capata astfel important (primul bit este bitul de semn, care se modificd gi el). Pentru a injelege ‘mai bine modul in care se reprezinti numerele intregi in memorie vi re comandaim lucrarea [Boian) 2.5.4 Instruefiunea i Instructiunea 4 £ este instructiunea fundamental de decizie. Forma sa sim- plieste: LEE (oxpeesie) Surmatoarealnstructivne Dac expresie are valoarea true atunci se executd instructiune; in caz contra, instructiune mu se executi, Dupi ce instrucjiunea if se {ncheie fara incidente (vezi cazul excepjiilor netratate, in capitolul 6), controlul ste preluat de urmatoareaInstructiune, Optional, putem folosi instructiunea if-e1se dupa cum urmeazi HAE Cexpresie) 2 insteuctivael pelae t instructiune? in acest caz, dact expresie are valoarea true, atunci se executi ins- tructiunel; altfel se executt instruct iune2. in ambele cazuri con- twolul este apoi preluat de urmatoareaInstruct iune, lati un exemplu: » System out. p sit (xt 0) } System-out. print ( 1/x )s System. out. print ( tin ("17x este eden 4 System. out. printia (): De refinut c& doar o singurd instructiune poate exista pe ramura de if sau de else indiferent de cum indentafi codul. Iat& dou’ erori frecvente pentrt 49 2 INSTRUCTIUNI CONDITIONALE {ncepatori: Vif (x == 0) 5 instructiune vida tt + System.out. printin ("x este 0"): relae 4°" system. out. print ("x este"): 5 System-out. printin(x): //instructiume in afara elauzel else Prima greseala consti in a pune ; dupi ££. Simbolul ; reprezinti in sine instructiunea vide; ea 0 consecin{, acest fragment de cod nu va fi compilabil (else nu va fi asociat cu nici un i£). Dupi ce am corectat aceasti eroare, desi acest lueru este sugerat de indentare. Pentru a rezolva aceasti problema vom utiliza un bloc in care grupim o seevenfi de instructiuni printr-o pereche de acolade: rimanem cu o eroare de logici: ultima linie de cod nu face parte din 3: 5) System.out. print ("x este"): {System out. println (x) " Practic, prin cuprinderea mai multor instrucjiuni intee acolade, cream o sin- uri instructiune, numiti instrucfiune compusd, Asadar, instruct iunel (casi instruct iune2) poate fo instructiune simpla sau o instrucjiune com- pus’, Instructiunile compuse sunt formate dintr-o succesiune de instrucfiuni (simple sau compuse) cuprinse intre acoloade. Aceasta definiie permite imbri- carea instructiunilor compuse in cadrul altorinstrucjiuni compuse. in exemplul anterior, pe ramura if avem o instructiune compusi format doar dintr- sin- gurd instructiune simple System. out. printin ("x este 0"): ” ‘Am folosit aici o instrucyiune compusi desi, flind vorba de o singuri in- strucfiune simpli, acest lueru nu era absolut necesar. Totusi, aceasta practic’ ‘imbunitijeste foarte mult lizibilitatea codului gi vi invitim si pe damneavoas- 18 st o adopragi Instructiunea 4 £ poate si faci parte dintr-o alti instructiune ££ sau else, la fel ca si celelate instrucjiuni de control prezentate in continuate in aceast 2.5, INSTRUCTIUNI CONDITIONALE 2.5.5 Instruetiunea while Java, ca gi Paseal sau C, dispune de tre instructiuni de ciclare (repetitive) instructiunea while, instructiunea do gi instrucjiunea for. Sintaxa instructiunit whi Le este: while (expresie) ‘urmatoarealnstructivne Observati ed, Ia fel ca gi la instructiunea if, nu exist apare un ; dupa while, va fi considerat ca instructiune vida. Cit timp expresie este true se execut instructiune; apoi ex- presie este evaluati din nou, Daci expresie este false de la bun in- ‘ceput, atunci instructiune mu va fi executata niciodaté. in general, in- struct iune face o acfiune care ar putea modifica valoarea lui expresie: lel, ciclarea s-ar putea produce Ia infinit. Cand execujia instructiunii whi le se Incheie, controlul este preluat de urmatoareaTnstructiune, 2.5.6 Instruetiunea for Instrucjiunea whi le ar fi suficienta pentru a exprima orice fel de ciclare. ‘Totusi, Java mai ofera inci doua forme de a realiza ciclarea: instrucjiunea for si instrucjiunea do, Instrucjiunea for este utilizaté in primul rind pentru a realiza iteraja. Sintaxa ei este sfor (initializare; test; aetualizare) ‘urmatoarealnstructiune fnaceast situate, initializare, test siactualizare sunttoate cexpresi gi toate tei sunt opfionale. Daci test lipsese,valoarea sa implicit este true, Dupt paranteza de inchidere nu se pune ; Tnstruefiunea For se executérealizénd mai inti initializare. Apoi, cat timp test este true se executi instruct iune, iar apoi se executi actualizare, Daci initializare si actualizare sunt omise,in- Strufiunea for se va comport exact casi instrucjiunea whi Le ‘Avantajulinsrutiunii For const in faptl ef se poate vedeaclar mara pe care itereaz varabilele contr. ‘Urmitoaren secvenfi de cod afigeazprimele 100 mumere integipozitive Hor (int f= 1: 4 < 100: +44) H si 2 INSTRUCTIUNI CONDITIONALE » System. out. printin (i): “a ‘Acest fragment ilustreaz gi practica obignuiti pentru programatorii Java (si (C++) de a dectara un contor intreg in secvenfa de initializare a ciclului. Durata de viaji a acestui contor se extinde doar in interiorul ciclului. Atit initializare cit $i actualizare pot folosi operatonul virgula! pentru a permite expresii multiple. Urmitorul fragment ilustreazi aceastitebnic’ freevent folosti for (i = 0, sum = 0; 1 fi ) System.out. printing + "\t" + sum) a +, sum +20) Ciclurile pot f imbricate la fel ca si instructiunile i£. De exemplu, putem siisi toate perechile de numere mici a c&ror sumé este egali cu produsul lor (cum ar fi si2, a ciror suma si produs este 4) folosind secvenja de cod de mai jos: Hor (int i = 1; i <= 10; i44) for (int j = 15 5 c > 0: +8) el es ben ( System.out. printin(i #7." +5): 2.5.7 Instrucfiunea do Insiricfiunea white realizeard un test repetat, acd test este true atunci se executtinstrctiunea din cadrul ei Tus, dacé tet iia este instrucunea din cadrulciclului nu este executata niciodata, In anu tii avem nevoie ca instructunile din ciel s& se execute cel putin 0 dati, Acest hrs se poste relia utilizénd instricjinea do. Insrvtiunea do cst aseminitoare cs insiuctunea wh’ Le, ou deosebireac8tstl est realizat dupi ce instrutiunile din corpuleiculu se exeeut. Simtaxa sa est: do J white expresie J urmatoarealnstructinne 2 2.5. INSTRUCTIUNI CONDITIONALE Remarcagi faptul c& instructiunea do se termind cu ;. Un exemplu tipic in care se utilizeaza instrucjiunea do este dat de fragmentul de (pseudo-) cod de mai jos: afiseaza_mesaj: 4 mu este corecta ); Instructiunea do este instructiunea de ciclare cel mai putin utlizaté, Totusi, nd vrem si executam cel pusin o data instrucjiunile din cadrul cicluli, si for este incomod de utilizat,atunci do este alegerea potrivita 25.8 Instructiunile break si continue Instrucjiunile for gi while au condijia de terminare naintea instructiu- nilor care se repeti. Instructiunea do are condifia de terminare dupa instructi- unile care se repeti. Totusi, in anumite situaii s-ar putea si fle nevoie si in- trerupem ciclul chia mijlocal instrcfiunilor care ve repeti. tn acest seop. se poate foloiinsticfiunea break. De obicei, instrcfiunea break apare in cadrul une instruiuni ££, an exemplal de mai jos: white (...) + If (conditiey 4 5 break: fn cazul in care sunt doud cicluriimbricate instucfiunea break partseste doar cilul cel mai din interior. Dacd exist mai mult de un cicla care tebuie terminal, break mu va funcfiona corect, gi mai mult ea sigur ci ai proiectat prostalgoritml, Tousi, Java oferd aga numitul break etichetat. in acest ex, 6 anumitéinstractune de ciclare este etchetaa i insrucjiunea break poate fl aplicatd aceleiinstrucjuni de ciclare indiferent de numul de cicluriimbricat Tat un exemplu 3 2 INSTRUCTIUNI CONDITIONALE i it (conditie) zl i 3 break cticheta . , * , Boy h//controtul programului trece aici dupa executia Iwi break in anumite situafii dorim si renungim la executia iterafici curente din ciclu si si trecem Ia urmitoarea iterajie a ciclului. Acest luera poate fi realizat cu instructiunea continue. Ca si break, instrucfiunea continue este urmatt de ; si se aplic8 doar ciclului cel mai interior in eazul ciclurilor imbricate. Urmitorul fragment tipireste primele 100 de numere intregi, cu excepfia celor ivizibile eu 10: Hfor (int i = 1; i <= 100; 149) a ini @ 10 c System. out. printin (i): Desigur, ei exemplul de mai sus poate fi implementat si uilizind un i£ simplu. Totusi instructiunea cont inue este adeseori folosité pentru a evita imbricdri complicate de tip i £-e1 se in eadrul ciclurilor. 25.9 Instructiunea switch Instructiunea switch este numitii uneor si instructiune de selectie; ea are rolul de a selecta dintre mai multe seevenje de cod, una care va fi executati, funcjie de valoarea unei expresiiintregi. Forma sa este switch (expresie-selectare) intreagal : break; {case valoare-intreaga? : breaks sow tense valoare-intrengaN 34 2.5, INSTRUCTIUNI CONDITIONALE * break: DC aetaute " expresie-selectare este o expresie care produce o valoareintreag Instrucjiunea switch compara valoarea expresiei expresie-selectare cen fiecare valoare-intreaga. Daci are loc egalitata, se executh instructi- unea corespunzitoare(simpll sau compus), Dac nu are loc nici o egalitate se executt instrucjiunea din def aul (alterativa default este opjionald in cadral switch. ‘Observasi ef fn exemplul de mai sus, fiecare case se fncheie cu un break care are ca fect saltl la sfirgitul instrujiunii switch. Acesta este modul obisnuit de a serie 0 instrujiune de tip switoh, dar prezenfa instruciunit break nu este obligatorie, Dact instrucjunea break lipseste, atunci se va ‘execu si codul corespunzitorinstucjunilor case urmatoare pan cind se fn- talnesle un beeak. Desi de obicei nu ne dorim un astel de comportament, el poate fi uncor’ util petra programatori experiment Pentru a exemplfica instruciunea switch, programul din Listing 2.3 ere- 17 litere aleator si determina dact acestca sunt vocale sau consoane (in limba englezi. ing 2.3: Program care exemplified instrucjiunea switch 1 TVowelsAndConsonants fa 2 // Program demonstrativy pentra instructiunea switch ) public. class VowelsAndConsonants public statle void main(String {1 ares) of F* for int i = 0; 1 < 100; 144) eo : char c= (char) (Math. random () #26 + 'a): “ System-out-print(e "2 ")s " switch (©) s i 5 ‘System out. printin (*vocala"): 7 break: > ease "y! 35 26 METODE System. out. printin("Uneori vocale *): “doar in limba engleza! x break: a default = ‘System. out. priatla(“consoana* ): 7 ) swith ") Ufor =| main >) Helass Funcjia lath random () genereazi ovaloare i interval 0,1). Prin ine 1olfea valor returate de aceasta functie ca numeral de litre din afabet (26 liter) se obyne un num in interval (0,26). Adunarea cu prima liter ("a care are de fap valoarea 97, coda ASCII al iteei a’) ae ca efect ranspunerea fn interval (97,123). ln inal se flosest operatorl de conversie de tip pen- ta trinchia nemaru a ovaloare din muimea 97, 98, ., 122, adi un cod ASCII al unui caactr din alfabetul englez 2.5.10 Operatorul conditional Operatorul conditional este folosit ca o prescurtare pentru insteucsiuni sim- ple de tipul if -e1 se. Forma sa general este: exprTest 7 exprosieDa + expresieNu: Mai intai se evalueaz expr Test urmati fie de evaluarea lui expresieDa fie de cea a lui expresieNu, rezultind astfel valoarea intregii expresii. ex- presieDa este evaluati dacd expr Test are valoarea true; in caz contrar se evalucazil expresieNu. Prioritatea operatorilui conditional este chiar dea~ supra operatorilorde atribuire, Acestlucru permite omiterea parantezelor atunci ‘nd asignim rezultatal operatoralui conditional unei variable. Ca un exemplu, ‘minimul a dou variabile poate fi calculat dupa cum urmeazi vaMia= xeytxey 2.6 Metode CCeea ce in alte limbaje de programare numeam procedura sau fancfc, fn Java este numit metoda. O defnjie complet a nofiunii de metoda o vom da tai tz, cand vom introduce nojiunile de clas i obiect. In acest paragrat prezentim doar citeva nofiun clementare penta a putea scre functi de genul ‘clor din C sau Pascal pe cares le folosim in citeva programe simple 56 Listing 2.4: Declaratea si apelul unei metode Dpeblic clase Minim t es) System-out. printin ( "Minimol este: * + min(a.b) ) + 1 ms Héeclaratla metodel min public statle Int min( Int x, Int y ) a return xey?e:y 5 mod " ‘Antetel unei metode consti dint-an mume,o list (eventual vidi) de pa- rametri si un tip penta valoarea retumati. Codul efectiv al metode, mumit tdeseori compl metodei, este format dint instusjivne compust (0 secven de instuetunicuprins inte acolad). Defnira unei metode const in antt st corp. Un exemple de definite gi uti din Listing 2.4 Prin prefixarea metodclor cu ajutorul cuvintclor cheie public: static pustem mima into oarccare masurafuncfle din Pascal iC. Desi aceasta tehnic& este util in anumite situa ea nu tebe utiizata in mod abuzv. ‘Mumele metodei este un identificator. Lisa de parametri consti din 0 sau ‘mai mulji parameriformali, fecareavind un tip precizat. Cand 0 metods este peat, parametri actual sant tecu in parameti formali wilizéndatibuirea obismuita. Accasta inseam cA tipurile primitive sunt transmiseutlizind ex- clusi transmiterea prin valoare, Parametti actual nu vor putes fi modifica de citrefuncte. Defnirle metodelor pot apircain orice ordine. Tnstrucfiunea ret uen este utlizati pent a intoarceo valoar cite codul apelant. Dac tipulfuncjiei este void stunci nu seintoarce nici o valoare. in anumitesitafit, pentru iesitea fot dintro metods care are tipul void se foloseste return; fért nici un parametr fare a unei metode este dat in programul 2.6.1 Supraincdrcarea numelor la metode ‘S& presupunem c’ dorim s& scriem o metoda care calculeaz maximul a tei ‘numere intregi. Un antet pentru aceasta metods ar fiz 7 Int max(int a, int b, Int ©) fnunetetimbaje de programare (Pascal, C), acest lueru nu arf permis dack exist deja o fncie max cu doi parametr. De exemplu, Se poate si avem deja dectarati o metoda max cu antl int max(int 2, int b) Java permite supraincrcarea (engl. overloading) numelui metodclor. A- ceasta inseamnii ci mai multe metode cu acelagi nume pot fi declarate in cadrul aceleiagi clase atdta timp eat semndturile lor (adie& lista de parametsi) difer ‘Atunci cAnd se face un apel al metodei maz, compilatorul poate usor si deducd despre care metodi este vorba examinand lista parametrilor de apel. Se poate si existe metode supraincireate cu acelagi numir de parametri formali, ata timp cat cel pufin unul din ipurile din lista de paramets este diferit De rejinut faptul c& tipul functiei nu face parte din semn’tura ei. Aceasta {nseamnd cd nu putem avea dou’ metode in cadrul aceleiagi clase care s& difere doar prin tipul valorii returnate. Metode din clase diferite pot avea acelasi nume, parametr i chiar tip returmat, dar despre aceasta vom discuta pe lang mai taziu, Rezumat {in acest capitol am discutat despre notiunile fundamentale ale limbajului Java, cum ar fi tipurile primitive, operator, instructiunile conditionale si repeti- tive, precum i metode, care se regisese in aproape orice limbaj de programare. ‘Totusi, orice program nebanal presupune utiizarea tipurilor neprimitive, nu- mite tipuri refering, care vor fi discutate in eapitolul urmator, Nofiuni fundamentale break: insirucfiune prin care se iese din cel mai din interior ciclu iterativ sau din cadrul instructiunii switch. ‘comentarii: au rolul de a face codul mai lizibil pentru programatori dar mu tu niei o valoare semantici, Java dispune de tei tipuri de comentari continue: instructiune prin care se trece la urmatoareaiteratie din cadrul ciclului iterativ in care este folosit do: instrucfiune repetitivi in care ciclul repetitiv se executicel putin o dat or: instrucsiune repetitiva uilizaté mai ales pentru iterajc. identificator: nume dat unei variabile sau unei metode. if: imstructiune de des 38 instrucfiune compusi: mai multe instrucjiuni cuprinse intre acolade gi care formeaza astfelo singur’ instucyiune. main: metoda special in cadrul unei clase, care este apelati la execuyia aplicatici ‘metoda: echivalentul Java al unei func} metodi de tip static: metodi echivalenti cu o metodi global’, ‘operator conditional (2 _ :): operator folosit ca o prescurtare a secvenge- lorsimple if. . .else. operator aritmetici binari: utilizaji pentru operaiiaritmetice de baz, cumarfit,-)*// si %, ‘operatori de atribuire: operatori utilizali pentru modificarea valorii unei variabile, Exemple de operatori de atribuire sunt =, +=, —=, ‘operatori de egalitate: sunt == si !=. Eiintore fie true fle false. ‘operatori de incrementare si decrementare: operatori care adaugi, res- pectiv scad, 0 unitate la/din valoarea curenti a variabilei. Exist doui forme incrementare si decrementare: prefixat si postfixat operatori logici: &&, || si !, folositi pentru a reprezenta conceptele de 4isjunctie, conjunctie si negare din algebra boolean’, ‘operatori relationali: <, >, sunt folositi pentru a decide care din 1£(b>0) rere se else va fi asociar eu If(a>0) ear 8, Numele clasei Java trebuie i fle acelasi cu numele fisienului sursi care 0 ‘confine; atengie la litere mari si miei! 9. Lipsa instructiunit break pe ramurile logice ale instrucjiunii switch ‘duce la aparitia unui efect nedorit in cele mai multe eazuri: de la ramura ccurenti se trece la cea urmatoare care este si ea executat, Ca oconsecing se executi mai multe ramuri din cadrul instructiunii switch, Exereifii Pescurt 1. Ce extensii folosese fisierele sursi gi cele compilate in Java? 2. Descriefi cele tri tipuri de comentarii fn Java, 43. Care sunt cele opt tipusi de date primitive in Java? 4. Care este diferenja dintre operatorii * $i *=? ei posttixai. 5. Expl ditrena dine opertort una reat 6. Descrieji cele treitipuri de instructiuni de ciclare in Java. 7. Descrief toate modurile de utilizare ale instrucjiunii break. Cefnseamna ‘ instrucjiune break etichetaté? 8. Ce face instrucjiunea continue? 9. Ce inseamnii suprainesrearea de metode? 10. Ce inseam’ transmiterea de parametri prin valoare? Teorie 1. Fie b cu valoarea 5 gi c cu valoarea 8. Care sunt valorile lui a, b gic ‘dupa execusia fiecdre linii de cod de mai jos? vas beet ete: abs ert porpeets 2. Care este rezultaul expresiei true && false || true? 43. Dafi un exemplu pentru care ciclul £or de mai jos nu este echivalent eu ciclul whi Le de mai jos: 6 for (init: test; actualizare) ( a . Sahile (est) uM : 3 actualizare:, a Indicatie in cazal in care cilul for confine o instuefiune continue, inante de a tece la urmitoare terajie se vaexecuta actualizare. 4, Pentru programul de mai jos, eare sunt valorile posibile la afigare? Whatlsx, public static void {int x) 2 eI /ecorpul Junctiel este necunoseut»/ so £ public static void main(String} args) 7 ot ” int x = 0 a fox) E System. out. printin (x): 4“) in practic’ 1. Serietio instructiune white echivalenti cu cichil for de mai jos. Lace ar putea fi uilizat un astfel de ciclu? for(i: ) 2, Scriofi un program care afigeaz’i numerele de la | la 100. Modificayi apoi programul pentru a intrerupe ciclul de afigare dup’ numarul 36 folosind instructiunea break. Incercafi apoi si folosifi return in loc de break. Care este diferenja? a Scrie}i un program care genereazstabelele pentru inmuljirea si adunarea rhumerelor cu o singu cif Scrieji un program care si genereze 25 de valori aleatoare de tip int. Pentru fiecare valoare generatd folosijio insiructiune if-e1se pentru a determina daci este mai mic’, egali sau mai mare decit o alté valoare ‘generat aleator. Scriei un program care afigeazi toate numerele prime eu valori cuprinse intre O si Integer MAX_INT. Folosifi dou cicluri for (unul pentma fiecare ‘numer si unul pentna testarea diviibiliti) si operatorul % Scrieji dou metode statice. Prima si retumeze maximul a trei numere intregi, iar a doua maximul a patru numere intregi Serieji o metoda staticd care primeste ca parametra un an si retmeazii ‘true daci anul este bisect si fal se in eaz contrar. cy 3. Referinte [Noi au rejnem zie; rejinem doar rmomente, ‘Autor anonim fh capitotl 2am preacatattipurile primitive din Java, Toate tipurile care au fac parte dintre cele opt tipur primitive, inelusi Susi importante eum a 8 stingus, ii fire, sunt tipus refering fn acest capitol vorn iva: Ce este un tip refering ce ete o variabilreferingks «Prin ce diferd un tip referingé de un tip primitiv; © Exemple de tipusi refering, incluzand string sirusi 3.1 Ce este o referinta? fn capitol 2am examinat ele opt ipui primitive impreund cu citeva o- perai care pot fi realzate pe variable avand acest tipi. Toate clelaletpuri de date din Java sunt referinge. Ce este deci o refering? © variabila refering in Sava (numitd adeseori simplu referinja) este 0 variabild care refine adresa de memorie la care se afl un anumit obiect 64 ‘CEESTEO REEERINTA? Figura 3.1: Mustrarea unei referinge: Obiectul de tip Complex stocat Ia adresa ‘de memorie 1215 este referit att de cdtre nr2 ct gi de eatre nr3. Obiectul de tip Complex stocat la adresa 1420 este referit de ede ntl. Locale de memorie unde sunt rejinute variabilele au fost alese arbitra, ans | 29 120 | 6.1) Ly as 2700 | ert = 1420 bpodresa 1215 aam0 | 221218 m2 6 “ne eS oadresa 1420 13 ‘Ca un exemplu, in Figura 3.1 exist dous obiecte de tipul Complex, Pre- supunem ci aceste obiecte au fost stocate Ia adresele de memorie 1215 gi res- pectiv 1420, Pentru aceste doua obiecte am definittrei referinje, nz1, nz2 si nr3. Atit nr? cit si nr3 referi (indica) obiectul stocat la adresa 1215; nr roferi obiectul stocat la adresa 1420. Aceasta inseamna ci atit nx 2 cit si nz3 au valoarea 1215, iar nx va avea valoarea 1420. Retineti ci locale efec- tive, cum ar fi 1215 si 1420, sunt atribuite de compilator la discrefia sa (unde giseste memorie libera). In consecing’, aceste valori nu sunt utile efectiv ca valori numerice. Totusi, faptul ci nx-2 gi nr3 au aceeasi valoare este folositor: ‘cami ci le refers acclagi obiect. ( referingi stocheazi intotdeauna adresa la care un anumit obiect se aff, cu ‘excepfia situafici cind nu referd nici un obiect. In acest caz va stoca referinja ‘nul, notati fn Java cu nw. Limbajul Java nu permite referinge cdtre tipurile primitive (cum ar fi int sau float), Exist dou categori distincte de opera care se pot aplica variabilelor re- fering "Care coin parca weal ova imaginar a uni numa complex. 6s 4.1 CBESTEOREFERINTA? 1, Prima categorie permite examinarea si manipularea valori referinga, De ‘exemplu, dacd modificim valoarea stocatd in nz 1 (care este 1420), putem si facem ca ny si refereun alt obiect. Putem de asemenea compara n= 1 sinr3 pentnt a vedea daca referd acelagi obiect; 2. A doua categorie de operatii se aplic& obiectului care este referit. Am putea de exemplu examina sau modifica starea unuia dintre obiectele de tipal Comp Lex (am putea examina partea real si cea imaginara a unui obiect de tipul Complex). Accesul la oricare obiect in Java se face ex- "Sunt curajos!* 224 7 mere” WS Dmere" 2 este convertit la String vimere “42 W> "mere 2 fava cbr ag tet > abe” ‘Sirurile de caractere formate dintr-un singur caracter NU trebuie inlocuite ‘cu constante de tip caracter (constantele caracter sunt de fapt numere) Java dispune si de operatorul += pentru siruri de caractere. Efectul in- strucjiunii str += expreste str = str + expr. Cualte cuvinte str vareferi un nou String generatde str + expr [ati un exemplu: sString st :String s2 = “et dsl tesds //sl va deveni “abed™ {System out printia(si): //va afiza “abed” Este important si observ cd inte atibuirea: Dab 4S 16 este un tntres si atribuirea: str 4 Thello? //str este um String cexisté 0 diferenjé esenjialé. in primul caz, varabila 4 este incrementa cu 5; locajia de memorie a lui 4 nu se modified. in al doiteacaz, se creazi un nou string avind valoarea stz + "hello". Dupé atibuire, st va referi acest nou string. Fostl string refert va fi supus colectri de gunosie (garbage- collection) dact nu aexistat 0 alt refering cttre el. 2 {3 SIRURI DE CARACTERE (STRINGURI) 3.3.3 Compararea stringurilor Deoarece operatorul de adunare functioneaz’ pe sirusi de caractere, am fi tentafi si credem c& funefioneaza si operator relajionali. Acest lucru nu este ins adevarat. Conform reguli privind supraincarcarea operatorilor, operatoriirelajionali =) nu sunt definigi pentru obiecte de tip String. Mai mul, ope- 1 semnificajia clasica pentru obiecte de tip referinja (compar adrese gi nu obiecte). De exemplu, pentru doua obiecte de tip String, x si ¥¥ este adeviirati doar dact x gi refer acelasi obiect de tip String, Astfel, dacd x gi y referd obiectediferite cu conjinut idemtic, expresia vy expresia x ¥y este fals8. Acelasi rafionament este valabil si pentru ! Pentru a testa egalitatea a doui obiecte de tip String, se foloseste metoda equals. Expresia x.equals (y) este adevirati dack girurile de caractere referite de x gi de y sunt idemtice. ‘Ca exemplu si considerdim urmitoarele suri eString x= Tabs 2String y= "ab": sString z= ys In aceast stati, expresia x=y va fi falsi pentru cd x siy sont refernie cate dou obicet dterte (chiar daci se fntimpll ca acestea sh aibe acelagi conginut, si anume "ab", in timp ce expresia y == 2 va fi adevdratépentra cy gi 2 sunt refering cite acelai obiect. Pent a compara cele doud ira de caractorereferite de x si. se Toloseste metoda equals (). in conclu x,equals (y) vaio expresie adeviath Un test mai general poate fi ealizat cu metoda compareTo (). Utlzand cexpresia x..compareTo (y), se comparh dous obiecte de ip String, x si y. Valoatearetumata este un numir negativ, zero sau un numa port daca teste mai mic, egal, respectiv mai mare dec y din punct de vedere al ordi lexicografice. CComparareastingurlor poate fi realizata si ajutorel une alte metode, numité conpareToIgnoreCase(). Accasté metoda are acelai comporta- ment cu compareTo(), doar cd metoda conpareToIgnoreCase() mi face distncie inte lterele mii s iterele marae alfabetw De exemplo, i: UString a1 = Tab" String #2 = “abod": fn acest az, expresia 81. compareTo (52) vafi fale, pentru cl "A" este difert de "a", in timp ce expresia 81. conpareToIgnozeCase (52) vafi adevarati pent ck metoda compareToIgnoreCase nu face dferens intre 4 5.3, SIRURI DE CARACTERE (STRINGUR literele mari si cele mici. Altfel spus, din punctul de vedere al metodei com- pareToIgnoreCase, "A" este egal cu "a", Este evident ci metoda com pareToIgnoreCase nu are sens si fie folositi pe giruri de caractere care nu ‘confin litere, cain exemplulurmitor $1. compareToIgnoreCase ("123") 3.3.4 Alte metode pentru stringuri Lungimea unui obiect de tip String (un sir vid are lungimea 0) poate fi objinuté cu metoda Length (). Deoarece Length () este o metoda, In ‘momentul apelului parantezele sunt necesare Existi dou metode pentru a accesa caracterele din interiorul unui String. Metoda charAt retumeazs caracterulaflat la pozijia specificatt (primul car- acter este pe pozijia 0). Metoda substring returneazs o referinja citre un String nou construit. Metoda are ca parametri pozitia de inceput si pozitia primului caracter neinclus. Tati un exemplu de folosire a acestor metode: String mesaj = "Hello jat_TungimeMesaj = mesaj length (): Ulungimea este $ wr ch = mesaj-charAt (1) Wh este e iString subSir = mesaj- substring (2,4); //sub este “10 LLimbajul Java oferi o paleti impresionanti de metode pentru manipularea sirurilor de caractere. Pe lang’ cele prezentate anterior, metode des utilizate sunt de asemenea: * concat () Descriere: metoda concat adauga la sfirgtul unui sirde caractere un alt sir de caractere. Deoarece un obiect de tip String nu este modificabil (mutabil), prin concatenare se va crea un nou obiect, ce va fi referit de variabila referingi $1. Fostul obiect referit de s1 va fl supus colectiri de ‘gunoaie, in situafia tn care nici o alté variabil& mu fl refer’, Antet: String concat (String str) Exemplu: «String st ssl.concat ("b"): //s1 devine "ab" * endswith() Descriere: verifca dact sirul de caractere are ca sufix un alt sir de carac- tere, 15 {3 SIRUR! DE CARACTERE (STRINGURID Antet: boolean endsWith(String sufix) Exempla: String sl = “abede"s » System out. printin (st -endsWith ("de ))s Sot va afisa true, pentru ca sirul de caractere “abede” se tt termina cu siral de caractere “de te * equaistgnoreCase() Descriere: verified dac& dous siruri sunt egae, fri a face diferenfaintre literele mari gi cele miei ale alfabetului Antet: boolean equalstgnoreCase (String altstring) Exemplu: String st = "ABe™ ) System out. printia (st. equalstgnoreCase (*abe* )); D4 va afisa true, pentru ca mu se face diferenta intre td literete amici sf cele marl ote alfabetelul te * getpy’ s0) Deseriere: converteste stringul intr-un sir de bytes(octeti), astfel incat fiecirui caracter din sir fi va corespunde un intreg de tip by te, reprezen- ‘nd primul byte din codul Unicode al caracterului respectiv’. Antet: byte [] getBytes() Exemplu: byte [] BI = Tabed". getBytes (): ea Nh sirul 61 va contine codurite Unicode ale caracteretor 4 4 ce formeaza sirul "abed", adica 97, 98, 99, 100 “ia eal, proces este ceva mal complex: metodn Get tee) va transforma col Uni- ‘ode al edn caracter din (av nd? oct) in codl pe I octet specifi platforme! pe care ular rmajina vila 6 53, SIRURI DE CARACTERE (STRINGUR © indexof() Desctiere: retuneazi pozijia Ia care se aff prima aparijie a unui sub- sir intraun gir. Dac subsirul nu se regiseste in girul respectiv, metoda returneazit valoarea -1 Antet: int indexof (String str) Exemplu: sSteing st pString 62 pString $3 System. out. printin(s1 -indexOf(s2)) ti) va afisa 9 (indicele din sl la care incepe subsiral s2) # System out printla(s1 indexOf(s3)): SU) va afisa'—T(siral s1 me contine subsirul 33) © Last indexof () Descriere: retumneazs poziia la care se aff ultima aparitie a unui subsir {inten sir. Dacd subsirul nu se afl in sirul respectiv, metoda returneazi valoarea-1 Antet: int lastIndexOf (String str) Exemplu: VString 1 = "BI invata Java pentra ea Java ¢ OOP" pString #2 = “lavas {System out. printla (st lastIndexOf (s2)): - 64 va afisa 25 (indicete ta care incepe ultima aparitie + ta subsirutué s2 in sirut #1) # replace () Deseriere: inlocuieste aparifile unui caracter' run sireu un alt caracter si retumeazii noul sir astfel format. Daca respectivul caracter nu apare in sit, atunci noul sir va fila fel cu ce initial Amtet: String replace(char carVechi, char carNou) Exemplu: sSteing si = ‘Java’: :String s2 = sl-replace('a’, 1/1 32 va avea valoarea *Jivi n {3 SIRUR! DE CARACTERE (STRINGURID © startswith() Desctiere: verifici daci un sir de caractere are ca prefix un alt sir de ccaractere, Antet: boolean startsWith (String prefix) Exempla: String st = “abed": + System out. printla(st. startsWith ("abe"): ie 14 va afisa true pentru ca stringal sl incepe ft ew sirut de caractere "abe" # toLowerCase() Descriere: converteste toate literele mari din string in litere mici. Ante: String toLowerCase() Exemplu: sString st = “ABOU iString #2 = s1.toLowerCase (): 11/32 va fi egal eu “abede™ * toupperCase() Deseriere: este opusa metodei toLowerCase. Converteste toate lterele smici in litere mari Amtet: String toUpperCase() Exempla: v String s1 = ‘abCab*; pString 42 = sl toUpperCase(): 31132 va fi egal eu "ABDCE™ © trim Descriere: elimina spayile de la inceputul si sfarsitul unui sirde caractere. Antet: String trim() Exempla: String. st pel = sl-teim() N//s1 va fi egal ou Java" 8 34. SURI 3.3.5 Conversia de la string la tipurile primitive si invers Metoda toString () poate fi utilizat pentru a converti orice tip primi- tiv la String. De exemplu, toString (45) retumeazi o refering citre sirul nou construit “45, Majoritatea obiectelor furnizeazi o implementare a metodei toString(). De fapt, atunci cand operatorul + are un operand de tip String, operandul care nu este de tip String este automat convert la String folosind metoda toString (). Pentru tipurile de date numerice, ‘exist o varianti a metodei toString () care permite precizarea unei anumite baze. Astfel, instrucjiunea: System out. printia (Integer toString (33, 2))s are ca efecttipatirea reprezentii in baza 2 a numisului SS. Pentru a converti un String la un int exists posibilitatea de a folosi metoda Integer .parseTnt (). Aceasti metoda genereazi o exceptie daci ‘String-ul convertitnu confine o valoare intreaga. Pentru a objine un double Int _arBlemente = 0; "//numaral de elemente citite mp String 8: “sir in care se citeste cote 0 Linke > System. out. printin("Introduceti steinguri:"): 34. SURI try fl Meat timp linia este diferita de “end” While (!"end”-equalstgnoreCase(s = in-eeadLine ())) t it (arElemente fi Maubteaza dimensiunea sirului “wmplus™ clemente = resize (clemente elemente length « 2): 1 clemente [arElemente +41 ) clemente. length ) fateh (Exception ©) t ) System-out-printia("Citire incheiat return resize(elemente arElemente ): Virunchiaza sirul la mumaral de elemente citite 1 Jes Afiseaza sirul de stringurl eltit. of public static vold printSingleDimensional Ar t System. out. printin("Blementele citite sunt: for (int i #0: 1 < array. length; 14) ‘System out. printia array [1]): y (String [] array) 1 Je Redimensioneaza sirul, «/ Public static String] resize(String (] sir, int dimensivneNous ) t Int clementeDeCopiat = Math.min(sir length , dimensiuneNous ); String] sirNow = new String [dimensivneNows 1; for (int i = 0; i < elementeDeCopiat; ++i) t ) Feturm sirNou: 1 sirNou Li sirlil: fee Transforma String] in charE]E. of public statie char [I[] steingsToChars (String [] eray } ( char(J[] characters = new char{ array length J[51: for (int i= 0; i < array.lengths 14) 85 4 SUR an e characters {i} = new char [array [i]. length ()15 . array [i]. getChars (0, characters [i J-lengih, eharacters{i], 0); Hoy “return characters: ) hs fee Afiseaza 0 matrice de caractere. +/ & public: static. veld printMultiDimensionalArray ( a char [][] characters) a 5 System.out. printin("Elemente sub forma de caractere:"): Si for (int i = 0; i < characters tengths 144) » | for (int j = 0; j < characters {i J.length: j++) e System. out. print (characters (i J() 1) > System out. priatia Q: my my oy 3.4.3 Siruri cu mai multe dimensiuni {n anumite situa trebuie s& stocim datele in siruri cu mai multe dimen- siuni. Cel mai des folosite sunt matricele, adic& sirurile cu dous dimer Alocarea de memorie pentru siruri cu mai multe dimensiuni se realizeaza pre- cizand numa de elemente pentru fiecare indice, iar indicierea se face plasénd fiecare indice intre paranteze pirate. Ca un exemplu, declaraia ime (JU x = mew tne (211315 defineste matricea x, in care primul indice poate flO sau 1, iar al doilea poate lua valori de la 0 la 2. Listing 3.2 ofera un exemplu simplu de utilizare @ unei matrici. Dupa cum se poate observa la linia 10, sinul de stringuri ce a fost citit de la tastatura este transformat intr-o matrice de caractere (cAte un gir de caractere pentru fiecare string in parte). Metoda pr intultiDimensionalArray prezinta modul de parcurgere a elementelor matricei objinute. 3.4.4 Argumente in linie de comanda Parametri transmisi in linie de comand sunt disponibili in cadrul unei apli- cafi, prin examinarea paramettilor functiei main). Sirul de stringuri numit 86 34. SURI args din funcjia main confine parametti transmisi programului Java in linia dde comand’, De exemplu, dack avem un program numit Suma. java pe care ilexecutim cu comanda: java Suma 23 atunci parametrul args (0) va fio referinyi cdtre stringul "2, iar parametrul args [1] vafioreferinjicitre "3". Astel, programul urmitor implementeazii © comandi de adunare a numerelortrimise ca argument sa argumentelor in line de comand Mafiseara suma parametrite 1 public static void. main( St + Tae Cares-tenets == 0) + | system out. printin ("Nu existe argumente"): so double suma = 0; wh for (int £ = 0; 1 < arge.tength; #44) "sama + Double. parseDouble(aresti I): cn) e 1 S2sem cout peinsin Sama argumenteor: * + sama) » Rezumat Capitol de fata prezentat tpurile refering. © referin este o variabilé care stocheaza adresa de memori unde se aft un obiect sau referinfa special niu, Refernfle pot indica doar obicete, ng vaiaile de tpar primitive. Orice obiect poate fi refert prin una sau mai multe variabile refering. Deoarece in Java exist doar opt tipur primitive, aproape tol se traduce mn obiecte si clase. Dinte obiect, stingurle au un tratament mai special, pent cl se pot folosi pentn concatenare operstori + si +=. in rest, stringurile sunt lal ca orice alt ip refering, Penta testa dacd dou stringur sunt egale cast confinut, se floseyte metoda equals 7 4 SUR rutile reprezinté o colecie de elomente de acelasi tip. Este important si fom faptl cd indicele de numerotare a elementelor din sir pomeste intot- deauna de a0. {ncadrul captoluui care urmeaza vom prezenta modul in care putem defini no tipuri de dae in fava, flosind noiunea de clase. Nofiuni fundamentale apelare prin referin{&: in majoritatea limbajelor de programare, aceasta {inseam ef parameteul formal repreznta o refering cit parametrl ata ‘Aces fect este ains in mod natural in Javan moment i care se utilizenzi Apel prin valoar pent tipur refering argument in linie de comand: agumentetransmise la execufa uni pro- gram lava care sunt prelate in fonefiamain () colectarea de gunoaie: cliercarea automata din memorie a obicctelor care sma sunt referite, construire penta obicte, se realizea prin intermediol cuvntuluicheie equals: metodi prin care se poste compara daci valorilestocate de dout obiecte sunt egale ‘Length (atribut): folosit penta a determina dimensiunea unui se length (metoda):folosii penta determina lingimea unui obieet de tip string obiect: oenttate de tip neprimii nei: lost pentru a consrui noi obiete 1111: refering special prin care se specific faptl c& mu se face referire Ia ici un obiect. NullPointerExcept Lon: tp de except generat de incercarea de @ accesa un atrbut sau 0 metods pe o referinjé nu12. pointer: casi referinja, pointeral congine adresa In cae se aft un obiect. Spre deosebire de refering, pointeriinecesitio dereferenjiereexplicité pentry, 4 putea manipula obiectl indicat. fn Java nu exist pointer. referinf: variabili care stocheazi adresa Ia care se afl un obiec, 5 prin intermedia cireia poate fi manipulat obieetal cae este refer fir: refine ocolecie de obiete de acelasi tip Erori freevente 1, Pentru tipuri referinj& operatoru ccopiazi doar adrese. nu copiaza valorile obiectelor, El 88 34. SURI 2. Pentru tipuri refering (nclusiv stringuri)trebuie folositi metoda equals in loc de == pentru a testa dacd obiectele referite sunt egale ca si conginut. 3. Alocarea cu un element mai putin decat trebuie pentru giruri (indexarea incepe de la 00). 4. Tipurile referinta sunt implicit inijializate cu nu11, Niciun obiect nu este cconstruit fird apelul lui new. O excepfie Nul1PointerException Indic faptul c& afi uitat si alocayi memorie pentru un obiect. 5. fn Java siruile sunt indexate fa O la N~ 1, unde W este dimensiones siralui Totug Java verified valonrea indicilo, i accesu nafaralimitelor este detectat fn timpul execu 6. Sirurile bidimensionale sunt indexate prin & [4] (3) sim’ ACA, j] cain Pascal 7. Folosiji"" $i nu ** pentru a serie un spagiu sau alte caractere. Exercifi Pe seurt 1. Care sunt diferenfele majore inte tipurile primitive si tipuril referina? 2. Enumeraj $ operat care se pot aplica unui tip refering 3. Enumerati operatille de baz care pot fi efectuate pe stringuri Teorie 1. Daci x si y au valorile 5 respectiv 7, care este rezultatul urmitoarei afi system out. printin(x 6 °° + y) System oat printin(s °° 495 fn practick 1. Creafi un sir de obiecte de tip String si asociaji un String flecdrui ‘element din sir. Afigajiapoi clementele girali cadral unui eielu Zor. 2. Scriofi o metoda care retmmeaz true dacd stringul str este prefix Pentru stringul stxr2. Nu folosifi nici o metoda generala de ciutare pe stringuri in afara de chart. 89 4 SUR 3, Seriefi un program care preia trei argumente de tip String din linia de ‘comandi si le afigeaz pe ecran, 90 4. Obiecte si clase CCovintcle sau limbgjul, aga cum sunt cle serge sau vorbite nu par i joace nici un ro n mecanismul indir mele, Obiectele care par Siserverasc drept element in indirea mea sunt anumite semne $1 imagini mai malt sau mai pojin clare eae pot fia mod voluntar reproduse sau combina. ‘iber Ensen fn aces capitol vom incepe si discutim despre programarea orientaté pe obiecte (object oriented programming - OOP) in Java. O component fun- damental programa orienate pe biecte este specificare, implementarea fi folosirea obiectelor. In captolul anterior am virut deja citeva exemple de obiecte, cum arf stringurie, care fae parte din bibiotcilelimbajului Java, Am putt observa gi faptl cficcareobiec este caracterzat deo amumi stare care poate fi modifica prin aplicarea operatoruoi pune (). in limbajel Java, starea fi funetonaltaten unui obiect se definese prin intermediul unei clase. Un obicet este de fat o insta a une case fn cadralcaptoluelui de fad vom prezent: © Cum se foloseste in Java conceptul de clasa pentru a obtin« siascunderea de informatii, concepte fundamentale ale OOP; + Cum se implementeaza o clasi Java; + Cum se pot grupa clasele in pachete pe baza funcfionalitiii lor comune. 91 4.1 Ce este programarea orientata pe obiecte? Programareaorienati pe obiecte sa impus ca modelul dominant al anilor °90 s contin si domine gin deceniulcuren. in aceastsecjune vom prezenta modul fn care Java suport programarea orienta pe obiecte si vom mentiona citeva dine principle ei fundamentle In central programari orientate pe obiecte se afl nojunea de obiect. Obicc- tol este 0 variabild complex definit de o strucurd gi stare. Fiecare obiect Aispune de operat prin intermediol cdrora i se poate manipula states. Aga cum am vazut deja, in limbajul Java se face distinctie intre un obiect gi o vari- bil de un tip primi, dar aceasta este 0 specifctate a limbajuli Java gino @ rogramictonentate pe obiecte in general. Pe ling opcrailecu un caracter seneral,aupra obictslor se mai pot realiza gi alte opera * Crearea de noi obiecte, insofita eventual de inifializarea obiectelor; # Copierea si testarea egalitaiii; # Realizarea de operatii de intraresiesire cu obiecte. Obicctaltrbuie privt ca 0 nitate atomic pe care uilizatoral mu ar tebui si o disece. In mod normal, nu ne punem problema de a jonsla eu biti din care este format un numir reprezenat in vingult mobil gar fi de-a dreptalridi- col si incereim si inerementim un asfel de mumar prin modificares directa & reprezentii sale interne Principiul atomicitafii este cunoscut sub numele de ascunderea informari- ci, Uiiizatorul nu are acces direct la componente uni obiect sat I imple- mentarea sa, Acestea vor putea fi accesate doar prin intermediul metadelor care au fost famizate impreuni cu obieetl. Putem prvi ficare obiect a f- ind ambalt intro cutie pe care este scris "Nu deschideli! Nu confine compo nentereparabile de ctr uilizator". In via de zi cu zi, majoritatea celr care incearc si repare componente eu aceastiinscipticsfirgesc prin a face mai sult ru deci bine. Din acest punet de vedere, programarea iit limea reali GGruparea datelor sa operailo asupraacestor date in cela ines (agregat). avand grit i ascundem detaile de implementare ale agregatuli, este cunos- utd sub numele de ineapsulare. Agadar,datele sunt ascunse, iar accesul lor se realizea prin intermedivl operailorincapsulate impreund cu ele, mite metode ‘Unul dinte principalele scopur ale programiri orientate pe obiecte este 1e- utlizarea coduli. La fel cum inginesirefolosese din nou si din now aceleasi components in proicctarca de componente electronic, programatori ar rebui 2 si refoloseasci obiectele in loc si le reimplementeze. Exist doua situa dis- tincte legate de reutilizarea codulu (refolosirea obiectelor) 1. Situajia in care avem deja la dispozitie un obiect care implementeazi ex- ‘act comportamentul pe care il dorim, Refolosirea obiectului nu pune in acest caz nici un fel de probleme; 2. Situayia in care dorim si folosim un obiect care deja exist, dar care, desi fare un comportament foarte similar cu ceea ce vrem, nu corespunde ex- act cu necesitifile noastre, Aici este de fapt adevarata provocare: obiectul existent va trebui extins pentru a fi adaptat la comportamentul dorit. Ast- fel se economiseste timp de dezvoltare, deoarece adeseori este mult mai uor si se adapteze un obiect deja existent (a carui functionalitate este ‘asemiinitoare cu cea a obiectului de eare avem nevoie) decat si se reserie totul dela zero, Limbajele de programare orientate pe obiecte furnizeaz8 mai multe mecanisme entra a faciitareuilizarea codului. Unul dintre mecanisme este folsirea co- dului generic. Dact implementarea este idntic, gi diferi doar tipul de baz al obiectuui, nu este necesar si rescriem complet codul: vom serie in schim un cod generic care funcfioneazi pentru orice tip. De exempta, algoritmul de sortare al unui gir de obiecte nu depinde de obiectele care sunt sorate, deci se poate implementa un algoritm generic de sortare Mostenirea este un alt mecanism care permite extinderea functionaiti unui object. Cu alte cuvinte,putem crea noi tipuri de date care si extinds (sau si restrcjioneze) propritaile ipului de date original. Unt prineipa important al programri orientate pe obiecte este polimor- fismul. Un tip refering polimorfic poate si refere obiecte de mai multe tipuri. ‘Atunci cind se apeleazi o metod8 a tipului polimorfic, se va selecta automat tmetoda care corespunde tipului referit in acel moment (vom descre in deta ald mogteniteacAt si polimorfismul fa capitol urmator) Un obiectin Java este o instanfi a unei clase. O clas este similardcu un tip record din Pascal sau cu o strcturl din C, doar c& exists dou’ imbundtiri ma jore. in primul rind, membaii casei pot fatat func dts date, numite in acest context metode, respect atribue, in al doilea rind, domeniul de vzibittate al acestor membri poate fi resticfionat. Deoarece metodele care manipuleaz starea obiectului sunt membri ai clase, ele sunt accesate pin intermedi! o- peratorului punct, la fel casi atibuele. in terminologia programri orientate pe obiecte, atuneicénd apelam o metodt a obiectuui spunem c& “wimitem un ‘mesaj" obiectulu 93 42 ovexewnusieo 4.2. Un exemplu simplu St ne amintim cd, auncicind proiectimo clas, este important st ascundem etal inteme fa de uilizatoru clase, Clasa poste si igi defineasca funcfio- nalitates prin intermediul metodelor. Unele dinte aceste metode vor descr ‘cum se ereeaz gi se iiilizeario instang a clase, cum se realizenzatestele de galitate si cum se descrie starea classi, Clelalte metode sunt specifice structuri panticulare pe care o are clsa,Ideea este c@ utilizatorl na tebuie aiba dreptul de a modifica direct starea obiectuui, ciel va tebui s8 foloseasca metodeleclasei pens a realiza acest Ivers. Aceastidce post fimpusé prin ascunderea anumitor membri faté de utilizator. Pentru a realiza accasa, vom preciza.ca acti membisi fe stoaf in secjinea private. Compilstonl va aveagrijtca membri din seejiunea private sf fe inaccesbili utlizatoulat acelui obiect. in general, toate atrbutele unui obiect ar trebui si fe declarate private Programul din Listing 4.1 prezint& modul de definite al une clase care mo- delear un cere. Definirea clasei const in dova pais publ ic gi private: Secjianea public reprezintt porjiunea care este viibilt pent wtiliztoral obiectului. Deoarece datele sunt ascunse faa de utilizar, seciunea public va contine fn mod normal numai metode si constantc. fn exemplal nostv avem dovit metode, una pentre a serie si una penta a citi raza obiectlor de tip Circle, Celelalte dovl metode calelesza aria respect hingimea obiecti- lui de ip Circle. Sectiunea private confine datcle; acestea sunt inv pentr utilizatorslobicetlui, Atributal radius poste f aecesat done prin in- termedial metodelorpublice set Radius () si get Radius 0) le Listing 4.1: Definirea clasei Circle i Clase simple Java care modeleaza un Cere Uvaloarea razei mu pos Wdireet de private dou! modificata Nl fas Modifica raza cerewtuis/ public veld setRadius (double +) of radius oo 6 fos Metoda pir @ obtine raza cercului.+/ 442, UNEXEMPLU SIMPLU © public 4 af SS return radius: = fee Metoda pir caleulul ariei cereului.e/ public double area) at Me eturn Math. PL + radivs + radius; He getRadivs () tr cateetal tenginil.+/ Te tength Programul din Listing 4.2 prezinta modul de fotosire al unui obiect de tip Circle. Deorece setRadius(), getRadius(},area() si length() sunt membri ai clasei, ei sunt accesati folosind operatorul punet. Atributul radius ar fi putut si el si fie accesat folosind operatorul punct, daci nu ar fi fost declarat de tip private. Accesarea lui radius din linia 15 ar fi fost legals dac& nu era comentaté folosind //. ‘S8 rezumim terminologia invijatd. © clasti confine membri care pot fi ‘arribute (campuri, date) sau metode (functii). Metodele pot actiona asupra atributelor si pot apela alte metode, Moditficatorul de vizibilitate public face ‘ca membrul respectiv si fie accesibil oricui prin intermediul operatorului punct. Modificatorul de vizibilitate private face ca membrul respectiv si fie acce- sibil doar metodelor casei, Daci nu se pune nici un modificator de vizibilitate, atunci accesul la membru este de tip friendly, despre care vom vorbi in paragra- ful 4.44, Mai exist si un al patrulea modificator, numit protected pe care il vom prezenta in capitolul urmator. Listing 4.2: Testarea clasei Circle \Welasa simpla de testare @ clasel Circle + public class TestCircle public statte void main(String () i {© GCirele circle = new Circle (): Bs) circle. setRadius (1 System out. printla System out. printia System out. peintia("Lungime cle. getRadius ()); ele area ()) + circle length ()): 5 Hurmaroarea Tinie ar genera o 95 4 Heroare de compitare | Helrete. radius = 20, ee eat 4.3. Metode uzuale Metodele unei clase se pot grupa in douii eategori # metode cla ‘uzuale, care se regisese in (aproape) toate clasele; + metode care definese comportamente specifice unei anumite clase. {In aceasta sectiune vom prezenta prima categorie de metode: constructor, modificatorii, accesorii, toString () si equals () « 4.3.1 Constructori Aga cum am mentionat deja, una dintre proprietitile fundamentale ale obi- ectclor este acestea pot i defnite si, eventual, iniializate. In limbajul Java, tnetoda care controleazi mol in care un obieet este creat gi infinlizat este constructorul. Deoaree Java permite supraineirarea metodelor, o casi poate $i defnensei mi uli constructor act la definirea clase au se furnizea nici un constrictor, cum este cal clasci Circle din Listing 4.1, compilatorul ereesza automat un constric- tor implicit care iniilizenzd fecare membru ex valorileimpicte. Aceasta {nseamni ci stributele de tipuri primitive sunt iniializate eu 0 (cele boolean cu £a11se) iar atributele de tp refeint sunt iniializate cu ns. Aste, in cara ost, arbutul racitss vaavea implicit vloarea 0. entra furniza un constructor, vom serie o metodi care are acelagi nme cu clasa care nu returneazi nimi. In Listing 4.3 aver doi constructor: unt incepe la linia 7, iar celia Ia finia 15. Folosind acesti doi constructor vom ptea crea obiecte de tip Date in urmitoarete modi Dite di = new Date(s Date 42 = new Date(1S, 3, 20005 De remareat faptul c¥ odati ce afi definit un constructor pentru o las, com- pilatorul nu mai genereaza constructorul implicit fi parametsi, Daca veji avea nevoie de un constructor fir parametri, va trebui acum si il scriefi singuri. De exemplu, constructor din linia 7 trebuie definit obligatoriu pentru a putea crea un obiect de tipul celui referit de cate di. 96. 43, MeTODE UZUALE Listing 4.3: O clas Date minimal care ilustreazs constructorii si metodele equals () si toString () Telasa Java simpla penire stocarea weal > Haw se face validarea datelor & public class Date so 6 © Heonstructor fara parametri : lie Date) 7 ot ty ets month = 1 " year = 2000; ey me Meomstrnctor on tret parametri public Date(int theDay, int theMonth, int theYear) sf ay = theDay: month = theMonth year = theYear: » oy 2B Htest de egalirare BD Hintoarce tre daca Oblectul x este egal cu objectul curent ” blic boolean equals (Object x) » ft Ee if (1x Instanceot Date) return f = Date date = (Date) x: return date. day == day && date.month == month 5 ‘Kk date. year == year my ™ — Heonversie ta String Ss public String toString () » ” return day 4 °/* + month 4 °/* 4 year 5 wy = Hatribure & private tnt day: private imt month: fo private int years a 7 43, METODE UZUALE 43.2 Modificatori gi accesori Atributele sunt declarate de obicei ca find private. Aceasta inseamn’ ci cle nu vor putea fi direct accesate de citrerutinele care nu aparfin clase. Exist ‘otusi multe situapii in care dorim si examinim sau chiar si modificim valoarea unui atibut posibilitae este aceea de a declara atributele ca fiind public. Aceasta ru este o solutie elegant, deoarece incalea principiul ascunderii informayie utem insi scrie metode care si examineze sau si modifice valoarea fiecarui cmp. O metodi care citeste, dar nu modifica starea unui obiect este numiti accesor. O metoda care modifica starea unui obiect este numit’ modificaror (engl, mutator) ‘Cazuri particulare de accesori si modificatori sunt cele care acjioneazsi asu- pra unui singur cimp. Accesorii de acest tip au un nume care incepe de obicei cu get, cum ar fi getRadius (), iar modificatorii au un nume care incepe de regulicu set, cum ar fi setRadius (). Aceste metode sunt atat de des folosite in Java, Incdt au si denumiri consacrate in limbajul uzual al programa- torilor Java: getteri, respectiv sesteri (a nu se confunda cu rasa de patrupede ‘care poarté acelagi nume), Avantajul folosirii unui modificator (sau a unui setter) este ci acesta poate verifica dact starea obiectului este corectd, Astfel, un setter care modific& atributul day al unui object de tip Date poate verifica corectitudinea datei ‘care rezult. 433. Afigare si tostring() fn genera, afigarea stiri unui obiect se face wilizand metoda print () din clasa System. out. Pentn a putea face acest her trebuie ca obiectil eae se doreste af afigat si confi o metodi cu numele de toString (). Aceasti metodt intoaree un Sting (eprezentindstarea obiectwhui care poate aig Cauun exemplu in Listing 43 am prezenta o implementa rudiment unei metode toString () pentni elasa Date in linile 35-38, Definirea acestet metode permite si afigim un obiect di de ip Date folosind insruciunea System. out .print (di). Practic, compilatorl Java nu fae altceva decit si invooe automat £oSteing () penta flecare obiect care se afigeaza. Ast- fel system.out .print (dl) este tradusi de cate compilator in instuci- unea System.out print (41.tosteing()). Aceasti simplé facilitate las8impresiaprogramatorilor neavizaji cd metoda pent () “sie” si afigeze obiecte Java. In realitate, metoda print () nu sti deci si afgezestringurt ‘Compilatorl Java este inst sufcient de intligen pens a transforma obiectcle 98 in stringuri, prin apelul metodei toString () (de altfel, tot compilatorul este cel care converteste la afigare si tipurile primitive la String, atunci cid este canal) 4.3.4 Metoda equals () Metoda equals este folositi pentru a testa daci doud referinie indici obi- ccte care ati aceeasi valoare (stare). Antetul acestei metode este intotdeauna public bi san equals (Object rhs) Ai emareat probabil nedumeriifaptl ck parametru tris metodei este de tip Object si mu de tip Date, cum ar fi fost de asteptat. Rafunea acest lent so prezentim in capitolal urmtor. fn general, metoda equals pentnt o clas X este implementa in ag fl inet sf retumeze Crue doar dack rhs (abreviere pentru “right hand side”, adicd operandul din partea dreaptia expre- sie) este o instang a lui x s, fm plus, dupa conversa la X toate atibuele lat ‘hs suntegale cu atributele obiectulul(atrbutele de tip primi trebue si fie egale via ==, ia atributele de ip referingStebuie si fie egate via equals ()) Un exemplu de implementare a lui equals est dat in Listing 4.3 pent, clasa Date in linile 25-32. 4.3.5 Metode statice [Existi anumite cuvinte cheie ale limbajului Java cate specificd proprietii speciale pentru unele atribute sau metode. Un astfel de cuvant cheie este sta~ tic. Auibutele si metodele declarate st at ic tntr-o casi, sunt aceleasi pentru toate obiectele, adicd pentru toate variabilele de tipul acelei clase. Fiind identice pentru toate obiectele unei clase, metodele statice pot fi accesate far’ sf fie nevoie de 0 instantiere a clasei respective (adica de 0 variabila de clasa respec- Livi). Metodele statice pot utiliza variabile statce declarate tn interiorul clase. Cel mai cunoscut exemplu de metodi statickeste main). Alte exemplede metode statice pot fi gisite in clasele String, Integer si Math. Exemple de astfel de metode sunt String. valueOf(), Integer .parsernt (), Math.sin() siMath.max (). Accesul la metodele statice respect aceleasi reguli de vizibilitate ca $i metodele normale, 4.3.6 Atribute statice Atributele statice sunt folosite in situafia in care avem variabile care trebuie partajate de c¥tre toate instanjele unei clase. De obicei atributele statice sunt 99 43, METODE UZUALE constante simbolice, dar acest lucru nu este obligatoriu. Atunci cind un atribut al unei clase este declarat de tip static, doar o singura instangi a acelei variable va fi creat, Ea nu face parte din nici o instanfa a clasei, Ea se comporti ca un fel de variabild global unicd, vizibilé in cadrul clasei, Cu alte cuvinte, dacd avem declarayia «public Ht 5 private Int x: 1 private static Int y: s 2 Exempla fiecare obiect de tip Exemp1u va avea propriul atribut x, dar va fi doar un singue y partajat de toate instanjele clasei Exemp1u, (© folosire frecventé pentru campurile statice o reprezinté constantele, De cexemplu, clasa Integer definesteatributul MAX_VALUE astfel public final statie int MAX.VALUE = 2147483687; Analog se defineste si constanta PZ din clasa Math pe care am folosit o in clasa Circle, Modificatorsl final indica faptu cd identiicatoral care turmeazi esto constant, Dac8aceast constant nu arf fostun arbut stat ic, sume fccare instal a classi Integer ar fi avut un atribut eu numele de MAX_VALUE, irosind astflinutil spa in memoric. ‘Aste, vom avea o singuravarabila cu numele de MAX_VALUE, Constanta poate fi accesati de orcare dntre metodcle clasei Integer prin dentifcatorsl MAX_VALUB, Ea va putea fi folosti side citroun obiectde tip Integer mumit > prin sintaxa x,MAX_VALUE, ea orice alt edmp, Acesthuer este permis doar pentni ei MAX_VALUE este public. fnsfirit,MAX_VALUE poate foloit prin intermedia numeluiclasei ea Integer .€Ax_VALUE (lot pentru cd este pub] ic). Aceast ullims folosire nu arf fost permis pent un efmp cae ni sxte static Chiat si fra modifictora £:na, atributelestatce sunt foarte folositoae Si presupunem ci vrem si rejinem nunnul de obiecte de tip Circle care au fost constute. Pentru aceasta avem nevoie de o variabili stata. fn clasa Ciede vom face dectaajia: private static int numarlnstante = 0: ‘Vom putea apoi incrementa numarul de instanje in constructor. Dac acest ‘cimp nu arf fost de tip stat ic am avea un comportament incorect, deoarece fiecare object de tip Circle ar fi avut propriul atribut numarIngtante care ‘ar fi fost incrementat de Ia 0 Ia 1 Remarcaji faptul c8, deoarece un atribut de tip static nu necesita un obiect care s& il controleze, fiind partajat de care toate instanjele clasei, el poate fi 100 folosit de catre o metodi static’ (daci regu de vizbilitate permit acest lucru), Aributele nestatice ale unei clase vor putea fi folosite de catre 0 metodi statics, doar daca se furnizeaza si un obiect care i le controleze. 4.3.7. Metoda main() ‘Atunei cdnd este invocat, interpretonul java cauti metoda main () din clasa care i se di ca parametru. Astel, in situafia in care aplicafia noastri este formati din mai multe clase, putem serie te o metodi main () pentru flecare clasi, Acest lucru ne permite si testm funcfionalitatea de baza a claselor in viduale. Trebuie si avem totusi in vedere faptul c¥ plasarea functiei main () {in cadrul clasei ne confer mai multi vizibilitate decit ne-ar fi permis prin uti- lizarea clasei din alt loc. Astfel, apeluri ale metodelor peivate pot fi Facute {in test, dar ele vor esua cind vor fi utilizate in afara clase 44 Pachete Pachetele sunt folosite pentru a organiza clasele similare. Fiecare pachet consti dint-o muljime de clase. Clasele care sunt in acelagi pachet au restrictii de vizibilitate mai slabe fntre ele decat clasele din pachete diferte Java oferiio serie de pachete predefinte, printre care java. io, java. awt, java.lang, java.util, java.applet ete. Pachetul java.lang in- clude, printre altele, clasele Integer, Math, String gi System, Clase mai cunoscute din java.util sunt Date, Random, StringTokenizer, Pachetul java. Lo cuprinde diverse clase pentru stream-uri, pe care le vom prezenta in capitolul 7. De asemenea, pentru o prezentare mai amanunftd a pachetelor predefinite, vi recomandim si consultaji anexa C. Pe linga infor- ‘mati detaliate despre aceste pachete si despre modalitatea de a vi crea propriile dumneavoastri pachete, anexa C prezinti gi nofiunea de arhiva jar, foarte utili ‘cadral aplicafilor de dimensiuni mai mari (O clasi oarecare C dintr-un pachet P este desemnati prin P .C. De exemplu, putem declara un obiect de tip Date care si congina data si ora curenth astfel: java. util Date today = new java. util Date(s Observasi ed prin specificarea numelui pachetului din care face parte clasa, evitim conflictele care pot fi generate de clase eu acelagi nume din pachete diferte! "De exempl, a casa Dace Sef anterior in sectonen 43 101 44 PACHETE 4.4.1 Direetiva import Utlizarea permanenti a numelui pachetului din care fac parte clasele poate fi uncori deosebit de anevoioasd, Pentru a evita acest lucru se foloseste directiva import: Import NumePachet .NumeClasa Import NomePachet +; acd recurgem la prima forma a directivei import, vom putea folosi de- numirea NumeC1asa ca o prescurtare pentru numele clasei cu calificare com- pleti. Dac folosim cea de-a doua forma, toate clasele din pachet vor putea fi abreviate cu numele lor neprecedat de numele pachetuli De exemplu, realizind directivele import de mai jos: Import java.util Date: slmport java.io.+: putem si folosim: public statle double readDouble() » ¢ return Double. parseDouble( readString ()): my he public statte char readChar() » Ct % BufferedReader in = new BufferedReader new InputStreamReader (System. in )) no ty 5 0 a return (ehar)in read (): so eaten (1OException ©) » ” Wignore so fe return "\0"s eo public statle Int[] readintarray () » ¢ Ss String s = readString Qs hn StringTokenizer st = new StringTokenizer (3): Ut {] 8 = mew Int[st-countTokens ()] we for (int i = 0; i < a.tengths +4) st » ali] = Integer. parseint (st -nextToken (9) so so wy 4.4.4 Reguli de vizibilitate package-friendly x importante, In primul rind, dact Pachetele au cdteva reguli de vizibili pentru un membru al unei clase nu se pi vibilitate (public, protected sau private), atunci membrul respectiv devine (package) friendly. Aceasta inseamnii ci acel cmp este vizibil doar pentru clasele din cadrul aceluiasi pachet. Aceasta este o viziilitate mai pugin restrctivi decdt private, dar mai restrictiva decdt public (care este vizibil si pentru membrii din alte clase, chiar si din pachete diferite). {nal doitea rand, doarclasele pub1ic din cadrul unui pachet pot fi folosite din afara pachetului, Acesta este motivul pentru care am pus intotdeauna modi- 105 ‘un modificator de vi 45, ALTE OPERATII CU OBIECTE $1 CLASE ficatorul publ ic in fafa unei clase. Clasele nu pot fi declarate private sau protected (cu o singura excepfie: clasele interioare, despre care vom vorbi {in capitolul urmator). Accesul de tip friendly se extinde si pentru clase. Dac fo clasi mu este declarati ca fiind de tip publ ic, atunei ea va putea fi accesata doar de clasele din cadrul accluiasi pachet. ‘Toate elasele care nu fac parte din nici un pachet, dar sunt accesibile find puse intr-un director din CLASSPATH, sunt considerate automat ca ficnd parte din acelasi pachet implicit. Ca o consecin{a, accesul de tip friendly se aplic’ pentru toate aceste clase. Acesta este motivul pentru care vizibilitatea nu este afectati daci omitem si punem modificatorul public in clasele care nu fac parte dintr-un pachet. Totusi, aceast modalitate de folosire a accesului friendly ru este recomandats, 4.4.5 Compilarea separati ‘Atunci cind o aplicajie consti din mai multe figiere sursi. java, fecare fsier tebuie compiatseparat. In mod normal, fecare clash este plasat trun fsier . java propru, Ca urmare a compilari vom objine o colectie de isiere selase, Clasele sursi pot fi compilate in orice ondine, Pentna a compila toate fgerele sur dintvan director printro singuré comands, pute flosi o extensie a comenzii javac, astel Javac *. java 4.5. Alte operatii cu obiecte si clase {in aceasti sectiune vom prezenta inci trei cuvinte cheie importante: this, instanceof si static. this are mai multe utiliziri in J tre ele le vom prezenta in aceasti secjiune. instanceof are si el mai multe utilizar; il vom folosi aici pentru a ne asigura c¥ o conversie de tip se poate re- aliza, $i cuvantul cheie stat ic are mai multe semnificati. Vom vorbi despre metode statice, atribute statice 1 inifializatori static. fa. Dou dine 4.5.1 Referinta this Cea mai cunoscutd utilizare pentru this este ca o refering’ la obiectul ccurent, Imaginafi-va ci this va indic& in fiecare moment locul unde va aflai. O utilizare tipic’ pentru this este calificarea atributelor unei clase in cadrul 106 45, ALTE OPERATILCU OBIECTE sl CLASE uunei metode a clasei care primeste parametri cu nume identic cu numele atri- butelor. De exemplu, in clasa Circle, din Listing 4.1, putem defini metoda setRadius astfel Las Modifica raza cercului. «/ “public veld. seiRadivs (double radios) u Mfradius este parametrul Shae this radvas tore atriburul clasei {thle radios “S"radiae n fn seoventa de cod precedent, pentes a face distnejie intre parametral adits g aributul cu acelagi nme (care este “ascuns" de cite parametny) se foloseste sintaxa this . radius pentns a refer atibutl clase Un alt exemplu de folosire al ii thie este penta testa ci parametrul pe care o metodi il primeste nu este chiar biectul caren. Si presupunem, de ‘exempl, cd avem o clasé Account care are o metoda final Transfer () pentn a transera toa suma de bani dintran contin altul. Metoda ar putea seria ste: ‘public vod finalTransfer(Account account) a } dollars += account. dollars 1 account dollars = 0: ” ‘Si consideriim seevenia de cod de mai jos: 1 Account account! Account accouat?: ‘account? = account! : Saccountl final Transfer account? ); Deoarece transferim bani in cadrul aceluiasi cont, nu ar trebui si fie nici © modificare in cadrul contului. Totusi, ultima linie din final Transfer () are ca efect golirea contului debitor, ceea ce va face ca suma din account 2 si fie nul. O modalitate de a evita 0 astfel de situajie este folosirea unui test pentru pseudonime (referinje care indic& acelasi obiect): ‘public yold finalTransfer(Account account) af Ydaca se incearca un transfer in acelasi cont ir (this == account) ) 107 45, ALTE OPERATII CU OBIECTE $1 CLASE + dollars += account. dollars account. dollars 4.5.2 Prescurtarea this pentru constructori ‘Malte clase dispun de mai mulji consteuctori care au un comportament si- milar, Putem folosi this in cadrul unui constructor pentru a apela ceialji constructori ai clasei. De exemplu, o alti posibilitate de a serie constructoru! irk parametri pentru clasa Date este: public Date() a 2 Hapeteasa constructorul Date(it, int, int) 4 tnisc, 1, 2000): s ‘Se pot realiza si exemple mai complicate, dar intotdeauna apelul lui this trebuie si fie prima instrucjiune din constructor, celelalte instrucfiuni fiind in continuarea acesteia 4.5.3 Operatorul instanceof Operatorul instanceof realizeazi o testare de ti Reaultatul expresii: timpul executiei exp lnstanceot NumeClasa este true daca exp este o instanjaa lui NumeC1 asa gi f21se in caz contrar, Daci exp este nu11, rezultatul este intotdeauna false. instanceof este folosit de obicei inainte de 0 conversie de tip, i adescori este folosit in legaturt cu referingele polimorfice pe care le vom prezenta in capitolul urmitor. 4.5.4 Inifializatori statici Atributcle statice sunt inifializate atunci cfnd clasa este sie, Uneori este inst nevoie de o iniializare mai complexi a acestor atribute. ‘Si presupunem de exemplu cl avem nevoie de un sir static care specific’ penteu fiecare numa intze 0 $i 100 daci este num prim sau nu, O posibilitate ar fi st definim o metodi staticd si si cerem programatorului si apeleze acea metoda {nainte de a fotosi sirul altemnativi mai elegant la aceasti solugie este folosirea inijalizatorului stati Instructiunile din cadrul initializatorului static sunt executate automat la Incircarea clasei in memorie (deci inainte de a fi creat prima instanga), ceea 108 45, ALTE OPERATILCU OBIECTE Sl CLASE ce ne asigura ci atributele statice sunt corect initializate Ia utilizarea clasei. Un ‘exemplu este prezentat in Listing 4.5, Aiciiniializatorul static se extinde de la linia Sta linia 20, Injializatorul static trebuie s& urmeze imediat dup membrul static, Listing 4.5: Clasa Prime, care foloseste 0 seevengi staticl de inifializare public class Prime ut 2) private statle boolean prime) = new boolean [100]: static . ot > for (int i = 2: 1 < peime.length; +43) : ¢ : prime(i} = 0 * for (int 5 " c & iwi Ee ( 5 prime(i] = false " break: “ ) a ) 1 = 4 2B Hrestul etaset Rezumat Acest capitol deserie nofiunile de obiect si clas, precum gi elementele fun- damentale legate de acestea, cum ar fi atribute, metode, constructor, reguli de vizibilitate si pachete. Clasa este mecanismul prin care Java permite crearea de uri refering. Pachetele sunt folosite pentru a grupa clase cu comporta- ‘ment similar, Pentru o mai bund injelegere a pachetelor si a modului de operare ‘eu ele va invitim s& consultati anexa C. Tot acolo vefi alla ci toate clasele ‘care compun o aplicajie pot fi grupate intr-un singur fier, indiferent daci sunt ‘onganizate pe pachete sau nu, Rezultatul va fio arhivi jar. Capitolul urmetor prezinta alte concepte importante ale programarii orien- tate pe obiecte: mostenirea, polimorfismul, programarea genericd. 09 45. ALTE OPORATHLCU OBIE SLCLASE Nofiuni fundamentale las: concept care grupeazs atribute $i metode care sunt aplicat instanjelor clase. CLASSPATH: variabili sistem care specifict directoarele gi figierele arhive ‘in care masina viruali JVM cauti clasele folosite de aplicaile Java, constructor: metodi speciali responsabili cu crearea si inifializarea de noi instanje ale clase constructor this: folosit pentru a apela un alt constructor din aceeasi clasi, friendly: tip de acces prin care clasele/metodele/atributele asociate nu sunt accesibile decat in interiors! pachetului din care fac parte. impor t: instrucjiune prin care se oferi o prescurtare pentru un nume com- plet de clas (numele complet include gi pachetul din care provine clasa), ializator static: secvenfa din cadrul unei clase care permite inifilizarea atributelor statice, obiect: instangi a unei clase, pachet: termen folosit pentru a organi similar, package: instrucjiune care indici faptul cl o clas este membri a unui pachet, Trebuie si preceadi definirea unei clase private: tip de acces prin care atributele/metodele sunt complet ascunse celorlalte clase, putdnd fi uilizate doar in cadrul elasei din care fac parte. publ ic: tip de acces prin care atributele/metodele unei clase sunt vizibile in restul clasclor. referinga this: referin{ citre obiectul curent. static: cuvint cheie prin care se precizeaza faptul c& o metoda sau un atribat sunt comune pentru toate instanjele clasei, Membrii statici nu necesito instanga pentnt a fi accesaj colecfi de clase cu comportament Erori frecvente 1. Membrii private mu pot fi accesafi din afara clasei. Rejinefi ci, im- plicit, membrii unei clase sunt friendly. Ei sunt vizibili doar in cadrul pachetulu. 2. Folosiji public class in loc de class, cu excepfia situafei in care scriei o clasi ajutatoare de care nu vesi mai avea nevoie in afara pachetu- i. 10 45, ALTE OPERATILCU OBIECTE Sl CLASE 3. Parametrl formal al metodei equats tehuie st fie de tip Object. in az contra, desi programl se va compila, in anumitesituai se va apela metoda equa: implicit (care compara obiectlefolosind 4, Metodele statice nu pot accesa atributele nestatice far un obiect care $8 le controleze. 5. Deseori se uiti adiugarea " . +" atunci cand se doreste importarea tuturor super (a: a ‘Metoda super poate fi utlizatd si pentru a apela constructori cu paramett De exemplu, daci avem o clasi de bazii care are un constructor cu doi parametti de tip int, atunci constructonal clasei derivate va avea in general forma: ‘public Derived(int x, int y) 3 mperex, 90: 1 atte instrwettunt 4 Metoda super () poate st apari doar in prima nie dintr-un constructor Daci nu se face un apel explicit al lui super (), compilatorl va realiza au tomatun apel al metodei super () fr parametri chiar la fnceputul construc- torului, Este important de remarcatc% apelul implicit este etre constructor! implicit (Fa8 parameti al casei de baz8. Dact acest constructor nu exist (si ti uitim cf el se genereazd automat doar dac8 nu exist alli constnictori), ‘objine eroate I compilare. De exemplu, clasa Base de mai jos defines un constrictor eu un parametrs de tip int: public class Base t public Base(int x) ‘ System. out. printin("Base(int) called.") ; 1 1 Clasa Derived, extinde clasa Base, redefineste constructorul cu parametra de tip int gi defineste 0 metod’ima in () care creeazi.un obiect de tip Derived: public class Derived extends Base a public Derived ( int x ) i 5 System, out, printin ("Derived (int) called") + oo public statte vold main(String [] ares) i new Derived (2) 5 no " Aparent, nimic nu este in neregul cu aceste clase. Totusi, construirea obiee- lului Derived, presupune construirea in prealabil a obiectului Base, pe care acesta fl extinde. Cum constructorul din Derived nu confine un apel explicit, alconstructorului din Base, compilatorul va adiuga automat un apel eitre con- structorul implicit. Dar, surpizi! Acest constructor nu existi gi nici nu a fost ‘generat implicit, deci se va objine o eroare la compilare, fn care suntem anunjati cu parere de miu ci “nu a fost gisit constructorul Base ()". Corect este ca prima linie din constructorul clasei Dez ived sti fie un apel citre constructorul ‘cu parametru de tip int din clasa Base: public Derived ( int x ) a 2 super(x) 4 System. out. printia ("Derived (iat) ealled.*) : sy La executiaclasei Derived se va afisa in consol: Base(int) called. Derived(int) called. 5.2.3 Redefinirea metodelor. Polimorfism Polimorfsmul, al treitea concept fundamental al program orientate pe object, alituri de ineapsulae si mostnire,cteazA adeseor un anamit prad de confuzie in randul programatorilor ncepétori, Vom rma in acest paragaf i clarfcim aceasta importanténofune, icra absolut necesar penruo injelegere profunda a programa orientate pe obiect. CCapacitatea dea asuma diferte forme poarti numele de “polimorfism". Apa oferi un bun exemplu de polimorfism in lamea teal: apare sub forma solid (hea) chia, sau gazoasa (vapori de apa). fn Java, polimorismul inseamna co singura variabilsreferinj& poate fi folosta penta desemna mai multe obiecte - instanje ale unor clase similare! - in diferite momente ale executici Tyas ci cae derivate dros sau ines din aceag cls de baz 122 i program, Cand o referinja x este folosita pentru a invoca © metoda a unui obiect (de exemplu, x. met odaMea ()), metoda precisa care va fi apelati. depinde de obiectul pe care variabila referinja il indica in acel moment. (© variabilé referinj& poate referi un obiect a carui clas este similar’ cu tipal variabilei referinja.. De exemplu, si presupunem c& avem clasele Animal, Pisica, Soarece, Caine, definite ca mai jos: Listing 5.2: Exemplu de polimorfism public class Animal ‘ public String caracterist t 2) an a | a0 bile String caracteristica() Dpublic class Caine extends Animal af 5) public String caracte: a0 public class PolimorfismEx af bic static void main(String args []) e ‘Animal a = new Soarece 0; ™ System-out-printin("Caracteristica primului animal: * + » a. caracteristics()): . Malte instructinn’ * a = mew Caine Qs 5 System_out.println("Caracteristica celui de-al doilea” + a “animal: " + a. caraeteristica ()): 2 Malte instructinal Cova ce atrage atenjia asupra acestui program este faptul c& toate cele patra metode caracterist ica () au aceeagi semniiturt (nume glist de parametri) ‘Acest lueru este permis deoarece nu exist’ dou metode cu aceeasi semméitur {n aceeasi clas’. Cum trei dintre aceste clase (Soarece, Caine, Pisica) cextind 0 a patra clasi (Animal), spunem ci metodele caracteristica() in clasele derivate redefinesc (engl. override) metoda caracteristica() din clasa de baz’, ‘Si analizim acum instructiunea urmitoare: Anim new Soarece(): fn ceast stati, variabila refering care este de tipul Animal desem- neazi un obieet de ipul Soazece, care ESTE-UN Animal prin mostenie (prin urmare,atribuirea este corect). Mai depart, intlnim in ead aceleagi seevenie de cod ow Caine (): Cu alte cuvinte, variabila a referd (Ia momente diferite de timp) obiecte de tipuri diferite, dar similare (prin faptul e& sunt derivate din aceeasi clas Animal). Pentru a vi convinge de acest lucru,rulafi acest program. El va afiga urmitorele date Caracteristica primului animal: are culoarea gri Caracteristica celui de-al doilea animal: latra up’ cum se poate observa, apelurile metodei caracteristica(),prin intermediul referinjei a, au determinat apelarea metodelor corespunzatoare din clasele Soarece si Caine (si prin urmare, dous afigiri diferte), deoarece la ‘momentul fiectrui apel, variabila a referea un obiect de tip diferit. Poate c& unit dintre dumneavoastra se asteptau ca singura metods apelati si fie cea din clasa Animal, motiv pentru care rezultatul vi se pare anormal, dar el va fi perfect, cexplicabil dupa ce vom detalia nosiunea de apel polimorfic al unei metode, 128 Ca o paranteza, trebuie remarcat faptul c& inversarea rolurilor celor dowd clase nu este posibi fn cadrul acestui exemplu (normal de altfel, deoarece un animal nu este in mod obligatoriu un goarece): Soarece s = new Animal (); //INCORECT Dupa cum am vazut anterior, in cadrul subcapitolului 5.1, mostenitea per- mite tratarea unui obiect ca fiind de tipul propriu sau de tipul de baza (din care este derivat tipul propriu). Accasta caractersticd este esenjialé deoarece permite mai multor tipuri (derivate din acelasi tip de date) s& fie tratate uni tar, ca si cum ar fi un singur tip, motiv pentru care acceasi secventii de cod va fi fancfionala pentru toate aceste tipuri, Pe de alti parte, apelul polimorfic al unci metode permite unui tip si exprime distinctia fafé de un alt tip simi- lar, alata timp cat amandous sunt derivate din aceeasi clasi de baz. Distinetia este exprimatd prin diferenja in comportamentul metodelor care pot fi apelate prin intermediul clasei de baza (in exemplul nostru, este vorba despre metoda caracteristica()). Polimorfismul permite scrierea de cod doar in raportcu clasa de baz, ca gi cum “am fi uitat” de clasele derivate. Totusi, cei mai mul}i programatori in spe- cial cei cu experienyi in programarea procedural, intimpind anumite dificultayi in njelegerea modului de functionare a polimorfismului Dificultatea poate fi intalnité si in cadrul programului din exemplul anterior. AMigarea celor doui mesaje este evident cea doritd, desi parcurgind codul sursi al programului, am putea avea impresia c& programul nu va functiona in acest ‘mod. Dacii privim mai atent linia 38, observim ci metoda caracteristica() este apelati prin intermediul unei referinje de tipul Anima. Aga ci ne punem ‘mod logic intrebarea: este posibil si tie compilatorul c& variabila refering de tipul Animal referd un obiect de tipul Soazece, din moment ce se ape- leaza metoda acesteia din urma? De unde stie compilatorul e& este referit un obiect de tip Soarece, gi nu un obiect de alt tip (de exemplu, Pisica sau Caine)? Rispunsul este cB, de fapt, compilatorul nu stie acest lucru. Pentru a injelege mai bine aceasta problema, este necesari o examinare mai atent& a noun de legare. ‘Conectarea unui apel de metodi de un anumit corp de metoda poarté numele de legare (engl. binding). Cand legarea are loc inainte de rularea programului respectiv (cu alte cuvinte, in faza de compilare), spunem cf este vorba despre o legare static (engl. early binding). Termenul este specific programirii orien- tate pe obiecte. in programarea proceduralii (gen programarea in C sau Pascal), nofiunea de legare statict nici nu existd, pentru c& toate legiturile se fac in mod stat in programul anterior, compilatorul nu stie ce metoda caracteristica() 125 (dinclasa Animal, Soarece, Pisica sau Caine?) shapeleze, avind doaro referinjlde tipul Animal. Soluia const insi in legarea tarzie (engl. late bind- ing). Cunoscuta si sub numele de legare dinamicd sau legare tn faza de execujie (engl. dynamic binding, run-time binding), legarea tirzie permite determinarea in faza de executie a tipului obiectului referit de o variabili referin(a si apelarea metodei specifice acestui tip (in exemplul nostru, metoda caracteristica() din clasa Soarece). Mecanismul de apelare a metodelor determina in mod ccorect metoda care trebuic apelati gio apeleazi, Legarea este un fenomen care are loc automat - nu este atribufia programatorului si decida daci o metoda este apelaté prin legare statied sau dinamic ‘Am ajuns la momentul in care tebuie si conturim diferenja dintre redefini- rea (suprascrierea) unei metode si suprainedrearea ei. Cu alte cuvinte, overrid- ing vs. overloading. Finalul capitolul 2, secjiunea 2.6, a prezentat nojiunea de supraincarcare a metodelor. Recapituland pe scurt informaile precizate acolo, supraincarcarea metodelor permite existenja in interiorul aceleasi clase a mai multor metode cu acelasi nume, dar cu lista diferit de parametti (prin uurmare, cu semnaturi diferite). Astfel, putem avea o metod’ int max (int a, int b) siometoda int max(int a, int b, int c),ambelein cadnul aceleiagi clase. Evident 8, analog, putem avea prima metod? ceadrul uunei clase de bazi gi cea de-a doua in cadrul unei clase derivate din clasa de bara. Pe de alté parte, nofiunea de suprascriere (redefinire) se bazeazs tocmai pe ideea ci metodele trebuie si aibe aceeasi sem ‘derivate din clasa de bai (vezi exemplul din aceasti sect ‘cele douti concepte este in acest moment clar definité Cele dow concepte pot provoca uncori greseli de programare greu dete tabile, in cazul in care nu sunt folosite corect. Iati un exemplu sugestiv: si presupunem c& metoda caracteristica() din clasa Soarece arfi avut de fapt urmatoarea defini: sii se afle in clase 1e), Diferenja dintre ‘public String: a 1} return “are blana gris a eteristica (int i) Poate ci acest antet ar fi fost o gregealii neintenfionati a programatorului, sau pur si simplu, ar fi fost cova intenjionat, Ce s-ar fi fntimplat in aceasté situ- aje Ia executia liniei 38 din exemplul nosteu’ Cert este c& aceasta mu ar fi fost interpretata drept o eroare de catee compilator. Programul ari rulat si ar fi afigat rezultatele: Caracteristica primului animal: necunoscuta 126 caracteristica celui de-al doilea animal: latra Poste ci vi se pare ciudat rezultatul execufiei versiunii modifcate a pro- gramului. Si vedem ce sa intamplat de fapt. Deoarece in clasa Soazece, noua metodi caracteristica() are o semnitur diferté fa de metoda cu acelaginume a clasei de baz, am realizato supraincdrcare a acelei metode, si nu o redefinre a ei, Astfelclasa Soarece are acum doui metode car Facteristica() diferite: una mostenit prin drivarea din clasa de baz fi cealalts prin supraincircarea metodei din clasa de baz8. In urma apelului Gin linia 38 se va executainsi metoda mostenith din clasa de baza, si nu cea supraincircata,deoarece aceea corespunde ca semnitur, Astel, mesajul afigat este “necunoscuta”. Desi se intenfionaseo redsfnie a acelei metode, datoritifaptlui ck s-0 resi a definirea antotuui e,rezltatal naa fost col atepat. Totus, compila- torul a presupus ca intentia a fost de a supraincarca metoda si nu de ao redefini, rmotiv penta caren a afigat nici o eroare. Evident cd acesta nu este un ape! polimorfc de metoda. Odatd ce a fost depistatéeronrea ea poate fi inlaturatt Simpla, isk ent infnt mai gre in can vnor aplicait msi complexe. La fel de adevirat este faptl ck uncori exact acest comportament este dort. Programa torii avansafi vor sti cu siguranfa cum sa “jongleze” cu cele doua nojiuni. Cei poi vor trebui si fie Fart ten in astfel de situa, pent a implementa exact comportamentl pe earl doves. Datorté polimorfsmului, exempll nostrs poate fi extins, adiugind noi functonaliti prin intermediol unor tur noi de date (clase) care mogtenese comportamentil casei de baz. Ale spus, patem dug clase noi ce extind comportamental ease nial, fir ca aceasta sh prejuicieze codul existent Referitor Ia modul de utlizare a polimortismli exist o singuré problem ce trebuie trata cu mare atengie penta cf este generatoure de mati proble- me, grea detectable mai ales in eadrul unor programe de dimensiuni mari este vorba despre uilizarea metodelorpolimorfice in cadrul construtorilr. Deoarece obiecele nu sunt complet constuite in aceasta fazi a execujei unui program, ceea ce presupune ci idemificareatipuui obictelor respective este problematici, apelul polimorfc al unor metode poate erea un comportament imprevizibil i in cole mai mole situa, nedorit Potimortsmal presupuneexistenjaunei “fete” funcionaitatea comuna din clasa de bard) si a mai multor “forme” cate folosese aceasta faa (diferitele funcfonattg ale metodelor legate dinamic). Refine} cd polimorfsml apare doar atunc cind este vorba despre legareatirie a metodelor. Polimorfismul ofr o nou viziune asupra moduli de decuplare dine ees ce face o classi cum indeplinest ea acest huers, Polimorfismul realizeazéo decuplare la nivel 127

You might also like