Documente Academic
Documente Profesional
Documente Cultură
Limbajul Java Carte in Limba Romana
Limbajul Java Carte in Limba Romana
Cuprins
Cuvnt nainte Introducere
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
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
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 ++).
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
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
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.
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
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
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.
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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.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
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
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
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.
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.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
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
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()
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
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
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
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
.
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
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.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
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
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 V -- 1. Variabile
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
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
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.
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.
Capitolul V -- 1. Variabile
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];
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.
Capitolul V -- 1. Variabile
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.
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.
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
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: >>, <<, >>>
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
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
Capitolul V -- 3. Instruciuni
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
&=, |=, ^= ^
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
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
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
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
Capitolul V -- 3. Instruciuni
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
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
Capitolul V -- 3. Instruciuni