1.1. Ce este Java? o insul din ndonezia (126 650 km, 65 mil. locuitori) un jargon american pentru cafea o platform i un limbaj de programare orientat pe obiecte Utilizarea nternetului ca mediu pentru difuzarea de informa[ii, dar i de programe, conduce la ideea de numitor comun, de platform comun pentru care s fie dezvoltate aplica[iile. Costurile implementrii de aplica[ii pot s scad spectaculos dac nu sunt necesare adaptri de solu[ii pentru fiecare tip sau versiune hardware sau de sistem de operare existent n lume. 1.2. Limbajul de programare Java Java este un limbaj de programare de nivel nalt, dezvoltat de JavaSoft, companie n cadrul firmei Sun Microsystems. Dintre caracteristicile principale ale limbajului amintim: simplitate Java este uor de nv[at, caracteristicile complicate (suprancrcarea operatorilor, motenirea multipl, abloane) ntlnite n alte limbaje de programare sunt eliminate. 1 robustee, elimin sursele frecvente de erori ce apar n programare prin eliminarea pointerilor, administrarea automat a memoriei i eliminarea fisurilor de memorie printr-o procedur de colectare a 'gunoiului' care ruleaz n fundal. Un program Java care a trecut de compilare are proprietatea c la execu[ia sa nu "crap sistemul". complet orientat pe obiecte - elimin complet stilul de programare procedural; se bazeaz pe ncapsulare, motenire, polimor!ism uurin" n ceea ce privete programarea n reea securitate, este cel mai sigur limbaj de programare disponibil n acest moment, asigurnd mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamic a codului pentru detectarea secven[elor periculoase, impunerea unor reguli stricte pentru rularea programelor lansate pe calculatoare aflate la distanta, etc este neutru din punct de vedere ar#itectural portabilitate, cu alte cuvinte Java este un limbaj independent de platforma de lucru, aceeai aplica[ie rulnd, fr nici o modificare, pe sisteme diferite cum ar fi Windows, UNX sau Macintosh, lucru care aduce economii substan[iale firmelor care dezvolt aplica[ii pentru nternet. Sloganul de baz este: ,$rite once, run an%&#ere compilat i interpretat asigur o per!orman" ridicat" a codului de octe[i con[ine o libr"rie de clase i inter!ee pentru domenii specifice cum ar fi programarea interfe[elor utilizator (JFC, AWT, Swing), programare distribuit (comunicare TCP'P, CORBA, RM etc.) permite programarea cu !ire de e(ecuie (multithreaded) dinamicitate este modelat dup" C i C)), trecerea de la C / C++ la Java fcndu-se foarte uor. face diferen[a ntre literele mici i mari (este case sensitive) permite de*voltarea aplicaiilor pentru Internet crearea unor documente Web mbunt[ite cu anima[ie i multimedia. Java Development Kit (JDK) este disponibil gratis 2 1.+. Java , un limbaj compilat i interpretat n func[ie de modul de execu[ie al programelor, limbajele de programare se mpart n dou categorii : interpretate, instruc[iunile sunt citite linie cu linie de un program numit interpretor i traduse n instruc[iuni main; avantaj: simplitate; dezavantaj: viteza de execu[ie redus; compilate, codul surs al programelor este transformat de compilator ntr-un cod ce poate fi executat direct de procesor; avantaj: execu[ie rapid; dezavantaj: lipsa portabilit[ii, codul compilat ntr-un format de nivel sczut nu poate fi rulat dect pe platforma pe care a fost compilat. Programele Java sunt att interpretate ct i compilate Codul de octe[i este diferit de codul main. Codul main este reprezentat de o succesiune de 0 i 1; codurile de octe[i sunt seturi de instruc[iuni care seamn cu codul scris n limbaj de asamblare. Codul main este executat direct de ctre procesor i poate fi folosit numai pe platforma pe care a fost creat; codul de octe[i este interpretat de mediul Java i de aceea poate fi rulat pe orice platform care folosete mediul de execu[ie Java. Fazele prin care trece un program Java sunt: Cod sursa Java -> (compilare) -> Cod de octeti -> (interpretare) 1.-. Istoria limbajului Java 1991: n cadrul companiei Sun Microsystems ncepe dezvoltarea unui proiect pentru aparatur electronic inteligent conectat n re[ea. 1992: ncepe dezvoltarea limbajului de programare Oak (James Gosling); 1993: devine disponibil primul browser WWW (World Wide Web) Mosaic; dezvoltarea unui web-browser (Webrunner), capabil s ncarce i s execute programe mici scrise n Oak; 3 1994: Oak este redenumit Java iar Webrunner HotJava 1995: Netscape (fondat de cei care au dezvoltat Mosaic-ul) decide s integreze Java n !etscape !avigator "#$ ianuarie 1996 : apare J%& '#$ (soft gratuit); februarie 1997: apare J%& '#'; martie 1997: apar (otJava '#$ i JavaO) '#$; 1998 Java Foundation Classes JVC released, incluznd Swing 1.0 dup 1999 apar versiuni noi ale JDK n prezent s-a ajuns la JDK1.4. 1... /ediul Java n acest curs se utilizeaz distribu[ia JDK 1.3 (Java Development Kit), produs de firma Sun. Exist dou posibilit[i de a lucra n Java: n linie de comand paii fiind indica[i mai jos, sau folosind un editor Java cum ar fi JCreator, Eclipse, etc. Realizarea unui program Java const n urmtorii pai: Editarea programului ntr-un editor de texte; Salvarea programului sub numele NumeClasa.java unde !ume*lasa este numele clasei care con[ine metoda main(). ntr-un program Java trebuie s existe o singur clas care s con[in o metod main(). Cu alte cuvinte, numele clasei trebuie s coincid cu numele fiierului. Extensia fiierului este #java Compilarea programului se face cu ajutorul comenzii javac NumeClasa.java Executarea programului se face cu ajutorul comenzii 4 java NumeClasa 1.0. Crearea unei aplicaii simple 1. )crierea codului surs+: class Salut { public static void main(String args[]) { Sstem.out.println(!Salut """!)# $ $ Toate aplica[iile Java con[in o clas principal n care trebuie s se gseasc metoda main(). Clasele aplica[iei se pot gsi fie ntr-un singur fiier, fie n mai multe. 2. )alvarea ,iierelor surs+ Se va face n fiiere cu extensia .java. Fiierul care con[ine codul surs al clasei principale trebuie s aib acelai nume cu clasa principal a aplica[iei (clasa care con[ine metoda main). Prin urmare, fiierul nostru o s-l salvm sub numele: Salut.java 3. *ompilarea aplica-iei Se folosete compilatorul Java, javac. Apelul compilatorului se face pentru fiierul ce con[ine clasa principal a aplica[iei. Compilatorul creeaz cte un fiier separat pentru fiecare clas a programului; acestea au extensia .class i sunt plasate n acelai director cu fiierele surs. Rezultatul comenzii javac Salut.java este fiierul Salut.class 4. .ularea aplica-iei Se face cu interpretorul java, apelat pentru unitatea de compilare corespunztoare clasei principale, fiind ns omis extensia .class asociat acesteia. java Salut Rularea unei aplica[ii care nu folosete interfa[ grafic, se va face ntr-o fereastr sistem. 5 1.1. Crearea unui applet Crearea structurii de fiiere i compilarea applet-urilor sunt identice ca n cazul aplica[iilor. Difer n schimb structura programului i modul de rulare al acestuia. 1. )crierea codului surs+: import java%.s&ing.'# import java.a&t.'# public class Salut e%tends J(pplet { public void paint()rap*ics g){ g.dra&String(!Salut!+,-+,-)# $ $ 2. )alvarea ,iierelor surs+ Salvarea se va face n fiierul Salut.java 3. *ompilarea applet/ului javac Salut.java n urma compilrii rezult fiierul Salut.class 4. .ularea applet/ului Applet-urile nu ruleaz independent. Ele pot fi rulate doar prin intermediul unui browser: nternet Explorer, Netscape sau printr-un program special cum ar fi appletviewer-ul din setul JDK. Crearea unui fiier HTML pentru miniaplica[ie (exemplu.html) <html> <head> <title>Primul Applet Java</title> </head> <body> <applet code=Salut.class width=400 height=400> </applet> </body> </html> 5. 0izualizarea applet/tlui appletvie&er e%emplu.*tml 6 2. 2rogramarea 3rientat" pe 3biecte i Java 2.1. 3biecte i clase Programarea Orientat pe Obiecte (OOP) este una dintre cele mai mari idei de programare aprut n anii 1990. deea central a OOP este: organizarea programelor astfel nct ele s reprezinte un ecou al modului n care lucrurile sunt puse mpreun n lumea real. 12emplu: Pentru cine nu s-a jucat niciodat cu Lego, acesta const n diferite buc[i de plastic, de diferite culori i dimensiuni. Ele sunt dotate cu crescturi i adncituri prin intermediul crora piesele pot fi conectate ntre ele. Cu diferite componente Lego se poate forma aproape orice: maini, oameni, castele, case, etc. n func[ie de imagina[ia fiecruia. Fiecare pies de Lego este un mic obiect care mpreun cu altele ajut la crearea altor obiecte mai mari. Exact aa stau lucrurile i n programarea orientat pe obiecte: obiecte mici puse mpreun formeaz obiecte mari. Programarea orientat pe obiecte este gndit dup modelul lumii reale obiectele sunt adesea formate din mai multe tipuri de obiecte mici. Cnd scriem programe ntr-un limbaj orientat pe obiecte, nu definim obiecte ci clase de obiecte, unde o clas" repre*int" un ablon pentru mai multe obiecte cu caracteristici similare. Clasele ntrupeaz toate caracteristicile unei mul[imi particulare de obiecte. De exemplu, ne putem gndi la clasa Copac care descrie 7 caracteristicile tuturor copacilor (au rdcini, trunchi i frunze, cresc, produc clorofil, i schimb frunzele, etc). Clasa Copac reprezint un model abstract pentru conceptul de copac pentru a planta un copac, a-l atinge, a-i rupe o frunz sau a-l tia avem nevoie de un copac concret, altfel spus de o instan-+ a copacului. Binen[eles c, odat ce avem clasa copac, putem crea oricte instan[e diferite ale copacului respectiv copaci concre[i. Acetia pot avea caracteristici diferite (unii sunt nal[i, al[ii pitici, unii i pierd frunzele toamna, al[ii nu, etc) O alt no[iune specific OOP este cea de obiect. Obiect sau instan-+ a clasei reprezint acelai lucru. Clasa este repre*entarea general" a unui obiect iar instana /obiectul este repre*entarea concret" a clasei. 2.2. 4tribute i comportamente Fiecare clas scris n Java are dou caracteristici de baz: atribute i comportament. 2.2.1. 4tribute 8 Atributele diferen[iaz obiectele ntre ele i determin aparen[a, starea sau alte calit[i ale obiectului n cauz. Dac ne gndim s crem o clas .a/in0+ ea ar trebui s includ urmtoarele atribute: culoare+ stil+ marc0. Atributele sunt definite n clase ca variabile. 5ipul i numele variabilelor sunt de!inite n clase i !iecare obiect are valori proprii pentru !iecare atribut. Deoarece fiecare instan[ a clasei poate avea valori diferite pentru variabilele sale, aceste variabile se mai numesc i variabile instan". 12emplu: O instan[ a clasei main, .a/ina.ea ar putea avea urmtoarele valori pentru atribute: culoare = alb stil = elegant marc0 = Mercedes Exist, de asemenea, i un alt tip de variabile numite variabile clas". Diferen[a dintre cele dou tipuri de variabile este aceea c valorile variabilelor instan[ sunt pstrate n instan[e i se schimb pentru fiecare instan[ iar valorile variabilelor clas sunt pstrate n clas i nu se schimb pentru fiecare instan[. Asupra diferen[ei dintre cele dou tipuri de variabile o s revin ntr-un capitol urmtor. 2.2.2. Comportament Comportamentul unei clase determin cum opereaz o instan[ a unei clase. De exemplu, cum reac[ioneaz un obiect atunci cnd un alt obiect sau o alt clas i cere s fac ceva. S revenim la clasa .a/in0. Comportamentul unei maini const n: porne/te+ opre/te+ 1r2nea30+ sc*imb0 vite3a+ sc*imb0 direc4ia, etc. Pentru a defini comportamentul unei clase se definesc metode, echivalentul func[iilor sau procedurilor din alte limbaje de programare. Spre diferen[ de alte limbaje de programare, n Java nu se pot defini func[ii n afara claselor. Prin urmare, metodele sunt !uncii de!inite n interiorul claselor care operea*" n instanele claselor respective. Metoda unui obiect poate fi apelat de ctre un alt obiect sau o alt clas. 9 Ca i n cazul atributelor, exist dou tipuri de metode: metode instan" i metode clas". Metodele instan[ opereaz doar n cadrul instan[ei unei clase. n schimb, metodele clas opereaz n interiorul clasei. 2.+. 2rincipiile 332 Obiectul este o variabil care are o structura i o stare. Fiecare obiect dispune de opera[ii prin intermediul crora i se poate manipula starea. Obiectul trebuie privit ca o unitate atomic pe care utilizatorul nu ar trebui s o disece. De exemplu, cnd lucrm cu numere ntregi, nu ne punem problema reprezentrii lor. Utilizatorul nu are acces direct la pr[ile constituente ale unui obiect sau la implementarea sa; acestea vor putea fi accesate doar prin intermediul metodelor care au fost furnizate mpreun cu obiectul. Gruparea datelor i a opera[iilor care pot fi efectuate asupra acestor date, avnd grij ca detaliile de implementare s fie ascunse, poarta numele de ncapsulare. Unul din principalele scopuri ale OOP este refolosirea codului. Limbajele de programare orientate pe obiecte furnizeaz mai multe mecanisme n acest scop. 1. 6olosirea codului generic dac implementarea este identic, i difer doar tipul de baz al obiectului, nu este necesar rescrierea complet a codului se scrie un cod generic care func[ioneaz pentru orice tip. De exemplu, se poate scrie o metod care s ordoneze un ir de numere ntregi, caractere, iruri de caractere. 2. /otenirea este un mecanism care permite extinderea func[ionalit[ii unei clase. Se pot crea noi tipuri de date care s extind (sau s restric[ioneze) propriet[ile tipului de date original. 3. 2olimor!ismul Un tip referin[ polimorfic poate s refere obiecte de mai multe tipuri. Atunci cnd se apeleaz o metod a tipului polimorfic, se va selecta automat metoda care corespunde tipului referit n acel moment. 10 +. 7lementele de ba*" ale limbajului de programare Java +.1. 8tructura le(ical" a limbajului +.1.1. 8etul de caractere Limbajului Java folosete setul de caractere Unicode. Este un standard interna[ional care nglobeaz setul de caractere ASC (permite reprezentarea a 256 de caractere). Folosete pentru reprezentarea caracterelor 2 octe[i, ceea ce nseamn c se pot reprezenta 65536 de semne. Primele 256 caractere Unicode corespund celor din ASC. Referirea la un caracter se face prin \uxxxx, unde xxxx reprezint codul caracterului. 12emple: 5u--6- - 5u--67 8 ci1re 9S:-;atin - - 7 5u-<<- - 5u-<<7 8 ci1re arabic-indic - - 7 5u=e-- - 5u7111 8 litere din al1abetul >an (C*ine3+ Japone3+ Coreean) +.1.2. Cuvinte c#eie Cuvintele rezervate n Java sunt cele din C++, cu cteva excep[ii. 11 +.1.+. Identi!icatori Sunt secven[e nelimitate de litere i cifre Unicode, ncepnd cu o liter. dentificatorii nu au voie s fie identici cu cuvintele rezervate. +.1.-. Constante Constantele pot fi de urmtoarele tipuri 1. constante ntregi Sunt acceptate 3 baze de numera[ie : baza 10, baza 16 (ncep cu caracterele 0x) i baza 8 (ncep cu cifra 0) i pot fi de dou tipuri: normale, (se reprezint pe 4 octe[i - 32 bi[i) lungi (8 octe[i - 64 bi[i): se termin cu caracterul L (sau l). 2. constante reale Pentru ca o constant s fie considerat real ea trebuie s aib cel pu[in o zecimal dup virgul, s fie n nota[ie exponen[ial sau s aib sufixul F sau f pentru valorile normale (reprezentate pe 32 bi[i), respectiv D sau d pentru valorile lungi (reprezentate pe 64 bi[i).
+. constante logice true : valoarea boolean de adevr ,alse : valoarea boolean de fals Observa-ie: spre deosebire de C++, constantele ntregi 1 i 0 nu mai au rolul de adevrat i fals. -. constante caracter O constant de tip caracter este utilizat pentru a exprima caracterele codului Unicode. Reprezentarea se face fie folosind o liter, fie o secven[ escape scris ntre apostrofuri. Secven[ele escape permit reprezentarea caracterelor care nu au reprezentare grafic i reprezentarea unor caractere speciale precum backslash, apostrof, etc. Secven[e escape predefinite n Java: Cod 8ecvena 7scape Caracter \u0008 '\b' Backspace(BS) \u0009 '\t' Tab orizontal (HT) 12 \u000a '\n' Linie nou - linefeed (LF) \u000c '\f' Pagin nou - formfeed (FF) \u000d '\r' nceput de rnd (CR) \u0022 '\"' Ghilimele \u0027 '\'' Apostrof \u005c '\\' Backslash \u0008 '\b' Backspace(BS) .. constante iruri de caractere Un ir de caractere este format din zero sau mai multe caractere cuprinse ntre ghilimele. Caracterele care formeaz irul de caractere pot fi caractere grafice sau secven[e escape. Dac irul este prea lung el poate fi scris ca o concatenare de subiruri de dimensiune mai mic. Concatenarea irurilor se face cu operatorul + (!(na ! ? ! are ! ? ! mere !). Sirul vid este "". Dup cum vom vedea, orice ir este de fapt, o instan[ a clasei String, definit n pachetul java.lang. +.1... 8eparatori Un separator este un caracter care indic sfritul unei unit[i lexicale i nceputul alteia. n Java separatorii sunt urmtorii: ( ) { } [ ] ; , . nstruc[iunile unui program se separ cu ;. +.1.0. 3peratori 1. operator de atribuire, = (semnul egal) 12emplu: a@7 (lui a i se atribuie valoarea 9) Operatorii de atribuire pot fi nln[ui[i. De exemplu: a@b@c@A- 2. operatori aritmetici binari, +, -, *, /, % 12emplu: s@a?b n Java exist forme prescurtate care cuprind operatorul de atribuire i un operator aritmetic binar. Operatorii prescurta[i sunt:+=, -=, *=, /=, %= 12emplu: n ?@ B este echivalent cu n@n?B 13 3. operatori aritmetici unari, +, -, ++ (operator de incrementare), -- (operator de decrementare). Operatorii de incrementare i decrementare pot fi prefixa[i (??% sau --%) sau postfixa[i (%?? sau %--). Diferen[a dintre operatorii prefixa[i i cei postfixa[i este semnificativ doar atunci cnd expresia de incrementare / decrementare apare n cadrul unei expresii. Exemplele urmtoare vor eviden[ia aceste lucruri. 12emple: a) -% reprezint opusul lui x b) int %@,+@C# %??# DD % primeste valoarea < --# DD primeste valoarea < c) int %@,+@C# ??%# DD % primeste valoarea < --# DD primeste valoarea < d) int %@,+# @%??# DD primeste valoarea ,+ % primeste valoarea < e) int %@,+# @%--# DD primeste valoarea ,+ % primeste valoarea = 1) int %@,+# @??%# DD % primeste valoarea <+ primeste valoarea < g) int %@,+# @--%# DD % primeste valoarea =+ primeste valoarea = Observa-ii: n exemplele b i c nu se observ nici o diferen[ ntre operatorii postfixa[i i cei prefixa[i deoarece ei nu sunt folosi[i n cadrul altor expresii. n exemplele d i ,, respectiv, e i g se observ c % primete aceeai valoare dar are valori diferite. n exemplele d i e sunt folosi[i operatorii postfixa[i de incrementare i decrementare care se comport astfel: valoarea variabilei asupra creia ac[ioneaz operatorul postfixat (n cazul nostru %) particip la evaluarea expresiei din care face parte ( primete valoarea lui %) dup care se aplic operatorul (valoarea lui % crete / scade cu o unitate). n exemplele , i g sunt folosi[i operatorii prefixa[i de incrementare i decrementare care se comport astfel: valoarea variabilei asupra creia ac[ioneaz operatorul postfixat (n cazul nostru %) i schimb valoarea (valoarea lui % crete / scade cu 14 o unitate), noua valoare participnd la evaluarea expresiei din care face parte ( primete noua valoare a lui %). 4. operatori logici, &&(and), ||(or), !(not) Observa-ie: evaluarea expresiilor logice se face prin scurtcircuitare (evaluarea se oprete n momentul n care valoarea de adevr a expresiei este sigur determinat) 5. operatori relaionali, <, <=, >, >=, ==, != 6. operatori pe bii, & (and), |(or), ^(xor), ~(not) 7. operatori de translaie, <<, >>, >>> (shift-are la dreapta fr semn) 8. operatorul condiional, ? : . Are forma: e%presieElogica F e%presieA 8 e%presieB Valoarea expresiei este dat de e%presieA dac e%presieElogic0 este true sau de e%presieB dac e%presieElogic0 este false. 12emplu: Metoda de calculul minimului a dou numere este: public int min (int a+ int b){ return aGbFa8b# $ 9. operatorul , (virgula) este folosit pentru evaluarea secven[ial a opera[iilor 12emplu: int %@-+ @A+ 3@B# (%@A+@a@A-+c@A) 10. operatorul ) pentru concatenarea irurilor: String s@!abcd! int %@A--# Sstem.out.println(s ? ! - ! ? %)# DDa1isea3a abcd-A-- 11. operatorul de conversie de tip (cast) este: (tip_de_data) int i @ B--# long l @ (long)i# DDconversie prin e%tensie long lB @ (long)B--# int iB @ (int)lB# DD conversie prin contractie 12emplu ': Fie programul public class :perator{ public static void main(String args[]){ int a@B+ b@6+c# c@a?b# 15 Sstem.out.println(a?! !?b?! !?c)# a??# --b# Sstem.out.println(a?! !?b?! !?c)# c@??a?b??# Sstem.out.println(a?! !?b?! !?c)# aD@B#b'@B# Sstem.out.println(a?! !?b?! !?c)# c@a-- ? --b# Sstem.out.println(a?! !?b?! !?c)# c@b@(a?@A)# Sstem.out.println(a?! !?b?! !?c)# $ $ Rezultatul afiat este: B 6 , 6 B , = 6 < B < < A , C B B B 12emplu ": Fie programul public class :p;ogic{ public static void main(String args[]){ bte a@-# Sstem.out.println(!Hrimul i1!)# i1 ((a"@-) II ((ADa)GA)) Sstem.out.println(!(mbele conditii sunt adevarate!)# else Sstem.out.println(!: conditie este 1alsa!)# Sstem.out.println(!(l doilea i1!)# i1 ((ADaGA) II (a"@-)) Sstem.out.println(!(mbele conditii sunt adevarate!)# else Sstem.out.println(!: conditie este 1alsa!)# $ $ Rezultatul afiat este: Hrimul i1 : conditie este 1alsa (l doilea i1 J%ception in t*read KmainK java.lang.(rit*meticJ%ception8 D b 3ero at :p;ogic.main(:p;ogic.java8AA) 16 Explica[ia se gsete n modul n care sunt evaluate expresiile logice (prin scurtcircuitare). n primul i1 se evalueaz expresia a"@- care are valoarea 1alse. ndiferent de rezultatul celei de-a doua expresii, rezultatul final va fi 1alse. Prin urmare, evaluarea ntregii expresii se oprete dup evaluarea lui a"@-, ceea ce urmeaz dup nu mai conteaz. n al doilea i1, evaluarea ncepe tot cu prima expresie, i anume ADaGA. Dar, ea nu poate fi evaluat deoarece ADa nu are sens (a fiind 0) i, este generat o excep[ie. Din nou, nu se ajunge la evaluarea celei de a doua expresii. +.1.1. Comentarii n Java exist trei feluri de comentarii: Comentarii pe o singur linie: ncep cu //. Comentarii pe mai multe linii, nchise ntre /* i */. Comentarii pe mai multe linii care formeaz documenta[ia, nchise ntre /** i **/. Textul dintre cele dou secven[e este automat mutat n documenta[ia aplica[iei de ctre generatorul automat de documenta[ie javadoc. Observa[ii: 1. nu pot fi scrise comentarii n interiorul altor comentarii. 2. nu pot fi introduse comentarii n interiorul constantelor caracter sau ir de caractere. 3. secven[ele /* i */ pot s apar pe aceeai linie cu secven[a // dar i pierd semnifica[ia; la fel se ntmpl cu secven[a // n comentarii care ncep cu /* sau /**. +.2. 5ipuri de date n Java tipurile de date se mpart n dou categorii: tipuri primitive de date tipuri re!erin". 17 Java pornete de la premiza c "orice este un obiect". Prin urmare, tipurile de date ar trebui s fie de fapt definite de clase i toate variabilele ar trebui s memoreze de fapt instan[e (obiecte) ale acestor clase. n principiu acest lucru este adevrat, ns, pentru uurin[a programrii, mai exist i aa numitele tipuri primitive de date, care sunt cele uzuale: 1. tipuri ntregi Tip de date Dimensiune n octe[i Domeniu Byte 1 -128 .. 127 Short 2 -32768 .. 32767 nt 4 -2147483648 .. 2147483647 Long 8 -2 63 .. 2 63 -1 2. tipuri reale Tip de date Dimensiune n octe[i Domeniu float 4 -10 46 .. 10 38 double 8 -10 324 .. 10 308 3. tipul caracter: char memorat pe 2 octe[i 4. tipul boolean: are dou valori true i false n alte limbaje formatul i dimensiunea tipurilor primitive de date folosite ntr-un program pot depinde de platforma pe care ruleaz programul. n Java acest lucru nu mai este valabil, Java fiind independent de platform. Vectorii, clasele i interfe[ele sunt tipuri re!erin". Valoarea unei variabile de acest tip este, spre diferen[ de tipurile primitive, o referin[ (adres de memorie) ctre valoarea sau mul[imea de valori reprezentat de variabila respectiv. Exist trei tipuri de date C care nu sunt suportate de limbajul Java: pointer, struct i union. Pointerii au fost elimina[i din cauza c erau o surs constant de erori, locul lor fiind luat de tipul referin[, iar struct i union nu i mai au rostul att timp ct tipurile compuse de date sunt formate n Java prin intermediul claselor. +.+. 9ariabile Variabilele pot avea ca tip fie un tip primitiv de dat, fie o referin[ la un obiect. :eclararea variabilelor se face prin: tipEdeEdate numeEvariabila 18 Iniiali*area variabilelor se face prin: numeEvariabila @ valoare Declararea i ini[ializarea variabilelor pot fi fcute n acelai moment: tipEdeEdate numeEvariabila @ valoare :eclararea constantelor se face prin: 1inal tipEdeEdate numeEvariabila 12emple: int a# a@,# 1inal double H9 @ 6.A=# int valoare @ A--# long numarJlemente @ AB6=,<CL;# String 1loare @ !1re3ie!# n func[ie de locul n care sunt declarate, variabilele se mpart n urmtoarele categorii: 1. 9ariabile membru, declarate n interiorul unei clase, vizibile pentru toate metodele clasei respective i pentru alte clase n func[ie de modificatorul lor de acces 2. 9ariabile locale, declarate ntr-o metod sau ntr-un bloc de cod, vizibile doar n metoda / blocul respectiv 3. 2arametrii metodelor, vizibili doar n metoda respectiv 4. 2arametrii de la tratarea e(cepiilor maginea urmtoare ilustreaz tipurile de variabile i parametrii mpreun cu domeniul lor de vizibilitate. 19 Observa-ie: Variabilele declarate ntr-un 1or, rmn locale corpului ciclului. De exemplu: 1or(int i@-# iGA--# i??) { $ int i# DDposibil Mn Java+ eroare Mn C?? +.-. Instruciuni +.-.1. Instruciunea vid" Este format din #. +.-.2. Instruciuni de deci*ie 1. Instruciunea ifelse are forma: if (e%presieElogic0) 20 { ... declararea variabilelor membru public void Metoda (parametrii metodei) { ; ; } declararea variabilelor locale ; catch (parametrii de la tratarea e(cepiilor) { ; } ; } public class Nume_Clasa instruc4iuniA else instruc4iuniB instruc4iuni Dac e2presie3logic+ are valoarea true atunci se execut instruc-iuni', altfel se execut instruc-iuni". 12presie3logic+ este obligatoriu s fie cuprins ntre paranteze. Dac pe una din ramuri sunt mai multe instruc[iuni ele trebuie s fie cuprinse ntre acolade <.=. Ramura else instruc4iuniB poate s lipseasc. 12emplu 4: S se calculeze maximul a dou numere. A. public class .a%im B. { public static void main(String args[]) 6. {int a@AB+ b@,+m# =. i1 (a>b) ,. m@a# <. else C. m@b# L. Sstem.out.println(!.a%imul dintre !?a?! si !?b?! este8 !?m)# 7. $ A-. $ 12emplu 5: S se rezolve ecua[ia de gradul a%?b@- cunoscnd coeficien[ii a i b. A. public class ec)r9 B. { public static void main(String args[]) 6. {int a@AB+ b@,# =. Sstem.out.print(!Jcuatia8 !?a?!%?!?b?!@-!)# ,. i1 (a@@-) <. i1 (b@@-) C. Sstem.out.println(! are o in1initate de solutii!)# L. else 7. Sstem.out.println(! nu are solutii!)# A-. else { double % @-(double)bDa# AA. Sstem.out.println(! are solutia !?%)# AA. $ AB. $ 13. } n e2emplu 5 au fost folosite i1-uri imbricate. Pe linia 10 a fost folosit operatorul de conversie pentru ca rezultatul mpr[irii s se fie numr real. Dac 21 acest operator nu ar fi fost folosit, mpr[irea ar fi fost efectuat ntre doi operanzi ntregi i, prin urmare, rezultatul ar fi fost numr ntreg. 2. Instruciunea switch are forma: s&itc* (e%presieEselectare){ case valEA8 instruc4iuneEA# breaN# case valEB8 instruc4iuneEB# breaN# . . . case valEi8 instruc4iuneEi# breaN# . . . case valEn8 instruc4iuneEn# breaN# de1ault8 instruc4iune# $ nstruc[iunea s&itc* selecteaz dintre mai multe secven[e de cod una care va fi executat. Se evalueaz e%presieEselectare; rezultatul ob[inut se compar pe rnd cu valEA, valEB, ..., valEn. Dac se ntlnete o valoare valEi pentru care se ob[ine egalitate (e%presieEselectare @ valEi ) se execut instruc[iunile instruc4iuneEi. Altfel, (dac nu are loc nici o egalitate) se execut instruc[iunile de pe ramura de1ault. nstruc[iune breaN ntlnit pe fiecare ramur are rolul de a ntrerupe execu[ia instruc[iunii s&itc* dup ce au fost executate instruc[iunile aferente ramurii alese. Dac instruc[iunea breaN lipsete atunci se execut i instruc[iunile de pe urmtoarele ramuri pn la ntlnirea primului breaN. 12emplu 6: Se citete de la tastatur un caracter reprezentnd un operator: '+', '', '*' sau '/'. n func[ie de operatorul citit s se fac suma, diferen[a, nmul[irea sau mpr[irea celor dou numere a i b. A. public class :peratii{ B. public static void main(String args[]){ 6. double a@AB+ b@,+ r@-# =. c*ar oper@O O# ,. tr{ <. Sstem.out.println(!9ntroduceti operatorul!)# C. oper@(c*ar)Sstem.in.read()# L. $ 7. catc*(J%ception e){$ A-. s&itc* (oper) { AA. case O?O8 AB. r@a?b# breaN# A6. case O-O8 A=. r@a-b# breaN# 22 A,. case O'O8 A<. r@a'b# breaN# AC. case ODO8 AL. r@aDb# breaN# A7. de1ault8 B-. Sstem.out.println(!:perator invalid!)# BA. Sstem.e%it(A)# BB. $ B6. Sstem.out.println(a?! !?oper?! !?b?! @ !?r)# B=. $ B,. $ n linia 7 se citete un caracter de la tastatur memorat n oper i, n func[ie de el se execut instruc[iunile de pe liniile 12, 14, 16, 18 sau 20-21. nstruc[iunile de pe liniile 20-21 se execut doar n cazul n care nu a fost introdus un operator corect. 12emplu 7: S se spun dac un numr dat mai mic dect 10 este par sau impar. A. public class Har9mpar{ B. public static void main(String args[]){ 6. int %@B# =. s&itc* (%) { ,. case -8 <. case B8 C. case =8 L. case <8 7. case L8 A-. Sstem.out.println(%?! este numar par!)#breaN# AA. de1ault8 AB. Sstem.out.println(%?! este numar impar!)# A6. $ A=. $ A,. $ n exemplul precedent ne intereseaz ca aceeai instruc[iune, cea din linia 9 s fie executat pentru mai multe potriviri. n acest caz, sunt folosite mai multe linii de case fr nici un rezultat, instruc[iunea s&itc* executnd prima instruc[iune ntlnit dup gsirea potrivirii. Prin urmare, instruc[iunea breaN nu apare pe nici una din liniile 5, 6, 7,8. +.-.+. Instruciuni repetitive 23 1. Instruciunea for repet un bloc de instruc[iuni ct timp o condi[ie este adevrat. n general, se cunoate de la nceput de cte ori urmeaz s se execute blocul de instruc[iuni. Are forma general: 1or (ini4iali3are# test# incrementare) instruc4iuni unde: ini4iali3are este o expresie care ini[ializeaz variabila de control a instruc[iunii 1or test este o expresie boolean evaluat naintea fiecrei reluri a buclei; ct timp valoarea ei este true blocul de instruc[iuni se execut. Cnd valoarea ei este 1alse, se prsete instruc[iunea 1or. incrementare este o expresie care modific variabila de control a instruc[iunii 1or. Oricare dintre cele trei pr[i constituente ale instruc[iunii 1or poate s lipseasc. 1or ( # # ) n acest caz se ob[ine o bucl infinit. Pentru a evita acest lucru este necesar ca n cadrul blocului de instruc[iuni s existe o condi[ie de oprire. De asemenea, blocul de instruc[iuni poate s lipseasc, el fiind nlocuit de instruc[iunea vid. Exemplul 8 de mai jos ilustreaz aceast situa[ie. 12emplu 8: S se calculeze n9 unde n este ini[ializat n program. B. public class Pactorial{ 6. public static void main(String args[]){ =. long 1@A# ,. int n@A,# <. 1or(int i@B# iG@n# i??) C. 1'@i# DD1@1'i# L. Sstem.out.println(n?!"@!?1)# 7. $ A-. $ 12emplu :: S se calculeze n9 unde n este ini[ializat n program. A. public class Pactorial{ B. public static void main(String args[]){ 6. long 1@A# =. int n@A,# ,. 1or(int i@B# iG@n# 1'@i+ i??) 24 <. # C. Sstem.out.println(n?!"@!?1)# L. $ 7. $ Dup cum se poate remarca, pe linia 6 este folosit instruc[iunea vid deoarece codul 1'@i a fost mutat n cadrul pr[ii de incrementare. O alt observa[ie ar fi c, oricare dintre pr[ile constituente ale instruc[iunii 1or poate fi format din mai multe instruc[iuni. Acest lucru este ilustrat n programul urmtor. 12emplu ;: A. public class Pactorial{ B. public static void main(String args[]){ 6. long 1+ ;imSup# =. int n@A-+i# ,. ;imSup@(long).at*.po&(B+<6)# <. 1or(i@B+1@A# iG@n II 1G@;imSupDi# 1'@i+i??) C. # L. i1 (i@@n?A) 7. Sstem.out.println(n?!"@!?1)# A-. else AA. Sstem.out.println(n?!"@este prea mare pentru puterile mele!)# AB. $ A6. $ n linia 5 este calculat numrul maxim reprezentabil, de tip long. n 1or, ini[ializm dou variabile i@B+1@A. Qest-ul este format din dou condi[ii unite prin II. 9ncrementarea este, de asemenea, format din dou instruc[iuni 1'@i+i??. 11. Instruciunea while are forma: &*ile (condi4ie) instruc4iuni nstruc[iunea &*ile este folosit pentru a repeta execu[ia unui grup de instruc[iuni atta timp ct condi4ie are valoare true. 12emplu '$: S se calculeze suma cifrelor unui numr. A. public class SumCi1Nr{ B. public static void main(String args[]){ 6. long %@AB6=,+%9nit@%# 25 =. int s@-# ,. &*ile(%>-){ <. s?@%RA-# C. %D@A-# L. $ 7. Sstem.out.println(!Suma ci1relor numarului !?%9nit?! este8 !?s)# A-. $ AA. $ nstruc[iunea while se mai numete i instruc[iune cu test ini[ial. Dac la prima evaluarea a condi4iei aceasta are valoarea 1alse instruc[iunile din corpul &*ile-ului nu se execut niciodat. n exemplul precedent, dac ini[ializm % cu -, condi[ia %>- este fals i se continu cu instruc[iunea din linia 9. 12. Instruciunea do-while are forma: do{ instruc4iuni $&*ile (condi4ie)# Ca i &*ile, instruc[iunea do-&*ile este folosit pentru a repeta execu[ia unui grup de instruc[iuni atta timp ct condi4ie are valoare true. Diferen[a dintre cele dou instruc[iuni este c, dac la &*ile se executau instruc[iunile doar dac condi4ie era adevrat, n cazul lui do-&*ile blocul de instruc[iuni se execut cel pu[in o dat dup care se verific valoarea condi[iei. nstruc[iunea do-while se mai numete i instruc[iune cu test final. 12emplu '': S se calculeze cel mai mare divizor comun a dou numere a i b. A. public class Cmmdc{ B. public static void main(String args[]){ 6. long a@,=+b@<L+r# =. Sstem.out.print(!Cmmdc-ul numerelor !?a?! si !?b?! este8 !)# ,. do{ <. r@aRb# C. a@b# L. b@r# 7. $&*ile(r>-)# A-. Sstem.out.println(a)# AA. $ AB. $ 26 13. Instruciunea break breaN Este folosit pentru prsirea for[at a corpurilor instruc[iunilor repetitive (1or+ &*ile+ do-&*ile). 12emplu '": S se caute un numr cuprins n intervalul <ab=. A. public class J%SreaN{ B. public static void main(String args[]){ 6. int a@A-+ b@B-+ %# =. &*ile(true){ ,. %@(int)(.at*.random()'b)# <. i1 ( (aG@%) II (%G@b) ) C. breaN# L. $ 7. Sstem.out.println(%)# A-. $ AA. $ n linia 5 se genereaz aleator un numr ntreg mai mic dect b. Dac numrul este cuprins n intervalul <ab= se prsete instruc[iunea &*ile. Dac instruc[iunea break este plasat n cadrul mai multor instruc[iuni repetitive imbricate, ea are ca efect prsirea doar a instruc[iuni care o con[ine. 12emplu: A. 1or(...){ B. ... 6. 1or(...){ =. ... ,. breaN# <. ... C. $ L. ... 7. $ Efectul instruc[iunii breaN este prsirea 1or-ului din linia 3, execu[ia continundu-se cu instruc[iunile de pe linia 8. 14. Instruciunea continue Are ca efect ntreruperea execu[iei itera[iei curente i trecerea la itera[ia urmtoare. 27 12emplu '4: Urmtorul cod afieaz toate caracterele citite cu excep[ia cifrelor de la 0 la 9. A. public class J%Continue{ B. public static void main(String args[]){ 6. 1or(int i@-# iG@A-# i??){ =. c*ar c@O O# ,. tr{ <. c@(c*ar)Sstem.in.read()# C. $ L. catc*(J%ception e){$ 7. i1 ( (O-OG@c) II (cG@O7O) ) A-. continue# AA. Sstem.out.print(c?! !)# AB. $ A6. $ A=. $ n cazul n care se citete o cifr, se execut instruc[iunea continue de pe linia 10, nu se mai execut linia 11 i se sare direct la linia 3. Observa-ie: nstruc[iunile breaN i continue pot s apar doar n cadrul unor instruc[iuni repetitive. Excep[ie face instruc[iunea breaN care poate s apar i n cadrul instruc[iunii s&itc*. +... 5ablouri >vectori? +...1. 5ablouri >vectori? unidimensionale :eclararea unui vector se face prin TipElement[] numeVector; sau TipElement numeVector[]; unde QipJlement reprezint tipul elementelor vectorului, iar parantezele [] aezate fie naintea fie dup numele vectorului arat c este vorba despre un vector. 12emple: int[] v# String adrese[]# 28 Instanierea unui vector se realizeaz cu operatorul ne& i are ca efect alocarea memoriei necesare pentru memorarea elementelor vectorului, mai precis specificarea numrului maxim de elemente pe care l va avea vectorul. nstan[ierea unui vector se face astfel: numeVector = new TipElement[dimensiune]; 12emple: v @ ne& int[A-]# //se aloc spa[iu pentru 10 ntregi adrese @ ne& String[A--]# //se aloc spa[iu pentru 100 de String-uri Declararea i instan[ierea unui vector pot fi fcute simultan astfel: TipElement[] numeVector = new TipElement[dimensiune]; 12emple8 int [] v @ ne& int[A-]# Dup declararea unui vector, acesta poate fi ini[ializat, adic elementele sale pot primi valori. n acest caz instan[ierea lipsete, alocarea memoriei fcndu-se automat n func[ie de numrul de elemente cu care se ini[ializeaz vectorul. 12emple: String culori[] @ {!Tosu!+ !)alben!+ !Uerde!$# int []v @ {B+ =+ <+ L+ A-+ AB$# Observa-ii: Primul indice al unui vector este 0, deci pozi[iile unui vector cu n elemente vor fi cuprinse ntre 0 i n-1. Nu sunt permise construc[ii de genul: TipElement numeVector[dimensiune] alocarea memoriei fcndu-se doar prin intermediul operatorului ne& sau prin ini[ializare. 12emple: int v[A-]# //incorect int v[] @ ne& int[A-]# //corect 29 4ccesul la elementul unui vector se face prin: numeVector[indice] 12emplu ': int v[]@ne& int[A-]# 1or(i@-# iGA-# i??) v[i]@i# 12emplu ": int v[]@{A+B+6+=+,$# 1or(i@-# iG,# i??) Sstem.out.println(v[i]?K V)# +...2. 5ablouri >vectori? cu mai multe dimensiuni n Java tablourile cu mai multe dimensiuni sunt de fapt vectori de vectori. Prin urmare, declararea, instan[ierea i ini[ializarea se fac la fel ca n cazul vectorilor unidimensionali. TipElement numeVector[][] = new TipElement[dim!][dim"] sau TipElement[][] numeVector = new[dim!][dim"] TipElement sau parantezele pot fi de o parte i de alta a lui numeUector. 12emplu: int m[][]# DDdeclararea unei matrice m @ ne& int[,][A-]# DDcu , linii+ A- coloane Observa-ie: m[-]+ m[A]+ ...+ m[=] sunt vectori de ntregi cu 10 elemente +...+. :imensiunea unui vector Cu ajutorul cuvntului cheie len#th se poate afla dimensiunea unui vector. 12emple: Fie vectorul int []a @ ne& int[,]# atunci a.lengt* are valoarea 5. Fie matricea int m @ ne& int[,][A-]# 30 atunci: m.lengt* are valoarea 5 i reprezint numrul de linii al matricei m[-].lengt* are valoarea 10 i reprezint numrul de elemente al primei linii a matricei, m[A].lengt* are valoarea 10 i reprezint numrul de elemente al celei de-a doua linii a matricei, etc. 12emplu '5: S se calculeze minimul elementelor unui vector. A. public class .inUect{ B. public static void main(String args[]){ 6. int a[]@{B+A+=+C+6$# =. int min@a[-]# ,. 1or(int i@-# iGa.lengt*# i??) <. i1 (min>a[i]) C. min@a[i]# L. Sstem.out.println(!.inimul este !?min)# 7. $ A-. $ 12emplu '6: S se ordoneze elementele de pe diagonala principal a unei matrice. A. public class :rdWiagHrinc{ B. public static void main(String args[]){ 6. int a[][]@{{B+A+=+C$+{6+,+A+L$+{B+,+A+7$+{6+B+,+L$$# =. boolean ordonat# ,. 1or(int i@-# iGa.lengt*# i??){ <. 1or(int j@-# jGa[i].lengt*# j??) C. Sstem.out.print(a[i][j]?! !)# L. Sstem.out.println(!!)# 7. $ A-. do{ AA. ordonat@true# AB. 1or(int i@-# iGa.lengt*-A# i??) A6. i1 (a[i][i]>a[i?A][i?A]){ A=. int au%@a[i][i]# A,. a[i][i]@a[i?A][i?A]# A<. a[i?A][i?A]@au%# AC. ordonat@1alse# AL. $ A7. $&*ile("ordonat)# B-. Sstem.out.println(!.atricea cu diagonala ordonata8!)# BA. 1or(int i@-# iGa.lengt*# i??){ BB. 1or(int j@-# jGa[i].lengt*# j??) B6. Sstem.out.print(a[i][j]?! !)# B=. Sstem.out.println(!!)# B,. $ 31 B<. $ BC. $ +...-. 5ablouri cu dimensiuni variabile Java permite folosirea tablourilor cu dimensiuni variabile adic, a vectorilor de vectori cu dimensiuni variabile. 12emplu '7: S se genereze i s se afieze triunghiul lui Pascal. A. public class QrHascal{ B. public static void main(String args[]){ 6. int []a[]@ne& int[A-][]# =. a[-]@ne& int[A]# ,. a[A]@ne& int[B]# <. a[-][-]@a[A][-]@a[A][A]@A# C. 1or(int i@B# iGa.lengt*# i??){ L. a[i]@ne& int[i?A]# 7. a[i][-]@a[i][i]@A# A-. 1or(int j@A# jGa[i].lengt*-A# j??) AA. a[i][j]@a[i-A][j-A]?a[i-A][j]# AB. $ A6. 1or(int i@-# iGa.lengt*# i??){ A=. 1or(int j@-# jGa[i].lengt*# j??) A,. Sstem.out.print(a[i][j]?! !)# A<. Sstem.out.println(!!)# AC. $ AL. $ A7. $ n linia 8 se observ c, pentru fiecare linie a matricei se aloc memorie pentru un numr variabil de elemente: pe linia 0 va fi memorat un element, pe linia 1 vor fi memorate dou elemente, etc. +.0. @iruri de caractere n Java, un ir de caractere poate fi reprezentat printr-un vector format din elemente de tip c*ar, un obiect de tip String sau un obiect de tip StringSu11er. 12emple echivalente de declarare a unui ir: String str @ !abc!# c*ar data[] @ {OaO+ ObO+ OcO$# String str @ ne& String(data)# String str @ ne& String(!abc!)# 32 Concatenarea irurilor de caractere se face prin intermediul operatorului ). String strA @ !abc! ? !%3!# String strB @ !AB6!# String str6 @ strA ? strB# n Java, operatorul de concatenare ) este extrem de flexibil n sensul c permite concatenarea irurilor cu obiecte de orice tip care au o reprezentare de tip ir de caractere. 12emplu: Sstem.out.print(!Uectorul v are! ? v.lengt* ? ! elemente!)# 33 -. Clase i obiecte n Java -.1. Ae!erine Dup cum am artat n capitolul 2, o clas este un ablon pentru mai multe obiecte cu caracteristici asemntoare. Un obiect este o colec[ie de variabile (atribute) i metode asociate descrise n clas. Clasa poate fi asemnat cu un tip de date iar obiectul cu o variabil. Dac se declar o variabil folosind numele unei clase ca i tip, aceast variabil con[ine o re!erin" ctre un obiect al clasei respective. Cu alte cuvinte, variabila nu va con[ine obiectul actual ci o referin[ ctre un obiect / o instan[ a clasei. Deoarece folosind numele unei clase ca i tip se declar o referin[ ctre un obiect, aceste tipuri poart numele de tipuri re!erin". Se disting dou caracteristici principale ale obiectelor n Java: obiectele sunt ntotdeauna alocate dinamic. Durata de via[ a unui obiect este determinat de logica programului. Ea ncepe atunci cnd obiectul este creat i se termin n momentul n care obiectul nu mai este folosit, el fiind distrus de un mecanism de cur[enie oferit de limbajul Java garbage collector (colectorul de gunoaie). obiectele nu sunt con[inute de ctre variabile. O variabil pstreaz o referin[ ctre un obiect. o referin[ este similar cu ceea ce se numete pointer n alte limbaje de programare cum ar fi C++. Dac exist dou variabile de acelai tip referin[ i o variabil este atribuit celeilalte, ambele vor referi acelai obiect. Dac informa[ia din obiect se modific, schimbarea este vizibil n ambele variabile. O variabil referin[ poate con[ine i o referin[ ctre nimic. Valoarea unei asemenea variabile referin[ este null. n Java nu se permite tipurilor referin[ s fie convertite ctre tipuri primitive sau invers. 34 n capitolul 2 am vzut cum se poate lucra cu tablouri (iruri) fr s ne punem problema cu ce tip de date lucrm primitiv sau referin[. n Java, irurile nu sunt tipuri primitive ci referin[. Ele se comport ca nite obiecte. -.2. 3biecte -.2.1. Boiuni generale n Java obiectele sunt create prin instan[ierea unei clase, cu alte cuvinte prin crearea unei instan[e a unei clase. :eclararea obiectului se face prin: NumeClasa nume:biect# Exemplu: String s# Comple% c# n urma declarrii, variabila este ini[ializat cu null. Crearea obiectului echivalent cu instan[ierea clasei se realizeaz prin intermediul operatorului new i presupune alocarea spa[iului de memorie necesar pstrrii obiectului. Adresa (referin[a) ctre obiectul respectiv o s fie memorat n variabila nume:biect. nume:biect @ ne& NumeClasa()# Exemplu: s@ne& String() # Comple% c@ne& Comple%(B+6)# Declararea i crearea obiectului pot fi fcute pe aceeai linie. Exemplu: String s@ne& String() # Comple% c@ne& Comple%(B+6)# n momentul n care se realizeaz crearea obiectului are loc i ini[ializarea lui. 4tenie Spa[iul de memorie nu este alocat n momentul declarrii obiectului. 12emplu: 35 Comple% c# c.re @ A-# DDJT:(TJ" Alocarea memoriei se face doar la apelul instruc[iunii new ! Ae!erirea valorii unei variabile se face prin obiect$%ariabila 12emplu: Comple% c @ ne& Comple%()# c.re @ B# c.im @ 6# Sstem.out.println(!Te@! ?c.re? ! 9m@!?c.im)# Observa-ie: Accesul la variabilele unui obiect se face n conformitate cu drepturile de acces pe care le ofer variabilele respective celorlalte clase. 4pelul unei metode se face prin obiect$metoda([parametri]) 12emplu: Comple% c @ ne& Comple%()# c.setTe(B)# c.set9m(6)# n Java programatorul nu mai are responsabilitatea distrugerii obiectelor sale ntruct, n momentul rulrii unui program, simultan cu interpretorul Java ruleaz i un proces care se ocup de distrugerea obiectelor care nu mai sunt folosite. Acest proces pus la dispozi[ie de platforma Java de lucru se numete garbage collector (colector de gunoaie). Un obiect este eliminat din memorie de procesul de colectare atunci cnd nu mai exista nici o referin[ la acesta. Referin[ele (care sun de fapt variabile) sunt distruse: natural, atunci cnd variabila respectiv nu mai este folosit (de exemplu, la terminarea unei metode) e2plicit, dac atribuim variabilei respective valoare null. -.2.2. 3peratorul de atribuire C n cazul n care operatorul = este folosit mpreun cu date de tip primitiv, are loc o atribuire de valori. 12emplu: 36 int % @ AB+ @ A-# % @ # Valoarea lui x se schimb, primind valoarea lui y. n cazul n care operatorul = este folosit mpreun cu date de tip referin[, are loc tot o atribuire de valori. Atta doar c valorile sunt n acest caz adrese. 12emplu: A. class Nimic{ B. int %# 6. $ =. class Qest{ ,. public static void main(String args[]){ <. Nimic aA@ne& Nimic()+aB# C. aA.%@A-# L. a"=a!; 7. Sstem.out.println(aA.%?! !?aB.%)# A-. aA.%@,# AA. Sstem.out.println(aA.%?! !?aB.%)# AB. $ A6. $ n linia 7 se modific valoarea atributului % a obiectului aA. n linia 8 con[inutul variabilei aA se copiaz n aB. Se afieaz 10 10. Se schimb valoarea atributului lui aA i, ne-am atepta s se afieze 5 10 dar se afieaz 5 5. Nu este greit! n linia 8 se copiaz valoarea lui aA adic referin[a ctre obiect n aB. Din acest moment exist un singur obiect ctre care refer att aA ct i aB. Orice modificare are loc asupra obiectului, ea este vzut i de aA i de aB. 12emplu: public class Qest{ public static void main(String args[]){ int[] aA@{A+B+6+=+,$# int[] aB# aB@aA# 1or(int i@-# iGaA.lengt*# i??) aB[i]??# 1or(int i@-# iGaA.lengt*# i??) Sstem.out.print(aA[i]?! !)# Sstem.out.println(!!)# 1or(int i@-# iGaB.lengt*# i??) Sstem.out.print(aB[i]?! !)# $ $ 37 Rezultatul este: 2 3 4 5 6 2 3 4 5 6 -.2.+. 3peratorul de egalitate CC n cazul n care operatorul == este folosit mpreun cu date de tip primitiv, are loc o testare a egalit[ii valorilor celor dou variabile. 12emplu: int % @ AB+ @ A-+ 3 @ AB# % @@ are valoarea false; % i au valori diferite % @@ 3 are valoarea true; % i 3 au valori egale n cazul n care operatorul = este folosit mpreun cu date de tip referin[, se verific dac cele dou variabile refer acelai obiect. 12emplu: A. class Nimic{ B. int %# 6. Nimic(int %){ =. t*is.%@%# ,. $ <. $ C. class Qest{ L. public static void main(String args[]){ 7. Nimic aA@ne& Nimic(A)+aB@ne& Nimic(A)# A-. i1(aA@@aB) AA. Sstem.out.println(!Sunt egale!)# AB. else A6. Sstem.out.println(!Nu sunt egale!)# A=. aB@aA# A,. i1(aA@@aB) A<. Sstem.out.println(!Sunt egale!)# AC. else AL. Sstem.out.println(!Nu sunt egale!)# A7. $ B-. $ n linia 9 se creeaz dou obiecte cu aceeai valoare. Totui testul din linia 10 are ca rezultat valoarea 1alse. Dup linia 14 cele dou variabile refer acelai obiect i, prin urmare, testul din linia 15 are ca rezultat valoarea true. 38 -.+. Clase -.+.1. :e!inirea claselor [public][abstract][1inal] class &ume'lasa [e%tends NumeSuperclasa] [implements 9nter1ataA [+ 9nter1ataB ... ]] { DDcorpul clasei $ 4ntetul clasei: [public][abstract][1inal] class &ume'lasa este format din modi!icatorii clasei, cuvntul rezervat class i numele clasei NumeClasa. Prezen[a parantezelor [] indic faptul c ceea ce este cuprins ntre ele este op[ional. /odi!icatorii clasei sunt: public( dac o clas este declarat public, ea este accesibil oricrei alte clase. Dac modificatorul public nu apare, clasa poate fi accesat doar de ctre clasele din pachetul cruia apar[ine clasa (dac nu se specific un anume pachet, toate clasele din directorul curent sunt considerate a fi n acelai pachet). Spa[iul de cutare este definit de variabila sistem CLASSPATH. abstract( o clas declarat abstract este o clas ablon adic ea este folosit doar pentru a crea un model comun pentru o serie de subclase. O clas trebuie declarat abstract daca ea este incomplet implementat adic nu toate metodele ei sunt definite. O astfel de clas nu poate !i instaniat", dar poate fi extins de alte clase care s implementeze metodele nedefinite. Doar clasele abstracte pot s con[in metode abstracte (metode declarate dar nu implementate). final o clas poate fi declarat final dac a fost complet definit i nu se dorete s fie extins (s aib subclase); cu alte cuvinte ea nu poate apare n clauza extends a altei clase. 39 Observa-ie: O clas declarat att abstract ct i final genereaz eroare. Dac clasa este abstract nseamn c ea con[ine metode neimplementate i, prin urmare trebuie extins de o alt clas care s le implementeze. Dar, dac ar fi i final, nu ar putea fi extins. Dup numele clasei se pot specifica, dac este cazul, clasele motenite i interfe[ele implementate. O clas poate moteni o singur clas, prin urmare dac apare clauza e%tends ea este urmat doar de numele unei clase. ns, o clas poate implementa mai multe interfe[e, ale cror nume apar dup clauza implements i trebuie separate prin virgul. Asupra motenirii i interfe[elor se gsesc mai multe detalii n subcapitolele ,Motenire respectiv ,nterfe[e. Corpul unei clase urmeaz dup antetul clasei i este cuprins ntre acolade. Con[ine: declararea variabilelor instan[ i clas care mpreun formeaz variabilele membru; definirea metodelor instan[ i clas care mpreun formeaz metodele membru. Observa-ie: variabilele unei clase pot avea acelai nume cu metodele clasei. -.+.2. 9ariabile membru Variabilele se declar de obicei naintea metodelor, dei acest lucru nu este impus de compilator. class NumeClasa { DDdeclararea variabilelor DDdeclararea metodelor $ Variabilele unei clase sunt doar cele care sunt declarate n corpul clasei i nu n corpul unei metode. Variabilele declarate n cadrul unei metode sunt locale metodei respective. Declararea unei variabile presupune specificarea urmtoarelor lucruri: numele variabilei; tipul de date; nivelul de acces la acea variabil de ctre alte clase; 40 dac este constant sau nu; tipul variabilei: instan[ sau clas Tiparul declarrii unei variabile este: [modificatori] Tip)e)ate numeVariabila [ = %aloare*nitiala ] ; unde un modificator poate fi : un specificator de acces: public+ protected+ private# unul din cuvintele rezervate: static+ 1inal+ transient+ volatile. 12emple: double %# protected static int n# public String s @ !abcd!# private Hoint p @ ne& Hoint(A-+ A-)# 1inal long .(X @ A-----;# Detalii despre modificatorii de acces se gsesc n subcapitolul ,Modificatori de acces pentru membrii unei clase. Cuvintele rezervate: static+ 1inal+ transient+ volatile au urmtoarele roluri: static este folosit pentru declararea variabilelor clas. 12emplu: int % # //variabil instan[ static int nrWe:biecteCreate# //variabil clas final este folosit pentru declararea constantelor. O constant este o variabil a crei valoare nu mai poate fi schimbat. Valoarea unei variabile finale nu trebuie specificat neaprat la declararea ei, ci poate fi specificat i ulterior, dup care ea nu va mai putea fi modificat. 12emplu: se declar i se ini[ializeaz o variabil final (linia 1). Valoarea ei nu mai poate fi modificat (linia 3). A. 1inal double H9 @ 6.A= # B. ... 6. H9 @ 6.A=A DD eroare la compilare 12emplu: se declar o variabil final (linia 2). n linia 4 se ini[ializeaz iar n linia 5 se dorete modificarea valorii ei. A. class Qest { B. 1inal int .(X# 6. Qest() { 41 =. .(X @ A--# DD legal ,. .(X @ B--# DD ilegal -> eroare la compilare <. $ C. $ transient este folosit la serializarea obiectelor, pentru a specifica ce variabile membru ale unui obiect nu participa la serializare. %olatile este folosit pentru a semnala compilatorului s nu execute anumite optimizri asupra membrilor unei clase. Este o facilitate avansat a limbajului Java. -.+.+. /etode 4.3.3.1 Definirea metodelor Metodele sunt folosite pentru descrierea comportamentului unui obiect. O metod se declar astfel: [modi1icatori] QipTeturnat nume.etoda ([argumente]) [t*ro&s QipJ%ceptie] { DDcorpul metodei $ 4.3.3.2 Modificatorii metodelor Un modificator poate fi : un specificator de acces: public+ protected+ private# unul din cuvintele rezervate: static+ abstract+ 1inal+ native+ snc*roni3ed. Detalii despre modificatorii de acces se gsesc n subcapitolul ,Modificatori de acces. Cuvintele rezervate: static+ abstract+ 1inal+ native+ snc*roni3ed au urmtoarele roluri: static este folosit pentru declararea metodelor clas. 12emplu: void metodaA() # DDmetoda de instanta static void metodaB()# DDmetoda de clasa 42 abstract este folosit pentru declararea metodelor abstracte. O metod abstract este o metod care nu are implementare i trebuie s apar[in unei clase abstracte. final este folosit pentru a specifica faptul c acea metod nu mai poate fi supradefinit n subclasele clasei n care ea este definit ca fiind final. Acest lucru este util dac respectiva metod are o implementare care nu trebuie schimbat n subclasele ei. nati%e este folosit pentru refolosirea unor func[ii scrise n alt limbaj de programare dect Java (C de exemplu). s+nchroni,ed este folosit n cazul n care se lucreaz cu mai multe fire de execu[ie iar metoda respectiv se ocup cu partajarea unei resurse comune. Are ca efect construirea unui semafor care nu permite executarea metodei la un moment dat dect unui singur fir de execu[ie. 4.3.3.3 Tipul returnat de o metod Metodele pot s returneze sau nu o valoare (un obiect) la terminarea lor. Tipul valorii returnate poate fi att un tip primitiv de date (int, double, etc.) ct i o referin[ la un obiect al unei clase. n cazul n care o metoda nu returneaz nimic atunci QipTeturnat este %oid. 12emplu: void a1isareTe3ultat() Returnarea valorii de ctre o metod se realizeaz prin intermediul instruc[iunii return. Dac o metod returneaz o valoare de un tip de baz atunci tipul ei trebuie s coincid cu QipTeturnat, n caz contrar se primete eroare la compilare. 12emplu: Metod care calculeaz maximul a dou numere public int ma%(int a+ int b){ return a>bFa8b# $ Dac valoarea returnat este o referin[ la un obiect al unei clase, atunci clasa obiectului returnat trebuie s coincid sau s fie o subclas a clasei specificate la declararea metodei. 43 4.3.3.4 Parametrii unei metode Dup cum am vzut, numele clasei este urmat de lista parametrilor (argumentelor), list care este op[ional (o metod poate s nu aib parametrii). Parametrii sunt specifica[i prin numele i tipul lor, fiind despr[i[i unul de altul prin virgul. Nume.etoda([tipA argumentA]+ [tipB argumentB] ... ) Tipul de date al unui argument poate fi orice tip valid al limbajului, att tip primitiv de date ct i referin[ la un obiect. Exemplu: void adaugareHersoana(String nume+ int varsta+ 1loat salariu){ ... $ unde String este tip referin[+ int /i 1loat sunt tipuri primitive. n Java o metod nu poate primi un numr variabil de argumente, ceea ce nseamn c apelul unei metode trebuie s se fac cu specificarea exact a numrului i tipurilor argumentelor. Nu este permis gruparea parametrilor dup tipul lor. 12emplu: public int ma%(int a+b){...$ DDeste gre/it public int ma%(int a+ int b){ ...$ DDeste corect Numele argumentelor primite trebuie s difere ntre ele i nu trebuie s coincid cu numele nici uneia din variabilele locale ale metodei. Pot ns, s coincid cu numele variabilelor membre ale clasei caz n care diferen[ierea se va face prin intermediul variabile this. Vezi subcapitolul ,Obiectul t*is 12emplu: class Comple%{ int re+im# public sc*imba(int re+ int im){ t*is.re @ re# t*is.im @ im# $ $ 4tenie, n Java argumentele sunt trimise doar prin valoare !!! 44 Asta nsemn c metoda recep[ioneaz doar valorile variabilelor primite ca parametri. Cnd argumentul are tip primitiv de date metoda nu-i poate schimba valoarea dect local (n cadrul metodei); la revenirea din metod variabila are aceeai valoare ca la apelul ini[ial al metodei (modificrile fcute n cadrul metodei sunt pierdute). Cnd argumentul este de tip referin[ metoda nu poate schimba referin[a obiectului ns poate schimba variabilele membru ale respectivului obiect. Prin urmare, dac dorim ca o metod s schimbe starea (valoarea) unui argument primit, atunci el trebuie s fie neaprat de tip referin[ (trebuie s fie un obiect!). -.+.-. Constructorii unei clase Constructorii unei clase sunt metode speciale care au acelai nume cu cel al clasei, nu returneaz nici o valoare i sunt folosi[i pentru ini[ializarea obiectelor acelei clase n momentul instan[ierii lor. Constructorii controleaz modul n care un obiect este creat i ini[ializat. Class C:.H;JX { C:.H;JX() { DDconstructor $ $ O clas poate avea unul sau mai mul[i constructori care trebuie ns s difere prin lista de parametri primi[i. Astfel sunt permise diferite tipuri de ini[ializri ale obiectului la crearea sa, n func[ie de numrul parametrilor cu care este apelat constructorul. 12emplu: Clasa COMPLEX are trei constructori: unul fr parametrii definit n liniile 3-5, altul cu doi parametrii definit n liniile 6-8, altul cu un parametru definit n liniile 9- 11. A. class C:.H;JX { B. double re+ im# 6. C:.H;JX () { =. re@im@-# ,. $ <. C:.H;JX (double r+ double i ) { C. re@r# im@i# L. $ 7. C:.H;JX (double r) { A-. re@r# im@-# 45 AA. $ AB. $ Constructorii sunt apela[i automat la instan[ierea unui obiect. n cazul n care dorim s apelm explicit constructorul unei clase folosim metoda this(ar#umente), care apeleaz constructorul corespunztor (ca argumente) al clasei respective. Aceast metod este folosit atunci cnd sunt implementa[i mai mul[i constructori pentru o clas pentru a nu repeta secven[ele de cod scrise la constructorii cu mai pu[ine argumente. 12emplu: n clasa COMPLEX a fost definit constructorul cu doi parametrii. Ceilal[i doi constructori fac apel la constructorul cu doi parametrii n liniile 4 i 10. A. class C:.H;JX { B. double re+ im# 6. C:.H;JX () { =. t*is(-+-)# ,. $ <. C:.H;JX (double r+ double i ) { C. re@r# im@i# L. $ 7. C:.H;JX (double r) { A-. t*is(r+-)# AA. $ AB. $ Dac ntr-o clas nu este definete nici un constructor, sistemul i creeaz automat un constructor implicit care nu primete nici un argument. El ini[ializeaz variabilele membru de tipuri primitive cu 0 i pe cele de tipuri referin[ cu null. Deci prezen[a constructorilor n corpul unei clase nu este obligatorie. Dac ntr-o clas a fost definit cel pu[in un constructor cu parametrii, atunci constructorul implicit (fr parametrii) nu va mai fi creat automat. 12emplu: n clasa COMPLEX nu a fost definit nici un constructor. n linia 5 se apeleaz constructorul implicit creat automat pentru clasa Complex. A. class C:.H;JX { B. double re+ im# 6. $ =. ... ,. C:.H;JX c@ ne& C:.H;JX ()# 46 12emplu: n clasa COMPLEX au fost defini[i doi constructori: cu un parametru i cu doi parametrii. n linia 11 se apeleaz constructorul fr parametrii. Aceast linie genereaz o eroare deoarece nu exist constructor fr parametrii el nu a fost creat implicit. A. class C:.H;JX { B. double re+ im# 6. C:.H;JX (double r+ double i ) { =. re@r# im@i# ,. $ <. C:.H;JX (double r) { C. t*is(r+-)# L. $ 7. $ A-. ... AA. C:.H;JX c@ ne& Comple%()# DDeroare Constructorii unei clase pot avea urmtorii specificatori de acces: pri%ate: nici o alt clas nu poate instan[ia obiecte ale acestei clase. O astfel de clas poate con[ine metode publice care s-i creeze propriile obiecte i s le returneze altor clase; public: orice clas poate crea instan[e ale clasei respective; protected: doar subclasele pot crea obiecte de tipul clasei respective. Dac specificatorul lipsete, doar clasele din acelai pachet pot crea instan[e ale clasei respective. -.+... 3biectul this Obiectul t*is este o referin[ ctre obiectul curent. Este folosit n trei situa[ii: n cadrul unei metode care are parametrii cu nume identic cu numele atributelor clasei. n aceast situa[ie, trebuie fcut o diferen[ ntre cele dou. Cu t*is se calific atributele clasei. 12emplu: Metoda sc*imba primete doi parametrii cu acelai nume cu atributele clasei: re i im. A. class Comple%{ B. int re+im# 6. public sc*imba(int re+ int im){ 47 =. this$re @ re# ,. this$im @ im# <. $ C. $ n cadrul constructorilor pentru a apela ceilal[i constructori ai clasei. 12emplu: n liniile 4 i 11 se apeleaz constructorul cu doi parametrii definit n liniile 6-9. A. public class Tational{ B. private long m+n# 6. public Tational(){ =. this(-.!); ,. $ <. public Tational(long m+long n){ C. t*is.m@m# L. t*is.n@n# 7. $ A-. public Tational(long m){ AA. this(m.!); AB. $ A6. $ pentru a testa c obiectul primit ca parametru nu este chiar obiectul curent. 12emplu: Clasa ContSancar con[ine metoda trans1er n care se transfer suma de bani din contul primit n contul curent liniile 10, 11. n linia 15 se creeaz un obiect ContBancar. n linia 16 se apeleaz metoda transfer a obiectului c cu parametru c. Asta nseamn c, suma din contul c va fi transferat tot n contul c. Citind cu aten[ie codul din liniile 10, 11 observm c se adun suma primit (c.suma) la suma actual (t*is.suma) n cazul nostru, contul i dubleaz suma, dup care suma contului primit (c.suma) se face zero. A. public class ContSancar{ B. private long suma# 6. public ContSancar(){ =. t*is(-)# ,. $ <. public ContSancar(long suma){ C. t*is.suma@suma# L. $ 7. public void trans1er(ContSancar c){ A-. t*is.suma?@c.suma# AA. c.suma@-# AB. $ A6. $ 48 A=. ... A,. ContSancar c@ne& ContSancar(A--)# A<. c.trans1er(c)# Din punct de vedere logic, nu este corect. Ar trebui ca naintea nceperii transferului de bani s se verifice dac nu cumva este vorba despre acelai cont, caz n care nu ar trebui s se ntmple nimic. Metoda trans1er ar arta astfel: A. public void trans1er(ContSancar c){ B. i1 (this == c) 6. return# =. t*is.suma?@c.suma# ,. c.suma@-# <. $ C. $ n linia 2, t*is reprezint obiectul curent iar c obiectul primit ca parametru. -.+.0. 8upranc"rcarea i suprade!inirea metodelor supra>nc+rcarea ?overloading): n cadrul unei clase pot exista metode cu acelai nume cu condi[ia ca ele s difere prin lista parametrilor diferen[a const n numrul parametrilor sau n tipul lor. Astfel la apelul metodei cu acel nume se poate face distinc[ia ntre ele i se stabilete n mod unic care dintre ele se execut. 12emplu: n clasa .a%im sunt definite dou metode ma% cu doi respectiv cu trei parametrii. A. public class .a%im { B. public static int ma%(int a+ int b){ 6. return a>bFa8b# =. $ ,. public static int ma%(int a+ int b+ int c){ <. int m@a>bFa8b# C. m@m>cFm8c# L. return m# 7. $ A-. public static void main(String args[]){ AA. int a@AB+ b@,+c@7-+m# AB. m@ma%(a+b)# 49 A6. Sstem.out.println(!.a%. dintre !?a?! si !?b?! este8 !?m)# A=. m@ma%(a+b+c)# A,. Sstem.out.println(!.a%. dintre !?a?!+ !?b?! si !?c?! este8 !?m)# A<. $ AC. $ . suprade,inirea ?overriding): o subclas a unei clase poate rescrie o metod a clasei printe, prin implementarea unei metode cu acelai antet ca al superclasei. -.+.1. /odi!icatori de acces pentru membrii unei clase Sunt cuvinte rezervate ce controleaz accesul celorlalte clase la membrii unei clase. Modificatoriii de acces pentru variabilele i metodele unei clase sunt: public+ protected+ private i cel implicit. Nivelul lor de acces este dat n tabelul de mai jos: Modificat or Clas Subclas Pachet Altundev a private x protected x x x public x x x x implicit x x Dup cum se vede n tabelul de mai sus, modificatorii au urmtoarele semnifica[ii. private un membru declarat private este accesibil doar n clasa n care este declarat; protected un membru declarat protected este accesibil oricrei clase care apar[ine aceluiai pachet ca i clasa n care este declarat membrul; de asemenea, este accesibil i oricrei subclase a clasei respective; public un membru declarat public este accesibil oricrei clase indiferent de locul unde se afl ea. Dac modificatorul unui membru lipsete, se consider implicit un modificator ,friendly care d acces oricrei clase din pachetul respectiv. 12emple: 50 private int re+im# protected String secret# public 1loat[] elemente# long %# private void metoda9nterna()# public void setTe(int re)# Observa-ie: n cazul n care declarm un membru "protected" atunci accesul la acel membru din subclasele clasei n care a fost declarat variabila depinde i de pachetul n care se gsete subclasa: dac sunt n acelai pachet accesul este permis, dac nu sunt n acelai pachet accesul nu este permis dect pentru obiecte de tipul subclasei. -.+.D. /embrii instan" i membrii clas" O clas Java poate con[ine dou tipuri de variabile i metode : instan", declarate !"r" modificatorul static, specifice fiecrei instan[e clas", declarate cu modificatorul static, specifice clasei Dac o variabil este declarat static atunci exist doar o copie a variabilei asociat cu clasa respectiv i nu mai multe copii ale ei asociate cu fiecare instan[ a clasei. O variabil clas exist i poate fi folosit chiar dac clasa nu a fost instan[iat spre diferen[ de variabilele instan[ care exist doar dup ce a fost creat o instan[ a clasei. Pentru variabilele statice sistemul aloc o singur zon de memorie la care au acces toate instan[ele clasei respective, ceea ce nseamn c dac un obiect modific valoarea unei variabile statice, modificarea va fi vzut de ctre toate celelalte obiecte. Variabilelor statice nu li se aloc dinamic memorie; memoria pentru ele este rezervat nainte ca oricare obiect al clasei s fie creat. n cazul variabilelor instan[, la fiecare creare a unei instan[e a clasei sistemul aloc o zon de memorie separat pentru memorarea valorii ei. 12emplu: Clasa Hunct con[ine dou variabile instan[ declarate pe linia 2 i o variabil clas declarat i ini[ializat pe linia 3. Constructorul clasei Hunct ini[ializeaz variabilele instan[ i incrementeaz variabila clas. Cu alte cuvinte, 51 variabila nrEpuncte va contoriza cte puncte (instan[e ale clasei Hunct) se creeaz. n clasa QestHunct se creeaz trei obiecte de tipul Hunct i se afieaz valoarea variabilei clas nrEpuncte. Trebuie remarcat c variabila nrEpuncte este accesat prin intermediul numelui clasei. A. class Hunct{ B. int %+ # 6. static int nrEpuncte@-# =. Hunct(int %%+ int ){ ,. %@%%# @# <. nrpuncte??# C. $ L. $ 7. class QestHunct{ A-. public static void main(String args[]){ AA. Hunct pA@ne&Hunct(A-+ A-)# AB. Hunct pB@ne&Hunct(B-+ B-)# A6. Hunct p6@ne&Hunct(6-+ 6-)# A=. Sstem.out.println(Hunct.nrEpuncte)# A,. $ A<. $ ntruct metodele clas nu depind de starea obiectelor clasei respective, apelul lor se poate face prin: NumeClasa.metodaStatica()# sau NumeClasa obiect @ ne& NumeClasa()# obiect.metodaStatica()# n cazul metodelor instan[ apelul nu se poate face dect prin intermediul unui obiect: NumeClass.metoda9nstanta()+ DDile#al NumeClasa obiect @ ne& NumeClasa()# obiect. metodaWe9nstanta()# DDlegal 12emplu: n clasa Cerc sunt definite: o metod instan[ n liniile 6-11 care returneaz cercul cu raza cea mai mare i o metod clas n liniile 12-18 care returneaz cercul cu raza cea mai mare dintre cele dou cercuri primite ca parametru. n liniile 21, 22 sunt create dou cercuri a i b cu raze diferite. n linia 23 este apelat metoda maimare a obiectului a. n linia 24 este apelat metoda maimare a clasei Cerc. A. class Cerc{ 52 B. double %++r# 6. Cerc(double %+ double + double r) { =. t*is.%@%# t*is.@# t*is.r@r# ,. $
<. Cerc maimare(Cerc c) { C. i1(c.r>r) L. return c# 7. else A-. return t*is# AA. $ AB. static Cerc maimare(Cerc a+ Cerc b) { A6. i1 (a.r>b.r) A=. return a# A,. else A<. return b# AC. $ AL. $ A7. B-. ... BA. Cerc a@ne& Cerc(A-+ A-+ ,-)# BB. Cerc b@ne& Cerc(B-+ B-+ A--)# B6. Cerc c @ a.maimare(b)# B=. Cerc d @ Cerc.maimare(a+b)# Metodele clas nu pot accesa cmpuri sau metode instan[. Metodele instan[ pot accesa att membrii clas ct i instan[. Membrii clas (statici) sunt folosi[i pentru a pune la dispozi[ie valori i metode independente de starea obiectelor dintr-o anumit clas. Spre deosebire de C++, n Java nu putem avea func[ii globale definite ca atare, ntruct "orice este un obiect". Din acest motiv i metodele care au o func[ionalitate global trebuie implementate n cadrul unei clase. Acest lucru se va face prin intermediul metodelor clas (globale), deoarece acestea nu depind de starea particular a obiectelor din clasa respectiv. De exemplu, s considerm func[ia global sYrt care extrage radicalul dintr-un numr i care se gsete n clasa .at*. Dac nu ar fi fost func[ie clas, apelul ei ar fi trebuit fcut astfel: .at* m @ ne& .at*()# double radABA @ m.sYrt(ABA)# ceea ce ar fi fost extrem de neplcut pentru programatori. Fiind ns func[ie static ea poate fi apelat prin: .at*.sYrt(ABA). 53 -.+.E. 4rgumente n linia de comand" n sfrit suntem n msur s descifrm antetul metodei main. public static void main(String args[]) Metoda main primete un ir de String-uri ca parametru. Prin intermediul lui o aplica[ie Java poate primi oricte argumente din linia de comand n momentul lansrii ei. Aceste argumente sunt utile pentru a permite utilizatorului s specifice diverse op[iuni legate de func[ionarea aplica[iei sau s furnizeze anumite date ini[iale programului. Argumentele din linia de comand sunt introduse la lansarea unei aplica[ii, fiind specificate dup numele aplica[iei i sunt separate prin spa[iu. Formatul general pentru lansarea unei aplica[ii care primete argumente din linia de comand este: /a%a &ume0plicatie [ar#! ar#" $ $ $ ar#n] Evident, o aplica[ie poate s nu primeasc nici un argument sau poate s ignore argumentele primite din linia de comand. n momentul lansrii unei aplica[ii interpretorul parcurge linia de comand cu care a fost lansat aplica[ia i, n cazul n care exist argumente, i transmite aplica[iei sub forma irului de String-uri. Numrul argumentelor primite de un program este dat de dimensiunea vectorului args args.lengt*: numar(rgumente @ args.len#th # 12emplu: Afiarea argumentelor primite din linia de comand public class (rg;inCom { public static void main (String[] args) { 1or (int i @ -# i G args.lengt*# i??) Sstem.out.println(args[i])# $ $ Un apel de genul: java (rg;inCom Nu mai vine primavara odata va produce urmtorul rezultat: Nu mai vine primavara odata 54 Dac o anumit parte din irul de intrare este cuprins ntre ghilimelele se interpreteaz ca un singur argument, spa[iile fiind ignorate. Una apel de genul: java (rg;inCom !Nu mai vine! primavara odata va produce urmtorul rezultat: Nu mai vine primavara odata Dac se dorete ca din linia de comand s fie transmise argumente numerice, acestea sunt primite de metoda main sub forma unui vector de String- uri. Ulterior ele trebuie convertite din String-uri n numere. Acest lucru se realizeaz cu metode de tipul parse111 aflate n clasa XXX corespunztoare tipului n care vrem s facem conversia: 9nteger+ Ploat+ Wouble+ etc. 12emplu: A. public class .a%im { B. public static int ma%(int a+ int b){ 6. return a>bFa8b# =. $ ,. public static int ma%(int a+ int b+ int c){ <. int m@a>bFa8b# C. m@m>cFm8c# L. return m# 7. $ A-. public static void main(String args[]){ AA. i1 (args.lengt*"@6){ AB. Sstem.out.println(!Nu ati introdus trei numere!)# A6. return# A=. $ A,. int a@9nteger.parse9nt(args[-])+ A<. b@9nteger.parse9nt(args[A])+ AC. c@9nteger.parse9nt(args[B])+ AL. m# A7. m@ma%(a+b)# B-. Sstem.out.println(!.a%imul dintre !?a?! si !?b?! este8 !?m)# BA. m@ma%(a+b+c)# BB. Sstem.out.println(!.a%imul dintre !?a?!+ !?b?! si !?c?! este8 !?m)# B6. $ B=. $ 55 n linia 11 se verific dac au fost transmii at[ia parametrii c[i sunt necesari. n liniile 15-17 se convertesc argumentele n ntregi. -.-. /otenirea -.-.1. 2rincipiul motenirii Dup ncapsularea datelor, este al doilea principiu de baz al programrii orientate pe obiecte. Motenirea este folositoare deoarece reduce rescrierea codului. Adic, o clas poate fi motenit de ctre o alt clas (toate caracteristicile primei clase se regsesc i n a doua clas). Noua clas i poate modifica o parte din comportament, poate aduga ceva nou sau poate ignora ceea ce este neinteresant. Aceast idee provine din lumea nconjurtoare. De exemplu, primul model de main a fost mult timp gndit i dificil de construit. Evident c nu a atins perfec[iunea i, omul a dorit repede ceva mai performant i mai frumos. Prin urmare, s-a trecut la crearea celui de-al doilea model. Ar fi o naivitate s credem c lucrul la acest al doilea model a fost luat de la zero. De fapt, s-a pornit de la primul model i s-a ncercat o mbunt[ire a lui n diferite direc[ii s-a redus ceea ce nu era bun, s- au adugat elemente noi i au fost fcute modificri. Astfel s-a nscut i al doilea model. Pornind de la el, n acelai stil, s-au creat noi modele. Si mainile elegante pe care le vedem azi rulnd cu vitez pe osele se trag tot din acea prim main. Baza este aceeai, ,pu[in mbunt[it. n Java pentru a crea o clas nou trebuie specificate: clasa motenit i diferen[ele fa[ de clasa motenit. Clasa motenit se specific n clauza e%tends. modi1icator NumeClasa e2tends 'lasa)e3a,a Clasa motenete toate metodele accesibile i variabilele superclasei sale. 56 12emplu: Urmtoare ierarhie de clase: se exprim n Java astfel: class ({ ... $ class S e%tends ({ ... $ class C e%tends S{ ... $ class W e%tends S{ ... $ Dac clauza e%tends lipsete, implicit clasa motenete clasa :bject. Observa-ie: n Java motenirea multipl nu este permis. Adic o clas poate s moteneasc o singur clas nu mai multe. Prin urmare, orice clas are o superclas i poate avea una sau mai multe subclase. n exemplul nostru avem: clasa A este subclas a clasei :bject i are o subclas: clasa B. clasa B este subclas a clasei A i are o subclas: clasa C. clasele C i D sunt subclase ale clasei B i nu au subclase. Nu este permis o asemenea motenire (motenire multipl):
4vantajele cre"rii unei ierar#ii de clase - func[ionalitatea comun a mai multor clase se pune n superclase. Acest aranjament permite ca func[ionalitatea s fie refolosit n mod repetat deoarece fiecare subclas primete informa[ia comun din superclas. 57 A B C D A B C - schimbarea sau inserarea unei clase n partea de sus a ierarhiei determin automat schimbri n comportamentul claselor de jos Ce se ntmpl cnd o clas con[ine o metod care are acelai antet cu metoda unei superclase? Este executat prima metod ntlnit cutarea fcndu- se pornind de la baza ierarhiei n sus. Datorit acestui fapt, se pot scrie metode care s ascund metodele din superclase. Dac o metod din superclas nu este rescris ea va fi luat ca atare de subclas. Nu acelai lucru se ntmpl i cu constructorii. Fiecare clas derivat trebuie s i defineasc proprii constructori. Dac nu se scrie nici un constructor n subclas, atunci se genereaz constructorul implicit. 12emplu: Se definesc dou clase Tational i Tational9red care motenete clasa Tational. n linia 15 se construiete un obiect al clasei Tational prin apelarea constructorului cu doi parametrii. Acest constructor exist deci, totul este n regul. n linia 16 se dorete construirea unui obiect al clasei Tational9red tot prin apelarea constructorului cu doi parametrii. Dar, n acest caz este generat o eroare deoarece clasa Tational9red nu are definit constructorul cu doi parametrii. A.public class Tational{ B. private long m+n# 6. public Tational(){ =. m@-# n@A# ,. $ <. public Tational(long m+long n){ C. t*is.m@m# L. t*is.n@n# 7. $ A-. $ AA. public class Tational9red e%tends Tational { AB. ... A6. $ A=. ... A,. Tational r @ ne& Tational(B+,)# A<. Tational9red rA @ ne& Tational9red(B+,)#
Pentru ca linia 16 s nu mai genereze eroare, clasa Tational9red trenbuie s arate astfel: A. public class Tational9red e%tends Tational { 58 B. public Tational9red(){ 6. m@-# n@A# =. $ ,. public Tational9red(long m+long n){ <. t*is.m@m# C. t*is.n@n# L. $ 7. $ n cadrul unei metode a subclasei care supradefinete o metod din superclas se poate apela metoda supradefinit (a superclasei), folosind super. 12emplu: Relum exemplul precedent. Subclasa Tational9red con[ine ca i superclasa Tational doi constructori: unul fr parametrii i unul cu doi parametrii. Constructorii subclasei au aceeai func[ionalitate cu cei ai superclasei. n linia 16 se apeleaz constructorul fr parametrii ai superclasei Tational. n linia 19 se apeleaz constructorul cu doi parametrii ai superclasei Tational. Pe lng cei doi constructori care au aceeai func[ionalitate n ambele clase, a mai fost definit o metod produs care este suprascris n subclas. Metoda produs din subclas trebuie s fac ceva n plus fa[ de metoda superclasei. Prin urmare, ,se copiaz comportamentul metodei din liniile 10-12 i se adaug ceva n plus. ,Copierea se realizeaz n linia 22, iar adugarea n linia 23. Aceast ,copiere const n apelarea metodei din superclas. A. public class Tational{ B. public long m+n# 6. public Tational(){ =. m@-# n@A# ,. $ <. public Tational(long m+long n){ C. t*is.m@m# L. t*is.n@n# 7. $ A-. public void produs(){ AA. Sstem.out.println(!9nmultesc doua numere rationale!)# AB. $ A6. $ A=. public class Tational9red e%tends Tational { A,. public Tational9red(){ A<. super()# AC. $ 59 AL. public Tational9red(long m+long n){ A7. super(m.n); B-. $ BA. public Tational9red produs(Tational9red r){ BB. super$produs(r)# B6. Sstem.out.println(!si ireductibile!)# B=. $ B,. $ Observa-ii: Cnd se dorete apelarea constructorului superclasei se folosete doar super(...). Cnd se dorete apelarea unei metode a superclasei se folosete super.Nume.etoda(...). -.-.2. Inter!ee nterfe[ele duc conceptul de clas abstract cu un pas nainte prin eliminarea oricrei implementri a metodelor, punnd n practic unul din conceptele OOP de separare a modelului unui obiect (interfa[a) de implementarea sa. O interfa[ Java definete un set de metode dar nu specific nici o implementare pentru ele. O clas care implementeaz o interfa[ trebuie obligatoriu s defineasc toate metodele interfe[ei. Prin urmare, o interfa este o colecie de metode !"r" implementare i declaraii de constante. Definirea unei interfe[e se face prin intermediul cuvntului cheie interface: [public] interface Nume9nter1ata e%tends Super9nter1ataA [+e%tends Super9nter1ataB...]] { DDcorpul inter1etei8constane si metode abstracte $ O interfa[ poate fi declarat doar public. O clas poate extinde oricte interfe[e. Acestea se numesc superinter,e-e i sunt separate prin virgul. Corpul unei interfe[e con[ine: constante: acestea pot fi sau nu declarate cu modificatorii public+ static i 1inal care sunt implici[i; nici un alt modificator nu poate aprea n declara[ia unei variabile a unei interfe[e. Constantele dintr-o interfa[ trebuie obligatoriu ini[ializate. 60 12emplu: A. inter1ace Nume9nter1ata { B. int % @ A--# DDcorect 6. public static 1inal int @ A--# DDcorect =. private 3@A--# DDincorect ,. int a# DDincorect <. $ metode !"r" implementare: acestea pot fi sau nu declarate cu modificatorul public care este implicit; nici un alt modificator nu poate aprea n declara[ia unei metode a unei interfe[e. 12emplu: C. inter1ace Nume9nter1ata { L. void metodaA()# DDcorect 7. public void metodaB()# DDcorect A-. private void metoda6()# DDincorect AA. $ 4tenie, Variabilele i metodele unei interfe[e sunt implicit publice chiar dac nu sunt declarate cu modificatorul public. Variabilele unei interfe[e sunt implicit constante chiar dac nu sunt declarate cu modificatorii static i 1inal. Implementarea unei inter!ee se face prin intermediul cuvntului cheie implements: class NumeClasa implements Nume9nter1ata sau class NumeClasa implements 9nter1ataA+ 9nter1ataB... O clas poate implementa oricte interfe[e. O clas care implementeaz o interfa[ trebuie obligatoriu s defineasc toate metodele interfe[ei. 12emplu: Se definete o interfa[ FigGeom care este implementat de clasa Cerc i clasa Wreptung*i. Clasa Hatrat motenete clasa Wreptung*i+ iar clasa Hataratel motenete clasa Hatrat. A. inter1ace Pig)eom{ B. void desen()# 6. void arie()# =. $ ,. class Cerc implements Pig)eom{ 61 <. int r# C. Cerc(int r){ L. t*is.r@r# 7. Sstem.out.println(!Constructor cerc !?r)# A-. $ AA. public void desen(){ AB. Sstem.out.println(!Wesenea3a cercul !?r)# A6. $ A=. public void arie(){ A,. double s@.at*.H9'r'r# A<. Sstem.out.println(!Cercul !?r?! are aria !?s)# AC. $ AL. $ A7. class Wreptung*i implements Pig)eom{ B-. int ;+l# BA. Wreptung*i(){$ BB. Wreptung*i(int ;+int l){ B6. t*is.;@;# B=. t*is.l@l# B,. Sstem.out.println(!Constructor dreptung*i !?;?! !?l)# B<. $ BC. public void desen(){ BL. Sstem.out.println(!Wesenea3a dreptung*iul !?;?! !?l)# B7. $ 6-. public void arie(){ 6A. double s@;'l# 6B. Sstem.out.println(!Wreptung*iul !?;?! !?l?! are aria !?s)# 66. $ 6=. $ 6,. public class QestPig)eom{ 6<. public static void main(String args[]){ 6C. Pig)eom c@ne& Cerc(A-)+ 6L. d@ne& Wreptung*i(B-+B,)+ 67. c.desen()# =-. c.arie()# =A. d.desen()# =B. d.arie()# =6. $ ==. $ Rezultatul execu[iei este: Constructor cerc 10 Constructor dreptunghi 20 25 Deseneaza cercul 10 Cercul 10 are aria 314.1592653589793 Deseneaza dreptunghiul 20 25 62 Dreptunghiul 20 25 are aria 500.0 :i!erena dintre o inter!a" i o clas" abstract" La prima vedere o interfa[ nu este altceva dect o clas abstract n care toate metodele sunt abstracte (nu au nici o implementare). Deosebirea dintre ele const n faptul c unele clase sunt for[ate s extind o anumit clas (de exemplu orice applet trebuie s fie subclas a clasei Applet) i nu ar mai putea s extind o clas abstract deoarece n Java nu exist dect motenire simpl. Fr folosirea interfe[elor nu am putea for[a clasa respectiva s respecte un anumit protocol. La nivel conceptual diferen[a const n: extinderea unei clase abstracte for[eaz o rela[ie ntre clase; implementarea unei interfe[e specific doar necesitatea implementrii unor anumite metode. -... 2robleme 12emplu ': Exemplificarea motenirii. class .asina { private String s @ ne& String(!.asina!)# public void append(String a){ s ?@ a# $
public void porneste(){ append(! porneste()!)# $
public void merge(){ append(! merge()!)# $ public void opreste(){ append(! opreste()!)# $ public void print(){ Sstem.out.println(s)# $ $ class S.Z e%tends .asina { DDsc*imbarea unei metode public void opreste() { 63 append(! S.Z opreste sigur()!)# super.opreste()# DD apelul metodei clasei de ba3a $ DD adaugarea unei metode noi public void 1ranea3aSine(){ append(! 1ranea3aSine()!)# $ $
DD testarea noii clase public class Qest.asina{ public static void main(String[] args) { S.Z bm& @ ne& S.Z()# D' Sstem.out.println(bm&.s)# DDJroare s nu apartine lui bm& 'D bm&.porneste()# bm&.merge()# bm&.1ranea3aSine()# bm&.opreste()# bm&.print()# $ $ Rezultatul execu[iei este: Masina porneste() merge() franeazaBine() BMW opreste sigur() opreste() 12emplu ": Exemplificarea motenirii i a polimorfismului. abstract class Pig)eom{ abstract void desen()# abstract void arie()# $ class Cerc e%tends Pig)eom{ int r# Cerc(int r){ t*is.r@r# Sstem.out.println(!Constructor cerc !?r)# $ void desen(){ Sstem.out.println(!Wesenea3a cercul !?r)# $ void arie(){ double s@.at*.H9'r'r# Sstem.out.println(!Cercul !?r?! are aria !?s)# $ $ class Wreptung*i e%tends Pig)eom{ 64 int ;+l# Wreptung*i(){$ Wreptung*i(int ;+int l){ t*is.;@;# t*is.l@l# Sstem.out.println(!Constructor dreptung*i !?;?! !?l)# $ void desen(){ Sstem.out.println(!Wesenea3a dreptung*iul !?;?! !?l)# $ void arie(){ double s@;'l# Sstem.out.println(!Wreptung*iul !?;?! !?l?! are aria !?s)# $ $ class Hatrat e%tends Wreptung*i{ int l# Hatrat(int l){ DD super(l+l)# t*is.l@l# Sstem.out.println(!Constructor patrat !?l)# $ void desen(int N){ Sstem.out.println(!Wesenea3a patratul !?l?! indice !?N)# $ void arie(){ double s@l'l# Sstem.out.println(!Hatrat !?l?! are aria !?s)# $ $ class Hatratel e%tends Hatrat{ int l# Hatratel(int l){ super(l)# t*is.l@l# Sstem.out.println(!Constructor patratel !?l)# $ void desen(int N){ Sstem.out.println(!Wesenea3a patratelul !?l?! indice !?N)# $ void arie(){ double s@l'l# Sstem.out.println(!Hatratelul !?l?! are aria !?s)# $ $ 65 public class QestPig)eom{ public static void main(String args[]){ Pig)eom c@ne& Cerc(A-)+ d@ne& Wreptung*i(B-+B,)+ p@ne& Hatrat(6-)+ pm@ne& Hatratel(=-)# c.desen()# c.arie()# d.desen()# d.arie()# DD p.desen(A--)# da eroare p 1iind o 1igura geometrica p.desen()# DDse apelea3a desen din dreptung*i p.arie()# pm.desen()# DDse apelea3a desen din dreptung*i pm.arie()# Hatrat pA@ne& Hatrat(6--)# pA.desen(A--)# DDeste oN pA.arie()# $ $ Rezultatul afiat este: Constructor cerc 10 Constructor dreptunghi 20 25 Constructor patrat 30 Constructor patrat 40 Constructor patratel 40 Deseneaza cercul 10 Cercul 10 are aria 314.1592653589793 Deseneaza dreptunghiul 20 25 Dreptunghiul 20 25 are aria 500.0 Deseneaza dreptunghiul 0 0 Patrat 30 are aria 900.0 Deseneaza dreptunghiul 0 0 Patratelul 40 are aria 1600.0 Constructor patrat 300 Deseneaza patratul 300 indice 100 Patrat 300 are aria 90000.0 66 12emplu 4: lustreaz ordinea ini[ializrilor class Ploare { Ploare(int nr) { Sstem.out.println(!Ploare(! ? nr ? !)!)# $ void actiune(String 1el) { Sstem.out.println(!actiune(! ? 1el ? !)!)# $ $ class Ua3a { static Ploare 1A @ ne& Ploare(A)# DDvar SQ(Q9C( Ua3a() { Sstem.out.println(!Ua3a()!)# 1B.actiune(!Ploare in va3a!)# $ void po3itie(String loc) { Sstem.out.println(!po3itie(! ? loc ? !)!)# $ static Ploare 1B @ ne& Ploare(B)# DDvar SQ(Q9C( $ class )radina { Ploare 16 @ ne& Ploare(6)# static Ploare 1= @ ne& Ploare(=)# DDvar SQ(Q9C( )radina() { Sstem.out.println(!)radina()!)# 1=.actiune(!Ploare doarme!)# $ void aspect(String tip) { Sstem.out.println(!aspect(! ? tip ? !)!)# $ static Ploare 1, @ ne& Ploare(,)# DDvar SQ(Q9C( $ public class Static9nit { public static void main(String[] args) { Sstem.out.println( !Crea3a o )radina() noua in main!)# ne& )radina()# Sstem.out.println( !Crea3a o )radina() noua in main!)# ne& )radina()# vB.po3itie(!pe masa!)# g6.aspect(!1rumos!)# $ static Ua3a vB @ ne& Ua3a()# DDvar SQ(Q9C( static )radina g6 @ ne& )radina()# DDvar SQ(Q9C( $ Rezultatul execu[iei este: 67 Floare(1) Floare(2) Vaza() actiune(Floare in vaza) Floare(4) Floare(5) Floare(3) Gradina() actiune(Floare doarme) Creaza o Gradina() noua in main Floare(3) Gradina() actiune(Floare doarme) Creaza o Gradina() noua in main Floare(3) Gradina() actiune(Floare doarme) pozitie(pe masa) aspect(frumos) 12emplu 5: Exemplificarea motenirii. Clasa Tational implementeaz lucrul cu numere ra[ionale. Clasa Tational9red motenete clasa Tational i implementeaz lucrul cu numere ra[ionale ireductibile. public class Tational{ private long m+n# public Tational(){ t*is(A+-)# $ public Tational(long m+long n){ setm(m)# setn(n)# $ public Tational(long m){ t*is(m+A)# $ public void setm(long m){ 68 t*is.m@m# $ public long getm(){ return m# $ public void setn(long n){ t*is.n@n# $ public long getn(){ return n# $ public Tational produs(Tational r){ return ne& Tational(m'r.m+n'r.n)# $ public String toString(){ return m?!D!?n# $ $
public class Tational9red e%tends Tational { public Tational9red(){ super()# $ public Tational9red(long m+long n){ super(m+n)# $ public Tational9red(long m){ super(m)# $ private void simpli1ica(){ long %@getm()+ @getn()# &*ile(%"@){ i1(%>) %-@# else -@%# $ setm(getm()D%)# setn(getn()D%)# $ public Tational9red produs(Tational9red r){ Tational9red p@ne& Tational9red()# 69 p.setm(getm()'r.getm())# p.setn(getn()'r.getn())# p.simpli1ica()# return p# $ $
public class QestTational{ public static void main(String[] args) { Tational9red rA+rB+p# rA@ne& Tational9red(9nteger.parse9nt(args[-])+ 9nteger.parse9nt(args[A]))# rB@ne& Tational9red(9nteger.parse9nt(args[B])+ 9nteger.parse9nt(args[6]))# Sstem.out.println(rA)# Sstem.out.println(rB)# p@rA.produs(rB)# Sstem.out.println(p)# $ $ 70 .. 2ac#ete Un pac@et este o colec[ie de clase i interfe[e nrudite. Sunt folosite pentru gsirea i utilizarea mai uoar a claselor, pentru a evita conflictele de nume i pentru a controla accesul la anumite clase. n Java toate clasele i interfe[ele sunt grupate n diferite pachete dup func[ionalitatea lor. Cu ajutorul lor se pot construi aplica[iile. Cele mai importante pachete pe care le pune Java la dispozi[ie sunt: pachetul /a%a$lan# cuprinde clasele de baz ale limbajului; pachetul /a%a$io cuprinde clasele pentru intrri/ieiri, lucru cu fiiere; pachetul /a%a$math cuprinde clasele n care sunt definite opera[iile matematice; pachetul /a%a$util cuprinde clasele utile : Vector, Stack, Random, Date etc; pachetul /a%a$te2t ofer suport pentru formatarea textelor; pachetul /a%a$s4l ofer suport pentru interogri SQL; pachetul /a%a$beans cuprinde clasele necesare scrierii de componente reutilizabile; pachetul /a%a$net cuprinde clasele care asigur accesul la re[ea; pachetul /a%a$awt cuprinde clasele pentru grafic (Abstract Windowing Toolkit); pachetul /a%a2$swin# cuprinde clasele pentru grafic; extinde func[ionalitatea claselor din pachetul /a%a$awt$ pachetul /a%a$rmi cuprinde clasele care asigur execu[ie la distan[ (Remote Message nterface); pachetul /a%a$securit, cuprinde clasele care asigur mecanisme de securitate: criptare, autentificare; Pentru a folosi o component a unui pachet trebuie fcut cunoscut clasei curente fie pachetul n care se gsete componenta, fie doar componenta. Acest lucru se realizeaz prin importarea pachetului sau, doar a clasei. 71 ..1. Importul unui pac#et, al unei clase sau a unei inter!ee mportul se realizeaz prin instruc[iunea import. Importul pac#etelor se face prin specificarea numelui pachetului urmat de simbolul FGF. FGF are semnifica[ia c toate clasele i interfe[ele pachetului sunt importate. import &ume5achet$6; 12emple: import java.io.'# import java%.s&ing.'# O dat realizat ntr-un fiier importul pachetului, orice clas din pachet poate fi accesat prin numele ei. 12emplu: Clasa Wate apar[ine pachetului java.util. import java.util.'# public class J%Wata{ public static void main(String[] args) { Wate d@ne& Wate(B--6+=+A6)# Sstem.out.println(d)# $ $ 4tenie, n cazul n care sunt importate dou pachete care con[in o clas cu acelai nume atunci referirea la ea trebuie fcut folosind numele complet al clasei respective (nume pachet urmat de nume clas). mplicit, mediul Java import trei pachete: pachetul java.lang pachetul curent pachetul implicit (fr nume) Importul claselor >inter!eelor? se realizeaz prin specificarea numelui clasei (interfe[ei) pe care dorim s o folosim dintr-un pachet: import &ume5achet$&ume'lasa; 12emple: import java.util.Wate# O dat realizat ntr-un fiier importul clasei (interfe[ei), aceasta poate fi accesat prin numele ei. 72 12emplu: import java.util.Wate# public class J%Wata{ public static void main(String[] args) { Wate d@ne& Wate(B--6+=+A6)# Sstem.out.println(d)# $ } n cazul n care nu avem nevoie dect de cteva clase dintr-un pachet este mai eficient s importm clasele dect ntregul pachet. ..2. Crearea unui pac#et Se creeaz un director cu numele NumeHac*et n care vor fi salvate toate fiierele surs ce con[in clasele i interfe[ele pe care dorim s le grupm ntr-un pachet. Numele directorului d numele pachetului. n prima linie a fiecrui fiier din directorul NumeHac*et se specific faptul c toate clasele din fiierul respectiv vor apar[ine clasei. Aceasta se realizeaz prin: packa#e &ume5achet; Prin urmare codul unei clase care se adaug la un pachet arat astfel: pacNage NumeHac*et# public class NumeClasa{ . . . } nstruc[iunea pacNage ac[ioneaz asupra ntregului fiier surs la nceputul cruia apare. Cu alte cuvinte nu putem specifica faptul c anumite clase dintr-un fiier surs apar[in unui pachet iar altele altui pachet. Dac nu este specificat un anumit pachet, clasele unui fiier surs vor face parte din pachetul implicit (care nu are nici un nume). n general, pachetul implicit este format din toate clasele i interfe[ele directorului curent. Pentru compilare trebuie s ne plasm n directorul printe al directorului NumeHac*et. Se execut comanda: javac NumeHac*et5'.java n cazul n care nu sunt erori n pachet, n directorul NumeHac*et trebuie s se creeze fiierele .class. 73 Clasele care folosesc pachetul creat se aeaz n afara directorului. Pentru ca ele s aib acces la pachet trebuie setat variabila sistem CLASSPATH: SJQ C;(SSH(Q> @ CaleWirectorNumeHac*et 12emplu ': n directorul c85lucru se formeaz un director Hac*ete n care se salveaz urmtoarele fiiere: Fiierul (A.java con[ine clasa: pacNage Hac*ete# public class (A{ int a@-# public int b@-# private int c@-# protected int d@-# void a(){ Sstem.out.println(a)# $ public void b(){ Sstem.out.println(!public !? b)# $ protected void d(){ Sstem.out.println(!protected !?d)# $ $ Fiierul (B.java con[ine clasa: pacNage Hac*ete# public class (B implements (6{ public void a6(){ (A aA@ne& (A()# aA.a@A# aA.b@A# aA.d@A# Sstem.out.println(aA.a?! !?aA.b?! !?aA.d)# aA.a()# aA.b()# aA.d()# $ $ Fiierul (6.java con[ine clasa: pacNage Hac*ete# public inter1ace (6{ public void a6()# $ Setm variabila CLASSPATH: 74 SJQ C;(SSH(Q> @ c85lucru Pentru compilare ne pozi[ionm n directorul c85lucru i executm comanda: javac Hac*ete5'.java Construim o clas de test (=.java pe care o salvm n c85lucru: import Hac*ete.'# public class (={ public static void main(String args[]){ (B a@ne& (B()# a.a6()# (A aA@ne& (A()# DDaA.a()# eroare [ metoda a() este ca /i protected aA.b()# DDaA.d()# eroare [ metoda d() este protected $ $ Se compileaz i se execut ca orice clas Java . Exemplu 2: Construim un pachet Tablou care con[ine o clas .atrice i una Uector. pacNage Qablou# public class Uector{ private double a[]#
public Uector(){ a@ne& double[A]# $ public Uector(int n+ double a[]){ t*is.a@ne& double[n]# 1or(int i@-# iGn# i??) t*is.a[i]@a[i]# $
public int get;ungime(){ return a.lengt*# $
public double getJlem(int po3){ return a[po3]# $
public double[] getUector(){ return a# $ 75 public void setJlem(int po3+ double val){ a[po3]@val# $
public String toString(){ String s@!!# 1or(int i@-# iGa.lengt*# i??) s@s?a[i]?! !# return s# $ $ pacNage Qablou# public class .atrice{ private double a[][]#
public .atrice(){ a@ne& double[A][]# $ public .atrice(int n+ int m+ double a[][]){ t*is.a@ne& double[n][m]# 1or(int i@-# iGn# i??) 1or(int j@-# jGm# j??) t*is.a[i][j]@a[i][j]# $
public int getNr;in(){ return a.lengt*# $ public int getNrCol(int l){ return a[l].lengt*# $
public double getJlem(int l+ int c){ return a[l][c]# $
public double[][] get.atrice(){ return a# $
public String toString(){ 76 String s@!!# 1or(int i@-# iGa.lengt*# i??){ 1or(int j@-# jGa[i].lengt*# j??) s?@a[i][j]?! !# s?@!5n!# $ return s# $ $ O clas care folosete pachetul Tablou ar fi: A. import Qablou.'# B. public class QestQablou{ 6. public static void main(String args[]){ =. double %[][]@{{B+=$+{,+<$+{A+6$$# ,. .atrice m@ne& .atrice(6+B+%)# <. Sstem.out.println(m)# C. double []@{B+=+,+<$# L. Uector v@ne& Uector(=+)# 7. Sstem.out.println(v)# A-. java.util.Uector vv@ne& java.util.Uector(,)# AA. 1or (int i@-#iG,#i??) AB. vv.add(ne& 9nteger(i))# A6. Sstem.out.println(vv)# A=. $ A,. $ Se observ c n linia 10 se creeaz un obiect folosind de data aceasta clasa Vector din pachetul java.util. Pentru a face diferen[ ntre clasa pachetului nostru i clasa pachetului java.util trebuie s specificm i numele pachetului. 77 0. 7(cepii 0.1. 4specte generale O e2cep-ie este un eveniment ce se produce n timpul execu[iei unui program i care provoac ntreruperea cursului normal al execu[iei. De exemplu, o mpr[ire la 0 sau utilizarea unui indice care depete o dimensiune declarat a unui tablou reprezint un eveniment care perturb execu[ia normal a programului este vorba despre o excep[ie. Cnd apare o astfel de eroare n timpul execu[iei programului sistemul genereaz automat un obiect de tip excep[ie ce con[ine: informa[ii despre excep[ia respectiv; starea programului n momentul producerii excep[iei 12emplu: public class J%ceptii { public static void main(String args[]) { int v[] @ ne& int[A-]# v[A-] @ -# DDe(ceptie, vectorul are elementele vHIJ...vHEJ Sstem.out.println(!(ici nu se mai ajunge...!)# $ $ La rularea programului va fi generat o excep[ie i se va afia mesajul : J%ception in t*read !main! java.lang.(rra9nde%:ut:1SoundsJ%ception 86 at J%ceptii.main (J%ceptii.java8=) Java dispune de un mecanism care permite programatorului s preia controlul programului n momentul n care apare o excep[ie i s o trateze. Crearea unui obiect de tip excep[ie se numete aruncarea unei e2cep-ii ("throwing an exception"). n momentul n care o metod genereaz o excep[ie (arunc o excep[ie) sistemul de execu[ie este responsabil cu gsirea unei secven[e de cod dintr-o metod care s trateze acea excep[ie. Excep[iile sunt propagate napoi prin secven[a de metode apelate pn cnd o anumit metod prinde excep[ia. Secven[a de cod dintr-o metod care trateaz o anumit excep[ie se numete analizor de e2ceptie ("exception handler") iar interceptarea i tratarea 78 excep[iei se numete prinderea e2cep-iei ("catch the exception"). Cu alte cuvinte la apari[ia unei erori este "aruncat" o excep[ie iar cineva trebuie s o "prind" pentru a o trata. Dac sistemul nu gsete nici un analizor pentru o anumita excep[ie atunci programul Java se oprete cu un mesaj de eroare. erarhia claselor ce con[in excep[ii este: Toate excep[iile Java sunt subclase ale clasei J%ception. 0.2. Instruciunea tr% tr{ instruc[iuni ce pot declana excep[ii $ [catc*(ClasaExceptie obiectExceptie){ instruc[iuni de tratare a excep[iei de clas ClasaExceptie }]* [1inall{ instruc[iuni care se execut necondi[ionat n final }] nstruc[iunea tr con[ine un bloc de instruc[iuni ce trebuie executate. Punerea unor instruc[iuni n cadrul lui tr nseamn c exist posibilitatea apari[iei unor excep[ii sau terminrii anormale a unei instruc[iuni. O instruc[iune tr poate avea oricte clauze catc* (op[ionale) n care sunt tratate excep[iile. De asemenea, instruc[iunea tr poate avea o clauz 1inall a crui bloc se execut ntotdeauna 79 naintea prsirii instruc[iunii tr. nstruc[iunea tr trebuie s aib fie o clauz catc*+ fie una 1innal. Formele generale ale instruc[iunii tr. 1. tr{ ... $ catc*(ClasaExceptie obiectExceptie){ ... } B. tr{ ... $ catc*(ClasaExceptie obiectExceptie){... } ... catc*(ClasaExceptie obiectExceptie){... } 6. tr{ ... $ 1innal{... } =. tr{ ... $ catc*(ClasaExceptie obiectExceptie){... } ... catc*(ClasaExceptie obiectExceptie){... } 1innal{... } n cazul n care este declanat o excep[ie i exist mai multe clauze catc*+ este cutat, n ordine, acea clauz care poate trata excep[ia. Adic este gsit o clauz a crui parametru are un tip care se potrivete cu tipul excep[iei. Ordinea n care clauzele catc* apar este important: clauzele catc* mai specifice trebuie s apar naintea celor mai generale. Dac nu exist o clauz care s trateze excep[ia, aceasta este propagat n sus, la instruc[iunile imediat urmtoare. 80 Excep[ii uzuale: (rit*meticJ%ception Depire limit tip sau mpr[ire la 0 NumberPormatJ%ception Conversia nepermis a unui String la un tip numeric 9nde%:ut:1SoundsJ%ception ndice ilegal ntr-un ir Negative(rraSi3eJ%ception Crearea unui ir cu numr negativ de elemente NullHointerJ%ception Tentativ de a folosi o referin[ care are valoarea null SecuritJ%ception nclcarea normelor de securitate n timpul execu[iei 0.+. Crearea unei e(cepii Adeseori poate aprea necesitatea crerii unor excep[ii proprii pentru a pune n eviden[ cazuri speciale de erori provocate de clasele unei librrii, cazuri care nu au fost prevzute n ierarhia excep[iilor standard Java. O excep[ie proprie trebuie s se ncadreze n ierarhia excep[iilor Java, cu alte cuvinte clasa care o implementeaz trebuie s fie subclas a clasei J%ception. public class E2ceptie&oua e2tends E2ception7 ... $ 12emplu: A. public class J%c e%tends J%ception{ B. public J%c(){ 6. super()# DDapelea3a constructorul clasei J%ception =. ... ,. $ <. $ ntr-o clas n care se dorete folosirea unei excep[ii exist o metod care creeaz excep[ia (obiect al clasei de excep[ii), mai multe metode care arunc excep[ia primit i, eventual o metod care o prinde, adic o trateaz. Dac ntr-o metod apare o excep[ie creat n metoda respectiv sau ca urmare a apelrii unei metode care a aruncat o excep[ie, atunci ea trebuie fie s fie tratat, fie s fie aruncat mai departe. n ambele cazuri codul care ar putea genera excep[ia trebuie pus n cadrul unei instruc[iuni tr care s aib o clauz catc* cu parametru care s coincid cu clasa excep[iei. Dac excep[ia se dorete s fie tratat, atunci n 81 clauza catc* se pune un cod corespunztor. Dac se dorete ca excep[ia s nu fie tratat atunci ea trebuie aruncat mai departe (metodei care a fcut apelul) i acest lucru se realizeaz prin adugarea clauzei t*ro&s ClasaJ%ceptie n antetul metodei. 12emplu ': n clasa Rationalred se verific dac numitorul frac[iei este 0. Dac da atunci se creeaz o excep[ie linia 53. A. public class J%c e%tends J%ception{ B. public J%c(){ 6. super()# =. Sstem.out.println(!Numitor -!)# ,. $ <. $ C. public class Tational{ L. private long m+n# 7. public Tational(){ A-. t*is(A+-)# AA. $ AB. public Tational(long m+long n){ A6. setm(m)# A=. setn(n)# A,. $ A<. public Tational(long m){ AC. t*is(m+A)# AL. $ A7. public void setm(long m){ B-. t*is.m@m# BA. $ BB. public long getm(){ B6. return m# B=. $ B,. public void setn(long n){ B<. t*is.n@n# BC. $ BL. public long getn(){ B7. return n# 6-. $ 6A. public Tational produs(Tational r){ 6B. return ne& Tational(m'r.m+n'r.n)# 66. $ 6=. public String toString(){ 6,. return m?!D!?n# 6<. $ 6C. $ 6L. public class Tational9red e%tends Tational { 82 67. public Tational9red(){ =-. super()# =A. $ =B. public Tational9red(long m+long n) t*ro&s J%c{ =6. setm(m)# ==. tr{ =,. set9n(n)# =<. $ =C. catc*(J%c e){t*ro& e#$ =L. $ =7. public void set9n(long n) t*ro&s J%c{ ,-. i1 (n"@-) ,A. super.setn(n)# ,B. else ,6. t*ro& ne& J%c()# ,=. $ ,,. private void simpli1ica(){ ,<. long %@getm()+ @getn()# ,C. &*ile(%"@){ ,L. i1(%>) %-@# ,7. else -@%# <-. $ <A. setm(getm()D%)# <B. setn(getn()D%)# <6. $ <=. public Tational9red produs(Tational9red r){ <,. Tational9red p@ne& Tational9red()# <<. p.setm(getm()'r.getm())# <C. p.setn(getn()'r.getn())# <L. p.simpli1ica()# <7. return p# C-. $ CA. $ CB. public class QestTational{ C6. public static void main(String[] args) { C=. Tational9red rA+rB+p# C,. tr{ C<. rA@ne& Tational9red( CC. 9nteger.parse9nt(args[-])+ CL. 9nteger.parse9nt(args[A]))# C7. rB@ne& Tational9red( L-. 9nteger.parse9nt(args[B])+ LA. 9nteger.parse9nt(args[6]))# LB. $ L6. catc*(J%c e){ L=. Sstem.e%it(A)# L,. $ L<. Sstem.out.println(rA)# LC. Sstem.out.println(rB)# LL. p@rA.produs(rB)# L7. Sstem.out.println(p)# 83 7-. $ 7A. $ 84 1. Intr"ri i ieiri
nforma[ia poate fi preluat de oriunde (fiier, disk, re[ea, memorie, alt program) i poate fi de orice tip (obiecte, caractere, imagini, sunete). Pentru a aduce informa[ii, un program Java deschide un flux (canal de comunica[ii) la o surs de informa[ii i citete informa[ia. Un flux care citete date se numete ,lu2 de intrare. Similar, un program poate trimite informa[ii ctre o destina[ie extern deschiznd un flux (canal de comunica[ii) ctre acea destina[ie i scriind serial informa[iile respective. Un flux care scrie date se numete ,lu2 de ieire. Algoritmul de citire este: desc*ide 1lu% c2t timp e%ist0 in1orma4ie cite/te in1orma4ia 85 Mnc*ide 1lu% Algoritmul de afiare este: desc*ide 1lu% c2t timp e%ist0 in1orma4ie scrie in1orma4ia Mnc*ide 1lu% Pachetul java.io con[ine o colec[ie de clase folosite pentru citiri i afiri. Prin urmare, orice program care necesit opera[ii de intrare / ieire trebuie s importe pachetul java.io: import /a%a$io$6. 1.1. Clasi!icarea !lu(urilor Exist trei tipuri de clasificare a fluxurilor: Dup "direc[ia" canalului de comunica[ie deschis, fluxurile se mpart n: o fluxuri de intrare (pentru citirea datelor) o fluxuri de ieire (pentru scrierea datelor) Dup tipul de date pe care opereaz: o fluxuri de octe[i (comunicarea serial se realizeaz pe 8 bi[i) o fluxuri de caractere (comunicarea serial se realizeaz pe 16 bi[i) Dup ac[iunea lor: o fluxuri pentru citirea / scrierea datelor o fluxuri pentru procesarea datelor 1.2. Ierar#ia claselor pentru lucrul cu !lu(uri 1.2.1. 6lu(uri de caractere Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de caractere sunt Teader (pentru fluxuri de intrare) i Zriter (pentru fluxuri de ieire). 86 erarhia claselor pentru fluxuri de intrare pe caractere este: erarhia claselor pentru fluxuri de ieire pe caractere este: 1.2.2. 6lu(uri de octei Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de octe[i sunt 9nputStream (pentru fluxuri de intrare) i :utputStream (pentru fluxuri de ieire). Subclasele lor sunt folosite pentru citiri i scrieri de date binare cum ar fi imagini i sunete. erarhia claselor pentru fluxuri de intrare pe octe[i: 87 erarhia claselor pentru fluxuri de ieire pe octe[i: 1.+. 8uperclasele de intrare ' ieire Clasele Reader i nputStream definesc metode similare pentru citirea datelor, tipul parametrilor variind. Clasa Teader int read() int read(c*ar cbu1[ ]) int read(c*ar cbu1[ ]+ int inde%+ int lungime) Clasa 9nputStream int read() int read(bte cbu1[ ]) int read(bte cbu1[ ]+ int inde%+ int lungime) 88 Analog, clasele Writer i OutputStream definesc metode similare pentru afiarea datelor, tipul parametrilor variind. Clasa Zriter int &rite() int &rite(c*ar cbu1[ ]) int &rite(c*ar cbu1[ ]+ int inde%+ int lungime) Clasa :utputStream int &rite() int &rite(bte cbu1[ ]) int &rite(bte cbu1[ ]+ int inde%+ int lungime) 1.-. Crearea unui !lu( Orice flux este un obiect al clasei ce implementeaz fluxul respectiv. Crearea unui flux se realizeaz similar cu crearea obiectelor, prin instruc[iunea new(). 12emple: DDcrearea unui 1lu% de intrare pe caractere PileTeader in @ ne& PileTeader(!1isierEintrare.t%t!)# DDcrearea unui 1lu% de iesire pe caractere PileZriter out @ ne& PileZriter(!1isierEiesire.t%t!)# DDcrearea unui 1lu% de intrare pe octeti Pile9nputStream in @ ne& Pile9nputStream(!1isierEintrare.t%t!)# DDcrearea unui 1lu% de iesire pe octeti Pile:utputStrem out @ ne& Pile:utputStream(!1isierEiesire.t%t!)# Prin urmare, crearea unui flux de date care scrie / citete informa[ii de la un dispozitiv extern are formatul general: 8lu25rimiti% nume8lu2 = new 8lu25rimiti% (dispo,iti% e2tern) 89 1... Citirea datelor de la tastatur" 1...1. 3biectul 9+stem$in n general, tastatura reprezint perifericul standard pentru introducerea datelor. Clasa Sstem con[ine o variabil membru care reprezint tastatura sau fluxul de intrare standard. Aceast variabil membru se numete in i este o instan[ a clasei 9nputStream. 12emplu ': Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un ir de caractere. Citirea se ncheie cnd se apas tasta Enter. A. class CitireA { B. public static void main(String args[]) { 6. StringSu11er s@ne& StringSu11er()# =. c*ar c# ,. tr { <. &*ile((c@(c*ar)Sstem.in.read()) "@ \5n\) C. s.append(c)# L. $ 7. catc*(J%ception e) { A-. Sstem.out.println(KJrror8K?e.get.essage())# AA. $ AB. Sstem.out.println(!Sirul este8!?s)# A6. $ A=. $ 12emplu ": Se citesc de la tastatur caractere. Ele sunt memorate ntr-un vector de bytes (linia 5). Citirea se ncheie cnd se apas tasta Enter. Pe baza vectorului se formeaz un String (linia 10) care este afiat. A. class CitireB { B. public static void main(String args[]) { 6. bte bu1[]@ne& bte[6-]# =. tr { ,. Sstem.in.read(bu1)# <. $ C. catc*(J%ception e) { L. Sstem.out.println(KJrror8K?e.get.essage())# 7. $ A-. String s@ne& String(bu1)# AA. Sstem.out.println(s)# AB. $ A6. $ 90 1...2. Clasa *nput9tream:eader Reprezint legtura dintre fluxurile de octe[i i fluxurile de caractere: citete octe[i i i transform n caractere. Transformarea octe[ilor n caractere este efectuat conform unei reguli de codificare. Dac nu se specific o astfel de regul, atunci se utilizeaz codificarea implicit (dat de proprietatea de sistem file encoding). Clasa 9nputStreamTeader are urmtorii constructori: 9nputStreamTeader(9nputStream in) 9nputStreamTeader(9nputStream in+ String enc) Metoda principal pentru citirea unui caracter este: int read() 12emplu 4: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un ir de caractere. Citirea se ncheie cnd se apas tasta Enter. A. import java.io.'# B. class Citire6 { 6. public static void main(String args[]) { =. 9nputStreamTeader in@ ,. ne& 9nputStreamTeader(Sstem.in)# <. c*ar c# C. StringSu11er s@ne& StringSu11er()# L. tr { 7. &*ile((c@(c*ar)in.read()) "@ \5n\) A-. s.append(c)# AA. $ AB. catc*(J%ception e) { A6. Sstem.out.println(KJrror8K?e.get.essage())# A=. $ A,. Sstem.out.println(s)# A<. $ AC. $ 1...+. Clasa 3uffered:eader 91 n cazul folosirii clasei 9nputStreamTeader, citirea se face caracter cu caracter (adic, discul este accesat de fiecare dat). Pentru a crete eficien[a se folosete un flux care utilizeaz o zon tampon pentru citire (Su11eredTeader). Clasa Su11eredTeader are definit metoda read() cu aceeai signatur ca i cea definit n 9nputStreamTeader dar, n plus, definete i metoda read;ine(). Aceast metod poate fi folosit pentru a citi un ir de caractere terminat cu '\n','\r' sau '\r\n'. 12emplu 5: Se introduce un ir de caractere de la tastatur. La apsarea tastei Enter irul este citit n ntregime i este depus ntr-un String. A. import java.io.'# B. class Citire= { 6. public static void main(String args[]) { =. 9nputStreamTeader inA@ ne& 9nputStreamTeader(Sstem.in)# ,. String s@ne& String()# <. tr { C. Su11eredTeader in@ ne& Su11eredTeader(inA)# L. s@in.read;ine()# 7. $ A-. catc*(J%ception e) { AA. Sstem.out.println(KJrror8K?e.get.essage())# AB. $ A6. Sstem.out.println(s)# A=. $ A,. $ 1.0. Citirea i scrierea datelor din !iier 1.0.1. Clasele 8ile:eader i 8ile;riter Clasa PileTeader este folosit la citirea datelor dintr-un fiier text. Cei mai importan[i constructori ai si sunt: creeaz un flux care citete caractere din fiierul nume public PileTeader(String nume) t*ro&s PileNotPoundJ%ception 92 creeaz un flux care citete caractere din fiierul varFis. public PileTeader(Pile varPis) t*ro&s PileNotPoundJ%ception Clasa PileZriter este folosit la scrierea datelor ntr-un fiier text. Cei mai importan[i constructori ai si sunt: creeaz un flux care scrie caractere in fiierul nume public PileZriter (String nume) t*ro&s 9:J%ception creeaz un flux care citete caractere din fiierul varFis public PileZriter (Pile varPis) t*ro&s 9:J%ception 12emplu 6: Citete caracter cu caracter un fiier n linia 8. Cnd valoarea caracterului citit este 1 nseamn c s-a ajuns la sfritul fiierului. Caracterele sunt adugate la un ir de caractere n linia 9, care la sfrit este afiat. A. import java.io.'# B. public class CitirePis { 6. public static void main(String args[]) { =. int c# ,. StringSu11er s@ne& StringSu11er()# <. tr { C. PileTeader in@ ne& PileTeader(Kcit=.t%tK)# L. &*ile((c@in.read())"@-A) 7. s.append((c*ar)c)# A-. $ AA. catc*(J%ception e) { AB. Sstem.out.println(KJrror8K?e.get.essage())# A6. $ A=. Sstem.out.println(s)# A,. $ A<. $ 12emplu 7: Copiaz con[inutul unui fiier n alt fiier. A. import java.io.'# B. public class CitirePis { 6. public static void main(String[] args){ =. tr{ ,. PileTeader in @ ne& PileTeader(!cit=.t%t!)# <. PileZriter out @ ne& PileZriter(!out.t%t!)# C. int c# L. &*ile ((c @ in.read()) "@ -A) 7. out.&rite(c)# A-. in.close()# AA. out.close()# AB. $ 93 A6. catc* (9:J%ception e) { A=. Sstem.out.println(!Jrror8 ! ? e.toString())# A,. $ A<. $ AC. $ D. 4ppletKuri D.1. Ce este un applet? Unul dintre scopurile limbajului Java a fost crearea unor programe mici (applet) care s ruleze n interiorul unui browser Web. Un applet reprezint o suprafa[ de afiare (container) ce poate fi inclus ntr-o pagina Web i gestionat printr-un program Java. Un astfel de program se mai numete miniaplica-ie. Codul unui applet poate fi format din una sau mai multe clase. Una dintre acestea este principal+ i extinde clasa J4pplet, fiind clasa ce trebuie specificat n documentul HTML ce descrie pagina de Web n care dorim s includem applet-ul. Diferen[a fundamental dintre un applet i o aplica[ie const n faptul c, un applet nu poate fi executat independent, ci va fi executat de browser-ul n care este ncrcat pagina Web ce con[ine applet-ul respectiv. O aplica[ie independent este executat prin apelul interpretorului java, avnd ca parametru numele clasei principale a aplica[iei, clasa principal fiind cea care con[ine metoda main. Un applet nu se poate atinge de hardisk-ul local prin citiri sau scrieri. Scrierea este mpiedicat din cauza viruilor care s-ar putea instala, iar citirea deoarece nu se dorete preluarea de informa[ii de pe sta[ia local. Un neajuns al applet-urilor ar putea fi timpul destul de lung necesar ncrcrii lor. O metod de nlturare a acestui neajuns ar fi arhivarea applet-urilor ntr-un fiier JAR (Java ARchive) care s cuprind toate componentele. Astfel, fiierul compresat este download-at la o singur tranzac[ie cu server-ul. Un avantaj al folosirii applet-urilor este lipsa necesit[ii instalrii lor. De fapt, instalarea este automat de cte ori utilizatorul ncarc pagina Web care con[ine applet-ul. Pachetul care ofer suport pentru crearea de applet-uri este java(.s&ing. Clasa J(pplet furnizeaz tot ce este necesar pentru construirea i ntre[inerea unui 94 applet. Crearea unui applet implic implementarea metodelor puse la dispozi[ie de clasa J(pplet care ne ajut s descriem comportamentul dorit al applet-ului. erarhia de clase este: java.lang.:bject ] ?--java.a&t.Component ] ?--java.a&t.Container ] ?--java.a&t.Hanel ] ?--java.applet.(pplet ] ?--/a%a2$swin#$<0pplet
D.2. 6unciile unui applet Execu[ia unui applet ncepe n momentul n care un browser afieaz o pagin Web n care este inclus applet-ul respectiv i poate trece prin mai multe etape. Fiecare etap este strns legat de un eveniment generat de ctre browser i determin apelarea unei metode specifice din clasa ce implementeaz appletul. Lnc"rcarea n memorie se creeaz o instan[ a clasei principale a applet-ului i se ncarc n memorie. Iniiali*area se apeleaz metoda init ce permite ini[ializarea diverselor variabile, citirea unor parametri de intrare, etc. Metoda init este responsabil i pentru aezarea tuturor componentelor pe form. 2ornirea se apeleaz metoda start 7(ecuia propriuK*is" const n interac[iunea dintre utilizator i componentele afiate pe suprafa[a applet-ului. 3prirea temporar" n cazul n care utilizatorul prsete pagina Web n care ruleaz applet-ul se apeleaz metoda stop a acestuia, dndu-i astfel posibilitatea s se opreasc temporar ct timp nu este vizibil, pentru a nu consuma inutil din timpul procesorului. Acelai lucru se ntmpl dac fereastra browser-ului este minimizat. n momentul cnd pagina Web ce con[ine applet-ul devine din nou activ, va fi reapelat metoda start. 95 3prirea de!initiv" La nchiderea tuturor instan[elor browser-ului folosit pentru vizualizare, applet-ul va fi eliminat din memorie i va fi apelat metoda destro a acestuia, pentru a-i permite s elibereze resursele de[inute. Apelul metodei destro este ntotdeauna precedat de apelul lui stop.
D.+. 8tructura general" a unui applet import java%.s&ing.J(pplet# import java.a&t.'# import java.a&t.event.'# public class Structura(pplet e%tends J(pplet { public void init() { /* codul descrie ac[iunile care dorim s fie efectuate la instan[ierea clasei applet-ului. */ $ public void start() { /* codul descrie ac[iunile care dorim s fie executate la lansarea applet- ului n execu[ie sau la rentoarcerea n pagina applet-ului */ $ public void paint()rap*ics g) { /* codul descrie ac[iunile care dorim s fie executate la fiecare redesenare a ferestrei applet-ului */ $ public void stop() { /* codul descrie ac[iunile care dorim s fie executate la oprirea temporar a applet-ului (pagina Web nu mai este vizibil, fereastra browser-ului este minimizat, etc) */ $ public void destro+() { /* codul descrie ac[iunile care dorim s fie executate la distrugerea applet- ului (browser-ul prsete documentul .html din care a fost apelat applet-ul) */ $ 96 $ Observa-ie: Aceste metode sunt apelate automat de browser i nu trebuie apelate explicit din program ! D.-. M5/L Un browser Web interpreteaz con[inutul (textul) unui fiier .html (Hyper Text Markup Language). Limbajul HTML const ntr-o colec[ie de marcaje (tag-uri). Marcajele au rolul de a descrie modul n care va aprea afiat textul, de a comanda browser-ului s utilizeze i alte resurse nternet, aflate n fiiere diferite. Sintaxa unui marcaj este: <NumeQag [parametri ]> te%t </NumeQag> Parametrii se scriu sub forma: NumeHarametru @ valoare Structura unui document .*tml este: G>Q.;> G>J(W> GQ9Q;J> titlul documentului <DQ9Q;J> <D>J(W> GS:W^> . . . G(HH;JQ parametrii> GH(T(. parametrii> GH(T(. parametrii> . . . GH(T(. parametrii> GD(HH;JQ> . . . GDS:W^> <D>Q.;> Considerm cunoscute no[iunile de baz ale HTML. Ceea ce ne intereseaz pentru construirea applet-urilor este marcajul <APPLET>. Acesta are parametrii obligatorii i op[ionali. Parametrii obligatorii: 97 CODE valoarea lui este numele fiierului care con[ine clasa applet- ului: NumeClasa.class; WDTH valoarea lui este l[imea ferestrei atribuit de browser applet- ului la afiarea documentului .html; HEGHT valoarea lui este nl[imea ferestrei atribuit de browser applet-ului la afiarea documentului .html; Parametrii op[ionali: CODEBASE valoarea lui este adresa URL (Universal Resource Locator) sau calea la fiierul cu clasa applet-ului. Dac parametru lipsete, cutarea clasei se face n directorul curent (cel din care a fost ncrcat fiierul .*tml); VSPACE valoarea lui este nl[imea zonei (exprimat n pixeli) care se las liber deasupra i dedesubtul ferestrei applet-ului; HSPACE valoarea lui este l[imea zonei (exprimat n pixeli) care se las liber n stnga i n dreapta ferestrei applet-ului; ALT Specific textul ce trebuie afiat dac browser-ul n[elege marcajul <APPLET> dar nu poate rula applet-uri Java. NAME Ofer posibilitatea de a da un nume respectivei instan[e a applet-ului, astfel nct mai multe applet-uri aflate pe aceeai pagin s comunice ntre ele folosindu-se de numele lor. ALGN Semnific modalitatea de aliniere a applet-ului n pagina Web. Acest atribut poate primi una din urmtoarele valori: le1t+ rig*t+ top+ te%ttop+ middle+ absmiddle+ baseline+ bottom+ absbottom, semnifica[iile lor fiind aceleai ca i la marcajul 9.). Marcajul <PARAM> nu este obligatoriu i poate s apar atunci cnd se dorete ca applet-ul s preia parametrii. Un parametru este definit prin: NAME reprezint numele variabilei recunoscut de applet; VALUE reprezint valoarea recep[ionat de applet; este de tip String. D... 7(emple 12emplu ': Exemplific ordinea apelrii metodelor. 98 import java%.s&ing.'# import java.a&t.'# public class appA e%tends J(pplet{ public void init(){ Sstem.out.println(!Sunt in init!)# $ public void start(){ Sstem.out.println(!Sunt in start!)# $
public void paint()rap*ics g){ g.dra&String(!Sunt in paint!+ B-+ AB-)# Sstem.out.println(!Sunt in paint!)# $ public void stop(){ Sstem.out.println(!Sunt in stop!)# $ public void destro(){ Sstem.out.println(!Sunt in destro!)# $ $
Documentul .html este: G>Q.;> G>J(W> GQ9Q;J> Suma... GDQ9Q;J> GD>J(W> GS:W^> G(HH;JQ C:WJ@!suma.class! Z9WQ>@6-- >J9)>Q@B--> GH(T(. name@!m! value@!B!> GH(T(. name@!n! value@!6!> GD(HH;JQ> GDS:W^> GD>Q.;> 104 E. Inter!ee gra!ice E.1. Ce este o inter!a" gra!ic"? nterfa[a grafic se refer la toate tipurile de comunicare vizual ntre un program i utilizatorii si. nterfa[a grafic se refer nu numai la ceea ce utilizatorul vede pe ecran ci i la toate mecanismele de comunicare ntre acesta i program. Limbajul Java pune la dispozi[ie numeroase clase pentru implementarea diferitelor functionalit[i ale interfa[ei grafice, ns ne vom ocupa n continuare de acelea care permit realizarea unei intefe[e grafice cu utilizatorul (GU Nraphical Oser Interface). n principiu, crearea unei aplica[ii grafice presupune urmtorii pai: 1. crearea unei suprafe[e de afiare (cum ar fi o fereastr) pe care vor fi aezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc); 2. crearea i aezarea obiectelor grafice pe suprafa[a de afiare n pozi[iile corespunztoare; 3. definirea unor ac[iuni care trebuie s se execute n momentul cnd utilizatorul interac[ioneaz cu obiectele grafice ale aplica[iei; 4. "ascultarea" evenimentelor generate de obiecte n momentul interac[iunii cu utilizatorul i executarea ac[iunilor corespunztoare aa cum au fost ele definite. n Java exist dou pachete de clase care ofer servicii grafice: java.awt i java(.s&ing. n acest curs ne vom ocupa de pachetul Swing care este o extensie a pachetului awt. "Swing" a fost numele de cod dat proiectului care dezvolta componente noi. ncepnd cu java%.s&ing este numele pachetelor pentru Swing AP. 105 Majoritatea obiectelor grafice sunt subclase ale clasei <'omponent, clas care definete generic o component grafic care poate interac[iona cu utilizatorul. Aadar, printr-o component grafic vom n[elege orice obiect care are o reprezentare grafic ce poate fi afiat pe ecran i care poate interac[iona cu utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc. n general, toate componentele sunt definte de clase proprii ce se gsesc n pachetul java%.s&ing, clasa JComponent fiind superclasa abstract a tuturor acestor clase. Crearea obiectelor grafice nu realizeaz automat i afiarea lor pe ecran. Mai nti ele trebuie aezate pe o suprafa[ de afiare, care poate fi o fereastr sau suprafa[a unui applet, i vor deveni vizibile n momentul n care suprafa[a pe care sunt afiate va fi vizibil. O astfel de suprafa[ pe care se aeaz obiectele grafice reprezint o instan[ a unei clase ob[inut prin extensia clasei 'ontainer; din acest motiv suprafe[ele de afiare vor mai fi numite i containere. Clasa Container este o subclas aparte a clasei Component, fiind la rndul ei superclasa tuturor suprafe[elor de afiare Java (ferestre, applet-uri, etc). Pachetul Swing ofer programelor care folosesc componentele lui posibilitatea s-i aleag natura interfe[ei (,look and feel) sau, pur i simplu, s o conserve pe cea caracteristic platformei respective. E.2. 2rimele aplicaii 8&ing E.2.1. 7(emple 12emplu ': O aplica[ie de sine stttoare, care nu utilizeaz applet-ul. A. import java%.s&ing.'# B. import java.a&t.'# 6. import java.a&t.event.'# =. public class S&ingQest { ,. private static String Hre1i% @ !Numarul de clicN- uri8 !# <. private int nrClicN @ -# C. J;abel etic*eta @ ne& J;abel(Hre1i% ? !- !)# L. JSutton buton @ ne& JSutton(!Suton S&ing"!)# 7. A-. public Component crea3aComponente() { AA. buton.add(ction;istener(ne& (ction;istener() { 106 AB. public void actionHer1ormed((ctionJvent e) { A6. nrClicN??# A=. etic*eta.setQe%t(Hre1i% ? nrClicN)# A,. $ A<. $)# AC. JHanel panou @ ne& JHanel()# AL. panou.setSorder(SorderPactor.createJmptSorder( 6 -+6-+A-+6-))# A7. panou.set;aout(ne& Plo&;aout())# B-. panou.add(buton)# BA. panou.add(etic*eta)# BB. return panou# B6. $DDcrea3aComponente B=. B,. public static void main(String[] args) { B<. tr { BC. _9.anager.set;ooN(ndPeel( _9.anager.get;ooN(ndPeel()) # BL. $catc* (J%ception e) { $ B7. JPrame 1rame @ ne& JPrame(!Hrima aplicatie S&ing!)# 6-. S&ingQest app @ ne& S&ingQest()# 6A. Component comp @ app.crea3aComponente()# 6B. 1rame.getContentHane().add(comp)# 66. 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 6=. 1rame.pacN()# 6,. 1rame.setUisible(true)# 6<. $DDmain 6C. $DDclass n linia 17 se creaz un panel (panou) pe care vor fi aezate componentele. n linia 18 se seteaz marginea panel-ului cu dimensiunile pentru (sus, stnga, jos, dreapta). n linia 29 se creaz container-ul principal (din vrful ierarhiei) i n linia 32 se adaug componentele pe el. n liniile 3335 se ncheie setrile pentru frame i se afieaz. 12emplu ": O aplica[ie care utilizeaz applet-ul. A. import java%.s&ing.'# B. import java.a&t.'# 6. public class S&ing(ppletQest e%tends J(pplet { 107 =. public void init() { ,. J;abel etic*eta@ne& J;abel(!: etic*eta 1rumoasa"!)# <. etic*eta.set>ori3ontal(lignment(J;abel.CJNQJT)# C. label.setSorder(SorderPactor.create.atteSorder( A+A+ B+B+Color.blacN))# L. getContentHane().add(etic*eta+ Sorder;aout.CJNQJT)# 7. $ A-. $ E.2.2. Comentarea e(emplelor 9.2.2.1 Alegerea naturii interfeei n codul urmtor se specific natura interfe[ei: tr { =*>ana#er$set?ook0nd8eel( =*>ana#er$ #et?ook0nd8eel()); $ catc* (J%ception e) { $ 9.2.2.2 Setarea container-ului principal din !"rful ierar#iei$ Orice program care prezint o GU Swing con[ine cel pu[in un container Swing. n general, container-ele principale sunt instan[e ale lui JPrame, JWialog sau (pentru appleturi) J(pplet. Fiecare obiect JPrame implementeaz o singur fereastr principal, fiecare obiect JWialog cte o fereastr secundar i fiecare obiect J(pplet implementeaz un applet n cadrul unui browser. Container-ul principal Swing furnizeaz suportul necesar componentelor Swing pentru a fi afiate i pentru a manipula evenimentele. n exemplu 1 container-ul folosit este JPrame i este creat n linia 29. n exemplu 2 container-ul folosit este J(pplet (vezi linia 3). Aplica[iile Swing grupeaz etichetele i butoanele ntr-un container (un JHanel) nainte s le adauge pe frame. Adugarea componentelor pe panel nseamn c ele vor fi controlate de manager-ul de layout al panel-ului. Manager-ul de layout al unui container determin dimensiunea i pozi[ia fiecrei componente care este adugat pe container. 108 9.2.2.3 Manipularea e!enimentelor Aplica[ia din exemplu 1 con[ine dou evenimente tratate. Una trateaz click-ul pe buton (action events); cealalt trateaz nchiderea ferestrei (window events): button.add(ction;istener(ne& (ction;istener() { public void actionHer1ormed((ctionJvent e) { numClicNs??# label.setQe%t(labelHre1i% ? numClicNs)# $ $)# ... 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# E.+. Containere principale Dup cum am vzut, suprafe[ele de afiare ale componentelor grafice (containerele) sunt extensii ale clasei Container. Spre deosebire de un applet care i poate plasa componentele direct pe suprafa[a de afiare a browser-ului n care ruleaz, o aplica[ie independent are nevoie de propriile ferestre pe care s fac afiarea componentelor sale grafice. O astfel de suprafa[ pe care se aeaz obiectele grafice se numete supra,a-+ de a,iare sau container i reprezint o instan[ a unei clase ob[inut prin extensia superclasei 'ontainer. Cele mai importante containere principale sunt: JPrame+ JWialog+ JZindo& i J(pplet. erarhia de clase este: java.a&t.Container ]EE java.a&t.Hanel ]EE java.applet.(pplet ]EE java%.s&ing.<0pplet ]EE java.a&t.Zindo& ]EE java.a&t.Prame ] ]EE java%.s&ing.<8rame ]EE java.a&t.Wialog ] ]EE java%.s&ing.<)ialo# ]EE java%.s&ing.<;indow 109 E.+.1. Clasa <8rame Clasa <8rame este folosit pentru implementarea ferestrelor principale. Aceast component are caracteristic cadrul, bara de titlu i controalele ferestrei furnizate de sistemul de operare. Acestea nu pot fi modificate. Comportamentul ferestrelor (redimensionare, minimizare, pozi[ionare) este controlat de sistemul de operare. Constructorii clasei JPrame sunt: JPrame() construiete o fereastr, fr titlu, ini[ial invizibil. JPrame(String title) construiete o fereastr, cu titlu specificat, ini[ial invizibil. Aadar, o fereastr nou creat este invizibil. Pentru a fi fcut vizibil se va apela metoda s*o&(). 12emplu 4: Se construiete i se afieaz o fereastr cu titlul "Prima fereastra". import java%.s&ing.'# public class (plJPrame { public static void main(String args[]) { JPrame 1 @ ne& JPrame(!Hrima 1ereastra!)# 1.s*o&()# $ $ Cteva dintre metodele cele mai folosite ale clasei JPrame sunt prezentate n continuare. Metoda pacN() este folosit pentru a da o dimensiune frame-ului. O alternativ pentru pacN() este setarea explicit a dimensiunii frame-ului prin apelarea metodei setSi3e(). n general, folosirea lui pacN() este preferabil folosirii lui setSi3e(), deoarece pacN() las n seama layout manager-ului calculul dimensiunii frame-ului care [ine seama i de al[i factori care pot afecta dimensiunea componentelor. Metoda setUisible() este folosit pentru a afiarea frame-ului. Metoda getContentHane() returneaz obiectul contentPane al frame-ului. Orice component se adaug pe contentPane-ul frame-ului curent. 12emplu 5: 110 import java%.s&ing.'# import java.a&t.'# import java.a&t.event.'# public class (plicPrame{ public static void main(String[] args) { tr { _9.anager.set;ooN(ndPeel( _9.anager.get;ooN(ndPeel())# $ catc* (J%ception e) { $ D'Se crea3a container-ul principal (din var1ul ierar*iei) si se adauga componentele pe el'D JPrame 1rame @ ne& JPrame()# J;abel comp @ ne& J;abel(!etic*etaA!)# J;abel compA @ ne& J;abel(!etic*etaB!)# DDetic*etaB va 1i pusa peste etic*etaA 1rame.getContentHane().add(comp)# 1rame.getContentHane().add(compA)# 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 1rame.pacN()# 1rame.setUisible(true)# $ $ E.+.2. 6erestre secundare i clasa <)ialo# Pentru a crea ferestre secundare se folosete, de obicei, JWialog. Alte ferestre secundare pot fi create cu: J:ptionHane creeaz o fereastr standard de dialog Hrogress.onitor creeaz o fereastr care arat progresul unei opera[ii JColorC*ooser creeaz o fereastr pentru alegerea culorii JPileC*ooser creeaz o fereastr pentru selectarea unui fiier 12emplu 6: import java%.s&ing.'# import java.a&t.'# import java.a&t.event.'# public class (plicJ:ptionHane{ 111 public static void main(String[] args) { tr { _9.anager.set;ooN(ndPeel( _9.anager.get;ooN(ndPeel())# $ catc* (J%ception e) { $ JPrame 1rame @ ne& JPrame()# JSutton b@ne& JSutton(!(pasa-ma!)# 1rame.getContentHane().add(b)# b.add(ction;istener(ne& (ction;istener(){ public void actionHer1ormed((ctionJvent e) { J:ptionHane.s*o&.essageWialog(ne& Prame()+ !Pereastra de in1ormare!)# $ $)# 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 1rame.pacN()# 1rame.setUisible(true)# $ $ Fiecare fereastr secundar este dependent de una principal (de un frame). O fereastr de dialog poate fi modal. Dac este modal, ea blocheaz accesul la oricare alt fereastr din program. Cele mai simple ferestre modale pot fi create folosind una din metodele: J:ptionHane.s*o&.essageWialog fereastr modal nzestrat cu un buton. Se poate specifica mesajul, icoana i titlul ferestrei . J:ptionHane.s*o&:ptionWialog fereastr modal nzestrat cu butoane, mesaj, icoana i titlul ferestrei. Pot fi modificate de utilizator. 12emplu 7: :bject[] options @ {!Wa"""!+!Niciodata"""!+!Cine stie"""!$# int n@J:ptionHane.s*o&:ptionWialog( ne& Prame()+ !.a parasestiF!+ !Pereastra de :ptiuni!+ J:ptionHane.^JSEN:EC(NCJ;E:HQ9:N+ J:ptionHane.`_JSQ9:NE.JSS()J+ null+ options+ options[B])# 112 J:ptionHane.s*o&Con1irmWialog fereastr modal nzestrat cu dou butoane. 12emplu 8: J:ptionHane.s*o&Con1irmWialog( null+ !(lege un buton!+ !Pereastra de con1irmare!+ J:ptionHane.^JSEN:E:HQ9:N)# Parametrii folosi[i de aceste metode: parentComponent: poate fi frame-ul care con[ine fereastra de dialog (ea este afiat pornind de la coordonatele ferestrei printe) sau null (se folosete un frame implicit i fereastra de dialog este centrat pe ecran); message: mesajul care apare n fereastra de dialog; messageQpe: definete stilul mesajului. Valori posibile sunt: ERROR_MESSAGE NFORMATON_MESSAGE WARNNG_MESSAGE QUESTON_MESSAGE PLAN_MESSAGE optionQpe: definete mul[imea de butoane care apar pe fereastr: DEFAULT_OPTON YES_NO_OPTON YES_NO_CANCEL_OPTON OK_CANCEL_OPTON Pot fi folosite i alte tipuri de butoane; options: descriere detaliat a mul[imii butoanelor afiate pe fereastr; n general, este un vector de String-uri; icon: icoana a,iat+ pe ,ereastr+; title: titlul ferestrei; initialUalue: butonul selectat implicit. 113 Metodele s*o&.essageWialog, s*o&Con1irmWialog i s*o&:ptionWialog returneaz un ntreg semnificnd op[iunea utilizatorului. Valorile acestui ntreg pot fi ^JSE:HQ9:N, N:E:HQ9:N, C(NCJ;E:HQ9:N, :aE:HQ9:N i C;:SJWE:HQ9:N. Ferestre de dialog nemodale se pot crea cu J:ialog. <)ialo# este folosit pentru implementarea ferestrelor secundare (cum ar fi dialog bo%es i alert bo%es) i a celor utilitare. Aceast component are caracteristic cadrul i bara de titlu furnizate de sistemul de operare. Aduce nou fa[ de clasa Dialog suportul pentru opera[ia de nchidere implicit. 12emplu :: import java%.s&ing.'# import java.a&t.event.'# import java.a&t.'# public class Wialog{ public static void main(String a[]){ 1inal JPrame 1rame@ne& JPrame(!Prame-ul meu!)# Container contentHane @ 1rame.getContentHane()# contentHane.set;aout(ne& )rid;aout(A+A))# JSutton Suton @ ne& JSutton(!(pasa-ma"!)# contentHane.add(Suton)# Suton.add(ction;istener(ne& (ction;istener() { public void actionHer1ormed((ctionJvent e) { i1 (e.get(ctionCommand().eYuals(!(pasa-ma"!)) { 1inal JWialog dialog@ne& JWialog(1rame+ !: 1ereastra copil!+true)# Container c@dialog.getContentHane()# J;abel label@ne& J;abel(!Jtic*eta 1rumoasa!)# c.add(label)# dialog.pacN()# dialog.setUisible(true)# $ $ $)# 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 1rame.pacN()# 1rame.setUisible(true)# $ $ 114 E.+.+. Clasa <;indow Clasa JZindo& este folosit pentru implementarea ferestrelor pline (dreptunghiuri albe pline). Aceste ferestre nu con[in bar de titlu sau controale de fereastr. 12emplu ;: import java%.s&ing.'# import java.a&t.'# import java.a&t.event.'# public class (plicJZindo& { public static void main(String[] args) { tr { _9.anager.set;ooN(ndPeel( _9.anager.get;ooN(ndPeel())# $ catc* (J%ception e) { $ 1inal JPrame 1rame@ne& JPrame(!Prame-ul meu!)# Container contentHane @ 1rame.getContentHane()# contentHane.set;aout(ne& )rid;aout(A+A))# JSutton Suton @ ne& JSutton(!(pasa-ma"!)# contentHane.add(Suton)# Suton.add(ction;istener(ne& (ction;istener() { public void actionHer1ormed((ctionJvent e) { i1 (e.get(ctionCommand().eYuals(!(pasa-ma"!)) { JZindo& &in @ ne& JZindo&()# JTootHane pane@ne& JTootHane()# J;abel label@ne& J;abel(!*asd!)# pane.set;aout(ne& Plo&;aout())# pane.add(label)# &in.getContentHane().add(pane)# &in.setSi3e(B--+B--)# &in.setUisible(true)# $ $ $)# 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 1rame.pacN()# 1rame.setUisible(true)# $ $ 115 E.+.-. Clasa <0pplet Clasa J(pplet este folosit pentru implementarea applet-urilor. A se vedea exemplul 2. Forma containere-lor principale este ilustrat n figura urmtoare: E.-. Containere intermediare Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele intermediare folosesc la mpr[irea ferestrei n mai multe zone sau la gruparea componentelor. Swing furnizeaz urmtoarele containere intermediare: 2anel Este cel mai flexibil i frecvent utilizat container intermediar. Se implementeaz folosind clasa JHanel. Un panel grupeaz componentele dintr-o fereastr sau dintr-un alt panel. Un panel poate folosi orice layout manager i poate avea o margine (border). 116 8croll 2ane Furnizeaz scroll bar (orizontal i vertical) pentru componentele prea mari. 8plit 2ane Afieaz dou componente ntr-un spa[iu fix, oferind utilizatorului posibilitatea s redimensioneze fiecare component. 5abbed 2ane Con[ine mai multe componente dar afieaz numai una la un moment dat. Utilizatorul poate alege ntre componente. 5ool Par Grupeaz componentele (n general butoane) ntr-o linie sau o coloan, permi[nd utilizatorului s o mute oriunde. Forma containere-lor intermediare este ilustrat n figura urmtoare: 12emplu '$: Pentru JScrollHane JPrame 1rame @ ne& JPrame(!Woar un e%emplu!)# JQe%t(rea t @ ne& JQe%t(rea(B-+ =-)# JScrollHane scrpane@ne& JScrollHane(t)# 117 scrpane.setHre1erredSi3e(ne& Wimension(A--+ A--))# 1rame.getContentHane().add(scrpane)# 1or(int i@-#iGA--#i??) t.append(i?!5n!)#DD(ne& 9nteger(i)).toString())#
12emplu '': Pentru JSplitHane JPrame 1rame @ ne& JPrame(!Woar un e%emplu!)# JQe%t(rea t@ne& JQe%t(rea()# 1or(int i@-#iGA--#i??) t.append(i?!5n!)# J;abel label@ne& J;abel(!*jsdNljasldjasljdla1j!)# JSplitHane splitpane@ne& JSplitHane()# splitpane.set:neQouc*J%pandable(true)# splitpane.set;e1tComponent(t)# splitpane.setTig*tComponent(label)# splitpane.setHre1erredSi3e(ne& Wimension(A--+ A--))# 1rame.getContentHane().add(splitpane)# 12emplu '': Pentru JQabbedHane import java%.s&ing.JQabbedHane# import java%.s&ing.9mage9con# import java%.s&ing.J;abel# import java%.s&ing.JHanel# import java%.s&ing.JPrame# import java.a&t.'# import java.a&t.event.'# public class (plicQabbed e%tends JHanel { public (plicQabbed() { JQabbedHane tabbedHane @ ne& JQabbedHane()# Component panelA @ creareHanel(!Salut!)# tabbedHane.addQab(!_nu!+ panelA)# tabbedHane.setSelected9nde%(-)# Component panelB @ creareHanel(!Salut Salut!)# tabbedHane.addQab(!Woi!+ panelB)# Component panel6 @ creareHanel(!Salut Salut Salut!)# tabbedHane.addQab(!Qrei!+ panel6)# Component panel= @ creareHanel(!Salut Salut Salut Salut!)# tabbedHane.addQab(!Hatru!+ panel=)# DDSe adauga tabbed pane-ul pe panel. set;aout(ne& )rid;aout(A+ A))# add(tabbedHane)# 118 $ protected Component creareHanel(String te%t) { JHanel panel @ ne& JHanel(1alse)# J;abel label @ ne& J;abel(te%t)# label.set>ori3ontal(lignment(J;abel.CJNQJT)# panel.set;aout(ne& )rid;aout(A+ A))# panel.add(label)# return panel# $ public static void main(String[] args) { JPrame 1rame @ ne& JPrame(!J%emplu de QabbedHane!)# 1rame.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 1rame.getContentHane().add( ne& (plicQabbed()+ Sorder;aout.CJNQJT)# 1rame.setSi3e(=--+ AB,)# 1rame.setUisible(true)# $ $ Figura urmtoare ilustreaz execu[ia exemplului. E... 6olosirea gestionarilor de po*iionare >La%out /anager? Un program poate avea interfe[e diferite, chiar dac sunt folosite aceleai componente. Acest lucru se datoreaz folosirii a diferi[i gestionari de pozi[ionare care controleaz dimensiunea i pozi[iile componentelor. Aestionarea pozi-ion+rii este procesul prin care se determin dimensiunea i pozi[ia componentelor. mplicit, fiecare container are un gestionar de pozi-ionare un obiect care gestioneaz pozi[ionarea fiecrei componente de pe container. Acest obiect implementeaz interfa[a ;aout.anager. Acesta poate fi nlocuit cu altul care 119 s fie pe msura cerin[elor. n general, se seteaz gestionarul de pozi[ionare pentru dou tipuri de containere: contentpane (folosete implicit Sorder;aout) i JHanel (folosete implicit Plo&;aout). De cte ori se adaug o component pe container trebuie [inut cont de gestionarul de pozi[ionare al containerului respectiv. E...1. 8etarea po*iion"rii >La%out /anagerului? Pentru schimbarea layout manager-ului folosit de un container se apeleaz metoda set;aout. Metoda poate primi ca parametru orice instan[ a unei clase care implementeaz interfa[a ;aout.anager. Secven[a de ataare a unui gestionar pentru un container este: Plo&;aout gestionar @ ne& Plo&;aout()# container.set;aout(gestionar)# sau: container.set;aout(ne& Plo&;aout())# De exemplu: JHanel jp @ ne& JHanel()# jp.set;aout(ne& Sorder;aout())# Dac argumentul este null, container-ul nu folosete un layout manager. n acest caz trebuie specificate dimensiunile i pozi[iile fiecrei componente de pe container. Cei mai folosi[i gestionari n Java sunt: Sorder;aout, So%;aout, Plo&;aout, )ridSag;aout i )rid;aout. 9.%.1.1 &order'a(out Sorder;aout este layout manager-ul implicit pentru fiecare container principal. Un Sorder;aout are cinci zone n care pot fi aezate componentele: nord, sud, est, vest i centru. 12emplu '": A. import java%.s&ing.'# B. import java.a&t.'# 120 6. import java.a&t.event.'# =. public class (plicSorder;aout e%tends JPrame{ ,. public static void main(String[] args) { <. (plicSorder;aout 1@ne& (plicSorder;aout()# C. Container contentHane @ 1.getContentHane()# L. contentHane.set;aout(ne& Sorder;aout())# 7. contentHane.add(ne& JSutton(!Suton A N:TW!)+ Sorder;aout.N:TQ>)# A-. contentHane.add(ne& JSutton(!B CJNQT_!)+ Sorder;aout.CJNQJT)# AA. contentHane.add(ne& JSutton(!Suton 6 UJSQ!)+ Sorder;aout.ZJSQ)# AB. contentHane.add(ne& JSutton(!Suton = S_W!)+ Sorder;aout.S:_Q>)# A6. contentHane.add(ne& JSutton(!Suton , JSQ!)+ Sorder;aout.J(SQ)# A=. 1.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# A,. 1.setSi3e(=--+ AB,)# A<. 1.setUisible(true)# AC. $ AL. $ |innd cont c pentru frame-uri gestionarul implicit este BorderLayout, linia 8 nu mai este necesar. Rezultatul execu[iei acestui program este: 9.%.1.2 &o)'a(out Gestionarul So%;aout aeaz componentele pe o singur linie sau coloan. Respect dimensiunile minime ale componentelor i permite alinierea lor. 12emplu '4: import java%.s&ing.'# 121 import java.a&t.'# import java.a&t.event.'# public class (plicSo%;aout e%tends JPrame{ private static void adaugSut(String te%t+ Container container+ 1loat unde) { JSutton button @ ne& JSutton(te%t)# button.set(lignmentX(unde)# container.add(button)# $ public static void main(String[] args) { (plicSo%;aout 1@ne& (plicSo%;aout()# Container contentHane @ 1.getContentHane()# contentHane.set;aout(ne& So%;aout( contentHane+ So%;aout.^E(X9S))# adaugSut(!Suton A!+ contentHane+ Component.CJNQJTE(;9)N.JNQ)# adaugSut(!B!+ contentHane+Component.T9)>QE(;9)N.JNQ)# adaugSut(!Suton 6!+ contentHane+ Component.;JPQE(;9)N.JNQ)# adaugSut(!Suton = 1oarte lung!+ contentHane+ Component.CJNQJTE(;9)N.JNQ)# adaugSut(!Suton ,!+ contentHane+ Component.;JPQE(;9)N.JNQ)#
1.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)#$ $)# 1.pacN()# 1.setUisible(true)# $ $ Rezultatul execu[iei acestui program este: 122 9.%.1.3 *ard'a(out Clasa Card;aout permite implementarea unei arii care con[ine diferite componente la momente diferite. Tabbed pane-urile sunt containere intermediare care furnizeaz o func[ionalitate similar. Un Card;aout este n general controlat de un Combo Box, starea lui determinnd panel-ul de afiat. 12emplu '5: import java.a&t.'# import java.a&t.event.'# import java%.s&ing.'# public class (plicCardZindo& e%tends JPrame implements 9tem;istener { JHanel cards# String S_Q:NH(NJ; @ !Hanel cu Sutoane!# String QJXQH(NJ; @ !Hanel cu Qe%tPield-uri!# public (plicCardZindo&() { Container contentHane @ getContentHane()#
addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# 123 $ public void itemStateC*anged(9temJvent evt) { Card;aout cl @ (Card;aout)(cards.get;aout())# cl.s*o&(cards+ (String)evt.get9tem())# $ public static void main(String args[]) { (plicCardZindo& &indo& @ ne& (plicCardZindo&()# &indo&.setQitle(!Card;aout!)# &indo&.pacN()# &indo&.setUisible(true)# $ $ n imaginea urmtoare se vd cele dou stri ale ferestrei n func[ie de starea Combo Box-ului: 9.%.1.4 +lo,'a(out Plo&;aout este layout manager-ul implicit pentru orice JHanel. Aeaz componentele de la stnga spre dreapta, de sus n jos. 12emplu '6: import java%.s&ing.'# import java.a&t.'# import java.a&t.event.'# public class (plicPlo&;aout e%tends JPrame{ private static void adaugSut(String te%t+ Container container){ JSutton button @ ne& JSutton(te%t)# container.add(button)# $ public static void main(String[] args) { (plicPlo&;aout 1@ne& (plicPlo&;aout()# Container contentHane @ 1.getContentHane()# contentHane.set;aout(ne& Plo&;aout())# adaugSut(!Suton A!+ contentHane)# adaugSut(!B!+ contentHane)# adaugSut(!Suton 6!+ contentHane)# 124 adaugSut(!Suton = 1oarte lung!+ contentHane)# adaugSut(!Suton ,!+ contentHane)#
1.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)#$ $)# 1.pacN()# 1.setUisible(true)# $ } Rezultatul execu[iei acestui program este: 9.%.1.% -rid'a(out )rid;aout-ul aeaz componentele n celulele unui tabel. Fiecare component ocup tot locul disponibil din celul. Toate celulele au aceeai dimensiune. La redimesionarea ferestrei )rid;aout-ului, celulele i vor schimba dimensiunile astfel nct s fie ocupat tot spa[iul ferestrei. Clasa GridLayout are doi constructori: public )rid;aout(int rows+ int columns) public )rid;aout(int rows+ int columns+ int horizontalGap+ int verticalGap) Cel pu[in unul din cele dou argumente roBs i columns trebuie s fie nenul. Argumentele @orizontalAap i verticalAap din cel de-al doilea constructor permit specificarea numrului de pixeli dintre celule. mplicit ele au valoarea 0. 12emplu '7: import java%.s&ing.'# import java.a&t.'# import java.a&t.event.'# public class (plic)rid;aout e%tends JPrame{ public static void main(String[] args) { (plic)rid;aout 1@ne& (plic)rid;aout()# Container contentHane @ 1.getContentHane()# contentHane.set;aout(ne& )rid;aout(-+B))# 125 contentHane.add(ne& JSutton(!Suton A!))# contentHane.add(ne& JSutton(!B!))# contentHane.add(ne& JSutton(!Suton 6!))# contentHane.add(ne& JSutton(!Suton = 1oarte lung!))# contentHane.add(ne& JSutton(!Suton ,!))# 1.addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)#$ $)# 1.pacN()# 1.setUisible(true)# $ $ Rezultatul execu[iei acestui program este: Constructorul apelat creeaz o instan[ a lui )rid;aout care are dou coloane i oricte linii sunt necesare ne& )rid;aout(-+B). 9.%.1.. -rid&ag'a(out )ridSag;aout este cel mai sofisticat i flexibil layout manager pe care platforma Java l furnizeaz. Aeaz componentele n celulele unui tabel, fiecare component putnd s ocupe mai multe celule. Liniile / coloanele tabelului nu este obligatoriu s aib aceeai nl[ime / l[ime. Pentru fiecare component care se adaug pe fereastr se seteaz o serie de constrngeri prin crearea unui obiect al clasei )ridSagConstraints. Aceeai instan[ a lui )ridSagConstraints poate fi folosit pentru mai multe componente, chiar dac ele au constrngeri diferite. )ridSag;aout extrage valorile constrngerilor i nu refolosete )ridSagConstraints. Clasa con[ine urmtoarele atribute care pot fi setate: grid%+ grid Specific linia i coloana col[ului din stnga sus a componentei. Coloana cea mai din stnga are gridx=0 iar linia cea mai de sus are gridy=0. 126 grid&idt*+ grid*eig*t Reprezint numrul de coloane (pentru gridwidth) sau de linii (pentru gridheight) pe care va fi afiat componenta. Valoarea implicit este 1. 1ill Este folosit atunci cnd aria de afiare a componentei este mai mare dect dimensiunea cerut, pentru a determina cum poate fi redimensionat componenta. Valorile valide sunt: NONE (implicit), HORZONTAL (mrete componenta pe orizontal astfel nct s acopere ntreaga suprafa[ disponibil dar nu schimb nl[imea), VERTCAL (mrete componenta pe vertical astfel nct s acopere ntreaga suprafa[ disponibil dar nu schimb l[imea), BOTH (mrete componenta astfel nct s acopere ntreaga suprafa[ disponibil. ipad%+ ipad Folosite pentru redimensionarea celulelor. Specific ct trebuie adunat la dimensiunea minim a componentei. Valoarea implicit este 0. L[imea / nl[imea va avea valoarea minim plus ipadx*2 / ipady*2 pixeli (se aplic n ambele capete ale componentei). insets Specific distan[a dintre component i col[urile suprafe[ei pe care se afieaz. Valoarea atribuit este un obiect 9nsets. anc*or Este folosit atunci cnd componenta este mai mic dect suprafa[a pe care urmeaz s fie afiat, pentru a determina unde se plaseaz componenta. Valori valide sunt CENTER (implicit), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST i NORTHWEST. &eig*t%+ &eig*t Folosite pentru a determina modul n care s fie repartizat spa[iul dintre coloane / linii. Dac nu se specific nici o valoare (implicit este 0) atunci toate componentele vor fi grupate n centru container-ului deoarece )ridSag;aout pune orice spa[iu n plus ntre tabel i col[urile container-ului. 12emplu '8: import java.a&t.'# import java.a&t.event.'# import java%.s&ing.'# public class (plic)ridSag;aout e%tends JPrame { 1inal boolean s*ouldPill @ true# 1inal boolean s*ouldZeig*tX @ true# 127
buton @ ne& JSutton(!Suton A!)# i1 (s*ouldZeig*tX) { c.&eig*t% @ -.,# $ c.grid% @ -# c.grid @ -# gridbag.setConstraints(buton+ c)# DDconstrangerile impuse sunt atasate componentei contentHane.add(buton)# buton @ ne& JSutton(!B!)# c.grid% @ A# c.grid @ -# gridbag.setConstraints(buton+ c)# contentHane.add(buton)# buton @ ne& JSutton(!Suton 6!)# c.grid% @ B# c.grid @ -# gridbag.setConstraints(buton+ c)# contentHane.add(buton)# buton @ ne& JSutton(!Suton = 1oarte lung!)# c.ipad @ =-# DDsetea3a cu cat va creste inaltimea componentei c.&eig*t% @ -.-# c.grid&idt* @ 6# c.grid% @ -# c.grid @ A# gridbag.setConstraints(buton+ c)# contentHane.add(buton)# buton @ ne& JSutton(!Sutton ,!)# c.ipad @ -# DDse revine la inaltimea implicita c.&eig*t @ A.-# DDspatiu vertical intre celule suplimentar c.anc*or @ )ridSagConstraints.S:_Q># DDcomponenta va 1i plasata in partea de jos a 1erestrei c.insets @ ne& 9nsets(A-+-+-+-)# 128 c.grid% @ A# DDcomponenta se aliniea3a cu butonul B c.grid&idt* @ B# DDocupa latimea a doua butoane c.grid @ B# DDse a1la pe a treia linie gridbag.setConstraints(buton+ c)# contentHane.add(buton)# addZindo&;istener(ne& Zindo&(dapter() { public void &indo&Closing(Zindo&Jvent e) { Sstem.e%it(-)# $ $)# $ public static void main(String args[]) { (plic)ridSag;aout &indo& @ ne& (plic)ridSag;aout()# &indo&.setQitle(!J%emplu )ridSag;aout!)# &indo&.pacN()# &indo&.setUisible(true)# $ $ Rezultatul execu[iei acestui program este: E.0. 5ratarea evenimentelor Apsarea unei taste sau a unui buton al mouse-ului declaneaz un eveniment. Pentru a trata evenimentul este necesar un obiect care s implementeze interfa[a corespunztoare i s fie nregistrat ca un consumator de evenimente (event listener). Componentele Swing pot genera mai multe tipuri de evenimente. Cteva dintre interfe[ele corespunztoare ar fi: (ction;istener ac[iuni asupra unui control (click pe un buton, Enter dup introducerea unui text ntr- 129 un cmp, selectarea ntr-un meniu) Component;istener redimensionri, deplasri, ascunderi ale unei componente Pocus;istener preluare / pierdere focus 9tem;istener selec[ie / deselec[ie obiect n list, meniu, etc. Qe%t;istener modificarea textului din control (djustment;istener modificarea unei valori variind ntre dou limite (ex: ScrollBar) ae;istener ac[ionarea unei taste .ouse;istener apsarea butonului mouse-ului n timp ce cursorul se afl pe componenta respectiv .ouse.otion;istener drag; micarea mouse-ului pe o component Zindo&;istener nchidere, minimizare, maximizare etc. Container;istener adugare, tergere component ListSelectionListener schimbarea selec[iei ntr-o tabel sau ntr-o list Fiecare eveniment este reprezentat de un obiect care d informa[ii despre eveniment i identific sursa evenimentului. Fiecare generator de eveniment poate avea mai mul[i consumatori. generator obiect eveniment /----> consummator de eveniment de eveniment------------------------------------------> consummator de eveniment \----> consummator de eveniment Un eveniment, o dat aprut, este distribuit tuturor asculttorilor nregistra[i (nu este consumat numai de primul). Aa cum am spus mai devreme, pentru ca evenimentele unei componente s fie interceptate de ctre o instan[ a unei clase asculttor, aceast clas trebuie nregistrat n lista asculttorilor componentei respective. Am spus list, deoarece evenimentele unei componente pot fi ascultate de oricte clase - cu condi[ia ca acestea s fie nregistrate la componenta respectiv. nregistrarea unei clase n lista asculttorilor unei componente se face cu metode din clasa Component de tipul 130 addQQQListener, iar eliminarea ei din aceasta lista cu removeQQQListener unde CCC reprezint tipul evenimentului. E.0.1. 7(emplu de tratare a unui eveniment Sunt necesari urmtorii pai: 1. Clasa trebuie s implementeze interfa[a corespunztoare sau s extind o clas care implementeaz interfa[a. public class NumeClasa implements (ction;istener {...$
2. Scrierea codului care nregistreaz o instan[ a clasei (care va consuma evenimentul) ca i consumator pentru una sau mai multe componente. Componenta.add(ction;istener(instantaNumeClasa)#
3. Scrierea codul care implementeaz metodele din interfa[a consumator. public void actionHer1ormed((ctionJvent e) { //cod care reacioneaza la aciune $
public Qe%tZorNer(JQe%tPield t%t){ t*is.t%t@t%t# $
public void actionHer1ormed((ctionJvent e){ String c@e.get(ctionCommand()# i1(c.eYuals(!Sterge!)) t%t.setQe%t(!!)# i1(c.eYuals(!(ct.ajuscule!)){ String oldQe%t@t%t.getQe%t()# String uQe%t@oldQe%t.to_pperCase()# t%t.setQe%t(uQe%t)# $ i1(c.eYuals(!(ct.inuscule!)){ String oldQe%t@t%t.getQe%t()# 132 String lQe%t@oldQe%t.to;o&erCase()# t%t.setQe%t(lQe%t)# $ $ $ class ;istener e%tends JQe%t(rea implements (ction;istener+ Zindo&;istener{ public ;istener(){ super()# t*is.setJditable(1alse)# $ public void actionHer1ormed((ctionJvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&Closed(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&:pened(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&Closing(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&9coni1ied(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&Weiconi1ied(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&(ctivated(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ public void &indo&Weactivated(Zindo&Jvent e){ append(e.paramString()?! [ !?e.toString()?! ]5n!)# $ $ Rezultatul execu[iei programului este: E.1. 6olosirea componentelor E.1.1. Clasa JLabel 133 Un obiect de tip JLabel >etic#et"? reprezint o component pentru plasarea unui text pe o suprafa[ de afiare. O etichet este format dintr-o singur linie de text static ce nu poate fi modificat de ctre utilizator, dar poate fi modificat din program. E.1.2. Clasa JPutton Un obiect de tip JPutton >buton? reprezint o component pentru plasarea unui buton etichetat pe o suprafa[ de afiare. E.1.+. Clasa J5e(t6ield Un obiect de tip J5e(t6ield definete un control de editare a textului pe o singur linie. Este util pentru interogarea utilizatorului asupra unor valori. E.1.-. Clasa J5e(t4rea Un obiect de tip J5e(t4rea definete un control de editare a textului pe mai multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc . E.1... Clasa JC#ecRPo( Un obiect de tip JC#ecRbo( >comutator? reprezint o component care se poate afla n dou stri : "selectat" sau "neselectat" (on/off). Ac[iunea utilizatorului asupra unui comutator l trece pe acesta n starea complementar celei n care se gsea. Este folosit pentru a prelua o anumit op[iune de la utilizator. E.1.0. Clasa JAadioPutton Un obiect de tip JAadioPutton definete un grup de comutatoare din care doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio butoane. 134 E.1.1. Clasa JComboPo( Un obiect de tip JComboPo( definete o list" de opiuni din care utilizatorul poate selecta una singur. La un moment dat, din ntreaga lista doar o singur op[iune este vizibil, cea selectat. O component JComboBox este nso[it de un buton etichetat cu o sgeat vertical la apsarea cruia este afiat ntreaga sa list, pentru ca utilizatorul s poat selecta o anumit op[iune. E.1.D. Clasa JList Un obiect de tip JList definete o list" de opiuni care poate fi setat astfel nct utilizatorul s poat selecta o singur op[iune sau mai multe. Toate op[iunile listei sunt vizibile n limita dimensiunilor grafice ale componentei. E.1.E. Clasa J8crollPar Un obiect de tip J8crollbar definete o bar" de de!ilare vertical sau orizontal. Este util pentru punerea la dispozi[ie a utilizatorului a unei modalit[i sugestive de a alege o anumit valoare dintr-un interval. 1. ntroducere n limbajul de programare Java..................................................1 1.1. Ce este Java?......................................................................................... 1 1.2. Limbajul de programare Java ................................................................1 1.3. Java : un limbaj compilat i interpretat....................................................3 1.4. storia limbajului Java.............................................................................3 1.5. Mediul Java............................................................................................ 4 1.6. Crearea unei aplica[ii simple ..................................................................5 1.7. Crearea unui applet................................................................................6 2. Programarea Orientat pe Obiecte i Java...................................................7 2.1. Obiecte i clase...................................................................................... 7 2.2. Atribute i comportamente......................................................................8 2.2.1. Atribute............................................................................................. 8 2.2.2. Comportament.................................................................................9 135 2.3. Principiile OOP..................................................................................... 10 3. Elementele de baz ale limbajului de programare Java..............................11 3.1. Structura lexical a limbajului...............................................................11 3.1.1. Setul de caractere..........................................................................11 3.1.2. Cuvinte cheie.................................................................................11 3.1.3. dentificatori....................................................................................12 3.1.4. Constante....................................................................................... 12 3.1.5. Separatori...................................................................................... 13 3.1.6. Operatori........................................................................................ 13 3.1.7. Comentarii......................................................................................17 3.2. Tipuri de date........................................................................................ 17 3.3. Variabile................................................................................................ 18 3.4. nstruc[iuni............................................................................................ 20 3.4.1. nstruc[iunea vid...........................................................................20 3.4.2. nstruc[iuni de decizie.....................................................................20 3.4.3. nstruc[iuni repetitive......................................................................23 3.5. Tablouri (vectori)...................................................................................28 3.5.1. Tablouri (vectori) unidimensionale..................................................28 3.5.2. Tablouri (vectori) cu mai multe dimensiuni.....................................30 3.5.3. Dimensiunea unui vector ...............................................................30 3.5.4. Tablouri cu dimensiuni variabile.....................................................32 3.6. Siruri de caractere................................................................................32 4. Clase i obiecte n Java..............................................................................34 4.1. Referin[e............................................................................................... 34 4.2. Obiecte................................................................................................. 35 4.2.1. No[iuni generale.............................................................................35 4.2.2. Operatorul de atribuire =................................................................36 4.2.3. Operatorul de egalitate ==..............................................................38 4.3. Clase.................................................................................................... 39 4.3.1. Definirea claselor...........................................................................39 4.3.2. Variabile membru...........................................................................40 4.3.3. Metode........................................................................................... 42 4.3.3.1 Definirea metodelor..................................................................42 4.3.3.2 Modificatorii metodelor..............................................................42 136 4.3.3.3 Tipul returnat de o metod........................................................43 4.3.3.4 Parametrii unei metode.............................................................44 4.3.4. Constructorii unei clase..................................................................45 4.3.5. Obiectul this...................................................................................47 4.3.6. Suprancrcarea i supradefinirea metodelor.................................49 4.3.7. Modificatori de acces pentru membrii unei clase............................50 4.3.8. Membrii instan[ i membrii clas..................................................51 4.3.9. Argumente n linia de comand......................................................54 4.4. Motenirea............................................................................................56 4.4.1. Principiul motenirii........................................................................56 4.4.2. nterfe[e.......................................................................................... 60 4.5. Probleme..............................................................................................63 5. Pachete....................................................................................................... 71 5.1. mportul unui pachet, al unei clase sau a unei interfe[e........................72 5.2. Crearea unui pachet.............................................................................73 6. Excep[ii ...................................................................................................... 78 6.1. Aspecte generale..................................................................................78 6.2. nstruc[iunea try....................................................................................79 6.3. Crearea unei excep[ii............................................................................81 7. ntrri i ieiri ..............................................................................................85 7.1. Clasificarea fluxurilor............................................................................86 7.2. erarhia claselor pentru lucrul cu fluxuri................................................86 7.2.1. Fluxuri de caractere........................................................................86 7.2.2. Fluxuri de octe[i..............................................................................87 7.3. Superclasele de intrare / ieire.............................................................88 7.4. Crearea unui flux..................................................................................89 7.5. Citirea datelor de la tastatur................................................................90 7.5.1. Obiectul System.in.........................................................................90 7.5.2. Clasa nputStreamReader..............................................................91 7.5.3. Clasa BufferedReader....................................................................91 7.6. Citirea i scrierea datelor din fiier.......................................................92 7.6.1. Clasele FileReader i FileWriter ....................................................92 8. Applet-uri .................................................................................................... 94 8.1. Ce este un applet?................................................................................94 137 8.2. Func[iile unui applet .............................................................................95 8.3. Structura general a unui applet ..........................................................96 8.4. HTML.................................................................................................... 97 8.5. Exemple................................................................................................ 98 9. nterfe[e grafice......................................................................................... 105 9.1. Ce este o interfa[ grafic?.................................................................105 9.2. Primele aplica[ii Swing........................................................................106 9.2.1. Exemple....................................................................................... 106 9.2.2. Comentarea exemplelor...............................................................108 9.2.2.1 Alegerea naturii interfe[ei .......................................................108 9.2.2.2 Setarea container-ului principal (din vrful ierarhiei)...............108 9.2.2.3 Manipularea evenimentelor.....................................................109 9.3. Containere principale..........................................................................109 9.3.1. Clasa JFrame...............................................................................110 9.3.2. Ferestre secundare i clasa JDialog ...........................................111 9.3.3. Clasa JWindow ...........................................................................115 9.3.4. Clasa JApplet ..............................................................................116 9.4. Containere intermediare.....................................................................116 9.5. Folosirea gestionarilor de pozi[ionare (Layout Manager)....................119 9.5.1. Setarea pozi[ionrii (Layout Managerului)..................................120 9.5.1.1 BorderLayout..........................................................................120 9.5.1.2 BoxLayout...............................................................................121 9.5.1.3 CardLayout.............................................................................123 9.5.1.4 FlowLayout.............................................................................124 9.5.1.5 GridLayout .............................................................................125 9.5.1.6 GridBagLayout .......................................................................126 9.6. Tratarea evenimentelor ......................................................................129 9.6.1. Exemplu de tratare a unui eveniment ..........................................131 9.7. Folosirea componentelor....................................................................133 9.7.1. Clasa JLabel................................................................................133 9.7.2. Clasa JButton ..............................................................................134 9.7.3. Clasa JTextField .........................................................................134 9.7.4. Clasa JTextArea ..........................................................................134 9.7.5. Clasa JCheckBox.........................................................................134 138 9.7.6. Clasa JRadioButton .....................................................................134 9.7.7. Clasa JComboBox .......................................................................135 9.7.8. Clasa JList ...................................................................................135 9.7.9. Clasa JScrollBar ..........................................................................135 139