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

1
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) ca lculatorului 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 dec t 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 compil ate. 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:

public static void main(String args[]) {


// corpul metodei
}

2
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.

3
<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 ntot deauna
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 exec uie.
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.

4
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 o btine
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 option 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.

5
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 double int strictfp

6
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float package throw
char for private throws
class goto protected transient
const if public try
continue implements return void
default import short volatile
do instanceof static 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.05673, 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 operaii. 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.

7
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

8
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.

9
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 Valoarea expresiei


+ a+b adunare suma valorilor operanzilor
- a-b scadere diferenta valorilor operanzilor
* a*b inmultire produsul valorilor operanzilor
/ a/b impartire catul (rezultatul impartirii) primului operand la al doilea
% a%b 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.

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 deplasare la stnga cu s poziii binare
>> a>>s deplasare la dreapta cu s poziii binare, cu conservarea semnului
>>> a>>>s deplasare la dreapta fr semn, cu s poziii binare

10
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, obinndu-
se 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
bisunt biii de pe pozitia i a acestor operanzi. n tabel se d efectul fiecrei operaii asupra
bitului i al rezultatului.

ai bi ~a a&b a|b a^b


0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 1 0

11
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 short int long float double


byte X X X X X
short X X X X
char X X X X
int X X X
long X X
float 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).

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

12
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.

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.

13
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 Lungimea Intervalul de valori


float 4 octeti (32 biti) [-3.402347e+38f, ... 3.402347e38f]
double 8 octeti (64 biti) [-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].

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 Reprezentarea in Unicode Semnificatia


'\b' '\u0008' deplasare la stnga cu o poziie (backspace)
'\t' '\u0009' tabulare orizontal (horizontal tab)

14
'\n' '\u000a' trecere la linie nou (line feed, NL)
'\f' '\u000c' salt la pagina nou (form feed)
'\r' '\u000d' ntoarcerea carului (carriage return, CR)
'\"' '\u0022' ghilimele (double quote)
'\'' '\u0027' apostrof (single quote)
'\\' '\u005c' 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
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.

15
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

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.

16
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.

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

17
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,
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;]
..........................

18
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

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:

19
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

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.

20
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.

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).

21
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.

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

22
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
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

23
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;

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.

24
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
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

25
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[];
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

26
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.

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;

27
- 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.

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
}

28
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.

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

29
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.

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.

30
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.

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

31
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,

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

32
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.

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.

33
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
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

34
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).

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:

35
[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).

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.

36
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.

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:

37
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
(sau JFC/Swing), care ofer posibilitatea de a realiza interfee grafice al cror aspect nu depinde de
platforma pe care se execut programul.

38
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
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

39
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.

Exist cte o interfa de asculttor pentru fiecare clas de eveniment. De exemplu, pentru
ComponentEvent exist interfaa ComponentListener, pentru WindowEvent exista intefaa
WindowListener etc.

40
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
- 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

41
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).

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.

42
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 s-
a 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.

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

43
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.

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.

44
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.

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()

45
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);

145. Caracteristicile componentelor JFC/Swing


Fiecare component a interfeei utilizator grafice se caracterizeaz prin aspect, stare i comportament.

46
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
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

47
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

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

48
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.

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;

49
- 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 javax.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
poate obine sub forma de String textul existent.

50
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.

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].

51
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.
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;

52
- 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) La destinaie (flux de intrare)


- Deschiderea fluxului -Deschiderea fluxului
- ct timp (exist date de transmis) - ct timp (exist date de citit)
scriere n flux citire din flux
-nchiderea fluxului -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.
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).

53
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);
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.

54
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;
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

55
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
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.

56
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));

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

57
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. 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.

58
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
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

59
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:
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;

60
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

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

61
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.

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;

62
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
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.

63
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

S-ar putea să vă placă și