Sunteți pe pagina 1din 64

1.

Ce este Java un limbaj de programare, ale crui caliti i-au permis rspndirea rapid, fiind n prezent unul din limbajele cele mai larg folosite. un mediu de execuie pentru aplicaiile Java, numit n prezent n englez "Java 2 Runtime Environment", care conine maina virtual Java i un nucleu al bibliotecilor de clase Java; o platform pentru dezvoltarea de aplicaii n care se folosete limbajul Java, care se numete n prezent n englez "Java 2 Platform" i conine: o compilatorul Java (Java Compiler); o maina virtual Java (Java Virtual Machine); o bibliotecile de clase Java (Java Class Libraries); o vizualizatorul de appleturi Java (Java AppletViewer); o depanatorul Java (Java Debbuger) i alte instrumente de dezvoltare; o documentaia; o tehnologie software puternic i modern, care corespunde cerinelor lucrului n reele de calculatoare 2.Caracteristici ale limbajului Java Java este un limbaj de programare de utilizare larg , care are urmtoarele proprieti: este simplu : dei sintaxa se aseamn cu cea a limbajelor C/C++, au fost eliminate acele aspecte care constituiau surse de erori sau produceau confuzii ; este orientat pe obiecte : n limbajul Java nu este posibil s se scrie aplicaii care nu respect normele programrii orientate pe obiecte; este robust : programele scrise n Java sunt foarte fiabile, deoarece sunt prevzute numeroase verificri att la compilare, ct i n timpul executrii; este sigur : fiind destinat lucrului n reele de calculatoare, la realizarea sistemului Java s-a avut n vedere necesitatea ca programele s nu poat aduce daune calculatoarelor pe care ruleaz, cum ar fi accesul neautorizat la informaie sau chiar distrugerea acesteia; este portabil , adic programul poate fi mutat de pe un calculator pe altul, de alt tip hardware i/sau cu alt sistem de operare; este compilat i interpretat : programul surs, scris n limbajul Java, este translatat de ctre compilatorul Java ntr-un program intermediar sub form de cod de octei (engleza: bytecode). n timpul execuiei, acest cod de octei este interpretat de ctre maina virtual Java, care conine un interpretor ; este neutru fa de arhitectur : codul de octei generat de compilatorul Java nu depinde de arhitectura echipamentului pe care acesta va fi executat, deoarece el nu este executat direct de ctre procesorul hardware al acestui echipament, ci este interpretat de ctre maina virtual Java ; permite programarea concurent : n limbajul Java se pot scrie programe cu mai multe fire de execuie (engleza: multithreading ), care pot fi executate simultan i sincronizate; este dinamic , deoarece legarea ntre ele a claselor i obiectelor nu se face static (la compilare), ci dinamic (n momentul execuiei); este distribuit , adic permite realizarea de programe utilizabile n reele heterogene (care conin calculatoare de tipuri diferite); 3. Maina virtual Java -este, n general, implementat software sub forma unui produs program adecvat calculatorului pe care acesta se instaleaz.

Ideea de baz a limbajului i tehnologiei Java, este ca - pe baza acestora - s se poat creea produse software neutre fa de arhitectura sistemului de calcul, deci care s poat fi executate pe orice echipament, de la produse de uz casnic comandate numeric (televizoare, telefoane, maini de splat, frigidere, etc) pan la supercalculatoare. Ea se exprim prin

sloganul "Write Once, Run Anywhere" (scrie o singur dat i ruleaz oriunde), care arat c un program, dup ce a fost scris i compilat, poate fi executat (rulat) pe orice calculator . Pentru realizarea acestui obiectiv, s-a decis ca n tehnologia Java portabilitatea programelor sa se realizeze la nivel de cod de octei ( bytecode ), adic sub forma de cod binar destinat unui calculator abstract , numit maina virtual Java

4. Implementarea mainii virtuale Java De regul, arhitectura i setul de instruciuni al calculatorului, pe care se execut un program Java, difer de cele ale mainii virtuale Java. n consecin, codul de octei generat de compilatorul Java nu poate fi executat nemijlocit de procesorul (procesoarele) calculatorului pe care acesta se execut. Dac este realizat software (aa cum se ntampl n majoritatea cazurilor), maina virtual Java este ea nsi un produs program, care este scris i compilat special pentru tipul de calculator pe care se instaleaz, deci folosete setul de instruciuni nativ al acestuia. Acest produs program trebuie s respecte specificaia mainii virtuale Java , dar realizarea concret depinde de tipul de calculator pe care se instaleaz. Mai mult, pentru acelai calculator pot fi realizate mai multe maini virtuale Java, care toate respecta specificaia, dar difer ntre ele prin modul de realizare. n principiu, componenta principal a mainii virtuale Java este un interpretor , adic un program care parcurge instruciunile coninute n codul de octei Java din memoria mainii virtuale Java i le convertete n instruciuni native, care pot fi executate de procesorul calculatorului gazd. Aceast conversie necesit un anumit timp, din care cauz durata de execuie a unui program interpretat este intotdeauna mai mare dect a unuia compilat direct n codul nativ. Din aceast cauz, principala deficien care se semnala la primele implementri ale mainii virtuale Java era c durata de execuie a programelor era sensibil mai mare dect a celor scrise in limbaje "tradiionale" compilate, cum ar fi C, C++, Pascal, Fortran etc. Implementrile moderne ale mainii virtuale Java se caracterizeaz prin mrirea sensibil a vitezei de executie, care se apropie deja de cea a programelor compilate. Aceasta se realizeaz, n special, prin introducerea unei compilri "just in time ": codul de octei este compilat, n momentul execuiei, in cod nativ pentru calculatorul gazd i abia apoi este executat. Desigur c cea mai eficient reducere a duratei de execuie se produce atunci cnd maina virtual Java este implementata hardware, astfel nct codul de octeti Java (bztecode) este cod nativ al acestei maini. n acest caz, durata de execuie a programului este aceeai cu cea a unui program compilat tradiional. 5. Tipuri de produse software scrise n Java Limbajul Java este folosit cel mai frecvent pentru a scrie urmatoarele trei tipuri de programe: aplicaie - este un produs software care se instaleaz pe un anumit calculator i funcioneaz direct sub controlul sistemului de operare, avnd acces la toate resursele calculatorului respectiv. Una din clasele aplicaiei trebuie sa conin metoda principal , cu care ncepe execuia aplicatiei. Aceast metod se numete main i are forma: publi c static void main(String args[]) { // corpul metodei }

applet (miniaplicaie) - este un program care se transmite sub form de cod de octei (bytecode) prin reeaua de calculatoare i este executat n cadrul unui navigator (browser) de Web, fr a avea acces la fiierele sau sistemul de intrare/ieire al calculatorului pe care se execut; servlet - un program care se execut pe un server dein reea.

6. Introducere n programarea orientat pe obiecte Programarea orientat pe obiecte (POO) este o form de programare, n care programatorii definesc clase de obiecte, iar programul conine un ansamblu de clase i obiecte, care comunic ntre ele prin mesaje . Clasa este o extensie a conceptului de tip de date i conine o structur de date, mpreun cu metodele (functiile) care se aplica acestor date. Obiectul este o instantiere (o instanta) a clasei. In acelasi program se pot folosi mai multe obiecte apartinand aceleeasi clase, sau unor clase diferite. Fiecare obiect se caracterizeaza prin stare si comportament . Starea obiectului depinde de datele pe care acesta le contine, in timp ce comportamentul este dat de metodele clasei respective. In general, comunicarea prin mesaje consta in invocarea de metode. Daca obiectul a invoca o metoda a obiectului b, aceasta poate avea ca efect modificarea starii obiectului b (adica modificarea unor date continute in structura de date a lui b) si/sau poate primi o valoare intoarsa de metoda respectiva. Se considera ca, prin invocarea metodei, obiectul a a transmis un mesaj obiectului b, ceeace a provocat din partea acestuia un anumit raspuns (deci b a manifestat o anumita comportare). Atat variabilele, cat si metodele pot fi statice sau nestatice. Variabilele statice (ale clasei) apartin clasei, adica au aceeasi valoare pentru toate obiectele clasei respective. Variabilele de instanta (nestatice) apartin obiectului (instantei), deci au valori diferite de la un obiect la altul. Metodele statice (ale clasei) pot folosi numai variabilele statice ale clasei respective, in timp ce metodele nestatice pot folosi atat variabilele statice, cat si pe cele ale instantei. Din punct de vedere al modului de acces , datele si metodele unei clase pot fi publice sau private. Cele publice sunt accesibile din orice alta clasa, in timp ce cele private sunt accesibile numai din clasa careia ii apartin. 7. Sablon de aplicaie simpl n limbajul Java n prima parte a acestui curs, n aplicaiile fcute la curs i la laborator vom utiliza urmtorul ablon: class <nume_clasa> { public static void main(String args[]) { // corpul metodei main } }

Prile scrise cu negru (inclusiv parantezele i acoladele) le vom considera obligatorii, iar cele scrise cursiv cu rou sunt la latitudinea programatorului. <nume_clasa> - este numele clasei, fiind ales de ctre programator cu respectarea urmtoarelor condiii: - numele clasei trebuie s nceap cu o liter i este format numai din litere, cifre i - eventual - liniua de subliniere; - prin convenie (dei aceasta nu este o regul de sintax), numele de clas ncepe ntotdeauna cu o majuscul; - n cazul numelor compuse din mai multe cuvinte, fiecare cuvnt ncepe cu majuscul; - lungimea numelui nu este limitat, dar nu este recomandabil sa fie prea mare. // corpul metodei main - este o succesiune de instruciuni i comentarii care respect sintaxa limbajului Java

8. Editarea fisierului surs Pentru nceput, vom considera c aplicaia este constituit dintr-o singur clas, care respect ablonul indicat anterior . Programul surs pentru aceast clas va fi editat sub forma unui fiier separat, care are acelai nume cu clasa i are extensia .java. Pentru crearea fiierului se va folosi un editor de text simplu , care genereaz numai text neformatat, de exemplu "Notepad" daca lucrai sub Windows sau sub Linux cu WinLinux99, respectiv "Text Editor" sau "Advanced Editor", daca lucrai sub Linux cu KDE.

9. Compilarea i eliminarea erorilor semnalate de compilator Translatarea programului surs n program sub forma de cod de octei (bytecode) se face cu ajutorul compilatorului Java, numit javac. n acest scop, va deplasai n subdirectorul n care se gsete programul surs pe care dorii s-l compilai i dai comanda
javac <fisier_sursa>

Dup ce ai dat aceast comand, vei obine unul din urmtoarele rezultate:

1. Pe ecran apare din nou promptul sistemului de operare, fr a se afia un mesaj de


eroare. n acest caz, compilarea a decurs normal, iar dac dai comanda dir vei constata ca n subdirectorul curent a aprut un nou fiier, care poart numele clasei i extensia class. Acesta este fiierul care conine bytecode-ul clasei compilate. 2. Obinei un mesaj de eroare, care indic fie c exist erori n program, care au fost sesizate de compilator, fie c exist erori n linia de comand prin care ai cerut compilarea. n ambele cazuri, este necesar s eliminai erorile i s reluai compilarea 10. Executarea aplicaiei Dac n directorul curent exist fiierul <nume_aplicaie> .class, executarea acestei aplicaii se solicit prin comanda
java <nume_aplicaie>

Remarcm c se d ca parametru numai numele clasei, fr extensia class . Efectul acestei comenzi este, fie executarea aplicatiei, fie aparitia unui mesaj de eroare de execuie. Prin comanda java se pune n execuie interpretorul mainii virtuale Java. Acest interpretor verific dac n directorul curent exist fiierul <nume_aplicaie> .class . Daca acesta exist, ncarc n memorie codul de octei pe care l conine i pune n execuie metoda public static void main() . Dac fiierul nu exist, sau dac el nu conine o astfel de metod, se semnaleaz printr-un

mesaj de eroare.

11. ERORI LA COMPILARE SI INTERPRETARE Exemplul 1 de eroare Considerm c, dup ce ai creat fiierul surs PrimaAplicatie.java , dai comanda
jamac PrimaAplicatie.java

n care numele compilatorului este introdus greit (jamac n loc de javac). Ca efect, vei obtine un mesaj prin care se arat c cuvantul jamac nu este o comand corect (nu este numele unei comenzi interne a sistemului de operare sau numele unui program executabil), de exemplu:
jamac: command not found

Exemplul 2 de eroare S considerm acum c numele fiierului surs este introdus greit, de exemplu:
javac PimaAplicatie.java

n acest caz, mesajul de eroare este


can't read: PimaAplicatie.java

adic "nu pot citi: PimaAplicatie.java", ceeace nseamn c un astfel de fiier nu exist n directorul curent. Exemplul 3 de eroare S urmrim ce se ntmpl dac introducem comanda
javac PrimaAplicatie

n care numele fiierului este corect, dar lipeste extensia. n acest caz, obtinei urmtorul mesaj:
PrimaAplicatie is an invalid o ption or argument. usage: javac <options> <source files>

urmat de o lista de opiuni. Aceasta nseamn c nu s-a respectat sintaxa comenzii, care cere ca comanda javac s fie urmat (eventual) de una sau mai multe opiuni din lista dat, dup care trebuie s apar numele fiierului (fiierelor) surs care trebuie compilate. Aceste nume de fiiere trebuie sa conin obligatoriu extensia java 12. iruri irul se reprezint n program printr-o succesiune de caractere cuprins ntre ghilimele. Iat cteva exemple de iruri: "sir de caractere" "ABCDefgh" "1A23bc7" "*+_/?" "" Ultimul exemplu este un ir vid (care nu conine nici un caracter). 13.Operatii asupra sirurilor de caractere Concatenarea irurilor Asupra irurilor se poate aplica operaia de concatenare , reprezentata prin operatorul +. Expresia ir1 +ir2 , n care operatorul + este plasat ntre dou iruri, are ca rezultat un nou ir, care conine cele dou iruri-operanzi puse unul dup altul. De exemplu, expresia

"abcde"+"fgh" d ca rezultat irul "abcdefgh". Operaia de concatenare este asociativ, dar nu este comutativ. De exemplu, expresiile urmtoare sunt echivalente, ca urmare a asociativitii: "ABC"+"DEF"+"GH" ("ABC"+"DEF")+"GH" "ABC"+("DEF"+"GH") "ABCDEFGH" n schimb, expresia "uvw"+"ab" este echivalent cu "uvwab", n timp ce expresia "ab"+"uvw" este echivalent cu "abuvw", deci concatenarea nu este comutativ 14.Metode pentru afiarea pe ecran a irurilor n capitolul precedent, am folosit deja pentru afiarea irurilor de caractere metoda System.out.println( <ir> ) la care vom aduga acum i metoda System.out.print( <ir> ) n ambele metode, argumentul <ir> este un ir de caractere, care se afieaza pe ecran. Deosebirea dintre ele const n faptul c, dup afiarea irului, metoda println transmite i comanda de trecere la linie nou, n timp ce metoda print nu transmite o astfel de comand. n consecin, n cazul afirii cu println, urmtoarea afiare se va face de la nceput de linie nou, iar la afiarea cu print afiarea urmtoare se va face n continuare, pe aceeai linie. Numele metodei println provine de la print line , care se traduce prin "tiprete o linie". Metodele println si print aparin obiectului out din clasa System. n limbajul Java, clasa System conine metodele prin care se comunic cu sistemul de operare al calculatorului, iar obiectul out al acestei clase reprezint dispozitivul de ieire standard al sistemului , care este de obicei unitatea de afiare de la consol (ecranul). Metoda println actioneaz la fel ca metoda print, cu deosebirea c adaug la sfritul irului afiat caracterul de control \n care constituie comanda de trecere la linie nou ( New Line). 15. Unitile lexicale ale limbajului Java Unitile lexicale, numite i lexeme (engl. token, lexeme ) sunt construciile elementare ale limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumit semnificaie n limbaj. Dup rolul ndeplinit, unitile lexicale sunt: identificatori, cuvinte cheie, cuvinte rezervate, literali, separatori,operatori, comentarii i spaii.

16.Identificatori Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc identificatori . Identificatorii se aleg de ctre programator, respectnd anumite reguli. n limbajul Java, identificatorii sunt iruri formate din litere, cifre i caractere de subliniere ('_'), care ncep cu o liter. Lungimea identificatorului nu prezint importan, ns acesta nu poate conine spaii libere sau alte caractere, dect cele menionate aici.

17. Cuvinte cheie n orice limbaj de programare, exist un set de cuvinte, numite cuvinte cheie, care sunt considerate simboluri sintactice i nu pot fi folosite n program ca identificatori. n limbajul Java, exist urmtoarele cuvinte cheie : abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while

Dintre acestea, const i goto nu sunt folosite n prezent, dar ele au fost introduse n tabela cuvintelor cheie n vederea unei eventuale utilizri viitoare. Observm acum c toate exemplele de cuvinte cheie date la nceputul acestei seciuni (class, public, static, void) sunt prezente n tabela de mai sus.

18. Cuvinte rezervate Se consider cuvinte rezervate acele cuvinte, care nu pot fi folosite ca identificatori, avnd semnificaii speciale. Cuvintele cheie sunt i ele considerate n majoritatea limbajelor, inclusiv Java, drept cuvinte rezervate. n afar de acestea, n limbajul Java exist urmatoarele cuvinte rezervate: true, false, null. Primele dou sunt valorile logice adevrat i fals , iar al treilea are semnificaia de referin nul. De fapt, aceste cuvinte rezervate sunt forme speciale de literali . 19. Literali Literalii sunt reprezentrile n fiierele surs ale valorilor constante . Exemple de literali: - caractere: 'a', 'A', '+', '$', '5' ; - iruri de caractere: "sir de caractere", "abc$79.28#^z" ; - numere ntregi: 14726, -25413; - numere reale: 12.7389, -0.0 5673, 2.3075E12, -1.4237E-5 ; - valori logice: true, false ; - referina nul: null . 20. Separatori Separatorul este un caracter care delimiteaz formele sintactice sau le separ ntre ele. n limbajul Java se folosesc urmtorii separatori :
{ } ( ) [ ] ; , .

Spaiul liber i operatorii indeplinesc, de asemenea, rolul de separatori. Aproape toi aceti separatori au fost deja folosii n exemplele date n acest capitol.

21. Operatori Operatorii sunt simboluri ale unor o peraii. Am folosit deja simbolul + ca operator de concatenare (deci simbol al operaiei de concatenare). Operatorul poate fi format din unul sau mai multe caractere. Entitatea asupra creia se aplic operatorul se numete operand. Dup numrul de operanzi, operatorii pot fi unari, binari sau ternari. Din punct de vedere matematic, operatorii sunt funcii cu unul, dou sau trei argumente (argumentele fiind operanzii). De exemplu, expresia a+b , n care + este un operator binar, iar a i b sunt operanzi, este o funcie de argumente a si b, care are ca valoare suma valorilor celor dou argumente. Dup efectul operatorului asupra operanzilor , operatorii pot fi fr efect lateral, care lasa valorile operanzilor nemodificate, i cu efect lateral , care modific valorile operanzilor. Astfel, operatorul + din exemplul anterior, este un operator fr efect lateral. n schimb, n expresia ++a operatorul de incrementare ++ are efect lateral deoarece, n urma efectuarii operaiei, valoarea operandului a crete cu o unitate. 22. Comentarii in fisierul sursa Dup cum s-a aratat deja, n fiierele surs pot fi introduse comentarii , care au rolul de a da omului, care citete programul respectiv, anumite explicaii necesare pentru o mai buna nelegere a acestuia. Din punct de vedere sintactic, ntregul comentariu este privit ca o singur unitate lexical, care este ignorat de ctre compilator, deci nu are efect asupra codului de octei generat de acesta. 23. Spaii ntre unitile lexicale ale programului pot fi introduse orict de multe spaii libere , fr ca acestea s aib influen asupra sintaxei sau semanticii programului. Mai multe spaii libere succesive sunt tratate de compilator ca i cnd ar fi un singur spaiu. 24. Variabile In matematic, variabila este un simbol dat unei valori, care aparine unei mulimi de valori ce constituie domeniul de definiie al variabilei respective. n programare, variabila este un nume cruia i se asociaz o valoare . Numele variabilei este un identificator , iar valoarea variabilei trebuie s aparin unui anumit tip de date . Asupra valorilor variabilelor pot fi efectuate prin program anumite operaii . 25. Declararea i iniializarea variabilelor n limbajul Java, orice variabil trebuie declarat nainte de a fi utilizat . Prin declararea variabilei se nelege precizarea, pentru compilator, a tipului i numelui acesteia. Iniializarea variabilei se face atunci, cnd acesteia i se d pentru prima dat o valoare i deci i se aloc spaiu n memorie. Dac, la declararea variabilei, aceasta nu este i iniializat n mod explicit, atunci ea este iniializata cu o valoare implicit , care va fi specificat la descrierea fiecrui tip

26. Variabile finale n limbajul Java, se numesc variabile finale acele "variabile", ale cror valori nu pot fi modificate prin program. Acestea sunt deci, de fapt, nite constante cu nume . Ele se aseamn cu

variabilele propriu-zise prin faptul c sunt tot perechi nume - valoare, numai c valoarea lor se d o singur dat, sub forma de iniializare n declaraia de tip sau sub forma de atribuire, dup care nu mai poate fi modificat. Se obinuiete ca numele de variabile finale s fie scrise n ntregime cu majuscule. Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final , care este un cuvnt cheie 27. Tipul de date -este unul din conceptele fundamentale ale programrii calculatoarelor. Tipul de date este o mulime de valori, asociat cu o mulime de operaii care se pot face asupra valorilor respective. n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin. n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin. 28. Tipurile de date primitive sunt predefinite n limbaj. Aceasta nseamn c numele, mulimea de valori, mulimea de operaii i tipul rezultatului operaiilor pentu fiecare tip primitiv sunt impuse prin limbaj i, deci, nu trebuie definite i nu pot fi modificate de programator. Tipurile de date primitive n limbajul Java se clasific astfel:

tipul boolean; tipurile numerice o tipuri intregi: byte, short, int, long; o tipuri reale: float si double; o tipul char

Pentru fiecare tip de date vom arta reprezentarea extern, reprezentarea intern, operaiile i operatorii corespunztori. Prin reprezentare extern , nelegem regulile dup care se scriu valorile datelor respective n programe, n documente sau pe ecranul calculatorului. Reprezentarea extern a valorii ntr-un program se numete literal . Prin reprezentare intern , nelegem forma sub care datele respective apar n memoria mainii virtuale Java. O proprietate foarte important a reprezentrii interne a datelor este c aceasta, fiind destinat mainii virtuale Java, nu depinde de calculatorul concret pe care se va executa programul. 29. Operaia de atribuire Prin operaia de atribuire se d (se atribuie) unei variabile o nou valoare, care o nlocuiete pe cea deja existent. Operatorul de atribuire este = (semnul egal, care ns aici se citete " se atribuie ") este un operator binar cu efect lateral . Expresia a=b , n care a este o variabila, iar b este un operand care poate fi un literal, o variabil sau o expresie , are semnificaia " se atribuie variabilei a valoarea operandului b". Atribuirea este posibil numai daca valoarea operandului b este de acelasi tip cu variabila a, sau dac se poate converti implicit la acest tip. Atribuirea este o operaie cu efect lateral , deoarece produce modificarea valorii operandului situat n partea stnga a operatorului de atribuire.

30. Operaiile aritmetice Operaiile aritmetice sunt cele care se aplic unor operanzi numerici, avnd ca rezultate tot numere. Dup numrul de operanzi, ele pot fi unare sau binare. Unele operaii aritmetice unare au i efect lateral. Tipul rezultatului operaiilor aritmetice depinde de tipul operanzilor i va fi discutat la fiecare din tipurile numerice n parte.

31. Operaii de atribuire compus Urmnd tradiia limbajului C, n limbajul Java exist i operatori de atribuire compus, n care operaia de atribuire este combinat cu una din operaiile aritmetice. Operatorii de atribuire compus sunt urmtorii: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>= . Se observ c fiecare din aceti operatori are forma op= n care op este un operator aritmetic binar. Expresia
variabila op= operand

n care op este un operator aritmetic binar, este echivalent cu expresia


variabila = variabila op operand

i se evalueaz astfel: - se calculeaz mai nti valoarea expresiei (variabila op operand) n care variabila intr cu valoarea sa anterioar; - valoarea astfel calculat se atribuie ca noua valoare a variabilei din partea stnga. Aceasta noua valoare este, totodat, i valoare a expresiei. 32. Operatori binari Operatorii binari nu au efect lateral - deci nu modific valorile operanzilor - i sunt dai n tabela de mai jos.

Operator Expresie Operatie + * / % a+b a-b a*b a/b a%b adunare scadere

Valoarea expresiei suma valorilor operanzilor diferenta valorilor operanzilor

inmultire produsul valorilor operanzilor impartire catul (rezultatul impartirii) primului operand la al doilea modulo restul impartirii intregi a primului operand la al doilea

Prin mprire ntreag nelegem mprirea fcut astfel, nct ctul sa fie un numr ntreg (fr extragerea prii fracionare (situate dupa virgul).

33. Operaii de deplasare binar Urmnd "tradiia" limbajului C, limbajul Java conine i operatori de deplasare binar. Acetia sunt operatori binari (cu doi operanzi) fr efect lateral. Tipul rezultatului operaiei se stabilete la fel ca n cazul operaiilor aritmetice cu numere ntregi. Valoarea rezultat se stabilete astfel: se ia reprezentarea intern a primului operand i se deplaseaz la stnga sau la dreapta cu un numar de poziii binare egal cu cel de al doilea operand.

10

Operatorii de deplasare i efectele lor sunt prezentate n tabela de mai jos, n care a i s sunt operanzi care aparin unor tipuri ntregi.

Operator Expresie Efect << >> >>> a<<s a>>s deplasare la stnga cu s poziii binare deplasare la dreapta cu s poziii binare, cu conservarea semnului

a>>>s deplasare la dreapta fr semn , cu s poziii binare

Deplasarea la stnga cu s poziii este echivalenta cu nmulirea numrului cu 2 s. Dac s este suficient de mare, poate avea loc o depire binar, la fel ca n cazul nmulirii aritmetice (cu operatorul *). Deplasarea la dreapta cu s poziii cu operatorul >> este echivalenta cu mprirea ntreag la 2 s. Deplasarea biilor la dreapta cu s pozitii cu operatorul >>> are asupra numerelor pozitive acelai efect ca cel al operatorului >>. n schimb, n cazul operanzilor negativi, n cazul operatorului >>> nu se mai conserv semnul, iar modulul numrului se modific. Aceasta se ntmpl, ntruct pe poziiile eliberate din partea stng se nsereaz bitul 0.

34. Operatia de comparare Comparaiile sunt operaii binare fr efect lateral , n care se compar dou numere, obinnduse ca rezultat o valoare de tip boolean. Operatorii prin care se efectueaz comparaia a dou numere se numesc operatori relaionali i sunt dai n tabela de mai jos. Operator < <= > >= == != Semnificatie mai mic dect mai mic dect sau egal cu mai mare dect mai mare dect sau egal cu este egal cu este diferit de

35. Operaii logice pe bii Tot urmnd "tradiia" limbajelor C/C++, n limbajul Java se pot utiliza pentru tipurile de date ntregi i operatorii logici pe bii ~, &, | si ^. Acetia sunt operatori fr efect lateral. Operaiile logice se fac la nivel de bit, adic ntre fiecare bit al operandului din stnga i bitul corespunztor al operandului din dreapta, considerndu-se ca 0 este echivalent cu false , iar 1 este echivalent cu true. Operatorul unar ~ exprim negaia logic, deci nlocuirea lui 0 cu 1 i invers. Operatorii binari &, | si ^ acioneaz la fel ca n cazul tipului boolean, numai c se aplic la nivel de bit. Aciunea operatorilor este dat n tabela de mai jos, n care a i b sunt cei doi operanzi, iar ai si b isunt biii de pe pozitia i a acestor operanzi. n tabel se d efectul fiecrei operaii asupra

11

bitului i al rezultatului.

ai 0 0 1 1

bi 0 1 0 1

~a 1 1 0 0

a&b 0 0 0 1

a|b 0 1 1 1

a^b 0 1 1 0

36. Conversia de tip Dac este necesar, datele pot fi convertite dintr-un tip n altul. Dup caz, conversia se poate face implicit, sau poate fi cerut explicit prin program. 37. Conversia de tip implicit se face atunci cnd prin conversie nu se pierde informaie. De exemplu, dac n expresia a=b variabila a este de tip int, iar b este de tip short sau byte, valoarea variabilei b va fi automat convertit la tipul int nainte de atribuire. n tabela de mai jos sunt indicate cu X toate conversiile de tip care se pot realiza inplicit. n coloana din stnga este tipul datei care este supusa conversiei, iar n capul tabelei (pe prima linie) tipul ctre care se face conversia. byte byte short char int long float short X int X X X long X X X X float X X X X X double X X X X X X

De exemplu, tipul int se poate converti implicit n oricare din tipurile long, float sau double, dar nu i n tipurile byte sau short. 38. Conversia de tip explicit se face prin operatorul unar numit cast , care are forma ( tip), adic este format din numele tipului ctre care se face conversia, cuprins ntre paranteze. Acesta este un operator fr efect lateral , deci care nu modific valoarea operandului. De exemplu, expresia (byte)a se va folosi pentru a converti valoarea operandului a la tipul byte. Aceasta nseamn c valoarea variabilei a rmne neschimbat, ns valoarea expresiei (byte)a se obine din cea a lui a prin convertirea ei la tipul byte. Utilizarea operatorului cast se justific atunci cnd, n situaia respectiv, conversia implicit nu este posibil. Nu este ns greit dac folosim acest operator chiar i cnd conversia respectiv se poate face i implicit. 39. Tipuri numerice Sub aspect conceptual, datele care aparin acestor tipuri sunt numere , asupra crora pot fi aplicate operaiile aritmetice (adunare, scdere, nmulire, mprire) i operaiile de comparaie aritmetic (mai mic, mai mare, egal, diferit de).

12

Din punct de vedere matematic, aceste date pot fi numere ntregi sau reale. Existena mai multor tipuri n cadrul fiecreia din aceste dou categorii se datorete particularitilor de reprezentare a datelor n memorie. Tipurile de date numerice n Java sunt urmtoarele:

tipuri ntregi: byte, short, int, long; tipuri reale (n virgul mobil): float i double; tipul char

40. Tipuri de date ntregi Tipurile de date ntregi sunt byte, short, int, long i char . Conceptual, datele care aparin tipurilor byte, short, int i long sunt numere ntregi , n timp ce tipul char conine caractere (litere, cifre, semne de punctuaie etc). ntruct caracterele se codific n memoria calculatorului prin numere ntregi fr semn, n limbajul Java asupra lor se pot aplica toate operaiile pentru numere ntregi. Totusi, datorit particularitilor pe care le prezint, noi vom trata tipul char separat. 41. Tipul Boolean Mulimea de valori a acestui tip este {true, false} . Ea conine cele dou valori admise de logica boolean: true nseamn adevrat , iar false nseamn fals. Asupra datelor din acest tip pot fi aplicate operaiile de atribuire, de comparaie (== si != ) i operaiile algebrei booleene (operaiile logice). Operatorii booleeni Operatorul de negaie este un operator unar fr efect lateral i se reprezint prin simbolul ! (semnul exclamrii). Expresia !a, n care a este un operand boolean, se citete non-a i se interpreteaz ca negaia lui a: daca a are valoarea true, atunci !a are valoarea false i invers. Operatorii logici binari sunt operatori fr efect lateral, prin care se realizeaz operaiile logice I, SAU i SAU-EXCLUSIV. - Operatorii & si && realizeaza operatia logica I. Expresiile a&b i a&&b ,n care a i b sunt operanzi de tip boolean, are valoarea true (adevrat) dac i numai dac att a ct i b au valoarea true. n celelalte cazuri expresia are valoarea false. - Operatorii | si || realizeaz operaia logic SAU. Expresiile a|b i a||b , n care a i b sunt operanzi de tip boolean, are valoarea false dac i numai dac ambii operanzi au valoarea false . n celelalte cazuri expresia are valoarea true. - Operatorul ^ realizeaz operatia logic SAU-EXCLUSIV. Expresia a^b , n care a i b sunt operanzi de tip boolean, are valoarea true dac i numai dac cei doi operanzi au valori diferite (unul este adevrat, iar cellalt fals). Dac cei doi operanzi au valori identice, valoarea expresiei este false . 42. Operaii i operatori pentru date de tip ntreg Asupra datelor de tip ntreg se pot aplica operaii de atribuire, de conversie de tip, operaii aritmetice, de comparaie, operaii de deplasare binar, operaii logice pe bii i operaii de atribuire compus. Primele trei au fost discutate anterior i vom indica aici numai unele particulariti ale aplicrii lor n cazul datelor de tipuri ntregi.

13

Conversia de tip i atribuirea Diferitele tipuri de date ntregi difer ntre ele prin lungimea reprezentrii lor interne. La convertirea unui tip mai scurt n unul mai lung (de exemplu a unui byte sau short n int) valoarea numrului rmne neschimbat. Din aceast cauz, aceast conversie se poate face implicit. n schimb, la conversia de la o lungime mai mare la una mai mic, se rein numai octeii situai n partea dreapt a numrului, eliminndu-se octeii din stnga care depesc noua lungime. Prin aceasta este posibil s se modifice valoarea numrului i chiar semnul lui. Din aceast cauz, la efectuarea unor astfel de conversii, programatorul trebuie s-i asume raspunderea folosind operatorul cast.

43. Tipuri de date n virgul mobil Mulimile de valori pentru tipurile de date n virgul mobil Conceptual, datele care aparin acestor tipuri sunt numere reale. n limbajul Java exist dou tipuri de date reale (numite i tipuri de date flotante sau n virgul mobil): Tipul float double Lungimea 4 octeti (32 biti) 8 octeti (64 biti) Intervalul de valori [-3.402347e+38f, ... 3.402347e38f] [-1.7976931348623157e+308, ... 1.7976931348623157e308]

Reprezentarea extern a numerelor n virgul mobil se poate face n urmtoarele moduri: a/ ca numere reale fr exponent, n care partea ntreag este separat de cea fracionara prin punct; b/ ca numere reale cu exponent, n care un numr ntreg sau unul real fr exponent, numit mantisa sau coeficient, este urmat de un exponent zecimal, format din litera e sau E urmata de un numar intreg. Semnificaia este c mantisa se nmultete cu 10 ridicat la o putere egal cu exponentul. O caracteristic important a numerelor n virgul mobil este precizia. Se numete precizie numrul maxim de cifre semnificative pe care l poate avea mantisa pentru tipul de date respectiv. Aceasta depinde de numrul de bii alocai mantisei n reprezentarea intern. n cazul limbajului Java, datele de tip float pot avea cel mult 7 cifre semnificative, iar cele de tip double cel mult 16 cifre semnificative. n reprezentarea extern a numrului se pot folosi i mai multe cifre, dar cele care depesc lungimea admis nu vor fi luate n consideraie la conversia din forma extern n cea intern.

44. Tipul char Tipul de date char Datele de tip char sunt caractere, adic simboluri tipografice elementare: litere, cifre, semne de punctuaie, simboluri matematice, etc. n limbajul Java, reprezentarea intern a caracterelor se face pe 2 octei (16 bii), n sistemul Unicode. In acest sistem, caracterele sunt codificate n memoria intern prin numere ntregi pozitive n intervalul [0, 65535]. n fluxurile de date de intrare/ieire i n fiiere, caracterele pot fi reprezentate i n alte coduri. Codul cel mai frecvent folosit n aceste scopuri este ASCII, n care reprezentarea caracterelor se face pe un singur octet, deci prin numere ntregi fr semn n intervalul [0, 255]. Remarcm ca datele de tip char sunt singurul tip de date ntregi fr semn din limbajul Java, mulimea de valori a acestui tip de date fiind intervalul de numere naturale [0, 65535].

14

Reprezentarea extern a caracterelor se face n una din urmtoarele forme: a/ punnd caracterul respectiv ntre apostrofuri: 'a', 'B', '+', '(', '3', etc; b/ folosind o secven escape, n care apare codul numeric hexazecimal al caracterului respectiv, n Unicode, de ex: '\u006c' sau '\uffff'; ntr-o astfel de secven, codul numeric al caracterului (format din patru cifre hexazecimale) este precedat de \u; c/ folosind o secventa escape pentru caracterele speciale din urmatorul tabel:

Caracterul '\b' '\t' '\n' '\f' '\r' '\"' '\'' '\\'

Reprezentarea in Unicode '\u0008' '\u0009' '\u000a' '\u000c' '\u000d' '\u0022' '\u0027' '\u005c'

Semnificatia deplasare la stnga cu o poziie (backspace) tabulare orizontal (horizontal tab) trecere la linie nou (line feed, NL) salt la pagina nou (form feed) ntoarcerea carului (carriage return, CR) ghilimele (double quote) apostrof (single quote) bar invers (backslash)

Datele de tip char pot fi folosite n operaii numerice, n care caz ele sunt interpretate drept numere intregi fr semn, conform cu reprezentarea lor intern prin numere binare. Din acest motiv, n limbajul Java datele de tip char sunt incluse n categoria celor de tipuri ntregi. 45. Expresii cu date primitive n programare, expresia este o combinaie permis ("legal", corect) de simboluri, care reprezint o valoare. Tipul expresiei este acelai cu tipul valorii ei. Putem avea, deci, expresii de tip boolean, int, long, float, double etc. Fiecare limbaj de programare are regulile sale, prin care se stabilete ce expresii sunt permise sau nepermise. n limbajul Java, expresia poate conine literali, variabile, operatori, operanzi, funcii i paranteze i trebuie s poat fi evaluat (calculat), astfel nct s se obin o valoare. 46. Precedena operatorilor La evaluarea unei expresii, prezinta o importan deosebit ordinea n care se aplic operatorii pe care i conine, deoarece de aceast ordine poate s depind valoarea expresiei. n toate limbajele de programare, n care se folosesc expresii, se stabilesc i anumite reguli de preceden i de asociativitate, pe baza crora se stabilete ordinea de evaluare. Fiecrui operator i se asociaz o preceden, adic un nivel de prioritate n aplicarea operatorului respectiv. De exemplu, n expresia a+b*c operatorul * se va aplica naintea operatorului +, deoarece are precedena superioar. n consecin, aceasta expresie se va calcula ca i cnd ar fi scris sub forma a+(b*c). n limbajul Java, la stabilirea ordinii operaiilor se aplica urmtoarele reguli: - operatorii unari se aplic naintea celor binari; - expresiile din interiorul parantezelor se evalueaz naintea celor din exterior; - dac, ntr-o expresie, toi operatorii au acelai nivel de preceden, ei se aplic de la stnga la

15

dreapta; - operanzii unui operator se evalueaza nainte de a se aplica operatorul respectiv (deci operatorul se aplic ntotdeauna asupra valorilor operanzilor si); dac operaia este binar, operandul din partea stng se evalueaz naintea celui din partea dreapt; - nivelul de preceden al operatorilor se stabilete conform cu tabela de mai jos, n care:

toi operatorii din aceeai celul a tabelei au acelai nivel de preceden; operatorii de pe un nivel superior se aplic naintea celor de pe nivelurile inferioare.

47. Expresia condiional Urmnd "tradiia" limbajului C, n limbajul Java exist operatorul ternar (cu trei operanzi) ?: numit operatorul condiional, care este utilizat n cadrul urmtoarei expresii condiionale:
operand1 ? operand2 : operand3

unde: operand1 - expresie boolean; operand2 i operand3 - expresii de tipuri compatibile: fie ambii operanzi de tip boolean, fie ambii de tipuri numerice, fie ambii de tipuri referin. Evaluarea expresiei decurge astfel: - se evalueaz operand1 obinndu-se o valoare boolean; - dac operand1 are valoarea true, atunci valoarea expresiei condiionale este cea care se obine evalund operand2; altfel, este cea care se obine evalund operand3. 48. Instruciuni n limbajul Java, procesul de calcul este controlat de instruciuni (enunuri). Fiecare instruciune indic una sau mai multe aciuni pe care trebuie s le execute calculatorul. Corpul oricrei metode este constituit dintr-o succesiune de instruciuni. Executarea metodei const n executarea acestor instruciuni ntr-o ordine determinat. Instruciunile pot fi grupate n blocuri. Dup structura lor, instruciunile pot fi simple sau structurate. Instruciunile simple nu conin n interiorul lor alte instruciuni. Exist trei categorii principale de instruciuni (enunuri) simple: declaraiile de variabile locale, instruciunile-expresie i instruciunea vid. La scrierea lor se respect urmtoarele reguli:

toate instruciunile simple se termin cu caracterul ';' (punct i virgul). Instruciunea vid este format numai din acest caracter; declaraiile de variabile locale servesc pentru a specifica tipul, numele i (opional) valoarea iniial a variabilelor. Forma sintactic i utilizarea declaraiilor au fost prezentate anterior; instruciunile-expresie sunt formate dintr-o expresie de atribuire, de incrementare/decrementare sau de invocare de metod, urmat de caracterul ';'.

49. Principiile programrii structurate

16

Programarea structurat este o orientare n conceperea i alctuirea programelor, avnd ca obiectiv o mai bun gestionare a complexitii acestora, innd cont de particularitile gndirii umane. Conform metodei programrii structurate, la conceperea unui program, este recomandabil s se respecte urmtoarele principii: 1. Teorema de structur: orice program poate fi ntocmit folosind numai trei structuri de control fundamentale: structura secvenial, structura alternativ i structura repetitiv. 2. La conceperea programelor se recomand s se aplice tehnica de elaborare descendent (n englez Top-Down), numit i tehnica rafinrilor succesive. 3. Domeniile de valabilitate (de vizibilitate) ale variabilelor i structurilor de date trebuie s fie limitate. 50. Structura secvenial n mod "natural", se consider c instruciunile se execut n ordinea n care acestea figureaz n program. nlnuirea instruciunilor (transmiterea "controlului" de la o instruciune la alta) se face, n acest caz, conform schemei logice din figura 1. n pseudocod, aceeai secven de program se scrie astfel: <instruciunea_1> <instruciunea_2> .... <instruciunea_n> Exist, deci, un numr oarecare (n) de instruciuni, care se execut una dupa alta, n ordinea n care sunt scrise n program. 51. Structura alternativ (condiional, de decizie) Un fragment de program are structura alternativ (numit i structur condiional sau de decizie), atunci cnd se alege una din dou ci posibile, n funcie de modul n care este satisfcut sau nu o anumit condiie. Se observ c exist o asemnare ntre instruciunea alternativ i expresia condiional. n ambele cazuri se verific dac este satisfacut o condiie i - n funcie de rezultatul obtinut - se alege una din dou variante posibile. Deosebirea este urmtoarea: - n cazul expresiei condiionale se alege una din cele dou expresii coninute n aceasta, iar rezultatul obinut este valoarea expresiei astfel alese; - n cazul structurii de control alternative se alege una din cele doua instruciuni coninute n aceast structur; instruciunea astfel aleas este executat, iar rezultatul obinut este efectul (lateral) produs de executarea acestei instruciuni.

52. Instruciunea if Instruciunea if servete pentru realizarea structurii alternative din programarea structurat. Sub forma ei cea mai simpl, aceast instruciune se scrie astfel:
if(expresie_boolean) instruciune

unde instruciune poate fi orice instruciune valabil n limbajul Java: instruciune simpl sau structurat, inclusiv un bloc sau un alt if. Remarcm c n forma general de mai sus nu am pus la sfrit caracterul ';' (punct i virgul). Dac instruciune este o instruciune simpl, ea include i acest simbol.

17

Semnificaia instruciunii if este urmtoarea: dac valoarea expresiei booleene din parantez este true, atunci se execut instruciune, iar altfel nu se execut nimic, continundu-se programul. 53. Instruciunea if .. else Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma
if(expresie_boolean) instruciune_1 else instruciune_2

n care instruciune_1 i instruciune_2 pot fi instruciuni simple sau structurate. Interpretarea acestui if..else este urmtoarea: dac expresie_logic are valoarea true, atunci se execut instruciune_1, iar altfel se execut instruciune_2.

54. Structura repetitiv (ciclu, bucl) n cazul structurii de control repetitive, o instruciune sau o secven de instruciuni se repet ct timp este satisfacut o anumit condiie. Structura repetitiv fundamental, acceptat n teoria programrii structurate, este cea de ciclu cu test iniial. Schema logic a acestei structuri de control este dat n figura 3. Executarea acestei structuri are loc astfel: 1. se evalueaz expresia boolean care reprezint Condiia; 2. dac valoarea acestei expresii este true, deci condiia este satisfacut, se merge pe ramura DA i se executa instruciunea din corpul ciclului, dup care se trece la punctul 1; 3. altfel (deci dac condiia nu este satisfacut) se merge pe ramura NU i se iese din ciclu. Se observ, deci, c se va executa instruciunea n mod repetat, ct timp este satisfcut condiia. n pseudocod, aceast structur de control se programeaz astfel: ct_timp <condiie> execut <instruciune> sfrit_ciclu n unele versiuni de pseudocod, n loc de o singur <instruciune> se poate pune o secven de instruciuni. Dei, din punct de vedere al teoriei programrii structurate, ciclul cu test iniial este suficient ca structur repetitiv, n multe limbaje de programare (inclusiv Java), din motive de comoditate a programrii se admite i o a doua form de astfel de structur, numit ciclu cu test final. Schema logic a acestui ciclu este dat n figura 4. 55. Instruciunea switch Dei n teoria programrii structurate se demonstreaz c, pentru a realiza programe cu structur ramificat, este suficient s se foloseasc structura de control alternativ, realizat n limbajul Java prin instruciunea if..else, n practica programrii se admit i structuri de comutare sau de selecie,

18

care sunt prezente in diferite limbaje de programare. Aceste structuri permit s se aleag una din mai multe ramuri paralele,alegerea depinznd de valoarea unei expresii numit comutator sau selector. n acelai timp, ele respect principiul de baz al programrii structurate, conform cruia fiecare structur de control trebuie s aib un singur punct de intrare i un singur punct de ieire, astfel c se ncadreaz n aceast metod de elaborare a programelor. n limbajul Java, structura de comutare se realizeaz prin instruciunea switch, care are urmtoarea form general: switch (expresie) { case valoare_1: secven_1 [break;] case valoare_2: secven_2 [break;] .......................... case valoare_N: secven_N [default: secven ] } n care: - switch, case si default sunt cuvinte cheie ale limbajului Java; - expresie este o expresie de tip byte, short, int sau char; - valoare este fie un literal de tip byte, short, int sau char, fie o expresie constant de tip int, adic o expresie care conine numai literali sau variabile finale din tipurile menionate; - secvena este o secven de instruciuni simple sau structurate; - parantezele drepte roii []nu apar n program, ci indic faptul c coninutul lor este opional (poate sa lipseasc). 56. Instruciunea while (ciclul cu test iniial) Aceast instruciune are forma general while (condiie) instruciune n care condiie - este o expresie de tip boolean; instruciune - poate fi orice instruciune (simpl sau structurat) a limbajului Java, inclusiv alt instruciune while. Executarea acestei instruciuni se face astfel: se evalueaz expresia boolean condiie i - dac valoarea acesteia este true, deci condiia este satisfacut - se execut instruciune,dup care se revine la evaluarea condiiei. acest ciclu se repet ct timp este satisfacut condiia. 57. Instruciunea for (ciclul cu contor generalizat) n unele limbaje de programare, pentru realizarea ciclurilor la care numrul de pai este dinainte cunoscut, se folosete o instruciune de control special, numit "ciclu cu contor". n pseudocod, aceast instruciune poate fi scris n modul urmtor: pentru variabila de_la val_init la val_fin [cu_pasul pas] execut <instruciune sau secven de instruciuni> sfrit_ciclu

19

n care, de regul, variabila este o variabil (de regul de tip ntreg), numit i contorul ciclului, val_init i val_fin sunt respectiv valorile iniial i final ale acestei variabile, iar pas este pasul de variaie la fiecare parcurgere a ciclului. Pasul implicit este 1. n limbajul Java, urmnd tradiia limbajului C de la care acesta a preluat o bun parte a regulilor de sintax, se folosete o instructiune generalizat, prin care se realizeaz att ciclul cu contor, ct i ciclul cu test iniial. Aceast instruciune are forma: for ([iniializare] ; [condiie] ; [trecere_la_pasul_urmtor] ) [<instruciune_corp_ciclu>] n care:
iniializare ::= instructiune[,instructiune]*- este format din una sau mai multe instruciuni, separate prin virgule, care se execut nainte de intrarea n ciclu, astfel c sunt folosite, de regul, pentru iniializarea acestuia; condiie - este o expresie de tip boolean folosit drept condiie de continuare a ciclului cu test iniial (condiia este testata nainte de a se executa corpul ciclului; trecere_la_pasul_urmtor := instruciune[,instruciune]* - una sau mai multe instruciuni, separate prin virgule, care se execut dup ce a fost executat corpul ciclului. astfel c sunt, n general, folosite pentru pregtirea trecerii la urmtoarea parcurgere a ciclului; <instruciune_corp_ciclu> - o instruciune (simpla sau structurat) care constituie corpul ciclului.

58. Instruciunea do..while (ciclul cu test final) Forma general a instruciunii de control, prin care se realizeaz n limbajul Java ciclul cu test final este urmtoarea: do instruciune while (condiie); unde, la fel ca n cazul instruciunii while, condiie este o expresie de tip boolean, iar instruciune este orice instruciune (simpl sau structurat) din limbajul Java. Remarcm c la sfritul acestei instruciuni (dup condiie) se pune obligatoriu ';' (punct i virgul). Principala deosebire fa de instruciunea while pentru ciclul cu test iniial este c testarea condiiei se face dup ce a fost executat instruciunea din corpul ciclului. n consecin, corpul ciclului va fi executat cel puin o dat. 59. Variabile locale i domenii de vizibilitate Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate. 60. Tratarea excepiilor

20

n timpul executrii programului, pot apare anumite situaii care altereaza desfurarea normal a acestuia. Cnd apare o astfel de situaie, de regul, se genereaz o excepie sau o eroare prin care se semnaleaz incidentul care a avut loc. Excepiile i erorile pot fi generate att de echipamente (excepii sau erori hardware), ct i de programe (excepii software). Exemple de excepii hardware pot fi ntreruperile, excepia de mprire la zero, unele incidente din subsistemele de intrare/ieire etc. Excepiile software sunt mult mai diverse, depinznd de specificul programelor care le genereaz. Deosebirea dintre excepii i erori este c excepiile sunt considerate c pot fi tratate prin program, n timp ce erorile sunt considerate mai curnd nerecuperabile. n limbajul Java, exist posibilitatea de a se trata prin program diferitele excepii care apar n timpul execuiei. n acest fel, programatorul poate s prevad ci alternative de continuare a executrii programului, fr a mai fi necesar oprirea executrii lui. n mediul de lucru Java, la apariia unei excepii se genereaz un obiect special numit excepie, care conine informaia despre excepia respectiv. Acest obiect poate fi captat prin program, iar informaia coninut n el poate fi utilizat pentru a decide calea pe care se va merge n continuare n derularea programului. Toate obiectele de excepie care se refer la acela i tip de incident formeaz o clas de excepii. Tratarea prin program a excepiilor se face, n limbajul Java, folosind instruciunea try urmat de una sau mai multe clauze catch i, opional, de o clauz finally sub forma urmatoare:
try { secventa } catch (ClasaExceptie1variabila1) { secventa1 } catch (ClasaExceptie2 variabila2) { secventa2 } ............... catch (ClasaExceptieN variabilaN) { secventaN } [finally { secventa_finalizatoare }]

61. Variabile locale i domenii de vizibilitate Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate.

62. Instruciuni etichetate n principiu, orice instruciune n limbajul Java poate purta o etichet. Instruciunile etichetate au forma
etichet : instruciune

unde
etichet este un identificator; instruciune este o instruciune simpl sau structurat.

21

Exemplu alpha: x=2*a+b; Se permite s se foloseasc drept etichete chiar i identificatori care mai sunt folosii n acelasi program ca nume de variabile, clase, metode etc., far a se crea prin aceasta confuzii, deoarece compilatorul face distincie ntre etichete i nume n funcie de contextul n care acestea sunt utilizate. 63. Folosirea instruciunilor break i continue Instructiunile break i continue au forma general urmtoare: break [etichet]; continue [etichet]; unde etichet este eticheta unei instruciuni i este un identificator. Eticheta este opional (de aceea a fost scris de noi ntre paranteze drepte). Instructiunea break se poate folosi n corpul unei instruciuni switch, while, do..while sau for i are ca efect ieirea forat (abrupt) din structura de control n care se gsete instruciunea respectiv. Instruciunea continue se poate folosi numai n corpul ciclurilor (while, do..while, for). Dac instruciunea continue nu are etichet, efectul este c se trece peste restul instruciunilor din corpul ciclului, ncepnd din punctul n care se gsete instruciunea continue pn la sfritul acestuia, dar se continu executarea ciclului, adic se reia executarea corpului acestuia ct timp este satisfacut condiia de continuare. 64. Tipul referin n limbajul Java exist dou categorii de tipuri de date: tipuri primitive i clase. Tipurile primitive sunt predefinite n limbaj, n sensul c numele, mulimea de date, mulimea de operaii i reprezentarea datelor n memoria intern a mainii virtuale Java pentru fiecare tip sunt definite n insi specificaia limbajului Java i nu mai pot fi modificate de programatori. n program, datele de tipuri primitive apar sub forma de variabile. Fiecare variabil are un nume, un tip i o valoare i este plasat ntr-o anumita locaie de memorie. n locaia de memorie respectiv se gsete chiar valoarea variabilei. Pe programator nu il intereseaz ins adresa de memorie la care se gsete variabila, ci doar numele, tipul i valoarea acesteia. Clasele sunt tipuri de date structurate specifice programrii orientate pe obiecte. Clasele se definesc de programatori i se grupeaz n pachete de clase. La crearea unui program nou, programatorul poate utiliza clasele din pachetele deja existente, sau poate creea propriile sale clase. n program, fiecare clas poate avea mai multe instane, numite obiecte. 65. Clase, cmpuri, metode Clasa este o structur de date, asociat cu o colecie de proceduri sau funcii, metode, care utilizeaz datele din aceast structur. Datele unei clase se numesc cmpuri, sau variabile membre. Cmpurile pot fi statice (ale clasei) sau nestatice (ale instanei). Cnd clasa este instaniat, n memoria mainii virtuale Java se construiete un obiect (o instan a clasei respective). Obiectul conine numai cmpuri nestatice. Cmpurile statice se pstreaza n memorie ntr-un singur loc, care este rezervat clasei respective.

22

Metoda este o funcie, care ntoarce o valoare i poate avea, de asemenea, efect lateral. Ca i cmpurile, metodele pot fi statice (ale clasei) i nestatice (ale instanei). Metodele statice pot invoc numai cmpurile statice ale clasei respective, n timp ce metodele nestatice pot invoca att cmpurile statice, ct i pe cele nestatice (ale unei instane a clasei respective). Dac valoarea ntoars de metod este void, metoda respectiv este o procedur i trebuie s aib obligatoriu efect lateral. Invocarea unei metode statice (a clasei) se face printr-o expresie de forma nume_clasa.nume_metoda(parametri_efectivi) a crei valoare este valoarea ntoars de funcia respectiv. O astfel de invocare de funcie poate fi deci folosit ca o component ntr-o alt expresie. De exemplu, expresia Math.sqrt(a) serveste pentru a calcula rdcina patrat a lui a, n care scop este invocat funcia sqrt, care este o metod static a clasei Math (clasa funciilor matematice uzuale). Putem folosi aceast invocare de metod ntr-o expresie mai complicat, de exemplu x=2*Math.sin(a)+3; Invocarea unei metode nestatice (a instanei) se face sub forma referina_la_obiect.nume_metod(parametri_efectivi) deci numele metodei nu mai este calificat prin (nsoit de) numele clasei, ci prin cel al variabilei referin la obiectul respectiv, sau prin o expresie care are ca valoare o astfel de referin. De exemplu, daca r1 este o variabil referin care indic un anumit obiect din memorie, iar met(a)este o metod nestatic a clasei creia i aparine acest obiect, atunci r1.met(a) are ca efect invocarea metodei met pentru obiectul indicat de r1. n acest fel, metoda met(a) va folosi att cmpurile (nestatice ale) obiectului indicat de referina r1, ct i cmpurile (statice ale) clasei creia i aparine acest obiect. Dac o metoda are efect lateral, ea poate fi invocat i sub forma de instruciune. Aceast instruciune const numai din expresia de invocare a metodei, urmat de punct_i_virgul. n acest caz, valoarea ntoars de metod (valoarea expresiei) este ignorat, folosindu-se numai efectul lateral al metodei respective. Un exemplu cunoscut deja este instruciunea System.out.println(sir); Este evident c metodele care ntorc void (procedurile) pot fi invocate numai sub form de instruciuni, fiind folosite pentru efectul lor lateral. 66. Motenirea i polimorfismul Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte. Ea const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i superclas, iar clasele derivate se numesc i subclase. Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate cmpurile i metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm pot exista, de asemenea, cmpuri i/sau metode suplimentare. Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o metod a superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai nume i aceeasi lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un comportament diferit. 67. Constructori Constructorul este o procedur special, prin care se construiesc obiecte dintr-o anumit clas. Constructorul are ntotdeauna acelai nume cu clasa. n schimb, o clas poate avea mai muli constructori, care pot s difere ntre ei prin numrul i/sau tipul argumentelor. Constructorul aloc n

23

memoria dinamic spaiul necesar pentru un obiect din clasa creia i aparine i iniializeaz cmpurile acestui obiect cu valori care depind de argumentele sale. 68. Ierarhia de clase Java n general, n programarea orientat pe obiecte este permis motenirea multipl, adic o clas poate avea mai multe superclase. n limbajul Java este permis numai motenirea simpl, deci fiecare clas poate avea numai o singur superclas. Aceast ierarhie de clase este unic, adic orice clas are obligatoriu o superclas i numai una. Singura excepie o constituie clasa Object, care este rdcina ierarhiei de clase Java i nu are superclas. Vom arata ulterior c lipsa motenirii multiple este compensat n Java prin faptul c fiecare clasa poate avea mai multe interfee. 69. Pachetele de clase din Java API Clasele sunt grupate n pachete (englez: package). Pachetul este o colecie de clase reutilizabile destinate unui anumit domeniu de utilizare, care sunt puse la dispoziia programatorului sub form compilat (bytecode). Ar putea fi numit i "bibliotec de clase", dar autorii platformei Java au preferat denumirea de pachet. Pachetul poate avea subpachete. Daca pachetul p are subpachetul q, atunci p.q este numele complet (numele calificat) al subpachetului q. Acest subpachet poate avea, la rndul sau, alte subpachete. Java API (Application Programming Interface - interfaa de programare de aplicaii) este descrierea unui set standard de pachete necesare programrii n Java. Pentru pachetele coninute n Platforma Java 2 Standard Edition (J2SE) aceast documentaie poate fi gasit pe Internet la urmatoarea adres: java.sun.com/products/j2se/1.3/docs/api/index.html - la firma Sun Microsystems; Principalele pachete de clase sunt: java.lang - conine clasele de baz necesare programrii n limbajul Java; java.io - conine clasele necesare pentru programarea operaiilor de intrare/ieire; java.util - conine clase pentru anumite structuri de date tipice (list, stiv etc) i alte clase utile; java.awt si javax.swing - conin clase necesare pentru realizarea interfeelor grafice; java.applet - pentru programarea appleturilor. Exist ns i multe alte pachete, necesare n diferite domenii de aplicaie. 70. Declaraia import Pentru a putea utiliza ntr-un fiier-sursa Java un anumit pachet (subpachet) de clase, la nceputul fiierului respectiv trebuie pus declaraia
import nume_pachet.*;

n care nume_pachet este numele calificat al pachetului respectiv. De exemplu, pentru a utiliza orice clase din pachetul java.io se pune declaraia
import java.io.*;

Pentru clasele din pachetul java.lang nu este necesar o declaraie de import, acestea fiind importate implicit. Pentru a importa numai o anumita clas dintr-un pachet, se foloseste declaraia
import nume_pachet.NumeClasa; De exemplu, pentru a importa clasa File din pachetul java.io se folosete declaraia import java.io.File;

24

71. Utilizarea claselor din pachetul java.lang Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet nu este necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din pachetul java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet. Noi vom prezenta aici cteva clase mai frecvent utilizate. 72. Clasa Object Clasa Object este rdcina ierarhiei de clase a platformei Java. Este singura clas care nu are o superclas. Orice alt clasa este derivat direct sau indirect din clasa Object. Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori referine la orice fel de obiecte, indiferent de clasa creia i aparin. n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua aciuni specifice acestor clase. 73. Clase de excepii n pachetul java.lang exist i numeroase clase de excepii. Instanele acestor clase sunt creeate de ctre maina virtual Java atunci cnd se produce o excepie, adic o situaie anormal n procesul de calcul. Toate aceste clase sunt descrise n documentatia Java API. Vom meniona aici numai dou dintre ele, celelalte urmnd s fie indicate la descrierea claselor care conin metode care pot genera excepii. n limbajul Java se face distincie ntre excepie i eroare. Se consider ca excepiile sunt incidente care pot fi captate prin mecanismul try .. catch i pot fi deci tratate prin program, n timp ce erorile sunt incidente grave, care - de regul - nu pot fi tratate prin program ci produc oprirea executrii acestuia 74. Clasa Exception Aceast clas este rdcina ierarhiei claselor de excepii. n consecin, atunci cnd dorim ca in clauza catch sa fie captat orice fel de excepie, scriem aceast clauz sub forma catch(Exception e) { instructiuni_de_tratare_a_exceptiei e } unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori: public Exception() creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj. public Exception(String s) creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se indic, de regul, ce incident a condus la generarea excepiei respective. 75. Clasa Class O caracteristic important a limbajului i platformei Java este c clasele i interfeele utilizate n program sunt prezente n memoria mainii virtuale Java n timpul executrii programului, sub forma de instane ale clasei Class. n consecin, se pot obine n timpul executrii unui program informaii

25

despre clasele crora le aparin obiectele din memorie. Clasa Class nu are un constructor public. n schimb, putem obine un obiect din aceast clas folosind metoda getClass() a clasei Object. Exist i instane ale clasei Class pentru tipurile de date primitive. Acestea sunt coninute sub forma de cmpuri statice n clasele acoperitoare ale tipurilor primitive respective. Iat cteva dintre metodele clasei Class: public String getName() - ntoarce numele calificat al unei entiti (clase, interfee, tip primitiv) reprezentat de un obiect din clasa Class; public boolean isAssignableFrom(Class cls) - ntoarce true dac clasa creia i se aplic metoda este o superclas a clasei cls, primit ca argument; public boolean isInterface() - ntoarce true dac metoda este aplicat unei instane a clasei Class care reprezint o interfa; public boolean isPrimitive() - ntoarce true dac metoda este aplicat unui obiect din clasa Class care reprezint un tip de date primitiv; public Class getSuperclass() - ntoarce o instan a clasei Class care reprezint superclasa obiectului cruia i se aplic aceast metod. n fiierul TestClass.java este dat un program de testare a obinerii obiectelor Class i a aplicrii unora dintre metodele acestora. Descrierea complet a clasei Class este dat n documentaia Java API. 76. Clasa System Clasa System conine cmpuri i metode utile pentru realizarea legturii dintre aplicaie i sistemul de execuie Java (cel care implementeaz maina virtual Java). Aceast clas nu poate fi instaniat. 77. Tablouri Tabloul (n englez Array) este o structur de date de acelasi tip, numite componente ale tabloului, care sunt specificate prin indici. n programare, tabloul poate fi privit ca o colecie indexat de variabile de acelai tip. 78. Tablouri cu un singur indice Aceste tablouri corespund conceptului matematic de vector. Nu le vom numi totui astfel, pentru a nu face confuzie cu obiectele clasei Vector din pachetul java.util. Tabloul unidimensional este constituit dintr-un ansamblu de componente indexate (cu un singur indice), cruia i se asociaz i o variabila de tip int numita length, care reprezint lungimea tabloului (numrul de componente). Indicii elementelor de tablou sunt cuprini n intervalul [0, length-1]. Utilizarea unui indice situat n afara acestui interval genereaz o excepie. ntruct tablourile sunt obiecte, pentru indicarea lor n program se folosesc variabile referin. Declararea i iniializarea tablourilor cu un singur indice Variabilele referin la tablouri cu un singur indice pot fi declarate n dou moduri: a/ ntr-o declaraie de variabile se pune simbolul [] (o pereche de paranteze drepte) dup numele variabilei referin la tablou. Ca exemplu, s considerm declaraiile urmtoare:
int a, b, c[], d, e[];

26

String s1, ts1[], s2;

n aceste declaraii, a, b, i d sunt variabile simple de tip double, deci ele pot primi valori simple de acest tip, iar s1 i s2 sunt variabile referin la obiecte din clasa String (la iruri de caractere). n schimb, c[] i e[] sunt variabile referin la tablouri de tip int (tablouri la care toate componentele sunt de tip int), iar ts1[] este o variabil referin la un tablou cu componente din clasa String. b/ Parantezele se pun dup numele tipului de date sau al clasei, n care caz toate variabilele din declaraia respectiva sunt considerate drept referine la tablouri. De exemplu, n declaraiile
int[] i, j; long [] k, m; float []u, v; String[] ww; variabilele i, j, k, m, u, v, ww sunt referine la tablouri cu componente de tipuri corespunztoare fiecarei

declaraii. Remarcm c nu are importan dac parantezele sunt puse imediat dup numele tipului sau clasei (far spaiu liber) sau ntre acestea exist unul sau mai multe spaii. 79.Tablouri cu doi sau mai muli indici Tabloul cu N indici este considerat n limbajul Java drept un tablou de referine la tablouri cu N-1 indici. Vom exemplifica aceasta pentru cazul tabloului cu doi indici (bidimensional) i vom extinde apoi conceptul la tablouri cu mai mult de dou dimensiuni. Tablouri cu doi indici 80. Tablouri cu mai muli indici Modul de tratare al tablourilor cu doi indici poate fi extins i la tablouri cu mai muli indici (tablouri multidimensionale). Se are n vedere ca tabloul cu N indici conine referine la tablouri cu N-1 indici. De exemplu un tablou cu trei indici (tridimensional) poate fi considerat c conine mai multe "pagini", iar fiecare "pagin" este un tablou cu doi indici (bidimensional). n acest caz, primii doi indici specifica linia i, respeectiv, coloana, iar al treilea indice specifica "pagina" n care se gsete o anumit component. Un tablou cu patru indici poate fi asemnat cu un set de "volume", n care fiecare "volum" este un tablou cu trei indici, iar cel de al patrulea indice specifica numarul "volumului" din acest set. Putem sa ne imaginam astfel si semnificaii ale unor tablouri cu mai mult de patru indici. Totui, n practic, cele mai frecvent folosite tablouri au cel mult trei indici. 81. Tablouri eterogene Prin definiie, componentele unui tablou trebuie s fie toate de acelai tip. n programarea orientat pe obiecte, aceast restricie a fost "relaxat", n sensul c un tablou poate avea drept componente i obiecte aparinnd claselor descendente din clasa de baz. Faptul c clasa Object este superclas a oricrei alte clase din limbajul Java, inclusiv a claselor de tablouri, permite s se creeze tablouri eterogene, adic tablouri cu componente care aparin unor clase foarte diferite. Acestea pot fi structuri complicate de date, realizate pornind de la structura de "tablou de obiecte". 82. Utilizarea parametrilor din linia de comand A venit timpul s ne ocupm de argumentul args[] al metodei public static main(String args[]) Remarcm ca argumentul formal args[] al acestei metode este un tablou unidimensional, ale crui componente sunt din clasa String, deci sunt iruri de caractere. La lansarea n execuie a aplicaiei, acest argument preia drept componente de tablou parametrii din linia de comand prin care s-a fcut lansarea. Aceti parametri pot fi, astfel, folosii n program dup necesiti. 83. Declararea claselor Pn n prezent, s-a artat modul n care putem utiliza n programul nostru clase existente n biblioteci (n pachetele de clase). Vom studia n continuare cum putem crea propriile noastre clase.

27

Cea mai simpl form a unei declaraii de clas este urmtoarea: class NumeClasa { declaratii_de_membri } Observm c declaraia ncepe cu cuvntul-cheie class, urmat de numele clasei i de corpul clasei, cuprins ntre acolade. Numele clasei este un identificator. Se obisnuiete ca numele clasei sa nceap cu liter majuscul. Dac numele este compus din mai multe cuvinte, fiecare din acestea ncepe cu majuscul. Corpul clasei cuprinde declaraii de membri ai clasei respective. Acestea pot fi: - declaraii de cmpuri; - declaraii de constructori; - declaraii de metode. Nu este obligatoriu ca ntr-o clas s existe toate aceste categorii de declaraii. Pot exista, de exemplu, clase n care apar numai declaraii de metode. n principiu, pot exista i clase care conin numai cmpuri i nu conin metode, dei astfel de situaii apar foarte rar n practic. 84. Declararea cmpurilor Declaraiile de cmpuri servesc pentru a descrie structura de date specific clasei respective. Cmpurile se mai numesc i variabile membre i pot fi ale clasei sau ale instanei (ale obiectului). Se prefer denumirea de cmpuri, pentru a le deosebi de variabilele locale ale metodelor. Cmpurile instanei se declar la fel ca variabilele locale ale metodelor, numai c declaraia respectiv nu apare n blocul unei metode, ci n corpul clasei. De exemplu:
int m=172, n=2*m-4, r;

Aceste cmpuri pot avea valori diferite pentru fiecare instan a clasei respective. n consecin, cmpurile instanei sunt plasate n zona de memorie rezervat instanei respective , astfel c ele sunt distincte pentru fiecare instan. Cmpurile clasei se numesc i cmpuri statice. Declararea unor astfel de cmpuri se face asemntor cu cea a cmpurilor de instan, dar declaraia are n fa, n acest caz, modificatorul static. De exemplu:
static double u=3.65, v=2.87*u-3.1, x;

La iniializarea cmpurilor de instan se pot folosi att valori ale cmpurilor statice, ct i ale altor cmpuri de instan. n schimb, la iniializarea cmpurilor statice se pot folosi numai valori ale altor cmpuri statice. Cmpurile statice (ale clasei) sunt plasate n memorie n zona rezervat clasei creia i aparin i nu n cea rezervata instanelor. n consecin, cmpurile clasei exist n memorie ntr-un singur exemplar, care este accesibil fiecrei instane. Valorile iniiale implicite ale cmpurilor: dac nu sunt iniializate explicit, cmpurile statice i cele nestatice primesc valori implicite astfel: - cmpurile booleene primesc valoarea false; - cmpurile numerice primesc valoarea 0 (chiar i cele de tip char, care este tot tip numeric!); - cmpurile referina primesc valoarea null. Remarcm, deci, c exist o deosebire ntre crearea cmpurilor (variabilelor membre) i crearea variabilelor locale. La crearea cmpurilor, acestora li se atribuie implicit o valoare iniial, n timp ce la crearea variabilelor locale acestora trebuie sa li se atribuie valori n mod explicit. Dac o variabil local apare ntr-o expresie fr s aib o valoare atribuit anterior, compilatorul Java semnaleaza aceast situaie ca o eroare de programare.

28

85. Declararea metodelor n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i metodele prin care se trateaz aceste cmpuri. Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv. Cea mai simpl form sintactic a declaraiei de metod este urmtoarea:
tip_valoare_intoarsa nume_metoda(declaratii_de_argumente) { corpul_metodei }

n care:
tip_valoare_intoarsa - este tipul valorii primitive sau clasa valorii-referin ntoars de aceasta

metod;
nume_metoda- este un identificator care, n mod uzual, ncepe cu liter mic i constituie numele

metodei;
declaratii_de argumente - este o list de declaraii de argument separate prin virgul, deci ea poate

avea forma:
declaratie_argument1, declaratie_argument2, ... declaratie_argumentN

dar poate fi i vid. Lista declaraiilor de argument este cuprins ntre paranteze rotunde. Fiecare declaraie de argument are forma
tip_argument nume_argument

n care
tip_argument - este tipul sau clasa argumentului respectiv; nume_argument- este un identificator care, n mod uzual, ncepe cu liter mic.

Dup aceast list de argumente se deschide acolada unui bloc, care conine corpul metodei, adic secvena de instruciuni prin care se calculeaz valoarea funciei respective i/sau - dac este cazul se efectueaz aciunile care constituie efectele laterale ale acesteia. 86. Instruciunea return Dac funcia ntoarce o valoare (diferit de void), aceasta se indic prin instruciunea
return expresie;

Efectul acestei instruciuni este urmtorul: se evalueaza expresia expresie i se ncheie executarea funciei respective, ntorcnd valoarea astfel obinut. n consecin, chiar dac dup instruciunea return mai apar n corpul funciei respective i alte instruciuni, acestea nu vor mai fi executate. Dac metoda nu ntoarce o valoare (ntoarce void), folosirea instruciunii return nu este absolut necesar, ncheierea execuiei fcndu-se cnd se ajunge la acolada prin care se sfrsete blocul funciei. Totui, dac este necesar s se ncheie n mod abrupt executarea corpului funciei, se poate folosi instruciunea return fr expresie. 87. Metode statice La declararea metodelor statice, n faa tipului valorii ntoarse se pune modificatorul static. Metodele care conin n declaraie acest modificator se numesc statice sau ale clasei, spre deosebire de metodele obinuite care sunt ale instanei. n corpul metodelor statice se pot folosi numai cmpurile statice ale clasei respective i se pot invoca numai alte metode statice ale acestei clase. 88. Metode cu acelai nume. Signatura metodei n aceeai clas pot exista mai multe metode cu acelai nume, cu condiia ca ele s difere prin numrul i/sau tipul argumentelor. Pentru a deosebi ntre ele astfel de metode, s-a introdus conceptul de signatur.

29

Signatura metodei const din numele acesteia, nsoit de lista de argumente. n consecin, dou metode pot avea acelai nume, dac difer ntre ele prin signatur. Putem da exemple din clasele existente n pachetele deja studiate.

89. Transferul de parametri ctre metode La invocarea unei metode, este necesar s se transmit de la metoda care invoc la metoda invocat parametrii (argumentele) acesteia. De exemplu, la executarea invocrii Math.sin(a), este necesar s se transmit ctre metoda sin argumentul acesteia, a. n teoria i practica programrii se cunosc diferite moduri n car se poate face transmiterea argumentelor ctre o funcie sau procedur: - transmitere prin valoare: de la programul apelant ctre funcie (procedur) se transmit valorile argumentelor; - transmitere prin adresa: de la programul apelant ctre funcie (procedur) se transmit adresele la care se gsesc n memorie valorile argumentelor; - transmitere prin nume: de la programul apelant ctre funcie (procedur) se transmit numele argumentelor; - transmitere prin referin: de la programul apelant la funcie (procedur) se transmit referine ctre argumente. n limbajul Java, transmiterea parametrilor (argumentelor) metodelor se face prin valoare. Aceasta nseamn c: - dac argumentul aparine unui tip de date primitiv, se transmite chiar valoarea primitiv a argumentului respectiv; - dac argumentul aparine unui tip-referin (este instan a unei clase), se transmite - de fapt - o referin ctre un obiect din clasa respectiva sau dintr-o clasa derivat din aceasta.

90. Metode recursive. Comparaie ntre iteraie i recursie O metod (funcie sau procedur) care se invoc pe sine nsi se numete metod recursiv. Dou sau mai multe metode care se invoc una pe alta (metoda A invoc metoda B i reciproc) se numesc mutual recursive. Limbajul Java permite utilizarea metodelor recursive i mutual recursive. Vom ilustra aceasta prin exemple. Vom arta, de asemenea c, de regul, aceleai funcii pot fi calculate att recursiv, ct i iterativ (folosind cicluri). n general, n limbajele funcionale se utilizeaz predominant funciile recursive, n timp ce n limbajele procedurale se prefera iteraia, dei n unele dintre ele (cum este i limbajul Java) se pot folosi att iteraia, ct i recursia. Remarcam c, la fel ca n cazul ciclurilor iterative, n metodele recursive trebuie s existe o condiie de oprire a repetrii. n caz contrar recursia ar continua pn la depirea spaiului de memorie alocat pentru memorarea datelor intermediare (numit stiv). Comparnd metodele recursive cu cele iterative se constat c: - metodele recursive sunt "mai elegante", fiind i mai uor de ineles de ctre om dect cele iterative; - din punct de vedere computaional, metodele iterative sunt mai eficiente, deoarece solicit mai puin memorie i sunt mai rapide dect cele recursive. Deosebirea este cu att mai mare, cu ct numrul de invocari succesive, respectiv de repetri, este mai mare.

30

91. Instruciunea throw Cunoatem deja c, la apariia anumitor anomalii n executarea programului, maina virtual Java genereaz excepii. Excepiile sunt obiecte din clasa Exception s-au dintr-o subclas a acesteia. Este posibil ca programatorul s prevad, n anumite puncte ale programului, generarea unor excepii, folosind n acest scop instruciunea throw, care are forma urmtoare:
throw new ConstructorExceptie(lista_argumente);

n limba englez, throw este imperativul de la "a arunca". n aceast instruciune, se folosete operatorul new pentru a genera un obiect al clasei de excepii creia i aparine constructorul invocat, dup care acest obiect este "aruncat", fie pentru a fi "prins" (captat) printr-o structura try .. catch i tratat prin program, fie pentru a fi preluat de maina virtual Java care, n acest caz, oprete execuia programului. 92. Clauza throws n mod normal, excepiile generate ntr-o metod sunt tratate prin structuri try .. catch. chiar n metoda n care au fost generate. Este ns posibil ca metoda respectiv s "arunce" mai departe excepiile generate n corpul ei. Pentru a indica aceast proprietate, la declararea metodei, dup paranteza care conine lista declaraiilor argumentelor formale se pune clauza throws ClasaDeExceptii, n care se indic numele clasei excepiei care este "aruncat" ctre metoda invocatoare (Cuvantul throws este persoana a treia singular a verbului to throw, "a arunca"). 93. Clase publice Clasele publice sunt clase care pot fi utilizate i n alte pachete, dect cel din care fac parte. Fiecare clas public se declar ntr-un fiier separat, care are obligatoriu acelai nume cu cel al clasei i extensia java. n declaraia de clas, n faa numelui clasei se pune modificatorul public. Dm n continuare ca exemplu clasa Complex. 94. Colectorul de reziduuri Dac un obiect nu mai este necesar, el poate fi distrus, adic eliminat din memorie. n maina virtual Java, exist un colector de reziduuri de memorie (englez: garbage collector) care elibereaz automat spaiul de memorie ocupat de obiectele ctre care nu mai exist nici o referin. n consecin, programatorul nu mai este pus n situaia s prevad explicit n program distrugerea obiectelor i, deci clasele nu mai conin destructori, ca n alte limbaje de POO. 95. Metoda finalize n clasa Object exista metoda protected void finalize() throws Throwable Aceasta metod este invocat de colectorul de reziduuri, atunci cnd acesta determin c nu mai exist referine ctre obiectul respectiv. n clasa Object, aceast metod nu efectueaz nimic. Metoda finalize poate fi redefinit n orice alt clas, pentru a elibera resurse sau a efectua orice alte aciuni necesare nainte de distrugerea obiectului respectiv. De exemplu, dac obiectul respectiv a deschis anumite fiiere sau conexiuni externe, n metoda finalize se poate efectua nchiderea lor.

31

Metoda finalize nu este apelat explicit n programul de aplicaie. Apelarea metodei finalize se face numai de ctre colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rmas fr referin, ci abia atinci cnd acest obiect a "intrat n atenia" colectorului. Este posibil ca executarea aplicaiei s se incheie nainte ca "finalizarea" unor obiecte s aib loc.

96. Caracteristicile obiectelor i claselor n majoritatea surselor bibliografice asupra POO, se consider drept principale caracteristici ale obiectelor ncapsularea, motenirea i polimorfismul. La acestea se mai pot adaug i alte caracteristici importante, cum sunt identitatea, agregarea i clasificarea. Identitatea (englez: Identity) se refer la faptul c datele sunt grupate n entiti discrete, numite obiecte. Fiecare obiect din POO modeleaz starea i comportamentul unui anumit obiect din lumea real, care poate fi un obiect fizic (de exemplu automobil, calculator, furnal, om, animal etc.) sau unul conceptual (de exemplu figur geometric, orar etc.). Fiecare obiect are propria lui identitate, astfel c dou obiecte sunt considerate distincte, chiar daca atributele lor (cum ar fi numele, culoarea etc.), sunt identice. Pentru a face aceasta distincie, obiectul este indicat printr-o referin unic. Modul n care este reprezentata aceast referin poate sa difere n diverse limbaje de programare (de ex. adres de memorie, nume etc.), important ns este c fiecare obiect are o singur referin i nu exist dou obiecte distincte cu aceeai referin. ncapsularea (englez: encapsulation) este proprietatea obiectelor de a-i ascunde o parte din date i metode. Din exteriorul obiectului sunt accesibile ("vizibile") numai datele i metodele publice. Putem deci sa ne imaginm obiectul ca fiind format din dou straturi, ca n Figura 1. Agregarea (englez: aggregation) este proprietatea obiectelor de a putea ncorpora alte obiecte. Aa dar, "datele" coninute ntr-un obiect pot fi nu numai date primitive, ci i obiecte. Se pot astfel crea obiecte cu structuri din ce n ce mai complexe. Clasificarea (englez: classification) este proprietatea obiectelor care au aceeai structur de date i acelai comportament (aceleai metode) de a putea fi grupate ntr-o clas. Clasa este o abstractizare, care conine acele proprieti ale obiectelor, care sunt importante ntr-o aplicaie sau ntr-o categorie de aplicaii, i le ignor pe celelalte. De exemplu, n aplicaii privind situaia profesional a studenilor, clasa Student conine astfel de atribute ca numele i prenumele studentului, facultatea, anul de studii, examenele promovate i notele obinute, dar ignor atribute ca nlimea, culoarea ochilor sau a prului, greutatea etc., care nu sunt necesare n aplicaia respectiv. Spre deosebire de agregare, care este o relaie ntre obiecte, clasificarea este o relaie ntre concepte reprezentate prin clase. Motenirea (englez: inheritance) este proprietatea unei clase de a conine toate atributele (cmpurile) i metodele superclasei sale. n consecin, trecerea de la clas la subclas se face prin adugarea de atribute i/sau de metode. De exemplu, clasa Barbat i clasa Femeie au ambele toate atributele clasei Om, dar fiecare din acestea are i atribute specifice. n general, n programarea orientat pe obiecte, motentirea poate fi simpl sau multipl. n cazul motenirii simple fiecare clas are cel mult o superclas,

32

Polimorfismul (englez: polymorphism) permite ca aceeai operaie s se realizeze n mod diferit n clase diferite. S considerm, de exemplu, c n clasa Figura_geometrica exist metoda arie(), care calculeaza aria figurii respective. Clasele Cerc, Triunghi, Patrat sunt subclase ale clasei Figura_geometrica si vor moteni, deci, de la aceasta metoda arie(). Este ns evident c aria cercului se calculeaz n alt mod dect aria patratului sau cea a triunghiului. Pentru fiecare din instanele acestor clase, la calcularea ariei se va aplica metoda specific clasei respective.

98. Modificatori de acces pentru cmpuri i metode n limbajul Java exist trei modificatori de acces pentru cmpuri i metode: - private - pentru a specifica cmpuri sau metode private; - public - pentru a specifica cmpuri sau metode publice; - protected - pentru a specifica cmpuri sau metode protejate (care vor fi prezentate n seciunea despre motenire). Membrii privati ai claselor (cmpuri sau metode) sunt accesibili numai din clasa respectiv. Membrii publici sunt accesibili din orice clas. Membrii protejati sunt accesibili numai din clasa n care se afl sau din subclasele acesteia. Dac la declararea cmpurilor sau metodelor nu se folosesc modificatori de acces, acestea sunt considerate vizibile numai din clasele care sunt situate n acelai pachet cu clasa creia i aparin. n particular, pentru clasele declarate de ctre noi, aceste cmpuri i metode sunt vizibile numai din clasele situate pe disc n acelai director. Se spune, n astfel de cazuri, c modul de acces este prietenos (englez: friendly) sau de pachet (englez: package).

99. Referinele this i super n orice clas pot fi utilizate dou referine predefinite: this - este o referin la "aceast" instan, adic la instana (obiectul) din care se face referina respectiv; super - este o referin la superclas. 100. Declararea clasei derivate. Clauza extends n declaraia clasei derivate (subclasei), numele clasei care se declar este urmat de clauza extends, n care se indic numele superclasei. n consecin, clasa derivat poate fi declarat astfel: class NumeClasa extends NumeSuperclasa { declaratii_de_membri } Amintim c n limbajul Java orice clas are o superclas i numai una. Excepie face clasa Object, care este rdcina ierarhiei de clase. Daca lipsete clauza extends, superclasa implicit este Object.

101. Declararea constructorului clasei derivate Pentru a se da valori iniiale cmpurilor superclasei, n declaraia constructorului subclasei poate fi invocat constructorul superclasei prin instruciunea
super(lista_parametri_efectivi);

unde lista parametrilor efectivi este cea a constructorului superclasei. Aceasta instruciune, dac exist, trebuie s fie prima instruciune din corpul constructorului clasei derivate. n lipsa ei, va fi invocat constructorul fr parametri al superclasei.

33

Este posibil, de asemenea, ca ntr-un constructor s se invoce alt constructor al aceleeai clase, sub forma
this(lista_parametri_efectivi);

102. Metode finale Metodele finale sunt metode care nu mai pot fi redefinite n clasele derivate. Astfel de metode se declar cu modificatorul final. De exemplu, n clasa Object, metoda getClass este o metoda final, fiind declarat sub forma public final Class getClass(). Aceasta inseamn c n nici o alt clas nu este posibil ca aceasta metod s fie redefinit. Cnd declarm propriile noastre clase, avem i noi posibilitatea s declarm c unele din metodele lor sunt finale. 103. Clase finale Dac se dorete ca o clas s nu poat avea subclase, la declararea acesteia se folosete modificatorul final. De exemplu, dac se dorea ca clasa CD1, dat ca exemplu mai sus, s fie finala, ea trebuia declarata sub forma public final class CD1 extends S1 sau, dac nu se dorea sa fie publica, sub forma final class CD1 extends S1 104. Redefinirea metodelor Metodele de instan (nestatice) ale unei clase pot fi redefinite n subclasele acesteia. Redefinirea unei metode se face declarnd n subclas o metod avnd aceeai signatur cu una din superclas. Atunci cnd se redefinete o metoda protejat, modificatorul de acces al acesteia poate fi meninut, sau poate fi transformat n public. n subclas pot fi folosite, totui, i metodele superclasei care au fost redefinite, dac la invocarea acestor metode se foloseste referina super. 105. Ascunderea cmpurilor Cmpurile declarate ntr-o clas pot fi ascunse prin cmpuri cu acelai nume declarate n subclas, chiar dac acestea au tipuri diferite. Aceasta nseamna c, n mod normal, n metodele clasei se folosesc cmpurile declarate n clasa respectiv, i nu cele cu acelai nume ale superclasei. n subclas pot fi, totui, folosite i cmpurile superclasei, dac sunt calificate cu referina super. 106. Ascunderea metodelor statice Metodele statice nu aparin instanelor, ci clasei. Din aceast cauz, dac ntr-o subclas se declara o metoda static cu aceeai signatur ca o metod a superclasei, atunci se spune c metoda din subclas o ascunde pe cea din superclas (nu o redefinete). Modul de lucru cu metodele ascunse este similar cu cel n care se lucreaz cu cmpurile ascunse. Vom nelege mai bine deosebirea dintre redefinire i ascundere cnd vom studia polimorfismul.

107. Instanierea clasei care conine metoda main Clasa care conine metoda main este clasa principal a unei aplicaii, deci este prima clas care se ncarc n maina virtual Java la punerea n execuie a aplicaiei respective. n acelai timp, ea este o clas ca oricare alta, care poate avea i instane. Metoda main(), fiind static, nu poate utiliza direct dect cmpurile statice i metodele statice ale acestei clase. Totui, n metoda main() sau n alte metode, pot fi create instane ale acestei clase, putndu-se astfel utiliza i cmpurile i metodele de

34

instan ale acestora. 108. Clase abstracte Clasele abstracte conin n declaraia lor modificatorul abstract. Clasele abstracte nu pot fi instaniate. Remarcm nsa c pot exista clase care nu pot fi instaniate dei nu sunt abstracte, cum sunt, de exemplu, clasele care nu au dect constructori privai. Cu toate c clasa abstract nu poate fi instaniat, se pot declara variabile aparinnd unor clase abstracte. Acestor variabile li se pot da nsa ca valori numai referine ctre instane ale unor subclase concrete. De exemplu, daca A este o clas abstracta, iar B este o subclas concreta a clasei A, atunci este corect declaraia
A a1=new B();

Declararea unei metode abstracte: - antetul metodei trebuie sa conina modificatorul abstract; - corpul metodei se nlocuiete prin caracterul ';' (punct i virgul). 109. Interfee Conform principiului ncapsulrii, fiecare clas are "interfaa" sa intrinsec, prin care poate fi accesata din exterior. Aceasta "interfa" conine toate datele i metodele publice ale clasei respective. Pentru a compensa lipsa motenirii multiple, n limbajul Java s-a admis c o clas poate avea mai multe interfee i c mai multe clase pot implementa aceeai interfa. S-a introdus astfel o nou categorie de componente, numite interfee, care se declar n mod asemntor cu nite clase abstracte, dar nu sunt nglobate, aa cum sunt clasele abstracte, n ierarhia unic de clase . Interfaa este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie sa le aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe interfee, ea conine toate metodele publice i variabilele finale publice ale acestora. Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la obiecte aparinnd unei clase, adic sub forma: interfaa nume_variabila1[=initializare1], ..., nume_variabilaN[=initializareN]; n care interfaa este numele unei interfee, iar celelalte elemente ale declaraiei sunt aceleai ca n cazul declarrii de referine la obiecte. Interfeele pot fi i ele organizate ierarhic, aplicndu-se principiul motenirii. n schimb, pentru interfee, ierarhia nu mai este unic, aa cum este n cazul claselor, i se admite motenirea multipl. v4=(B)w1; 110. Declararea interfeelor O declaraie de interfa introduce un nou tip referin, ai crui membri sunt cmpuri statice finale i metode abstracte. n consecin, interfaa se aseamn cu o clasa abstract pur, care nu conine dect metode abstracte i cmpuri statice finale i nu se ncadreaz n ierarhia unic de clase descendente din Object (amintim ca o clasa abstract, n afar de una sau mai multe metode abstracte, poate conine i cmpuri de date i metode concrete i este descendent a clasei Object).

35

Dei nu se ncadreaz n ierarhia claselor, interfeele se pot constitui in diverse ierarhii de interfee, aplicndu-li-se principiul mostenirii. O clas poate implementa mai multe interfee. Cel mai important avantaj al folosirii interfeelor este c mai multe clase, de pe diferite ramuri ale arborelui ierarhic al claselor, pot fi "vzute" printr-o singur interfa. Se pot declara variabile referin la interfa la fel cum se pot declara variabile referin la clas. Interfaa este abstract i deci nu poate fi instaniat. n schimb, unei variabile referin la interfa i se pot atribui ca valori referine la obiecte din orice clas care implementeaz interfaa respectiv . Declaraia de interfa are forma general urmtoare: [public] interface NumeInterfata [extends lista_superinterfete] { declaratii_de_membri_ai_interfetei } Spre deosebire de clase, la care motenirea multipl este interzis (o clas poate avea numai o singura superclas), n cazul interfeelor motenirea multipl este permis . n consecin, clauza extends poate conine o list de nume de interfee separate prin virgule.

111. Clase imbricate i clase interioare n limbajul Java se permite ca o clas s aib ca membri alte clase. Acestea se numesc clase imbricate sau clase ncuibate (engleza: nested classes). Ca i ceilali membri, clasele imbricate pot fi statice sau nestatice i se declar n corpul clasei care le ncorporeaz. Clasele imbricate nestatice se numesc clase interioare (englez: inner classes). O clas care ncorporeaz (imbric) alte clase se declar astfel: [public] class NumeClasa {
declaratii_de_membri_ai_clasei [modificatori_de_camp] class NumeClasaImbricata { declaratii_de_membri_ai_clasei_imbricate } declaratii_de_membri_ai_clasei }

Se recurge la aceasta tehnic atunci cnd utilizarea unei clase are sens numai n cadrul altei clase. Aadar, prin imbricare se creeaz o legatur strnsa ntre dou clase . Este posibil, desigur, ca o clasa s conin mai multe clase imbricate. Remarcm c declaraia clasei imbricate este tratata ca oricare alta declaraie de membru al clasei, putnd avea i modificatori de cmp (de exemplu static). Fiind membru al clasei, clasa imbricat are acces la toi membrii clasei care o conine, chiar i la cei privai. Dac clasa imbricat este static, ea nu poate referi direct dect membrii statici ai clasei care o conine. Clasa imbricat static exist, la fel ca i cmpurile sau metodele statice, numai n cadrul clasei care o conine, nu i n instanele acesteia. n consecin, pentru a referi membrii acestei clase, se folosete pentru calificare numele clasei. Clasa interioar (clasa imbricat nestatic) are cte o instan n interiorul fiecrei instane a clasei care o conine. n consecin, accesul la membrii ei se poate face folosind drept calificator referina la o instan. Clasa interioar are acces la toi membrii clasei care o conine, att la cei statici, ct i la cei de instan (nestatici).

36

112. Clasa String public final class String


extends Object implements Serializable, Comparable

Instantele clasei String sunt siruri de caractere. Orice literal sir in limbajul Java, de exemplu "abc", este un astfel de obiect. Sirurile sunt constante, deci continutul lor nu poate fi modificat. Pentru a obtine siruri modificabile se va folosi clasa StringBuffer. Nota: amintim ca in limbajul Java reprezentarea interna a caracterelor se face pe 16 biti, in Unicode. Campuri:
public static Comparator CASE_INSENSITIVE_ORDER Campul contine un Comparator care ordoneaza obiectele-sir cand ele sunt comparate cu metoda

comparetoIgnoreCase(). Constructori: public String() Creeaza un sir vid. public String(byte[] bytes) Creeaza un obiect al clasei String care contine caracterele din tabloul de octeti primit ca argument. Se considera ca in acest tablou caracterele sunt reprezentate pe 8 biti, in codul local valabil pe calculatorul pe care se executa programul. Daca referinta la tablou este nula se genereaza o NullPointerException. 112. Clasa StringBuffer public final class StringBuffer
extends Object implements Serializable

Un StringBuffer implementeaza un sir de caractere care poate fi modificat. El reprezinta o zona tampon din memorie, in care se ppoate plasa un sir de caractere. Operatiile principale asupra unui StringBuffer sunt metodele append si insert. Fiecare din ele converteste o data intr-un String, pe care apoi il adauga la sirul din StringBuffer sau il insereaza in acesta pe o pozitie data. Fiecare StringBuffer are o capacitate si o lungime. Lungimea este numarul efectiv de caractere continute, iar capacitatea este numarul maxim de caractere care incap in zona tampon rezervata in memorie. Daca, printr-o noua adaugare de caractere, lungimea depaseste capacitatea, atunci capacitatea se mareste in mod automat. 113. Clasa Math public final class Math
extends Object

Clasa Math contine metode statice pentru calcularea unor functii matematice uzuale, cum sunt functiile trigonometrice, radacina patrata si altele.

37

Campuri: public static final double E - numarul e (baza logaritmilor naturali); public static final double PI - numarul pi (raportul dintre circumferinta cercului si diametru). Metode: public static double sin(double a)- intoarce sinusul trigonometric sin a, unde unghiul a este in radiani. public static double cos(double a)- intoarce cosinusul trigonometric cos a, unde unghiul a este in radiani; public static double tan(double a)- intoarce tangenta trigonometrica tg a, unde unghiul a este in radiani;

114. Interfee utilizator grafice Interfaa utilizator, numit i interfaa om-main, este mijlocul de comunicare ntre un sistem informatic i utilizator. n programare, conceptul de interfa utilizator a aprut n legtur cu utilizarea programelor n regim interactiv. Un asemenea regim permite utilizatorului s comunice cu procesul de calcul n timpul desfurrii acestuia. n prezent, se cunosc dou tipuri principale de interfee utilizator: - interfaa prin linie de comand; - interfaa grafic. n modul de comunicare prin linie de comand, operatorul uman transmite calculatorului comenzi, pe care le introduce de la tastatur sub forma unor linii de text, folosind un anumit limbaj de comand. Exemplele cele mai cunoscute sunt limbajele de comand ale sistemelor de operare MS-DOS i Unix. Interfaa utilizator grafic (englez: GUI - graphical user interface) este o interfa om-main care permite operatorului s dea comenzi i s introduc date prin acionarea asupra unor obiecte grafice vizualizate pe ecran: butoane, pictograme, meniuri etc. Un avantaj important al platformei Java 2 este c ofer pachete de clase, care permit programatorului realizarea comod i eficient a interfeelor grafice. n prezent, exist dou grupuri de pachete de clase pentru interfee grafice, care corespund la dou principii diferite de realizare a interfeei: 1. AWT (englez: Abstract Windowing Toolkit - setul de dezvoltare de ferestre abstracte) - este un set de clase care permit realizarea de interfee grafice n care se folosesc obiectele grafice specifice platformei pe care se execut programul. Aceasta nseamn c, dac programul se execut - de exemplu - sub Windows, diferitele obiecte grafice (butoane, meniuri, bare de defilare etc.) vor avea aspectul specific sistemului Windows, n timp ce dac se executa sub X-Window vor avea aspectul specific acestui sistem. 2. JFC (englez: Java Foundation Classes - clase de baz Java), este un set de pachete de clase, care extind posibilitile oferite de AWT, pentru realizarea de interfee utilizator de calitate superioar. Dintre acestea, cele mai larg folosite constituie setul cunoscut sub numele de cod Swing

38

(sau JFC/Swing), care ofer posibilitatea de a realiza interfee grafice al cror aspect nu depinde de platforma pe care se execut programul.

115. Clasa Component Avnd n vedere c ntreaga ierarhie de clase de obiecte de interfa utilizator grafic folosite n Java (att cele din AWT, ct i din JFC/Swing) are ca rdcin clasa Component, este util s ncepem studiul cu aceast clas. Componenta este un obiect grafic care este afiabil pe ecran i poate interaciona cu utilizatorul. Clasa Component este o clas abstract, derivat direct din clasa Object. Dintre numeroasele metode ale acestei clase, prezentm aici numai cteva mai frecvent folosite: public boolean isVisible() - testeaz dac aceast component este vizibil, atunci cnd este vizibil i containerul n care se gsete; public void setVisible(boolean visible) - face componenta sa fie vizibil sau nu, dup cum argumentul este true sau false; n aceste metode se utilizeaz i clasele auxiliare Point i Dimension din pachetul java.awt. Instanele clasei Point conin coordonatele unui punct. Se consider c originea sistemului de coordonate se afl n colul din stnga sus, axa Ox este orientat ctre dreapta, iar axa Oy este orientata n jos. Instanele clasei Dimension conin dimensiunile componentei: limea i nlimea.

116. Clasa JFrame public class JFrame extends Frame implements WindowConstants, Accessible, RootPaneContainer Este varianta Swing a clasei Frame din AWT, fiind o subclas a acesteia. O deosebire important ntre cele dou clase este c, n clasa JFrame, componentele nu se mai adaug direct la fereastra (la frame), ci la un panou coninut de aceasta, numit contentPane. O referin la contentPane se obine prin metoda getContentPane(). Operaiile cu acest contentPane (adugarea i eliminarea de componente, setarea gestionarului de poziionare etc) se fac folosind metodele clasei Container. Constructori public JFrame() - construiete un JFrame, iniial invizibil i fr titlu. public JFrame(String title) - construiete un JFrame, iniial invizibil, cu titlul specificat. public JFrame(GraphicsConfiguration gc) - construiete un JFrame fr titlu, cu configuraia grafic specificat, iniial invizibil. public JFrame(String title, GraphicsConfiguration gc) - construiete un JFrame cu titlul i configuraia grafic specificate, iniial invizibil. 117. Programarea orientat pe evenimente Cnd se lucreaz cu o interfa grafic, pe ecranul staiei de lucru apar diferite obiecte grafice: ferestre, meniuri, butoane, bare de defilare etc. Operatorul poate utiliza tastatura staiei de lucru, la fel ca n cazul progrmarii tradiionale, dar, n plus, utilizeaz un dispozitiv de selecie numit mouse, cu

39

ajutorul cruia poate alege diferite obiecte grafice de pe ecran i poate da anumite comenzi prin apsarea unuia din butoanele acestui dispozitiv. Se numeste eveniment orice modificare care are loc, fie n starea dispozitivelor de intrare, fie n cea a obiectelor grafice de pe ecran: apsarea sau eliberarea unei taste, deplasarea mouse-ului, apsarea sau eliberarea unui buton al mouse-ului, deschiderea sau nchiderea unei ferestre, efectuarea unui clic de mouse pe un obiect de control (buton, caseta de validare, bara de defilare etc.), intrarea cursorului de mouse n cmpul activ al unui obiect grafic sau prsirea acestuia etc. Pot exista, desigur, i alte tipuri de evenimente, dar aici ne intereseaz numai cele legate de interfaa grafic a aplicaiei. Interaciunea dintre operator i aplicaie ntr-un sistem bazat pe evenimente decurge astfel: operatorul provoac generarea unui eveniment, acionnd asupra tastaturii, mouse-ului sau a altui dispozitiv de intrare, iar programul "rspunde" la acest eveniment prin executarea unei anumite aciuni. Acest mod de lucru impune o nou concepie n proiectarea programelor, numit programarea orientat pe evenimente. Exist diferite modele de generare, captare i tratare a evenimentelor. n lucrarea de fa va fi prezentat modelul de evenimente specific platformei Java 2. 118. Clase de evenimente Clasele de evenimente se gsesc n pachetele java.awt.event i javax.swing.event i formeaz o ierarhie de clase, care are ca radacin clasa abstract java.awt.AWTEvent. Aceasta, la rndul ei, extinde clasa java.util.EventObject din pachetul java.util. Orice eveniment conine urmtoarele metodele declarate n clasa java.util.EventObject: public Object getSource() - care ntoarce o referin ctre obiectul care a generat evenimentul respectiv; public String toString() - care ntoarce o reprezentare sub forma de ir a obiectului. Orice eveniment AWT (generat de componente AWT sau JFC/Swing) conine un cmp protejat de tip int numit id, a crui valoare indic tipul evenimentului. Toate clasele de evenimente conin cmpuri statice finale de tip int, al cror nume indic tipul de eveniment i a cror valoare este valoarea corespunztoare a cmpului id. Valoarea acestui cmp se poate obine prin metoda public int getId() Evenimentele pot fi de nivel cobort (low level event) sau semantice. Numele claselor de evenimente de nivel cobort indic fie componenta, fie dispozitivul de intrare care le-a generat, de exemplu: ComponentEvent, WindowEvent, MouseEvent, KeyEvent. Numele claselor de evenimente semantice indic mai curnd tipul de eveniment, dect sursa acestuia, de exemplu: ActionEvent, TextEvent. Descrierea claselor de evenimente este dat complet n documentaia Java API. 119. Interfee i clase adaptoare pentru asculttori de evenimente Evenimentele generate de surse, sunt captate i tratate de asculttori. Sursele sunt componente ale interfeei grafice care, de regul, sunt preluate din pachetele de clase ale platformei Java 2, deci nu sunt programate de ctre programatorul de aplicaie, ci doar utilizate de acesta. n schimb, programatorul de aplicaie trebuie s creeze clasele de asculttori de evenimente specifice aplicaiei pe care o dezvolt. Metodele acestor clase trebuie sa reacioneze la apariia evenimentelor i s execute aciunile corespunztoare, conform cu obiectivele aplicaiei. n consecin, platforma Java 2 nu pune la dispoziie clase asculttoare predefinite, ci doar interfeele pe care trebuie s le implementeze aceste clase, pentru a putea trata evenimentele pe care le recepioneaz.

40

Exist cte o interfa de asculttor pentru fiecare clas de eveniment. De exemplu, pentru ComponentEvent exist interfaa ComponentListener, pentru WindowEvent exista intefaa WindowListener etc. Pentru a se uura munca programatorilor, pentru unele interfee care conin mai multe metode, se ofer i prototipuri de clase care implementeaz interfaa respectiv , numite adaptoare. De exemplu, clasa WindowAdapter implementeaz 120. Evenimentele generate de o fereastr Pentru a ne familiariza cu modelul de evenimente al platformei Java 2, vom urmri acum evenimentele generate de o fereastr i modul cum acestea pot fi tratate. Vom folosi n acest scop o interfa din clasa javax.swing.JFrame. Aceasta este derivat din clasa java.awt.Frame care, la rndul ei, este derivat din clasa java.awt.Window. Evenimentele prezentate n aceast seciune sunt generate de orice instan a clasei Window i ale subclaselor sale. Evenimentele generate de fereastr sunt instane ale clasei WindowEvent i sunt ascultate de instane ale unor clase care implementeaz interfaa WindowListener sau extind clasa WindowAdapter. Toate aceste clase i interfee se gsesc n pachetul java.awt.event. Pentru a se trata evenimentele generate de fereastr, este necesar s se declare o clas care implementeaz interfaa WindowListener. n aceast clas se definesc toate metodele interfeei, astfel nct acestea s execute aciunile adecvate evenimentelor corespunztoare. 121. Terminarea aplicaiei la nchiderea ferestrei Pentru ca la acionarea butonului de nchidere din colul din dreapta-sus al ferestrei s se nchid nu numai fereastra respectiv, ci si aplicaia, este necesar ca metoda windowClosing() a asculttorului de fereastr s conin invocarea metodei System.exit(0) din clasa System. Dac nu dorim s utilizam i alte metode de tratare a evenimentelor generate de fereastr, vom deriva clasa de ascultare a ferestrei AF din clasa WindowAdapter. 122. Evenimente de mouse Evenimentele de mouse sunt instane ale clasei java.awt.event.MouseEvent i sunt generate de ctre orice component a interfeei grafice, atunci cnd asupra ei se acioneaza cu mouse-ul. Clasa MouseEvent este derivat din clasa java.awt.event.InputEvent. Evenimentele de mouse sunt intrarea cursorului de mouse ntr-o component sau ieirea din aceasta, apsarea unui buton de mouse sau eliberarea lui, efectuarea unui click de mouse (simplu sau multiplu) pe suprafaa componentei, micarea mouse-ului. n AWT se face distincie ntre evenimentele de mouse discrete i evenimentele care caracterizeaz micarea continu a mouse-lui. a/ Evenimente de mouse - a fost apsat un buton al mouse-ului (MOUSE_PRESSED); - a fost eliberat un buton al mouse-ului (MOUSE_RELEASED); - s-a fcut click de mouse, adic un buton al acestuia a fost apsat i eliberat imediat (MOUSE_CLICKED); - cursorul mouse-ului a intrat ntr-o component (MOUSE_ENTERED); - cursorul mouse-ului a ieit din component (MOUSE_EXITED). Ascultarea acestor evenimente se face cu instane ale claselor care implementeaza interfaa java.awt.event.MouseListener. b/ Evenimente de micare a mouse-ului

41

- mouse-ul s-a micat pe suprafaa componentei (MOUSE_MOVED); - mouse-ul a fost "tras" pe suprafaa componentei, adic a fost micat innd un buton apsat (MOUSE_DRAGGED). Aceste evenimente sunt ascultate cu instane ale claselor care implementeaz interfaa java.awt.event.MouseMotionListene 123. Evenimente de tast De cte ori se apas sau se elibereaz o tast, componenta activ a interfeei grafice genereaz un eveniment de tast din clasa java.awt.event.KeyEvent. Acesta poate fi tratat cu un "asculttor de taste" care implementeaz interfaa java.awt.event.KeyListener sau care extinde clasa java.awt.event.KeyAdapter. Se disting urmtoarele evenimente generate la acionarea tastelor: - a fost apasat o tast (KEY_PRESSED); - a fost eliberat o tast (KEY_RELEASED); - a fost "tiprit" un caracter, adic a fost apasat i eliberat o tast care transmite un caracter tipribil (KEY_TYPED). Aceste situaii pot fi detectate cu metodele corespunztoare ale interfeei KeyListener. Evenimentul generat de tast conine, n afar de codul tastei acionate, i informaii privind starea tastelor auxiliare Ctrl, Alt i Shift n momentul producerii evenimentului respectiv. Aceste stri pot fi detectate cu metodele corespunztoare ale interfeei superclasei java.awt.event.InputEvent. 124. Adugarea unei componente la fereastra principal a aplicaiei Pn n prezent, am artat c, atunci cnd folosim JFC/Swing, fereastra principal a aplicaiei este o instan a clasei javax.swing.JFrame sau a unei subclase a acesteia. Pentru a construi o interfa utilizator grafic este necesar ca n fereastra principal s introducem diverse componente. Acestea pot fi componente simple, ca etichete, butoane, casete de validare, cmpuri de text etc., sau pot fi containere, care conin - la rndul lor - alte componente. Pentru realizarea acestor componente simple i containere se folosesc clasele din pachetele java.awt i javax.swing, care sunt descrise n documentaia Java API. Adugarea de componente nu se face direct la instanele clasei JFrame. n JFrame exist un Container (un obiect dintr-o subclas a clasei Container) numit contentPane, la care se pot aduga componente. O referin la acest Container se obine prin metoda public Container getContentPane(), existent n clasa JFrame. Adugarea de componente se face prin una din metodele add() ale clasei Container. Dac, de exemplu, comp este referin la o component, atunci expresia getContentPane().add(comp), folosit ntr-o metod a clasei JFrame sau a subclaselor ei, adaug componenta comp la containerul contentPane coninut n JFrame. 125. Gestionarea poziionrii componentelor Am artat n seciunea precedent cum se poate plasa ntr-un container (n particular ntr-un contentPane) o singur component. n mod normal ns, ntr-un comtainer se plaseaz mai multe componente. n acest caz, este foarte important s se stabileasc modul n care aceste componente sunt poziionate pe suprafaa containerului. n acest scop, a fost introdus conceptul de gestionar de poziionare (n englez: Layout Manager).

42

Gestionarul de poziionare este o clas care asigur poziionarea i redimensionarea automat a componentelor situate ntr-un container, att la crearea containerului, ct i la modificarea dimensiunilor acestuia. Orice gestionar de poziionare implementeaz interfaa java.awt.LayoutManager sau subinterfaa acesteia java.awt.LauoutManager2. n cele ce urmeaz, vom studia cele mai larg utilizate clase de gestionare a poziionrii, existente n pachetele java.awt i javax.swing. Fiecare clas de container are un gestionar de poziionare implicit. Acesta este BorderLayout pentru Frame i JFrame.contentPane i FlowLayout pentru clasa Panel. Modificarea gestionarului de pozitionare se face prin metoda
public void setLayout(LayoutManager manager)

din clasa java.awt.Container. 126. Clasa BorderLayout ncepem cu aceast clas, deoarece este gestionarul de poziionare implicit pentru coninutul instanelor clasei JFrame. n acest caz, se consider c suprafaa containerului este imparit n cinci zone numite, respectiv, NORTH, SOUTH, WEST, EAST si CENTER. n fiecare din aceste zone se poate plasa numai o singur component, care poate fi ns ea nsi un container. Adugarea de componente la container se face, n acest caz, folosind metoda add(componenta, BorderLayout.ZONA), unde componenta este referina la componenta adaugat, iar ZONA este una din cele cinci zone menionate mai sus. Dac se folosete metoda add(componenta), fr a indica zona, componenta respectiv este plasat implicit n zona CENTER, aa cum s-a procedat n seciunea precedenta, n exemplul din fiierul AdComp.java. 127. Clasa FlowLayout Gestionarul de poziionare java.awt.FlowLayout plaseaz componentele pe suprafaa containerului una dup alta, n ordinea n care acestea sunt adugate, de la stnga la dreapta i de sus n jos. Cnd sa terminat o linie, se trece la linia urmtoare. Numrul de componente pe o linie depinde de limea componentelor i de limea containerului n care sunt acestea plasate. Este posibil s se specifice modul de aliniere a componentelor: la stnga, la dreapta sau la centru. Aceasta se face fie specificnd alinierea ca argument al constructorului, fie invocnd metoda
public void setAlignement(int align) n care argumentul align poate fi FlowLayout.LEFT, FlowLayout.RIGHT sau FlowLayout.CENTER.

Remarcm c aplicaia ButoaneF este o modificare a aplicaiei Butoane din fiierul Butoane.java i se deosebete de aceasta prin urmtoarele: - n metoda main se preia un argument din linia de comand, care trebuie s fie numrul de butoane de acionare solicitat de utilizator, dup care se construiete fereastra aplicaiei; - s-a introdus tabloul bc[] care conine referine la instanele clasei ButonContor. Att acest tablou, ct i butoanele respective, se creeaz n constructorul clasei IUG; - dup adugarea butoanelor de contorizare, se adaug la fereastra aplicaiei butonul de anulare br, din clasa JButton; - pentru ascultarea acionrii butonului de anulare, a fost declarat clasa imbricat Anulare, care implementeaz interfaa ActionListener. 128. Clasa GridLayout Gestionarele de poziionare din clasa java.awt.GridLayout plaseaz componentele n celulele unei grile rectangulare. n consecin, toate componentele de pe aceeai coloan sunt aliniate vertical.

43

Clasa are doi constructori:


public GridLayout(int rows, int cols) - are ca argumente numrul de linii i de coloane al grilei; public GridLayout(int rows, int cols, int hgap, int vgap) - are n plus ca argumente spaiul orizontal i,

respectiv, vertical ntre componente. Dei n constructor se indic att numrul de linii, ct i cel de coloane ale grilei, n realitate numai numrul de linii este respectat, n timp ce numrul de coloane este practic ignorat. La stabilirea amplasrii componentelor n container, dac numarul lor total este mai mic sau egal cu cel de linii, toate componentele vor fi aezate vertical, una sub alta. Dac numrul de componente este mai mare dect numrul de linii, numrul de coloane se stabilete automat, prin mprirea numrului de componente la cel de linii, cu rotunjire n plus. Plasarea efectiv a componentelor n celulele grilei astfel creeate se face apoi de la stnga la dreapta i de sus in jos, la fel ca n cazul gestionarului FlowLayout, dar respectnd alinierea vertical i orizontal impus de gril. 129. Clasa BoxLayout Gestionarul de poziionare javax.swing.BoxLayout plaseaz toate componentele containerului pe o singur direcie, care poate fi orizontal sau vertical. Constructorul clasei este public BoxLayout(Container target, int axis) n care target este o referina la containerul int (al crui gestionar de poziionare este creat), iar axis poate fi BoxLayout.X_AXIS sau BoxLayout.Y_AXIS i indic direcia (axa) dup care vor fi plasate componentele. n loc de a folosi gestionarul BoxLayout ntr-un container oarecare, se prefer s se foloseasca clasa javax.swing.Box, care are acest gestionar implicit. 130. Clasa CardLayout public class CardLayout extends Object implements LayoutManager2, Serializable Instanele acestei clase sunt gestionari de poziionare, care plaseaz componentele n container una peste alta, ca ntr-un pachet de cri de vizit.La un moment dat este vizibil numai componenta de deasupra, ns componentele i pot schimba locurile ntre ele prin rotaie. Constructori public CardLayout() - construiete un CardLayout fr spaiu liber n jurul componentelor. public CardLayout(int hgap, int vgap) - construiete un cardLayout care are pe margini spaiile libere hgap pe orizontal i vgap pe vertical. Metode Metodele interfeelor LayoutManager i LayoutManager2, la care se adaug urmtoarele: public int getHgap() - ntoarce spaiul liber pe orizontal. public void setHgap(int hgap) - seteaz spaiul liber pe orizontal. public int getVgap() - ntoarce spaiul liber pe vertical.

44

public void setVgap(int vgap) - seteaz spaiul liber pe vertical. public void first(Container parent) - pune deasupra prima component din containerul printe specificat. public void next(Container parent) - pune deasupra urmtoarea component a containerului specificat. public void previous(Container parent) - pune deasupra componenta precedent a containerului specificat.componenta cu numele name din containerul specificat. public void show(Container parent, String name) - pune deasupra public void last(Container parent) - pune deasupra ultima component din containerul specificat. 140. Poziionarea absolut a componentelor n container n general, este recomandabil ca pentru amplasarea componentelor n containere s se foloseasc gestionari de poziionare. n acest fel se asigur modificarea automat a poziiei i dimensiunilor componentelor, atunci cnd se modific dimensiunile containerului. Exist totui situaii, n care se prefer ca poziiile i dimensiunile componentelor s fie fixe i s fie indicate prin program. Din aceast cauz, n afar de amplasarea flexibil a componentelor n containere, folosind clasele de gestionare a poziionrii, este posibil s se proiecteze i interfee grafice n care poziionarea componentelor se face folosind coordonatele i dimensiunile absolute ale acestora. n acest scop: a/ pentru a se indica faptul c nu se folosete un gestionar de poziionare, se recurge la instruciunea: setLayout(null); b/ pentru stabilirea coordonatelor colului din stnga sus i dimensiunilor fiecrei componente se folosete metoda
public void setBounds(int x, int y, int width, int height);

din clasa java.awt.Component. n acest mod, fiecare component este plasat n container cu colul stnga-sus n punctul de coordonate (x,y)i are dimensiunile date prin limea width i nlimea height. n locul metodei setBounds se pot folosi i metodele
public void setLocation(Point location) public void setSize(int latime, int inaltime)

care exist, de asemenea, n clasa Component i permit setarea separat a poziiei i dimensiunilor componentelor. 141. Gruparea componentelor Pentru a poziiona componentele n structuri mai complicate dect cele oferite de clasele de gestionare a poziiei existente, se poate recurge la gruparea mai multor componente n containere auxiliare, care se plaseaz apoi n containerul principal. Drept containere auxiliare, se folosesc cel mai frecvent instane ale claselor java.awt.Panel, javax.swing.JPanel i javax.swing.Box. 142. Clasele Panel si JPanel Clasa java.awt.Panel (panou) reprezinta cel mai simplu container, care este o suprafa dreptunghiular fr bordur. Gestionarul de poziionare implicit este FlowLayout, dar se poate pune oricare altul. Panourile sunt frecvent folosite pentru a plasa pe ele diferite componente, formnd un grup care se plaseaza apoi ntr-un alt container. Clasa javax.swing.JPanel este varianta de Panel folosit n JFC/Swing, fiind un container genreric.

45

143. Clasa Box Clasa javax.swing.Box are ca instane containere speciale, care nu pot folosi dect gestionarul de poziionare javax.swing.BoxLayout. Orice incercare de a-i pune alt gestionar produce o eroare de execuie din clasa AWTError. Clasa dispune de metode statice pentru crearea de "casete" (instane ale clasei Box) orizontale sau verticale:
public static Box createHorizontalBox() public static Box createVerticalBox()

Se pot creea, de asemenea "componente invizibile" de dimensiuni fixe sau variabile, care pot fi folosite la distanarea componentelor vizibile. n acest scop, se folosesc metodele public static Component createRigidArea(Dimension d) - creeaza o "component ascuns" de dimensiune fix; public static Component createHorizontalStrut(int width) - creeaza o "component ascuns" de lime fix, dar de nlime variabil; public static Component createVerticalStrut(int height) - creeaza o "component ascuns" de nalime fix, dar de lime variabil; public static Component createGlue() - creaza o "component ascuns" cu ambele dimensiuni variabile;un container din clasa Box, componentele pot fi amplasate numai pe o singur direcie: orizontal sau vertical. 143. Componentele din JFC/Swing Pentru a realiza interfaa utilizator grafic a unei aplicaii folosind JFC/Swing, este necesar ca la fereastra aplicaiei (din clasa JFrame) s se adauge diferite obiecte grafice numite componente. Deosebim: 1. Componente de control: butoane, butoane radio, casete de validare, liste, liste ascunse, meniuri, rigle ajustabile, cmpuri de text. 2. Componente de afiare needitabile: etichete, indicatoare, etc. 3. Componente de afiare editabile: zone de text, tabele editabile, selectoare de culori, selectoare de fiiere, arbori. 4. Containere: panouri, panouri glisante, etc. 144. Clasa JComponent Clasa abstracta javax.swing.JComponent extinde clasa java.awt.Container. In consecin, orice componenta Swing are i caracteristici de container. Iat, ca exemplu, cteva faciliti pe care le ofera orice JComponent: - posibilitatea de a-i ataa componentei o "inscripie volanta" (englez: ToolTip), adic o inscripie explicativ care apare cnd punem cursorul de mouse pe componenta respectiv, fr s apsm butonul. O astfel de inscripie se ataeaz componentei prin metoda public void setToolTipText(String text); - posibilitatea de a-i pune componentei o bordur, folosind metoda
public void setBorder(Border border);

- posibilitatea de a modifica culoarea de fond i culoarea de primplan ale componentei folosind metodele:
public void setBackground(Color color); public void setForeground(Color color);

46

145. Caracteristicile componentelor JFC/Swing Fiecare component a interfeei utilizator grafice se caracterizeaz prin aspect, stare i comportament. Aspectul este dat de figura prin care este reprezentat pe ecran componenta respectiv. Fiecare clas de componente ofer un aspect tipic al instanelor sale. n JFC/Swing programatorului i se pun nsa la dispoziie metode i clase prin care poate modifica aspectul componentelor. Starea componentei este dat, ca la orice obiect, de valorile cmpurilor sale. Starea se poate modifica fie datorit aciunilor utilizatorului, fie datorit invocrii prin program a unor metode ale acesteia. n general, la modificarea strii componenta genereaz un eveniment, iar uneori i schimb i aspectul. Comportamentul componentei este modul n care aceasta reacioneaz atunci cnd se acioneaz asupra ei de ctre utilizator sau cnd este invocat o metod i const n modificarea strii i a aspectului i n generarea de evenimente. Componentele din JFC/Swing ofer programatorului unele faciliti importante privind stabilirea aspectului i comportamentului acestora. Iat unele ditre ele: - posibilitatea de a introduce n component un text, o imagine, sau ambele; - posibilitatea de a aduga la fiecare component a unui text explicativ volant (englez: Tool Tip), care conine indicaii care apar cnd se pune cursorul mouse-ului pe componenta respectiv, fr a apsa butonul de mouse. - posibilitatea de a pune n jurul componentei una sau mai multe borduri (englez: Border), cu diferite aspecte: chenar simplu, chenar cu titlu, bordur care d aspect de supranlare, bordur care d aspect de scufundare; - posibilitatea de a alege aspectul general al tuturor componentelor interfeei grafice (englez: Look and Feel). 146. Componente de control Componentele de control sunt dispozitive de intrare virtuale, uor de utilizat, prin intermediul crora utilizatorul poate introduce anumite comenzi. Din aceast categorie fac parte butoanele, riglele ajustabile, listele, listele ascunse, meniurile i cmpurile de text. 147. Butoane Butoanele sunt obiecte grafice, al cror aspect este similar celor al butoanelor folosite n aparatura electronic i electric. Acionarea butonului se face punnd deasupra lui cursorul mouse-ului i apasnd un buton al acestuia. n JFC/Swing exist mai multe tipuri de butoane: butonul simplu, caseta de validare, butonul radio i articolul de meniu. Toate acestea sunt subclase ale clasei abstracte javax.swing.AbstractButton. 148. Butonul obinuit (cu o singur stare stabil) Butoanele obinuite se realizeaz folosind clasa javax.swing.JButton, derivat din clasa javax.swing.AbstractButton, aa cum am artat n exemplele date n capitolul precedent. Butonul obinuit are o singur stare stabil, n care ajunge cnd este eliberat. Ct timp se ine butonul de mouse apsat deasupra lui, butonul se afl n starea "apsat" ("acionat"). De fiecare dat cnd este acionat, butonul genereaz un AcionEvent i un ChangeEvent. Cnd este eliberat, genereaz numai un ChangeEvent. Butonul genereaz de asemenea, ca orice alt component, evenimente de component, de mouse i de tast. Totui, n cazul butoanelor obinuite, cel mai frecvent se folosesc

47

evenimentele de aciune (ActionEvent), care sunt ascultate de un asculttor de aciune (ActionListener). Clasele Button i JButton sunt specificate mai detaliat n Indexul de clase. 149. Butonul cu dou stri stabile Clasa javax.swing.JToggleButton este derivata din javax.swing.AbstractButton i reprezint butoane cu dou stri stabile. Trecerea de la o stare la alta este impus de utilizator prin click de mouse sau este comandat prin program. n practic, cel mai frecvent se folosesc caseta de validare i butonul radio, realizate prin subclase ale clasei ToggleButton i prezentate n continuare. O specificare mai detaliat a clasei JToggleButton este dat n indexul de clase. 150. Caseta de validare Caseta de validare este un obiect de control cu dou stri stabile. La fiecare click de mouse pe suprafata casetei de validare, aceasta trece dintr-o stare n cealalt. n mod obinuit, caseta de validare este reprezentat grafic printr-un patrat, n care apare un simbol de bifare (de validare), cum ar fi simbolul V sau X, cnd caseta se gsete n starea "selectat". n starea opus (deselectat), caseta este vid. Imaginea casetei este insoit i de un text explicativ. 151. Butonul radio Butonul radio este un buton cu dou stri stabile, care face parte dintr-un grup de butoane, astfel c la un moment dat numai unul dintre ele poate fi "selectat". n momentul n care este selectat ("apsat") un buton al grupului, se deselecteaz automat cel care era selectat anterior. n JFC/Swing, butoanele radio sunt realizate ca instane ale clasei javax.swing.JRadioButton, care este derivat din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa javax.swing.ButtonGroup. 152. Liste n cazul interfeelor utilizator grafice, se numete list o component care conine articole selectabile. Selectarea lor se face de ctre utilizator, prin click de mouse pe articolul respectiv. Lista poate fi cu selecie simpl sau cu selecie multipl, dup cum pot fi selectate simultan unul sau mai multe articole. n JFC/Swing, listele se realizeaz ca instane ale clasei javax.swing.JList. Articolele din list pot fi, n principiu, orice obiecte afiabile. La crearea listei, constructorului i se d ca argument tabloul obiectelor pe care le va conine lista. Ulterior este posibil s se adauge articole la list, sau s se elimine. Daca lista este mai lunga dect spaiul de afiare disponibil, ea poate fi pus pe un panou glisant, din clasa javax.swing.JScrollPane. Punerea articolelor n list poate fi fcut astfel: - la crearea listei, folosind unul din constructorii public JList(Object[] listData) - primete ca argument un tablou de obiecte, care sunt articolele din list public JList(Vector listData)- primete ca argument o instan a clasei java.util.Vector, care are ca elemente articolele listei; - n timpul utilizrii listei, invocndu-se una din metodele
public void setListData(Object[] listData) public void setListData(Vector listData)

153.Liste ascunse

48

Lista ascuns este o list din care se vede un singur articol (cel care este selectat), deci ocupa pe ecran spaiu mult mai putin dect una obinuit. Celelalte articole ale listei sunt "ascunse" i devin vizibile numai dac se face click pe articolul vizibil. Dac acum facem click de mouse pe un alt articol din lista devenit vizibil, acest nou articol este selectat (rmne vizibil), iar celelalte dispar. ntr-o list ascuns nu este posibil selecia multipl. Punerea articolelor n list se poate face astfel: - la crearea listei ascunse, folosind unul din constructorii
public JComboBox(Object[] items) public JComboBox(Vector items)

- n timpul utilizrii listei, folosind metodele public void addItem(Object anObject) - adaug un articol la sfritul listei; public void insertItemAt(Object anObject, int index) - nsereaz un articol pe poziia index. Eliminarea unui articol din list se face cu una din metodele public void removeItem(Object anObject) - elimin articolul anObject; public void removeItemAt(int anIndex) - elimin articolul de pe poziia anIndex. 154. Rigla ajustabil Clasa javax.swing.JSlider ofer o component care are aspectul unei rigle prevzute cu cursor. Prin deplasarea cursorului cu ajutorul mouse-ului se modific valoarea indicat de rigl. Valoarea minim i cea maxim de pe scala riglei i valoarea unei diviziuni se indic prin program. Rolul riglei poate fi asemnat cu cel al unui dispozitiv de ajustare continu, cum este poteniometrul din aparatura electronic. La deplasarea cursorului, rigla genereaz evenimente din clasa javax.swing.event.ChangeEvent, care sunt ascultate cu o clas care implementeaz interfaa javax.swing.event.ChangeListener. Crearea riglei se face folosind unul dintre constructorii ei, dintre care cel mai complet este
public JSlider(int orientation, int min, int max, int value)

n care
orientation - orientarea riglei, care poate fi JSlider.HORIZONTAL sau JSlider.VERTICAL; min, max - valorile minim i maxim de pe scala riglei; value - valoarea indicat iniial de cursorul riglei (trebuie s fie n intervalul [min,max]).

Pentru a stabili aspectul riglei se folosesc metodele public void setMajorTickSpacing(int n) - stabilirea valorii diviziunilor mari public void setMinorTickSpacing(int n) - stabilirea valorii diviziunilor mici public void setPaintTicks(boolean b) - determin dac diviziunile vor fi vizibile public void setPaintLabels(boolean b) - determin dac vor fi afiate valorile numerice ale diviziunilor.

155. Meniuri La fel ca listele sau butoanele radio, meniurile permit utilizatorului s aleag una din mai multe opiuni posibile. n JFC/Swing se disting dou categorii de meniuri: - meniuri cu bar, care pornesc dintr-o bar situat la partea superioar a ferestrei aplicaiei; - meniuri derulante (pop-up), care apar n poziia n care se gsete cursorul de mouse. 156. Meniuri cu bar Bara de meniu se poate plasa, daca este necesara, numai la partea superioara a ferstrei aplicatiei si se realizeaza ca o instanta a clasei javax.swing.JMenuBar.

49

Bara de meniu poate sa conin unul sau mai multe meniuri, care se realizeaz ca instane ale clasei javax.swing.JMenu. La rndul su, fiecare meniu poate conine unul sau mai multe articole, care sunt instane ale claselor javax.swing.JMenuItem sau javax.swing.JCheckBoxMenuItem. Este ns posibil ca un articol de meniu s fie el nsui un meniu (din clasa JMenu). Dac utilizatorul alege cu mouse-ul un aricol de meniu, sunt posibile deci dou situaii: - acesta este un articol propriu-zis (un JMenuItem), n care caz opiunea respectiv este selectat; - articolul ales este el nsui un meniu (un JMenu), n care caz noul (sub)meniu se desfoar i cutarea continu. 157. Meniuri derulante (pop-up) Spre deosebire de meniurile cu bar, meniurile derulante sunt tratate ca nite componente obinuite, care pot s fie afiate prin program, atunci cnd este necesar. n JFC/Swing, meniurile derulante se realizeaz ca instane ale clasei javax.swing.JPopupMenu. n rest, meniul pop-up se comport la fel ca un meniu cu bar. Afiarea meniului pop-up trebuie programat, folosindu-se n acest scop metoda din clasa JPopupMenu
public void show(Component invoker, int x, int y)

n care invoker este referina la componenta in spaiul creia trebuie s apar meniul, iar x i y sunt coordonatele punctului n care acesta va fi afiat.

158. Componente de afiare Componentele de afiare sunt cele care servesc pentru a afia anumite texte sau imagini i pot fi needitabile sau editabile. 159. Componente de afiare needitabile Componentele de afiare needitabile sunt realizate ca instane ale urmtoarelor clase: - javax.swing.JLabel - pentru realizarea unor "etichete" n care pot fi afiate texte sau imagini, fr a putea fi editate de utilizator; - javax.swing.JTooltip - pentru afiarea de "inscripii volante", cnd se pune cursorul de mouse deasupra unei alte componente; - javax.swing.JProgressBar - pentru realizarea unor "bare de progres" adic a unor bare de lungime variabil, care arat cum evolueaz realizarea unei anumite activiti (de la 0% la 100%). 160. Componente de afiare editabile Componentele de afiare editabile permit utilizatorului operaii de editare n timpul executrii programului. n JFC/Swing exist un numr important de clase pentru astfel de componente. Astfel, pentru editare de texte exist clasele j avax.swing.JTextArea, javax.swing.JTextPane i javax.swing.JEditorPane. n aceeai categorie pot fi ncadrate i clasele javax.swing.JTextField i javax.swing.JPasswordField, care au fost prezentate anterior. 161. Clasa JTextArea Instanele clasei javax.swing.JTextArea (arie de text) sunt suprafee de afiare a unor texte editabile cu mai multe linii. Componenta are comportamentul unui editor de text simplu: permite s se introduc text de la tastatur, s se tearg textul n ntregime sau pe poriuni, s se adauge sau s se nsereze text. Prin metode speciale se poate seta componenta astfel, nct s se realizeze automat trecerea de la un rnd la altul. Se ofer metode prin care se poate aduga text prin program, sau se

50

poate obine sub forma de String textul existent.

162. Utilizarea ferestrelor de dialog Ferestrele de dialog sunt ferestre care se afieaz pe ecran numai temporar, pentru a transmite anumite mesaje sau a permite introducerea unor date. Principalul avantaj al folosirii ferestrelor de dialog este c apar pe ecran numai atunci cnd sunt necesare i nu ncarc fereastra principal a aplicaiei cu elemente care nu sunt necesare n permanen. n JFC/Swing, ferestrele de dialog se realizeaz folosind clasa javax.swing.JDialog. Instanele acestei clase se comport asemanator cu cele ale clasei JFrame, permind adugarea oricror componente. La fel ca la JFrame, aceste componente nu se adaug direct la fereastr, ci la panoul contentPane coninut n aceasta i obinut prin metoda public Container getContentPane(). Fereastra de dialog poate avea ca "proprietar" ( owner) o instan a claselor java.awt.Frame, javax.swing.JFrame, java.awt.Dialog sau javax.swing.JDialog. Proprietarul se transmite ca argument al constructorului ferestrei de dialog. Se permite ca, n loc de proprietar, s se pun argumentul null, n care caz se atribuie un proprietar implicit. Pentru afiarea pe ecran a ferestrei de dialog se invoc metoda public void show(), iar pentru ascunderea ei se invoc metoda public void hide(). n fine, pentru a elimina fereastra de dialog, elibernd toate resursele pe care le folosete, se invoc metoda public void dispose(). Aceste trei metode sunt motenite de JDialog de la superclasa java.awt.Dialog. Cnd fereastra de dialog este deschis, ea trece n prim plan sau n plan secund mpreun cu proprietarul ei. Ferestrele de dialog pot fi modale sau nemodale. Cnd este afiat pe ecran o fereastr modal, toate celelalte ferestre existente pe ecran sunt blocate (nu se poate aciona asupra lor), pn cnd se ncheie lucrul cu fereastra de dialog modal respectiv. 163. Clasa Color Clasa Color ncapsuleaz informaiile despre culoare. n Java AWT se folosete modelul de culori RGB (englez: red, green, blue) n care fiecare culoare este considerat ca fiind compus din trei culori fundamentale: rou, verde i albastru. n consecin, culoarea este dat prin trei numere cuprinse n intervalul [0, 255], reprezentnd ponderile celor trei culori fundamentale. n figura de mai jos este reprezentat schema de combinare a acestor trei culori fundamentale. Clasa Color conine i un al patrulea cmp, numit alpha, care poate avea, de asemenea, valori ntregi n intervalul [0..255] i exprima opacitatea culorii respective. Daca alpha=255, culoarea este complet opaca. Aceasta nseamn c, dac o figur cu aceast culoare se suprapune peste alta, o mascheaz complet. Dac alpha=0, culoarea este complet transparent, deci practic invizibil. ntre aceste valori extreme putem avea diferite opaciti intermediare, cuprinse intre 0 si 255. Culoarea n sistemul RGB poate fi exprimat nu numai printr-o instan a clasei Color, ci i printr-un numr ntreg (de tip int), n care cei patru octei au, respectiv, valorile componentelor alpha, r, g, b exprimate n intervalul [0..255]. Componentele sunt plasate astfel: alpha n biii 24..31, r n biii 16..23, g n biii 8..15 i b n biii 0..7.

51

Clasa Color conine, de asemenea, constructori i metode care suport sistemele de culori sRBG i HSB. Standardul sRGB definete o variant standardizat a sistemului RGB, destinat monitoarelor cu tub catodic. n acest sistem, parametrii r, g, b i alpha se exprim prin numere reale n intervalul [0.0...1.0].

164. Alegerea culorii folosind clasa JColorChooser Pentru a alege culoarea n mod interactiv, n JFC/Swing este prevazut clasa javax.swing.JColorChooser. Instanele acestei clase sunt panouri de selectare a culorii, care pot fi folosite att prin ncorporarea lor ntr-o fereastr obinuit, ct i sub forma unei ferestre de dialog. Pentru a creea o fereastr de dialog, care conine n ea un JColorChooser i ntoarce culoarea selectat, n clasa JColorChooser exist metoda
public static JDialog createDialog(Component c,String title, boolean modal, JColorChooser chooserPane, ActionListener okListener, ActionListener cancelListener)

n care: - c este componenta beneficiar (owner) a ferestrei de dialog create; - title este titlul ferestrei de dialog create; - argumentul boolean modal indic dac fereastra este modal; - chooserPane este instana clasei JColorChooser care se ntroduce n fereastra de dialog; - okListener si cancelListener sunt asculttoarele de aciune care reacioneaza la apsarea butonului OK, respectiv Cancel al selectorului de culoare. Folosind un JColorChooser, alegerea culorii se poate face n trei moduri: - folosind un tablou de culori, n care fiecare celul este colorat n alt culoare; - n sistemul RGB, folosind trei rigle de ajustare a culorilor fundamentale; - n sistemul HSB, selectnd culoarea prin alegerea cu mouse-ul a punctului de pe panou care are culoarea potrivita (trei butoane alturate, notate H, S, B, arat care din cele trei componente se menine constant, celelalte dou fiind date de coordonatele punctului ales pe panou). 165. Elemente de grafic Java API ofera programatorilor posibiliti ample privind realizarea de desene, text stilizat i alte construcii grafice. Ne vom rezuma aici numai la cteva noiuni elementare, utile n realizarea unor aplicaii grafice simple. In principiu, desenarea se poate face pe orice component grafic. Exist ns clasa java.awt.Canvas, ale crei instane sunt simple panouri destinate desenrii (n englez Canvas este pnza pictorului). Pentru desenare se mai folosesc frecvent i clasele JPanel i JLabel. Sistemul de coordonate folosit pentru grafic are originea n colul din stnga sus al componentei, axa Ox este orientat catre dreapta, iar axa Oy este orientat n jos. Coordonatele se exprim n numere ntregi (int), avnd ca unitate de msur pixelul (punctul de pe ecran). 166. Contextul grafic Modul de realizare a imaginilor i desenelor este strns dependent att de echipament (hardware) ct i de sistemul de operare. Pentru a se asigura independena de platform, n Java API a fost introdus clasa abstract java.awt.Graphics. Aceasta este clasa de baz a tuturor contextelor grafice, care permit trasarea de desene pe suprafaa componentelor grafice realizate pe diverse dispozitive fizice.

52

Pe fiecare platform, n mediul de execuie Java, trebuie s existe o implementare a contextului grafic, adic o extindere a clasei Graphics, care conine toate cmpurile i metodele acestei clase, dar este specific platformei respective. Un obiect din clasa Graphics ncapsuleaz informaia de stare a contextului grafic la care se refer i anume: - referina la obiectul din clasa Component (sau dintr-o subclasa a acesteia) pe care se deseneaz; - o translaie a originii sistemului de coordonate; toate coordonatele din desen sunt raportate la aceast origine; - decupajul curent (dreptunghiul n interiorul cruia se traseaz desenul); - culoarea curent; - fontul curent; - operaia logic pe pixeli curent (XOR sau paint); - alternarea curent de culori pentru operaia pe pixeli XOR 167. Fluxuri de intrare/ieire i fiiere Fluxul este un concept situat pe un nivel nalt de abstractizare, fiind privit ca o simpl succesiune de octei sau de caractere care se transmite ntre surs i destinaie . Nu prezint importan nici natura sursei sau a destinaiei, nici modul n care trebuie interpretat secvena de octeti sau de caractere respectiv. De exemplu, un grup de 32 de octei transmii ntre surs i destinaie poate s reprezinte 32 de caractere ASCII sau 16 caractere Unicode sau 8 numere de tip int sau 4 numere de tip double etc. Aceast abstractizare permite s se trateze n mod unitar toate tipurile de transmisii de date. Se disting doua feluri de fluxuri: de ieire i de intrare. Pentru un proces dat, toate fluxurile transmise de acesta ctre exterior se numesc fluxuri de ieire, iar cele primite din exterior se numesc fluxuri de intrare. n consecin, acelai flux este de ieire n raport cu sursa i de intrare n raport cu destinaia. Principalele operaii care au loc asupra unui flux sunt:

La surs (flux de ieire) - Deschiderea fluxului - ct timp (exist date de transmis) scriere n flux -nchiderea fluxului

La destinaie (flux de intrare) -Deschiderea fluxului - ct timp (exist date de citit) citire din flux -nchiderea fluxului

Programatorului procesului surs i revine obligaia de a pregti, sub forma unei succesiuni de caractere sau de octei, datele care urmeaz a fi transmise pe fluxul de ieire. Interpretarea i tratarea datelor coninute n flux se face de ctre procesul de destinaie, deci ntreaga responsabilitate i revine celui care programeaz acest proces. Desigur c este necesar ca interpretarea datelor din flux la destinaie s corespund cu cea de la surs. Programarea operaiilor de intrare/ieire poate fi destul de complicat, dar n limbajul Java ea este totui uurat de existena unui numr destul de mare de clase cu aceast destinaie, grupate n pachetul java.io. 168. Pachetul java.io n Java 2 SDK se consider c fluxurile pot fi de caractere sau de octei. n primul caz, de la surs la destinaie se transmite o succesiune de caractere Unicode (de cte 16 bii), iar n al doilea caz - o succesiune de octei (de 8 bii). n mod corespunztor, pentru fiecare din cele dou categorii de fluxuri exist cte o ierarhie de clase de fluxuri de intrare i o ierarhie de clase de fluxuri de iesire. Pentru fluxurile de caractere, rdcinile ierarhiilor de clase sunt clasele abstracte Reader i Writer.Pentru fluxurile de octei, rdcinile acestor ierarhii sunt clasele abstracte InputStream i OutputStream.

53

Aceste ierarhii de clase sunt reprezentate n figurile 2, 3, 4 i 5. n afar de cele patru ierarhii menionate, n pachetul java.io exist i clase auxiliare i interfete. Distingem trei tipuri de clase, care sunt reprezentate n aceste figuri prin culori diferite: - clase abstracte (culoare albastr); - clase care efectueaz operaiile de intrare sau de ieire propriu-zise (culoare verde) i modeleaz sursele sau destinaiile fluxurilor (englez: Data Sink Streams); - clase care efectueaz unele operaii de transformare a datelor de pe flux (culoare violet) i reprezinta "fluxuri de prelucrare" (englez: Processing Streams). 169. Clasa Reader Clasa abstract java.io.Reader este rdcina ierarhiei de clase de fluxuri de intrare de caractere. Metode: public int read() throws IOException - citete din fluxul de intrare un singur caracter; ntoarce caracterul citit (n domeniul 0 .. 16383) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce blocarea procesului n care este invocat, pn cnd apare un caracter n fluxul de intrare; public int read(char[] cbuf) throws IOException - citete din flux o secven de caractere i le depune ntr-o zon tampon (buffer) constituit din tabloul de caractere cbuf; ntoarce numrul de caractere citite sau -1 dac s-a atins sfritul de fiier; metoda produce blocarea procesului pn cnd apar caractere n fluxul de intrare, sau se ajunge la sfrit de fiier; public abstract int read(char[] cbuf, int off, int len) throws IOException - acioneaz asemntor cu metoda precedent, dar depunerea caracterelor citite n zona tampon de destinaie se face ncepnd de la poziia off (offset), iar numrul maxim de caractere citite este len; public long skip(long n) throws IOException - se sare peste n caractere din fluxul de intrare, care nu vor fi citite; procesul apelant este blocat pan cnd apare cel puin un caracter n fluxul de intrare; dac se ntlnete sfritul de fiier, se genereaz o excepie de intrare/ieire; ntoarce numrul de caractere srite efectiv; public boolean ready() - ntoarce true dac fluxul de intrare este gata pentru a putea fi citit; public void mark(int readAheadLimit) throws IOException - marcheaz poziia curent n fluxul de intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de caractere care vor putea fi ulterior citite din flux,fr ca acest marcaj s se piard; excepia de intrare/ieire apare dac fluxul nu suport marcarea sau dac se produce alt eroare de intrare/ieire; public boolean markSupported() - indic dac fluxul suport marcarea; public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia corespunztoare ultimului marcaj; dac fluxul nu a fost marcat sau nu suport resetarea, se genereaz o excepie de intrare/ieire; public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea metodelor read(), ready(), mark() sau reset pentru acest flux va genera o excepie de intrare/ieire. 170. Clasa Writer Clasa abstract java.io.Writer este rdcina ierarhiei de clase pentru fluxuri de ieire de caractere. Metode: public void write(int c) throws IOException - scrie n fluxul de ieire caracterul c;
public void write(char[] cbuf) throws IOException - scrie n fluxul de ieire caracterele coninute n

tabloul cbuf;
public abstract void(char[] cbuf, int off, int len) throws IOException - scrie n fluxul de ieire len caractere din tabloul cbuf, ncepnd de la poziia off (offset); public void write(String str) throws IOException - scrie n flux caracterele existente n irul str; public void write(String str, int off, int len) throws IOException - scrie n flux len caractere din irul str, ncepnd de la poziia off (offset);

54

public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat ntr-o zon tampon anumite caractere scrise cu metodele write(), aceste caractere sunt scrise efectiv n fluxul de destinaie; dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se "descarc" ntregul lan de fluxuri; public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.

171. Clasa InputStream Clasa java.io.InputStream este rdcina ierarhiei de clase pentru fluxuri de intrare organizate pe octei. Metode: public int read() throws IOException - citete din fluxul de intrare un singur octet; ntoarce octetul citit (in domeniul 0 .. 255) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce blocarea procesului n care este invocat, pn cnd apare un octet n fluxul de intrare; public int read(byte[] buf) throws IOException - citete din flux o secven de octei i i depune ntr-o zon tampon (buffer) constituit din tabloul de octei buf; ntoarce numrul de octei citii sau -1 dac s-a atins sfritul de fiier; metoda produce blocarea procesului pn cnd apar octei n fluxul de intrare, sau se ajunge la sfrit de fiier; public abstract int read(byte[] buf, int off, int len) throws IOException - acioneaz asemntor cu metoda precedent, dar depunerea octeilor citii n tabloul de destinaie byte[] se face ncepnd de la poziia off (offset), iar numrul maxim de octei citii este len; public long skip(long n) throws IOException - se sare peste n octei din fluxul de intrare, care nu vor fi citii; procesul apelant este blocat pn cnd apare cel puin un octet n fluxul de intrare; dac se ntlnete sfritul de fiier se genereaz o eroare de intrare/ieire; ntoarce numrul de octei srii efectiv; public int available() throws IOException - ntoarce numrul de octei disponibili pentru citire n fluxul de intrare; public void mark(int readAheadLimit) throws IOException - marcheaz poziia curenta n fluxul de intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de octei care vor putea fi ulterior citii din flux, fr ca acest marcaj s se piard; excepia de intrare/ieire apare dac fluxul nu suport marcarea sau dac se produce alt eroare de intrare/ieire; public boolean markSupported() - indic dac fluxul suport marcarea; public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia corespunztoare ultimului marcaj; dac fluxul nu a fost marcat sau nu suporta resetarea, se genereaz o excepie de intrare/ieire; public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea metodelor read(), ready(), mark() sau reset() pentru acest flux va genera o excepie de intrare/ieire. 171. Clasa OutputStream Clasa java.io.OutputStream este rdcina ierarhiei de clase pentru fluxuri de iesire de octei. Metode: public void write(int c) throws IOException - scrie n fluxul de ieire ultimul octet al numrului c; public void write(byte[] buf) throws IOException - scrie n fluxul de ieire octeii coninuti n tabloul buf; public abstract void(byte[] buf, int off, int len) throws IOException - scrie n fluxul de ieire len octei din tabloul buf, ncepnd de la poziia off (offset); public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat ntr-o zon tampon anumii octei scrii cu metodele write(), aceti octei sunt scrii efectiv n fluxul de destinaie; dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se "descarc" ntregul lan de fluxuri;

55

public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.

172. Clasele PrintStream i PrintWriter Clasele java.io.PrintStream i java.io.PrintWriter se folosesc pentru a transmite ctre un flux se ieire date formatate pentru tiprire (afiare). Se tie c forma intern a datelor difer de forma extern. De exemplu, numerele ntregi sunt reprezentate intern sub form binar, n timp ce pe ecranul calculatorului sau la imprimant apar sub forma unor iruri de cifre zecimale, precedate eventual de semn. Metodele claselor PrintStream i PrintWriter fac aceast conversie din forma intern n cea extern a diferitelor tipuri de date, genernd reprezentrile datelor respective sub forma de iruri de octei (caractere n codul ASCII) sau, respectiv, de caractere Unicode. Aceste clase nu se folosesc n mod independent, ci adaug altui flux de ieire (de octei sau, respectiv, de caractere) capacitatea de formatare a datelor n vederea tipririi. 173. Fluxuri de prelucrare Fluxurile de prelucrare se conecteaz la alte fluxuri de intrare/ieire pentru a face anumite transformri asupra datelor din fluxul respectiv. Clasele de fluxuri de prelucrare din Java API au fost prezentate pe scurt la descrierea pachetului java.io. n aceast seciune ne vom ocupa de dou categorii de fluxuri de prelucrare: fluxurile de date i fluxurile de obiecte. 174. Fluxuri de date n unele aplicaii se dorete s se transmit ntr-un flux de ieire sau s se recepioneze dintr-un flux de intrare date primitive reprezentate binar (de tip boolean, char, byte, short, int, long, float sau double) i iruri de caractere. n acest scop, pot fi folosite clasele java.io.DataOutputStream i java.io.DataInputStream. Se pot citi cu un DataInputStream numai date care au fost scrise cu un DataOutputStream. 175. Clasa DataOutputStream Clasa java.io.DataOutputStream este derivat din clasa java.io.FilterOutputStream i implementeaz interfaa java.io.DataOutput. Ea permite s se transmit date primitive ctre un flux de ieire ntr-o form portabil (independent de platform), cu condiia ca aceste date s fie citite ulterior printr-un DataInputStream. Constructor: public DataOutputStream(OutputStream out) - creeaz un nou flux de ieire de date, conectat la ieire la un OutputStream (adic la o instan a unei clase derivate din clasa OutputStream). Metode: Aceasta clas conine metodele clasei java.io.OutputStream, la care se adaug urmtoarele metode specifice, destinate scrierii n fluxul de ieire a datelor primitive sau a unor iruri de caractere: public final void writeBoolean(boolean v) throws IOException - scrie o valoare boolean; public final void writeChar(char v) throws IOException - scrie o valoare de tip char, n format Unicode; public final void writeByte(byte v) throws IOException - scrie o valoare de tip byte pe un octet; public final void writeShort(short v) throws IOException - scrie o valoare de tip short pe doi octei; public final void writeInt(int v) throws IOException - scrie o valoare de tip int pe 4 octei; public final void writeLong(long v) throws IOException - scrie o valoare de tip long pe 8 octei; public final void writeFloat(float v) throws IOException - scrie o valoare de tip float pe 4 octei; public final void writeDouble(double v) throws IOException - scrie o valoare de tip double pe opt octei;
public final void writeBytes(String v) throws IOException - scrie un ir de caractere, convertit ntr-un ir de octei prin suprimarea octetului superior al fiecrui caracter; public final void writeChars(String v) throws IOException - scrie n flux un ir de caractere (n

56

Unicode);
public final void writeUTF(String v) throws IOException - scrie un ir de caractere codificat n formatul UTF-8 ntr-o form independent de main (se scrie mai nti lungimea irului pe doi octei, apoi fiecare caracter din ir pe cte un singur octet); public final int size() - ntoarce numrul de octei scrii n acest flux de ieire.

176. Clasa DataInputStream Un DataInputStream este un flux de intrare de octei care este conectat la intrare la un alt InputStream i citeste din acesta date primitive ntr-o form independent de platform. Se pot citi cu DataInputStream numai date care au fost scrise cu DataOutputStream. Constructor: public DataInputStream(InputStream in) - creeaz un flux de date de intrare, care citete date din fluxul de intrare in, primit ca argument. Metode: Aceasta clas conine toate metodele clasei java.io.InputStream, la care se adaug urmtoarele metode specifice, prin care se implementeaz interfaa java.io.DataInput: public final void readFully(byte[] b) throws IOException - citete din fluxul de intrare un numr de octei egal cu lungimea tabloului b, primit ca argument, i i pune n acest tablou. Dac n fluxul de intrare nu sunt nca suficieni octei, dar nu s-a atins sfritul de fiier, procesul este pus n ateptare pn apar noi octei. Dac se ntlnete sfritul de fiier (EOF - End of File), se genereaz o EOFException; public final void readFully(byte[] b, int off, int len) throws IOException - acioneaz similar cu metoda precedent, dar se citesc len octei, care sunt depui n tabloul b, ncepand de la poziia off; public final void skipBytes(int n) throws IOException - sare peste n octei din fluxul de intrare; ntoarce numrul de octei srii efectiv (este posibil s nu reueasc s sar n octeti, de exemplu dac a ntalnit sfritul fluxului); public final boolean readBoolean() throws IOException - citete un octet din fluxul de intrare i l convertete n valoare boolean; public final byte readByte() throws IOException - citete din fluxul de intrare un singur octet, pe care l trateaz ca un numr ntreg cu semn n intervalul [-128, 127]; se consider c a fost scris cu writeByte(byte v); public final int readUnsignedByte() throws IOException - citete din fluxul de intrare un singur octet, pe care l trateaz ca numr ntreg fr semn n intervalul [0, 255] i l ntoarce sub form de int; public final short readShort() throws IOException - citete doi octei din fluxul de intrare i i interpreteaz ca un numr de tip short, scris anterior cu writeShort(short v); public final int readUnsignedShort() throws IOException - citete din fluxul de intrare doi octei, pe care i interpreteaz ca numr ntreg fr semn i-l ntoarce sub form de int; public final char readChar() throws IOException - citete din fluxul de intrare un char (doi octei, format Unicode); public final int readInt() throws IOException - citete patru octei si i interpreteaz ca un numr de tip int scris cu writeInt(int v); public final long readLong() throws IOException - citeste opt octei si i interpreteaz ca un numr de tip long, scris cu writeLong(long v); public final float readFloat() throws IOException - citete patru octei si i interpreteaz ca un numr de tip float, scris cu writeFloat(float v); public final double readDouble() throws IOException - citete opt octei si i interpreteaz ca un numr de tip double, scris cu writeDouble(double v); public final String readUTF() throws IOException - citete un ir de caractere n format UTF (care a fost scris cu writeUTF(String str));

57

177. Fluxuri de obiecte Fluxurile de obiecte sunt fluxuri de prelucrare care permit s se transmit obiecte. n acest scop, obiectele transmise trebuie s fie serializate, nainte de a fi transmise, adic s fie puse sub forma unei serii de octeti, ntr-un format care s permit la destinaie reconstituirea n memorie a obiectului respectiv. Astfel de obiecte se numesc serializabile. Pe platforma Java 2, fluxurile de obiecte se realizeaz prin clasele java.io.ObjectOutputStream i java.io.ObjectInputStream. Obiectele transmise de aceste fluxuri trebuie sa implementeze interfaa java.io.Serializable. 178. Interfaa Serializable Orice obiect care se transmite pe un flux trebuie s aparin unei clase care implementeaz interfaa java.io.Serializable. Aceasta inseamn c trebuie ndeplinite urmtoarele condiii: - la declararea clasei respective, se pune clauza implements Serializable; - clasa trebuie s conin un constructor fr argumente; - toate cmpurile obiectului trebuie s fie serializabile, adic fie s aparina unor tipuri de date, primitive, fie unor clase care implementeaz interfaa Serializable. Interfaa Serializable nu conine cmpuri sau metode. Clauza implements Serializable constituie doar o indicaie pentru compilatorul Java s o pun sub forma serializabil. 179. Clasa ObjectOutputStream Clasa java.io.ObjectOutputStream este clasa fluxurilor de prelucrare pentru obiecte, avnd rolul de a serializa obiectele care urmeaz s fie puse ntr-un flux de ieire. Fluxurile de obiecte se conecteaz la ieire la un alt flux, de preferin la un FileOutputStream, ByteArrayOutputStream sau PipedOutputStream, iar utilizarea lor este asemntoare cu cea a fluxurilor de date (DataOutputStream). ntr-un flux de obiecte se pot scrie att obiecte serializate, ct i date primitive sau iruri. Clasa ObjectOutputStream conine toate metodele de scriere a datelor primitive i a irurilor, care exist i n clasele DataOutputStream i RandomAccessFile. n plus, ea conine metode necesare pentru scrierea n flux a obiectelor, cea mai frecvent folosit fiind urmtoarea: public final void writeObject(Object obj)throws IOException - scrie n fluxul de ieire obiectul obj sub form serializat; Informaii mult mai ample despre aceast clas pot fi gsite n documentaia Java API. 180. Clasa ObjectInputStream Clasa java.io.ObjectInputStream servete pentru citirea (deserializarea) fluxurilor de obiecte care au fost scrise folosind clasa java.io.ObjectOutputStream. Intrarea unui ObjectInputStream este conectat la ieirea unui alt flux de intrare, de preferin FileInputStream, ByteArrayInputStream sau PipedInputStream. Clasa ObjectInputStream conine toate metodele de citire a datelor primitive i a irurilor existente n clasa DataInputStream. n plus, ea conine metode necesare pentru citirea obiectelor serializate, dintre care cea mai frecvent folosit este
public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException

Informaii mai ample despre aceast clas se gsesc n documentaia Java API. 181.

58

Fiiere n memoria extern a calculatorului, datele se pstreaz sub forma de fiiere. Fiierul (englez: File) este o colecie de nregistrri situat, de regul, pe un suport extern i identificat printr-un nume. Fiecare nregistrare (englez: Record) este o grupare de informaii sau de date care poate fi tratat n mod unitar. Fiierele pot fi clasificate dup diferite criterii. Dup formatul nregistrrilor, distingem fiiere de text i fiiere de date. n fiierele de text, fiecare nregistrare este o linie de text, adic un ir de caractere care se termin cu un marcaj de trecere la linie nou. Acest marcaj depinde de platform. De exemplu, n fiierele MS-DOS marcajul de sfrit de linie este format din secvena de caractere "\r\n", adic din caracterul de ntoarcere la cap de linie (Carriage Return, '\r' ) i caracterul de linie nou (New Line, '\n'), care au codurile ASCII 0x0D i respectiv 0x0A. Pe platforme Unix, marcajul de sfrit de linie este constituit numai din caracterul '\n' (New Line, 0x0A). Liniile textului pot avea lungimi diferite. Codificarea caracterelor n fiier depinde, de asemenea, de platform. n prezent, pentru fiierele de text se folosete cel mai frecvent codul ASCII, dar pot exista i platforme pe care se folosete Unicode sau o alt convenie de codificare. n fiierele de date, nregistrrile au, de regul, lungime predefinit, iar fiecare nregistrare este constituit din mai multe cmpuri de date. n principiu, toate nregistrrile unui fiier de date au acelai format. Prin formatul nregistrrii se nelege descrierea structurii acesteia, care const din specificarea cmpurilor de date pe care le conine, a lungimii fiecrui cmp, a tipului de date coninut n fiecare cmp i a modului de reprezentare a datelor. Datele din cmpuri pot fi reprezentate fie sub forma lor extern, fie sub form binar, iar formatul nregistrrilor difer de la un fiier la altul. Dup modul de exploatare, fiierele pot fi de intrare, de ieire sau de intrare/ieire (de manevr). n cazul fiierelor de intrare, din momentul deschiderii fiierului i pn n momentul nchiderii acestuia se pot efectua numai operaii de citire. n cazul fiierelor de ieire, ntre momentele de deschidere i de nchidere a fiierului respectiv se pot face numai operaii de scrieire. Desigur ns c, dup ce s-a ncheiat scrierea ntr-un anumit fiier de ieire i acesta a fost nchis, el poate fi deschis ca fiier de intrare. Acelai fiier poate fi citit de mai multe ori. Fiierele de intrare/ieire permit ca, dup ce au fost deschise, s se efectueze att operaii de scriere, ct i de citire. Dup modul de acces fiierele pot fi cu acces secvenial sau cu acces direct. Fiierele cu acces secvenial se caracterizeaz prin faptul c nregistrrile lor pot fi parcurse ntr-un singur sens, n ordinea n care acestea sunt plasate n fiier. n cazul fiierelor cu acces direct, numite i fiiere cu acces aleator (englez: random access file) ordinea de parcurgere a nregistrrilor din fiier este arbitrar, n sensul c la fiecare operaie de intrare/ieire fcut asupra fisierului respectiv se poate indica adresa sau numrul de ordine al nregistrrii care va fi citit sau scris. 182. Clasa File Instanele clasei java.io.File conin informaii privind numele fiierului i calea pe care se gseste acesta (engleza: Path). Clasa File ofer, de asemenea, metode prin care se pot face unele operaii legate de prezena fiierului respectiv: se poate afla dac fiierul exist, dac el poate fi citit sau scris, se poate crea un fiier nou, se poate terge un fiier existent etc. Calea indic modul n care poate fi localizat fiierul de pe disc. Calea poate fi absolut sau relativ. Calea absolut const n indicarea unitii de disc i a succesiunii de directoare prin care se ajunge de la rdacin la fiierul care ne intereseaz. Calea relativ, arat cum se poate ajunge de la directorul curent la fiierul cutat. Se tie c, pe diferite platforme, calea se reprezint n moduri diferite. De exemplu, n sistemul Unix, calea relativa "../../alpha/beta/fisier1.txt" indic faptul c, pornind de la directorul curent, se face o deplasare ctre rdcin cu doua directoare, dup care se merge nainte (ctre frunzele arborelui

59

director) trecnd la subdirectorul alpha i de aici la subdirectorul beta, n care se gsete fiierul cutat cu numele fiier1.txt. Remarcm c separarea directoarelor se face prin caracterul '/' (slash). Pe platformele firmei Microsoft (MS-DOS, Windows), ca separator se folosete caracterul '\' (backslash), care n limbajele C i Java se reprezint sub forma '\\'. n consecin, aceeai cale relativ se va scrie pe o astfel de platforma sub forma "..\\..\\alpha\\beta\\fisier1.txt". n clasa File, reprezentarea cii se face sub o form independent de platform. n acest scop, n instanele clasei File, calea se pstreaz sub forma unui tablou de iruri de caractere, n care se memoreaza numele fiecrui director coninut n cale. Separatorul se pstreaz ntr-un cmp separat i este setat automat n funcie de sistemul de operare al calculatorului pe care se execut programul. n acest fel, portabilitatea programului crete, ntruct nu trebuie modificate cile fiierelor folosite n program atunci cnd se trece de pe o platform pe alta 183. Citirea fluxurilor de octei: clasa FileInputStream Clasa java.io.FileInputStream permite citirea datelor din fiiere sub forma de fluxuri de octei. Orice instan a acestei clase este un flux de intrare, care are ca surs un fiier. La crearea acestei instane se caut i se deschide fiierul indicat ca argument al constructorului. Dac fiierul nu exist, sau nu poate fi deschis pentru citire, se genereaz o excepie. 184. Citirea din fiiere de caractere: Clasa FileReader Citirea unui fiier de text se poate face nu numai folosind o instan a clasei FileInputStream, ci i o instan a clasei FileReader. Deosebirea este c aceast ultim clas creeaz un flux de caractere, n loc de un flux de octei. Chiar dac fiierul nu este codificat n Unicode, ci n alt cod de caractere (de cele mai multe ori ASCII), se face automat conversia n Unicode. Clasa java.io.FileReader este derivat din clasa java.io.InputStreamReader i folosete metodele acesteia Constructori: public FileReader(String fileName) throws FileNotFoundException - deschide ca flux de caractere de intrare fiierul cu numele fileName (eventual acest ir cuprinde i calea); public FileReader(File file) - throws FileNotFoundException - deschide ca flux de intrare de caractere fiierul cu calea file; public FileReader(FileDescriptor fd) - deschide un nou flux de intrare de caractere i l conecteaz la fluxul deja existent, al crui descriptor este fd. Metode: Clasa FileReader nu are metode proprii, dar motenete urmtoarele metode ale clasei InputStreamReader: public int read() throws IOException - citete din fluxul de intrare un singur caracter i-l ntoarce convertit n int; public int read(char[] buf, int off, int len) throws IOException - citete din fluxul de intrare cel mult len caractere, pe care le pune n tabloul buf ncepnd de la poziia off (offset); public boolean ready() throws IOException - verific dac fluxul de intrare este gata pentru citire (dac conine caractere care pot fi citite); public void close() throws IOException - nchide fluxul de intrare; public String getEncoding() - ntoarce numele canonic al codului folosit pentru caractere.

185. Clasa FileWriter Scrierea ntr-un fiier de text se poate face, de asemenea, folosind clasa FileWriter. Instanele acestei clase sunt fluxuri de ieire de caractere, prin care se face scrierea ntr-un fiier. Clasa FileWriter este derivat din java.io.OutputStreamWriter i folosete metodele acesteia. Constructori:

60

public FileWriter(String fileName) throws IOException - deschide fiierul fileName pentru scriere i creeaz un flux de caractere de ieire conectat la acest fiier; dac fiierul nu exist, l creeaz; public FileWriter(String fileName, boolean append) throws IOException - la fel ca n cazul constructorului precedent, dar, dac al doilea parametru este true, scrierea n fiier se va face n coada celui deja existent; public FileWriter(File file) throws IOException - deschide pentru scriere fiierul indicat prin calea file i creeaz un flux de caractere de ieire conectat la acest fiier; public FileWriter(FileDescriptor fd) - creeaz un flux de caractere de ieire i l conecteaz la fluxul deja existent, cu descriptorul fd;

Metode: Metodele clasei FileWriter sunt motenite de la clasa OutputStreamWriter. public void write(int c) throws IOException - scrie n fiier un singur caracter; public void write(char[] cbuf, int off, int len) throws IOException - scrie n fiierul de ieire len caractere din tabloul de caractere cbuf, ncepnd de la poziia off (offset); public void write(String str, int off, int len) throws IOException - scrie n fiier len caractere din irul str ncepnd de la poziia off; public void flush() throws IOException - golete coninutul zonei tampon, descrcndu-l n fiierul de ieire; public void close() throws IOException - nchide fiierul de ieire; public String getEncoding() - ntoarce numele canonic al codului de caractere utilizat de acest flux.

186. Fiiere cu acces direct Fiierele cu acces direct, numite i fisiere cu acces aleator (engl.: Random Access File), sunt fiiere la care programatorul poate indica prin program locul (adresa) din fiier de la care ncepe operaia de citire sau de scriere. De regul, astfel de fiiere pot fi utilizate att pentru citire, ct i pentru scriere. Pentru ca nregistrrile sale s poat fi parcurse ntr-o ordine arbitrar, fiierul cu acces direct trebuie s fie stocat pe un suport adresabil, cum ar fi discul magnetic, discul optic, memoria RAM sau ROM. n JDK, fiierele cu acces direct sunt instane ale clasei RandomAccessFile. 187. Clasa RandomAccessFile Clasa java.io.RandomAccessFile este derivat direct din clasa Object, deci nu face parte din niciuna din cele patru ierarhii de fluxuri de intrare/ieire prezentate anterior, dei face parte, ca i acestea, din pachetul java.io. Fiierul cu acces direct este privit aici ca un tablou de octei memorat ntr-un sistem de fiiere (de regul n memoria extern). Exist un cursor al fiierului (numit n englez File Pointer), care se comport ca un indice al acestui tablou. Valoarea acestui indice (poziia cursorului de fiier relativ la nceputul acestuia) poate fi "citit" cu metoda getFilePointer() i poate fi modificat cu metoda seek(). Orice citire sau scriere se face ncepnd de la poziia pe care se gsete acest cursor. La sfritul operaiei, cursorul se deplaseaz pe o distan corespunzatoare cu numarul de octei care au fost citii sau scrii efectiv. Fiierul cu acces direct poate fi deschis n modul read (numai pentru citire), write (numai pentru scriere) sau read/write. n ultimul caz, este posibil s se efectueze att citiri , ct i scrieri.

188. Conceptul de proces. Procese paralele i concurente

61

n general, se numete proces o succesiune de transformri sau de operaii care conduce la realizarea unui anumit rezultat. Esenial pentru un proces este caracterul su temporal: fiecare transformare elementar necesit un anumit timp, iar procesul n ansamblu este o succesiune de astfel de transformri elementare. Termenul este folosit n domenii diferite: procese fizice, procese chimice, procese tehnologice, procese biologice, procese economice, procese sociale, procese juridice etc n informatic, procesul este un program n execuie. n consecin, fiecrui proces i se asociaz un program, i un ansamblu de resurse necesare executrii acestui program: o anumit zon din memoria intern n care se pstreaz datele programului, acces la procesorul sistemului, acces la anumite dispozitive de intrare/ieire etc. Procesul const tocmai n efectuarea n timp a succesiunii de operaii prevzut n program, folosind n acest scop resursele alocate. n mod tradiional, programul este executat de ctre un singur procesor (dispozitiv de prelucrare), care poate efectua, la un moment de timp dat, numai o singur operaie. n consecin, operaiile prevzute n program trebuie executate secvenial, astfel nct operaia urmtoare nu poate ncepe dect dup ncheierea celei precedente. Toate programele prezentate de noi n capitolele precedente se ncadreaz n aceast categorie. Majoritatea sistemelor de operare ale calculatoarelor moderne permit executarea n acelai timp a mai multor programe, deci permit concurena proceselor la nivel de program (de aplicaie). De exemplu, n timp ce editm un text, putem tipri alt text la imprimant, putem atepta sosirea de pe reea a unei pagini de Web etc. Studierea acestui mod de funcionare a calculatorului, cunoscut sub numele de multitasking, se face la cursul de "Sisteme de operare". Pentru a pune n eviden distincia ntre program i proces, putem meniona c acelai program poate da natere la procese diferite: dac programul conine ramificaii i/sau cicluri, parcurgerea efectiv a acestora (ce ramuri vor fi executate efectiv i de cte ori se vor parcurge ciclurile) depinde de datele de intrare. n cadrul multitaskingului, este chiar posibil ca doi utilizatori s utilizeze simultan acelai program folosind date diferite, astfel nct se genereaz procese diferite.

189. Fire de execuie Firul de execuie (n englez: Thread) este, n esen, un subproces strict secvenial. Meninnd definiia procesului ca un program n curs de execuie, putem considera acum c procesul este format din mai multe fire de execuie care se deruleaz n paralel, concurnd la utilizarea resurselor alocate procesului respectiv. n limbajul Java, exist posibilitatea de a se crea programe care conin mai multe fire de execuie. Aceasta nseamn c, la executarea lor, se vor crea mai multe subprocese care se vor desfura simultan, folosind acelai procesor i aceeai zon de memorie. Acest mod de funcionare se numete n englez multithreading. Exist dou moduri de a programa un fir de execuie: - prin extinderea clasei Thread; - prin implementarea interfeei Runnable.

62

190. Clasa Thread Clasa java.lang.Thread realizeaz un fir de execuie. Acesta poate fi un fir de execuie obinuit, sau un demon. Crearea unui fir de execuie se face invocnd unul dintre constructorii clasei Thread. Dintre acetia, i menionm aici pe urmtorii: public Thread() - creeaz un nou fir de execuie cu numele implicit Thread-n, unde n este un numr de ordine; public Thread(String name) - creeaz un nou fir de execuie cu numele name; public Thread(Runnable target) - creeaz un nou fir de execuie, care conine obiectul target cu interfaa Runnable, iar numele firului este cel implicit; public Thread(Runnable target, String name) - creeaz un nou fir de execuie, care conine obiectul target cu interfaa Runnable i are numele name. La programarea unui fir de execuie, principala atenie se acord metodei run(), deoarece ea conine programul propriu-zis, care trebuie executat de acest fir. Totui, metoda run()nu este invocat explicit. Ea este invocat de maina virtual Java, atunci cnd firul respectiv este pus n mod efectiv n execuie. Pentru redefinirea metodei Run este necesar sa creem o subclas a clasei Thread sau sa creem o clas cu interfaa Runnable, i s dm o instan a acestei clase ca argument constructorului clasei Thread. Dup ce firul de execuie a fost creat (de exemplu prin expresia new Thread()), el exist n memorie, dar nca nu poate fi executat. Se gsete, deci, n starea " nou creat" (engleza: born). Pentru a-l face gata de execuie, pentru firul respectiv este invocat metoda start(). Avnd n vedere cele de mai sus, punem n eviden urmatoarele stri n care se poate gsi un fir de execuie pe durata ciclului su de via: - nou creat (englez: born) - este starea n care se gsete imediat ce a fost creat prin operatorul new; n aceast stare, firul nu poate fi executat; - gata de execuie (englez: ready) - este starea n care firul poate fi pus n execuie; punerea efectiv n execuie se face de ctre maina virtuala Java atunci cnd procesorul este liber i nu sunt gata de execuie fire de prioritate superioar; - n execuie (englez: running) - este starea n care procesul se execut efectiv (ocup procesorul); - adormit (englez: sleeping) - este starea de oprire temporar, ca urmare a invocrii metodei sleep(); - blocat (englez: blocked) - este starea n care ateapt incheierea unei operaii de intrare/ieire; - n ateptare (englez: waiting) - este starea n care firul se gsete din momentul n care se invoc metoda wait(), pn cnd primete o confirmare dat prin invocarea metodei notify(); - mort (englez: dead) - este starea n care intr firul de execuie dupa ce s-a ncheiat executarea metodei run(). 191. Interfaa Runnable Interfaa java.lang.Runnable trebuie implementat de orice clas care nu este descendent a clasei java.lang.Thread, dar ale crei instane trebuie tratate ca nite fire de execuie. Singura metod a acestei interfee este public void run() care are acelai rol cu cea din clasa Thread. Necesitatea implementrii interfeei Runnable apare atunci cnd dorim s creem o clasa de fire de execuie care nu extinde clasa Thread. Motivul ar putea fi, de exemplu, cel c clasa nou creat, B, trebuie sa extind o alta clas, A, care nu este descendent a clasei Thread Se tie c n Java nu exist motenire multipl, deci clasa B nu poate avea ca superclase att clasa A, ct i clasa Thread. n acest caz, vom crea o clas B care extinde clasa A i implementeaza interfaa Runnable, care

63

conine metoda run(). Utilizarea instanelor claselor cu interfaa Runnable se face, punndu-le ca argumente ale urmtorilor constructori ai clasei Thread:
public Thread(Runnable target) public Thread(Runnable target, String name) O instan a clasei Thread creat cu un astfel de constructor, se comport ca i cum ar fi instana unei extensii a clasei Thread care ar conine metoda run() a obiectului target cu interfaa Runnable.

192. Sincronizarea firelor de execuie Pan n prezent, am considerat c fiecare fir ( Thread) se execut independent, fr legtura cu celelalte fire ale aceleeai aplicaii. Exist ns situaii, n care este necesar s se stabileasc anumite interdependene ntre fire. Aceasta se ntmpl, n special, atunci cnd un fir trebuie s foloseasc datele produse de alt fir: este evident c nu le poate folosi nainte ca ele s fie produse. n limbajul Java, sincronizarea firelor de execuie se face prin intermediul monitoarelor. Se numete monitor instana unei clase care conine cel puin o metod sincronizat, sau o metod care conine un bloc sincronizat. Se numete metod sincronizat orice metod care conine n antetul su modificatorul synchronized, deci este declarat sub forma [modif]synchronized tip nume_metoda(declaratii_argumente) {corpul_metodei} unde modif reprezinta ali eventuali modificatori (public, static etc.). Cnd un fir ncepe executarea uni metode sincronizate a unui monitor, el devine "proprietarul" monitorului cruia i aparine aceast metod (englez: owner) i deine aceast calitate pn la ncheierea executrii metodei sincronizate respective, sau pn cnd se autosuspend invocnd metoda wait(), aa cum vom explica ulterior. Pe toata durata ct un fir de execuie este proprietarul unui monitor, nici un alt fir nu poate invoca o metod sincronizat a monitorului respectiv . Aa dar, orice fir care, n acest interval de timp, ar ncerca s invoce o metod sincronizat a unui monitor al crui proprietar este alt fir, trebuie s atepte pn cnd monitorul respectiv este eliberat de proprietarul existent. n acest fel, se evit situaiile n care un fir de execuie ar interveni s fac modificri asupra unui obiect, n timp ce acesta se gsete deja n curs de prelucrare de ctre un alt fir. De exemplu, dac un fir de execuie efectueaz ordonarea datelor dintr-un tablou, nu este corect ca un alt fir, n acest timp, s modifice datele din acest tablou.

64