Sunteți pe pagina 1din 155

Limbajul JAVA -- Cuprins

Cuprins
Cuvnt nainte Introducere

PARTEA I-A: Fundamentele programrii


Calculatorul este agenda, telefonul i televizorul secolului urmtor. tii s-l folosii? C
apitolul I: Arhitectura calculatoarelor Modul n care programm un calculator depind
e direct de modul n care acesta este construit. Nu putem gndi reprezentarea i prelu
crarea informaiilor fr s tim care sunt principiile constructive de baz ale calculatoru
lui pentru care gndim. De aceea, nainte de toate, s ncercm s aflm cum funcioneaz un
lator modern. Capitolul II: Limbaje de programare Pentru a putea programa, este
necesar s avem cu calculatorul un limbaj comun, numit limbaj de programare, cu aj
utorul cruia s descriem informaiile pe care dorim s le prelucrm i modul n care acestea
trebuiesc prelucrate. Limbajele de programare actuale, dei foarte diferite ntre el
e, ofer n principiu aceleai tipuri de informaie primitiv i aceleai tipuri de operaii.
pitolul III: Reprezentarea informaiilor cu obiecte
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/index.html (1 of 3)12.01.2006 23:07:41

Limbajul JAVA -- Cuprins


Programarea orientat pe obiecte este cea mai nou tehnologie de proiectare a progra
melor de calculator. Aceasta ne permite, n esen, s modelm informaiile cu care lucreaz
alculatorul ntr-un mod similar cu acela n care percepem obiectele reale: fiecare o
biect este un uniune ntre proprieti i comportament.
PARTEA A II-A: Descrierea limbajului Java
Despre un om care tie dou limbi se spune c este de dou ori mai detept. Dar ce spunei d
espre un programator care tie dou limbaje? Capitolul IV: Structura lexical Java La n
ceputul prezentrii fiecrui limbaj de programare trebuie s definim exact setul de ca
ractere cu care lucreaz limbajul, modul de construcie a identificatorilor, comenta
riilor i literalilor specifici, care sunt operatorii i separatorii limbajului. n pl
us, trebuie s avem o list complet a cuvintelor rezervate Java. Capitolul V: Compone
nte de baz ale programelor Java Componentele de baz ale oricrui limbaj de programar
e sunt variabilele, expresiile i instruciunile. Ca orice alt limbaj de programare,
Java i definete propriile tipuri de date, implementeaz principalele instruciuni ale
programrii structurate i i definete propriii operatori i modul n care pot fi folosii
ia la construcia expresiilor. Capitolul VI: Obiecte Java Pentru a fi un limbaj or
ientat obiect, Java trebuie s defineasc o cale de a crea noi clase de obiecte i de
a le instania. n plus, limbajul trebuie s ofere suport pentru principalele trsturi al
e limbajelor orientate obiect: ncapsulare i derivare.
PARTEA A III-A: Tehnici de programare n Java
A cunoate o limb nu este totul. Mai trebuie s ai i ceva de spus. Capitolul VII: Mode
le de programare Modul n care este lansat un program i modul n care evolueaz execuia
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/index.html (2 of 3)12.01.2006 23:07:41

Limbajul JAVA -- Cuprins


sa ulterioar depinde de limbajul n care a fost scris programul i de mediul hardware
i software n care ruleaz programul. Limbajul Java definete dou moduri diferite pentr
u execuia programelor: aplicaiile Java i apleturile Java. Capitolul VIII: Structura
programelor n mod normal, sursele unui program complex sunt mprite n mai multe fiiere
pentru o administrare mai uoar. n Java, exist n mod normal cte un fiier surs pentru
care clas de obiecte n parte. Limbajul Java definete o serie de structuri sintactic
e care permit conectarea codului rezultat n urma compilrii diferitelor clase precu
m i organizarea acestor clase ntr-o structur ierarhic de pachete. Capitolul IX: Fire
de execuie i sincronizare n contextul sistemelor de operare moderne, lucrul cu fir
e multiple de execuie este n acelai timp o necesitate i o mod. Din pcate, fiecare sist
em de operare i definete propria sa bibliotec de funcii pentru a suporta aceast facili
tate. Limbajul Java, pentru a fi portabil cu adevrat, este obligat s-i defineasc pro
priul su suport pentru firele multiple de execuie. Bibliografie
JavaRo
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/index.html (3 of 3)12.01.2006 23:07:41

Limbajul JAVA -- IntegraSoft

Cuvnt nainte
Dei trim ntr-o societate n care rata de schimb a tehnologiei a ajuns s ne depeasc, ex
domenii care se schimb mult prea lent fa de ateptrile noastre. S lum de exemplu calcul
toarele. Nu exist zi n care s nu auzim de nouti n ceea ce privete viteza, numrul de c
ri sau miniaturizarea. Nu exist zi n care s nu auzim de noi aplicaii i de noi domenii
n care a fost introdus informatica. i totui, nimic esenial nu s-a schimbat n partea d
e fundamente. Aceeai arhitectur numeric guverneaz ntreg spectrul de calculatoare afla
te azi pe pia ca i acum jumtate de secol. n ceea ce privete comunicaia om-calculator,
ucrurile nu stau cu mult mai bine. Dei nu mai comunicm folosindu-ne de cifre binar
e i nici n limbaje apropriate de main, comunicm n continuare folosindu-ne de cteva pri
itive structurale de tip bucle sau condiii plus directive de calcul i transfer al
informaiilor. Abstracii precum programarea logic, funcional sau orientat obiect nu ext
ind blocurile de baz cu care acionm asupra mainii, le fac doar mai accesibile pentru
modul nostru de a gndi. ntr-un fel, programarea face exact aceeai greeal pe care a fc
ut-o i logica clasic statund c orice enun nu poate fi dect adevrat sau fals, fr nici
t nuanare. n pasul imediat urmtor s-au stabilit cteva enunuri adevrate fr demonstra
considerat c toate celelalte enunuri trebuie deduse din ele. Programarea a fcut ac
eleai presupuneri n ceea ce privete comunicaia om-calculator: exist cteva primitive fu
ncionale de baz i toat comunicaia trebuie s poat fi exprimat cu ajutorul acestora. n
te condiii, este normal ca apariia fiecrui nou limbaj de programare s trezeasc un int
eres major n lumea informatic. De fiecare dat, sperm c noul limbaj ne va permite o ex
primare mai uoar, mai flexibil, mai bogat. De aceea, la apariia fiecrui limbaj de prog
ramare care promite s ias din anonimat, ne grbim s aflm care sunt principalele facili
ti care ni se ofer. Apariia limbajului Java a fost nsoit de mult publicitate i de mu
epticism. Prerile au variat de la a spune c Java este o revoluie n programarea calcu
latoarelor i, mai ales, a reelelor de calculatoare pn la afirmaii care neag orice cara
cter novator al noului limbaj i care pun succesul Java n exclusivitate pe seama re
numelui de care se bucur firma Sun i a campaniei publicitare inteligent condus de m
arketingul acestei firme. Indiferent ns de motivul pentru care limbajul Java a aju
ns la cota extraordinar de popularitate pe care o simim cu toii, sentimentul genera
l este acela c Java a devenit deja o realitate i va rmne aa pentru suficient de mult
timp. Suficient de mult pentru a fi interesai s apreciem n cunotin de cauz care este a
evrul despre acest nou limbaj. Oricum, de la apariia limbajului C++, acum mai bine
de un deceniu n urm, nici un alt limbaj nu a nnegrit atta hrtie i nu a adus attea ben
ficii vnztorilor de servicii Internet. Sper ca aceast carte s ofere suportul de care
avei nevoie pentru a v putea forma propria prere: avem
file:///C|/Documents%20and%20Settings/Luminita/Desktop...20romana/Carte%20JAVA%2
0in%20romana/cuvantinainte.html (1 of 2)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft


n fa o revoluie sau un alt fapt comun? Trgu Mure, 24 aprilie 1996
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desktop...20romana/Carte%20JAVA%2
0in%20romana/cuvantinainte.html (2 of 2)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft


Introducere
Scurt istoric Ce este Java? Despre aceast carte Convenii utilizate n aceast carte Su
gestii i reclamaii Alte surse de informaii Mulumiri
Scurt istoric
Limbajul Java mpreun cu mediul su de dezvoltare i execuie au fost proiectate pentru a
rezolva o parte dintre problemele actuale ale programrii. Proiectul Java a porni
t cu scopul declarat de a dezvolta un software performant pentru aparatele elect
ronice de larg consum. Aceste echipamente se definesc ca: mici, portabile, distr
ibuite i lucrnd n timp real. De la aceste aparate, ne-am obinuit s cerem fiabilitate i
uurin n exploatare. Limbajul luat iniial n considerare a fost C++. Din pcate, atunci
d s-a ncercat crearea unui mediu de execuie care s respecte toate aceste condiii s-a
observat c o serie de trsturi ale C++ sunt incompatibile cu necesitile declarate. n p
rincipal, problema vine din faptul c C++ este prea complicat, folosete mult prea m
ulte convenii i are nc prea multe elemente de definiie lsate la latitudinea celor care
scriu compilatoare pentru o platform sau alta. n aceste condiii, firma Sun a porni
t proiectarea unui nou limbaj de programare asemntor cu C++ dar mult mai flexibil,
mai simplu i mai portabil. Aa s-a nscut Java. Printele noului limbaj a fost James G
ostling care v este poate cunoscut ca autor al editorului emacs i al sistemului de
ferestre grafice NeWS. Proiectul a nceput nc din 1990 dar Sun a fcut public specific
aia noului limbaj abia n 1995 la SunWorld n San Francisco. Numele iniial al limbajul
ui a fost Oak, numele unui copac care crete n faa biroului lui James Gostling. Ulte
rior, s-a descoperit c numele fusese deja folosit n trecut pentru un alt limbaj de
programare aa c a fost abandonat i nlocuit cu Java, spre deliciul programatorilor c
are iubesc cafenelele i aromele exotice.

Ce este Java?
n primul rnd, Java ncearc s rmn un limbaj simplu de folosit chiar i de ctre program
neprofesioniti, programatori care doresc s se concentreze asupra aplicaiilor n princ
ipal i abia apoi asupra tehnicilor de implementare a acestora. Aceast trstur poate fi
considerat ca o reacie direct
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (1 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft

la complexitatea considerabil a limbajului C++. Au fost ndeprtate din Java aspectel


e cele mai derutante din C++ precum suprancrcarea operatorilor i motenirea multipl. A
fost introdus un colector automat de gunoaie care s rezolve problema dealocrii me
moriei n mod uniform, fr intervenia programatorului. Colectorul de gunoaie nu este o
trstur nou, dar implementarea acestuia n Java este fcut inteligent i eficient folosi
un fir separat de execuie, pentru c Java are ncorporate faciliti de execuie pe mai mul
te fire de execuie. Astfel, colectarea gunoaielor se face de obicei n timp ce un a
lt fir ateapt o operaie de intrare-ieire sau pe un semafor. Limbajul Java este indep
endent de arhitectura calculatorului pe care lucreaz i foarte portabil. n loc s gene
reze cod nativ pentru o platform sau alta, compilatorul Java genereaz o secven de in
struciuni ale unei maini virtuale Java. Execuia aplicaiilor Java este interpretat. Si
ngura parte din mediul de execuie Java care trebuie portat de pe o arhitectur pe al
ta este mediul de execuie cuprinznd interpretorul i o parte din bibliotecile standa
rd care depind de sistem. n acest fel, aplicaii Java compilate pe o arhitectur SPAR
C de exemplu, pot fi rulate fr recompilare pe un sistem bazat pe procesoare Intel.
Una dintre principalele probleme ale limbajelor interpretate este viteza de exe
cuie, considerabil sczut fa de cea a limbajelor compilate. Dac nu v mulumete viteza
ecuie a unei astfel de aplicaii, putei cere mediului de execuie Java s genereze autom
at, plecnd de la codul mainii virtuale, codul specific mainii pe care lucrai, obinnduse astfel un executabil nativ care poate rula la vitez maxim. De obicei ns, n Java se
compileaz doar acele pri ale programului mari consumatoare de timp, restul rmnnd inte
rpretate pentru a nu se pierde flexibilitatea. Mediul de execuie nsui este scris n C
respectnd standardele POSIX, ceea ce l face extrem de portabil. Interpretorul Jav
a este gndit s lucreze pe maini mici, precum ar fi procesoarele cu care sunt dotate
aparatele casnice. Interpretorul plus bibliotecile standard cu legare dinamic nu
depesc 300 Koctei. Chiar mpreun cu interfaa grafic totul rmne mult sub 1 Moctet, ex
a-n vremurile bune. Limbajul Java este orientat obiect. Cu el se pot crea clase
de obiecte i instane ale acestora, se pot ncapsula informaiile, se pot moteni variabi
lele i metodele de la o clas la alta, etc. Singura trstur specific limbajelor orientat
e obiect care lipsete este motenirea multipl, dar pentru a suplini aceast lips, Java
ofer o facilitate mai simpl, numit interfa, care permite definirea unui anumit compor
tament pentru o clas de obiecte, altul dect cel definit de clasa de baz. n Java oric
e element este un obiect, n afar de datele primare. Din Java lipsesc funciile i vari
abilele globale. Ne rmn desigur metodele i variabilele statice ale claselor. Java e
ste distribuit, avnd implementate biblioteci pentru lucrul n reea care ne ofer TCP/I
P, URL i ncrcarea resurselor din reea. Aplicaiile Java pot accesa foarte uor reeaua, f
losindu-se de apelurile ctre un set standard de clase. Java este robust. n Java le
garea funciilor se face n timpul execuiei i informaiile de compilare sunt
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (2 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft

disponibile pn n momentul rulrii aplicaiei. Acest mod de lucru face ca sistemul s poat
determina n orice moment neconcordana dintre tipul referit la compilare i cel refer
it n timpul execuiei evitnduse astfel posibile intruziuni ruvoitoare n sistem prin in
termediul unor referine falsificate. n acelai timp, Java detecteaz referinele nule da
c acestea sunt folosite n operaii de acces. Indicii n tablourile Java sunt verificai
permanent n timpul execuiei i tablourile nu se pot parcurge prin intermediul unor p
ointeri aa cum se ntmpl n C/C++. De altfel, pointerii lipsesc complet din limbajul Ja
va, mpreun cu ntreaga lor aritmetic, eliminndu-se astfel una din principalele surse d
e erori. n plus, eliberarea memoriei ocupate de obiecte i tablouri se face automat
, prin mecanismul de colectare de gunoaie, evitndu-se astfel ncercrile de eliberare
multipl a unei zone de memorie. Java este un limbaj cu securitate ridicat. El ver
ific la fiecare ncrcare codul prin mecanisme de CRC i prin verificarea operaiilor dis
ponibile pentru fiecare set de obiecte. Robusteea este i ea o trstur de securitate. L
a un al doilea nivel, Java are incorporate faciliti de protecie a obiectelor din si
stem la scriere i/sau citire. Variabilele protejate ntr-un obiect Java nu pot fi a
ccesate fr a avea drepturile necesare, verificarea fiind fcut n timpul execuiei. n plu
, mediul de execuie Java poate fi configurat pentru a proteja reeaua local, fiierele
i celelalte resurse ale calculatorului pe care ruleaz o aplicaie Java. Limbajul Ja
va are inclus suportul nativ pentru aplicaii care lucreaz cu mai multe fire de exe
cuie, inclusiv primitive de sincronizare ntre firele de execuie. Acest suport este
independent de sistemul de operare, dar poate fi conectat, pentru o performan mai
bun, la facilitile sistemului dac acestea exist. Java este dinamic. Bibliotecile de c
lase n Java pot fi reutilizate cu foarte mare uurin. Cunoscuta problem a fragilitii su
erclasei este rezolvat mai bine dect n C++. Acolo, dac o superclas este modificat, tre
buie recompilate toate subclasele acesteia pentru c obiectele au o alt structur n me
morie. n Java aceast problem este rezolvat prin legarea trzie variabilelor, doar la e
xecuie. Regsirea variabilelor se face prin nume i nu printr-un deplasament fix. Dac
superclasa nu a ters o parte dintre vechile variabile i metode, ea va putea fi ref
olosit fr s fie necesar recompilarea subclaselor acesteia. Se elimin astfel necesitate
a actualizrii aplicaiilor, generat de apariia unei noi versiuni de bibliotec aa cum se
ntmpl, de exemplu, cu MFC-ul Microsoft (i toate celelalte ierarhii C ++).

Despre aceast carte


Aceast carte a fost scris pentru a veni n sprijinul acelora care doresc s programeze
n limbajul Java. Spre deosebire de majoritatea crilor existente la ora actual pe pi
aa internaional, nu prea multe de altfel, cartea de fa se focalizeaz asupra facilitil
pe care le ofer noul limbaj, lsnd pe planul al doilea descrierea bibliotecilor stan
dard, impresionante de altfel, definite de ctre Sun i colaboratorii acestuia. Aleg
erea a fost fcut din convingerea c bibliotecile vin i trec, se dezvolt, n timp ce limb
ajul rmne.
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (3 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft

Cartea se adreseaz n acelai timp nceptorilor i programatorilor profesioniti. nceptor


r gsi n prima parte noiuni fundamentale necesare oricrui programator. Profesionitii, n
schimb, vor gsi o referin complet a limbajului Java. Prima parte a crii i introduce
itorul pas cu pas n fundamentele funcionrii i programrii calculatoarelor tratnd la un
nivel accesibil noiuni precum memoria i procesorul, datele i instruciunile, clasele
de obiecte mpreun cu trsturile fundamentale ale programrii orientate obiect. Partea a
doua a crii prezint limbajul Java n detaliu mpreun cu o serie de exemple simple. Acea
st parte este conceput pentru a fi n acelai timp o introducere n sintaxa Java pentru
cei care au programat deja i o introducere n constrngerile sintactice i semantica un
ui limbaj de programare pentru nceptori. Partea a treia a crii prezint cteva dintre as
pectele fundamentale ale programrii n Java precum aplicaiile, apleturile, pachetele
de clase, firele de execuie i tratarea excepiilor. Aceast parte este conceput de sin
e stttoare i poate servi ca exemplu de programare n Java. Fiecare seciune din aceast p
arte conine exemple extinse de aplicaii scrise n Java, comentate n surs i n afara aces
eia. Cititorul nceptor n ale programrii trebuie s parcurg cartea de la nceput pn la
entru a putea intra treptat n tainele programrii n general i ale limbajului Java. Pe
ntru cititorii avansai, prima parte nu constituie un interes major i poate fi srit fr
implicaii majore n nelegerea materialului din prile urmtoare. Aceti cititori pot s t
irect la partea a treia pentru a urmri exemplele i abia dup aceea s revin la partea a
doua pentru informaii detaliate asupra sintaxei i facilitilor Java. Partea a doua p
oate fi folosit i pe post de referin. O singur excepie: ultima seciune din prima parte
introduce noiunea de interfa, puin cunoscut programatorilor n alte limbaje dect Java.
ste util ca aceast seciune s fie consultat de ctre toi cititorii, indiferent de nivelu
l de pregtire n care se afl.
Convenii utilizate n aceast carte
Pentru descrierea sintacticii limbajului Java, am apelat la urmtoarele convenii ob
inuite de reprezentare a regulilor gramaticale:
q q

Cuvintele rezervate ale limbajului Java sunt scrise n caractere ngroate, ca: while,
do, final. Cuvintele care in locul construciilor reale ale programului sunt scris
e cu caractere oblice, ca n: if(Condiie) Instruciune1 else Instruciune2 Condiie, Inst
ruciune1 i Instruciune2, care apar n descriere, trebuiesc nlocuite cu condiiile adevra
e, respectiv cu instruciunile adevrate care trebuiesc executate n funcie de condiie.
De exemplu, o construcie real, care respect descrierea de mai sus ar putea fi:
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (4 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft


if( i < j ) min = i; else min = j;
q
O list de termeni separai prin caractere |, se poate nlocui cu oricare dintre terme
nii listei. De exemplu: public | private | protected nseamn c n locul acestui termen
poate s apar oricare dintre cuvintele rezervate specificate n list, public, private
sau protected.
q
Un termen pus ntre paranteze ptrate este opional. De exemplu, n descrierea: Tip Nume
Variabil [Iniializator] ; Partea de Iniializator poate s lipseasc.
q
Dac, dup un termen apare caracterul *, acesta reprezint faptul c termenul se poate r
epeta de un numr arbitrar de ori, eventual niciodat. De exemplu, n: class NumeClas C
lauzImplements* caracterul * reprezint faptul c termenul notat prin ClauzImplements
se poate repeta de un numr arbitrar de ori, eventual niciodat. Pe marginea din stng
a a paginii, vei ntlni o serie de simboluri grafice, cu specificaie precis, care v vor
permite s navigai mai uor n interiorul crii. Iat semnificaia acestora:

Semnul din stnga reprezint faptul c n paragraful marcat introduce definiia unui nou t
ermen. Termenul nou introdus este reprezentat n interiorul semnului i este scris c
u caractere oblice n textul paragrafului. n cazul de fa cuvntul nou introdus este cuvn
tul definiia. Atunci cnd gsii o trimitere la un paragraf pentru explicaii, cutai acest
semn pe margine pentru a gsi mai repede definiia noiunii dorite. Semnul din stnga re
prezint o trimitere napoi ctre o noiune deja prezentat n partea de fundamente. Aceast
rimitere conine deasupra simbolului grafic numele noiunii pe care trebuie s l cutai nt
-un simbol de definiie, i sub simbolul grafic numrul paragrafului unde se afl definii
a. Cititorul
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (5 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft

nceptor ca i cel avansat poate urma aceste trimiteri pentru a-i mprospta cunotinele s
pentru a se familiariza cu cuvintele sau expresiile folosite pentru a desemna noi
uni greu traductibile. Semnul din stnga reprezint o referire n avans a unei noiuni c
are va fi introdus mai trziu. Acest semn este destul de rar n interiorul crii, dar es
te totui nevoie de el pentru a face referire la anumite faciliti care i gsesc cel mai
bine locul n paragraful n care apare semnul. Putei sri fr probleme aceste precizri la
rima citire a capitolului i s le luai n seam doar atunci cnd folosii cartea pe post de
referin pentru limbajul Java. Semnul din stnga reprezint referirea unei noiuni care n
u este descris n carte. Acest semn apare atunci cnd se face o referin la una din clas
ele standard ale mediului Java. Putei gsi informaii exacte despre clasa respectiv la
adresa www.javasoft.com, sau putei ncrca din Internet o documentaie complet prin ftp
de la adresa ftp.javasoft.com, directorul /docs. Semnul din stnga reprezint o tri
mitere ctre alt carte, n care noiunile din paragraf sunt prezentate mai pe larg. Am
folosit acest semn doar de dou ori, pentru a trimite ctre o carte disponibil la ace
eai editur cu cartea prezent, despre HTML, scris de Dumitru Rdoiu. O putei gsi pe prim
poziie n bibliografie.

Sugestii i reclamaii
Posibilele erori care s-au strecurat n aceast carte cad n sarcina exclusiv a autorul
ui ei care i cere pe aceast cale scuze n avans. Orice astfel de eroare sau neclarita
te cu privire la coninutul crii poate fi comunicat direct autorului pe adresa erotar
iu@agora.ro sau: Eugen Rotariu Computer Press Agora Str. Tudor Vladimirescu, Nr.
63/1, Cod. 4300, Trgu Mure Romnia n Internet, putei s contactai editura Computer Pres
Agora la adresa www.agora.ro. Pe server exist o pagin separat dedicat acestei cri. Pu
tei verifica periodic aceast pagin pentru eventuale corecturi, exemple suplimentare
sau adugiri la coninutul crii.

Alte surse de informaii


Subiectul Java este departe de a fi ncheiat n aceast carte aa c, dac reacia dumneavoas
r este pozitiv, voi ncerca s construiesc o a doua carte dedicat claselor standard Jav
a, mediilor de dezvoltare, din ce n ce mai numeroase, ierarhiilor de baz de date,
obiecte distribuite i aa mai departe care i-au fcut apariia de la Sun sau din alt part
e n ultimul timp. Nu ezitai s-mi dai de tire dac vei considera util o asemenea contin
e.
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (6 of 7)12.01.2006 23:07:42

Limbajul JAVA -- IntegraSoft

Pn atunci ns, putei consulta crile listate n seciunea de bibliografie de la sfritu


cri. Numai cri n limba englez n acest domeniu deocamdat, dar m atept ca situaia s
e dramatic n perioada imediat urmtoare. Noi cri de Java dedicate cititorilor romni nu
vor ntrzia s apar. Internet-ul este de asemenea o surs interminabil de informaii, sit
ri Java exist i vor continua s apar n ntreaga lume. Adresa de baz este probabil www.ja
asoft.com, adres care v pune n legtur direct cu firma care a creat i ntreine n cont
dezvoltarea Java. n plus, putei consulta revista electronic JavaWorld de la adresa
www.javaworld.com care conine ntotdeauna informaii fierbini, cursuri, apleturi i legtu
ri ctre alte adrese unde v putei mbogi cunotinele despre Java. Pentru documentaii, e
e i nouti n lumea Java putei consulta i www.gamelan.com sau www. blackdown.org. Pentru
cei care doresc s dezvolte apleturi pe care s le insereze n propriile pagini HTML,
recomand n plus citirea crii lui Dumitru Rdoiu, HTML - Publicaii Web, editat de aseme
nea la Computer Press Agora. n fine, nu ncetai s cumprai revistele PC Report i Byte Ro
ia ale aceleiai edituri, pentru c ele vor conine ca de obicei informaii de ultim or, c
ursuri i reportaje de la cele mai noi evenimente din lumea calculatoarelor.

Mulumiri
Mulumesc tuturor celor care, voit sau nu, au fcut posibil aceast carte. Mulumesc celo
r de la editura Computer Press Agora i managerului ei Romulus Maier pentru c mi-au
facilitat publicarea acestei cri. Fr munca lor, cartea s-ar fi aflat n continuare n v
itrina proprie cu visuri nerealizate. Mulumesc celor care mi-au druit o parte din
timpul lor preios pentru a citi i comenta primele versiuni ale crii: Iosif Fettich,
Mircea i Monica Cioat, Alexandru Horvath. Mulumesc celor cu care am discutat de atte
a ori despre soarta calculatoarelor, programelor, Romniei i lumii n general. Ei au
fcut din mine omul care sunt acum: Mircea Srbu, Dumitru Rdoiu, Szabo Laszlo, Mircea
Pantea. Mulumesc celor care s-au ocupat de designul i tehnoredactarea acestei cri n
frunte cu Adrian Pop i Octav Lipovan. Cel dinti lucru care v-a atras la aceast cart
e este munca lor. Carmen, i mulumesc c nu te-ai dat btut. Va veni i vremea n care sr
cu calculatoarele oprite.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Deskto...%20romana/Carte%20JAVA%2
0in%20romana/introducere.html (7 of 7)12.01.2006 23:07:42

Capitolul I -- Arhitectura calculatoarelor


Capitolul I Arhitectura calculatoarelor
1.1 Modelul Von Neumann de arhitectur a calculatoarelor 1.2 Organizarea memoriei
interne 1.3 Reprezentarea informaiilor n memoria intern 1.4 Modelul funcional al cal
culatoarelor
1.1 Modelul Von Neumann de arhitectur a calculatoarelor
Descrierea care urmeaz este o descriere a modelului Von Neumann de construcie a ca
lculatoarelor. Se pot aduce destule critici acestui model care domin sever nc de la
nceputurile mainilor de calcul electronic, dar el continu s fie singurul model funci
onal. Modelul Von Neumann definete calculatorul ca pe un ansamblu format dintr-o
unitate central i o memorie intern. Unitatea central sau procesorul este responsabil
cu administrarea i prelucrarea informaiilor n timp ce memoria intern servete la depoz
itarea acestora. n terminologia calculatoarelor, depozitarea informaiilor n memoria
intern a calculatorului se numete memorare. Acest ansamblu unitate central plus me
morie intern comunic cu exteriorul prin intermediul unor dispozitive periferice. D
ispozitivele periferice pot fi de intrare sau de ieire n funcie de direcia n care se
mic datele. Dac datele sunt furnizate de dispozitivul periferic i transferate spre u
nitatea central, atunci dispozitivul este de intrare precum sunt tastatura sau ma
usul. Dac datele sunt generate de unitatea central i transmise spre dispozitivul pe
riferic atunci dispozitivul este de ieire precum sunt ecranul sau imprimanta. Exi
st i dispozitive mixte de intrare/ieire precum sunt discurile pentru memorarea exte
rn a informaiilor. Tastatura calculatorului reprezint un set de butoane (taste) ins
cripionate care ne permite transmiterea ctre unitatea central a unor litere, cifre,
semne de punctuaie, simboluri grafice sau comenzi funcionale. Mausul reprezint un
dispozitiv simplu, mobil, care ne permite indicarea unor regiuni ale ecranului c
u ajutorul unui cursor. n plus, mausul ne permite activarea regiunilor respective
cu ajutorul celor 1-2-3 butoane ale sale. Ecranul este un dispozitiv cu ajutoru
l cruia calculatorul comunic informaii spre exterior. Aceste informaii apar sub form
de litere, cifre, semne de punctuaie, simboluri grafice sau desene oarecare ntro v
arietate mai mare sau mai mic de culori. Informaia de pe ecran se pierde odat cu re
desenarea acestuia. Pentru transferul acestor informaii pe hrtie i ndosarierea lor s
-au creat alte dispozitive periferice, numite imprimante.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap1.html (1 of 5)12.01.2006 23:07:43

Capitolul I -- Arhitectura calculatoarelor

Memoria intern pierde informaiile odat cu oprirea alimentrii calculatorului. Pentru


a salva informaiile utile, precum i programele de prelucrare ale acestora este nev
oie de dispozitive de memorare permanente. Din aceast categorie fac parte discuri
le calculatorului. Exist mai multe modele de discuri precum discurile fixe, discu
rile flexibile sau compact-discurile, fiecare dintre acestea avnd caracteristici,
viteze de acces i capaciti de memorare diferite. Informaiile salvate pe discuri pot
fi ncrcate din nou n memoria intern la o pornire ulterioar a calculatorului. V vei n
ba desigur de ce este nevoie de dou tipuri distincte de memorie: pentru c discuril
e au viteze de acces mult prea mici pentru a putea fi folosite direct de ctre uni
tatea central.
Figura 1.1 Modelul constructiv al calculatoarelor Von Neuman.
Dei modelul constructiv de baz al calculatoarelor nu a evoluat prea mult, componen
ta tehnologic a acestora s-a aflat ntr-o permanent evoluie. Transformarea vizeaz la o
ra actual viteza de lucru i setul de instruciuni ale unitii centrale, capacitatea i vi
teza de stocare a memoriei interne precum i tipurile i calitatea dispozitivelor pe
riferice.
1.2 Organizarea memoriei interne
Memoria calculatoarelor actuale este, din punct de vedere logic, o niruire de cifr
e binare, 0 sau 1. Alegerea bazei 2 de numeraie are n principal raiuni constructive
: este mult mai uor i mult mai fiabil
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap1.html (2 of 5)12.01.2006 23:07:43

Capitolul I -- Arhitectura calculatoarelor

s reprezini un principiu binar ca absena/prezena sau plus/minus dect unul nuanat. O ci


fr binar este numit, n termeni de calculatoare, bit. Biii sunt grupai, opt cte opt, n
iti de memorare numite octei. Iari, alegerea cifrei opt are raiuni istorice: era nevoi
e de o putere a lui doi care s fie ct mai mare, pentru a putea permite transferuri
rapide ntre diversele componente ale calculatorului (unitate central, memorie, di
spozitive periferice), dar totodat suficient de mic pentru ca realizarea dispoziti
velor implicate, cu tehnologia existent, s fie posibil. Cifra opt avea n plus avanta
jul c permitea reprezentarea tuturor caracterelor tipribile necesare la ora respec
tiv precum: literele, cifrele sau semnele de punctuaie. ntr-un octet se pot repreze
nta pn la 256 (28) astfel de caractere. n prezent octetul este depit datorit necesiti
e reprezentare a caracterelor tuturor limbilor scrise din lume. Pentru a accesa
o informaie n memorie este nevoie de un mod de a referi poziia acesteia. Din acest
motiv, octeii memoriei au fost numerotai unul cte unul ncepnd de la 0 pn la numrul ma
de octei n memorie. Numrul de ordine al unui octet l vom numi pentru moment adres. N
oiunea de adres i-a extins semnificaia n ultimul timp dar, pentru nelegerea acestui ca
itol, explicaia de mai sus este suficient. Zona fizic de memorie rezervat unei anumi
te informaii se numete locaia informaiei respective n memorie. n unele dintre locaiile
din memorie putem pstra chiar adresa unor alte locaii din memorie. Informaia memora
t n aceste locaii se numete referin. Cu alte cuvinte, o referin este o informaie mem
r-o locaie de memorie care ne trimite spre (se refer la) o alt locaie de memorie. O
locaie de memorie se poate ntinde pe mai mult dect un octet.

1.3 Reprezentarea informaiilor n memoria intern


Dup cum ai putut observa din cele prezentate pn acum, n memoria calculatorului nu se
pot nscrie dect numere naturale. Mai precis, fiecare octet de memorie poate memora
un numr de la 0 la 28-1, adic 255. Orice alt informaie pe care dorim s o reprezentm n
memoria calculatorului trebuie redus la unul sau mai multe numere naturale mici.
Aceast trstur a modelului actual de memorare introduce un pas suplimentar de abstrac
tizare n procesul de proiectare de aplicaii, i anume pasul n care se construiete un m
odel de reprezentare n memorie a datelor, necesar aplicaiei. S presupunem, de exemp
lu, c o aplicaie necesit reprezentarea n memoria calculatorului a unui set de culori
. Pentru memorarea acestor culori este nevoie de o convenie care s stabileasc o cor
esponden biunivoc ntre setul de culori i setul de numere naturale folosite la repreze
ntarea acestora. Corespondena este biunivoc pentru c ea trebuie s ofere posibilitate
a de a regsi n mod unic o culoare plecnd de la un numr i, n acelai timp, s ofere o re
zentare unic, sub form de numr, pentru fiecare culoare. De exemplu, putem pune n cor
esponden culoarea neagr cu numrul 0, culoarea roie
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap1.html (3 of 5)12.01.2006 23:07:43

Capitolul I -- Arhitectura calculatoarelor


cu numrul 1, culoarea albastr cu numrul 2 i aa mai departe. Ori de cte ori vom memora
2 vom memora albastru i ori de cte ori vom dori s memorm rou, vom memora 1. Ca rezult
at al folosirii acestei abstractizri, datele aplicaiei devin dependente de convenia
de reprezentare utilizat. Presupunnd c o aplicaie construiete n memorie o imagine gra
fic folosindu-se de o anumit coresponden dintre culori i numere, oricare alt aplicaie
are vrea s utilizeze imaginea respectiv trebuie s foloseasc aceeai convenie. O cale si
milar de rezolvare vom ntlni i la reprezentarea caracterelor. Caracterele sunt denum
irea ntrun singur cuvnt a literelor, cifrelor, semnelor de punctuaie sau simboluril
or grafice reprezentate n memorie. Este nevoie de o convenie prin care atam fiecrui c
aracter cte un numr natural memorabil ntr-un octet. n cazul reprezentrii caracterelor
, exist chiar un standard internaional care definete numerele, reprezentabile pe un
octet, corespunztoare fiecrui caracter n parte, numit standardul ASCII. Alte stand
arde, cum ar fi standardul Unicode, reprezint caracterele pe doi octei, ceea ce le
d posibilitatea s ia n considerare o gam mult mai larg de caractere. Reprezentare pe
un octet (ASCII) 65-90 97-122 48-57 195,227 206,238 194,226 170,186 222,254
Caracter A-Z a-z 0-9 , , , , ,
Tabelul 1.1 Un fragment din codurile ASCII i Unicode de reprezentare a caracterel
or grafice n memoria calculatoarelor.

Desigur, este greu s inem minte codul numeric asociat fiecrui caracter sau fiecrei c
ulori. Este nevoie de pai suplimentari de codificare, care s pun informaia n legtur cu
simboluri mai uor de inut minte dect numerele. De exemplu, este mult mai uor pentru
noi s inem minte cuvinte sau imagini. Dar s nu uitm niciodat c, pentru calculator, cel
mai uor este s memoreze i s lucreze cu numere.
1.4 Modelul funcional al calculatoarelor
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap1.html (4 of 5)12.01.2006 23:07:43

Capitolul I -- Arhitectura calculatoarelor

Fiecare calculator definete un numr de operaii care pot fi executate de unitatea sa


central. Aceste operaii sunt n principal destinate memorrii sau recuperrii informaiil
or din memoria intern, calculelor aritmetice sau logice i controlului dispozitivel
or periferice. n plus, exist un numr de instruciuni pentru controlul ordinii n care s
unt executate operaiile. O instruciune este o operaie elementar executabil de ctre uni
tatea central a unui calculator. O secven de mai multe instruciuni executate una dup
cealalt o vom numi program. Instruciunile care compun un program trebuiesc i ele re
prezentate n memorie, la fel ca orice alt informaie, din cauza faptului c unitatea c
entral nu are posibilitatea s-i pstreze programele n interior. Pentru memorarea acest
or instruciuni este nevoie de o nou convenie de reprezentare care s asocieze un numr
sau o secven de numere naturale fiecrei instruciuni a unitii centrale. Execuia unui pr
gram de ctre calculator presupune ncrcarea instruciunilor n memoria intern i execuia
stora una cte una n unitatea central. Unitatea central citete din memorie cte o instru
ciune, o execut, dup care trece la urmtoarea instruciune. Pentru pstrarea secvenei, un
tatea central memoreaz n permanen o referin ctre urmtoarea instruciune ntr-o loca
mit indicator de instruciuni. Modelul de execuie liniar a instruciunilor, n ordinea n
are acestea sunt aezate n memorie, este departe de a fi acceptabil. Pentru a fi ut
il, un program trebuie s poat s ia decizii de schimbare a instruciunii urmtoare n func
e de informaiile pe care le prelucreaz. Aceste decizii pot nsemna uneori comutarea
execuiei de la o secven de instruciuni la alta. Alteori, este necesar s putem executa
o secven de instruciuni n mod repetat pn cnd este ndeplinit o anumit condiie expr
ajutorul informaiilor din memorie. Numrul de repetri ale secvenei de instruciuni nu p
oate fi hotrt dect n momentul execuiei. Aceste ramificri ale execuiei se pot simula de
tul de uor prin schimbarea valorii referinei memorate n indicatorul de instruciuni.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap1.html (5 of 5)12.01.2006 23:07:43

Capitolul II -- Limbaje de programare


Capitolul II Limbaje de programare
2.1 Comunicaia om-main 2.2 Tipuri de numere reprezentabile n calculator 2.3 Valori d
e adevr 2.4 iruri de caractere 2.5 Tipuri primitive de valori ale unui limbaj de p
rogramare 2.6 Tablouri de elemente 2.7 Expresii de calcul 2.8 Variabile 2.9 Inst
ruciuni

2.1 Comunicaia om-main


Pentru a executa un program de calculator este necesar s putem comunica cu unitat
ea central pentru a-i furniza instruciunile necesare. Cel mai simplu mod de a le c
omunica este nscrierea codului instruciunilor direct n memoria calculatorului de un
de pot fi citite de ctre unitatea central. Aceast cale este ns extrem de anevoioas pen
tru programator pentru c el trebuie s nvee s se exprime coerent ntr-un limbaj ale crui
componente de baz sunt coduri numerice. O alternativ mai bun este folosirea unui li
mbaj de comunicaie format dintr-un numr foarte mic de cuvinte i caractere speciale m
preun cu un set de convenii care s ajute la descrierea numerelor i a operaiilor care
trebuiesc executate cu aceste numere. Limbajul trebuie s fie att de simplu nct calcu
latorul s poat traduce singur, prin intermediul unui program numit compilator, fra
zele acestui limbaj n instruciuni ale unitii centrale. Ori de cte ori vom imagina un
nou limbaj de comunicaie cu calculatorul va trebui s crem un nou program compilator
care s traduc acest limbaj n instruciuni ale unitii centrale, numite uneori i instruc
ni main. n realitate folosirea termenului de limbaj de comunicaie nu este extrem de
fericit pentru c de obicei noi doar instruim calculatorul ce are de fcut i cum trebu
ie s fac acel lucru, fr s-i dm vreo ans acestuia s comenteze sarcinile primite. n c
re vom numi aceste limbaje simplificate limbaje de programare pentru a le deoseb
i de limbajele pe care le folosim pentru a comunica cu ali oameni i pe care le vom
numi limbaje naturale. Limbajele de programare trebuie s ne ofere o cale de desc
riere a modulului n care dorim s reprezentm informaiile cu care lucreaz programul, o
cale de a specifica operaiile care trebuiesc executate cu aceste informaii i o cale
de a controla ordinea n care sunt executate aceste operaii. n plus, limbajele de p
rogramare trebuie s respecte urmtorul principiu fundamental: rezultatul
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (1 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

execuiei unei comenzi dintr-un limbaj de programare trebuie s fie complet determin
at. Asta nseamn c n limbajele de programare nu este permis nici o form de ambiguitate
a exprimrii. Informaiile reprezentate n memoria calculatorului i prelucrate de ctre u
n program scris ntr-un limbaj de programare se numesc date. Tipurile de date care
se pot descrie direct cu un anumit limbaj de programare se numesc tipurile de d
ate elementare ale limbajului. Operaiile elementare posibil de exprimat ntr-un lim
baj de programare se numesc instruciuni ale limbajului. Limbajele de programare a
u evoluat foarte mult de la nceputurile calculatoarelor. Tendina general este aceea
de apropiere treptat de limbajele naturale i de modul n care acestea descriu i util
izeaz informaiile. Abstraciile exprimabile cu ajutorul limbajelor de programare sun
t din ce n ce mai multe i cuprind o gam din ce n ce mai larg a noiunilor fundamentale
cu care opereaz mintea uman. Un alt aspect n care se reflect evoluia limbajelor de pr
ogramare este reprezentat de creterea profunzimii i calitii controlului pe care comp
ilatoarele l fac n momentul traducerii din limbaj de programare n limbaj main, astfel
nct ansa de a grei la descrierea programului s fie ct mai mic. Cu toate c limbajele
programare au fcut pai eseniali n ultimul timp, ele au rmas totui foarte departe de li
mbajele naturale. Pentru a programa un calculator, trebuie s poi gndi i s poi descrie
problemele ntr-unul dintre limbajele pe care acesta le nelege. Din acest motiv, scr
ierea programelor continu s rmn o activitate rezervat unui grup de iniiai, chiar dac
t grup este n continu cretere.

2.2 Tipuri de numere reprezentabile n calculator


Dei toate informaiile reprezentabile direct n memoria calculatorului sunt doar nume
re naturale, constructorii calculatoarelor de astzi au diversificat tipurile aces
tora prin stabilirea unor convenii de reprezentare pentru numerele negative, real
e i pentru caractere. Aceste convenii folosesc numerele naturale pentru reprezenta
rea celorlalte tipuri de numere. Uneori, reprezentrile ocup mai mult de un octet n
memoria calculatorului, dimensiunile obinuite fiind 1, 2, 4 sau 8 octei. Sau, echi
valent, 8, 16, 32 sau 64 de bii. Numerele naturale sunt ntotdeauna pozitive. Pentr
u reprezentarea unui numr ntreg cu semn pot fi folosite dou numere naturale. Primul
dintre acestea, avnd doar dou valori posibile, reprezint semnul numrului i se poate
reprezenta folosind o singur cifr binar. Dac valoarea acestei cifre binare este 0, n
umrul final este pozitiv, iar dac valoarea cifrei este 1, numrul final este negativ
. Al doilea numr natural folosit n reprezentarea numerelor ntregi cu semn conine val
oarea absolut a numrului final. Aceast convenie, dei are dezavantajul c ofer dou repr
ntri pentru numrul zero, un zero pozitiv i altul negativ, este foarte aproape de re
prezentarea numerelor cu semn folosit de calculatoarele moderne. n realitate, conv
enia care se folosete pentru reprezentarea numerelor ntregi cu semn este aa numita
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (2 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

reprezentare n complement fa de doi. Aceasta reprezint numerele negative prin comple


mentarea valorii lor absolute bit cu bit i apoi adunarea valorii 1 la numrul rezul
tat. Complementarea valorii unui bit se face nlocuind valoarea 1 cu 0 i valoarea 0
cu 1. Dac avem de exemplu numrul 1, reprezentat pe un octet ca un ir de opt cifre
binare 00000001, complementarea bitcu bit a acestui numr este numrul reprezentat p
e un octet prin11111110. Pentru a reprezenta valoarea -1 nu ne mai rmne altceva de
fcut dect s adunm la numrul rezultat n urma complementrii un 1 i reprezentarea final
umrului ntreg negativ -1 pe un octet este 11111111. n aceast reprezentare, numrul 000
00000 binar reprezint numrul 0 iar numrul 10000000, care mai nainte reprezenta numrul
0 negativ, acum reprezint numrul -128. ntr-adevr, numrul 128 se poate reprezenta n bi
nar prin 10000000. Complementat, acest numr devine 01111111 i dup adunarea cu 1, 10
000000. Observai c numerele 128 i -128 au aceeai reprezentare. Convenia este aceea c s
e pstreaz reprezentarea pentru -128 i se elimin cea pentru 128. Alegerea este datora
t faptului c toate numerele pozitive au n primul bit valoarea 0 i toate cele negativ
e valoarea -1. Prin transformarea lui 10000000 n -128 se pstreaz aceast regul. Folosi
nd reprezentarea n complement fa de doi, numerele ntregi reprezentabile pe un octet
sunt n intervalul -128 pn la 127, adic -27 pn la 27 -1. n general, dac avem o configu
de n cifre binare, folosind reprezentarea n complement fa de doi putem reprezenta
numerele ntregi din intervalul nchis -2n-1 pn la 2n-1-1. n practic, se folosesc numere
ntregi cu semn reprezentate pe 1 octet, 2 octei, 4 octei i 8 octei, respectiv 8, 16,
32 i 64 de bii. Dac dorim s reprezentm un numr real n memoria calculatorului, o putem
face memornd cteva cifre semnificative ale acestuia plus o informaie legat de ordinu
l su de mrime. n acest fel, dei pierdem precizia numrului, putem reprezenta valori fo
arte aproape de zero sau foarte departe de aceast valoare. Soluia de reprezentare
este aceea de a pstra dou numere cu semn care reprezint cifrele semnificative ale n
umrului real respectiv un exponent care d ordinul de mrime. Cifrele reprezentative
ale numrului se numesc mpreun mantis. Numrul reprezentat n final este 0.mantisaEexpone
nt. E are valoarea 256 spre deosebire de exponentul 10 pe care l folosim n uzual.
Dac valoarea exponentului estefoarte mare i pozitiv, numrul real reprezentat este fo
arte departe de 0, nspre plus sau nspre minus. Dac exponentul este foarte mare n val
oare absoluti negativ, numrul real reprezentat este foarte aproape de zero. n plus,
pentru a ne asigura de biunivocitatea corespondenei, avem nevoie de o convenie car
e s stabileasc faptul c virgula este plasat imediat n faa cifrelor semnificative i c
acesteia se gsete o singur cifr 0. Numerele care respect aceast convenie se numesc nu
ere normalizate. Aceast mutare a virgulei imediat n faa cifrelor semnificative poat
e s presupun modificarea exponentului care pstreaz ordinul de mrime al numrului. Numer
ele fracionare se numesc n
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (3 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

limbajul calculatoarelor numere n virgul mobil sau numere flotante tocmai din cauza
acestei eventuale ajustri a poziiei virgulei. Cu aceast convenie nu se poate reprez
enta orice numr real, dar se poate obine o acoperire destul de bun a unui interval
al axei numerelor reale cu valori. Atunci cnd ncercm s reprezentm n memoria calculator
ului un numr real, cutm de fapt cel mai apropiat numr real reprezentabil n calculator
i aproximm numrul iniial cu acesta din urm. Ca rezultat, putem efectua calcule compl
exe cu o precizie rezonabil. Descrierea conveniei exacte de reprezentare a numerel
or reale n calculator depete cadrul acestei prezentri. Unele dintre detalii pot fi di
ferite de cele prezentate aici, dar principiul este exact acesta. Convenia de rep
rezentare a numerelor reale este standardizat de IEEE n specificaia 754. Desigur, n
unele probleme, lipsa de precizie poate s altereze rezultatul final, mai ales c, u
neori, erorile se cumuleaz. Exist de altfel o teorie complex, analiza numeric, conce
put pentru a studia cile prin care putem ine sub control aceste erori de precizie.
Putem crete precizia de reprezentare a numerelor reale prin mrirea spaiului rezerva
t mantisei. n acest fel mrim numrul de cifre semnificative pe care l pstrm. n general,
unitile centrale actuale lucreaz cu dou precizii: numerele flotante simple, reprezen
tate pe 4 octei i numerele flotante duble, reprezentate pe 8 octei.
2.3 Valori de adevr
Uneori, avem nevoie s memorm n calculator valori de adevr. Exist doar dou valori de ad
evr posibile: adevrat i fals. Uneori, aceste valori de adevr se mai numesc i valori b
ooleene. Dei pentru memorarea acestor valori este suficient o singur cifr binar, n pra
ctic aceste valori sunt reprezentate pe un ntreg octet pentru c operaiile la nivel d
e bit sunt de obicei prea lente. Valorile booleene se pot combina ntre ele prin o
peraii logice: i, sau, "negaie.

2.4 iruri de caractere


Dup cum spuneam mai nainte, dei orice informaie reprezentat n calculator este n final
n numr, mintea uman este obinuit s lucreze cu cuvinte i imagini mai mult dect cu numer
. De aceea, calculatorul trebuie s aib posibilitatea s simuleze memorarea informaiil
or de acest fel. n ceea ce privete cuvintele, ele pot fi reprezentate n memoria cal
culatorului prin caracterele care le formeaz. niruirea acestor caractere n memorie d
uce la noiunea de ir de caractere. Pe lng caracterele propriu-zise care construiesc
cuvntul, un ir de caractere trebuie s poat memora i numrul total de caractere din ir,
u alte cuvinte lungimea sa. n realitate, un ir de caractere nu conine doar un singu
r cuvnt ci este o niruire oarecare de caractere printre care pot exista i caractere
spaiu. De exemplu, urmtoarele secvene sunt iruri de caractere:
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (4 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare


"Acesta este un ir de caractere", "Eugen", "ABCD 0123", "HGkduI;.!". Fiecare limb
aj de programare trebuie s ofere o convenie de reprezentare a irurilor de caractere
n calculator precum i o convenie de scriere a acestora n program. De obicei, cea de
-a doua convenie este aceea c irul de caractere trebuie nchis ntre apostroafe sau ghi
limele. n paragraful anterior de exemplu, am folosit ghilimele pentru delimitarea
irurilor de caractere. Convenia de reprezentare n memorie difer de la un limbaj de
programare la altul prin modul n care este memorat lungimea irului, precum i prin co
nvenia de reprezentare n memorie a caracterelor: ASCII, Unicode sau alta. mpreun cu
fiecare tip de dat, limbajele de programare trebuie s defineasc i operaiile ce se pot
executa cu datele de tipul respectiv. Pentru irurile de caractere, principala op
eraie este concatenarea. Prin concatenarea a dou iruri de caractere se obine un ir de
caractere care conine caracterele celor dou iruri puse n prelungire. De exemplu, pr
in concatenarea irurilor de caractere "unu" i ", doi", rezult irul de caractere: "un
u, doi".
2.5 Tipuri primitive de valori ale unui limbaj de programare
Vom numi tipuri primitive de valori ale unui limbaj acele tipuri de valori care
se pot reprezenta direct ntr-un anumit limbaj de programare. Pentru ca informaia r
eprezentabil s fie independent de calculatorul pe care ruleaz programele, un limbaj
de programare trebuie s-i defineasc propriile sale tipuri primitive, eventual difer
ite de cele ale unitii centrale, tipuri care s generalizeze tipurile primitive ale
tuturor unitilor centrale. Pentru fiecare dintre aceste tipuri primitive de valori
, limbajul trebuie s defineasc dimensiunea locaiei de memorie ocupate, convenia de r
eprezentare i mulimea valorilor care pot fi reprezentate n aceast locaie. n plus, limb
ajul trebuie s defineasc operaiile care se pot executa cu aceste tipuri i comportare
a acestor operaii pe seturi de valori diferite. Tipurile primitive ale unui limba
j sunt de obicei: numere de diverse tipuri, caractere, iruri de caractere, valori
de adevr i valori de tip referin. Totui, acest set de tipuri primitive, denumirea ex
act a tipurilor i operaiile care se pot executa cu ele variaz mult de la un limbaj d
e programare la altul.
2.6 Tablouri de elemente
Tipurile primitive mpreun cu referinele, adic tipurile de date elementare, indivizib
ile ale unui limbaj, sunt insuficiente pentru necesitile unei aplicaii reale. De ob
icei este nevoie de organizri de date mai complicate n care avem structuri de date
create prin asocierea mai multor tipuri de date elementare. Aceste structuri de
organizare a informaiilor pot conine date de acelai tip sau date de tipuri diferit
e.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (5 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

n cazul n care dorim s reprezentm o structur coninnd date de acelai tip, va trebui s
sim o structur clasic de reprezentare a datelor numit tablou de elemente. Practic,
un tablou de elemente este o alturare de locaii de memorie de acelai fel. Alturarea
este continu n sensul c zona de memorie alocat tabloului nu are guri. De exemplu, put
em gndi ntreaga memorie intern a calculatorului ca fiind un tablou de cifre binare
sau ca un tablou de octei. Informaiile de acelai fel reprezentate ntr-un tablou se p
ot prelucra n mod unitar. Referirea la un element din tablou se face prin preciza
rea locaiei de nceput a tabloului n memorie i a numrului de ordine al elementului pe
care dorim s-l referim. Numrul de ordine al unui element se numete indexul elementu
lui. De aceea, tablourile se numesc uneori i structuri de date indexate. S presupu
nem c, la adresa 1234 n memorie, deci ncepnd cu octetul numrul 1234, avem un tablou d
e 200 de elemente de tip ntregi cu semn reprezentai pe 4 octei. Pentru a accesa ele
mentul numrul 123 din tablou, trebuie s i aflm adresa n memorie. Pentru aceasta, treb
uie s calculm deplasamentul acestui element fa de nceputul tabloului, cu alte cuvinte
, la ci octei distan fa de nceputul tabloului se gsete elementul numrul 123. Pentr
i deplasamentului, este nevoie s tim cu ce index ncepe numerotarea elementelor din
tablou. De obicei aceasta ncepe cu 0 sau cu 1, primul element fiind elementul 0 s
au elementul 1. S presupunem, n cazul nostru, c numerotarea ar ncepe cu 0. n acest ca
z, elementul cu indexul 123 este de fapt al 124-lea element din tablou, deci mai
are nc 123 de elemente naintea lui. n aceste condiii, pentru a afla adresa elementul
ui dat, este suficient s adugm la adresa de nceput a tabloului, deplasamentul calcul
at ca numrul de elemente din fa nmulit cu dimensiunea unui element din tablou. Adresa
final este 1234 + 123 * 4 = 1726. Pentru a putea lucra cu elementele unui tablou
este deci suficient s memorm adresa de nceput a tabloului i indexul elementelor pe
care dorim s le accesm. Alternativa ar fi fost s memorm adresa locaiei fiecrui element
din tablou. Unul dintre marile avantaje ale utilizrii tablourilor este acela c el
ementele dintr-un tablou se pot prelucra n mod repetitiv, apelndu-se aceeai operaie
pentru un subset al elementelor din tablou. Astfel, ntr-un program putem formula
instruciuni de forma: pentru elementele tabloului T ncepnd de la al treilea pn la al
N-lea, s se execute operaia O. Numrul N poate fi calculat dinamic n timpul execuiei p
rogramului, n funcie de necesiti. Elementele unui tablou pot fi de tip primitiv, ref
erin sau pot fi tipuri compuse, inclusiv alte tablouri.
2.7 Expresii de calcul
Sarcina principal a calculatoarelor este aceea de a efectua calcule. Pentru a put
ea efectua aceste calcule, calculatorul trebuie s primeasc o descriere a operaiilor
de calcul pe care le are de executat. Calculele
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (6 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

simple sunt descrise cel mai bine prin expresii de calcul. Expresiile sunt forma
te dintr-o serie de valori care intr n calcul, numite operanzi i din simboluri care
specific operaiile care trebuiesc efectuate cu aceste valori, numite operatori. O
peratorii reprezint operaii de adunare, nmulire, mprire, concatenare a irurilor de ca
tere, etc. Operanzii unor expresii pot fi valori elementare precum numerele, irur
ile de caractere sau pot fi referiri ctre locaii de memorie n care sunt memorate ac
este valori. Tot operanzi pot fi i valorile unor funcii predefinite precum sinus,
cosinus sau valoarea absolut a unui numr. Calculul complex al valorii acestor funci
i pentru argumentele de intrare este astfel ascuns sub un nume uor de recunoscut.
Figura 2.1 Un exemplu de expresie i componentele acesteia

2.8 Variabile
Uneori, atunci cnd calculele sunt complexe, avem nevoie s pstrm rezultate pariale ale
acestor calcule n locaii temporare de memorie. Alteori, chiar datele iniiale ale p
roblemei trebuie memorate pentru o folosire ulterioar. Aceste locaii de memorie fo
losite ca depozit de valori le vom numi variabile. Variabilele pot juca rol de o
peranzi n expresii. Pentru a regsi valoarea memorat ntr-o anumit variabil, este sufici
ent s memorm poziia locaiei variabilei n memorie i tipul de dat memorat la aceast lo
numit i tipul variabilei. Cunoaterea tipului variabilei este esenial la memorarea i r
egsirea datelor. La locaia variabilei gsim ntotdeauna o configuraie de cifre binare.
Interpretarea acestor cifre binare se poate face numai cunoscnd convenia de reprez
entare care s-a folosit la memorarea acelor cifre binare. Mai mult, tipul de var
iabil ne i spune ci octei de memorie ocup locaia respectiv. Pentru a putea referi var
ilele n interiorul unui program, trebuie s atribuim cte un nume pentru
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (7 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare


fiecare dintre acestea i s rezervm locaiile de memorie destinate lor. Aceast rezervar
e a locaiilor se poate face fie la pornirea programului fie pe parcurs. Putem mpri v
ariabilele n funcie de perioada lor de existen n variabile statice, care exist pe tot
parcursul programului i variabile locale care se creeaz doar n seciunea de program n
care este nevoie de ele pentru a fi distruse imediat ce se prsete seciunea respectiv.
Variabilele statice pstreaz de obicei informaii eseniale pentru execuia programului
precum numele celui care a pornit programul, data de pornire, ora de pornire sau
numrul p . Variabilele locale pstreaz valori care au sens doar n contextul unei anu
mite seciuni din program. De exemplu, variabilele care sunt utilizate la calculul
sinusului dintr-un numr, sunt inutile i trebuiesc eliberate imediat ce calculul a
fost terminat. n continuare, doar valoarea final a sinusului este important. n plus
, exist variabile care se creeaz doar la cererea explicit a programului i nu sunt el
iberate dect atunci cnd programul nu mai are nevoie de ele. Aceste variabile se nu
mesc variabile dinamice. De exemplu, se creeaz o variabil dinamic atunci cnd utiliza
torul programului introduce un nou nume ntr-o list de persoane. Crearea i tergerea a
cestui nume nu are legtur cu faza n care se afl rularea programului ci are legtur cu d
orina celui care utilizeaz programul de a mai aduga sau terge un nume n lista persoan
elor cu care lucreaz, pentru a le trimite, de exemplu, felicitri de anul nou.

2.9 Instruciuni
Operaiile care trebuiesc executate de un anumit program sunt exprimate n limbajele
de programare cu ajutorul unor instruciuni. Spre deosebire de limbajele naturale
, exist doar cteva tipuri standard de instruciuni care pot fi combinate ntre ele pen
tru a obine funcionalitatea programelor. Sintaxa de scriere a acestor tipuri de in
struciuni este foarte rigid. Motivul acestei rigiditi este faptul c un compilator rec
unoate un anumit tip de instruciune dup sintaxa ei i nu dup sensul pe care l are ca n
azul limbajelor naturale. Tipurile elementare de instruciuni nu s-au schimbat dea lungul timpului pentru c ele sunt coninute n nsui modelul de funcionare al calculato
arelor Von Neumann. n primul rnd, avem instruciuni de atribuire. Aceste instruciuni
presupun existena unei locaii de memorie creia dorim s-i atribuim o anumit valoare. A
tribuirea poate s par o operaie foarte simpl dar realitatea este cu totul alta. n pri
mul rnd, valoarea respectiv poate fi rezultatul evalurii (calculului) unei expresii
complicate care trebuie executat nainte de a fi memorat n locaia de memorie dorit. Ap
oi, nsi poziia locaiei n memorie ar putea fi rezultatul unui calcul n urma cruia s r
e o anumit adres. De exemplu, am putea dori s atribuim o valoare unui element din i
nteriorul unui tablou. ntr-o astfel de situaie, locaia de memorie este calculat prin
adunarea unui deplasament la adresa de nceput a tabloului.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (8 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

n fine, locaia de memorie i valoarea pe care dorim s i-o atribuim ar putea avea tipu
ri diferite. n acest caz, operaia de atribuire presupune i transformarea, dac este p
osibil, a valorii ntr-o nou valoare de acelai tip cu locaia de memorie. n plus, aceast
transformare trebuie efectuat n aa fel nct s nu se piard semnificaia valorii original
De exemplu, dac valoarea original era -1 ntreg iar locaia de memorie este de tip flo
tant, valoarea obinut dup transformare trebuie s fie -1.0. Transformarea valorilor d
e la un tip la altul se numete n termeni informatici conversie. Conversiile pot apr
ea i n alte situaii dect instruciunile de atribuire, de exemplu la transmiterea param
etrilor unei funcii, n calculul unei expresii. Forma general a unei instruciuni de a
tribuire este: Locaie = Valoare Locaia poate fi o adres cu tip, un nume de variabil
sau o expresie n urma creia s rezulte o adres cu tip. Printr-o adres cu tip nelegem o
dres de memorie pentru care a fost specificat tipul valorilor care pot fi memorat
e n interior. O adres simpl, fr tip, nu poate intra ntr-o atribuire pentru c nu putem
care este convenia de reprezentare care trebuie folosit la memorarea valorii. Al
doilea tip de instruciune elementar este instruciunea condiional. Aceast instruciune p
rmite o prim form de ramificare a ordinii n care se execut instruciunile. Ramificarea
depinde de o condiie care poate fi testat pe setul de date cu care lucreaz aplicaia
. n funcie de valoarea de adevr care rezult n urma evalurii condiiei se poate executa
instruciune sau alta. Modelul de exprimare a unei expresii condiionale este urmtor
ul: Dac condiia este adevrat execut instruciunea 1 altfel execut instruciunea 2. Cele
u ramuri de execuie sunt disjuncte n sensul c dac este executat instruciunea de pe o r
mur atunci cu siguran instruciunea de pe cealalt ramur nu va fi executat. Dup execui
ia sau a celeilalte instruciuni ramurile se reunific i execuia i continu drumul cu ins
ruciunea care urmeaz dup instruciunea condiional.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (9 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare


Figura 2.2 Schema de funcionare a unei instruciuni condiionale

Condiia care hotrte care din cele dou instruciuni va fi executat este de obicei un tes
de egalitate ntre dou valori sau un test de ordonare n care o valoare este testat d
ac este mai mic sau nu dect o alt valoare. Condiiile pot fi compuse prin conectori lo
gici de tipul i, sau sau non, rezultnd n final condiii de forma: dac variabila num
tur este mai mic dect 0 i mai mare dect -10, atunci Instruciunile condiionale au i o
ant n care, n funcie de o valoare ntreag alege o instruciune dintr-un set de instruci
i apoi o execut. Aceast form este n realitate derivat din instruciunea condiional c
ea putnd fi exprimat prin: Dac Variabila este egal cu Valoarea 1 atunci execut instr
uciunea 1 altfel, dac Variabila este egal cu Valoarea 2 atunci execut instruciunea 2
altfel, dac Variabila altfel
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (10 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

execut instruciunea implicit. Un al treilea tip de instruciuni elementare sunt instr


uciunile de ciclare sau repetitive sau buclele. Acestea specific faptul c o instruci
une trebuie executat n mod repetat. Controlul ciclurilor de instruciuni se poate fa
ce pe diverse criterii. De exemplu se poate executa o instruciune de un numr fix d
e ori sau se poate executa instruciunea pn cnd o condiie devine adevrat sau fals. Con
de terminare a buclei poate fi testat la nceputul buclei sau la sfritul acesteia. D
ac condiia este testat de fiecare dat nainte de execuia instruciunii, funcionarea cic
ui se poate descrie prin: Atta timp ct Condiia este adevrat execut Instruciunea Acest
ip de instruciuni de ciclare poat numele de cicluri while, cuvntul while nsemnnd n lim
ba englez "atta timp ct. n cazul ciclurilor while, exist posibilitatea ca instruciunea
din interiorul ciclului s nu se execute niciodat, dac condiia este de la nceput fals.
Figura 2.3 Schema de funcionare a unui ciclu while

Dac condiia este testat de fiecare dat dup execuia instruciunii, funcionarea ciclului
poate descrie prin: Execut Instruciunea atta timp ct Condiia este adevrat. Acest tip
e instruciuni de ciclare poart numele de cicluri do-while, cuvntul do nsemnnd n limba
englez "execut. n cazul ciclurilor do-while instruciunea din interiorul ciclului este
garantat c se execut cel puin o dat, chiar dac valoare condiiei de terminare a buclei
este de la nceput fals.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (11 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare


Figura 2.4 Schema de funcionare a unui ciclu do-while

Dup cum ai observat, probabil, dac instruciunea din interiorul buclei nu afecteaz n ni
ci un fel valoarea de adevr a condiiei de terminare a buclei, exist ansa ca bucla s n
u se termine niciodat. Al patrulea tip de instruciuni sunt apelurile de proceduri.
O procedur este o secven de instruciuni de sine stttoare i parametrizat. Un apel de
cedur este o instruciune prin care form programul s execute pe loc instruciunile unei
anumite proceduri. Dup execuia procedurii, se continu cu execuia instruciunii de dup a
pelul de procedur. Procedurile sunt utile atunci cnd, n zone diferite ale programul
ui, dorim s executm aceeai secven de instruciuni. n aceste situaii, putem s scriem s
de instruciuni o singur dat i s-o apelm apoi oriunde din interiorul programului. De
exemplu, ori de cte ori vom dori s tergem toate semnele de pe ecranul calculatorulu
i, putem apela la o procedur, pentru a nu fi nevoii s scriem de fiecare dat secvena d
e instruciuni care duce la tergerea ecranului. Procedura n sine, o vom scrie o sing
ur dat i i vom da un nume prin care o vom putea apela ulterior ori de cte ori avem ne
voie. Uneori secvena de instruciuni dintr-o procedur depinde de nite parametri adic d
e un set de valori care sunt precizate doar n momentul apelului procedurii. n aces
te cazuri, procedura se poate comporta n mod diferit n funcie de valorile de apel a
le acestor parametri. n funcie de tipul declarat al unor parametri i de tipul real
al valorilor care sunt trimise ca parametri ntr-un apel de procedur, se poate ntmpla
ca nainte de apelul propriu-zis s fie necesar o conversie de tip. De exemplu, n caz
ul procedurii care calculeaz valoarea sinusului unui numr, parametrul de intrare e
ste nsui numrul pentru care trebuie calculat sinusul. Rezultatul acestui calcul va
fi diferit, n funcie de valoarea la apel a parametrului. n mod normal, parametrul v
a fi un numr flotant iar dac la apel vom transmite ca parametru o valoare ntreag, ea
va fi convertit spre o valoare flotant.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (12 of 13)12.01.2006 23:07:45

Capitolul II -- Limbaje de programare

n urma apelului unei proceduri poate rezulta o valoare pe care o vom numi valoare
de retur a procedurii. De exemplu, n urma apelului procedurii de calcul a sinusu
lui unui numr, rezult o valoare flotant care este valoarea calculat a sinusului. Ace
st tip de proceduri, care ntorc valori de retur se mai numesc i funcii. Funciile def
inesc ntotdeauna un tip al valorii de retur pe care o ntorc. n acest fel, apelurile
de funcii pot fi implicate i n formarea unor expresii de calcul sub form de operanz
i, expresia cunoscnd tipul de valoare care trebuie ateptat ca valoare a apelului un
ei anumite funcii. Analogia cu funciile pe care le-ai studiat la matematic este evid
ent dar nu total. n cazul funciilor scrise ntr-un limbaj de programare, dou apeluri co
nsecutive ale aceleiai funcii cu aceleai valori ca parametri se pot comporta diferi
t datorit dependenei de condiii exterioare sistemului format din funcie i parametrii
de apel. n plus, se poate ntmpla ca modul de comportare al funciei i valoarea de retu
r s nu fie definite pentru anumite valori de apel ale parametrilor. Dei scrierea a
cestui tip de funcii este nerecomandabil, n practic ntlnim astfel de funcii la tot pas
l.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap2.html (13 of 13)12.01.2006 23:07:45

Capitolul III -- Reprezentarea informaiilor cu obiecte


Capitolul III Reprezentarea informaiilor cu obiecte
3.1 Obiecte 3.2 ncapsularea informaiilor n interiorul obiectelor 3.3 Clase de obiec
te 3.4 Derivarea claselor de obiecte 3.5 Interfee spre obiecte

3.1 Obiecte
Informaiile pe care le reprezentm n memoria calculatorului sunt rareori att de simpl
e precum culorile sau literele. n general, dorim s reprezentm informaii complexe, ca
re s descrie obiectele fizice care ne nconjoar sau noiunile cu care operm zilnic, n in
teriorul crora culoarea sau o secven de litere reprezint doar o mic parte. Aceste obi
ecte fizice sau noiuni din lumea real trebuiesc reprezentate n memoria calculatorul
ui n aa fel nct informaiile specifice lor s fie pstrate la un loc i s se poat prelu
un tot unitar. S nu uitm ns c, la nivelul cel mai de jos, informaia ataat acestor obi
e continu s fie tratat de ctre compilator ca un ir de numere naturale, singurele info
rmaii reprezentabile direct n memoria calculatoarelor actuale. Pentru a reprezenta
n memoria intern obiecte fizice sau noiuni, este nevoie s izolm ntregul set de propri
eti specifice acestora i s l reprezentm prin numere. Aceste numere vor ocupa n memorie
o zon compact pe care, printr-un abuz de limbaj, o vom numi, ntr-o prim aproximare,
obiect. Va trebui ns s avei ntotdeauna o imagine clar a deosebirii fundamentale dintre
un obiect fizic sau o noiune i reprezentarea acestora n memoria calculatorului. De
exemplu, n memoria calculatorului este foarte simplu s crem un nou obiect, identic
cu altul deja existent, prin simpla duplicare a zonei de memorie folosite de ob
iectul pe care dorim s-l dedublm. n realitate ns, este mult mai greu s obinem o copie
dentic a unui obiect fizic, fie el o simpl foaie de hrtie sau o bancnot de 10000 de
lei. S revenim ns la numerele naturale. Din moment ce ele sunt singurele entiti repre
zentabile n memoria calculatorului, este firesc ca acesta s fie echipat cu un set
bogat de operaii predefinite de prelucrare a numerelor. Din pcate, atunci cnd facem
corespondena dintre numere i litere de exemplu, nu ne putem atepta la un set la fe
l de bogat de operaii predefinite care s lucreze cu litere. Dar, innd cont de faptul
c n cele din urm lucrm tot cu numere, putem construi propriile noastre operaii speci
fice literelor, combinnd n mod corespunztor operaiile numerice predefinite. De exemp
lu, pentru a obine dintr-o liter majuscul, s spunem A, corespondenta ei minuscul a,
suficient s adunm un deplasament numeric corespunztor, presupunnd c literele mari i ce
le
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (1 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte

mici sunt numerotate n ordine alfabetic i imediat una dup cealalt n convenia de reprez
ntare folosit. n setul ASCII deplasamentul este 32, reprezentarea lui A fiind 65 iar
reprezentarea lui a fiind 97. Acest deplasament se pstreaz pentru toate literele di
n alfabetul englez i romn, la cel din urm existnd totui o excepie n cazul literei .
s extindem cerinele noastre mai departe, spunnd c, atunci cnd analizm un obiect fizic
sau o noiune pentru a le reprezenta n calculator, trebuie s analizm nu numai proprie
tile acestora dar i modul n care acestea pot fi utilizate i care sunt operaiile care p
ot fi executate asupra lor sau cu ajutorul lor. Acest set de operaii va trebui ul
terior s-l redefinim n contextul mulimii de numere care formeaz proprietile obiectului
din memoria calculatorului, i s l descompunem n operaii numerice preexistente. n plus
, trebuie s analizm modul n care reacioneaz obiectul atunci cnd este supus efectului u
nor aciuni exterioare. Uneori, setul de operaii specifice unui obiect mpreun cu modu
l n care acesta reacioneaz la stimuli exteriori se numete comportamentul obiectului.
De exemplu, dac dorim s construim un obiect care reprezint o minge de form sferic n s
paiu, este necesar s definim trei numere care s reprezinte coordonatele x, y i z rel
ativ la un sistem de axe dat, precum i o valoare pentru raza sferei. Aceste valor
i numerice vor face parte din setul de proprieti ale obiectului minge. Dac mai trziu
vom dori s construim o operaie care s reprezinte mutarea n spaiu a obiectului minge,
este suficient s ne folosim de operaiile cu numere pentru a modifica valorile coo
rdonatelor x, y i z. Desigur, obiectul minge este insuficient descris prin aceste
coordonate i, pentru a simula n calculator obiectul real este nevoie de multe pro
prieti suplimentare precum i de multe operaii n plus. Dar, dac problema pe care o avem
de rezolvat nu necesit aceste proprieti i operaii, este preferabil s nu le definim n
biectul folosit pentru reprezentare. Rezultatul direct al acestui mod de abordar
e este acela c vom putea defini acelai obiect real n mai multe feluri pentru a-l re
prezenta n memoria intern. Modul de definire depinde de problema de rezolvat i de p
rogramatorul care a gndit reprezentarea. De altfel, aceste diferene de percepie ale
unui obiect real exist i ntre diveri observatori umani. Din punctul de vedere al pr
ogramrii, un obiect este o reprezentare n memoria calculatorului a proprietilor i com
portamentului unei noiuni sau ale unui obiect real.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (2 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte


Figura 3.1 Modelul de reprezentare al unui obiect n memorie. Stratul exterior rep
rezint doar operaiile care ofer calea de a interaciona cu proprietile obiectului i nu
re corespondent direct n zona de memorie ocupat de obiect.

3.2 ncapsularea informaiilor n interiorul obiectelor


Exist situaii n care accesul din exterior la proprietile unui obiect poate s pun probl
me acestuia. Ce s-ar ntmpla de exemplu dac s-ar putea accesa direct valorile care d
efinesc funcionalitatea corpului uman? Desigur, exist cazuri n care acest lucru ar
fi mbucurtor. N-ar mai fi nevoie s acionm indirect asupra concentraiilor de enzime n c
rp ci am putea s modificm aceste valori n mod direct. Dar, n acelai timp, am putea pr
ovoca mari necazuri n cazul n care am modifica aceste valori n afara pragului supor
tabil de ctre organism. Din aceste motive, este preferabil s lsm modificarea acestor
parametri n sarcina exclusiv a unor operaii definite de ctre obiect, operaii care vo
r verifica noile valori nainte de a le schimba n interiorul obiectului. n lipsa ace
stui filtru, putem s stricm coerena valorilor memorate n interiorul unui obiect, fcndu
-l inutilizabil. Din acest punct de vedere, putem privi obiectul ca pe un set de
valori care formeaz miezul obiectului i un set de operaii care mbrac aceste valori,
protejndu-le. Vom spune c proprietile obiectului sunt ncapsulate n interiorul acestora
. Mai mult, obiectul ncapsuleaz i modul de funcionare a operaiilor lui specifice, din
exterior neputndu-se observa dect modul de apelare a acestor operaii i rezultatele
apelurilor. Cu alte cuvinte, procesul de ncapsulare este procesul de ascundere a
detaliilor neimportante sau sensibile de construcie a obiectului. Dar nu numai pr
oprietile unui obiect trebuiesc protejate ci i operaiile definite de ctre acesta. Une
le dintre operaiile definite pentru un obiect, cum ar fi de exemplu procesul resp
irator al omului, sunt periculos de lsat la dispoziia oricui. Este preferabil s put
em controla foarte exact cine ce operaii poate apela pentru un anumit obiect. n ac
est mod, din punctul de vedere al unui observator strin, omul este perceput ca un
obiect mult mai simplu dect este n realitate, pentru c acel observator nu poate
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (3 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte

vedea dect acele valori i nu poate apela dect acele operaii care sunt fcute publice.
Desigur, n practic este nevoie de o oarecare rafinare a gradului de protejare a fi
ecrei operaii sau proprieti n aa fel nct nsui accesul observatorilor exteriori s p
nat n funcie de gradul de similitudine i apropiere al observatorului fa de obiectul ac
cesat. Rafinarea trebuie s mearg pn la a putea specifica pentru fiecare proprietate i
operaie n parte care sunt observatorii care au acces i care nu. Aceast protejare i nc
apsulare a proprietilor i operaiilor ce se pot executa cu ajutorul unui obiect are i
o alt consecin i anume aceea c utilizatorul obiectului respectiv este independent de
detaliile constructive ale obiectului respectiv. Structura intern a obiectului po
ate fi astfel schimbat i perfecionat n timp fr ca funcionalitatea de baz s fie afec

3.3 Clase de obiecte


n lumea real se pot identifica uor familii de obiecte. Este greu s descriem ntr-un li
mbaj de programare fiecare minge din lume dar, pentru a putea folosi orice minge
din lume, este suficient s descriem o singur dat care sunt proprietile unei mingi n g
eneral, precum i operaiile care pot fi executate cu aceasta. Aceasta nu nseamn c toat
e obiectele minge din lume sunt identice. Diferena dintre ele se afl reprezentat n p
rimul rnd n valorile proprietilor lor care sunt mrimi numerice variabile, adic difer d
la un obiect de acelai fel la altul. De exemplu, n fiecare obiect minge vom avea
un numr natural care reprezint culoarea mingii. Acest numr poate s difere de la o mi
nge la alta exact aa cum, n realitate, culoarea difer de la o minge la alta. La fel
coordonatele poziiei mingii la un moment dat sau raza mingii precum i materialul
din care este confecionat au valori care variaz de la o minge la alta. Cu alte cuvi
nte, fiecare minge din lume are acelai set de proprieti, dar valorile acestora pot
s difere de la o minge la alta. Modelul de reprezentare n memorie a unui obiect es
te ntotdeauna acelai, dar valorile memorate n locaiile corespunztoare proprietilor sun
n general diferite. n ceea ce privete operaiile, acestea sunt ntotdeauna aceleai dar
rezultatul aplicrii lor poate s difere n funcie de valorile proprietilor obiectului as
upra cruia au fost aplicate. De exemplu, atunci cnd aruncm o minge spre pmnt ea va ri
coa din acesta ridicndu-se din nou n aer. nlimea la care se va ridica ns, este depend
de dimensiunile i materialul din care a fost confecionat mingea. Cu alte cuvinte, n
oua poziie n spaiu se va calcula printr-o operaie care va ine cont de valorile memora
te n interiorul obiectului. Se poate ntmpla chiar ca operaia s hotrasc faptul c minge
a strpunge podeaua n loc s fie respins de ctre aceasta. S mai observm c operaiile nu
nd numai de proprietile obiectului ci i de unele valori exterioare acestuia. Atunci
cnd aruncm o minge spre pmnt, nlimea la care va ricoa aceasta depinde i de viteza c
e a fost aruncat mingea. Aceast vitez este un parametru al operaiei de aruncare. Nu
are nici un rost s transmitem ca parametrii ai unei operaii valorile proprietilor un
ui
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (4 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte

obiect pentru c acestea sunt ntotdeauna disponibile operaiei. Nici o operaie nu se p


oate aplica asupra unui obiect fr s tim exact care este obiectul respectiv i ce propr
ieti are acesta. Este absurd s ne gndim la ce nlime se va ridica o minge n general, f
cem presupuneri asupra valorilor proprietilor acesteia. S mai observm ns c, dac toate
ngile ar avea aceleai valori pentru proprietile implicate n operaia descris mai sus, a
m putea s calculm nlimea de ricoeu n general, fr s fim dependeni de o anumit ming
ie, putem spune c obiectele cu care lucrm fac parte ntotdeauna dintr-o familie mai
mare de obiecte cu proprieti i comportament similar. Aceste familii de obiecte le v
om numi n continuare clase de obiecte sau concepte n timp ce obiectele aparinnd unei
anumite clase le vom numi instane ale clasei de obiecte respective. Putem vorbi
despre clasa de obiecte minge i despre instanele acesteia, mulimea tuturor obiectel
or minge care exist n lume. Fiecare instan a clasei minge are un loc bine precizat n
spaiu i n timp, un material i o culoare. Aceste proprieti difer de la o instan la al
ar fiecare instan a aceleiai clase va avea ntotdeauna aceleai proprieti i aceleai op
vor putea fi aplicate asupra ei. n continuare vom numi variabile aceste proprieti a
le unei clase de obiecte i vom numi metode operaiile definite pentru o anumit clas d
e obiecte. Pentru a clarifica, s mai relum nc o dat: O clas de obiecte este o descrier
e a proprietilor i operaiilor specifice unui nou tip de obiecte reprezentabile n memo
rie. O instan a unei clase de obiecte este un obiect de memorie care respect descri
erea clasei. O variabil a unei clase de obiecte este o proprietate a clasei respe
ctive care poate lua valori diferite n instane diferite ale clasei. O metod a unei
clase este descrierea unei operaii specifice clasei respective. S mai precizm faptu
l c, spre deosebire de variabilele unei clase, metodele acesteia sunt memorate o
singur dat pentru toate obiectele. Comportarea diferit a acestora este dat de faptul
c ele depind de valorile variabilelor. O categorie aparte a claselor de obiecte
este categoria acelor clase care reprezint concepte care nu se pot instania n mod d
irect, adic nu putem construi instane ale clasei respective, de obicei pentru c nu
avem destule informaii pentru a le putea construi. De exemplu, conceptul de om nu
se poate instania n mod direct pentru c nu putem construi un om despre care nu tim
exact dac este brbat sau femeie. Putem n schimb instania conceptul de brbat i conceptu
l de femeie care sunt nite subconcepte ale conceptului om. Clasele abstracte, nei
nstaniabile, servesc n general pentru definirea unor proprieti sau operaii comune ale
mai multor clase i pentru a putea generaliza operaiile referitoare la acestea. Pu
tem, de exemplu s definim n cadrul clasei de obiecte om modul n care acesta se alim
enteaz ca fiind independent de apartenena la conceptul de brbat sau femeie. Aceast d
efiniie va fi valabil la amndou subconceptele definite mai sus. n schimb, nu putem de
ct cel mult s precizm faptul c un om trebuie s aib un comportament social. Descrierea
exact a acestui comportament trebuie fcut n cadrul conceptului de brbat i a celui de f
emeie. Oricum, este interesant faptul c, indiferent care ar fi clasa acestuia, pu
tem s ne bazm pe faptul c acesta va avea definit un comportament social, specific c
lasei lui.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (5 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte

Cele dou metode despre care am vorbit mai sus, definite la nivelul unui superconc
ept, sunt profund diferite din punctul de vedere al subconceptelor acestuia. n ti
mp ce metoda de alimentaie este definit exact i amndou subconceptele pot s o foloseasc
fr probleme, metoda de comportament social este doar o metod abstract, care trebuie
s existe, dar despre care nu se tie exact cum trebuie definit. Fiecare dintre subco
ncepte trebuie s-i defineasc propriul su comportament social pentru a putea deveni i
nstaniabil. Dac o clas de obiecte are cel puin o metod abstract, ea devine n ntregime
clas abstract i nu poate fi instaniat, adic nu putem crea instane ale unei clase de ob
ecte abstracte. Altfel spus, o clas abstract de obiecte este o clas pentru care nu
s-au precizat suficient de clar toate metodele astfel nct s poat fi folosit n mod dire
ct.
3.4 Derivarea claselor de obiecte
O alt proprietate interesant a claselor de obiecte este aceea de ierarhizare. Prac
tic, ori de cte ori definim o nou clas de obiecte care s reprezinte un anumit concep
t, specificm clasa de obiecte care reprezint conceptul original din care provine n
oul concept mpreun cu diferenele pe care le aduce noul concept derivat fa de cel orig
inal. Aceast operaie de definire a unei noi clase de obiecte pe baza uneia deja ex
istente o vom numi derivare. Conceptul mai general se va numi superconcept iar c
onceptul derivat din acesta se va numi subconcept. n acelai mod, clasa original se
va numi superclas a noii clase n timp ce noua clas de obiecte se va numi subclas a c
lasei derivate. Uneori, n loc de derivare se folosete termenul de extindere. Terme
nul vine de la faptul c o subclas i extinde superclasa cu noi variabile i metode. n sp
iritul acestei ierarhizri, putem presupune c toate clasele de obiecte sunt derivat
e dintr-o clas iniial, s-i spunem clasa de obiecte generice, n care putem defini prop
rietile i operaiile comune tuturor obiectelor precum ar fi testul de egalitate dintr
e dou instane, duplicarea instanelor sau aflarea clasei de care aparine o anumit inst
an. Ierarhizarea se poate extinde pe mai multe nivele, sub form arborescent, n fiecar
e punct nodal al structurii arborescente rezultate aflndu-se clase de obiecte. De
sigur, clasele de obiecte de pe orice nivel pot avea instane proprii, cu condiia s
nu fie clase abstracte, imposibil de instaniat.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (6 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte


Figura 3.2 O ierarhie de clase de obiecte n care clasele sunt reprezentate n cmpuri
eliptice iar instanele acestora n cmpuri dreptunghiulare. Clasele abstracte de obi
ecte au elipsa dublat.

Desigur, este foarte dificil s construim o ierarhie de clase de obiecte complet, c


are s conin clase de obiecte corespunztoare fiecrui concept cunoscut. Din fericire, p
entru o problem dat, conceptele implicate n rezolvarea ei sunt relativ puine i pot fi
uor izolate, simplificate i definite. Restrngerea la minimum a arborelui de concep
te necesar rezolvrii unei anumite probleme fr a se afecta generalitatea soluiei este
un talent pe care fiecare programator trebuie s i-l descopere i s i-l cultive cu ate
nie. De alegerea acestor concepte depinde eficiena i flexibilitatea aplicaiei. O cla
s de obiecte derivat dintr-o alt clas pstreaz toate proprietile i operaiile acestei
rm aducnd n plus proprieti i operaii noi. De exemplu, dac la nivelul clasei de obiect
m am definit forma biped a acestuia i capacitatea de a vorbi i de a nelege, toate ace
stea vor fi motenite i de ctre clasele derivate din clasa om, i anume clasa brbailor i
cea a femeilor. Fiecare dintre aceste clase de obiecte derivate i vor defini propr
iile lor proprieti i operaii pentru a descrie diferena dintre ele i clasa original. Un
le dintre proprietile i operaiile definite n superclas pot fi redefinite n subclasele
e obiecte derivate. Vechile proprieti i operaii sunt disponibile n continuare, doar c
pentru a le putea accesa va trebui s fie specificat explicit superclasa care deine
copia redefinit. Operaia de redefinire a unor operaii sau variabile din interiorul
unei clase n timpul procesului de derivare o vom numi rescriere. Aceast redefinire
ne d de fapt o mare flexibilitate n construcia ierarhiei unei probleme date pentru
c nici o proprietate sau operaie definit ntr-un punct al ierarhiei nu este impus def
initiv pentru conceptele derivate din acest punct direct sau nu. Revenind pentru
un moment la protejarea informaiilor interne ale unui obiect s precizm faptul c gra
dul de similitudine de care vorbeam mai sus este mrit n cazul n care vorbim de dou c
lase derivate
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (7 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte


una din cealalt. Cu alte cuvinte, o subclas a unei clase are acces de obicei la mu
lt mai multe informaii memorate n superclasa sa dect o alt clas de obiecte oarecare.
Acest lucru este firesc innd cont de faptul c, uneori, o subclas este nevoit s redefin
easc o parte din funcionalitatea superclasei sale.

3.5 Interfee spre obiecte


Un obiect este o entitate complex pe care o putem privi din diverse puncte de ved
ere. Omul de exemplu poate fi privit ca un mamifer care nate pui vii sau poate fi
privit ca o fiin gnditoare care nv s programeze calculatoare sau poate fi privit ca
simplu obiect spaio-temporal care are propria lui form i poziie n funcie de timp. Acea
st observaie ne spune c trebuie s dm definiii despre ce nseamn cu adevrat faptul c
ct poate fi privit ca un mamifer sau ca o fiina gnditoare sau ca un obiect spaio-te
mporal. Aceste definiii, pe care le vom numi n continuare interfee, sunt aplicabile
nu numai clasei de obiecte om dar i la alte clase de obiecte derivate sau nu din
acesta, superclase sau nu ale acesteia. Putem s gsim o mulime de clase de obiecte
ale cror instane pot fi privite ca obiecte spaio-temporale dar care s nu aib mare luc
ru n comun cu omul. Practic, atunci cnd construim o interfa, definim un set minim de
operaii care trebuie s aparin obiectelor care respect aceast interfa. Orice clas de
cte care declar c respect aceast interfa va trebui s defineasc toate operaiile. Oper
s, sunt definite pe ci specifice fiecrei clase de obiecte n parte. De exemplu, orice
obiect spaial trebuie s defineasc o operaie de modificare a poziiei n care se afl. Da
aceast operaie este diferit la un om, care poate s-i schimbe singur poziia, fa de o
ge care trebuie ajutat din exterior pentru a putea fi mutat. Totui, dac tim cu sigura
n c un obiect este o instan a unui clase de obiecte care respect interfaa spatio-tempo
al, putem linitii s executm asupra acestuia o operaie de schimbare a poziiei, fr s
sc s cunoatem amnunte despre modul n care va fi executat aceast operaie. Tot ceea ce
buie s tim este faptul c operaia este definit pentru obiectul respectiv. n concluzie,
o interfa este un set de operaii care trebuiesc definite de o clas de obiecte pentru
a se nscrie ntr-o anumit categorie. Vom spune despre o clas care definete toate oper
aiile unei interfee c implementeaz interfaa respectiv. Cu alte cuvinte, putem privi in
terfeele ca pe nite reguli de comportament impuse claselor de obiecte. n clipa n car
e o clas implementeaz o anumit interfa, obiectele din clasa respectiv pot fi privite n
exclusivitate din acest punct de vedere. Interfeele pot fi privite ca nite filtre
prin care putem privi un anumit obiect, filtre care nu las la vedere dect proprietil
e specifice interfeei, chiar dac obiectul n vizor este mult mai complicat n realitat
e. Interfeele creaz o alt mprire a obiectelor cu care lucrm. n afar de mprirea no
e, putem s mprim obiectele i dup interfeele pe care le implementeaz. i, la fel cu si
care definim o operaie doar pentru obiectele unei anumite clase, putem defini i o
peraii care lucreaz doar
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (8 of 9)12.01.2006 23:07:46

Capitolul III -- Reprezentarea informaiilor cu obiecte


cu obiecte care implementeaz o anumit interfa, indiferent de clasa din care acestea
fac parte.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap3.html (9 of 9)12.01.2006 23:07:46

Capitolul IV -- Structura lexical Java


Capitolul IV Structura lexical Java
4.1 Setul de caractere 4.2 Uniti lexicale 4.2.1 Cuvinte cheie 4.2.2 Identificatori
4.2.3 Literali 4.2.3.1 Literali ntregi 4.2.3.2 Literali flotani 4.2.3.3 Literali
booleeni 4.2.3.4 Literali caracter 4.2.3.5 Literali ir de caractere 4.2.4 Separat
ori 4.2.5 Operatori 4.3 Comentarii

4.1 Setul de caractere


Limbajului Java lucreaz n mod nativ folosind setul de caractere Unicode. Acesta es
te un standard internaional care nlocuiete vechiul set de caractere ASCII. Motivul
acestei nlocuiri a fost necesitatea de a reprezenta mai mult de 256 de caractere.
Setul de caractere Unicode, fiind reprezentat pe 16 bii are posibiliti mult mai ma
ri. Vechiul standard ASCII este ns un subset al setului Unicode, ceea ce nseamn c vom
regsi caracterele ASCII cu exact aceleai coduri ca i mai nainte n noul standard. Jav
a folosete setul Unicode n timpul rulrii aplicaiilor ca i n timpul compilrii acestora.
Folosirea Unicode n timpul execuiei nu nseamn nimic altceva dect faptul c o variabil J
va de tip caracter este reprezentat pe 16 bii iar un ir de caractere va ocupa fizic
n memorie de doua ori mai muli octei dect numrul caracterelor care formeaz irul. n c
ce privete folosirea Unicode n timpul compilrii, compilatorul Java accept la intrar
e fiiere surs care pot conine orice caractere Unicode. Se poate lucra i cu fiiere ASC
II obinuite n care putem introduce caractere Unicode folosind secvene escape. Fiiere
le surs sunt fiiere care conin declaraii
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (1 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java

i instruciuni Java. Aceste fiiere trec prin trei pai distinci la citirea lor de ctre c
ompilator: 1. irul de caractere Unicode sau ASCII, memorat n fiierul surs, este tran
sformat ntr-un ir de caractere Unicode. Caracterele Unicode pot fi introduse i ca s
ecvene escape folosind doar caractere ASCII. 2. irul de caractere Unicode este tra
nsformat ntr-un ir de caractere n care sunt evideniate separat caracterele de intrar
e fa de caracterele de sfrit de linie. 3. irul de caractere de intrare i de sfrit de
ie este transformat ntr-un ir de cuvinte ale limbajului Java. n primul pas al citir
ii fiierului surs, sunt generate secvene escape. Secvenele escape sunt secvene de car
actere ASCII care ncep cu caracterul backslash \. Pentru secvenele escape Unicode,
al doilea caracter din secven trebuie s fie u sau U. Orice alt caracter care urmea
z dup backslash va fi considerat ca fiind caracter nativ Unicode i lsat nealterat. D
ac al doilea caracter din secvena escape este u, urmtoarele patru caractere ASCII s
unt tratate ca i cifre hexazecimale (n baza 16) care formeaz mpreun doi octei de memor
ie care reprezint un caracter Unicode. Se pot folosi la intrare i fiiere ASCII norm
ale, pentru c ASCII este un subset al Unicode. De exemplu, putem scrie: int f\u06
60 = 3; Numele variabilei are dou caractere i al doilea caracter este o cifr arabic
-indic. Exemple de secvene Unicode: \uaa08 \U0045 \uu6abe n al doilea pas al citir
ii fiierului surs, sunt recunoscute ca i caractere de sfrit de linie caracterele ASCI
I CR i ASCII LF. n acelai timp, secvena de caractere ASCII CR-ASCII LF este tratat ca
un singur sfrit de linie i nu dou. n acest mod, Java suport n comun standardele de te
minare a liniilor folosite de diferite sisteme de operare: MacOS, Unix i DOS. Est
e important s separm caracterele de sfrit de linie de restul caracterelor de intrare
pentru a ti unde se termin comentariile de o singur linie (care ncep cu secvena //)
precum i pentru a raporta odat cu erorile de compilare i linia din fiierul surs n care
au aprut acestea. n pasul al treilea al citirii fiierului surs, sunt izolate elemen
tele de intrare ale limbajului Java, i anume: spaii, comentarii i uniti lexicale. Spai
ile pot fi caracterele ASCII SP (spaiu), FF (avans de pagin) sau HT (tab orizontal
) precum i orice caracter terminator de linie. Comentariile le vom discuta n parag
raful 4.3.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (2 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


4.2 Uniti lexicale
Unitile lexicale sunt elementele de baz cu care se construiete semantica programelor
Java. n irul de cuvinte de intrare, unitile lexicale sunt separate ntre ele prin com
entarii i spaii. Unitile lexicale n limbajul Java pot fi:
q q q q q
Cuvinte cheie Identificatori Literali Separatori Operatori
4.2.1 Cuvinte cheie
Cuvintele cheie sunt secvene de caractere ASCII rezervate de limbaj pentru uzul p
ropriu. Cu ajutorul lor, Java i definete unitile sintactice de baz. Nici un program nu
poate s utilizeze aceste secvene altfel dect n modul n care sunt definite de limbaj.
Singura excepie este aceea c nu exist nici o restricionare a apariiei cuvintelor che
ie n iruri de caractere sau comentarii. Cuvintele cheie ale limbajului Java sunt:
abstract boolean break byte case cast catch char class const continue default do
double else extends final finally float for future generic goto if implements i
mport inner instanceof intinterface long native new null operator outer package
private protected public rest return short static super switch synchronized this
throw throws transient try var void volatile while byvalue
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (3 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


Dintre acestea, cele ngroate sunt efectiv folosite, iar restul sunt rezervate pent
ru viitoare extensii ale limbajului.
4.2.2 Identificatori
Identificatorii Java sunt secvene nelimitate de litere i cifre Unicode, ncepnd cu o
liter. Identificatorii nu au voie s fie identici cu cuvintele rezervate. Cifrele U
nicode sunt definite n urmtoarele intervale: Reprezentare Unicode \u0030-\u0039 \u
0660-\u0669 \u06f0-\u06f9 \u0966-\u096f \u09e6-\u09ef \u0a66-\ u0a6f \u0ae6-\u0a
ef \u0b66-\u0b6f \u0be7-\u0bef \u0c66-\u0c6f \u0ce6-\u0cef \u0d66-\u0d6f \u0e50\u0e59 \u0ed0-\u0ed9 \u1040-\u1049 Caracter ASCII 0-9
Explicaie cifre ISO-LATIN-1 cifre Arabic-Indic cifre Eastern ArabicIndic cifre De
vanagari cifre Bengali cifre Gurmukhi cifre Gujarati cifre Oriya cifre Tamil cif
re Telugu cifre Kannada cifre Malayalam cifre Thai cifre Lao cifre Tibetan
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (4 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


Tabelul 4.1 Cifrele Unicode.
Un caracter Unicode este o liter dac este n urmtoarele intervale i nu este cifr: Repre
zentare Unicode \u0024 \u0041-\u005a \u005f \u0061-\u007a \u00c0-\u00d6 \u00d8-\
u00f6 \u00f8-\u00ff \u0100-\u1fff \u3040-\u318f \u3300-\u337f \u3400-\u3d2d \u4e
00-\u9fff \uf900-\ufaff Caracter ASCII $ A-Z _ a-z
Explicaie semnul dolar (din motive istorice) litere majuscule Latin underscore (d
in motive istorice) litere minuscule Latin diferite litere Latin cu diacritice d
iferite litere Latin cu diacritice diferite litere Latin cu diacritice alte alfa
bete i simboluri non-CJK Hiragana, Katakana, Bopomofo, i Hangul cuvinte ptratice CJ
K simboluri Hangul coreene Han (Chinez, Japonez, Corean) compatibilitate Han
Tabelul 4.2 Literele Unicode.
4.2.3 Literali
Un literal este modalitatea de baz de exprimare n fiierul surs a valorilor pe care l
e pot lua tipurile primitive i tipul ir de caractere. Cu ajutorul literalilor pute
m introduce valori constante n variabilele de tip primitiv sau n variabilele de ti
p ir de caractere. n limbajul Java exist urmtoarele tipuri de literali:
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (5 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


q q q q q
literali ntregi literali flotani literali booleeni literali caracter literali ir de
caractere

4.2.3.1 Literali ntregi Literalii ntregi pot fi reprezentai n baza 10, 16 sau 8. Toa
te caracterele care se folosesc pentru scrierea literalilor ntregi fac parte din
subsetul ASCII al setului Unicode. Literalii ntregi pot fi ntregi normali sau lung
i. Literalii lungi se recunosc prin faptul c se termin cu sufixul l sau L. Un lite
ral ntreg este reprezentat pe 32 de bii iar unul lung pe 64 de bii. Un literal ntreg
n baza 10 ncepe cu o cifr de la 1 la 9 i se continu cu un ir de cifre de la 0 la 9. U
n literal ntreg n baza 10 nu poate s nceap cu cifra 0, pentru c acesta este semnul fol
osit pentru a semnaliza literalii scrii n baza 8. Exemple de literali ntregi n baza
10: 12356L234871234567890l Exemplul al doilea i al patrulea sunt literali ntregi l
ungi. Pentru a exprima un literal ntreg n baza 16 trebuie s definim cifrele de la 1
0 la 15. Convenia va fi urmtoarea: 10 - a, A13 - d, D 11 - b, B14 - e, E 12 - c, C
15 - f, F n plus, pentru c un literal ntreg n baza 16 poate ncepe cu o liter, vom adug
prefixul 0x sau 0X. Dac nu am aduga acest sufix, compilatorul ar considera c este
vorba despre un identificator. Exemple de literali ntregi n baza 16: 0xa340X1230x2
c45L0xde123abccdL Ultimele dou exemple sunt literali ntregi lungi.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (6 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java

n fine, pentru a reprezenta un literal ntreg n baza 8, l vom preceda cu cifra 0. Res
tul cifrelor pot fi oricare ntre 0 i 7. Cifrele 8 i 9 nu sunt admise n literalii ntre
gi n baza 8. Exemple de literali ntregi n baza 8: 0234500123001234567712345677L Val
oarea maxim a unui literal ntreg normal este de 2147483647 (231-1), scris n baza 10.
n baza 16, cel mai mare literal pozitiv se scrie ca 0x7fffffff iar n baza 8 ca 01
7777777777. Toate trei scrierile reprezint de fapt aceeai valoare, doar c aceasta e
ste exprimat n baze diferite. Cea mai mic valoare a unui literal ntreg normal este 2147483648 (-231), respectiv 0x80000000 i 020000000000. Valorile 0xffffffff i 0377
77777777 reprezint amndou valoarea -1. Specificarea n surs a unui literal ntreg normal
care depete aceste limite reprezint o eroare de compilare. Cu alte cuvinte, dac folo
sim n surs numrul: 21474836470 de exemplu, fr s punem sufixul de numr lung dup el, co
latorul va genera o eroare la analiza sursei. Valoarea maxim a unui literal ntreg
lung este, n baza 10, 9223372036854775807L (263-1). n octal, asta nseamn 07777777777
77777777777L iar n baza 16 0x7fffffffffffffffL. n mod asemntor, valoarea minim a unui
literal ntreg lung este -9223372036854775808L (-2631), n octal aceast valoare este
0400000000000000000000L iar n baza 16 este 0x8000000000000000L. La fel ca i la li
teralii ntregi normali, depirea acestor limite este o eroare de compilare. 4.2.3.2
Literali flotani Literalii flotani reprezint numere reale. Ei sunt formai dintr-o pa
rte ntreag, o parte fracionar, un exponent i un sufix de tip. Exponentul, dac exist, e
te introdus de litera e sau E urmat opional de un semn al exponentului. Este oblig
atoriu s existe mcar o cifr fie n partea ntreag fie n partea zecimal i punctul zecim
u litera e pentru exponent. Sufixul care indic tipul flotantului poate fi f sau F
n cazul n care avem o valoare flotant normal i d sau D dac avem o valoare flotant dub
Dac nu este specificat nici un sufix, valoarea este implicit dubl. Valoarea maxim
a unui literal flotant normal este 3.40282347e+38f iar valoarea cea mai mic
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (7 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


reprezentabil este 1.40239846e-45f, ambele reprezentate pe 32 de bii. Valoarea max
im reprezentabil a unui literal flotant dublu este de 1.79769313486231570e+308 iar
valoarea cea mai mic reprezentabil este 4.94065645841246544e-324, ambele reprezen
tate pe 64 de bii. La fel ca i la literalii ntregi, este o eroare s avem exprimat n s
urs un literal mai mare dect valoarea maxim reprezentabil sau mai mic dect cea mai mi
c valoare reprezentabil. Exemple de literali flotani: 1.0e45f-3.456f0..01e-3 Primel
e dou exemple reprezint literali flotani normali, iar celelalte literali flotani dub
li. 4.2.3.3 Literali booleeni Literalii booleeni nu pot fi dect true sau false, p
rimul reprezentnd valoarea boolean de adevr iar cellalt valoarea boolean de fals. Tru
e i false nu sunt cuvinte rezervate ale limbajului Java, dar nu vei putea folosi a
ceste cuvinte ca identificatori. 4.2.3.4 Literali caracter Un literal de tip car
acter este utilizat pentru a exprima caracterele codului Unicode. Reprezentarea
se face fie folosind o liter, fie o secven escape. Secvenele escape ne permit reprez
entarea caracterelor care nu au reprezentare grafic i reprezentarea unor caractere
speciale precum backslash i nsi caracterul apostrof. Caracterele care au reprezenta
re grafic pot fi reprezentate ntre apostrofe, ca n exemplele: a   , Pentru rest
ul caracterelor Unicode trebuie s folosim secvene escape. Dintre acestea, cteva sun
t predefinite n Java, i anume: Secven escape \b Caracterul reprezentat caracterul
backspace BS \u0008
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (8 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java

\t \n \f \r


caracterul tab orizontal HT \u0009 caracterul linefeed LF \u000a caracterul form
feed FF \u000c caracterul carriage return CR \u000d caracterul ghilimele \u0022
caracterul apostrof \u0027 caracterul backslash \u005c

\" \ \\


Tabelul 4.3 Secvene escape predefinite n Java.

n form general, o secven escape se scrie sub una din formele: \o \oo\too unde o
este o cifr octal iar t este o cifr octal ntre 0 i 3. Nu este corect s folosii ca va
i pentru literale caracter secvena \u000d (caracterul ASCII CR), sau altele car
e reprezint caractere speciale, pentru c acestea fiind secvene escape Unicode sunt
transformate foarte devreme n timpul procesrii sursei n caractere CR i sunt interpre
tate ca terminatori de linie. Exemple de secvene escape: \n\u23a\34 dac dup c
aracterul backslash urmeaz altceva dect: b, t, n, f, r, ", , \, 0, 1, 2, 3, 4, 5,
6, 7 se va semnala o eroare de compilare. n acest moment secvenele escape Unicode
au fost deja nlocuite cu caractere Unicode native. Dac u apare dup \, se semnaleaz
o eroare de compilare. 4.2.3.5 Literali ir de caractere Un literal ir de caractere
este format din zero sau mai multe caractere ntre ghilimele. Caracterele care
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (9 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java

formeaz irul de caractere pot fi caractere grafice sau secvene escape ca cele defin
ite la literalii caracter. Dac un literal ir de caractere conine n interior un carac
ter terminator de linie va fi semnalat o eroare de compilare. Cu alte cuvinte, nu
putem avea n surs ceva de forma: "Acesta este greit! chiar dac aparent exprimarea ar
reprezenta un ir format din caracterele A, c, e, s, t, a, spaiu, e, s, t, e, lini
e nou, g, r, e, , i, t, !. Dac dorim s introducem astfel de caractere terminatoare d
e linie ntr-un ir va trebui s folosim secvene escape ca n: Acesta este\ngreit Dac i
caractere este prea lung, putem s-l spargem n buci mai mici pe care s le concatenm cu
operatorul +. Fiecare ir de caractere este n fapt o instan a clasei de obiecte Strin
g declarat standard n pachetul java.lang. Exemple de iruri de caractere: """\""" ir d
e caractere""unu" + "doi" Primul ir de caractere din exemplu nu conine nici un car
acter i se numete irul vid. Ultimul exemplu este format din dou iruri distincte conca
tenate.

4.2.4 Separatori
Un separator este un caracter care indic sfritul unei uniti lexicale i nceputul alteia
Separatorii sunt necesari atunci cnd uniti lexicale diferite sunt scrise fr spaii ntr
ele. Acestea se pot totui separa dac unele dintre ele conin caractere separatori. n
Java separatorii sunt urmtorii: ( ) { } [ ] ; , . Exemple de separare: a[i]sin(5
6) n primul exemplu nu avem o singur unitate lexical ci patru: a, [, i, ]. Separato
rii [ i ] ne dau aceast
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (10 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


informaie. n al doilea exemplu, unitile lexicale sunt tot 4 sin, (, 56, ). Atenie, se
paratorii particip n acelai timp i la construcia sintaxei limbajului. Ei nu sunt iden
tici cu spaiile dei, ca i acestea, separ uniti lexicale diferite.
4.2.5 Operatori
Operatorii reprezint simboluri grafice pentru operaiile elementare definite de lim
bajul Java. Despre operatori vom discuta mai mult atunci cnd vom prezenta expresi
ile. Deocamdat, iat lista tuturor operatorilor limbajului Java: =><!~?: ==<=>=!=&&
||++-+-*/&|^%<<>> >>> +=-=*=/=&=|=^=%=<<=>>=>>>= S mai precizm deocamdat c toi operat
orii joac i rol de separatori. Cu alte cuvinte, din secvena de caractere: vasile+gh
eorghe putem extrage trei uniti lexicale, vasile, + i gheorghe.

4.3 Comentarii
Un comentariu este o secven de caractere existent n fiierul surs dar care servete doar
pentru explicarea sau documentarea sursei i nu afecteaz n nici un fel semantica pro
gramelor. n Java exist trei feluri de comentarii:
q
q
q
Comentarii pe mai multe linii, nchise ntre /* i */. Toate caracterele dintre cele d
ou secvene sunt ignorate. Comentarii pe mai multe linii care in de documentaie, nchis
e ntre /** i */. Textul dintre cele dou secvene este automat mutat n documentaia aplic
aiei de ctre generatorul automat de documentaie. Comentarii pe o singur linie care nc
ep cu //. Toate caracterele care urmeaz acestei secvene pn la primul caracter sfrit de
linie sunt ignorate.

n Java, nu putem s scriem comentarii n interiorul altor comentarii. La fel, nu pute


m introduce comentarii n interiorul literalilor caracter sau ir de caractere. Secv
enele /* i */ pot s apar pe o linie dup secvena // dar i pierd semnificaia. La fel s
cu secvena // n comentarii care ncep cu /
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (11 of 12)12.01.2006 23:07:47

Capitolul IV -- Structura lexical Java


* sau /**. Ca urmare, urmtoarea secven de caractere formeaz un singur comentariu: /*
acest comentariu /* // /* se termin abia aici: */
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap4.html (12 of 12)12.01.2006 23:07:47

Capitolul V -- Componente de baz ale programelor Java


Capitolul V Componente de baz ale programelor Java
5.1 Variabile 5.2 Expresii 5.3 Instruciuni
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desktop/...JAVA%20in%20romana/Car
te%20JAVA%20in%20romana/cap5.html12.01.2006 23:07:47

Capitolul VI -- Obiecte Java


Capitolul VI Obiecte Java
6.1 Declaraia unei noi clase de obiecte Pasul 1: Stabilirea conceptului reprezent
at de clasa de obiecte Pasul 2: Stabilirea numelui clasei de obiecte Pasul 3: St
abilirea superclasei Pasul 4: Stabilirea interfeelor pe care le respect clasa Pasu
l 5: Stabilirea modificatorilor clasei Pasul 6: Scrierea corpului declaraiei Stop
: Forma general a unei declaraii de clas 6.2 Variabilele unei clase 6.2.1 Modificat
ori 6.2.2 Protecie 6.2.3 Accesarea unei variabile 6.2.4 Vizibilitate 6.2.5 Variab
ile predefinite: this i super 6.3 Metodele unei clase 6.3.1 Declararea metodelor
6.3.1.1 Numele i parametrii metodelor 6.3.1.2 Modificatori de metode 6.3.1.2.1 Me
tode statice 6.3.1.2.2 Metode abstracte 6.3.1.2.3 Metode finale 6.3.1.2.4 Metode
native 6.3.1.2.5 Metode sincronizate 6.3.1.3 Protejarea metodelor 6.3.2 Clauze
throws 6.3.3 Apelul metodelor 6.3.4 Valoarea de retur a unei metode
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (1 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

6.3.5 Vizibilitate 6.4 Iniializatori statici 6.5 Constructori i finalizatori 6.5.1


constructori 6.5.2 Finalizatori 6.5.3 Crearea instanelor 6.6 Derivarea claselor
6.7 Interfee n primul rnd s observm c, atunci cnd scriem programe n Java nu facem alt
a dect s definim noi i noi clase de obiecte. Dintre acestea, unele vor reprezenta nsi
aplicaia noastr n timp ce altele vor fi necesare pentru rezolvarea problemei la car
e lucrm. Ulterior, atunci cnd dorim s lansm aplicaia n execuie nu va trebui dect s i
em un obiect reprezentnd aplicaia n sine i s apelm o metod de pornire definit de ctr
icaie, metod care de obicei are un nume i un set de parametri bine fixate. Totui, nu
mele acestei metode depinde de contextul n care este lansat aplicaia noastr. Aceast a
bordare a construciei unei aplicaii ne spune printre altele c vom putea lansa oricte
instane ale aplicaiei noastre dorim, pentru c fiecare dintre acestea va reprezenta
un obiect n memorie avnd propriile lui valori pentru variabile. Execuia instanelor
diferite ale aplicaiei va urma desigur ci diferite n funcie de interaciunea fiecreia c
u un utilizator, eventual acelai, i n funcie de unii parametri pe care i putem defini
n momentul crerii fiecrei instane.

6.1 Declaraia unei noi clase de obiecte


Pasul 1: Stabilirea conceptului reprezentat de clasa de obiecte
S vedem ce trebuie s definim atunci cnd dorim s crem o nou clas de obiecte. n primul
trebuie s stabilim care este conceptul care este reprezentat de ctre noua clas de o
biecte i s definim informaiile memorate n obiect i modul de utilizare a acestuia. Ace
st pas este cel mai important din tot procesul de definire al unei noi clase de
obiecte. Este necesar s ncercai s respectai dou reguli oarecum antagonice. Una dintre
ele spune c nu trebuiesc create mai multe clase de obiecte dect este nevoie, pentr
u a nu face dificil nelegerea modului de lucru al aplicaiei la care lucrai. Cea de-a
doua regul spune c nu este bine s mixai ntr-un singur obiect funcionaliti care nu au
ic n comun, crend astfel clase care corespund la dou concepte diferite. Medierea ce
lor dou reguli nu este ntotdeauna foarte uoar. Oricum, v va fi mai uor dac pstrai n
faptul c fiecare clas pe care o definii trebuie s corespund unui concept real bine de
finit, necesar la rezolvarea problemei la care lucrai. i mai pstrai n minte i faptul c
este inutil s lucrai cu concepte foarte generale atunci cnd aplicaia dumneavoastr nu
are nevoie dect de o particularizare a acestora. Riscai s pierdei controlul dezvoltri
i acestor clase de obiecte prea generale i s ngreunai dezvoltarea
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (2 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


aplicaiei.

Pasul 2: Stabilirea numelui clasei de obiecte


Dup ce ai stabilit exact ce dorii de la noua clas de obiecte, suntei n msur s gsii
pentru noua clas, nume care trebuie s urmeze regulile de construcie ale identificat
orilor limbajului Java definite n capitolul anterior. Stabilirea unui nume potriv
it pentru o nou clas nu este ntotdeauna un lucru foarte uor. Problema este c acest nu
me nu trebuie s fie exagerat de lung dar trebuie s exprime suficient de bine desti
naia clasei. Regulile de denumire ale claselor sunt rezultatul experienei fiecruia
sau al unor convenii de numire stabilite anterior. De obicei, numele de clase est
e bine s nceap cu o liter majuscul. Dac numele clasei conine n interior mai multe cuv
e, aceste cuvinte trebuie de asemenea ncepute cu liter majuscul. Restul caracterelo
r vor fi litere minuscule. De exemplu, dac dorim s definim o clas de obiecte care i
mplementeaz conceptul de motor Otto vom folosi un nume ca MotorOtto pentru noua c
las ce trebuie creat. La fel, vom defini clasa MotorDiesel sau MotorCuReacie. Dac ns a
vem nevoie s definim o clas separat pentru un motor Otto cu cilindri n V i carburator
, denumirea clasei ca MotorOttoCuCilindrinV iCarburator nu este poate cea mai bun so
luie. Poate c n acest caz este preferabil o prescurtare de forma MotorOttoVC. Desigu
r, acestea sunt doar cteva remarci la adresa acestei probleme i este n continuare n
ecesar ca n timp s v creai propria convenie de denumire a claselor pe care le creai.

Pasul 3: Stabilirea superclasei


n cazul n care ai definit deja o parte din funcionalitatea de care avei nevoie ntr-o a
lt superclas, putei s derivai noua clas de obiecte din clasa deja existent. Dac nu ex
o astfel de clas, noua clas va fi automat derivat din clasa de obiecte predefinit nu
mit Object. n Java, clasa Object este superclas direct sau indirect pentru orice al
t clas de obiecte definit de utilizator. Alegerea superclasei din care derivai noua
clas de obiecte este foarte important pentru c v ajut s refolosii codul deja existent.
Totui, nu alegei cu uurin superclasa unui obiect pentru c astfel putei ncrca obiecte
o funcionalitate inutil, existent n superclas. Dac nu exist o clas care s v ofere
ncionalitatea de care avei nevoie, este preferabil s derivai noua clas direct din cla
sa Object i s apelai indirect funcionalitatea pe care o dorii.
Pasul 4: Stabilirea interfeelor pe care le respect clasa
Stabilirea acestor interfee are dublu scop. n primul rnd ele instruiesc compilatoru
l s verifice dac noua clas respect cu adevrat toate interfeele pe care le-a declarat,
cu alte cuvinte definete toate metodele declarate n aceste interfee. A doua finalit
ate este aceea de a permite compilatorului s foloseasc instanele noii clase oriunde
aplicaia declar c este nevoie de un obiect care implementeaz interfeele declarate.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (3 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


O clas poate s implementeze mai multe interfee sau niciuna.

Pasul 5: Stabilirea modificatorilor clasei


n unele cazuri trebuie s oferim compilatorului informaii suplimentare relative la m
odul n care vom folosi clasa nou creat pentru ca acesta s poat executa verificri supl
imentare asupra descrierii clasei. n acest scop, putem defini o clas ca fiind abst
ract, final sau public folosindu-ne de o serie de cuvinte rezervate numite modifica
tori. Modificatorii pentru tipurile de clase de mai sus sunt respectiv: abstract
, final i public. n cazul n care declarm o clas de obiecte ca fiind abstract, compilat
orul va interzice instanierea acestei clase. Dac o clas este declarat final, compilat
orul va avea grij s nu putem deriva noi subclase din aceast clas. n cazul n care decla
rm n acelai timp o clas de obiecte ca fiind abstract i final, eroarea va fi semnalat
n timpul compilrii pentru c cei doi modificatori se exclud. Pentru ca o clas s poat f
i folosit i n exteriorul contextului n care a fost declarat ea trebuie s fie declarat
ublic. Mai mult despre acest aspect n paragraful referitor la structura programelo
r. Pn atunci, s spunem c orice clas de obiecte care va fi instaniat ca o aplicaie tre
e declarat public.

Pasul 6: Scrierea corpului declaraiei


n sfrit, dup ce toi ceilali pai au fost efectuai, putem trece la scrierea corpului de
raiei de clas. n principal, aici vom descrie variabilele clasei mpreun cu metodele ca
re lucreaz cu acestea. Tot aici putem preciza i gradele de protejare pentru fiecar
e dintre elementele declaraiei. Uneori numim variabilele i metodele unei clase la
un loc ca fiind cmpurile clasei. Subcapitolele urmtoare vor descrie n amnunt corpul
unei declaraii.
Stop: Forma general a unei declaraii de clas
Sintaxa exact de declarare a unei clase arat n felul urmtor: { abstract | final | pu
blic }* class NumeClas [ extends NumeSuperclas ] [ implements NumeInterfa [ , NumeIn
terfa ]* ] { [ CmpClas ]* }
6.2 Variabilele unei clase
n interiorul claselor se pot declara variabile. Aceste variabile sunt specifice c
lasei respective. Fiecare dintre
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (4 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


ele trebuie s aib un tip, un nume i poate avea iniializatori. n afar de aceste element
e, pe care le-am prezentat deja n seciunea n care am prezentat variabilele, variabi
lele definite n interiorul unei clase pot avea definii o serie de modificatori car
e altereaz comportarea variabilei n interiorul clasei, i o specificaie de protecie ca
re definete cine are dreptul s acceseze variabila respectiv.

6.2.1 Modificatori
Modificatorii sunt cuvinte rezervate Java care precizeaz sensul unei declaraii. Ia
t lista acestora: static final transient volatile Dintre acetia, transient nu este
utilizat n versiunea curent a limbajului Java. Pe viitor va fi folosit pentru a s
pecifica variabile care nu conin informaii care trebuie s rmn persistente la terminare
a programului. Modificatorul volatile specific faptul c variabila respectiv poate f
i modificat asincron cu rularea aplicaiei. n aceste cazuri, compilatorul trebuie s-i
ia msuri suplimentare n cazul generrii i optimizrii codului care se adreseaz acestei v
ariabile. Modificatorul final este folosit pentru a specifica o variabil a crei va
loare nu poate fi modificat. Variabila respectiv trebuie s primeasc o valoare de inii
alizare chiar n momentul declaraiei. Altfel, ea nu va mai putea fi iniializat n viito
r. Orice ncercare ulterioar de a seta valori la aceast variabil va fi semnalat ca ero
are de compilare. Modificatorul static este folosit pentru a specifica faptul c v
ariabila are o singur valoare comun tuturor instanelor clasei n care este declarat. M
odificarea valorii acestei variabile din interiorul unui obiect face ca modifica
rea s fie vizibil din celelalte obiecte. Variabilele statice sunt iniializate la ncrc
area codului specific unei clase i exist chiar i dac nu exist nici o instan a clasei r
spective. Din aceast cauz, ele pot fi folosite de metodele statice.
6.2.2 Protecie
n Java exist patru grade de protecie pentru o variabil aparinnd unei clase:
q q q q
privat protejat public prietenoas
O variabil public este accesibil oriunde este accesibil numele clasei. Cuvntul rezer
vat este public.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (5 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

O variabil protejat este accesibil n orice clas din pachetul creia i aparine clasa n
este declarat. n acelai timp, variabila este accesibil n toate subclasele clasei dat
e, chiar dac ele aparin altor pachete. Cuvntul rezervat este protected. O variabil p
rivat este accesibil doar n interiorul clasei n care a fost declarat. Cuvntul rezervat
este private. O variabil care nu are nici o declaraie relativ la gradul de protecie
este automat o variabil prietenoas. O variabil prietenoas este accesibil n pachetul d
in care face parte clasa n interiorul creia a fost declarat, la fel ca i o variabil p
rotejat. Dar, spre deosebire de variabilele protejate, o variabil prietenoas nu est
e accesibil n subclasele clasei date dac aceste sunt declarate ca aparinnd unui alt p
achet. Nu exist un cuvnt rezervat pentru specificarea explicit a variabilelor priet
enoase. O variabil nu poate avea declarate mai multe grade de protecie n acelai timp
. O astfel de declaraie este semnalat ca eroare de compilare.

6.2.3 Accesarea unei variabile


Accesarea unei variabile declarate n interiorul unei clasei se face folosindu-ne
de o expresie de forma: ReferinInstan.NumeVariabil Referina ctre o instan trebuie s
ferin ctre clasa care conine variabila. Referina poate fi valoarea unei expresii mai
complicate, ca de exemplu un element dintr-un tablou de referine. n cazul n care av
em o variabil static, aceasta poate fi accesat i fr s deinem o referin ctre o inst
. Sintaxa este, n acest caz: NumeClas.NumeVariabil

6.2.4 Vizibilitate
O variabil poate fi ascuns de declaraia unei alte variabile cu acelai nume. De exemp
lu, dac ntr-o clas avem declarat o variabil cu numele unu i ntr-o subclas a acesteia
m declarat o variabil cu acelai nume, atunci variabila din superclas este ascuns de c
ea din clas. Totui, variabila din superclas exist nc i poate fi accesat n mod explic
xpresia de referire este, n acest caz: NumeSuperClas.NumeVariabil sau super.NumeVar
iabil
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (6 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


n cazul n care superclasa este imediat. La fel, o variabil a unei clase poate fi asc
uns de o declaraie de variabil dintr-un bloc de instruciuni. Orice referin la ea va tr
ebui fcut n mod explicit. Expresia de referire este, n acest caz: this.NumeVariabil
6.2.5 Variabile predefinite: this i super
n interiorul fiecrei metode non-statice dintr-o clas exist predefinite dou variabile
cu semnificaie special. Cele dou variabile sunt de tip referin i au aceeai valoare i
me o referin ctre obiectul curent. Diferena dintre ele este tipul. Prima dintre aces
tea este variabila this care are tipul referin ctre clasa n interiorul creia apare me
toda. A doua este variabila super al crei tip este o referin ctre superclasa imediat
a clasei n care apare metoda. n interiorul obiectelor din clasa Object nu se poate
folosi referina super pentru c nu exist nici o superclas a clasei de obiecte Object
. n cazul n care super este folosit la apelul unui constructor sau al unei metode,
ea acioneaz ca un cast ctre superclasa imediat.

6.3 Metodele unei clase


Fiecare clas i poate defini propriile sale metode pe lng metodele pe care le motenete
e la superclasa sa. Aceste metode definesc operaiile care pot fi executate cu obi
ectul respectiv. n cazul n care una dintre metodele motenite nu are o implementare
corespunztoare n superclas, clasa i poate redefini metoda dup cum dorete. n plus, o c
poate defini metode de construcie a obiectelor i metode de eliberare a acestora. M
etodele de construcie sunt apelate ori de cte ori este alocat un nou obiect din cl
asa respectiv. Putem declara mai multe metode de construcie, ele diferind prin par
ametrii din care trebuie construit obiectul. Metodele de eliberare a obiectului
sunt cele care elibereaz resursele ocupate de obiect n momentul n care acesta este
distrus de ctre mecanismul automat de colectare de gunoaie. Fiecare clas are o sin
gur metod de eliberare, numit i finalizator. Apelarea acestei metode se face de ctre
sistem i nu exist nici o cale de control al momentului n care se produce acest apel
.
6.3.1 Declararea metodelor
Pentru a declara o metod, este necesar s declarm numele acesteia, tipul de valoare
pe care o ntoarce, parametrii metodei precum i un bloc n care s descriem instruciunil
e care trebuiesc executate atunci cnd metoda este apelat. n plus, orice metod are un
numr de modificatori care descriu proprietile metodei i
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (7 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

modul de lucru al acesteia. Declararea precum i implementarea metodelor se face nt


otdeauna n interiorul declaraiei de clas. Nu exist nici o cale prin care s putem scri
e o parte dintre metodele unei clase ntr-un fiier separat care s fac referin apoi la d
eclaraia clasei. n form general, declaraia unei metode arat n felul urmtor: [Modifica
]* TipRezultat Declaraie [ClauzeThrows]* CorpulMetodei Modificatorii precum i clau
zele throws pot s lipseasc. 6.3.1.1 Numele i parametrii metodelor Recunoaterea unei
anumite metode se face dup numele i tipul parametrilor si. Pot exista metode cu ace
lai nume dar avnd parametri diferii. Acest fenomen poart numele de suprancrcarea numel
ui unei metode. Numele metodei este un identificator Java. Avem toat libertatea n
a alege numele pe care l dorim pentru metodele noastre, dar n general este prefera
bil s alegem nume care sugereaz utilizarea metodei. Numele unei metode ncepe de obi
cei cu liter mic. Dac acesta este format din mai multe cuvinte, litera de nceput a f
iecrui cuvnt va fi majuscul. n acest mod numele unei metode este foarte uor de citit i
de depistat n surs. Parametrii metodei sunt n realitate nite variabile care sunt in
iializate n momentul apelului cu valori care controleaz modul ulterior de execuie. A
ceste variabile exist pe toat perioada execuiei metodei. Se pot scrie metode care s
nu aib nici un parametru. Fiind o variabil, fiecare parametru are un tip i un nume.
Numele trebuie s fie un identificator Java. Dei avem libertatea s alegem orice num
e dorim, din nou este preferabil s alegem nume care s sugereze scopul la care va f
i utilizat parametrul respectiv. Tipul unui parametru este oricare dintre tipuri
le valide n Java. Acestea poate fi fie un tip primitiv, fie un tip referin ctre obie
ct, interfa sau tablou. n momentul apelului unei metode, compilatorul ncearc s gseasc
metod n interiorul clasei care s aib acelai nume cu cel apelat i acelai numr de param
i ca i apelul. Mai mult, tipurile parametrilor de apel trebuie s corespund cu tipur
ile parametrilor declarai ai metodei gsite sau s poat fi convertii la acetia. Dac o as
fel de metod este gsit n declaraia clasei sau n superclasele acesteia, parametrii de a
pel sunt convertii ctre tipurile declarate i se genereaz apelul ctre metoda respectiv.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (8 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

Este o eroare de compilare s declarm dou metode cu acelai nume, acelai numr de paramet
ri i acelai tip pentru parametrii corespunztori. ntr-o asemenea situaie, compilatorul
n-ar mai ti care metod trebuie apelat la un moment dat. De asemenea, este o eroare
de compilare s existe dou metode care se potrivesc la acelai apel. Acest lucru se n
tmpl cnd nici una dintre metodele existente nu se potrivete exact i cnd exist dou met
cu acelai nume i acelai numr de parametri i, n plus, parametrii de apel se pot conver
ti ctre parametrii declarai ai ambelor metode. Rezolvarea unei astfel de probleme
se face prin conversia explicit (cast) de ctre programator a valorilor de apel spr
e tipurile exacte ale parametrilor metodei pe care dorim s o apelm n realitate. n fi
ne, forma general de declaraie a numelui i parametrilor unei metode este: NumeMetod(
[TipParametru NumeParametru] [,TipParametru NumeParametru]* ) 6.3.1.2 Modificat
ori de metode Modificatorii sunt cuvinte cheie ale limbajului Java care specific
proprieti suplimentare pentru o metod. Iat lista complet a acestora n cazul metodelor:
q q q q q
static - pentru metodele statice abstract - pentru metodele abstracte final - pe
ntru metodele finale native - pentru metodele native synchronized - pentru metod
ele sincronizate
6.3.1.2.1 Metode statice
n mod normal, o metod a unei clase se poate apela numai printr-o instan a clasei res
pective sau printr-o instan a unei subclase. Acest lucru se datoreaz faptului c meto
da face apel la o serie de variabile ale clasei care sunt memorate n interiorul i
nstanei i care au valori diferite n instane diferite. Astfel de metode se numesc met
ode ale instanelor clasei. Dup cum tim deja, exist i un alt tip de variabile, i anume
variabilele de clas sau variabilele statice care sunt comune tuturor instanelor cl
asei respective i exist pe toat perioada de timp n care clasa este ncrcat n memorie.
ste variabile pot fi accesate fr s avem nevoie de o instan a clasei respective. n mod
similar exist i metode statice. Aceste metode nu au nevoie de o instan a clasei sau
a unei subclase pentru a putea fi apelate pentru c ele nu au voie s foloseasc varia
bile care sunt memorate n interiorul instanelor. n schimb, aceste metode pot s folos
easc variabilele statice declarate n interiorul clasei.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (9 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


Orice metod static este implicit i final.
6.3.1.2.2 Metode abstracte

Metodele abstracte sunt metode care nu au corp de implementare. Ele sunt declara
te numai pentru a fora subclasele care vor s aib instane s implementeze metodele resp
ective. Metodele abstracte trebuie declarate numai n interiorul claselor care au
fost declarate abstracte. Altfel compilatorul va semnala o eroare de compilare.
Orice subclas a claselor abstracte care nu este declarat abstract trebuie s ofere o
implementare a acestor metode, altfel va fi generat o eroare de compilare. Prin a
cest mecanism ne asigurm c toate instanele care pot fi convertite ctre clasa care co
nine definiia unei metode abstracte au implementat metoda respectiv dar, n acelai timp
, nu este nevoie s implementm n nici un fel metoda chiar n clasa care o declar pentru
c nu tim pe moment cum va fi implementat. O metod static nu poate fi declarat i abstr
ct pentru c o metod static este implicit final i nu poate fi rescris.
6.3.1.2.3 Metode finale

O metod final este o metod care nu poate fi rescris n subclasele clasei n care a fost
declarat. O metod este rescris ntr-o subclas dac aceasta implementeaz o metod cu acel
ume i acelai numr i tip de parametri ca i metoda din superclas. Declararea metodelor f
inale este util n primul rnd compilatorului care poate genera metodele respective d
irect n codul rezultat fiind sigur c metoda nu va avea nici o alt implementare n sub
clase.
6.3.1.2.4 Metode native
Metodele native sunt metode care sunt implementate pe o cale specific unei anumit
e platforme. De obicei aceste metode sunt implementate n C sau n limbaj de asambla
re. Metoda propriu-zis nu poate avea corp de implementare pentru c implementarea n
u este fcut n Java. n rest, metodele native sunt exact ca orice alt metod Java. Ele po
t fi motenite, pot fi statice sau nu, pot fi finale sau nu, pot s rescrie o metod d
in superclas i pot fi la rndul lor rescrise n subclase.
6.3.1.2.5 Metode sincronizate

O metod sincronizat este o metod care conine cod critic pentru un anumit obiect sau
clas i nu poate fi rulat n paralel cu nici o alt metod critic sau cu o instruciune sy
ronized referitoare la acelai obiect sau clas.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (10 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


nainte de execuia metodei, obiectul sau clasa respectiv sunt blocate. La terminarea
metodei, acestea sunt deblocate. Dac metoda este static atunci este blocat o ntreag
clas, clasa din care face parte metoda. Altfel, este blocat doar instana n contextul
creia este apelat metoda. 6.3.1.3 Protejarea metodelor Accesul la metodele unei c
lase este protejat n acelai fel ca i accesul la variabilele clasei. n Java exist patr
u grade de protecie pentru o metod aparinnd unei clase:
q q q q
privat protejat public prietenoas

O metod declarat public este accesibil oriunde este accesibil numele clasei. Cuvntul
rezervat este public. O metod declarat protejat este accesibil n orice clas din pachet
ul creia i aparine clasa n care este declarat. n acelai timp, metoda este accesibil
te subclasele clasei date, chiar dac ele aparin altor pachete. Cuvntul rezervat est
e protected. O metod declarat privat este accesibil doar n interiorul clasei n care a
fost declarat. Cuvntul rezervat este private. O metod care nu are nici o declaraie r
elativ la gradul de protecie este automat o metod prietenoas. O metod prietenoas este
accesibil n pachetul din care face parte clasa n interiorul creia a fost declarat la
fel ca i o metod protejat. Dar, spre deosebire de metodele protejate, o metod priete
noas nu este accesibil n subclasele clasei date dac aceste sunt declarate ca aparinnd
unui alt pachet. Nu exist un cuvnt rezervat pentru specificarea explicit a metodelo
r prietenoase. O metod nu poate avea declarate mai multe grade de protecie n acelai
timp. O astfel de declaraie este semnalat ca eroare de compilare.

6.3.2 Clauze throws


Dac o metod poate arunca o excepie, adic s apeleze instruciunea throw, ea trebuie s de
lare tipul acestor excepii ntr-o clauz throws. Sintaxa acesteia este: throws NumeTi
p [, NumeTip]* Numele de tipuri specificate n clauza throws trebuie s fie accesibi
le i s fie asignabile la tipul de clas
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (11 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


Throwable. Dac o metod conine o clauz throws, este o eroare de compilare ca metoda s
arunce un obiect care nu este asignabil la compilare la tipurile de clase Error,
RunTimeException sau la tipurile de clase specificate n clauza throws. Dac o meto
d nu are o clauz throws, este o eroare de compilare ca aceasta s poat arunca o excepi
e normal din interiorul corpului ei.
6.3.3 Apelul metodelor
Pentru a apela o metod a unei clase este necesar s dispunem de o cale de acces la
metoda respectiv. n plus, trebuie s dispunem de drepturile necesare apelului metode
i. Sintaxa efectiv de acces este urmtoarea: CaleDeAcces.Metod( Parametri ) n cazul n
care metoda este static, pentru a specifica o cale de acces este suficient s furni
zm numele clasei n care a fost declarat metoda. Accesul la numele clasei se poate o
bine fie importnd clasa sau ntreg pachetul din care face parte clasa fie specificnd n
clar numele clasei i drumul de acces ctre aceasta. De exemplu, pentru a accesa me
toda random definit static n clasa Math aparinnd pachetului java. lang putem scrie:
double aleator = Math.random(); sau, alternativ: double aleator = java.lang.Math
.random(); n cazul claselor definite n pachetul java.lang nu este necesar nici un
import pentru c acestea sunt implicit importate de ctre compilator. Cea de-a doua
cale de acces este existena unei instane a clasei respective. Prin aceast instan pute
m accesa metodele care nu sunt declarate statice, numite uneori i metode ale inst
anelor clasei. Aceste metode au nevoie de o instan a clasei pentru a putea lucra, p
entru c folosesc variabile non-statice ale clasei sau apeleaz alte metode non-stat
ice. Metodele primesc acest obiect ca pe un parametru ascuns. De exemplu, avnd o
instan a clasei Object sau a unei subclase a acesteia, putem obine o reprezentare s
ub form de ir de caractere prin: Object obiect = new Object(); String sir = obiect
.toString();
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (12 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

n cazul n care apelm o metod a clasei din care face parte i metoda apelant putem s ren
nm la calea de acces n cazul metodelor statice, scriind doar numele metodei i parame
trii. Pentru metodele specifice instanelor, putem renuna la calea de acces, dar n a
cest caz metoda acceseaz aceeai instan ca i metoda apelant. n cazul n care metoda ape
t este static, specificarea unei instane este obligatorie n cazul metodelor de insta
n. Parametrii de apel servesc mpreun cu numele la identificarea metodei pe care dori
m s o apelm. nainte de a fi transmii, acetia sunt convertii ctre tipurile declarate de
parametri ai metodei, dup cum este descris mai sus. Specificarea parametrilor de
apel se face separndu-i prin virgul. Dup ultimul parametru nu se mai pune virgul. Da
c metoda nu are nici un parametru, parantezele rotunde sunt n continuare necesare.
Exemple de apel de metode cu parametri: String numar = String.valueOf( 12 ); //
12 -> String double valoare = Math.abs( 12.54 ); // valoare absolut String prima
= numar.substring( 0, 1 ); // prima litera ^

6.3.4 Valoarea de retur a unei metode


O metod trebuie s-i declare tipul valorii pe care o ntoarce. n cazul n care metoda dor
ete s specifice explicit c nu ntoarce nici o valoare, ea trebuie s declare ca tip de
retur tipul void ca n exemplul: void a() { } n caz general, o metod ntoarce o valoar
e primitiv sau un tip referin. Putem declara acest tip ca n: Thread cautaFirulCurent
() { } long abs( int valoare ) { } Pentru a returna o valoare ca rezultat al exe
cuiei unei metode, trebuie s folosim instruciunea return, aa cum s-a artat n seciunea
edicat instruciunilor. Instruciunea return trebuie s conin o expresie a crei valoare s
oat fi convertit la tipul declarat al valorii de retur a metodei. De exemplu: long
abs( int valoare ) { return Math.abs( valoare ); } Metoda static abs din clasa M
ath care primete un parametru ntreg returneaz tot un ntreg. n exemplul
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (13 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


nostru, instruciunea return este corect pentru c exist o cale de conversie de la ntre
g la ntreg lung, conversie care este apelat automat de compilator nainte de ieirea d
in metod. n schimb, n exemplul urmtor: int abs( long valoare ) { return Math.abs( va
loare ); } compilatorul va genera o eroare de compilare pentru c metoda static abs
din clasa Math care primete ca parametru un ntreg lung ntoarce tot un ntreg lung, i
ar un ntreg lung nu poate fi convertit sigur la un ntreg normal pentru c exist riscu
l deteriorrii valorii, la fel ca la atribuire. Rezolvarea trebuie s conin un cast ex
plicit: int abs( long valoare ) { return ( int )Math.abs( valoare ); } n cazul n c
are o metod este declarat void, putem s ne ntoarcem din ea folosind instruciunea retu
rn fr nici o expresie. De exemplu: void metoda() { if( ) return; } Specificarea un
ei expresii n acest caz duce la o eroare de compilare. La fel i n cazul n care folos
im instruciunea return fr nici o expresie n interiorul unei metode care nu este decl
arat void.

6.3.5 Vizibilitate
O metod este vizibil dac este declarat n clasa prin care este apelat sau ntr-una din s
perclasele acesteia. De exemplu, dac avem urmtoarea declaraie: class A { void a() {
} } class B extends A { void b() { a();
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (14 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

c(); } void c() { .. } } Apelul metodei a n interiorul metodei b din clasa B este
permis pentru c metoda a este declarat n interiorul clasei A care este superclas pe
ntru clasa B. Apelul metodei c n aceeai metod b este permis pentru c metoda c este d
eclarat n aceeai clas ca i metoda a. Uneori, o subclas rescrie o metod dintr-o supercl
s a sa. n acest caz, apelul metodei respective n interiorul subclasei duce automat
la apelul metodei din subclas. Dac totui dorim s apelm metoda aa cum a fost ea definit
superclas, putem prefixa apelul cu numele superclasei. De exemplu: class A { voi
d a() { } } class B extends A { void a() { .. } void c() { a();// metoda a din c
lasa B A.a();// metoda a din clasa A } } Desigur, pentru a "vedea" o metod i a o p
utea apela, este nevoie s avem drepturile necesare.
6.4 Iniializatori statici
La ncrcarea unei clase sunt automat iniializate toate variabilele statice declarate
n interiorul clasei. n plus, sunt apelai toi iniializatorii statici ai clasei. Un in
iializator static are urmtoarea sintax: static BlocDeInstruciuni Blocul de instruciun
i este executat automat la ncrcarea clasei. De exemplu, putem defini un iniializato
r static n felul urmtor:
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (15 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


class A { static double a; static int b; static { a = Math.random(); // numr dubl
u ntre 0.0 i 1.0 b = ( int )( a * 500 ); // numr ntreg ntre 0 i 500 } } Declaraiile
variabile statice i iniializatorii statici sunt executate n ordinea n care apar n cla
s. De exemplu, dac avem urmtoarea declaraie de clas: class A { static int i = 11; sta
tic { i += 100; i %= 55; } static int j = i + 1; } valoarea final a lui i va fi 1
( ( 11 + 100 ) % 55 ) iar valoarea lui j va fi 2.
6.5 Constructori i finalizatori
6.5.1 constructori
La crearea unei noi instane a unei clase sistemul aloc automat memoria necesar inst
anei i o iniializeaz cu valorile iniiale specificate sau implicite. Dac dorim s facem
niializri suplimentare n interiorul acestei memorii sau n alt parte putem descrie met
ode speciale numite constructori ai clasei. Putem avea mai muli constructori pent
ru aceeai clas, acetia diferind doar prin parametrii pe care i primesc. Numele tutur
or constructorilor este acelai i este identic cu numele clasei. Declaraia unui cons
tructor este asemntoare cu declaraia unei metode oarecare, cu diferena c nu putem spe
cifica o valoare de retur i nu putem specifica nici un fel de modificatori. Dac do
rim s returnm dintr-un constructor, trebuie s folosim instruciunea return fr nici o ex
presie. Putem ns s specificm gradul de protecie al unui constructor ca fiind public,
privat, protejat sau prietenos. Constructorii pot avea clauze throws.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (16 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

Dac o clas nu are constructori, compilatorul va crea automat un constructor implic


it care nu ia nici un parametru i care iniializeaz toate variabilele clasei i apelea
z constructorul superclasei fr argumente prin super(). Dac superclasa nu are un cons
tructor care ia zero argumente, se va genera o eroare de compilare. Dac o clas are
cel puin un constructor, constructorul implicit nu mai este creat de ctre compila
tor. Cnd construim corpul unui constructor avem posibilitatea de a apela, pe prim
a linie a blocului de instruciuni care reprezint corpul constructorului, un constr
uctor explicit. Constructorul explicit poate avea dou forme: this( [Parametri] );
super( [Parametri] ); Cu aceast sintax apelm unul dintre constructorii superclasei
sau unul dintre ceilali constructori din aceeai clas. Aceste linii nu pot aprea dect
pe prima poziie n corpul constructorului. Dac nu apar acolo, compilatorul consider
implicit c prima instruciune din corpul constructorului este: super(); i n acest caz
se va genera o eroare de compilare dac nu exist un constructor n superclas care s lu
creze fr nici un parametru. Dup apelul explicit al unui constructor din superclas cu
sintaxa super( ) este executat n mod implicit iniializarea tuturor variabilelor de
instan (non-statice) care au iniializatori explicii. Dup apelul unui constructor din
aceeai clas cu sintaxa this( ) nu exist nici o alt aciune implicit, deci nu vor fi i
iializate nici un fel de variabile. Aceasta datorit faptului c iniializarea s-a prod
us deja n constructorul apelat. Iat i un exemplu: class A extends B { String valoar
e; A( String val ) { // aici exist apel implicit // al lui super(), adic B() valoa
re = val; } A( int val ) { this( String.valueOf( val ) );// alt constructor } }
^
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (17 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

6.5.2 Finalizatori
n Java nu este nevoie s apelm n mod explicit distrugerea unei instane atunci cnd nu ma
i este nevoie de ea. Sistemul ofer un mecanism de colectare a gunoaielor care rec
unoate situaia n care o instan de obiect sau un tablou nu mai sunt referite de nimeni
i le distruge n mod automat. Acest mecanism de colectare a gunoaielor ruleaz pe un
fir de execuie separat, de prioritate mic. Nu avem nici o posibilitate s aflm exact
care este momentul n care va fi distrus o instan. Totui, putem specifica o funcie car
e s fie apelat automat n momentul n care colectorul de gunoaie ncearc s distrug obiec
. Aceast funcie are nume, numr de parametri i tip de valoare de retur fixe: void fin
alize()

Dup apelul metodei de finalizare (numit i finalizator), instana nu este nc distrus pn


o nou verificare din partea colectorului de gunoaie. Aceast comportare este necesa
r pentru c instana poate fi revitalizat prin crearea unei referine ctre ea n interioru
finalizatorului. Totui, finalizatorul nu este apelat dect o singur dat. Dac obiectul
revitalizat redevine candidat la colectorul de gunoaie, acesta este distrus fr a
i se mai apela finalizatorul. Cu alte cuvinte, un obiect nu poate fi revitalizat
dect o singur dat. Dac n timpul finalizrii apare o excepie, ea este ignorat i final
rul nu va mai fi apelat din nou.
6.5.3 Crearea instanelor
O instan este creat folosind o expresie de alocare care folosete cuvntul rezervat new
. Iat care sunt paii care sunt executai la apelul acestei expresii:
q
q
q
Se creeaz o nou instan de tipul specificat. Toate variabilele instanei sunt iniializat
e pe valorile lor implicite. Se apeleaz constructorul corespunztor n funcie de param
etrii care sunt transmii n expresia de alocare. Dac instana este creat prin apelul me
todei newInstance, se apeleaz constructorul care nu ia nici un argument. Dup crear
e, expresia de alocare returneaz o referin ctre instana nou creat.
Exemple de creare: A o1 = new A(); B o2 = new B(); class C extends B { String va
loare; C( String val ) {
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (18 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


// aici exist apel implicit // al lui super(), adic B() valoare = val; } C( int va
l ) { this( String.valueOf( val ) ); } } C o3 = new C( "Vasile" ); C o4 = new C(
13 ); O alt cale de creare a unui obiect este apelul metodei newInstance declara
te n clasa Class. Iat paii de creare n acest caz:
q
q q
Se creeaz o nou instan de acelai tip cu tipul clasei pentru care a fost apelat metoda
newInstance. Toate variabilele instanei sunt iniializate pe valorile lor implicite
. Este apelat constructorul obiectului care nu ia nici un argument. Dup creare re
ferina ctre obiectul nou creat este returnat ca
valoare a metodei newInstance. Tipul acestei referine va fi Object n timpul compilr
ii i tipul clasei reale n timpul execuiei.

6.6 Derivarea claselor


O clas poate fi derivat dintr-alta prin folosirea n declaraia clasei derivate a clau
zei extends. Clasa din care se deriv noua clas se numete superclas imediat a clasei d
erivate. Toate clasele care sunt superclase ale superclasei imediate ale unei cl
ase sunt superclase i pentru clasa dat. Clasa nou derivat se numete subclas a clasei
din care este derivat. Sintaxa general este: class SubClas extends SuperClas O clas p
oate fi derivat dintr-o singur alt clas, cu alte cuvinte o clas poate avea o singur su
perclas imediat. Clasa derivat motenete toate variabilele i metodele superclasei sale.
Totui, ea nu poate accesa dect acele variabile i metode care nu sunt declarate pri
vate. Putem rescrie o metod a superclasei declarnd o metod n noua clas avnd acelai num
i aceiai parametri. La fel, putem declara o variabil care are acelai nume cu o vari
abil din superclas. n acest caz, noul nume ascunde vechea variabil, substituindu-i-s
e. Putem n continuare s ne referim la variabila ascuns din superclas specificnd numel
e superclasei sau folosindu-ne de variabila super.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (19 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

Exemplu: class A { int a = 1; void unu() { System.out.println( a ); } } class B


extends A { double a = Math.PI; void unu() { System.out.println( a ); } void doi
() { System.out.println( A.a ); } void trei() { unu(); super.unu(); } } Dac apelm
metoda unu din clasa A, aceasta va afia la consol numrul 1. Acest apel se va face c
u instruciunea: ( new A() ).unu(); Dac apelm metoda unu din clasa B, aceasta va afia
la consol numrul PI. Apelul l putem face de exemplu cu instruciunea: B obiect = new
B(); obiect.unu(); Observai c n metoda unu din clasa B, variabila referit este vari
abila a din clasa B. Variabila a din clasa A este ascuns. Putem ns s o referim prin
sintaxa A.a ca n metoda doi din clasa B. n interiorul clasei B, apelul metodei unu
fr nici o alt specificaie duce automat la apelul metodei unu definite n interiorul c
lasei B. Metoda unu din clasa B rescrie metoda unu din clasa A. Vechea metod este
accesibil pentru a o referi n mod explicit ca n metoda trei din clasa B. Apelul ac
estei metode va afia mai nti numrul PI i apoi numrul 1. Dac avem declarat o variabil
ip referin ctre o instan a clasei A, aceast variabil poate s conin n timpul execu
rin ctre o instan a clasei B. Invers, afirmaia nu este valabil.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (20 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

n clipa n care apelm metoda unu pentru o variabil referin ctre clasa A, sistemul va ap
la metoda unu a clasei A sau B n funcie de adevratul tip al referinei din timpul exe
cuiei. Cu alte cuvinte, urmtoarea secven de instruciuni: A tablou[] = new A[2]; tablo
u[0] = new A(); tablou[1] = new B(); for( int i = 0; i < 2; i++ ) { tablou[i].un
u(); } va afia dou numere diferite, mai nti 1 i apoi PI. Aceasta din cauz c cel de-al
oilea element din tablou este, n timpul execuiei, de tip referin la o instan a clasei
B chiar dac la compilare este de tipul referin la o instan a clasei A. Acest mecanism
se numete legare trzie, i nseamn c metoda care va fi efectiv apelat este stabilit do
timpul execuiei i nu la compilare. Dac nu declarm nici o superclas n definiia unei cl
se, atunci se consider automat c noua clas deriv direct din clasa Object, motenind to
ate metodele i variabilele acesteia.

6.7 Interfee
O interfa este n esen o declaraie de tip ce const dintr-un set de metode i constante
tru care nu s-a specificat nici o implementare. Programele Java folosesc interfee
le pentru a suplini lipsa motenirii multiple, adic a claselor de obiecte care deri
v din dou sau mai multe alte clase. Sintaxa de declaraie a unei interfee este urmtoar
ea: Modificatori interface NumeInterf [ extends [Interfa][, Interfa]*] Corp Modifica
torii unei interfee pot fi doar cuvintele rezervate public i abstract. O interfa car
e este public poate fi accesat i de ctre alte pachete dect cel care o definete. n plus
fiecare interfa este n mod implicit abstract. Modificatorul abstract este permis da
r nu obligatoriu. Numele interfeelor trebuie s fie identificatori Java. Conveniile
de numire a interfeelor le urmeaz n general pe cele de numire a claselor de obiecte
. Interfeele, la fel ca i clasele de obiecte, pot avea subinterfee. Subinterfeele mot
enesc toate constantele i declaraiile de metode ale interfeei din care deriv i pot de
fini n plus noi elemente. Pentru a defini o subinterfa, folosim o clauz extends. Ace
ste clauze specific superinterfaa unei interfee. O interfa
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (21 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

poate avea mai multe superinterfee care se declar separate prin virgul dup cuvntul re
zervat extends. Circularitatea definiiei subinterfeelor nu este permis. n cazul inte
rfeelor nu exist o rdcin comun a arborelui de derivare aa cum exist pentru arborele d
lase, clasa Object. n corpul unei declaraii de interfa pot s apar declaraii de variabi
e i declaraii de metode. Variabilele sunt implicit statice i finale. Din cauza fapt
ului c variabilele sunt finale, este obligatoriu s fie specificat o valoare iniial pe
ntru aceste variabile. n plus, aceast valoare iniial trebuie s fie constant (s nu depi
d de alte variabile). Dac interfaa este declarat public, toate variabilele din corpul
su sunt implicit declarate publice. n ceea ce privete metodele declarate n interior
ul corpului unei interfee, acestea sunt implicit declarate abstracte. n plus, dac i
nterfaa este declarat public, metodele din interior sunt implicit declarate publice
. Iat un exemplu de declaraii de interfee: public interface ObiectSpatial { final i
nt CUB = 0; final int SFERA = 1; double greutate(); double volum(); double raza(
); int tip(); } public interface ObiectSpatioTemporal extends ObiectSpatial { vo
id centrulDeGreutate( long moment, double coordonate[] ); long momentInitial();
long momentFinal(); } Cele dou interfee definesc comportamentul unui obiect spaial
respectiv al unui obiect spaio-temporal. Un obiect spaial are o greutate, un volum
i o raz a sferei minime n care se poate nscrie. n plus, putem defini tipul unui obie
ct folosindu-ne de o serie de valori constante predefinite precum ar fi SFERA sa
u CUB. Un obiect spaio-temporal este un obiect spaial care are n plus o poziie pe ax
a timpului. Pentru un astfel de obiect, n afar de proprietile deja descrise pentru o
biectele spaiale, trebuie s avem n plus un moment iniial, de apariie, pe axa timpului
i un moment final. Obiectul nostru nu exist n afara acestui interval de timp. n plu
s, pentru un astfel de obiect putem afla poziia centrului su de greutate n fiecare
moment aflat n intervalul de existen. Pentru a putea lucra cu obiecte spaiale i spaiotemporale este nevoie s definim diverse clase care s
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (22 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java

implementeze aceste interfee. Acest lucru se face specificnd clauza implements n de


claraia de clas. O clas poate implementa mai multe interfee. Dac o clas declar c impl
nteaz o anumit interfa, ea este obligatoriu s implementeze toate metodele declarate n
interfaa respectiv. De exemplu, putem spune c o minge este un obiect spaial de tip s
fer. n plus, mingea are o poziie n funcie de timp i un interval de existen. Cu alte c
nte, mingea este chiar un obiect spaio-temporal. Desigur, n afar de proprietile spaiotemporale mingea mai are i alte proprieti precum culoarea, proprietarul sau preul de
cumprare. Iat cum ar putea arta definiia clasei de obiecte de tip minge: import jav
a.awt.Color; class Minge extends Jucarie implements ObiectSpatioTemporal int cul
oare = Color.red; double pret = 10000.0; double raza = 0.25; long nastere; long
moarte; // metodele din ObiectSpatial double greutate() { return raza * 0.5; } d
ouble raza() { return raza; } double volum() { return ( 4.0 / 3.0 ) * Math.PI *
raza * raza * raza; } int tip() { return SFERA; } // metodele din interfaa Obiect
SpatioTemporal boolean centrulDeGreutate( long moment, double coordonate[] ) { i
f( moment < nastere || moment > moarte ) { return false; } coordonate[0] = x; co
ordonate[1] = y; coordonate[2] = z; return true; } long momentInitial() {
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (23 of 25)12.01.2006 23:07:49
{

Capitolul VI -- Obiecte Java

return nastere; } long momentFinal() { return moarte; } int ceCuloare() { return


culoare; } double cePret() { return pret; } } Observai c noua clas Minge implement
eaz toate metodele definite n interfaa ObiectSpatioTemporal i, pentru c aceasta extin
de interfaa ObiectSpatial, i metodele definite n cea din urm. n plus, clasa i definet
ropriile metode i variabile. S presupunem n continuare c avem i o alt clas, Rezervor,
are este tot un obiect spaio-temporal, dar de form cubic. Declaraia acestei clase ar
arta ca: class Rezervor extends Constructii implements ObiectSpatioTemporal { }
Desigur, toate metodele din interfeele de mai sus trebuiesc implementate, plus al
te metode specifice. S mai observm c cele dou obiecte deriv din clase diferite: Minge
a din Jucrii iar Rezervorul din Construcii. Dac am putea deriva o clas din dou alte c
lase, am putea deriva Minge din Jucarie i ObiectSpatioTemporal iar Rezervor din C
onstructie i ObiectSpaioTemporal. ntr-o astfel de situaie, nu ar mai fi necesar ca O
biectSpaioTemporal s fie o interfa, ci ar fi suficient ca acesta s fie o alt clas. Din
pcate, n Java, o clas nu poate deriva dect dintr-o singur alt clas, aa c este obliga
n astfel de situaii s folosim interfeele. Dac ObiectSpaioTemporal ar fi putut fi o cl
as, am fi avut avantajul c puteam implementa acolo metodele cu funcionare identic di
n cele dou clase discutate, acestea fiind automat motenite fr a mai fi nevoie de def
inirea lor de dou ori n fiecare clas n parte. Putem crea n continuare metode care s lu
creze cu obiecte spaio-temporale, de exemplu o metod care s afle distana unui corp s
paio-temporal fa de un punct dat la momentul su iniial. O astfel de metod se poate scr
ie o singur dat, i poate lucra cu toate clasele care implementeaz interfaa noastr. De
exemplu: double distanta( double punct[], ObiectSpatioTemporal obiect ) {
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (24 of 25)12.01.2006 23:07:49

Capitolul VI -- Obiecte Java


double coordonate[] = new double[3]; obiect.centrulDeGreutate( obiect.momentInit
ial(), coordonate ); double x = coordonate[0] - punct[0]; double y = coordonate[
1] - punct[1]; double z = coordonate[2] - punct[2]; return Math.sqrt( x * x + y
* y + z * z ); } Putem apela metoda att cu un obiect din clasa Minge ct i cu un obi
ect din clasa Rezervor. Compilatorul nu se va plnge pentru c el tie c ambele clase i
mplementeaz interfaa ObiectSpaioTemporal, aa c metodele apelate n interiorul calcululu
i distanei (momentInitial i centruDeGreutate) sunt cu siguran implementate n ambele c
lase. Deci, putem scrie: Minge minge; Rezervor rezervor; double punct[] = { 10.0
, 45.0, 23.0 }; distana( punct, minge ); distana( punct, rezervor ); Desigur, n mod
normal ar fi trebuit s proiectm i un constructor sau mai muli care s iniializeze obie
ctele noastre cu valori rezonabile. Aceti constructori ar fi stat cu siguran n defin
iia claselor i nu n definiia interfeelor. Nu avem aici nici o cale de a fora definirea
unui anumit constructor cu ajutorul interfeei.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap6.html (25 of 25)12.01.2006 23:07:49

Capitolul VII -- Structura programelor


Capitolul VII Structura programelor
q q q q
8.1 Pachete de clase 8.2 Importul claselor 8.3 Fiiere surs 8.4 Compilare i execuie

8.1 Pachete de clase


Clasele Java sunt organizate pe pachete. Aceste pachete pot avea nume ierarhice.
Numele de pachete au forma urmtoare: [NumePachet.]* NumeComponentPachet Numele de
pachete i de componente ale acestora sunt identificatori Java. De obicei, aceste
nume urmeaz structura de directoare n care sunt memorate clasele compilate. Rdcina
arborelui de directoare n care sunt memorate clasele este indicat de o variabil sis
tem CLASSPATH. n DOS aceasta se seteaz n felul urmtor: set CLASSPATH=.;c:\java\lib n
Unix se poate seta cu comanda: CLASSPATH=.:/usr/local/lib/java ; export CLASSPAT
H dac lucrai cu bash . Din aceast rdcin, fiecare pachet are propriul director. n direc
or exist codul binar pentru componentele pachetului respectiv. Dac pachetul conine
subpachete, atunci acestea sunt memorate ntr-un subdirector n interiorul directoru
lui pachetului. Creatorii Java recomand folosirea unei reguli unice de numire a p
achetelor, astfel nct s nu apar conflicte. Convenia recomandat de ei este aceea de a f
olosi numele domeniului Internet aparinnd productorului claselor. Astfel, numele de
pachete ar putea arta ca n: COM.Microsoft.OLE COM.Apple.quicktime.v2
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap8.html (1 of 4)12.01.2006 23:07:50

Capitolul VII -- Structura programelor

i aa mai departe.


8.2 Importul claselor
Desigur, este nevoie ca o clas s poat folosi obiecte aparinnd unei alte clase. Pentru
aceasta, definiia clasei respective trebuie s importe codul binar al celeilalte c
lase pentru a ti care sunt variabilele i metodele clasei respective. Importul se f
ace cu o instruciune special: import numeClas ; unde numele clasei include i pachetu
l din care aceasta face parte. De exemplu: import java.awt.Graphics; import java
.applet.Applet; Se poate importa i un pachet ntreg, adic toate clasele aparinnd acelu
i pachet, printr-o instruciune de forma: import numePachet.*; De exemplu: import
java.awt.*;

8.3 Fiiere surs


Codul surs Java trebuie introdus cu un editor ntr-un fiier text pe care l vom numi n
continuare fiier surs. Un fiier surs poate s conin declaraia mai multor clase i inte
dar doar una dintre acestea poate fi declarat public. Utilizarea celorlalte clase
este limitat la fiierul respectiv. Mai mult, nu putem avea n acelai timp o interfa pub
lic i o clas public declarate n acelai fiier surs. Dac dorim s nregistrm codul cl
anumit pachet, putem s includem la nceputul fiierului surs o declaraie de forma: pack
age numePachet; dac aceast declaraie lipsete, clasa va fi plasat n pachetul implicit,
care nu are nume.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap8.html (2 of 4)12.01.2006 23:07:50

Capitolul VII -- Structura programelor


Structura general a unui fiier surs este urmtoarea: [ DeclaraiePachet ][ InstruciuneIm
port ]*[ DeclaraieDeTip ]* unde declaraia de tip poate fi o declaraie de clas sau de
interfa.
8.4 Compilare i execuie
Fiierele surs Java au obligatoriu extensia .java . Numele lor este identic cu nume
le clasei sau interfeei publice declarate n interior. n urma compilrii rezult fiiere c
u nume identice cu numele claselor dar cu extensia .class indiferent dac este vor
ba de o clas sau o interfa. Fiierul .class este generat n directorul local i nu direct
la locaia pachetului. Compilarea se face cu o comand de forma: javac FiierSurs .jav
a Comanda aceasta, ca i celelalte descrise n acest paragraf este specific mediului
de dezvoltare Java pus la dispoziie de Sun, numit JDK (Java Development Kit). n vi
itor este probabil s apar multe alte medii de dezvoltare care vor avea propriile l
or compilatoare i interpretoare i, posibil, propriile linii de comand. La compilare
, variabila sistem CLASSPATH trebuie s fie deja setat pentru c nsui compilatorul Java
actual este scris n Java. Pentru lansarea n execuie a unei aplicaii Java, trebuie s
introducei comanda: java NumeClas unde numele clasei este numele aplicaiei care coni
ne metoda main . Interpretorul va cuta un fiier cu numele NumeClas.class i va ncerca
s instanieze clasa respectiv. Pentru lansarea unui aplet vei avea nevoie de un docum
ent HTML care conine tagul APPLET i ca parametru al acesteia name=NumeClas.class La
lansarea unui aplet, clasele care sunt apelate de clasa principal sunt mai nti cuta
te pe sistemul pe care ruleaz navigatorul. Dac nu sunt acolo, ele vor fi transfera
te n reea. Asta nseamn c transferul de cod este relativ mic, trebuie transferat doar
codul specific aplicaiei.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap8.html (3 of 4)12.01.2006 23:07:50

Capitolul VII -- Structura programelor


[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Deskt...A%20in%20romana/Carte%20J
AVA%20in%20romana/cap8.html (4 of 4)12.01.2006 23:07:50

Capitolul IX -- Fire de execuie i sincronizare


Capitolul IX Fire de execuie i sincronizare
q q q q q q q q
9.1 Crearea firelor de execuie 9.2 Strile unui fir de execuie 9.3 Prioritatea firel
or de execuie 9.4 Grupuri de fire de execuie 9.5 Enumerarea firelor de execuie 9.6
Sincronizare 9.7 Un exemplu 9.8 Un exemplu Runnable

O aplicaie Java ruleaz n interiorul unui proces al sistemului de operare. Acest pro
ces const din segmente de cod i segmente de date mapate ntr-un spaiu virtual de adre
sare. Fiecare proces deine un numr de resurse alocate de ctre sistemul de operare,
cum ar fi fiiere deschise, regiuni de memorie alocate dinamic, sau fire de execuie
. Toate aceste resurse deinute de ctre un proces sunt eliberate la terminarea proc
esului de ctre sistemul de operare. Un fir de execuie este unitatea de execuie a un
ui proces. Fiecare fir de execuie are asociate o secven de instruciuni, un set de re
giitri CPU i o stiv. Atenie, un proces nu execut nici un fel de instruciuni. El este d
e fapt un spaiu de adresare comun pentru unul sau mai multe fire de execuie. Execui
a instruciunilor cade n responsabilitatea firelor de execuie. n cele ce urmeaz vom pr
escurta uneori denumirea firelor de execuie, numindule pur i simplu fire . n cazul
aplicaiilor Java interpretate, procesul deine n principal codul interpretorului iar
codul binar Java este tratat ca o zon de date de ctre interpretor. Dar, chiar i n a
ceast situaie, o aplicaie Java poate avea mai multe fire de execuie, create de ctre i
nterpretor i care execut, seturi distincte de instruciuni binare Java. Fiecare dint
re aceste fire de execuie poate rula n paralel pe un procesor separat dac maina pe c
are ruleaz aplicaia este o main cu mai multe procesoare. Pe mainile monoprocesor, sen
zaia de execuie n paralel a firelor de execuie este creat prin rotirea acestora pe rnd
la controlul unitii centrale, cte o cuant de timp fiecare. Algoritmul de rotire al
firelor de execuie este de tip round-robin. Mediul de execuie Java execut propriul
su control asupra firelor de execuie. Algoritmul pentru planificarea firelor de ex
ecuie, prioritile i strile n care se pot afla acestea sunt specifice aplicaiilor Java
implementate identic pe toate platformele pe care a fost portat mediul de execuie
Java. Totui, acest mediu tie s profite de resursele sistemului pe care lucreaz. Dac
sistemul gazd lucreaz cu mai multe procesoare, Java va folosi toate aceste proceso
are pentru a-i planifica firele de execuie. Dac sistemul ofer multitasking preemptiv
, multitaskingul Java va fi de asemenea preemptiv, etc. n cazul mainilor multiproc
esor, mediul de execuie Java i sistemul de operare sunt responsabile cu repartizar
ea firelor de execuie pe un procesor sau altul. Pentru programator, acest mecanis
m este complet transparent, neexistnd nici o diferen ntre scrierea unei aplicaii cu m
ai multe fire pentru o main cu un singur procesor sau cu mai multe. Desigur, exist n
s diferene n cazul scrierii aplicaiilor pe mai multe fire de execuie fa de acelea cu u
singur fir de execuie, diferene care provin n principal din cauza necesitii de sincr
onizare ntre firele de execuie aparinnd aceluiai proces.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (1 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

Sincronizarea firelor de execuie nseamn c acestea se ateapt unul pe cellalt pentru com
letarea anumitor operaii care nu se pot executa n paralel sau care trebuie executa
te ntr-o anumit ordine. Java ofer i n acest caz mecanismele sale proprii de sincroniz
are, extrem de uor de utilizat i nglobate n chiar sintaxa de baz a limbajului. La lan
sarea n execuie a unei aplicaii Java este creat automat i un prim fir de execuie, num
it firul principal. Acesta poate ulterior s creeze alte fire de execuie care la rnd
ul lor pot crea alte fire, i aa mai departe. Firele de execuie dintr-o aplicaie Java
pot fi grupate n grupuri pentru a fi manipulate n comun. n afar de firele normale d
e execuie, Java ofer i fire de execuie cu prioritate mic care lucreaz n fundalul aplic
ei atunci cnd nici un alt fir de execuie nu poate fi rulat. Aceste fire de fundal
se numesc demoni i execut operaii costisitoare n timp i independente de celelalte fir
e de execuie. De exemplu, n Java colectorul de gunoaie lucreaz pe un fir de execuie
separat, cu proprieti de demon. n acelai fel poate fi gndit un fir de execuie care exe
cut operaii de ncrcare a unor imagini din reea. O aplicaie Java se termin atunci cnd
termin toate firele de execuie din interiorul ei sau cnd nu mai exist dect fire demon
. Terminarea firului principal de execuie nu duce la terminarea automat a aplicaiei
.

9.1 Crearea firelor de execuie


Exist dou ci de definire de noi fire de execuie: derivarea din clasa Thread a noi cl
ase i implementarea ntr-o clas a interfeei Runnable . n primul caz, noua clas motenet
oate metodele i variabilele clasei Thread care implementeaz n mod standard, n Java,
funcionalitatea de lucru cu fire de execuie. Singurul lucru pe care trebuie s-l fac
noua clas este s reimplementeze metoda run care este apelat automat de ctre mediul d
e execuie la lansarea unui nou fir. n plus, noua clas ar putea avea nevoie s impleme
nteze un constructor care s permit atribuirea unei denumiri firului de execuie. Dac
firul are un nume, acesta poate fi obinut cu metoda getName care returneaz un obie
ct de tip String . Iat un exemplu de definire a unui nou tip de fir de execuie: cl
ass FirNou extends Thread { public FirNou( String nume ) { // apeleaz constructor
ul din Thread super( nume ); } public void run() { while( true ) { // fr sfrit Syste
m.out.println( getName() + " Tastati ^C" ); } } } Dac vom crea un nou obiect de t
ip FirNou i l lansm n execuie acesta va afia la infinit mesajul "Tastai ^C". ntrerupe
execuiei se poate face ntr-adevr prin tastarea caracterului ^C, caz n care ntreaga a
plicaie este terminat. Atta timp ns ct noul obiect nu va fi ntrerupt din exterior, apl
caia va continua s se execute pentru c
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (2 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

mai exist nc fire de execuie active i indiferent de faptul c firul de execuie principa
s-a terminat sau nu. Iat i un exemplu de aplicaie care folosete aceast clas: public T
estFirNou { public static void main( String[] ) { new FirNou( "Primul" ).start()
; } } Metoda start , predefinit n obiectul Thread lanseaz execuia propriu-zis a firul
ui. Desigur exist i ci de a opri execuia la nesfrit a firului creat fie prin apelul me
todei stop , prezentat mai jos, fie prin rescrierea funciei run n aa fel nct execuia s
s se termine dup un interval finit de timp. A doua cale de definiie a unui fir de
execuie este implementarea interfeei Runnable ntr-o anumit clas de obiecte. Aceast cal
e este cea care trebuie aleas atunci cnd clasa pe care o crem nu se poate deriva di
n clasa Thread pentru c este important s fie derivat din alt clas. Desigur, motenirea
multipl ar rezolva aceast problem, dar Java nu are motenire multipl. Aceast nou cale s
poate folosi n modul urmtor: class Oclasa { } class FirNou extends Oclasa impleme
nts Runnable { public void run() { for( int i = 0; i < 100; i++ ) { System.out.p
rintln( "pasul " + i ); } } } public class TestFirNou { public static void main(
String argumente[] ) { new Thread( new FirNou() ).start(); // Obiectele sunt cr
eate i folosite imediat // La terminarea instruciunii, ele sunt automat // elibera
te nefiind referite de nimic } } Dup cum observai, clasa Thread are i un constructo
r care primete ca argument o instan a unei clase care implementeaz interfaa Runnable
. n acest caz, la lansarea n execuie a noului fir, cu metoda start , se apeleaz meto
da run din acest obiect i nu din instana a clasei Thread . Atunci cnd dorim s crem un
aplet care s ruleze pe un fir de execuie separat fa de pagina de navigator n care ru
leaz pentru a putea executa operaii n fereastra apletului i n acelai timp s putem folo
i n continuare navigatorul, suntem obligai s alegem cea de-a doua cale de implement
are. Aceasta pentru c apletul nostru trebuie s fie derivat din clasa standard Appl
et . Singura alternativ care ne rmne este aceea de a implementa n aplet interfaa
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (3 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare


Runnable .

9.2 Strile unui fir de execuie


Un fir de execuie se poate afla n Java n mai multe stri, n funcie de ce se ntmpl cu
un moment dat. Atunci cnd este creat, dar nainte de apelul metodei start, firul s
e gsete ntr-o stare pe care o vom numi Fir Nou Creat . n aceast stare, singurele meto
de care se pot apela pentru firul de execuie sunt metodele start i stop . Metoda s
tart lanseaz firul n execuie prin apelul metodei run . Metoda stop omoar firul de ex
ecuie nc nainte de a fi lansat. Orice alt metod apelat n aceast stare provoac termi
irului de execuie prin generarea unei excepii de tip IllegalThreadStateException .
Dac apelm metoda start pentru un Fir Nou Creat firul de execuie va trece n starea R
uleaz . n aceast stare, instruciunile din corpul metodei run se execut una dup alta. E
xecuia poate fi oprit temporar prin apelul metodei sleep care primete ca argument u
n numr de milisecunde care reprezint intervalul de timp n care firul trebuie s fie o
prit. Dup trecerea intervalului, firul de execuie va porni din nou. n timpul n care
se scurge intervalul specificat de sleep , obiectul nu poate fi repornit prin me
tode obinuite. Singura cale de a iei din aceast stare este aceea de a apela metoda
interrupt . Aceast metod arunc o excepie de tip InterruptedException care nu este pr
ins de sleep dar care trebuie prins obligatoriu de metoda care a apelat metoda sle
ep . De aceea, modul standard n care se apeleaz metoda sleep este urmtorul: try { s
leep( 1000 ); // o secund } catch( InterruptedException ) { } Dac dorim oprirea fi
rului de execuie pe timp nedefinit, putem apela metoda suspend . Aceasta trece fi
rul de execuie ntr-o nou stare, numit Nu Ruleaz . Aceeai stare este folosit i pentru
irea temporar cu sleep . n cazul apelului suspend ns, execuia nu va putea fi reluat de
ct printr-un apel al metodei resume . Dup acest apel, firul va intra din nou n star
ea Ruleaz . Pe timpul n care firul de execuie se gsete n starea Nu Ruleaz , acesta nu
ste planificat niciodat la controlul unitii centrale, aceasta fiind cedat celorlalte
fire de execuie din aplicaie. Firul de execuie poate intra n starea Nu Ruleaz i din a
lte motive. De exemplu se poate ntmpla ca firul s atepte pentru terminarea unei oper
aii de intrare/ieire de lung durat caz n care firul va intra din nou n starea Ruleaz d
ar dup terminarea operaiei. O alt cale de a ajunge n starea Nu Ruleaz este aceea de a
apela o metod sau o secven de instruciuni sincronizat dup un obiect. n acest caz, dac
biectul este deja blocat, firul de execuie va fi oprit pn n clipa n care obiectul cu
pricina apeleaz metoda notify sau notifyAll . n fine, atunci cnd metoda run i-a term
inat execuia, obiectul intr n starea Mort . Aceast stare este pstrat pn n clipa n c
ectul
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (4 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

este eliminat din memorie de mecanismul de colectare a gunoaielor. O alt posibili


tate de a intra n starea Mort este aceea de a apela metoda stop . Atunci cnd se ap
eleaz metoda stop , aceasta arunc cu o instruciune throw o eroare numit ThreadDeath
. Aceasta poate fi prins de ctre cod pentru a efectua curenia necesar. Codul necesar
este urmtorul: try { firDeExecutie.start(); } catch( ThreadDeath td ) { // curenie
throw td; // se arunc obiectul mai departe // pentru a servi la distrugerea // fi
rului de execuie } Desigur, firul de execuie poate fi terminat i pe alte ci, caz n ca
re metoda stop nu este apelat i eroarea ThreadDeath nu este aruncat. n aceste situaii
este preferabil s ne folosim de o clauz finally ca n: try { firDeExecutie.start();
} finally { ..// curenie } n fine, dac nu se mai poate face nimic pentru c firul de
execuie nu mai rspunde la comenzi, putei apela la calea disperat a metodei destroy .
Din pcate, metoda destroy termin firul de execuie fr a proceda la curirile necesare
emorie. Atunci cnd un fir de execuie este oprit cu comanda stop , mai este nevoie
de un timp pn cnd sistemul efectueaz toate operaiile necesare opririi. Din aceast cauz
este preferabil s ateptm n mod explicit terminarea firului prin apelul metodei join
: firDeExecutie.stop() try { firDeExecutie.join(); } catch( InterruptedExceptio
n e ) { } Excepia de ntrerupere trebuie prins obligatoriu. Dac nu apelm metoda join p
entru a atepta terminarea i metoda stop este de exemplu apelat pe ultima linie a fu
nciei main , exist ansa ca sistemul s cread c firul auxiliar de execuie este nc n v
aia Java s nu se mai termine rmnnd ntr-o stare de ateptare. O putei desigur termina t
d ^C.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (5 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

9.3 Prioritatea firelor de execuie


Fiecare fir de execuie are o prioritate cuprins ntre valorile MIN_PRIORITY i MAX_PRI
ORITY. Aceste dou variabile finale sunt declarate n clasa Thread . n mod normal ns, u
n fir de execuie are prioritatea NORM_PRIORITY, de asemenea definit n clasa Thread
. Mediul de execuie Java planific firele de execuie la controlul unitii centrale n fun
cie de prioritatea lor. Dac exist mai multe fire cu prioritate maxim, acestea sunt p
lanificate dup un algoritm round-robin. Firele de prioritate mai mic intr n calcul d
oar atunci cnd toate firele de prioritate mare sunt n starea Nu Ruleaz . Prioritate
a unui fir de execuie se poate interoga cu metoda getPriority care ntoarce un numr n
treg care reprezint prioritatea curent a firului de execuie. Pentru a seta priorita
tea, se folosete metoda setPriority care primete ca parametru un numr ntreg care rep
rezint prioritatea dorit. Schimbarea prioritii unui fir de execuie este o treab pericu
loas dac metoda cu prioritate mare nu se termin foarte repede sau dac nu are opriri
dese. n caz contrar, celelalte metode nu vor mai putea primi controlul unitii centr
ale. Exist ns situaii n care putem schimba aceast prioritate fr pericol, de exemplu c
vem un fir de execuie care nu face altceva dect s citeasc caractere de la utilizator
i s le memoreze ntr-o zon temporar. n acest caz, firul de execuie este n cea mai mar
arte a timpului n starea Nu Ruleaz din cauz c ateapt terminarea unei operaii de intrar
/ieire. n clipa n care utilizatorul tasteaz un caracter, firul va iei din starea de at
eptare i va fi primul planificat la execuie din cauza prioritii sale ridicate. n aces
t fel utilizatorul are senzaia c aplicaia rspunde foarte repede la comenzile sale. n
alte situaii, avem de executat o sarcin cu prioritate mic. n aceste cazuri, putem se
ta pentru firul de execuie care execut aceste sarcini o prioritate redus. Alternati
v, putem defini firul respectiv de execuie ca un demon. Dezavantajul n aceast situai
e este faptul c aplicaia va fi terminat atunci cnd exist doar demoni n lucru i exist
ibilitatea pierderii de date. Pentru a declara un fir de execuie ca demon, putem
apela metoda setDaemon. Aceast metod primete ca parametru o valoare boolean care dac
este true firul este fcut demon i dac nu este adus napoi la starea normal. Putem test
a faptul c un fir de execuie este demon sau nu cu metoda isDemon .
9.4 Grupuri de fire de execuie
Uneori avem nevoie s acionm asupra mai multor fire de execuie deodat, pentru a le sus
penda, reporni sau modifica prioritatea n bloc. Din acest motiv, este util s putem
grupa firele de execuie pe grupuri. Aceast funcionalitate este oferit n Java de ctre
o clas numit ThreadGroup . La pornirea unei aplicaii Java, se creeaz automat un prim
grup de fire de execuie, numit grupul principal, main . Firul principal de execui
e face parte din acest grup. n continuare, ori de cte ori crem un nou fir de execuie
, acesta va face parte din acelai grup de fire de execuie ca i firul de execuie din
interiorul cruia a fost creat, n afar de cazurile n care n constructorul firului spec
ificm explicit altceva.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (6 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

ntr-un grup de fire de execuie putem defini nu numai fire dar i alte grupuri de exe
cuie. Se creeaz astfel o arborescen a crei rdcin este grupul principal de fire de exe
. Pentru a specifica pentru un fir un nou grup de fire de execuie, putem apela co
nstructorii obinuii dar introducnd un prim parametru suplimentar de tip ThreadGroup
. De exemplu, putem folosi urmtorul cod: ThreadGroup tg = new ThreadGroup( "Noul
grup" ); Thread t = new Thread( tg, "Firul de executie" ); Acest nou fir de exe
cuie va face parte dintr-un alt grup de fire dect firul principal. Putem afla grup
ul de fire de execuie din care face parte un anumit fir apelnd metoda getThreadGro
up , ca n secvena: Thread t = new Thread( "Firul de Executie" ); ThreadGroup tg =
t.getThreadGroup(); Operaiile definite pentru un grup de fire de execuie sunt clas
ificabile n operaii care acioneaz la nivelul grupului, cum ar fi aflarea numelui, se
tarea unei prioriti maxime, etc., i operaii care acioneaz asupra fiecrui fir de execu
din grup, cum ar fi stop , suspend sau resume . Unele dintre aceste operaii neces
it aprobarea controloarelor de securitate acest lucru fcndu-se printr-o metod numit c
heckAccess . De exemplu, nu putei seta prioritatea unui fir de execuie dect dac avei
drepturile de acces necesare.

9.5 Enumerarea firelor de execuie


Pentru a enumera firele de execuie active la un moment dat, putem folosi metoda e
numerate definit n clasa Thread precum i n clasa ThreadGroup . Aceast metod primete ca
parametru o referin ctre un tablou de referine la obiecte de tip Thread pe care l ump
le cu referine ctre fiecare fir activ n grupul specificat. Pentru a afla cte fire ac
tive sunt n grupul respectiv la un moment dat, putem apela metoda activeCount din
clasa ThreadGroup . De exemplu: public listeazaFire { ThreadGroup grup = Thread
.currentThread().getThreadGroup(); int numarFire = grup.activeCount(); Thread fi
re[] = new Thread[numarFire]; grup.enumerate( fire ); for( int i = 0; i < numar;
i++ ) { System.out.println( fire[i].toString() ); } } Metoda enumerate ntoarce n
umrul de fire memorate n tablou, care este identic cu numrul de fire active.

9.6 Sincronizare
n unele situaii se poate ntmpla ca mai multe fire de execuie s vrea s acceseze aceeai
riabil. n astfel de situaii, se pot produce ncurcturi dac n timpul unuia dintre accese
un alt fir de execuie modific valoarea variabilei.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (7 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

Limbajul Java ofer n mod nativ suport pentru protejarea acestor variabile. Suportu
l este construit de fapt cu granulaie mai mare dect o singur variabil, protecia fcndue la nivelul obiectelor. Putem defini metode, n cadrul claselor, care sunt sincro
nizate. Pe o instan de clas, la un moment dat, poate lucra o singur metod sincronizat.
Dac un alt fir de execuie ncearc s apeleze aceeai metod pe aceeai instan sau o alt
clasei de asemenea declarat sincronizat, acest al doilea apel va trebui s atepte nain
te de execuie eliberarea instanei de ctre cealalt metod. n afar de sincronizarea metod
lor, se pot sincroniza i doar blocuri de instruciuni. Aceste sincronizri se fac tot
n legtur cu o anumit instan a unei clase. Aceste blocuri de instruciuni sincronizate
e pot executa doar cnd instana este liber. Se poate ntmpla ca cele dou tipuri de sincr
onizri s se amestece, n sensul c obiectul poate fi blocat de un bloc de instruciuni i
toate metodele sincronizate s atepte, sau invers. Declararea unui bloc de instruciu
ni sincronizate se face prin: synchronize ( Instan ) { Instruciuni } iar declararea
unei metode sincronizate se face prin folosirea modificatorului synchronize la
implementarea metodei.

9.7 Un exemplu
Exemplul urmtor implementeaz soluia urmtoarei probleme: ntr-o ar foarte ndeprtat tr
nelepi filozofi. Aceti trei nelepi i pierdeau o mare parte din energie certndu-se
pentru a afla care este cel mai nelept. Pentru a trana problema o dat pentru totdeau
na, cei trei nelepi au pornit la drum ctre un al patrulea nelept pe care cu toii l re
oteau c ar fi mai bun dect ei. Cnd au ajuns la acesta, cei trei i-au cerut s le spun c
are dintre ei este cel mai nelept. Acesta, a scos cinci plrii, trei negre i dou albe, 
li le-a artat explicndu-le c i va lega la ochi i le va pune n cap cte o plrie, cele
ase ascunzndu-le. Dup aceea, le va dezlega ochii, i fiecare dintre ei va vedea culo
area plriei celorlali dar nu io va putea vedea pe a sa. Cel care i va da primul seama
ce culoare are propria plrie, acela va fi cel mai nelept. Dup explicaie, neleptul i-a
gat la ochi, le-a pus la fiecare cte o plrie neagr i le-a ascuns pe celelalte dou. Pro
blema este aceea de a descoperi care a fost raionamentul celui care a ghicit prim
ul c plria lui este neagr. Programul urmtor rezolv problema dat n felul urmtor: Fiec
ept privete plriile celorlali doi. Dac ambele sunt albe, problema este rezolvat, a lui
nu poate fi dect neagr. Dac vede o plrie alb i una neagr, atunci el va trebui s at
n s vad ce spune cel cu plria neagr. Dac acesta nu gsete soluia, nseamn c el nu v
albe, altfel ar fi gsit imediat rspunsul. Dup un scurt timp de ateptare, neleptul poat
e s fie sigur c plria lui este neagr. n fine, dac ambele plrii pe care le vede sunt
, va trebui s atepte un timp ceva mai lung pentru a vedea dac unul dintre concurenii
si nu ghicete plria. Dac dup scurgerea timpului nici unul nu spune nimic, nseamn c
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (8 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

nici unul nu vede o plrie alb i una neagr. nseamn c propria plrie este neagr. Desi
amentul pleac de la ideea c ne putem baza pe faptul c toi nelepii gndesc i pot rezol
obleme uoare. Cel care ctig a gndit doar un pic mai repede. Putem simula viteza de gnd
iri cu un interval aleator de ateptare pn la luarea deciziilor. n realitate, interva
lul nu este aleator ci dictat de viteza de gndire a fiecrui nelept. Cei trei nelepi su
t implementai identic sub form de fire de execuie. Nu ctig la fiecare rulare acelai di
cauza caracterului aleator al implementrii. neleptul cel mare este firul de execuie
principal care controleaz activitatea celorlalte fire i le servete cu date, culoar
ea plriilor, doar n msura n care aceste date trebuie s fie accesibile. Adic nu se poat
cere propria culoare de plrie. Culoarea iniial a plriilor se poate rescrie din linia
de comand. import java.awt.Color; // clasa Filozof implementeaz comportamentul //
unui concurent class Filozof extends Thread { // prerea concurentului despre culo
area // plriei sale. Null dac nc nu i-a // format o prere. Color parere = null; Filozo
( String nume ) { super( nume ); } public void run() { // concurentii firului cu
rent Filozof concurenti[] = new Filozof[2]; // temporar Thread fire[] = new Thre
ad[10]; int numarFire = enumerate( fire ); for( int i = 0, j = 0; i < numarFire
&& j < 2; i++ ) { if( fire[i] instanceof Filozof && fire[i] != this ) { concuren
ti[j++] = (Filozof)fire[i]; } } while( true ) { Color primaCuloare = Concurs.cul
oare( this, concurenti[0] ); Color adouaCuloare = Concurs.culoare( this, concure
nti[1] ); if( primaCuloare == Color.white && adouaCuloare == Color.white ) { syn
chronized( this ) { parere = Color.black; } } else if( primaCuloare == Color.whi
te ){ try{ sleep( 500 );
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (9 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare


} catch( InterruptedException e ){ }; if( Concurs.culoare( this, concurenti[1])
!= concurenti[1].aGhicit()) { synchronized( this ) { parere = Color.black; }; }
} else if( adouaCuloare == Color.white ) { try{ sleep( (int)( Math.random()*500)
); } catch( InterruptedException e ) { }; if( Concurs.culoare(this, concurenti[0
] ) != concurenti[0].aGhicit()) { synchronized( this ) { parere = Color.black; }
; } } else { try { sleep( (int)( Math.random()*500)+500 ); } catch( InterruptedE
xception e ) { }; if( Concurs.culoare(this, concurenti[0]) != concurenti[0].aGhi
cit() && Concurs.culoare( this, concurenti[1] ) != concurenti[1].aGhicit() ) { s
ynchronized( this ) { parere = Color.black; }; } } } } public synchronized Color
aGhicit() { return parere; } } public class Concurs { private static Color pala
rii[] = { Color.black, Color.black, Color.black }; private static Filozof filozo
fi[] = new Filozof[3]; public static void main( String args[] ) { for( int i = 0
; i < args.length && i < 3; i++ ) { if( args[i].equalsIgnoreCase( "alb" ) ) { pa
larii[i] = Color.white; } else if(args[i].equalsIgnoreCase("negru")) { palarii[i
] = Color.black; } }
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (10 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare


for( int i = 0; i < 3; i++ ) { filozofi[i] = new Filozof( "Filozoful " + ( i + 1
) ); } for( int i = 0; i < 3; i++ ) { filozofi[i].start(); } System.out.println
( "Concurenti:" ); for( int i = 0; i < 3; i++ ) { System.out.println( "\t" + fil
ozofi[i].getName() + " " + (( palarii[i] == Color.white ) ? "alb":"negru" ) ); }
gata: while( true ) { for( int i = 0; i < 3; i++ ) { if( filozofi[i].aGhicit()=
=palarii[i] ) { System.out.println( filozofi[i].getName() + " a ghicit." ); brea
k gata; } } } for( int i = 0; i < 3; i++ ) { filozofi[i].stop(); try { filozofi[
i].join(); } catch( InterruptedException e ) {}; } } public static Color culoare
( Filozof filozof, Filozof concurent ) { if( filozof != concurent ) { for( int i
= 0; i < 3; i++ ) { if( filozofi[i] == concurent ) { return palarii[i]; } } } r
eturn null; } } ^

9.8 Un exemplu Runnable


Exemplul urmtor implementeaz problema celor 8 dame, i anume: gsete toate posibilitile
e a aeza pe o tabl de ah 8 regine n aa fel nct acestea s nu se bat ntre ele. Regine
at pe linie, coloan sau n diagonal.
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (11 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare

Soluia de fa extinde problema la o tabl de NxN csue i la N regine. Parametrul N este c


tit din tagul HTML asociat apletului. import java.awt.*; import java.applet.Appl
et; public class QueensRunner extends Applet implements Runnable { int n; int re
gine[]; int linie; Image queenImage; Thread myThread; public void start() { if(
myThread == null ) { myThread = new Thread( this, "Queens" ); myThread.start();
} } public void stop() { myThread.stop(); myThread = null; } public void run() {
while( myThread != null ) { nextSolution(); repaint(); try { myThread.sleep( 10
00 ); } catch ( InterruptedException e ){ } } } boolean isGood() { for( int i =
0; i < linie; i++ ) { if( regine[linie] == regine[i] || Math.abs( regine[i] regi
ne[linie] ) == Math.abs( i - linie ) ) { return false; } } return true; }
void nextSolution() { while( true ) { if( linie < 0 ) { linie = 0; }
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (12 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare


regine[linie]++; if( regine[linie] > n ) { regine[linie] = 0; linie--; } else {
if( isGood() ) { linie++; if( linie >= n ) { break; } } } } }
public void init() { String param = getParameter( "Dimension" ); if( param == nu
ll ) { n = 4; } else { try { n = Integer.parseInt( param ); } catch( NumberForma
tException e ) { n = 4; } if( n < 4 ) { n = 4; } } regine = new int[n + 1]; for(
int i = 0; i < n; i++ ) { regine[i] = 0; } linie = 0; queenImage = getImage(get
CodeBase(), "queen.gif" } public void paint( Graphics g ) { Dimension d = size()
; g.setColor( Color.red ); int xoff = d.width / n; int yoff = d.height / n; for(
int i = 1; i < n; i++ ) { g.drawLine( xoff * i, 0, xoff * i, d.height ); g.draw
Line( 0, yoff * i, d.width, yoff * i ); } for( int i = 0; i < n; i++ ) { for( in
t j = 0; j < n; j++ ) { if( regine[i] - 1 == j ) { g.drawImage(queenImage,
);
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (13 of 14)12.01.2006 23:07:51

Capitolul IX -- Fire de execuie i sincronizare


i*xoff + 1, j*yoff + 1, this); } } } } public String getAppletInfo() { return "Q
ueens by E. Rotariu"; } } ^
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...%20in%20romana/Carte%20JAV
A%20in%20romana/cap9.html (14 of 14)12.01.2006 23:07:51

Limbajul JAVA -- IntegraSoft


Bibliografie
1. Dumitru Rdoiu, HTML - Publicaii Web, Computer Press Agora SRL 2. James Gostling
, Henry McGilton, The Java Language Environment, A white paper, Sun Microsystems
, Inc. 3. David Flanagan, Java in a Nutshell: A Desktop Quick Reference for Java
Programmers, OReilly & Associates, Inc. 4. Ed Anuff, The Java Sourcebook , Wil
ey Computer Publishing 5. Mike Daconta, Java for C/C++ Programmers, Wiley Comput
er Publishing 6. Arthur van Hoff, Sami Shaio, Orca Starbuck, Hooked on Java, Add
ison-Wesley Publishing Company 7. Laura Lemay, Charles L. Perkins, Teach your se
lf Java in 21 days, Sams.net Publishing 8. *** - The Java Language Specification
, Sun Microsystems, Inc.
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desktop/bu...0in%20romana/Carte%2
0JAVA%20in%20romana/bibliografie.html12.01.2006 23:07:51

Capitolul V -- 1. Variabile

Capitolul V 5.1 Variabile


5.1.1 Declaraii de variabile 5.1.1.1 Tipul unei variabile 5.1.1.2 Numele variabil
elor 5.1.1.3 Iniializarea variabilelor 5.1.2 Tipuri primitive 5.1.2.1 Tipul boole
an 5.1.2.2 Tipul caracter 5.1.2.3 Tipuri ntregi 5.1.2.3.1 Tipul octet 5.1.2.3.2 T
ipul ntreg scurt 5.1.2.3.3 Tipul ntreg 5.1.2.3.4 Tipul ntreg lung 5.1.2.4 Tipuri fl
otante 5.1.2.4.1 Tipul flotant 5.1.2.4.2 Tipul flotant dublu 5.1.2.4.3 Reali spe
ciali definii de IEEE 5.1.3 Tipuri referin 5.1.3.1 Tipul referin ctre o clas 5.1.3.2 T
pul referin ctre o interfa 5.1.3.3 Tipul referin ctre un tablou 5.1.4 Clasa de memora
5.1.4.1 Variabile locale 5.1.4.2 Variabile statice 5.1.4.3 Variabile dinamice
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (1 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
5.1.5 Tablouri de variabile 5.1.5.1 Declaraia variabilelor de tip tablou 5.1.5.2
Iniializarea tablourilor. 5.1.5.3 Lungimea tablourilor 5.1.5.4 Referirea elemente
lor din tablou 5.1.5.5 Alocarea i eliberarea tablourilor 5.1.6 Conversii 5.1.6.1
Conversii de extindere a valorii 5.1.6.2 Conversii de trunchiere a valorii 5.1.6
.3 Conversii pe tipuri referin 5.1.6.4 Conversii la operaia de atribuire 5.1.6.5 Co
nversii explicite 5.1.6.6 Conversii de promovare aritmetic

5.1.1 Declaraii de variabile


O variabil n limbajul Java este o locaie de memorie care poate pstra o valoare de un
anumit tip. n ciuda denumirii, exist variabile care i pot modifica valoarea i variab
ile care nu i-o pot modifica, numite n Java variabile finale. Orice variabil trebui
e s fie declarat pentru a putea fi folosit. Aceast declaraie trebuie s conin un tip d
alori care pot fi memorate n locaia rezervat variabilei i un nume pentru variabila d
eclarat. n funcie de locul n sursa programului n care a fost declarat variabila, aceas
ta primete o clas de memorare local sau static. Aceast clas de memorare definete inter
alul de existen al variabilei n timpul execuiei. n forma cea mai simpl, declaraia unei
variabile arat n felul urmtor: Tip NumeVariabil [, NumeVariabil]*; 5.1.1.1 Tipul unei
variabile Tipul unei variabile poate fi fie unul dintre tipurile primitive defi
nite de limbajul Java fie o referin. Creatorii limbajului Java au avut grij s define
asc foarte exact care sunt caracteristicile fiecrui tip primitiv n parte i care este
setul de valori care se poate memora n variabilele care au tipuri primitive. n pl
us, a fost exact definit i modalitatea de reprezentare a acestor tipuri primitive n
memorie. n acest fel, variabilele Java devin independente de
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (2 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

platforma hardware i software pe care lucreaz. n acelai spirit, Java definete o valoa
re implicit pentru fiecare tip de dat, n cazul n care aceasta nu a primit nici o val
oare de la utilizator. n acest fel, tim ntotdeauna care este valoarea cu care o var
iabil intr n calcul. Este o practic bun ns aceea ca programele s nu depind niciodat
ste iniializri implicite. 5.1.1.2 Numele variabilelor Numele variabilei poate fi o
rice identificator Java. Convenia nescris de formare a numelor variabilelor este a
ceea c orice variabil care nu este final are un nume care ncepe cu liter minuscul n ti
p ce variabilele finale au nume care conin numai majuscule. Dac numele unei variab
ile care nu este final conine mai multe cuvinte, cuvintele ncepnd cu cel de-al doile
a se scriu cu litere minuscule dar cu prima liter majuscul. Exemple de nume de var
iabile care nu sunt finale ar putea fi: culoarea numrulDePai urmtorulElement Variab
ilele finale ar putea avea nume precum: PORTOCALIUVERDEALBASTRUDESCHIS 5.1.1.3 I
niializarea variabilelor Limbajul Java permite iniializarea valorilor variabilelor
chiar n momentul declarrii acestora. Sintaxa este urmtoarea: Tip NumeVariabil = Val
oareIniial; Desigur, valoarea iniial trebuie s fie de acelai tip cu tipul variabilei s
au s poat fi convertit ntr-o valoare de acest tip. Dei limbajul Java ne asigur c toate
variabilele au o valoare iniial bine precizat, este preferabil s executm aceast iniial
zare n mod explicit pentru fiecare declaraie. n acest fel mrim claritatea propriului
cod. Regula ar fi deci urmtoarea: nici o declaraie fr iniializare.
5.1.2 Tipuri primitive
5.1.2.1 Tipul boolean
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (3 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
Tipul boolean este folosit pentru memorarea unei valori de adevr. Pentru acest sc
op, sunt suficiente doar dou valori: adevrat i fals. n Java aceste dou valori le vom
nota prin literalii true i respectiv false. Aceste valori pot fi reprezentate n me
morie folosindu-ne de o singur cifr binar, adic pe un bit. Valorile booleene sunt fo
arte importante n limbajul Java pentru c ele sunt valorile care se folosesc n condii
ile care controleaz instruciunile repetitive sau cele condiionale. Pentru a exprima
o condiie este suficient s scriem o expresie al crui rezultat este o valoare boole
an, adevrat sau fals. Valorile de tip boolean nu se pot transforma n valori de alt
tip n mod nativ. La fel, nu exist transformare nativ dinspre celelalte valori nspre
tipul boolean. Cu alte cuvinte, avnd o variabil de tip boolean nu putem memora n in
teriorul acesteia o valoare ntreag pentru c limbajul Java nu face pentru noi nici u
n fel de presupunere legat de ce nseamn o anumit valoare ntreag din punctul de vedere
al valorii de adevr. La fel, dac avem o variabil ntreag, nu i putem atribui o valoare
de tip boolean. Orice variabil boolean nou creat primete automat valoarea implicit fa
lse. Putem modifica aceast comportare specificnd n mod explicit o valoare iniial true
dup modelul pe care l vom descrie mai trziu. Pentru a declara o variabil de tip boo
lean, n Java vom folosi cuvntul rezervat boolean ca n exemplele de mai jos: boolean
terminat; boolean areDreptate; Rndurile de mai sus reprezint declaraia a dou variab
ile de tip boolean numite terminatrespectiv areDreptate. Cele dou variabile au, d
up declaraie, valoarea false. Adic nu e terminat dar nici n-are dreptate. 5.1.2.2 T
ipul caracter Orice limbaj de programare ne ofer ntr-un fel sau altul posibilitate
a de a lucra cu caractere grafice care s reprezinte litere, cifre, semne de punct
uaie, etc. n cazul limbajului Java acest lucru se poate face folosind tipul primit
iv numit tip caracter. O variabil de tip caracter poate avea ca valoare coduri Un
icode reprezentate pe 16 bii, adic doi octei. Codurile reprezentabile astfel sunt f
oarte multe, putnd acoperi caracterele de baz din toate limbile scrise existente. n
Java putem combina mai multe caractere pentru a forma cuvinte sau iruri de carac
tere mai lungi.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (4 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Totui, trebuie s precizm c aceste iruri de caractere nu trebuiesc confundate cu tablo


urile de caractere pentru c ele conin n plus informaii legate de lungimea irului. Cod
ul nu este altceva dect o coresponden ntre numere i caractere fapt care permite conve
rsii ntre variabile ntregi i caractere n ambele sensuri. O parte din aceste transfor
mri pot s altereze valoarea original din cauza dimensiunilor diferite ale zonelor n
care sunt memorate cele dou tipuri de valori. Convertirea caracterelor n numere i i
nvers poate s fie util la prelucrarea n bloc a caracterelor, cum ar fi trecerea tut
uror literelor minuscule n majuscule i invers. Atunci cnd declarm un caracter fr s spe
ificm o valoare iniial, el va primi automat ca valoare implicit caracterul nullal co
dului Unicode, \u0000?. Pentru a declara o variabil de tip caracter folosim cuvntu
l rezervat char ca n exemplele urmtoare: char primaLiter; char prima, ultima; n cele
dou linii de cod am declarat trei variabile de tip caracter care au fost automat
iniializate cu caracterul null. n continuare, vom folosi interschimbabil denumire
a de tip caracter cu denumirea de tip char, care are avantajul c este mai aproape
de declaraiile Java. 5.1.2.3 Tipuri ntregi
5.1.2.3.1 Tipul octet

ntre tipurile ntregi, acest tip ocup un singur octet de memorie, adic opt cifre bina
re. ntr-o variabil de tip octet sunt reprezentate ntotdeauna valori cu semn, ca de
altfel n toate variabilele de tip ntreg definite n limbajul Java. Aceast convenie sim
plific schema de tipuri primitive care, n cazul altor limbaje include separat tipu
ri ntregi cu semn i fr. Fiind vorba de numere cu semn, este nevoie de o convenie de r
eprezentare a semnului. Convenia folosit de Java este reprezentarea n complement fa d
e doi. Aceast reprezentare este de altfel folosit de majoritatea limbajelor actual
e i permite memorarea, pe 8 bii a 256 de numere ncepnd de la -128 pn la 127. Dac avei
voie de numere mai mari n valoare absolut, apelai la alte tipuri ntregi. Valoarea im
plicit pentru o variabil neiniializat de tip octet este valoarea 0 reprezentat pe un
octet. Iat i cteva exemple de declaraii care folosesc cuvntul Java rezervat byte: byt
e octet; byte eleviPeClasa;
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (5 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
n continuare vom folosi interschimbabil denumirea de tip octet cu cea de tip byte
.
5.1.2.3.2 Tipul ntreg scurt
Tipul ntreg scurt este similar cu tipul octet dar valorile sunt reprezentate pe d
oi octei, adic 16 bii. La fel ca i la tipul octet, valorile sunt ntotdeauna cu semn i
se folosete reprezentarea n complement fa de doi. Valorile de ntregi scuri reprezentab
ile sunt de la -32768 la 32767 iar valoarea implicit este 0 reprezentat pe doi oc
tei. Pentru declararea variabilelor de tip ntreg scurt n Java se folosete cuvntul rez
ervat short, ca n exemplele urmtoare: short i, j; short valoareNuPreaMare; n contin
uare vom folosi interschimbabil denumirea de tip ntreg scurt i cea de tip short.
5.1.2.3.3 Tipul ntreg
Singura diferen dintre tipul ntreg i tipurile precedente este faptul c valorile sunt
reprezentate pe patru octei adic 32 bii. Valorile reprezentabile sunt de la -214748
3648 la 2147483647 valoarea implicit fiind 0. Cuvntul rezervat este int ca n: int s
alariu; n continuare vom folosi interschimbabil denumirea de tip ntreg i cea de tip
int.
5.1.2.3.4 Tipul ntreg lung
n fine, pentru cei care vor s reprezinte numerele ntregi cu semn pe 8 octei, 64 de b
ii, exist tipul ntreg lung. Valorile reprezentabile sunt de la -9223372036854775808
la 9223372036854775807 iar valoarea implicit este 0L. Pentru cei care nu au calc
ulatoare care lucreaz pe 64 de bii este bine de precizat faptul c folosirea acestui
tip duce la operaii lente pentru c nu exist operaii native ale procesorului care s l
ucreze cu numere aa de mari. Declaraia se face cu cuvntul rezervat long. n continuar
e vom folosi interschimbabil denumirea de tip ntreg lung cu cea de tip long.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (6 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
5.1.2.4 Tipuri flotante Acest tip este folosit pentru reprezentarea numerelor re
ale sub form de exponent i cifre semnificative. Reprezentarea se face pe patru oct
ei, 32 bii, aa cum specific standardul IEEE 754.
5.1.2.4.1 Tipul flotant

Valorile finite reprezentabile ntr-o variabil de tip flotant sunt de forma: sm2e u
nde s este semnul +1 sau -1, m este partea care specific cifrele reprezentative a
le numrului, numit i mantis, un ntreg pozitiv mai mic dect 224 iar e este un exponent
treg ntre -149 i 104. Valoarea implicit pentru variabilele flotante este 0.0f. Pent
ru declararea unui numr flotant, Java definete cuvntul rezervat float. Declaraiile s
e fac ca n exemplele urmtoare: float procent; float noi, ei; n continuare vom folos
i interschimbabil denumirea de tip flotant i cea de tip float.
5.1.2.4.2 Tipul flotant dublu
Dac valorile reprezentabile n variabile flotante nu sunt destul de precise sau des
tul de mari, putei folosi tipul flotant dublu care folosete opt octei pentru reprez
entare, urmnd acelai standard IEEE 754 Valorile finite reprezentabile cu flotani du
bli sunt de forma: sm2e unde s este semnul +1 sau -1, m este mantisa, un ntreg po
zitiv mai mic dect 253 iar e este un exponent ntreg ntre -1045 i 1000. Valoarea impl
icit n acest caz este 0.0d. Pentru a declara flotani dubli, Java definete cuvntul rez
ervat double ca n: double distanaPnLaLun; n continuare vom folosi interschimbabil denu
mirea de tip flotant dublu i cea de tip double. n afar de valorile definite pn acum,
standardul IEEE definete cteva valori speciale reprezentabile
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (7 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
pe un flotant sau un flotant dublu.
5.1.2.4.3 Reali speciali definii de IEEE
Prima dintre acestea este NaN (Not a Number), valoare care se obine atunci cnd efe
ctum o operaie a crei rezultat nu este definit, de exemplu 0.0 / 0.0. n plus, standa
rdul IEEE definete dou valori pe care le putem folosi pe post de infinit pozitiv i
negativ. i aceste valori pot rezulta n urma unor calcule. Aceste valori sunt defin
ite sub form de constante i n ierarhia standard Java, mai precis n clasa java. lang.
Float i respectiv n java.lang.Double. Numele constantelor este POSITIVE_INFINITY,
NEGATIVE_INFINITY, NaN. n plus, pentru tipurile ntregi i ntregi lungi i pentru tipuri
le flotante exist definite clase n ierarhia standard Java care se numesc respectiv
java.lang.Integer, java.lang.Long, java.lang.Float i java.lang. Double. n fiecare
dintre aceste clase numerice sunt definite dou constante care reprezint valorile
minime i maxime care se pot reprezenta n tipurile respective. Aceste dou constante
se numesc n mod uniform MIN_VALUE i MAX_VALUE.

5.1.3 Tipuri referin


Tipurile referin sunt folosite pentru a referi un obiect din interiorul unui alt o
biect. n acest mod putem nlnui informaiile aflate n memorie. Tipurile referin au, la
ca i toate celelalte tipuri o valoare implicit care este atribuit automat oricrei v
ariabile de tip referin care nu a fost iniializat. Aceast valoare implicit este defini
t de ctre limbajul Java prin cuvntul rezervat null. Putei nelege semnificaia referine
ule ca o referin care nu trimite nicieri, a crei destinaie nu a fost nc fixat. Simpla
claraie a unei referine nu duce automat la rezervarea spaiului de memorie pentru ob
iectul referit. Singura rezervare care se face este aceea a spaiului necesar memo
rrii referinei n sine. Rezervarea obiectului trebuie fcut explicit n program printr-o
expresie de alocare care folosete cuvntul rezervat new. O variabil de tip referin nu
trebuie s trimit pe tot timpul existenei sale ctre acelai obiect n memorie. Cu alte cu
vinte, variabila i poate schimba locaia referit n timpul execuiei. 5.1.3.1 Tipul refer
in ctre o clas
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (8 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Tipul referin ctre o clas este un tip referin care trimite ctre o instan a unei clas
obiecte. Clasa instanei referite poate fi oricare clas valid definit de limbaj sau
de utilizator. Clasa de obiecte care pot fi referite de o anumit variabil de tip r
eferin la clas trebuie declarat explicit. De exemplu, pentru a declara o referin ctre
instan a clasei Minge, trebuie s folosim urmtoarea sintax: Minge mingeaMea; Din aces
t moment, variabila referin de clas numit mingeaMea va putea pstra doar referine ctre
biecte de tip Minge sau ctre obiecte aparinnd unor clase derivate din clasa Minge.
De exemplu, dac avem o alt clas, derivat din Minge, numit MingeDeBaschet, putem memor
a n referina mingeaMea i o trimitere ctre o instan a clasei MingeDeBaschet. n mod gene
al ns, nu se pot pstra n variabila mingeaMea referine ctre alte clase de obiecte. Dac
e ncerc acest lucru, eroarea va fi semnalat chiar n momentul compilrii, atunci cnd sur
sa programului este examinat pentru a fi transformat n instruciuni ale mainii virtual
e Java. S mai observm c o referin ctre clasa de obiecte Object, rdcina ierarhiei de c
e Java, poate pstra i o referin ctre un tablou. Mai multe lmuriri asupra acestei afirm
aii mai trziu. 5.1.3.2 Tipul referin ctre o interfa Tipul referin ctre o interfa
area unor referine ctre obiecte care respect o anumit interfa. Clasa obiectelor referi
te poate fi oricare, atta timp ct clasa respectiv implementeaz interfaa cerut. Declara
a se face cu urmtoarea sintax: ObiectSpaioTemporal mingeaLuiVasile; n care tipul est
e chiar numele interfeei cerute. Dac clasa de obiecte Minge declar c implementeaz ace
ast interfa, atunci variabila referin mingeaLuiVasile poate lua ca valoare referina ct
e o instan a clasei Minge sau a clasei MingeDeBaschet. Prin intermediul unei varia
bile referin ctre o interfa nu se poate apela dect la funcionalitatea cerut n interf
pectiv, chiar dac obiectele reale ofer i alte faciliti, ele aparinnd unor clase mai b
te n metode. 5.1.3.3 Tipul referin ctre un tablou
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap51.html (9 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Tipul referin ctre un tablou este un tip referin care poate pstra o trimitere ctre loc
a din memorie a unui tablou de elemente. Prin intermediul acestei referine putem
accesa elementele tabloului furniznd indexul elementului dorit. Tablourile de ele
mente nu exist n general ci ele sunt tablouri formate din elemente de un tip bine
precizat. Din aceast cauz, atunci cnd declarm o referin ctre un tablou, trebuie s pre
i de ce tip sunt elementele din tabloul respectiv. La declaraia referinei ctre tabl
ou nu trebuie s precizm i numrul de elemente din tablou. Iat cum se declar o referin
un tablou de ntregi lungi: long numere[]; Numele variabilei este numere. Un alt
exemplu de declaraie de referin ctre un tablou: Minge echipament[]; Declaraia de mai
sus construiete o referin ctre un tablou care pstreaz elemente de tip referin ctre o
an a clasei Minge. Numele variabilei referin este echipament. Parantezele drepte de
dup numele variabilei specific faptul c este vorba despre un tablou. Mai multe desp
re tablouri ntr-un paragraf urmtor.

5.1.4 Clasa de memorare


Fiecare variabil trebuie s aib o anumit clas de memorare. Aceast clas ne permite s af
are este intervalul de existen i vizibilitatea unei variabile n contextul execuiei un
ui program. Este important s nelegem exact aceast noiune pentru c altfel vom ncerca s
ferim variabile nainte ca acestea s fi fost create sau dup ce au fost distruse sau
s referim variabile care nu sunt vizibile din zona de program n care le apelm. Solui
a simpl de existen a tuturor variabilelor pe tot timpul execuiei este desigur afar di
n discuie att din punct de vedere al eficienei ct i a eleganei i stabilitii codului.
4.1 Variabile locale Aceste variabile nu au importan prea mare n contextul ntregii a
plicaii, ele servind la rezolvarea unor probleme locale. Variabilele locale sunt
declarate, rezervate n memorie i utilizate doar n interiorul unor blocuri de instru
ciuni, fiind distruse automat la ieirea din aceste blocuri. Aceste variabile sunt
vizibile doar n interiorul blocului n care au fost create i n subblocurile acestuia.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (10 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

5.1.4.2 Variabile statice Variabilele statice sunt n general legate de funcionalit


atea anumitor clase de obiecte ale cror instane folosesc n comun aceste variabile.
Variabilele statice sunt create atunci cnd codul specific clasei n care au fost de
clarate este ncrcat n memorie i nu sunt distruse dect atunci cnd acest cod este elimin
at din memorie. Valorile memorate n variabile statice au importan mult mai mare n ap
licaie dect cele locale, ele pstrnd informaii care nu trebuie s se piard la dispariia
ei instane a clasei. De exemplu, variabila n care este memorat numrul de picioare a
l obiectelor din clasa Om nu trebuie s fie distrus la dispariia unei instane din ace
ast clas. Aceasta din cauz c i celelalte instane ale clasei folosesc aceeai valoare.
hiar dac la un moment dat nu mai exist nici o instan a acestei clase, numrul de picio
are ale unui Om trebuie s fie accesibil n continuare pentru interogare de ctre cele
lalte clase. Variabilele statice nu se pot declara dect ca variabile ale unor cla
se i conin n declaraie cuvntul rezervat static. Din cauza faptului c ele aparin clasei
nu unei anumite instane a clasei, variabilele statice se mai numesc uneori i vari
abile de clas. 5.1.4.3 Variabile dinamice Un alt tip de variabile sunt variabilel
e a cror perioad de existen este stabilit de ctre programator. Aceste variabile pot fi
alocate la cerere, dinamic, n orice moment al execuiei programului. Ele vor fi di
struse doar atunci cnd nu mai sunt referite de nicieri. La alocarea unei variabile
dinamice, este obligatoriu s pstrm o referin ctre ea ntr-o variabil de tip referin
l, nu vom putea accesa n viitor variabila dinamic. n momentul n care nici o referin nu
mai trimite ctre variabila dinamic, de exemplu pentru c referina a fost o variabil l
ocal i blocul n care a fost declarat i-a terminat execuia, variabila dinamic este dist
us automat de ctre sistem printr-un mecanism numit colector de gunoaie. Colectorul
de gunoaie poate porni din iniiativa sistemului sau din iniiativa programatorului
la momente bine precizate ale execuiei. Pentru a rezerva spaiu pentru o variabil d
inamic este nevoie s apelm la o expresie de alocare care folosete cuvntul rezervat ne
w. Aceast expresie aloc spaiul necesar pentru un anumit tip de valoare. De exemplu,
pentru a rezerva spaiul necesar unui obiect de tip Minge, putem apela la sintaxa
: Minge mingeaMea = new Minge(); iar pentru a rezerva spaiul necesar unui tablou
de referine ctre obiecte de tip Minge putem folosi declaraia:
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (11 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Minge echipament[] = new Minge[5]; Am alocat astfel spaiu pentru un tablou care c
onine 5 referine ctre obiecte de tip Minge. Pentru alocarea tablourilor coninnd tipur
i primitive se folosete aceeai sintax. De exemplu, urmtoarea linie de program aloc sp
aiul necesar unui tablou cu 10 ntregi, crend n acelai timp i o variabil referin spre
t tablou, numit numere: int numere[] = new int[10];

5.1.5 Tablouri de variabile


Tablourile servesc, dup cum spuneam, la memorarea secvenelor de elemente de acelai
tip. Tablourile unidimensionale au semnificaia vectorilor de elemente. Se poate ntm
pla s lucrm i cu tablouri de referine ctre tablouri, n acest caz modelul fiind acela a
l unei matrici bidimensionale. n fine, putem extinde definiia i pentru mai mult de
dou dimensiuni. 5.1.5.1 Declaraia variabilelor de tip tablou Pentru a declara vari
abile de tip tablou, trebuie s specificm tipul elementelor care vor umple tabloul i
un nume pentru variabila referin care va pstra trimiterea ctre zona de memorie n car
e sunt memorate elementele tabloului. Dei putem declara variabile referin ctre tablo
u i separat, de obicei declaraia este fcut n acelai timp cu alocarea spaiului ca n ex
lele din paragraful anterior. Sintaxa Java permite plasarea parantezelor drepte
care specific tipul tablou nainte sau dup numele variabilei. Astfel, urmtoarele dou d
eclaraii sunt echivalente: int[] numere; int numere[]; Dac dorii s folosii tablouri c
u dou dimensiuni ca matricile, putei s declarai un tablou de referine ctre tablouri cu
una dintre urmtoarele trei sintaxe echivalente: float[][] matrice; float[] matri
ce[]; float matrice[][]; De precizat c i n cazul dimensiunilor multiple, declaraiile
de mai sus nu fac nimic altceva dect s rezerve loc pentru o referin i s precizeze num
ul de dimensiuni. Alocarea spaiului pentru elementele tabloului trebuie fcut explic
it.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (12 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
Despre rezervarea spaiului pentru tablourile cu o singur dimensiune am vorbit deja
. Pentru tablourile cu mai multe dimensiuni, rezervarea spaiului se poate face cu
urmtoarea sintax: byte [][]octeti = new byte[23][5]; n expresia de alocare sunt sp
ecificate n clar numrul elementelor pentru fiecare dimensiune a tabloului.

5.1.5.2 Iniializarea tablourilor. Limbajul Java permite i o sintax pentru iniializar


ea elementelor unui tablou. ntr-un astfel de caz este rezervat automat i spaiul de
memorie necesar memorrii valorilor iniiale. Sintaxa folosit n astfel de cazuri este
urmtoarea: char []caractere = { a, b, c, d }; Acest prim exemplu aloc spaiu pentru
patru elemente de tip caracter i iniializeaz aceste elemente cu valorile dintre aco
lade. Dup aceea, creeaz variabila de tip referin numit caractere i o iniializeaz cu r
rina la zona de memorie care pstreaz cele patru valori. Iniializarea funcioneaz i la t
blouri cu mai multe dimensiuni ca n exemplele urmtoare: int [][]numere = { { 1, 3,
4, 5 }, { 2, 4, 5 }, { 1, 2, 3, 4, 5 } }; double [][][]reali = { { { 0.0, -1.0
}, { 4.5 } }, { { 2.5, 3.0 } } }; Dup cum observai numrul iniializatorilor nu trebui
e s fie acelai pentru fiecare element. 5.1.5.3 Lungimea tablourilor Tablourile Jav
a sunt alocate dinamic, ceea ce nseamn c ele i pot schimba dimensiunile pe parcursul
execuiei. Pentru a afla numrul de elemente dintr-un tablou, putem apela la urmtoare
a sintax: float []tablou = new float[25]; int dimensiune = tablou.length; // dime
nsiune primete valoarea 25
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (13 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

sau float [][]multiTablou = new float[3][4]; int dimensiune1 = multiTablou[2].le


ngth; // dimensiune1 primete valoarea 4 int dimensiune2 = multiTablou.length; //
dimensiune2 primete valoarea 3 ^ 5.1.5.4 Referirea elementelor din tablou Element
ele unui tablou se pot referi prin numele referinei tabloului i indexul elementulu
i pe care dorim s-l referim. n Java, primul element din tablou este elementul cu n
umrul 0, al doilea este elementul numrul 1 i aa mai departe. Sintaxa de referire fol
osete parantezele ptrate [ i ]. ntre ele trebuie specificat indexul elementului pe c
are dorim s-l referim. Indexul nu trebuie s fie constant, el putnd fi o expresie de
complexitate oarecare. Iat cteva exemple: int []tablou = new int[10]; tablou[3] =
1; // al patrulea element primete valoarea 1 float [][]reali = new float[3][4];
reali[2][3] = 1.0f; // al patrulea element din al treilea tablou // primete valoa
rea 1 n cazul tablourilor cu mai multe dimensiuni, avem n realitate tablouri de re
ferine la tablouri. Asta nseamn c dac considerm urmtoarea declaraie: char [][]caracte
= new char [5][];
Figura 5.1 Elementele tabloului sunt de tip referin, iniializate implicit la valoar
ea null.
Variabila referin numit caractere conine deocamdat un tablou de 5 referine la tablouri
de caractere. Cele cinci referine sunt iniializate cu null. Putem iniializa aceste
tablouri prin atribuiri de
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (14 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
expresii de alocare: caractere[0] = new char [3]; caractere[4] = new char [5];
Figura 5.2 Noile tablouri sunt referite din interiorul tabloului original. Eleme
ntele noilor tablouri sunt caractere.
La fel, putem scrie: char []tablouDeCaractere = caractere[0];
Figura 5.3 Variabilele de tip referin caractere[0] i tablouDeCaractere trimit spre
acelai tablou rezervat n memorie.
Variabila tablouDeCaractere trimite ctre acelai tablou de caractere ca i cel referi
t de primul element al tabloului referit de variabila caractere. S mai precizm c re
ferirea unui element de tablou printr-un index mai mare sau egal cu lungimea tab
loului duce la oprirea execuiei programului cu un mesaj de eroare de execuie cores
punztor. 5.1.5.5 Alocarea i eliberarea tablourilor
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (15 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Despre alocarea tablourilor am spus deja destul de multe. n cazul n care nu avem i
niializatori, variabilele sunt iniializate cu valorile implicite definite de limba
j pentru tipul corespunztor. Aceasta nseamn c, pentru tablourile cu mai multe dimens
iuni, referinele sunt iniializate cu null. Pentru eliberarea memoriei ocupate de u
n tablou, este suficient s tiem toate referinele ctre tablou. Sistemul va sesiza aut
omat c tabloul nu mai este referit i mecanismul colector de gunoaie va elibera zon
a. Pentru a tia o referin ctre un tablou dm o alt valoare variabilei care refer tablou
. Valoarea poate fi null sau o referin ctre un alt tablou. De exemplu: float []real
i = new float[10]; ? reali = null; // eliberarea tabloului sau reali = new float
[15]; // eliberarea n alt fel sau { float []reali = new float[10]; ? }// eliberar
e automat, variabila reali a fost // distrus la ieirea din blocul n care a // fost d
eclarat, iar tabloul de 10 flotani // nu mai este referit ^

5.1.6 Conversii
Operaiile definite n limbajul Java au un tip bine precizat de argumente. Din pcate,
exist situaii n care nu putem transmite la apelul acestora exact tipul pe care com
pilatorul Java l ateapt. n asemenea situaii, compilatorul are dou alternative: fie res
pinge orice operaie cu argumente greite, fie ncearc s converteasc argumentele ctre tip
rile necesare. Desigur, n cazul n care conversia nu este posibil, singura alternati
v rmne prima. n multe situaii ns, conversia este posibil. S lum de exemplu tipurile
Putem s convertim ntotdeauna un ntreg scurt la un ntreg. Valoarea rezultat va fi exa
ct aceeai. Conversia invers ns, poate pune probleme dac valoarea memorat n ntreg dep
acitatea de memorare a unui ntreg scurt. n afar de conversiile implicite, pe care c
ompilatorul le hotrte de unul singur, exist i conversii explicite, pe care programato
rul le poate fora la nevoie. Aceste conversii efectueaz de obicei operaii n care exi
st pericolul s se piard o parte din informaii. Compilatorul nu poate hotr de unul sing
ur n aceste situaii.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (16 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Conversiile implicite pot fi un pericol pentru stabilitatea aplicaiei dac pot s duc
la pierderi de informaii fr avertizarea programatorului. Aceste erori sunt de obice
i extrem de greu de depistat. n fiecare limbaj care lucreaz cu tipuri fixe pentru
datele sale exist conversii imposibile, conversii periculoase i conversii sigure.
Conversiile imposibile sunt conversiile pe care limbajul nu le permite pentru c n
u tie cum s le execute sau pentru c operaia este prea periculoas. De exemplu, Java re
fuz s converteasc un tip primitiv ctre un tip referin. Dei s-ar putea imagina o astfel
de conversie bazat pe faptul c o adres este n cele din urm un numr natural, acest tip
de conversii sunt extrem de periculoase, chiar i atunci cnd programatorul cere exp
licit aceast conversie. 5.1.6.1 Conversii de extindere a valorii n aceste conversi
i valoarea se reprezint ntr-o zon mai mare fr s se piard nici un fel de informaii. Ia
nversiile de extindere pe tipuri primitive:
q q q q q q
byte la short, int, long, float sau double short la int, long, float sau double
char la int, long, float sau double int la long, float sau double long la float
sau double float la double

S mai precizm totui c, ntr-o parte din aceste cazuri, putem pierde din precizie. Acea
st situaie apare de exemplu la conversia unui long ntr-un float, caz n care se pierd
o parte din cifrele semnificative pstrndu-se ns ordinul de mrime. De altfel aceast ob
servaie este evident dac inem cont de faptul c un long este reprezentat pe 64 de bii n
timp ce un float este reprezentat doar pe 32 de bii. Precizia se pierde chiar i n c
azul conversiei long la double sau int la float pentru c, dei dimensiunea zonei al
ocat pentru cele dou tipuri este aceeai, numerele flotante au nevoie de o parte din
aceast zon pentru a reprezenta exponentul. n aceste situaii, se va produce o rotunj
ire a numerelor reprezentate. 5.1.6.2 Conversii de trunchiere a valorii Conveniil
e de trunchiere a valorii pot produce pierderi de informaie pentru c ele convertes
c tipuri mai bogate n informaii ctre tipuri mai srace. Conversiile de trunchiere pe
tipurile elementare sunt urmtoarele:
q
byte la char
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (17 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
q q q q q q
short la byte sau char char la byte sau short int la byte, short sau char long l
a byte, short char, sau int float la byte, short, char, int sau long double la b
yte, short, char, int, long sau float.

n cazul conversiilor de trunchiere la numerele cu semn, este posibil s se schimbe


semnul pentru c, n timpul conversiei, se ndeprteaz pur i simplu octeii care nu mai nc
poate rmne primul bit diferit de vechiul prim bit. Copierea se face ncepnd cu octeii
mai puin semnificativi iar trunchierea se face la octeii cei mai semnificativi. P
rin octeii cei mai semnificativi ne referim la octeii n care sunt reprezentate cifr
ele cele mai semnificative. Cifrele cele mai semnificative sunt cifrele care dau
ordinul de mrime al numrului. De exemplu, la numrul 123456, cifrele cele mai semni
ficative sunt primele, adic: 1, 2, etc. La acelai numr, cifrele cele mai puin semnif
icative sunt ultimele, adic: 6, 5, etc. 5.1.6.3 Conversii pe tipuri referin Convers
iile tipurilor referin nu pun probleme pentru modul n care trebuie executat operaia d
in cauz c, referina fiind o adres, n timpul conversiei nu trebuie afectat n nici un fe
aceast adres. n schimb, se pun probleme legate de corectitudinea logic a conversiei
. De exemplu, dac avem o referin la un obiect care nu este tablou, este absurd s ncer
cm s convertim aceast referin la o referin de tablou. Limbajul Java definete extrem d
trict conversiile posibile n cazul tipurilor referin pentru a salva programatorul d
e eventualele necazuri care pot apare n timpul execuiei. Iat conversiile posibile:
q
q
q
q

O referin ctre un obiect aparinnd unei clase C poate fi convertit la o referin ctre u
biect aparinnd clasei S doar n cazul n care C este chiar S sau C este derivat direct
sau indirect din S. O referin ctre un obiect aparinnd unei clase C poate fi convertit
ctre o referin de interfa I numai dac clasa C implementeaz interfaa I. O referin c
ablou poate fi convertit la o referin ctre o clas numai dac clasa respectiv este clasa
Object. O referin ctre un tablou de elemente ale crui elemente sunt de tipul T1 poat
e fi convertit la o referin ctre un tablou de elemente de tip T2 numai dac T1 i T2 rep
rezint acelai tip primitiv sau T2 este un tip referin i T1 poate fi convertit ctre T2.
5.1.6.4 Conversii la operaia de atribuire Conversiile pe care limbajul Java le ex
ecut implicit la atribuire sunt foarte puine. Mai exact, sunt
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (18 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
executate doar acele conversii care nu necesit validare n timpul execuiei i care nu
pot pierde informaii n cazul tipurilor primitive. n cazul valorilor aparinnd tipurilo
r primitive, urmtorul tabel arat conversiile posibile. Pe coloane avem tipul de va
loare care se atribuie iar pe linii avem tipurile de variabile la care se atribu
ie: boolean boolean char byte short int long float double Da Nu Nu Nu Nu Nu Nu N
u char Nu Da Da Da Da Da Da Da byte Nu Da Da Da Da Da Da Da short Nu Da Nu Da Da
Da Da Da int Nu Nu Nu Nu Da Da Da Da long Nu Nu Nu Nu Nu Da Da Da float Nu Nu N
u Nu Nu Nu Da Da double Nu Nu Nu Nu Nu Nu Nu Da
Tabloul 5.1 Conversiile posibile ntr-o operaie de atribuire cu tipuri primitive. C
oloanele reprezint tipurile care se atribuie iar liniile reprezint tipul de variab
il ctre care se face atribuirea.
Dup cum observai, tipul boolean nu poate fi atribuit la o variabil de alt tip. Valo
rile de tip primitiv nu pot fi atribuite variabilelor de tip referin. La fel, valo
rile de tip referin nu pot fi memorate n variabile de tip primitiv. n ceea ce privete
tipurile referin ntre ele, urmtorul tabel definete situaiile n care conversiile sunt
osibile la atribuirea unei valori de tipul T la o variabil de tipul S: T este o c
las care nu este final T este o clas care este final T este o interfa T = B[] este un
tablou cu elemente de tipul B S trebuie s fie Object
S este o clas care nu este final
T trebuie s fie subclas a lui S
T trebuie s fie o subclas a lui S
eroare la compilare
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (19 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
S este o clas care este final S este o interfa S = A[] este un tablou cu elemente de
tipul A
T trebuie s fie aceeai clas ca i S
T trebuie s fie aceeai clas ca i S
eroare la compilare
eroare la compilare
T trebuie s implementeze interfaa S eroare la compilare
T trebuie s implementeze interfaa S eroare la compilare
T trebuie s fie o subinterfa a lui S eroare la compilare
eroare la compilare A sau B sunt acelai tip primitiv sau A este un tip referin i B p
oate fi atribuit lui A
Tabloul 5.2 Conversiile posibile la atribuirea unei valori de tipul T la o varia
bil de tipul S.

5.1.6.5 Conversii explicite Conversiile de tip cast, sau casturile, sunt apelate
de ctre programator n mod explicit. Sintaxa pentru construcia unui cast este scrie
rea tipului ctre care dorim s convertim n paranteze n faa valorii pe care dorim s o co
nvertim. Forma general este: ( Tip ) Valoare Conversiile posibile n acest caz sunt
mai multe dect conversiile implicite la atribuire pentru c n acest caz programator
ul este prevenit de eventuale pierderi de date el trebuind s apeleze conversia ex
plicit. Dar, continu s existe conversii care nu se pot apela nici mcar n mod explici
t, dup cum am explicat nainte. n cazul conversiilor de tip cast, orice valoare nume
ric poate fi convertit la orice valoare numeric. n continuare, valorile de tip boole
an nu pot fi convertite la nici un alt tip. Nu exist conversii ntre valorile de ti
p referin i valorile de tip primitiv. n cazul conversiilor dintr-un tip referin ntr-al
ul putem separa dou cazuri. Dac compilatorul poate decide n timpul compilrii dac conv
ersia este corect sau nu, o va decide. n cazul n care compilatorul nu poate decide
pe loc, se va efectua o verificare a conversiei n timpul execuiei. Dac conversia se
dovedete greit, va apare o eroare de execuie i programul va fi ntrerupt.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (20 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile

Iat un exemplu de situaie n care compilatorul nu poate decide dac conversia este pos
ibil sau nu: Minge mingeaMea; ? MingeDeBaschet mingeaMeaDeBaschet; // MingeDeBasc
het este o clas // derivat din clasa Minge mingeaMeaDeBaschet=(MingeDeBaschet)ming
eaMea; n acest caz, compilatorul nu poate fi sigur dac referina memorat n variabila m
ingeaMea este de tip MingeDeBaschet sau nu pentru c variabilei de tip Minge i se
pot atribui i referine ctre instane de tip Minge n general, care nu respect ntru totul
definiia clasei MingeDeBaschet sau chiar referin ctre alte tipuri de minge derivate
din clasa Minge, de exemplu MingeDePolo care implementeaz proprieti i operaii diferit
e fa de clasa MingeDeBaschet. Iat i un exemplu de conversie care poate fi decis n timp
ul compilrii: Minge mingeaMea; MingeDeBaschet mingeaMeaDeBaschet; ? mingeaMea = (
Minge ) mingeaMeaDeBaschet; n urmtorul exemplu ns, se poate decide n timpul compilrii
imposibilitatea conversiei: MingeDeBaschet mingeaMeaDeBaschet; MingeDePolo ming
eaMeaDePolo; ? mingeaMeaDePolo = ( MingeDePolo ) mingeaMeaDeBaschet; n fine, tabe
lul urmtor arat conversiile de tip cast a cror corectitudine poate fi stabilit n timp
ul compilrii. Conversia ncearc s transforme printr-un cast o referin de tip T ntr-o re
erin de tip S. T este o clas care nu este final T este o clas care este final T este o
interfa T = B[] este un tablou cu elemente de tipul B S trebuie s fie Object
S este o clas care nu este final
T trebuie s fie subclas a lui S
T trebuie s fie o subclas a lui S
Totdeauna corect la compilare
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (21 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
S este o clas care este final S este o interfa S = A[] este un tablou cu elemente de
tipul A
S trebuie s fie subclas a lui T
T trebuie s fie aceeai clas ca i S
S trebuie s implementeze interfaa T Totdeauna corect la compilare eroare la compila
re
eroare la compilare
Totdeauna corect la compilare T trebuie s fie Object
T trebuie s implementeze interfaa S eroare la compilare
eroare la compilare A sau B sunt acelai tip primitiv sau A este un tip referin i B p
oate fi convertit cu un cast la A
Tabloul 5.3 Cazurile posibile la convertirea unei referine de tip T ntr-o referin de
tip S.

5.1.6.6 Conversii de promovare aritmetic Promovarea aritmetic se aplic n cazul unor


formule n care operanzii pe care se aplic un operator sunt de tipuri diferite. n ac
este cazuri, compilatorul ncearc s promoveze unul sau chiar amndoi operanzii la acel
ai tip pentru a putea fi executat operaia. Exist dou tipuri de promovare, promovare a
ritmetic unar i binar. n cazul promovrii aritmetice unare, exist un singur operand car
n cazul c este byte sau short este transformat la int altfel rmne nemodificat. La p
romovarea aritmetic binar se aplic urmtorul algoritm: 1. 2. 3. 4. Dac un operand este
double, cellalt este convertit la double. Altfel, dac un operand este de tip floa
t, cellalt operand este convertit la float. Altfel, dac un operand este de tip lon
g, cellalt este convertit la long Altfel, amndoi operanzii sunt convertii la int.
De exemplu, n urmtoarea operaie amndoi operanzii vor fi convertii la float prin promo
vare aritmetic binar:
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (22 of 23)12.01.2006 23:07:53

Capitolul V -- 1. Variabile
float f; double i = f + 3; Dup efectuarea operaiei, valoarea obinut va fi convertit i
mplicit la double. n urmtorul exemplu, se produce o promovare unar la int de la sho
rt. short s, r; ? int min = ( r < -s ) ? r : s; n expresia condiional, operandul -s
se traduce de fapt prin aplicarea operatorului unar - la variabila s care este
de tip short. n acest caz, se va produce automat promovarea aritmetic unar de la sh
ort la int, apoi se va continua evaluarea expresiei.
[capitolul V] [cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap51.html (23 of 23)12.01.2006 23:07:53

Capitolul V -- 2. Expresii
Capitolul V 5.2 Expresii
5.2.1 Valoarea i tipul unei expresii 5.2.2 Ordinea de evaluare 5.2.3 Operatori 5.
2.3.1 Operatori unari 5.2.3.1.1 Operatorii de preincrementare i postincrementare
5.2.3.1.2 Operatorul + unar 5.2.3.1.3 Operatorul - unar 5.2.3.1.4 Operatorul de
complementare 5.2.3.1.5 Operatorul de negare logic 5.2.3.1.6 Casturi 5.2.3.2 Oper
atori binari 5.2.3.2.1 Operatori multiplicativi: *, /, % 5.2.3.2.2 Operatori adi
tivi: +, -, concatenare pentru iruri de caractere 5.2.3.2.3 Operatori de iftare: >
>, <<, >>> 5.2.3.2.4 Operatori relaionali: <, >, <=, >=, instanceof 5.2.3.2.5 Ope
ratori de egalitate: ==, != 5.2.3.2.6 Operatori la nivel de bit: &, |, ^ 5.2.3.2
.7 Operatori logici: &&, || 5.2.3.3 Operatorul condiional ?: 5.2.3.4 Operaii ntregi
5.2.3.5 Operaii flotante 5.2.3.6 Apeluri de metode
5.2.1 Valoarea i tipul unei expresii
Fiecare expresie a limbajului Java are un rezultat i un tip. Rezultatul poate fi:
q q
o valoare o variabil
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (1 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
q
nimic
n cazul n care valoarea unei expresii are ca rezultat o variabil, expresia poate ap
are n stnga unei operaii de atribuire. De exemplu expresia: tablou[i] este o expres
ie care are ca rezultat o variabil i anume locaia elementului cu indexul i din tabl
oul de elemente numit tablou. O expresie nu produce nimic doar n cazul n care este
un apel de metod i acest apel nu produce nici un rezultat (este declarat de tip v
oid). Fiecare expresie are n timpul compilrii un tip cunoscut. Acest tip poate fi
o valoare primitiv sau o referin. n cazul expresiilor care au tip referin, valoarea ex
presiei poate s fie i referina neiniializat, null.
5.2.2 Ordinea de evaluare
n Java operanzii sunt evaluai ntotdeauna de la stnga spre dreapta. Acest lucru nu tr
ebuie s ne ndemne s scriem cod care s depind de ordinea de evaluare pentru c, n unele
ituaii, codul rezultat este greu de citit. Regula este introdus doar pentru a asig
ura generarea uniform a codului binar, independent de compilatorul folosit. Evalu
area de la stnga la dreapta implic urmtoarele aspecte:
q
n cazul unui operator binar, operandul din stnga este ntotdeauna complet evaluat at
unci cnd se trece la evaluarea operandului din dreapta. De exemplu, n expresia: (
i++ ) + i dac i avea valoarea iniial 2, toat expresia va avea valoarea 5 pentru c val
oarea celui de-al doilea i este luat dup ce s-a executat incrementarea i++.
q
n cazul unei referine de tablou, expresia care numete tabloul este complet evaluat na
inte de a se trece la evaluarea expresiei care d indexul. De exemplu, n expresia:
( a = b )[i]
q
q
indexul va fi aplicat dup ce s-a executat atribuirea valorii referin b la variabila
referin de tablou a. Cu alte cuvinte, rezultatul va fi al i-lea element din tablo
ul b. n cazul apelului unei metode, expresia care numete obiectul este complet eva
luat atunci cnd se
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (2 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
q
q
trece la evaluarea expresiilor care servesc drept argumente. n cazul unui apel de
metod, dac exist mai mult dect un parametru, la evaluarea parametrului numrul i, toi
parametrii de la 1 la i-1 sunt deja evaluai complet. n cazul unei expresii de aloc
are, dac avem mai multe dimensiuni exprimate n paranteze drepte, dimensiunile sunt
de asemenea evaluate de la stnga la dreapta. De exemplu, n expresia: new int[i++]
[i]
q
tabloul rezultat nu va fi o matrice ptratic ci, dac i avea valoarea 3, de dimensiun
e 3 x 4.

5.2.3 Operatori
5.2.3.1 Operatori unari Operatorii unari se aplic ntotdeauna unui singur operand.
Aceti operatori sunt, n general exprimai naintea operatorului asupra cruia se aplic. E
xist ns i dou excepii, operatorii de incrementare i decrementare care pot apare i na
dup operator, cu semnificaii diferite. Operatorii unari sunt urmtorii:
q q q q q q q q q
++ preincrement -- predecrement ++ postincrement -- postdecrement + unar - unar
~ complementare ! negaie logic cast
5.2.3.1.1 Operatorii de preincrementare i postincrementare

Operatorii ++ preincrement i postincrement au acelai rezultat final, i anume increm


enteaz variabila asupra creia acioneaz cu 1. Operandul asupra cruia sunt apelai trebui
e s fie o variabil de tip aritmetic. Nu are sens s apelm un operand de incrementare
asupra unei valori (de exemplu valoarea unei expresii sau un literal), pentru c a
ceasta nu are o locaie de memorie fix n care s memorm valoarea dup incrementare. n caz
l operatorului prefix, valoarea rezultat a acestei expresii este valoarea variab
ilei dup incrementare n timp ce, la operatorul postfix, valoarea rezultat a expres
iei este valoarea de dinainte de incrementare. De exemplu, dup execuia urmtoarei se
cvene de instruciuni:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (3 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
int i = 5; int j = i++; valoarea lui j este 5, n timp ce, dup execuia urmtoarei secv
ene de instruciuni: int i = 5; int j = ++i; valoarea lui j va fi 6. n ambele cazuri
, valoarea final a lui i va fi 6. n cazul operatorilor -? predecrement i postdecrem
ent, sunt valabile aceleai consideraii ca mai sus, cu diferena c valoarea variabilei
asupra creia se aplic operandul va fi decrementat cu 1. De exemplu, urmtoarele inst
ruciuni: int i = 5; int j = i--; fac ca j s aib valoarea final 5 iar urmtoarele instr
uciuni: int i = 5; int j = --i; fac ca j s aib valoarea final 4. n ambele cazuri, val
oarea final a lui i este 4. Operatorii de incrementare i de decrementare se pot ap
lica i pe variabile de tip flotant. n asemenea cazuri, se convertete valoarea 1 la
tipul variabilei incrementate sau decrementate, dup care valoarea rezultat este ad
unat respectiv sczut din vechea valoare a variabilei. De exemplu, urmtoarele instruci
uni: double f = 5.6; double g = ++f; au ca rezultat final valoarea 6.6 pentru f i
pentru g.
5.2.3.1.2 Operatorul + unar
Operatorul + unar se aplic asupra oricrei valori primitive aritmetice. Valoarea rmne
neschimbat.
5.2.3.1.3 Operatorul - unar
Operatorul - unar se aplic asupra oricrei valori primitive aritmetice. Rezultatul
aplicrii acestui operand este negarea aritmetic a valorii. n cazul valorilor ntregi,
acest lucru este echivalent cu
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (4 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
scderea din 0 a valorii originale. De exemplu, instruciunile: int i = 5; int j = i; i dau lui j valoarea -5 . n cazul valorilor speciale definite de standardul IEE
E pentru reprezentarea numerelor flotante, se aplic urmtoarele reguli:
q q q
Dac operandul este NaN rezultatul negrii aritmetice este tot NaN pentru c NaN nu ar
e semn. Dac operandul este unul dintre infinii, rezultatul este infinitul opus ca
semn. Dac operandul este zero de un anumit semn, rezultatul este zero de semn dif
erit. ^
5.2.3.1.4 Operatorul de complementare
Operatorul de complementare ~ se aplic asupra valorilor primitive de tip ntreg. Re
zultatul aplicrii operandului este complementarea bit cu bit a valorii originale.
De exemplu, dac operandul era de tip byte avnd valoarea, n binar, 00110001, rezult
atul va fi 11001110. n realitate, nainte de complementare se face i extinderea valo
rii la un ntreg, deci rezultatul va fi de fapt: 11111111 11111111 11111111 110011
10.
5.2.3.1.5 Operatorul de negare logic
Operatorul de negare logic ! se aplic n exclusivitate valorilor de tip boolean. n ca
zul n care valoarea iniial a operandului este true rezultatul va fi false i invers.
5.2.3.1.6 Casturi
Casturile sunt expresii de conversie dintr-un tip ntr-altul, aa cum deja am artat l
a paragraful destinat conversiilor. Rezultatul unui cast este valoarea operandul
ui convertit la noul tip de valoare exprimat de cast. De exemplu, la instruciunile
: double f = 5.6; int i = ( int )f; double g = -5.6; int j = ( int )g; valoarea
variabilei f este convertit la o valoare ntreag, anume 5, i noua valoare este atribu
it variabilei i. La fel, j primete valoarea -5. S mai precizm c nu toate casturile su
nt valide n Java. De exemplu, nu putem converti o valoare ntreag ntr-o valoare de ti
p referin.
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (5 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
5.2.3.2 Operatori binari Operatorii binari au ntotdeauna doi operanzi. Operatorii
binari sunt urmtorii:
q q q q q q q
Operatori multiplicativi: *, /, % Operatori aditivi: +, -, + (concatenare) pentr
u iruri de caractere Operatori de iftare: >>, <<, >>> Operatori relaionali: <, >, <
=, >=, instanceof Operatori de egalitate: ==, != Operatori la nivel de bit: &, |
, ^ Operatori logici: &&, ||
5.2.3.2.1 Operatori multiplicativi: *, /, %
Operatorii multiplicativi reprezint respectiv operaiile de nmulire (*), mprire (/) i
tul mpririi (%). Prioritatea acestor operaii este mai mare relativ la operaiile aditi
ve, deci aceti operatori se vor executa mai nti. Exemple: 10 * 5 == 50 10.3 * 5.0 =
= 51.5 10 / 2.5 == 4.0// mprire real 3 / 2 == 1// mprire ntreag 7 % 2 == 1// restul
tregi 123.5 % 4 == 3.5 // 4 * 30 + 3.5 123.5 % 4.5 == 2.0 // 4.5 * 27 + 2.0 Dup c
um observai, operanzii sunt convertii mai nti la tipul cel mai puternic, prin promov
are aritmetic, i apoi se execut operaia. Rezultatul este de acelai tip cu tipul cel m
ai puternic. n cazul operatorului pentru restul mpririi, dac lucrm cu numere flotante,
rezultatul se calculeaz n felul urmtor: se calculeaz de cte ori este cuprins cel deal doilea operand n primul (un numr ntreg de ori) dup care rezultatul este diferena c
are mai rmne, ntotdeauna mai mic strict dect al doilea operand.
5.2.3.2.2 Operatori aditivi: +, -, concatenare pentru iruri de caractere
Operatorii aditivi reprezint operaiile de adunare (+), scdere (-) i concatenare (+)
de iruri. Observaiile despre conversia tipurilor fcute la operatorii multiplicativi
rmn valabile. Exemple: 2 + 3 == 5 2.34 + 3 == 5.34 34.5 - 23.1 == 11.4
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (6 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
"Acesta este" + " un sir" == "Acesta este un sir" "Sirul: " + 1 == "Sirul: 1" "S
irul: " + 3.4444 == "Sirul: 3.4444" "Sirul: " + null = "Sirul: null" "Sirul: " +
true = "Sirul: true" Object obiect = new Object(); "Sirul: " + obiect == "java.
lang.Object@1393800" La concatenarea irurilor de caractere, lungimea irului rezult
at este suma lungimii irurilor care intr n operaie. Caracterele din irul rezultat sun
t caracterele din primul ir, urmate de cele dintr-al doilea ir n ordine. Dac cel deal doilea operand nu este de tip String ci este de tip referin, se va apela metoda
sa toString, i apoi se va folosi n operaie rezultatul. Metoda toString este defini
t n clasa Object i este motenit de toate celelalte clase. Dac cel de-al doilea operand
este un tip primitiv, acesta este convertit la un ir rezonabil de caractere care
s reprezinte valoarea operandului.
5.2.3.2.3 Operatori de iftare: >>, <<, >>>

Operatorii de iftare se pot aplica doar pe valori primitive ntregi. Ei reprezint re


spectiv operaiile de iftare cu semn stnga (<<) i dreapta (>>) i operaia de iftare fr
spre dreapta (>>>). iftrile cu semn lucreaz la nivel de cifre binare. Cifrele bina
re din locaia de memorie implicat sunt mutate cu mai multe poziii spre stnga sau spr
e dreapta. Poziia binar care reprezint semnul rmne neschimbat. Numrul de poziii cu ca
se efectueaz mutarea este dat de al doilea operand. Locaia de memorie n care se exe
cut operaia este locaia n care este memorat primul operand. iftarea cu semn la stnga r
eprezint o operaie identic cu nmulirea cu 2 de n ori, unde n este al doilea operand. i
ftarea cu semn la dreapta reprezint mprirea ntreag. n acest caz, semnul este copiat n
d repetat n locurile rmase goale. Iat cteva exemple: 255 << 3 == // 00000000 255 >>
5 == // 00000000 2040 11111111 -> 00000111 11111000 7 11111111 -> 00000000 00000
111

iftarea fr semn la dreapta, mut cifrele binare din operand completnd spaiul rmas cu ze
ouri: 0xffffffff >>> -1 == 0x00000001 0xffffffff >>> -2 == 0x00000003
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (7 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
0xffffffff >>> -3 == 0x00000007 0xffffffff >>> 3 == 0x1fffffff 0xffffffff >>> 5
== 0x07ffffff ^
5.2.3.2.4 Operatori relaionali: <, >, <=, >=, instanceof
Operatorii relaionali ntorc valori booleene de adevrat sau fals. Ei reprezint testel
e de mai mic (<), mai mare (>), mai mic sau egal (<=), mai mare sau egal (>=) i t
estul care ne spune dac un anumit obiect este sau nu instan a unei anumite clase (i
nstanceof). Iat cteva exemple: 1 < 345 == true 1 <= 0 == false Object o = new Obje
ct(); String s = new String(); o instanceof Obiect == true s instanceof String =
= true o instanceof String == false s instanceof Object == true S mai observm c Str
ing este derivat din Object.
5.2.3.2.5 Operatori de egalitate: ==, !=
Aceti operatori testeaz egalitatea sau inegalitatea dintre dou valori. Ei reprezint
testul de egalitate (==) i de inegalitate (!=). Rezultatul aplicrii acestor operat
ori este o valoare boolean. Exemple: ( 1 == 1.0 ) == true ( 2 != 2 ) == false Obj
ect o = new Object(); String s1 = "vasile"; String s2 = s1; String s4 = "e"; Str
ing s3 = "vasil" + s4; ( o == s1 ) == false ( s1 == s2 ) == true // acelai obiect
referit ( s3 == s1 ) == false // acelai ir de caractere // dar obiecte diferite S
observm c egalitatea a dou obiecte de tip String reprezint egalitatea a dou referine d
e obiecte i nu egalitatea coninutului irului de caractere. Dou referine sunt egale da
c refer exact acelai
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (8 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
obiect, nu dac obiectele pe care le refer sunt egale ntre ele. Egalitatea coninutulu
i a dou iruri de caractere se testeaz folosind metoda equals, definit n clasa String.
5.2.3.2.6 Operatori la nivel de bit: &, |, ^
Operatorii la nivel de bit reprezint operaiile logice obinuite, dac considerm c 1 ar r
eprezenta adevrul i 0 falsul. Operatorii la nivel de bit, consider cei doi operanzi
ca pe dou iruri de cifre binare i fac operaiile pentru fiecare dintre perechile de
cifre binare corespunztoare n parte. Rezultatul este un nou ir de cifre binare. De
exemplu, operaia de i (&) logic are urmtorul tabel de adevr: 1 1 0 0 & & & & 1 0 1 0
== == == == 1 0 0 0
Dac apelm operatorul & pe numerele reprezentate binar: 00101111 01110110 rezultatu
l este: 00100110 Primul numr reprezint cifra 47, al doilea 118 iar rezultatul 38,
deci: 47 & 118 == 38 n mod asemntor, tabela de adevr pentru operaia logic sau (|) este
: 1 1 0 0 | | | | 1 0 1 0 == == == == 1 1 1 0
iar tabela de adevr pentru operaia logic de sau exclusiv (^) este: 1 1 0 0 ^ ^ ^ ^
1 0 1 0 == == == == 0 1 1 0
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap52.html (9 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
Iat i alte exemple: 1245 ^ 2345 == 3572 128 & 255 == 128 127 & 6 == 6 128 | 255 ==
255 127 | 6 == 127 32 ^ 64 == 96 ^
5.2.3.2.7 Operatori logici: &&, ||

Operatorii logici se pot aplica doar asupra unor operanzi de tip boolean. Rezult
atul aplicrii lor este tot boolean i reprezint operaia logic de i (&&) sau operaia log
c de sau (||) ntre cele dou valori booleene. Iat toate posibilitile de combinare: true
&& true == true true && false == false false && true == false false && false ==
false true || true == true true || false == true false || true == true false ||
false == false n cazul operatorului && este evaluat mai nti operandul din stnga. Da
c acesta este fals, operandul din dreapta nu mai este evaluat, pentru c oricum rez
ultatul este fals. Acest lucru ne permite s testm condiiile absolut necesare pentru
corectitudinea unor operaii i s nu executm operaia dect dac aceste condiii sunt nde
te. De exemplu, dac avem o referin i dorim s citim o valoare de variabil din obiectul
referit, trebuie s ne asigurm c referina este diferit de null. n acest caz, putem scri
e: String s = "sir de caractere"; if( s != null && s.length < 5 ) ? n cazul n care
s este null, a doua operaie nu are sens i nici nu va fi executat. n mod similar, la
operatorul ||, se evalueaz mai nti primul operand. Dac acesta este adevrat, nu se ma
i evalueaz i cel de-al doilea operand pentru c rezultatul este oricum adevrat. Faptu
l se poate folosi n mod similar ca mai sus: if( s == null || s.length == 0 ) ?
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap52.html (10 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii

n cazul n care s este null, nu se merge mai departe cu evaluarea. 5.2.3.3 Operator
ul condiional ?: Este singurul operator definit de limbajul Java care accept trei
operanzi. Operatorul primete o expresie condiional boolean pe care o evalueaz i alte d
ou expresii care vor fi rezultatul aplicrii operandului. Care dintre cele dou expre
sii este rezultatul adevrat depinde de valoarea rezultat a expresiei booleene. Fo
rma general a operatorului este: ExpresieCondiional ? Expresie1 : Expresie2 Dac valo
area expresiei condiionale este true, valoarea operaiei este valoarea expresiei 1.
Altfel, valoarea operaiei este valoarea expresiei 2. Cele dou expresii trebuie s f
ie amndou aritmetice sau amndou booleene sau amndou de tip referin. Iat i un exempl
i = 5; int j = 4; double f = ( i < j ) ? 100.5 : 100.4; Parantezele nu sunt obli
gatorii. Dup execuia instruciunilor de mai sus, valoarea lui f este 100.4. Iar dup:
int a[] = { 1, 2, 3, 4, 5 }; int b[] = { 10, 20, 30 }; int k = ( ( a.length < b.
length ) ? a : b )[0]; valoarea lui k va deveni 10. 5.2.3.4 Operaii ntregi Dac amndo
i operanzii unei operator sunt ntregi atunci ntreaga operaie este ntreag. Dac unul din
tre operanzi este ntreg lung, operaia se va face cu precizia de 64 de bii. Operanzi
i sunt eventual convertii. Rezultatul este un ntreg lung sau o valoare boolean dac o
peratorul este un operator condiional.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap52.html (11 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii

Dac nici unul dintre operanzi nu e ntreg lung, operaia se face ntotdeauna pe 32 de b
ii, chiar dac cei doi operanzi sunt ntregi scuri sau octei. Rezultatul este ntreg sau
boolean. Dac valoarea obinut este mai mare sau mai mic dect se poate reprezenta pe ti
pul rezultat, nu este semnalat nici o eroare de execuie, dar rezultatul este trunc
hiat. 5.2.3.5 Operaii flotante Dac un operand al unei operaii este flotant, atunci n
treaga operaie este flotant. Dac unul dintre operanzi este flotant dublu, operaia es
te pe flotani dubli. Rezultatul este un flotant dublu sau boolean. n caz de operaii
eronate nu se genereaz erori. n loc de aceasta se obine rezultatul NaN. Dac ntr-o op
eraie particip un NaN rezultatul este de obicei NaN. n cazul testelor de egalitate,
expresia NaN == NaN are ntotdeauna rezultatul fals pentru c un NaN nu este egal c
u nimic. La fel, expresia: NaN != NaN este ntotdeauna adevrat. n plus, ntotdeauna exp
resia: -0.0 == +0.0 este adevrat, unde +0.0 este zeroul pozitiv iar -0.0 este zero
ul negativ. Cele dou valori sunt definite n standardul IEEE 754. n alte operaii ns, ze
ro pozitiv difer de zero negativ. De exemplu 1.0 / 0.0 este infinit pozitiv iar 1
.0 / -0.0 este infinit negativ. 5.2.3.6 Apeluri de metode La apelul unei metode,
valorile ntregi nu sunt automat extinse la ntreg sau la ntreg lung ca la operaii. A
sta nseamn c, dac un operand este transmis ca ntreg scurt de exemplu, el rmne ntreg s
t i n interiorul metodei apelate.
[capitolul V]
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap52.html (12 of 13)12.01.2006 23:07:54

Capitolul V -- 2. Expresii
[cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap52.html (13 of 13)12.01.2006 23:07:54

Capitolul V -- 3. Instruciuni
Capitolul V 5.3 Instruciuni
5.3.1 Blocuri de instruciuni 5.3.1.1 Declaraii de variabile locale 5.3.2 Tipuri de
instruciuni 5.3.2.1 Instruciuni de atribuire 5.3.2.1.1 Atribuire cu operaie 5.3.2.
1.2 Atribuiri implicite 5.3.2.2 Instruciuni etichetate 5.3.2.3 Instruciuni condiion
ale 5.3.2.3.1 Instruciunea if 5.3.2.3.2 Instruciunea switch 5.3.2.4 Instruciuni de
ciclare 5.3.2.4.1 Instruciunea while 5.3.2.4.2 Instruciunea do 5.3.2.4.3 Instruciun
ea for 5.3.2.5 Instruciuni de salt 5.3.2.5.1 Instruciunea break 5.3.2.5.2 Instruciu
nea continue 5.3.2.5.3 Instruciunea return 5.3.2.5.4 Instruciunea throw 5.3.2.6 In
struciuni de protecie 5.3.2.6.1 Instruciunea try 5.3.2.6.2 Instruciunea synchronized
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (1 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
5.3.2.7 Instruciunea vid

5.3.1 Blocuri de instruciuni


Un bloc de instruciuni este o secven, eventual vid, de instruciuni i declaraii de vari
bile locale. Aceste instruciuni se execut n ordinea n care apar n interiorul blocului
. Sintactic, blocurile de instruciuni sunt delimitate n surs de caracterele { i }. n
limbajul Java, regula general este aceea c oriunde putem pune o instruciune putem p
une i un bloc de instruciuni, cu cteva excepii pe care le vom sesiza la momentul pot
rivit, specificnd n acest fel c instruciunile din interiorul blocului trebuiesc priv
ite n mod unitar i tratate ca o singur instruciune. 5.3.1.1 Declaraii de variabile lo
cale O declaraie de variabil local introduce o nou variabil care poate fi folosit doar
n interiorul blocului n care a fost definit. Declaraia trebuie s conin un nume i un
. n plus, ntr-o declaraie putem specifica o valoare iniial n cazul n care valoarea imp
icit a tipului variabilei, definit standard de limbajul Java, nu ne satisface. Num
ele variabilei este un identificator Java. Acest nume trebuie s fie diferit de nu
mele celorlalte variabile locale definite n blocul respectiv i de eventualii param
etri ai metodei n interiorul creia este declarat blocul. De exemplu, este o eroare
de compilare s declarm cea de-a doua variabil x n blocul: { int x = 3; { int x = 5;
} } Compilatorul va semnala faptul c deja exist o variabil cu acest nume n interior
ul metodei. Eroarea de compilare apare indiferent dac cele dou variabile sunt de a
celai tip sau nu. Nu acelai lucru se ntmpl ns dac variabilele sunt declarate n dou
de instruciuni complet disjuncte, care nu se includ unul pe cellalt. De exemplu,
declaraiile urmtoare sunt perfect valide:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (2 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
{ { int x = 3; } { int x = 5; } } Practic, fiecare bloc de instruciuni definete un
domeniu de existen a variabilelor locale declarate n interior. Dac un bloc are subb
locuri declarate n interiorul lui, variabilele din aceste subblocuri trebuie s fie
distincte ca nume fa de variabilele din superbloc. Aceste domenii se pot reprezen
ta grafic ca n figura urmtoare:
Figura 5.4 Reprezentarea grafic a domeniilor de existen a variabilelor incluse unul
ntr-altul.
Figura reprezint situaia din primul exemplu. Observai c domeniul blocului interior e
ste complet inclus n domeniul blocului exterior. Din aceast cauz, x apare ca fiind
definit de dou ori. n cel de-al doilea exemplu, reprezentarea grafic este urmtoarea:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (3 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
Figura 5.5 Reprezentarea grafic a domeniilor de existen a variabilelor disjuncte.

n acest caz, domeniile n care sunt definite cele dou variabile sunt complet disjunc
te i compilatorul nu va avea nici o dificultate n a identifica la fiecare referire
a unei variabile cu numele x despre care variabil este vorba. S mai observm c, n cel
de-al doilea exemplu, referirea variabilelor x n blocul mare, n afara celor dou su
bblocuri este o eroare de compilare. n cazul n care blocul mare este blocul de imp
lementare al unei metode i metoda respectiv are parametri, aceti parametri sunt luai
n considerare la fel ca nite declaraii de variabile care apar chiar la nceputul blo
cului. Acest lucru face ca numele parametrilor s nu poat fi folosit n nici o declar
aie de variabil local din blocul de implementare sau subblocuri ale acestuia. n real
itate, o variabil local poate fi referit n interiorul unui bloc abia dup declaraia ei.
Cu alte cuvinte, domeniul de existen al unei variabile locale ncepe din punctul de
declaraie i continu pn la terminarea blocului. Astfel, urmtoarea secven de instruci
{ x = 4; int x = 3; } va determina o eroare de compilare, cu specificaia c variabi
la x nu a fost nc definit n momentul primei atribuiri. Acest mod de lucru cu variabi
lele face corect urmtoarea secven de instruciuni:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (4 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

{ { int x = 4; } int x = 3; } pentru c, n momentul declaraiei din interiorul subblo


cului, variabila x din exterior nu este nc definit. La ieirea din subbloc, prima dec
laraie i termin domeniul, aa c se poate defini fr probleme o nou variabil cu acela
5.3.2 Tipuri de instruciuni
5.3.2.1 Instruciuni de atribuire O atribuire este o setare de valoare ntr-o locaie
de memorie. Forma general a unei astfel de instruciuni este: Locaie = valoare ; Spe
cificarea locaiei se poate face n mai multe feluri. Cel mai simplu este s specificm
un nume de variabil local. Alte alternative sunt acelea de a specifica un element
dintr-un tablou de elemente sau o variabil care nu este declarat final din interior
ul unei clase sau numele unui parametru al unei metode. Valoarea care trebuie at
ribuit poate fi un literal sau rezultatul evalurii unei expresii. Instruciunea de a
tribuire are ca rezultat chiar valoarea atribuit. Din aceast cauz, la partea de val
oare a unei operaii de atribuire putem avea chiar o alt operaie de atribuire ca n ex
emplul urmtor: int x = 5; int y = 6; x = ( y = y / 2 ); Valoarea final a lui x va
fi identic cu valoarea lui y i va fi egal cu 3. Parantezele de mai sus sunt puse do
ar pentru claritatea codului, pentru a nelege exact care este ordinea n care se exe
cut atribuirile. n realitate, ele pot s lipseasc pentru c, n mod implicit, Java va exe
cuta nti atribuirea din dreapta. Deci, ultima linie se poate rescrie ca: x = y = y
/ 2; De altfel, gruparea invers nici nu are sens:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (5 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

( x = y ) = y / 2; Aceast instruciune va genera o eroare de compilare pentru c, dup


executarea atribuirii din paranteze, rezultatul este valoarea 6 iar unei valori
nu i se poate atribui o alt valoare. n momentul atribuirii, dac valoarea din partea
dreapt a operaiei nu este de acelai tip cu locaia din partea stng, compilatorul va nc
rca conversia valorii la tipul locaiei n modul pe care l-am discutat n paragraful r
eferitor la conversii. Aceast conversie trebuie s fie posibil, altfel compilatorul
va semnala o eroare. Pentru anumite conversii, eroarea s-ar putea s nu poat fi dep
istat dect n timpul execuiei. n aceste cazuri, compilatorul nu va semnala eroare dar
va fi semnalat o eroare n timpul execuiei i rularea programului va fi abandonat.
5.3.2.1.1 Atribuire cu operaie

Se ntmpl deseori ca valoarea care se atribuie unei locaii s depind de vechea valoare c
are era memorat n locaia respectiv. De exemplu, n instruciunea: int x = 3; x = x * 4;
vechea valoare a lui x este nmulit cu 4 i rezultatul nmulirii este memorat napoi n lo
destinat lui x. ntr-o astfel de instruciune, calculul adresei locaiei lui x este ef
ectuat de dou ori, o dat pentru a lua vechea valoare i nc o dat pentru a memora noua v
aloare. n realitate, acest calcul nu ar trebui executat de dou ori pentru c locaia v
ariabilei x nu se schimb n timpul instruciunii. Pentru a ajuta compilatorul la gene
rarea unui cod eficient, care s calculeze locaia lui x o singur dat, n limbajul Java
au fost introduse instruciuni mixte de calcul combinat cu atribuire. n cazul nostr
u, noua form de scriere, mai eficient, este: int x = 3; x *= 4; Eficiena acestei ex
primri este cu att mai mare cu ct calculul locaiei este mai complicat. De exemplu, n
secvena urmtoare: int x = 3, y = 5; double valori[] = new double[10]; valori[( x +
y ) / 2] += 3.5; calculul locaiei de unde se va lua o valoare la care se va adun
a 3.5 i unde se va memora napoi
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (6 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
rezultatul acestei operaii este efectuat o singur dat. n acest exemplu, calcului loc
aiei presupune execuia expresiei: ( x + y ) / 2 i indexarea tabloului numit valori
cu valoarea rezultat. Valoarea din partea dreapt poate fi o expresie arbitrar de c
omplicat, ca n: valori[x] += 7.0 * ( y * 5 ); Iat toi operatorii care pot fi mixai cu
o atribuire: *=, /=, %=, +=, -=, <<=, >>=, >>>=,
5.3.2.1.2 Atribuiri implicite
&=, |=, ^= ^

S mai observm c, n cazul folosirii operatorilor de incrementare i decrementare se fac


e i o atribuire implicit pentru c pe lng valoarea rezultat n urma operaiei, se modifi
aloarea memorat la locaia pe care se aplic operatorul. La fel ca i la operaiile mixte
de atribuire, calculul locaiei asupra creia se aplic operatorul se efectueaz o sing
ur dat. 5.3.2.2 Instruciuni etichetate Unele dintre instruciunile din interiorul unu
i bloc de instruciuni trebuie referite din alt parte a programului pentru a se put
ea direciona execuia spre aceste instruciuni. Pentru referirea acestor instruciuni,
este necesar ca ele s aib o etichet asociat. O etichet este deci un nume dat unei ins
truciuni din program prin care instruciunea respectiv poate fi referit din alte pri al
e programului. Eticheta cea mai simpl este un simplu identificator urmat de carac
terul : i de instruciunea pe care dorim s o etichetm: Etichet: Instruciune ca n exempl
l urmtor: int a = 5; Eticheta: a = 3; Pentru instruciunea switch, descris mai jos,
sunt definite dou moduri diferite de etichetare. Acestea au forma:
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (7 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
case Valoare: Instruciune default: Instruciune Exemple pentru folosirea acestor fo
rme sunt date la definirea instruciunii. 5.3.2.3 Instruciuni condiionale Instruciuni
le condiionale sunt instruciuni care selecteaz pentru execuie o instruciune dintr-un
set de instruciuni n funcie de o anumit condiie.
5.3.2.3.1 Instruciunea if

Instruciunea if primete o expresie a crei valoare este obligatoriu de tipul boolean


. Evaluarea acestei expresii poate duce la doar dou valori: adevrat sau fals. n fun
cie de valoarea rezultat din aceast evaluare, se execut unul din dou seturi de instru
ciuni distincte, specificate de instruciunea if. Sintaxa acestei instruciuni este u
rmtoarea: if( Expresie ) Instruciune1 [else Instruciune2] Dup evaluarea expresiei bo
oleene, dac valoarea rezultat este true, se execut instruciunea 1. Restul instruciuni
i este opional, cu alte cuvinte partea care ncepe cu cuvntul rezervat else poate s l
ipseasc. n cazul n care aceast parte nu lipsete, dac rezultatul evalurii expresiei est
false se va executa instruciunea 2. Indiferent de instruciunea care a fost execut
at n interiorul unui if, dup terminarea acesteia execuia continu cu instruciunea de du
p instruciunea if, n afar de cazul n care instruciunile executate conin n interior o
truciune de salt. S mai observm c este posibil ca ntr-o instruciune if s nu se execute
nici o instruciune n afar de evaluarea expresiei n cazul n care expresia este fals iar
partea else din instruciunea if lipsete. Expresia boolean va fi ntotdeauna evaluat.
Iat un exemplu de instruciune if n care partea else lipsete: int x = 3; if( x == 3 )
x *= 7;
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (8 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

i iat un exemplu n care sunt prezente ambele pri: int x = 5; if( x % 2 == 0 ) x = 100
; else x = 1000; Instruciunea 1 nu poate lipsi niciodat. Dac totui pe ramura de adevr
a instruciunii condiionale nu dorim s executm nimic, putem folosi o instruciune vid,
dup cum este artat puin mai departe. n cazul n care dorim s executm mai multe instruc
i pe una dintre ramurile instruciunii if, putem s n locuim instruciunea 1 sau 2 sau
pe amndou cu blocuri de instruciuni, ca n exemplul urmtor: int x = 5; if( x == 0 ) {
x = 3; y = x * 5; } else { x = 5; y = x * 7; } Expresia boolean poate s fie i o exp
resie compus de forma: int int if( x = x = 3; y = 5; y != 0 && x / y == 2 ) 4;
n acest caz, aa cum deja s-a specificat la descrierea operatorului &&, evaluarea e
xpresiei nu este terminat n toate situaiile. n exemplul nostru, dac y este egal cu 0,
evaluarea expresiei este oprit i rezultatul este fals. Aceast comportare este core
ct pentru c, dac un termen al unei operaii logice de conjuncie este fals, atunci ntrea
ga conjuncie este fals. n plus, acest mod de execuie ne permite s evitm unele operaii
u rezultat incert, n cazul nostru o mprire prin 0. Pentru mai multe informaii relativ
e la operatorii && i || citii seciunea destinat operatorilor.
5.3.2.3.2 Instruciunea switch
Instruciunea switch ne permite saltul la o anumit instruciune etichetat n funcie de va
loarea unei
file:///C|/Documents%20and%20Settings/Luminita/Deskt...%20in%20romana/Carte%20JA
VA%20in%20romana/cap53.html (9 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
expresii. Putem s specificm cte o etichet pentru fiecare valoare particular a expresi
ei pe care dorim s o difereniem. n plus, putem specifica o etichet la care s se fac sa
ltul implicit, dac expresia nu ia nici una dintre valorile particulare specificat
e. Sintaxa instruciunii este: switch( Expresie ) { [case ValoareParticular: Instru
ciuni;]* [default: InstruciuniImplicite;] } Execuia unei instruciuni switch ncepe ntot
deauna prin evaluarea expresiei dintre parantezele rotunde. Aceast expresie trebu
ie s aib tipul caracter, octet, ntreg scurt sau ntreg. Dup evaluarea expresiei se tre
ce la compararea valorii rezultate cu valorile particulare specificate n etichete
le case din interiorul blocului de instruciuni. Dac una dintre valorile particular
e este egal cu valoarea expresiei, se execut instruciunile ncepnd de la eticheta case
corespunztoare acelei valori n jos, pn la captul blocului. Dac nici una dintre valori
le particulare specificate nu este egal cu valoarea expresiei, se execut instruciun
ile care ncep cu eticheta default, dac aceasta exist. Iat un exemplu de instruciune s
witch: int x = 4; int y = 0; switch( x + 1 ) { case 3: x += 2; y++; case 5: x =
11; y++; default: x = 4; y += 3; } Dac valoarea lui x n timpul evalurii expresiei e
ste 2 atunci expresia va avea valoarea 3 i instruciunile vor fi executate una dup a
lta ncepnd cu cea etichetat cu case 3. n ordine, x va deveni 4, y va deveni 1, x va
deveni 11, y va deveni 2, x va deveni 4 i y va deveni 5.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (10 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

Dac valoarea lui x n timpul evalurii expresiei este 4 atunci expresia va avea valoa
rea 5 i instruciunile vor fi executate pornind de la cea etichetat cu case 5. n ordi
ne, x va deveni 11, y va deveni 1, x va deveni 4 i y va deveni 4. n fine, dac valoa
rea lui x n timpul evalurii expresiei este diferit de 2 i 4, se vor executa instruciu
nile ncepnd cu cea etichetat cu default. n ordine, x va deveni 4 i y va deveni 3. Eti
cheta default poate lipsi, caz n care, dac nici una dintre valorile particulare nu
este egal cu valoarea expresiei, nu se va executa nici o instruciune din bloc. n c
ele mai multe cazuri, aceast comportare a instruciunii switch nu ne convine, din c
auza faptului c instruciunile de dup cea etichetat cu case 5 se vor executa i dac valo
area este 3. La fel, instruciunile de dup cea etichetat cu default se execut ntotdeau
na. Pentru a schimba aceast comportare trebuie s folosim una dintre instruciunile d
e salt care s opreasc execuia instruciunilor din bloc nainte de ntlnirea unei noi inst
uciuni etichetate. Putem de exemplu folosi instruciunea de salt break care va opri
execuia instruciunilor din blocul switch. De exemplu: char c = \t; String mesaj
= "nimic"; switch( c ) { case \t: mesaj = "tab"; break; case \n: mesaj = "l
inie noua"; break; case \r: mesaj = "retur"; default: mesaj = mesaj + " de"; m
esaj = mesaj + " car"; } n acest caz, dac c este egal cu caracterul tab, la termin
area instruciunii switch, mesaj va avea valoarea "tab". n cazul n care c are valoar
ea CR, mesaj va deveni mai nti "retur" apoi "retur de" i apoi "retur de car". Lipsa
lui break dup instruciunea mesaj = "retur";
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (11 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

face ca n continuare s fie executate i instruciunile de dup cea etichetat cu default.


5.3.2.4 Instruciuni de ciclare Instruciunile de ciclare (sau ciclurile, sau buclel
e) sunt necesare atunci cnd dorim s executm de mai multe ori aceeai instruciune sau a
celai bloc de instruciuni. Necesitatea acestui lucru este evident dac ne gndim c progr
amele trebuie s poat reprezenta aciuni de forma: execut 10 ntoarceri, execut 7 genofle
xiuni, execut flotri pn ai obosit, etc. Desigur, sintaxa instruciunilor care se execu
t trebuie s fie aceeai, pentru c ele vor fi n realitate scrise n Java o singur dat. T
, instruciunile nu sunt neaprat aceleai. De exemplu, dac executm n mod repetat instruc
unea: int tablou[] = new int[10]; int i = 0; tablou[i++] = 0; n realitate se va m
emora valoarea 0 n locaii diferite pentru c variabila care particip la calculul locai
ei i modific la fiecare iteraie valoarea. La primul pas, se va face 0 primul element
din tablou i n acelai timp i va primi valoarea 1. La al doilea pas, se va face 0 a
l doilea element din tablou i i va primi valoarea 2, i aa mai departe. Lucrurile pa
r i mai clare dac ne gndim c instruciunea executat n mod repetat poate fi o instruciu
if. n acest caz, n funcie de expresia condiional din if se poate executa o ramur sau a
lta a instruciunii. De exemplu instruciunea din bucl poate fi: int i = 0; if( i++ %
2 == 0 ) else n acest caz, i este cnd par cnd impar i se execut alternativ cele dou
amuri din if. Desigur, comportarea descris este valabil dac valoarea lui i nu este
modificat n interiorul uneia dintre ramuri.
5.3.2.4.1 Instruciunea while

Aceast instruciune de buclare se folosete atunci cnd vrem s executm o instruciune att
imp ct o anumit expresie condiional rmne adevrat. Expresia condiional se evalueaz
inte
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (12 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

de execuia instruciunii, astfel c, dac expresia era de la nceput fals, instruciunea nu


se mai executa niciodat. Sintaxa acestei instruciuni este: while( Test ) Corp Test
este o expresie boolean iar Corp este o instruciune normal, eventual vid. Dac avem n
evoie s repetm mai multe instruciuni, putem nlocui corpul buclei cu un bloc de instr
uciuni. Iat i un exemplu: int i = 0; int tablou[] = new int[20]; while( i < 10 ) ta
blou[i++] = 1; Bucla while de mai sus se execut de 10 ori primele 10 elemente din
tablou fiind iniializate cu 1. n treact fie spus, celelalte rmn la valoarea 0 care e
ste valoarea implicit pentru ntregi. Dup cei 10 pai iterativi, i devine 10 i testul d
evine fals (10 < 10). n exemplul urmtor, corpul nu se execut nici mcar o dat: int i =
3; while( i < 3 ) i++; Putem s crem un ciclu infinit (care nu se termin niciodat) p
rin: while( true ) ; ntreruperea execuiei unui ciclu infinit se poate face introdu
cnd n corpul ciclului o instruciune de salt.
5.3.2.4.2 Instruciunea do
Buclele do se folosesc atunci cnd testul de terminare a buclei trebuie fcut dup exe
cuia corpului buclei. Sintaxa de descriere a instruciuni do este: do Corp while( T
est ) ;
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (13 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

Test este o expresie boolean iar Corp este o instruciune sau un bloc de instruciuni
. Execuia acestei instruciuni nseamn execuia corpului n mod repetat atta timp ct expr
a Test are valoarea adevrat. Testul se evalueaz dup execuia corpului, deci corpul se
execut cel puin o dat. De exemplu, n instruciunea: int i = 3; do i++; while( false )
; valoarea final a lui i este 4, pentru c instruciunea i++ care formeaz corpul bucle
i se execut o dat chiar dac testul este ntotdeauna fals. n instruciunea: int i = 1; do
{ tablou[i] = 0; i += 2; } while( i < 5 ); sunt setate pe 0 elementele 1 i 3 din
tablou. Dup a doua iteraie, i devine 5 i testul eueaz cauznd terminarea iteraiei.
5.3.2.4.3 Instruciunea for

Instruciunea for se folosete atunci cnd putem identifica foarte clar o parte de inii
alizare a buclei, testul de terminare a buclei, o parte de reluare a buclei i un
corp pentru bucl. n acest caz, putem folosi sintaxa: for( Iniializare Test ; Reluar
e ) Corp Corp i Iniializare sunt instruciuni normale. Test este o expresie boolean i
ar Reluare este o instruciune creia i lipsete caracterul ; final. Execuia unei bucle
for ncepe cu execuia instruciunii de iniializare. Aceast instruciune stabilete de obic
i nite valori pentru variabilele care controleaz bucla. Putem chiar declara aici n
oi variabile. Aceste variabile exist doar n interiorul corpului buclei i n instruciun
ile de test i reluare ale buclei. n partea de iniializare nu putem scrie dect o sing
ur instruciune fie ea declaraie sau instruciune normal. n acest caz instruciunea nu se
poate nlocui cu un bloc de instruciuni. Putem ns s
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (14 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

declarm dou variabile cu o sintax de forma: int i = 0, j = 1; Dup execuia prii de ini
izare se pornete bucla propriu-zis. Aceasta const din trei instruciuni diferite exec
utate n mod repetat. Cele trei instruciuni sunt testul, corpul buclei i instruciunea
de reluare. Testul trebuie s fie o expresie boolean. Dac aceasta este evaluat la va
loarea adevrat, bucla continu cu execuia corpului, a instruciunii de reluare i din no
u a testului. n clipa n care testul are valoarea fals, bucla este oprit fr s mai fie e
xecutat corpul sau reluarea. Iat un exemplu: int x = 0; for( int i = 3; i < 30; i
+= 10 ) x += i; n aceast bucl se execut mai nti crearea variabilei i i iniializarea
steia cu 3. Dup aceea se testeaz variabila i dac are o valoare mai mic dect 30. Testu
l are rezultat adevrat (i este 0 < 30) i se trece la execuia corpului unde x primete
valoarea 3 (0 + 3). n continuare se execut partea de reluare n care i este crescut
cu 10, devenind 13. Se termin astfel primul pas al buclei i aceasta este reluat nce
pnd cu testul care este n continuare adevrat (13 < 30). Se execut corpul, x devenind
16 (3 + 13), i reluarea, unde x devine 23 (13 + 10). Se reia bucla de la test ca
re este n continuare adevrat (23 < 30). Se execut corpul unde x devine 39 (16 + 23)
i reluarea unde i devine 33 (23 + 10). Se reia testul care n acest caz devine fal
s (33 < 30) i se prsete bucla, continundu-se execuia cu prima instruciune de dup bucl
p ieirea din bucl, variabila i nu mai exist, deci nu se mai poate folosi i nu putem v
orbi despre valoarea cu care iese din bucl, iar variabila x rmne cu valoarea 39. Pe
ntru a putea declara variabila i n instruciunea de iniializare a buclei for este ne
cesar ca n blocurile superioare instruciunii for s nu existe o alt variabil i, s nu ex
iste un parametru numit i i nici o etichet cu acest nume. Dac dorim un corp care s c
onin mai multe instruciuni, putem folosi un bloc. Nu putem face acelai lucru n partea
de iniializare sau n partea de reluare. Oricare dintre prile buclei for n afar de ini
alizare poate s lipseasc. Dac aceste pri lipsesc, se consider c ele sunt reprezentate
e instruciunea vid. Dac nu dorim iniializare trebuie totui s specificm implicit instru
unea vid. Putem de exemplu s scriem o bucl infinit prin: int x; for( ;; )
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (15 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
x = 0; Putem specifica funcionarea instruciunii for folosindu-ne de o instruciune w
hile n felul urmtor: Iniializare while( Test ) { Corp Reluare ; } n fine, schema urmt
oare reprezint funcionarea unei bucle for:
Figura 5.6 Schema de funcionare a buclei for.
5.3.2.5 Instruciuni de salt Instruciunile de salt provoac ntreruperea forat a unei buc
le, a unui bloc de instruciuni sau ieirea dintr-o metod. Instruciunile de salt sunt
destul de periculoase pentru c perturb curgerea uniform a programului ceea ce poate
duce la o citire i nelegere eronat a codului rezultat.
5.3.2.5.1 Instruciunea break

Instruciunea break produce ntreruperea unei bucle sau a unui bloc switch. Controlu
l este dat instruciunii care urmeaz imediat dup bucla ntrerupt sau dup blocul instruci
nii switch.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (16 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

De exemplu n secvena: int i = 1, j = 3; int tablou[] = new int[10]; while( i < 10


) { tablou[i++] = 0; if( i == j ) break; } i += 2; sunt setate pe 0 elementele 1
i 2 ale tabloului. Dup a doua iteraie i devine 3 i testul i == j are valoarea adevra
t, producndu-se execuia instruciunii break. Instruciunea break cauzeaz ieirea forat d
bucl, chiar dac testul buclei i < 10 este n continuare valid. La terminarea tuturor
instruciunilor de mai sus, i are valoarea 5. n exemplul urmtor: int i, j = 3; int
tablou[] = new tablou[10]; do { tablou[i] = 0; if( i++ >= j ) break; } while( i
< 10 ); sunt setate pe 0 elementele 0, 1, 2 i 3 din tablou. Dac v ntrebai la ce mai f
olosete testul buclei, atunci s spunem c este o msur suplimentar de siguran. Dac cum
intr cu o valoare greit, testul ne asigur n continuare c nu vom ncerca s setm un ele
care nu exist al tabloului. De fapt, pericolul exist nc, dac valoarea iniial a lui i e
te greit, deci testul ar trebui mutat la nceput i bucla transformat ntr-un while, ca c
el de mai sus. n cazul buclelor for, s mai precizm faptul c la o ieire forat nu se mai
execut instruciunea de reluare. Instruciunea break poate avea ca argument opional o
etichet, ca n: break Identificator; n acest caz, identificatorul trebuie s fie etich
eta unei instruciuni care s includ instruciunea break.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (17 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

Prin faptul c instruciunea include instruciunea break, nelegem c instruciunea break ap


re n corpul instruciunii care o include sau n corpul unei instruciuni care se gsete n
nteriorul corpului instruciunii care include instruciunea break. Controlul revine
instruciunii de dup instruciunea etichetat cu identificatorul specificat. De exemplu
, n instruciunile: int i, j; asta: while( i < 3 ) { do { i = j + 1; if( i == 3 ) b
reak asta; } while( j++ < 3 ); } j = 10; instruciunea break termin bucla do i bucla
while controlul fiind dat instruciunii de dup while, i anume atribuirea: j = 10;
5.3.2.5.2 Instruciunea continue
Instruciunea continue permite reluarea unei bucle fr a mai termina execuia corpului
acesteia. Reluarea se face ca i cum corpul buclei tocmai a fost terminat de execu
tat. Bucla nu este prsit. De exemplu, n instruciunea: int i; while( i < 10 ) { i++; c
ontinue; i++; } corpul buclei se execut de 10 ori, pentru c a doua incrementare a
lui i nu se execut niciodat. Execuia ncepe cu testul i apoi urmeaz cu prima incrementa
re. Dup aceasta se execut instruciunea continue care duce la reluarea buclei, porni
nd de la test i urmnd cu incrementarea i din nou instruciunea continue. n exemplul ur
mtor:
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (18 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni
int i; do { i++; continue; i++; } while( i < 10 ); corpul se execut de 10 ori la
fel ca i mai sus. Instruciunea continue duce la evitarea celei de-a doua incrementr
i, dar nu i la evitarea testului de sfrit de bucl. n sfrit, n exemplul urmtor: for(
= 0; i < 10; i++ ) { continue; i++; } corpul se execut tot de 10 ori, ceea ce nse
amn c reluarea buclei duce la execuia instruciunii de reluare a buclei for i apoi a t
estului. Doar ceea ce este n interiorul corpului este evitat. Instruciunea continu
e poate avea, la fel ca i instruciunea break, un identificator opional care specifi
c eticheta buclei care trebuie continuat. Dac exist mai multe bucle imbricate una n c
ealalt buclele interioare celei referite de etichet sunt abandonate. De exemplu, n
secvena: asta: for( int i, j = 1; i < 10; i++ ) { while( j < 5 ) { j++; if( j % 2
== 0 ) continue asta; } } instruciunea continue provoac abandonarea buclei while i
reluarea buclei for cu partea de reluare i apoi testul.
5.3.2.5.3 Instruciunea return
Instruciunea return provoac prsirea corpului unei metode. n cazul n care return este u
rmat de o expresie, valoarea expresiei este folosit ca valoare de retur a metodei.
Aceast valoare poate fi eventual convertit ctre tipul de valoare de retur declarat
al metodei, dac acest lucru este posibil. Dac
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (19 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

nu este posibil, va fi semnalat o eroare de compilare. Este o eroare de compilare


specificarea unei valori de retur ntr-o instruciune return din interiorul unei me
tode care este declarat void, cu alte cuvinte care nu ntoarce nici o valoare. Inst
ruciunea return fr valoare de retur poate fi folosit i pentru a prsi execuia unui ini
zator static. Exemple de instruciuni return vei gsi n seciunea care trateaz metodele u
nei clase de obiecte.
5.3.2.5.4 Instruciunea throw

Instruciunea throw este folosit pentru a semnaliza o excepie de execuie. Aceast instr
uciune trebuie s aib un argument i acesta trebuie s fie un tip obiect, de obicei dint
r-o subclas a clasei de obiecte Exception. La execuia instruciunii throw, fluxul no
rmal de execuie este prsit i se termin toate instruciunile n curs pn la prima instru
try care specific ntr-o clauz catch un argument formal de acelai tip cu obiectul aru
ncat sau o superclas a acestuia. 5.3.2.6 Instruciuni de protecie Aceste instruciuni
sunt necesare pentru tratarea erorilor i a excepiilor precum i pentru sincronizarea
unor secvene de cod care nu pot rula n paralel.
5.3.2.6.1 Instruciunea try
Instruciunea try iniiaz un context de tratare a excepiilor. n orice punct ulterior in
iializrii acestui context i nainte de terminarea acestuia, o excepie semnalat prin exe
cuia unei instruciuni throw va returna controlul la nivelul instruciunii try, aband
onndu-se n totalitate restul instruciunilor din corpul acestuia. La semnalarea unei
excepii aceasta poate fi prins de o clauz catch i, n funcie de tipul obiectului arunc
at, se pot executa unele instruciuni care repun programul ntr-o stare stabil. De ob
icei, o excepie este generat atunci cnd s-a produs o eroare major i continuarea instr
uciunilor din contextul curent nu mai are sens. n finalul instruciunii, se poate sp
ecifica i un bloc de instruciuni care se execut imediat dup blocul try i blocurile ca
tch indiferent cum s-a terminat execuia acestora. Pentru specificarea acestor ins
truciuni, trebuie folosit o clauz finally. Iat sintaxa unei instruciuni try:
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (20 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

try Bloc1 [catch( Argument ) Bloc2]*[finally Bloc3] Dac, undeva n interiorul blocu
lui 1 sau n metodele apelate din interiorul acestuia, pe oricte nivele, este apela
t o instruciune throw, execuia blocului i a metodelor n curs este abandonat i se revin
n instruciunea try. n continuare, obiectul aruncat de throw este comparat cu argum
entele specificate n clauzele catch. Dac unul dintre aceste argumente este instan a
aceleiai clase sau a unei superclase a clasei obiectului aruncat, se execut blocul
de instruciuni corespunztor clauzei catch respective. Dac nici una dintre clauzele
catch nu se potrivete, obiectul este aruncat mai departe. Dac excepia nu este nicie
ri prins n program, acesta se termin cu o eroare de execuie. Indiferent dac a aprut o
excepie sau nu, indiferent dac s-a executat blocul unei clauze catch sau nu, n fina
lul execuiei instruciunii try se execut blocul specificat n clauza finally, dac aceas
ta exist. Clauza finally se execut chiar i dac n interiorul blocului 1 s-a executat o
instruciune throw care a aruncat un obiect care nu poate fi prins de clauzele ca
tch ale acestei instruciuni try. n astfel de situaii, execuia instruciunii throw se o
prete temporar, se execut blocul finally i apoi se arunc mai departe excepia. Exemple
de utilizare a instruciunii try gsii n paragraful 9.2
5.3.2.6.2 Instruciunea synchronized

Instruciunea synchronized introduce o secven de instruciuni critic. O secven critic d


nstruciuni trebuie executat n aa fel nct nici o alt parte a programului s nu poat af
obiectul cu care lucreaz secvena dat. Secvenele critice apar de obicei atunci cnd mai
multe pri ale programului ncearc s acceseze n acelai timp aceleai resurse. Gndii-v
mplu, ce s-ar ntmpla dac mai multe pri ale programului ar ncerca s incrementeze n ace
timp valoarea unei variabile. Una dintre ele ar citi vechea valoare a variabilei
, s spunem 5, ar incrementa-o la 6 i, cnd s o scrie napoi, s presupunem c ar fi ntrer
de o alt parte a programului care ar incrementa-o la 6. La revenirea n prima parte
, aceasta ar termina prima incrementare prin scrierea valorii 6 napoi n variabil. V
aloarea final a variabilei ar fi 6 n loc s fie 7 aa cum ne-am atepta dac cele dou incr
mentri s-ar face pe rnd. Spunem c cele dou regiuni n care se face incrementarea acele
iai variabile sunt regiuni critice. nainte ca una dintre ele s se execute, ar trebu
i s ne asigurm c cealalt regiune critic nu ruleaz deja. Cea mai simpl cale de a face a
est lucru este s punem o condiie de blocare chiar pe variabila incrementat. Ori de
cte ori o regiune critic va ncerca s lucreze, va verifica dac variabila noastr este li
ber sau nu.
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (21 of 22)12.01.2006 23:07:56

Capitolul V -- 3. Instruciuni

Instruciunea synchronized i blocheaz obiectul pe care l primete ca parametru i apoi ex


cut secvena critic. La sfritul acesteia obiectul este deblocat napoi. Dac instruciune
u poate bloca imediat obiectul pentru c acesta este blocat de o alt instruciune, ate
apt pn cnd obiectul este deblocat. Mai mult despre aceast instruciune precum i exemple
de utilizare vei gsi n partea a treia, capitolul 9. Pn atunci, iat sintaxa general a a
estei instruciuni: synchronized ( Expresie ) Instruciune Expresia trebuie s aib ca v
aloare o referin ctre un obiect sau un tablou care va servi drept dispozitiv de blo
care. Instruciunea poate fi o instruciune simpl sau un bloc de instruciuni. 5.3.2.7
Instruciunea vid Instruciunea vid este o instruciune care nu execut nimic. Ea este fol
osit uneori, atunci cnd este obligatoriu s avem o instruciune, dar nu dorim s executm
nimic n acea instruciune. De exemplu, n cazul unei instruciuni if, este obligatoriu
s avem o instruciune pe ramura de adevr. Dac ns nu dorim s executm nimic acolo, putem
losi un bloc vid sau o instruciune vid. Sintaxa pentru o instruciune vid este urmtoar
ea: ; Iat i un exemplu: int x = 3; if( x == 5 ) ; else x = 5; Caracterul ; care ap
are dup condiia din if reprezint o instruciune vid care specific faptul c, n cazul n
x are valoarea 5 nu trebuie s se execute nimic.
[capitolul V] [cuprins]
(C) IntegraSoft 1996-1998
file:///C|/Documents%20and%20Settings/Luminita/Desk...20in%20romana/Carte%20JAVA
%20in%20romana/cap53.html (22 of 22)12.01.2006 23:07:56

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