Documente Academic
Documente Profesional
Documente Cultură
Java (Programming Language)
Java (Programming Language)
Ce este Java
un limbaj de programare, ale crui caliti i-au permis rspndirea rapid, fiind n prezent unul
din limbajele cele mai larg folosite.
un mediu de execuie pentru aplicaiile Java, numit n prezent n englez "Java 2 Runtime
Environment", care conine maina virtual Java i un nucleu al bibliotecilor de clase Java;
o platform pentru dezvoltarea de aplicaii n care se folosete limbajul Java, care se numete n
prezent n englez "Java 2 Platform" i conine:
o compilatorul Java (Java Compiler);
o maina virtual Java (Java Virtual Machine);
o bibliotecile de clase Java (Java Class Libraries);
o vizualizatorul de appleturi Java (Java AppletViewer);
o depanatorul Java (Java Debbuger) i alte instrumente de dezvoltare;
o documentaia;
o tehnologie software puternic i modern, care corespunde cerinelor lucrului n reele de
calculatoare
este simplu: dei sintaxa se aseamn cu cea a limbajelor C/C++, au fost eliminate acele
aspecte care constituiau surse de erori sau produceau confuzii;
este orientat pe obiecte: n limbajul Java nu este posibil s se scrie aplicaii care nu
respect normele programrii orientate pe obiecte;
este robust: programele scrise n Java sunt foarte fiabile, deoarece sunt prevzute
numeroase verificri att la compilare, ct i n timpul executrii;
este sigur: fiind destinat lucrului n reele de calculatoare, la realizarea sistemului Java s -a
avut n vedere necesitatea ca programele s nu poat aduce daune calculatoarelor pe care
ruleaz, cum ar fi accesul neautorizat la informaie sau chiar distrugerea acesteia;
este portabil, adic programul poate fi mutat de pe un calculator pe altul, de alt tip
hardware i/sau cu alt sistem de operare;
este compilat i interpretat: programul surs, scris n limbajul Java, este translatat de ctre
compilatorul Java ntr-un program intermediar sub form de cod de octei (engleza:
bytecode). n timpul execuiei, acest cod de octei este interpretat de ctre maina virtual
Java, care conine un interpretor;
este neutru fa de arhitectur: codul de octei generat de compilatorul Java nu depinde de
arhitectura echipamentului pe care acesta va fi executat, deoarece el nu este executat direct
de ctre procesorul hardware al acestui echipament, ci este interpretat de ctre maina
virtual Java;
permite programarea concurent: n limbajul Java se pot scrie programe cu mai multe fire
de execuie (engleza: multithreading), care pot fi executate simultan i sincronizate;
este dinamic, deoarece legarea ntre ele a claselor i obiectelor nu se face static (la
compilare), ci dinamic (n momentul execuiei);
este distribuit, adic permite realizarea de programe utilizabile n reele heterogene (care
conin calculatoare de tipuri diferite);
3. Maina virtual Java -este, n general, implementat software sub forma unui produs
program adecvat calculatorului pe care acesta se instaleaz.
1
sloganul "Write Once, Run Anywhere" (scrie o singur dat i ruleaz oriunde), care arat
c un program, dup ce a fost scris i compilat, poate fi executat (rulat) pe orice calculator.
Pentru realizarea acestui obiectiv, s-a decis ca n tehnologia Java portabilitatea
programelor sa se realizeze la nivel de cod de octei (bytecode), adic sub forma de cod
binar destinat unui calculator abstract, numit maina virtual Java
Dac este realizat software (aa cum se ntampl n majoritatea cazurilor), maina virtual
Java este ea nsi un produs program, care este scris i compilat special pentru tipul de
calculator pe care se instaleaz, deci folosete setul de instruciuni nativ al acestuia. Acest
produs program trebuie s respecte specificaia mainii virtuale Java, dar realizarea concret
depinde de tipul de calculator pe care se instaleaz. Mai mult, pentru acelai calculator pot fi
realizate mai multe maini virtuale Java, care toate respecta specificaia, dar difer ntre ele prin
modul de realizare.
Implementrile moderne ale mainii virtuale Java se caracterizeaz prin mrirea sensibil a
vitezei de executie, care se apropie deja de cea a programelor compil ate. Aceasta se realizeaz,
n special, prin introducerea unei compilri "just in time": codul de octei este compilat, n
momentul execuiei, in cod nativ pentru calculatorul gazd i abia apoi este executat.
Desigur c cea mai eficient reducere a duratei de execuie se produce atunci cnd maina
virtual Java este implementata hardware, astfel nct codul de octeti Java (bztecode) este cod
nativ al acestei maini. n acest caz, durata de execuie a programului este aceeai cu cea a unui
program compilat tradiional.
Limbajul Java este folosit cel mai frecvent pentru a scrie urmatoarele trei tipuri de programe:
2
applet (miniaplicaie) - este un program care se transmite sub form de cod de octei
(bytecode) prin reeaua de calculatoare i este executat n cadrul unui navigator (browser) de
Web, fr a avea acces la fiierele sau sistemul de intrare/ieire al calculatorului pe care se
execut;
servlet - un program care se execut pe un server dein reea.
Clasa este o extensie a conceptului de tip de date i conine o structur de date, mpreun cu
metodele (functiile) care se aplica acestor date.
Obiectul este o instantiere (o instanta) a clasei. In acelasi program se pot folosi mai multe
obiecte apartinand aceleeasi clase, sau unor clase diferite. Fiecare obiect se caracterizeaza prin
stare si comportament. Starea obiectului depinde de datele pe care acesta le contine, in timp ce
comportamentul este dat de metodele clasei respective.
In general, comunicarea prin mesaje consta in invocarea de metode. Daca obiectul a invoca o
metoda a obiectului b, aceasta poate avea ca efect modificarea starii obiectului b (adica
modificarea unor date continute in structura de date a lui b) si/sau poate primi o valoare intoarsa
de metoda respectiva. Se considera ca, prin invocarea metodei, obiectul a a transmis un mesaj
obiectului b, ceeace a provocat din partea acestuia un anumit raspuns (deci b a manifestat o
anumita comportare).
Metodele statice (ale clasei) pot folosi numai variabilele statice ale clasei respective, in timp ce
metodele nestatice pot folosi atat variabilele statice, cat si pe cele ale instantei.
Din punct de vedere al modului de acces, datele si metodele unei clase pot fi publice sau
private. Cele publice sunt accesibile din orice alta clasa, in timp ce cele private sunt accesibile
numai din clasa careia ii apartin.
n prima parte a acestui curs, n aplicaiile fcute la curs i la laborator vom utiliza urmtorul
ablon:
class <nume_clasa> {
public static void main(String args[]) {
// corpul metodei main
}
}
Prile scrise cu negru (inclusiv parantezele i acoladele) le vom considera obligatorii, iar cele
scrise cursiv cu rou sunt la latitudinea programatorului.
3
<nume_clasa> - este numele clasei, fiind ales de ctre programator cu respectarea
urmtoarelor condiii:
- numele clasei trebuie s nceap cu o liter i este format numai din litere, cifre i - eventual
- liniua de subliniere;
- prin convenie (dei aceasta nu este o regul de sintax), numele de clas ncepe ntot deauna
cu o majuscul;
- n cazul numelor compuse din mai multe cuvinte, fiecare cuvnt ncepe cu majuscul;
- lungimea numelui nu este limitat, dar nu este recomandabil sa fie prea mare.
// corpul metodei main - este o succesiune de instruciuni i comentarii care respect sintaxa
limbajului Java
Pentru crearea fiierului se va folosi un editor de text simplu, care genereaz numai text
neformatat, de exemplu "Notepad" daca lucrai sub Windows sau sub Linux cu WinLinux99,
respectiv "Text Editor" sau "Advanced Editor", daca lucrai sub Linux cu KDE.
Dup ce ai dat aceast comand, vei obine unul din urmtoarele rezultate:
4
11. ERORI LA COMPILARE SI INTERPRETARE
Exemplul 1 de eroare
Considerm c, dup ce ai creat fiierul surs PrimaAplicatie.java, dai comanda
jamac PrimaAplicatie.java
n care numele compilatorului este introdus greit (jamac n loc de javac). Ca efect, vei o btine
un mesaj prin care se arat c cuvantul jamac nu este o comand corect (nu este numele unei
comenzi interne a sistemului de operare sau numele unui program executabil), de exemplu:
jamac: command not found
Exemplul 2 de eroare
S considerm acum c numele fiierului surs este introdus greit, de exemplu:
javac PimaAplicatie.java
n acest caz, mesajul de eroare este
can't read: PimaAplicatie.java
adic "nu pot citi: PimaAplicatie.java", ceeace nseamn c un astfel de fiier nu exist n
directorul curent.
Exemplul 3 de eroare
S urmrim ce se ntmpl dac introducem comanda
javac PrimaAplicatie
n care numele fiierului este corect, dar lipeste extensia. n acest caz, obtinei urmtorul mesaj:
PrimaAplicatie is an invalid option or argument.
usage: javac <options> <source files>
urmat de o lista de opiuni. Aceasta nseamn c nu s-a respectat sintaxa comenzii, care cere ca
comanda javac s fie urmat (eventual) de una sau mai multe opiuni din lista dat, dup care
trebuie s apar numele fiierului (fiierelor) surs care trebuie compilate. Aceste nume de
fiiere trebuie sa conin obligatoriu extensia java
12. iruri
irul se reprezint n program printr-o succesiune de caractere cuprins ntre ghilimele. Iat
cteva exemple de iruri:
"sir de caractere"
"ABCDefgh"
"1A23bc7"
"*+_/?"
""
Ultimul exemplu este un ir vid (care nu conine nici un caracter).
Concatenarea irurilor
5
De exemplu, expresiile urmtoare sunt echivalente, ca urmare a asociativitii:
"ABC"+"DEF"+"GH"
("ABC"+"DEF")+"GH"
"ABC"+("DEF"+"GH")
"ABCDEFGH"
Unitile lexicale, numite i lexeme (engl. token, lexeme) sunt construciile elementare ale
limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere,
care au o anumit semnificaie n limbaj. Dup rolul ndeplinit, unitile lexicale sunt:
identificatori, cuvinte cheie, cuvinte rezervate, literali, separatori,operatori, comentarii i
spaii.
16.Identificatori
Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc
identificatori. Identificatorii se aleg de ctre programator, respectnd anumite reguli.
n limbajul Java, identificatorii sunt iruri formate din litere, cifre i caractere de subliniere ('_'),
care ncep cu o liter. Lungimea identificatorului nu prezint importan, ns acesta nu poate
conine spaii libere sau alte caractere, dect cele menionate aici.
6
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float package throw
char for private throws
class goto protected transient
const if public try
continue implements return void
default import short volatile
do instanceof static while
Dintre acestea, const i goto nu sunt folosite n prezent, dar ele au fost introduse n tabela
cuvintelor cheie n vederea unei eventuale utilizri viitoare.
Observm acum c toate exemplele de cuvinte cheie date la nceputul acestei seciuni ( class,
public, static, void) sunt prezente n tabela de mai sus.
19. Literali
Literalii sunt reprezentrile n fiierele surs ale valorilor constante. Exemple de literali:
- caractere: 'a', 'A', '+', '$', '5';
- iruri de caractere: "sir de caractere", "abc$79.28#^z";
- numere ntregi: 14726, -25413;
- numere reale: 12.7389, -0.05673, 2.3075E12, -1.4237E-5;
- valori logice: true, false;
- referina nul: null.
20. Separatori
Separatorul este un caracter care delimiteaz formele sintactice sau le separ ntre ele. n
limbajul Java se folosesc urmtorii separatori:
{ } ( ) [ ] ; , .
Spaiul liber i operatorii indeplinesc, de asemenea, rolul de separatori.
Aproape toi aceti separatori au fost deja folosii n exemplele date n acest capitol.
21. Operatori
Operatorii sunt simboluri ale unor operaii. Am folosit deja simbolul + ca operator de
concatenare (deci simbol al operaiei de concatenare). Operatorul poate fi format din unul sau
mai multe caractere. Entitatea asupra creia se aplic operatorul se numete operand. Dup
numrul de operanzi, operatorii pot fi unari, binari sau ternari.
7
Din punct de vedere matematic, operatorii sunt funcii cu unul, dou sau trei argumente
(argumentele fiind operanzii). De exemplu, expresia a+b, n care + este un operator binar, iar a
i b sunt operanzi, este o funcie de argumente a si b, care are ca valoare suma valorilor celor
dou argumente.
Dup efectul operatorului asupra operanzilor, operatorii pot fi fr efect lateral, care lasa
valorile operanzilor nemodificate, i cu efect lateral, care modific valorile operanzilor. Astfel,
operatorul + din exemplul anterior, este un operator fr efect lateral. n schimb, n expresia ++a
operatorul de incrementare ++ are efect lateral deoarece, n urma efectuarii operaiei, valoarea
operandului a crete cu o unitate.
Dup cum s-a aratat deja, n fiierele surs pot fi introduse comentarii, care au rolul de a da
omului, care citete programul respectiv, anumite explicaii necesare pentru o mai buna
nelegere a acestuia. Din punct de vedere sintactic, ntregul comentariu este privit ca o singur
unitate lexical, care este ignorat de ctre compilator, deci nu are efect asupra codului de octei
generat de acesta.
23. Spaii
ntre unitile lexicale ale programului pot fi introduse orict de multe spaii libere, fr ca
acestea s aib influen asupra sintaxei sau semanticii programului. Mai multe spaii libere
succesive sunt tratate de compilator ca i cnd ar fi un singur spaiu.
24. Variabile
In matematic, variabila este un simbol dat unei valori, care aparine unei mulimi de valori ce
constituie domeniul de definiie al variabilei respective.
n programare, variabila este un nume cruia i se asociaz o valoare. Numele variabilei este un
identificator, iar valoarea variabilei trebuie s aparin unui anumit tip de date. Asupra valorilor
variabilelor pot fi efectuate prin program anumite operaii.
Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final,
care este un cuvnt cheie
8
27. Tipul de date
-este unul din conceptele fundamentale ale programrii calculatoarelor. Tipul de date este o
mulime de valori, asociat cu o mulime de operaii care se pot face asupra valorilor
respective.
n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.
n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.
28. Tipurile de date primitive sunt predefinite n limbaj. Aceasta nseamn c numele,
mulimea de valori, mulimea de operaii i tipul rezultatului operaiilor pentu fiecare tip
primitiv sunt impuse prin limbaj i, deci, nu trebuie definite i nu pot fi modificate de
programator.
tipul boolean;
tipurile numerice
o tipuri intregi: byte, short, int, long;
o tipuri reale: float si double;
o tipul char
Pentru fiecare tip de date vom arta reprezentarea extern, reprezentarea intern, operaiile i
operatorii corespunztori.
Prin reprezentare extern, nelegem regulile dup care se scriu valorile datelor respective n
programe, n documente sau pe ecranul calculatorului. Reprezentarea extern a valorii ntr -un
program se numete literal.
Prin reprezentare intern, nelegem forma sub care datele respective apar n memoria mainii
virtuale Java. O proprietate foarte important a reprezentrii interne a datelor este c aceasta,
fiind destinat mainii virtuale Java, nu depinde de calculatorul concret pe care se va executa
programul.
9
31. Operaii de atribuire compus
Urmnd tradiia limbajului C, n limbajul Java exist i operatori de atribuire compus, n care
operaia de atribuire este combinat cu una din operaiile aritmetice.
Operatorii de atribuire compus sunt urmtorii: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=.
Se observ c fiecare din aceti operatori are forma op= n care op este un operator aritmetic
binar. Expresia
variabila op= operand
n care op este un operator aritmetic binar, este echivalent cu expresia
variabila = variabila op operand
i se evalueaz astfel:
- se calculeaz mai nti valoarea expresiei (variabila op operand)n care variabila intr cu
valoarea sa anterioar;
- valoarea astfel calculat se atribuie ca noua valoare a variabilei din partea stnga. Aceasta
noua valoare este, totodat, i valoare a expresiei.
Operatorii binari nu au efect lateral - deci nu modific valorile operanzilor - i sunt dai n
tabela de mai jos.
Prin mprire ntreag nelegem mprirea fcut astfel, nct ctul sa fie un numr ntreg (fr
extragerea prii fracionare (situate dupa virgul).
Operatorii de deplasare i efectele lor sunt prezentate n tabela de mai jos, n care a i s sunt
operanzi care aparin unor tipuri ntregi.
10
Deplasarea la stnga cu s poziii este echivalenta cu nmulirea numrului cu 2 s. Dac s este
suficient de mare, poate avea loc o depire binar, la fel ca n cazul nmulirii aritmetice (cu
operatorul *).
Deplasarea biilor la dreapta cu s pozitii cu operatorul >>> are asupra numerelor pozitive acelai
efect ca cel al operatorului >>. n schimb, n cazul operanzilor negativi, n cazul operatorului
>>> nu se mai conserv semnul, iar modulul numrului se modific. Aceasta se ntmpl,
ntruct pe poziiile eliberate din partea stng se nsereaz bitul 0.
Operator Semnificatie
< mai mic dect
<= mai mic dect sau egal cu
> mai mare dect
>= mai mare dect sau egal cu
== este egal cu
!= este diferit de
Aciunea operatorilor este dat n tabela de mai jos, n care a i b sunt cei doi operanzi, iar ai si
bisunt biii de pe pozitia i a acestor operanzi. n tabel se d efectul fiecrei operaii asupra
bitului i al rezultatului.
11
36. Conversia de tip
Dac este necesar, datele pot fi convertite dintr-un tip n altul. Dup caz, conversia se poate face
implicit, sau poate fi cerut explicit prin program.
37. Conversia de tip implicit se face atunci cnd prin conversie nu se pierde informaie. De
exemplu, dac n expresia a=b variabila a este de tip int, iar b este de tip short sau byte, valoarea
variabilei b va fi automat convertit la tipul int nainte de atribuire.
n tabela de mai jos sunt indicate cu X toate conversiile de tip care se pot realiza inplicit. n
coloana din stnga este tipul datei care este supusa conversiei, iar n capul tabelei (pe prima
linie) tipul ctre care se face conversia.
De exemplu, tipul int se poate converti implicit n oricare din tipurile long, float sau double, dar
nu i n tipurile byte sau short.
38. Conversia de tip explicit se face prin operatorul unar numit cast, care are forma (tip),
adic este format din numele tipului ctre care se face conversia, cuprins ntre paranteze. Acesta
este un operator fr efect lateral, deci care nu modific valoarea operandului. De exemplu,
expresia (byte)a se va folosi pentru a converti valoarea operandului a la tipul byte. Aceasta
nseamn c valoarea variabilei a rmne neschimbat, ns valoarea expresiei (byte)a se obine
din cea a lui a prin convertirea ei la tipul byte.
Utilizarea operatorului cast se justific atunci cnd, n situaia respectiv, conversia implicit nu
este posibil. Nu este ns greit dac folosim acest operator chiar i cnd conversia respectiv
se poate face i implicit.
Sub aspect conceptual, datele care aparin acestor tipuri sunt numere, asupra crora pot fi
aplicate operaiile aritmetice (adunare, scdere, nmulire, mprire) i operaiile de comparaie
aritmetic (mai mic, mai mare, egal, diferit de).
Din punct de vedere matematic, aceste date pot fi numere ntregi sau reale. Existena mai multor
tipuri n cadrul fiecreia din aceste dou categorii se datorete particularitilor de reprezentare a
datelor n memorie.
12
40. Tipuri de date ntregi
Tipurile de date ntregi sunt byte, short, int, long i char. Conceptual, datele care aparin
tipurilor byte, short, int i long sunt numere ntregi, n timp ce tipul char conine caractere
(litere, cifre, semne de punctuaie etc).
Mulimea de valori a acestui tip este {true, false}. Ea conine cele dou valori admise de logica
boolean: true nseamn adevrat, iar false nseamn fals. Asupra datelor din acest tip pot fi
aplicate operaiile de atribuire, de comparaie (== si !=) i operaiile algebrei booleene
(operaiile logice).
Operatorii booleeni
Operatorul de negaie este un operator unar fr efect lateral i se reprezint prin simbolul !
(semnul exclamrii). Expresia !a, n care a este un operand boolean, se citete non-a i se
interpreteaz ca negaia lui a: daca a are valoarea true, atunci !a are valoarea false i invers.
Operatorii logici binari sunt operatori fr efect lateral, prin care se realizeaz operaiile logice
I, SAU i SAU-EXCLUSIV.
- Operatorii & si && realizeaza operatia logica I. Expresiile a&b i a&&b ,n care a i b sunt
operanzi de tip boolean, are valoarea true (adevrat) dac i numai dac att a ct i b au
valoarea true. n celelalte cazuri expresia are valoarea false.
- Operatorii | si || realizeaz operaia logic SAU. Expresiile a|b i a||b , n care a i b sunt
operanzi de tip boolean, are valoarea false dac i numai dac ambii operanzi au valoarea false.
n celelalte cazuri expresia are valoarea true.
- Operatorul ^ realizeaz operatia logic SAU-EXCLUSIV. Expresia a^b , n care a i b sunt
operanzi de tip boolean, are valoarea true dac i numai dac cei doi operanzi au valori diferite
(unul este adevrat, iar cellalt fals). Dac cei doi operanzi au valori identice, valoarea expresiei
este false.
13
43. Tipuri de date n virgul mobil
O caracteristic important a numerelor n virgul mobil este precizia. Se numete precizie numrul
maxim de cifre semnificative pe care l poate avea mantisa pentru tipul de date respectiv. Aceasta
depinde de numrul de bii alocai mantisei n reprezentarea intern. n cazul limbajului Java, datele
de tip float pot avea cel mult 7 cifre semnificative, iar cele de tip double cel mult 16 cifre
semnificative. n reprezentarea extern a numrului se pot folosi i mai multe cifre, dar cele care
depesc lungimea admis nu vor fi luate n consideraie la conversia din forma extern n cea intern.
n limbajul Java, reprezentarea intern a caracterelor se face pe 2 octei (16 bii), n sistemul
Unicode. In acest sistem, caracterele sunt codificate n memoria intern prin numere ntregi pozitive
n intervalul [0, 65535]. n fluxurile de date de intrare/ieire i n fiiere, caracterele pot fi reprezentate
i n alte coduri. Codul cel mai frecvent folosit n aceste scopuri este ASCII, n care reprezentarea
caracterelor se face pe un singur octet, deci prin numere ntregi fr semn n intervalul [0, 255].
Remarcm ca datele de tip char sunt singurul tip de date ntregi fr semn din limbajul Java,
mulimea de valori a acestui tip de date fiind intervalul de numere naturale [0, 65535].
14
'\n' '\u000a' trecere la linie nou (line feed, NL)
'\f' '\u000c' salt la pagina nou (form feed)
'\r' '\u000d' ntoarcerea carului (carriage return, CR)
'\"' '\u0022' ghilimele (double quote)
'\'' '\u0027' apostrof (single quote)
'\\' '\u005c' bar invers (backslash)
Datele de tip char pot fi folosite n operaii numerice, n care caz ele sunt interpretate drept numere
intregi fr semn, conform cu reprezentarea lor intern prin numere binare. Din acest motiv, n
limbajul Java datele de tip char sunt incluse n categoria celor de tipuri ntregi.
n programare, expresia este o combinaie permis ("legal", corect) de simboluri, care reprezint o
valoare. Tipul expresiei este acelai cu tipul valorii ei. Putem avea, deci, expresii de tip boolean, int,
long, float, double etc. Fiecare limbaj de programare are regulile sale, prin care se stabilete ce
expresii sunt permise sau nepermise.
n limbajul Java, expresia poate conine literali, variabile, operatori, operanzi, funcii i paranteze i
trebuie s poat fi evaluat (calculat), astfel nct s se obin o valoare.
La evaluarea unei expresii, prezinta o importan deosebit ordinea n care se aplic operatorii pe care
i conine, deoarece de aceast ordine poate s depind valoarea expresiei. n toate limbajele de
programare, n care se folosesc expresii, se stabilesc i anumite reguli de preceden i de
asociativitate, pe baza crora se stabilete ordinea de evaluare.
15
47. Expresia condiional
Urmnd "tradiia" limbajului C, n limbajul Java exist operatorul ternar (cu trei operanzi) ?: numit
operatorul condiional, care este utilizat n cadrul urmtoarei expresii condiionale:
operand1 ? operand2 : operand3
unde:
operand1 - expresie boolean;
operand2 i operand3 - expresii de tipuri compatibile: fie ambii operanzi de tip boolean, fie ambii
de tipuri numerice, fie ambii de tipuri referin.
48. Instruciuni
n limbajul Java, procesul de calcul este controlat de instruciuni (enunuri). Fiecare instruciune
indic una sau mai multe aciuni pe care trebuie s le execute calculatorul. Corpul oricrei metode
este constituit dintr-o succesiune de instruciuni. Executarea metodei const n executarea acestor
instruciuni ntr-o ordine determinat. Instruciunile pot fi grupate n blocuri.
Instruciunile simple nu conin n interiorul lor alte instruciuni. Exist trei categorii principale de
instruciuni (enunuri) simple: declaraiile de variabile locale, instruciunile-expresie i instruciunea
vid. La scrierea lor se respect urmtoarele reguli:
toate instruciunile simple se termin cu caracterul ';' (punct i virgul). Instruciunea vid
este format numai din acest caracter;
declaraiile de variabile locale servesc pentru a specifica tipul, numele i (opional) valoarea
iniial a variabilelor. Forma sintactic i utilizarea declaraiilor au fost prezentate anterior;
instruciunile-expresie sunt formate dintr-o expresie de atribuire, de
incrementare/decrementare sau de invocare de metod, urmat de caracterul ';'.
1. Teorema de structur: orice program poate fi ntocmit folosind numai trei structuri de control
fundamentale: structura secvenial, structura alternativ i structura repetitiv.
2. La conceperea programelor se recomand s se aplice tehnica de elaborare descendent (n
englez Top-Down), numit i tehnica rafinrilor succesive.
3. Domeniile de valabilitate (de vizibilitate) ale variabilelor i structurilor de date trebuie s fie
limitate.
16
50. Structura secvenial
n mod "natural", se consider c instruciunile se execut n ordinea n care acestea figureaz n
program. nlnuirea instruciunilor (transmiterea "controlului" de la o instruciune la alta) se face, n
acest caz, conform schemei logice din figura 1.
<instruciunea_1>
<instruciunea_2>
....
<instruciunea_n>
Exist, deci, un numr oarecare (n) de instruciuni, care se execut una dupa alta, n ordinea n care
sunt scrise n program.
52. Instruciunea if
Instruciunea if servete pentru realizarea structurii alternative din programarea structurat. Sub forma
ei cea mai simpl, aceast instruciune se scrie astfel:
if(expresie_boolean) instruciune
unde instruciune poate fi orice instruciune valabil n limbajul Java: instruciune simpl sau
structurat, inclusiv un bloc sau un alt if. Remarcm c n forma general de mai sus nu am pus la
sfrit caracterul ';' (punct i virgul). Dac instruciune este o instruciune simpl, ea include i acest
simbol.
Semnificaia instruciunii if este urmtoarea: dac valoarea expresiei booleene din parantez este
true, atunci se execut instruciune, iar altfel nu se execut nimic, continundu-se programul.
Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma
if(expresie_boolean)
instruciune_1
17
else
instruciune_2
Interpretarea acestui if..else este urmtoarea: dac expresie_logic are valoarea true, atunci se
execut instruciune_1, iar altfel se execut instruciune_2.
Se observ, deci, c se va executa instruciunea n mod repetat, ct timp este satisfcut condiia. n
pseudocod, aceast structur de control se programeaz astfel:
Dei, din punct de vedere al teoriei programrii structurate, ciclul cu test iniial este suficient ca
structur repetitiv, n multe limbaje de programare (inclusiv Java), din motive de comoditate a
programrii se admite i o a doua form de astfel de structur, numit ciclu cu test final. Schema
logic a acestui ciclu este dat n figura 4.
switch (expresie) {
case valoare_1: secven_1
[break;]
case valoare_2: secven_2
[break;]
..........................
18
case valoare_N: secven_N
[default: secven ]
}
n care:
- switch, case si default sunt cuvinte cheie ale limbajului Java;
- expresie este o expresie de tip byte, short, int sau char;
- valoare este fie un literal de tip byte, short, int sau char, fie o expresie constant de tip int, adic o
expresie care conine numai literali sau variabile finale din tipurile menionate;
- secvena este o secven de instruciuni simple sau structurate;
- parantezele drepte roii []nu apar n program, ci indic faptul c coninutul lor este opional (poate
sa lipseasc).
while (condiie)
instruciune
n care
condiie - este o expresie de tip boolean;
instruciune - poate fi orice instruciune (simpl sau structurat) a limbajului Java, inclusiv alt
instruciune while.
Executarea acestei instruciuni se face astfel: se evalueaz expresia boolean condiie i - dac
valoarea acesteia este true, deci condiia este satisfacut - se execut instruciune,dup care se revine
la evaluarea condiiei. acest ciclu se repet ct timp este satisfacut condiia.
n care, de regul, variabila este o variabil (de regul de tip ntreg), numit i contorul ciclului,
val_init i val_fin sunt respectiv valorile iniial i final ale acestei variabile, iar pas este pasul de
variaie la fiecare parcurgere a ciclului. Pasul implicit este 1.
n limbajul Java, urmnd tradiia limbajului C de la care acesta a preluat o bun parte a regulilor de
sintax, se folosete o instructiune generalizat, prin care se realizeaz att ciclul cu contor, ct i
ciclul cu test iniial. Aceast instruciune are forma:
n care:
19
iniializare ::= instructiune[,instructiune]*- este format din una sau mai multe instruciuni,
separate prin virgule, care se execut nainte de intrarea n ciclu, astfel c sunt folosite, de regul,
pentru iniializarea acestuia;
condiie - este o expresie de tip boolean folosit drept condiie de continuare a ciclului cu test
iniial (condiia este testata nainte de a se executa corpul ciclului;
trecere_la_pasul_urmtor := instruciune[,instruciune]* - una sau mai multe instruciuni, separate
prin virgule, care se execut dup ce a fost executat corpul ciclului. astfel c sunt, n general, folosite
pentru pregtirea trecerii la urmtoarea parcurgere a ciclului;
<instruciune_corp_ciclu> - o instruciune (simpla sau structurat) care constituie corpul ciclului.
do
instruciune
while (condiie);
unde, la fel ca n cazul instruciunii while, condiie este o expresie de tip boolean, iar instruciune este
orice instruciune (simpl sau structurat) din limbajul Java. Remarcm c la sfritul acestei
instruciuni (dup condiie) se pune obligatoriu ';' (punct i virgul).
Principala deosebire fa de instruciunea while pentru ciclul cu test iniial este c testarea condiiei
se face dup ce a fost executat instruciunea din corpul ciclului. n consecin, corpul ciclului va fi
executat cel puin o dat.
Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate
al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la
sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n
propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate.
n timpul executrii programului, pot apare anumite situaii care altereaza desfurarea normal a
acestuia. Cnd apare o astfel de situaie, de regul, se genereaz o excepie sau o eroare prin care se
semnaleaz incidentul care a avut loc. Excepiile i erorile pot fi generate att de echipamente
(excepii sau erori hardware), ct i de programe (excepii software). Exemple de excepii hardware
pot fi ntreruperile, excepia de mprire la zero, unele incidente din subsistemele de intrare/ieire etc.
Excepiile software sunt mult mai diverse, depinznd de specificul programelor care le genereaz.
Deosebirea dintre excepii i erori este c excepiile sunt considerate c pot fi tratate prin program, n
timp ce erorile sunt considerate mai curnd nerecuperabile.
n limbajul Java, exist posibilitatea de a se trata prin program diferitele excepii care apar n timpul
execuiei. n acest fel, programatorul poate s prevad ci alternative de continuare a executrii
programului, fr a mai fi necesar oprirea executrii lui. n mediul de lucru Java, la apariia unei
excepii se genereaz un obiect special numit excepie, care conine informaia despre excepia
respectiv. Acest obiect poate fi captat prin program, iar informaia coninut n el poate fi utilizat
pentru a decide calea pe care se va merge n continuare n derularea programului. Toate obiectele de
excepie care se refer la acela i tip de incident formeaz o clas de excepii.
20
Tratarea prin program a excepiilor se face, n limbajul Java, folosind instruciunea try urmat de una
sau mai multe clauze catch i, opional, de o clauz finally sub forma urmatoare:
try {
secventa
}
catch (ClasaExceptie1variabila1) {
secventa1
}
catch (ClasaExceptie2 variabila2) {
secventa2
}
...............
catch (ClasaExceptieN variabilaN) {
secventaN
}
[finally {
secventa_finalizatoare
}]
Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate
al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la
sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n
propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate.
n principiu, orice instruciune n limbajul Java poate purta o etichet. Instruciunile etichetate au
forma
etichet : instruciune
unde
etichet este un identificator;
instruciune este o instruciune simpl sau structurat.
Exemplu
alpha: x=2*a+b;
Se permite s se foloseasc drept etichete chiar i identificatori care mai sunt folosii n acelasi
program ca nume de variabile, clase, metode etc., far a se crea prin aceasta confuzii, deoarece
compilatorul face distincie ntre etichete i nume n funcie de contextul n care acestea sunt utilizate.
break [etichet];
continue [etichet];
unde etichet este eticheta unei instruciuni i este un identificator. Eticheta este opional (de aceea a
fost scris de noi ntre paranteze drepte).
21
Instructiunea break se poate folosi n corpul unei instruciuni switch, while, do..while sau for i are
ca efect ieirea forat (abrupt) din structura de control n care se gsete instruciunea respectiv.
Instruciunea continue se poate folosi numai n corpul ciclurilor (while, do..while, for). Dac
instruciunea continue nu are etichet, efectul este c se trece peste restul instruciunilor din corpul
ciclului, ncepnd din punctul n care se gsete instruciunea continue pn la sfritul acestuia, dar
se continu executarea ciclului, adic se reia executarea corpului acestuia ct timp este satisfacut
condiia de continuare.
n limbajul Java exist dou categorii de tipuri de date: tipuri primitive i clase.
Tipurile primitive sunt predefinite n limbaj, n sensul c numele, mulimea de date, mulimea de
operaii i reprezentarea datelor n memoria intern a mainii virtuale Java pentru fiecare tip sunt
definite n insi specificaia limbajului Java i nu mai pot fi modificate de programatori. n program,
datele de tipuri primitive apar sub forma de variabile.
Fiecare variabil are un nume, un tip i o valoare i este plasat ntr-o anumita locaie de memorie. n
locaia de memorie respectiv se gsete chiar valoarea variabilei. Pe programator nu il intereseaz
ins adresa de memorie la care se gsete variabila, ci doar numele, tipul i valoarea acesteia.
Clasele sunt tipuri de date structurate specifice programrii orientate pe obiecte. Clasele se definesc
de programatori i se grupeaz n pachete de clase. La crearea unui program nou, programatorul poate
utiliza clasele din pachetele deja existente, sau poate creea propriile sale clase. n program, fiecare
clas poate avea mai multe instane, numite obiecte.
Clasa este o structur de date, asociat cu o colecie de proceduri sau funcii, metode, care utilizeaz
datele din aceast structur.
Datele unei clase se numesc cmpuri, sau variabile membre. Cmpurile pot fi statice (ale clasei) sau
nestatice (ale instanei). Cnd clasa este instaniat, n memoria mainii virtuale Java se construiete
un obiect (o instan a clasei respective). Obiectul conine numai cmpuri nestatice. Cmpurile
statice se pstreaza n memorie ntr-un singur loc, care este rezervat clasei respective.
Metoda este o funcie, care ntoarce o valoare i poate avea, de asemenea, efect lateral. Ca i
cmpurile, metodele pot fi statice (ale clasei) i nestatice (ale instanei). Metodele statice pot invoc
numai cmpurile statice ale clasei respective, n timp ce metodele nestatice pot invoca att cmpurile
statice, ct i pe cele nestatice (ale unei instane a clasei respective). Dac valoarea ntoars de metod
este void, metoda respectiv este o procedur i trebuie s aib obligatoriu efect lateral.
Invocarea unei metode statice (a clasei) se face printr-o expresie de forma
nume_clasa.nume_metoda(parametri_efectivi)
a crei valoare este valoarea ntoars de funcia respectiv. O astfel de invocare de funcie poate fi
deci folosit ca o component ntr-o alt expresie. De exemplu, expresia Math.sqrt(a) serveste pentru
a calcula rdcina patrat a lui a, n care scop este invocat funcia sqrt, care este o metod static a
clasei Math (clasa funciilor matematice uzuale). Putem folosi aceast invocare de metod ntr-o
expresie mai complicat, de exemplu
x=2*Math.sin(a)+3;
Invocarea unei metode nestatice (a instanei) se face sub forma
referina_la_obiect.nume_metod(parametri_efectivi)
deci numele metodei nu mai este calificat prin (nsoit de) numele clasei, ci prin cel al variabilei
referin la obiectul respectiv, sau prin o expresie care are ca valoare o astfel de referin. De
22
exemplu, daca r1 este o variabil referin care indic un anumit obiect din memorie, iar met(a)este o
metod nestatic a clasei creia i aparine acest obiect, atunci r1.met(a) are ca efect invocarea
metodei met pentru obiectul indicat de r1. n acest fel, metoda met(a) va folosi att cmpurile
(nestatice ale) obiectului indicat de referina r1, ct i cmpurile (statice ale) clasei creia i aparine
acest obiect.
Dac o metoda are efect lateral, ea poate fi invocat i sub forma de instruciune. Aceast instruciune
const numai din expresia de invocare a metodei, urmat de punct_i_virgul. n acest caz, valoarea
ntoars de metod (valoarea expresiei) este ignorat, folosindu-se numai efectul lateral al metodei
respective. Un exemplu cunoscut deja este instruciunea
System.out.println(sir);
Este evident c metodele care ntorc void (procedurile) pot fi invocate numai sub form de
instruciuni, fiind folosite pentru efectul lor lateral.
Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte.
Ea const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i
superclas, iar clasele derivate se numesc i subclase.
Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate
cmpurile i metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm
pot exista, de asemenea, cmpuri i/sau metode suplimentare.
Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o
metod a superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai
nume i aceeasi lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un
comportament diferit.
67. Constructori
Constructorul este o procedur special, prin care se construiesc obiecte dintr-o anumit clas.
Constructorul are ntotdeauna acelai nume cu clasa. n schimb, o clas poate avea mai muli
constructori, care pot s difere ntre ei prin numrul i/sau tipul argumentelor. Constructorul aloc n
memoria dinamic spaiul necesar pentru un obiect din clasa creia i aparine i iniializeaz
cmpurile acestui obiect cu valori care depind de argumentele sale.
n general, n programarea orientat pe obiecte este permis motenirea multipl, adic o clas poate
avea mai multe superclase. n limbajul Java este permis numai motenirea simpl, deci fiecare clas
poate avea numai o singur superclas. Aceast ierarhie de clase este unic, adic orice clas are
obligatoriu o superclas i numai una. Singura excepie o constituie clasa Object, care este rdcina
ierarhiei de clase Java i nu are superclas.
Vom arata ulterior c lipsa motenirii multiple este compensat n Java prin faptul c fiecare clasa
poate avea mai multe interfee.
23
Clasele sunt grupate n pachete (englez: package). Pachetul este o colecie de clase reutilizabile
destinate unui anumit domeniu de utilizare, care sunt puse la dispoziia programatorului sub form
compilat (bytecode). Ar putea fi numit i "bibliotec de clase", dar autorii platformei Java au preferat
denumirea de pachet.
Pachetul poate avea subpachete. Daca pachetul p are subpachetul q, atunci p.q este numele complet
(numele calificat) al subpachetului q. Acest subpachet poate avea, la rndul sau, alte subpachete.
Java API (Application Programming Interface - interfaa de programare de aplicaii) este descrierea
unui set standard de pachete necesare programrii n Java. Pentru pachetele coninute n Platforma
Java 2 Standard Edition (J2SE) aceast documentaie poate fi gasit pe Internet la urmatoarea adres:
java.sun.com/products/j2se/1.3/docs/api/index.html - la firma Sun Microsystems;
Pentru clasele din pachetul java.lang nu este necesar o declaraie de import, acestea fiind importate
implicit.
Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet
nu este necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din
pachetul java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet. Noi vom
prezenta aici cteva clase mai frecvent utilizate.
Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin
la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori
referine la orice fel de obiecte, indiferent de clasa creia i aparin.
24
n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate
celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua
aciuni specifice acestor clase.
catch(Exception e) {
instructiuni_de_tratare_a_exceptiei e
}
unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori:
public Exception()
creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj.
public Exception(String s)
creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se
indic, de regul, ce incident a condus la generarea excepiei respective.
public String getName() - ntoarce numele calificat al unei entiti (clase, interfee, tip primitiv)
reprezentat de un obiect din clasa Class;
public boolean isAssignableFrom(Class cls) - ntoarce true dac clasa creia i se aplic metoda este
o superclas a clasei cls, primit ca argument;
public boolean isInterface() - ntoarce true dac metoda este aplicat unei instane a clasei Class
care reprezint o interfa;
public boolean isPrimitive() - ntoarce true dac metoda este aplicat unui obiect din clasa Class
25
care reprezint un tip de date primitiv;
public Class getSuperclass() - ntoarce o instan a clasei Class care reprezint superclasa obiectului
cruia i se aplic aceast metod.
n fiierul TestClass.java este dat un program de testare a obinerii obiectelor Class i a aplicrii unora
dintre metodele acestora.
Clasa System conine cmpuri i metode utile pentru realizarea legturii dintre aplicaie i sistemul de
execuie Java (cel care implementeaz maina virtual Java). Aceast clas nu poate fi instaniat.
77. Tablouri
Tabloul (n englez Array) este o structur de date de acelasi tip, numite componente ale
tabloului, care sunt specificate prin indici. n programare, tabloul poate fi privit ca o colecie
indexat de variabile de acelai tip.
Tabloul unidimensional este constituit dintr-un ansamblu de componente indexate (cu un singur
indice), cruia i se asociaz i o variabila de tip int numita length, care reprezint lungimea tabloului
(numrul de componente). Indicii elementelor de tablou sunt cuprini n intervalul [0, length-1].
Utilizarea unui indice situat n afara acestui interval genereaz o excepie.
ntruct tablourile sunt obiecte, pentru indicarea lor n program se folosesc variabile referin.
26
Tabloul cu N indici este considerat n limbajul Java drept un tablou de referine la tablouri cu N-1
indici. Vom exemplifica aceasta pentru cazul tabloului cu doi indici (bidimensional) i vom extinde
apoi conceptul la tablouri cu mai mult de dou dimensiuni.
Tablouri cu doi indici
Pn n prezent, s-a artat modul n care putem utiliza n programul nostru clase existente n biblioteci
(n pachetele de clase). Vom studia n continuare cum putem crea propriile noastre clase.
class NumeClasa {
declaratii_de_membri
}
Observm c declaraia ncepe cu cuvntul-cheie class, urmat de numele clasei i de corpul clasei,
cuprins ntre acolade.
Numele clasei este un identificator. Se obisnuiete ca numele clasei sa nceap cu liter majuscul.
Dac numele este compus din mai multe cuvinte, fiecare din acestea ncepe cu majuscul.
Corpul clasei cuprinde declaraii de membri ai clasei respective. Acestea pot fi:
- declaraii de cmpuri;
27
- declaraii de constructori;
- declaraii de metode.
Nu este obligatoriu ca ntr-o clas s existe toate aceste categorii de declaraii. Pot exista, de exemplu,
clase n care apar numai declaraii de metode. n principiu, pot exista i clase care conin numai
cmpuri i nu conin metode, dei astfel de situaii apar foarte rar n practic.
Cmpurile instanei se declar la fel ca variabilele locale ale metodelor, numai c declaraia
respectiv nu apare n blocul unei metode, ci n corpul clasei. De exemplu:
int m=172, n=2*m-4, r;
Aceste cmpuri pot avea valori diferite pentru fiecare instan a clasei respective. n consecin,
cmpurile instanei sunt plasate n zona de memorie rezervat instanei respective, astfel c ele sunt
distincte pentru fiecare instan.
Cmpurile clasei se numesc i cmpuri statice. Declararea unor astfel de cmpuri se face asemntor
cu cea a cmpurilor de instan, dar declaraia are n fa, n acest caz, modificatorul static. De
exemplu:
static double u=3.65, v=2.87*u-3.1, x;
La iniializarea cmpurilor de instan se pot folosi att valori ale cmpurilor statice, ct i ale altor
cmpuri de instan. n schimb, la iniializarea cmpurilor statice se pot folosi numai valori ale altor
cmpuri statice.
Cmpurile statice (ale clasei) sunt plasate n memorie n zona rezervat clasei creia i aparin i nu n
cea rezervata instanelor. n consecin, cmpurile clasei exist n memorie ntr-un singur exemplar,
care este accesibil fiecrei instane.
Valorile iniiale implicite ale cmpurilor: dac nu sunt iniializate explicit, cmpurile statice i cele
nestatice primesc valori implicite astfel:
- cmpurile booleene primesc valoarea false;
- cmpurile numerice primesc valoarea 0 (chiar i cele de tip char, care este tot tip numeric!);
- cmpurile referina primesc valoarea null.
Remarcm, deci, c exist o deosebire ntre crearea cmpurilor (variabilelor membre) i crearea
variabilelor locale. La crearea cmpurilor, acestora li se atribuie implicit o valoare iniial, n timp ce
la crearea variabilelor locale acestora trebuie sa li se atribuie valori n mod explicit. Dac o variabil
local apare ntr-o expresie fr s aib o valoare atribuit anterior, compilatorul Java semnaleaza
aceast situaie ca o eroare de programare.
n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i
metodele prin care se trateaz aceste cmpuri.
Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile
argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv.
28
n care:
tip_valoare_intoarsa - este tipul valorii primitive sau clasa valorii-referin ntoars de aceasta
metod;
nume_metoda- este un identificator care, n mod uzual, ncepe cu liter mic i constituie numele
metodei;
declaratii_de argumente - este o list de declaraii de argument separate prin virgul, deci ea poate
avea forma:
declaratie_argument1, declaratie_argument2, ... declaratie_argumentN
dar poate fi i vid. Lista declaraiilor de argument este cuprins ntre paranteze rotunde. Fiecare
declaraie de argument are forma
tip_argument nume_argument
n care
tip_argument - este tipul sau clasa argumentului respectiv;
nume_argument- este un identificator care, n mod uzual, ncepe cu liter mic.
Dup aceast list de argumente se deschide acolada unui bloc, care conine corpul metodei, adic
secvena de instruciuni prin care se calculeaz valoarea funciei respective i/sau - dac este cazul -
se efectueaz aciunile care constituie efectele laterale ale acesteia.
n aceeai clas pot exista mai multe metode cu acelai nume, cu condiia ca ele s difere prin numrul
i/sau tipul argumentelor. Pentru a deosebi ntre ele astfel de metode, s-a introdus conceptul de
signatur.
Signatura metodei const din numele acesteia, nsoit de lista de argumente. n consecin, dou
metode pot avea acelai nume, dac difer ntre ele prin signatur. Putem da exemple din clasele
existente n pachetele deja studiate.
La invocarea unei metode, este necesar s se transmit de la metoda care invoc la metoda invocat
parametrii (argumentele) acesteia. De exemplu, la executarea invocrii Math.sin(a), este necesar s se
29
transmit ctre metoda sin argumentul acesteia, a.
n teoria i practica programrii se cunosc diferite moduri n car se poate face transmiterea
argumentelor ctre o funcie sau procedur:
- transmitere prin valoare: de la programul apelant ctre funcie (procedur) se transmit valorile
argumentelor;
- transmitere prin adresa: de la programul apelant ctre funcie (procedur) se transmit adresele la
care se gsesc n memorie valorile argumentelor;
- transmitere prin nume: de la programul apelant ctre funcie (procedur) se transmit numele
argumentelor;
- transmitere prin referin: de la programul apelant la funcie (procedur) se transmit referine
ctre argumente.
n limbajul Java, transmiterea parametrilor (argumentelor) metodelor se face prin valoare. Aceasta
nseamn c:
- dac argumentul aparine unui tip de date primitiv, se transmite chiar valoarea primitiv a
argumentului respectiv;
- dac argumentul aparine unui tip-referin (este instan a unei clase), se transmite - de fapt - o
referin ctre un obiect din clasa respectiva sau dintr-o clasa derivat din aceasta.
O metod (funcie sau procedur) care se invoc pe sine nsi se numete metod recursiv. Dou
sau mai multe metode care se invoc una pe alta (metoda A invoc metoda B i reciproc) se numesc
mutual recursive. Limbajul Java permite utilizarea metodelor recursive i mutual recursive. Vom
ilustra aceasta prin exemple. Vom arta, de asemenea c, de regul, aceleai funcii pot fi calculate
att recursiv, ct i iterativ (folosind cicluri). n general, n limbajele funcionale se utilizeaz
predominant funciile recursive, n timp ce n limbajele procedurale se prefera iteraia, dei n unele
dintre ele (cum este i limbajul Java) se pot folosi att iteraia, ct i recursia.
Remarcam c, la fel ca n cazul ciclurilor iterative, n metodele recursive trebuie s existe o condiie
de oprire a repetrii. n caz contrar recursia ar continua pn la depirea spaiului de memorie alocat
pentru memorarea datelor intermediare (numit stiv).
n limba englez, throw este imperativul de la "a arunca". n aceast instruciune, se folosete
operatorul new pentru a genera un obiect al clasei de excepii creia i aparine constructorul invocat,
dup care acest obiect este "aruncat", fie pentru a fi "prins" (captat) printr-o structura try .. catch i
tratat prin program, fie pentru a fi preluat de maina virtual Java care, n acest caz, oprete execuia
programului.
30
92. Clauza throws
n mod normal, excepiile generate ntr-o metod sunt tratate prin structuri try .. catch. chiar n metoda
n care au fost generate. Este ns posibil ca metoda respectiv s "arunce" mai departe excepiile
generate n corpul ei. Pentru a indica aceast proprietate, la declararea metodei, dup paranteza care
conine lista declaraiilor argumentelor formale se pune clauza throws ClasaDeExceptii, n care se
indic numele clasei excepiei care este "aruncat" ctre metoda invocatoare (Cuvantul throws este
persoana a treia singular a verbului to throw, "a arunca").
Clasele publice sunt clase care pot fi utilizate i n alte pachete, dect cel din care fac parte.
Fiecare clas public se declar ntr-un fiier separat, care are obligatoriu acelai nume cu cel al
clasei i extensia java. n declaraia de clas, n faa numelui clasei se pune modificatorul public. Dm
n continuare ca exemplu clasa Complex.
Dac un obiect nu mai este necesar, el poate fi distrus, adic eliminat din memorie. n maina virtual
Java, exist un colector de reziduuri de memorie (englez: garbage collector) care elibereaz automat
spaiul de memorie ocupat de obiectele ctre care nu mai exist nici o referin. n consecin,
programatorul nu mai este pus n situaia s prevad explicit n program distrugerea obiectelor i, deci
clasele nu mai conin destructori, ca n alte limbaje de POO.
Aceasta metod este invocat de colectorul de reziduuri, atunci cnd acesta determin c nu mai
exist referine ctre obiectul respectiv. n clasa Object, aceast metod nu efectueaz nimic.
Metoda finalize poate fi redefinit n orice alt clas, pentru a elibera resurse sau a efectua orice alte
aciuni necesare nainte de distrugerea obiectului respectiv. De exemplu, dac obiectul respectiv a
deschis anumite fiiere sau conexiuni externe, n metoda finalize se poate efectua nchiderea lor.
Metoda finalize nu este apelat explicit n programul de aplicaie. Apelarea metodei finalize se face
numai de ctre colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rmas fr
referin, ci abia atinci cnd acest obiect a "intrat n atenia" colectorului. Este posibil ca executarea
aplicaiei s se incheie nainte ca "finalizarea" unor obiecte s aib loc.
31
n majoritatea surselor bibliografice asupra POO, se consider drept principale caracteristici ale
obiectelor ncapsularea, motenirea i polimorfismul. La acestea se mai pot adaug i alte
caracteristici importante, cum sunt identitatea, agregarea i clasificarea.
Identitatea (englez: Identity) se refer la faptul c datele sunt grupate n entiti discrete, numite
obiecte. Fiecare obiect din POO modeleaz starea i comportamentul unui anumit obiect din lumea
real, care poate fi un obiect fizic (de exemplu automobil, calculator, furnal, om, animal etc.) sau unul
conceptual (de exemplu figur geometric, orar etc.). Fiecare obiect are propria lui identitate, astfel c
dou obiecte sunt considerate distincte, chiar daca atributele lor (cum ar fi numele, culoarea etc.), sunt
identice. Pentru a face aceasta distincie, obiectul este indicat printr-o referin unic. Modul n care
este reprezentata aceast referin poate sa difere n diverse limbaje de programare (de ex. adres de
memorie, nume etc.), important ns este c fiecare obiect are o singur referin i nu exist dou
obiecte distincte cu aceeai referin.
ncapsularea (englez: encapsulation) este proprietatea obiectelor de a-i ascunde o parte din date i
metode. Din exteriorul obiectului sunt accesibile ("vizibile") numai datele i metodele publice. Putem
deci sa ne imaginm obiectul ca fiind format din dou straturi, ca n Figura 1.
Agregarea (englez: aggregation) este proprietatea obiectelor de a putea ncorpora alte obiecte. Aa
dar, "datele" coninute ntr-un obiect pot fi nu numai date primitive, ci i obiecte. Se pot astfel crea
obiecte cu structuri din ce n ce mai complexe.
Clasificarea (englez: classification) este proprietatea obiectelor care au aceeai structur de date i
acelai comportament (aceleai metode) de a putea fi grupate ntr-o clas. Clasa este o abstractizare,
care conine acele proprieti ale obiectelor, care sunt importante ntr-o aplicaie sau ntr-o categorie
de aplicaii, i le ignor pe celelalte. De exemplu, n aplicaii privind situaia profesional a
studenilor, clasa Student conine astfel de atribute ca numele i prenumele studentului, facultatea,
anul de studii, examenele promovate i notele obinute, dar ignor atribute ca nlimea, culoarea
ochilor sau a prului, greutatea etc., care nu sunt necesare n aplicaia respectiv. Spre deosebire de
agregare, care este o relaie ntre obiecte, clasificarea este o relaie ntre concepte reprezentate prin
clase.
Motenirea (englez: inheritance) este proprietatea unei clase de a conine toate atributele (cmpurile)
i metodele superclasei sale. n consecin, trecerea de la clas la subclas se face prin adugarea de
atribute i/sau de metode. De exemplu, clasa Barbat i clasa Femeie au ambele toate atributele clasei
Om, dar fiecare din acestea are i atribute specifice.
n general, n programarea orientat pe obiecte, motentirea poate fi simpl sau multipl. n cazul
motenirii simple fiecare clas are cel mult o superclas,
32
despre motenire).
Membrii privati ai claselor (cmpuri sau metode) sunt accesibili numai din clasa respectiv. Membrii
publici sunt accesibili din orice clas. Membrii protejati sunt accesibili numai din clasa n care se afl
sau din subclasele acesteia.
Dac la declararea cmpurilor sau metodelor nu se folosesc modificatori de acces, acestea sunt
considerate vizibile numai din clasele care sunt situate n acelai pachet cu clasa creia i aparin. n
particular, pentru clasele declarate de ctre noi, aceste cmpuri i metode sunt vizibile numai din
clasele situate pe disc n acelai director. Se spune, n astfel de cazuri, c modul de acces este
prietenos (englez: friendly) sau de pachet (englez: package).
Amintim c n limbajul Java orice clas are o superclas i numai una. Excepie face clasa Object,
care este rdcina ierarhiei de clase. Daca lipsete clauza extends, superclasa implicit este Object.
Este posibil, de asemenea, ca ntr-un constructor s se invoce alt constructor al aceleeai clase, sub
forma
this(lista_parametri_efectivi);
Metodele finale sunt metode care nu mai pot fi redefinite n clasele derivate. Astfel de metode se
declar cu modificatorul final. De exemplu, n clasa Object, metoda getClass este o metoda final,
fiind declarat sub forma public final Class getClass(). Aceasta inseamn c n nici o alt clas nu este
posibil ca aceasta metod s fie redefinit. Cnd declarm propriile noastre clase, avem i noi
posibilitatea s declarm c unele din metodele lor sunt finale.
33
103. Clase finale
Dac se dorete ca o clas s nu poat avea subclase, la declararea acesteia se folosete modificatorul
final. De exemplu, dac se dorea ca clasa CD1, dat ca exemplu mai sus, s fie finala, ea trebuia
declarata sub forma
public final class CD1 extends S1
sau, dac nu se dorea sa fie publica, sub forma
final class CD1 extends S1
n subclas pot fi folosite, totui, i metodele superclasei care au fost redefinite, dac la invocarea
acestor metode se foloseste referina super.
Clasa care conine metoda main este clasa principal a unei aplicaii, deci este prima clas care se
ncarc n maina virtual Java la punerea n execuie a aplicaiei respective. n acelai timp, ea este o
clas ca oricare alta, care poate avea i instane. Metoda main(), fiind static, nu poate utiliza direct
dect cmpurile statice i metodele statice ale acestei clase. Totui, n metoda main() sau n alte
metode, pot fi create instane ale acestei clase, putndu-se astfel utiliza i cmpurile i metodele de
instan ale acestora.
Clasele abstracte conin n declaraia lor modificatorul abstract. Clasele abstracte nu pot fi
instaniate. Remarcm nsa c pot exista clase care nu pot fi instaniate dei nu sunt abstracte, cum
sunt, de exemplu, clasele care nu au dect constructori privai.
Cu toate c clasa abstract nu poate fi instaniat, se pot declara variabile aparinnd unor clase
abstracte. Acestor variabile li se pot da nsa ca valori numai referine ctre instane ale unor subclase
concrete. De exemplu, daca A este o clas abstracta, iar B este o subclas concreta a clasei A, atunci
34
este corect declaraia
A a1=new B();
109. Interfee
Conform principiului ncapsulrii, fiecare clas are "interfaa" sa intrinsec, prin care poate fi accesata
din exterior. Aceasta "interfa" conine toate datele i metodele publice ale clasei respective.
Pentru a compensa lipsa motenirii multiple, n limbajul Java s-a admis c o clas poate avea mai
multe interfee i c mai multe clase pot implementa aceeai interfa. S-a introdus astfel o nou
categorie de componente, numite interfee, care se declar n mod asemntor cu nite clase abstracte,
dar nu sunt nglobate, aa cum sunt clasele abstracte, n ierarhia unic de clase .
Interfaa este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie
sa le aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe
interfee, ea conine toate metodele publice i variabilele finale publice ale acestora.
Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot
declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la
obiecte aparinnd unei clase, adic sub forma:
n care interfaa este numele unei interfee, iar celelalte elemente ale declaraiei sunt aceleai ca n
cazul declarrii de referine la obiecte. Interfeele pot fi i ele organizate ierarhic, aplicndu-se
principiul motenirii. n schimb, pentru interfee, ierarhia nu mai este unic, aa cum este n cazul
claselor, i se admite motenirea multipl.
v4=(B)w1;
Dei nu se ncadreaz n ierarhia claselor, interfeele se pot constitui in diverse ierarhii de interfee,
aplicndu-li-se principiul mostenirii. O clas poate implementa mai multe interfee.
Cel mai important avantaj al folosirii interfeelor este c mai multe clase, de pe diferite ramuri ale
arborelui ierarhic al claselor, pot fi "vzute" printr-o singur interfa. Se pot declara variabile
referin la interfa la fel cum se pot declara variabile referin la clas. Interfaa este abstract i deci
nu poate fi instaniat. n schimb, unei variabile referin la interfa i se pot atribui ca valori
referine la obiecte din orice clas care implementeaz interfaa respectiv.
35
[public] interface NumeInterfata [extends lista_superinterfete] {
declaratii_de_membri_ai_interfetei
}
Spre deosebire de clase, la care motenirea multipl este interzis (o clas poate avea numai o singura
superclas), n cazul interfeelor motenirea multipl este permis. n consecin, clauza extends
poate conine o list de nume de interfee separate prin virgule.
n limbajul Java se permite ca o clas s aib ca membri alte clase. Acestea se numesc clase imbricate
sau clase ncuibate (engleza: nested classes). Ca i ceilali membri, clasele imbricate pot fi statice sau
nestatice i se declar n corpul clasei care le ncorporeaz. Clasele imbricate nestatice se numesc
clase interioare (englez: inner classes). O clas care ncorporeaz (imbric) alte clase se declar
astfel:
Se recurge la aceasta tehnic atunci cnd utilizarea unei clase are sens numai n cadrul altei clase.
Aadar, prin imbricare se creeaz o legatur strnsa ntre dou clase. Este posibil, desigur, ca o
clasa s conin mai multe clase imbricate. Remarcm c declaraia clasei imbricate este tratata ca
oricare alta declaraie de membru al clasei, putnd avea i modificatori de cmp (de exemplu static).
Fiind membru al clasei, clasa imbricat are acces la toi membrii clasei care o conine, chiar i la cei
privai. Dac clasa imbricat este static, ea nu poate referi direct dect membrii statici ai clasei care o
conine. Clasa imbricat static exist, la fel ca i cmpurile sau metodele statice, numai n cadrul
clasei care o conine, nu i n instanele acesteia. n consecin, pentru a referi membrii acestei clase,
se folosete pentru calificare numele clasei.
Clasa interioar (clasa imbricat nestatic) are cte o instan n interiorul fiecrei instane a clasei
care o conine. n consecin, accesul la membrii ei se poate face folosind drept calificator referina la
o instan. Clasa interioar are acces la toi membrii clasei care o conine, att la cei statici, ct i la
cei de instan (nestatici).
Instantele clasei String sunt siruri de caractere. Orice literal sir in limbajul Java, de exemplu "abc",
este un astfel de obiect. Sirurile sunt constante, deci continutul lor nu poate fi modificat. Pentru a
obtine siruri modificabile se va folosi clasa StringBuffer.
36
Nota: amintim ca in limbajul Java reprezentarea interna a caracterelor se face pe 16 biti, in Unicode.
Campuri:
public static Comparator CASE_INSENSITIVE_ORDER
Campul contine un Comparator care ordoneaza obiectele-sir cand ele sunt comparate cu metoda
comparetoIgnoreCase().
Constructori:
public String()
Creeaza un sir vid.
Operatiile principale asupra unui StringBuffer sunt metodele append si insert. Fiecare din ele
converteste o data intr-un String, pe care apoi il adauga la sirul din StringBuffer sau il insereaza in
acesta pe o pozitie data.
Fiecare StringBuffer are o capacitate si o lungime. Lungimea este numarul efectiv de caractere
continute, iar capacitatea este numarul maxim de caractere care incap in zona tampon rezervata in
memorie. Daca, printr-o noua adaugare de caractere, lungimea depaseste capacitatea, atunci
capacitatea se mareste in mod automat.
Clasa Math contine metode statice pentru calcularea unor functii matematice uzuale, cum sunt
functiile trigonometrice, radacina patrata si altele.
Campuri:
public static final double PI - numarul pi (raportul dintre circumferinta cercului si diametru).
Metode:
37
public static double sin(double a)- intoarce sinusul trigonometric sin a, unde unghiul a este in radiani.
public static double cos(double a)- intoarce cosinusul trigonometric cos a, unde unghiul a este in
radiani;
public static double tan(double a)- intoarce tangenta trigonometrica tg a, unde unghiul a este in
radiani;
Interfaa utilizator, numit i interfaa om-main, este mijlocul de comunicare ntre un sistem
informatic i utilizator.
n programare, conceptul de interfa utilizator a aprut n legtur cu utilizarea programelor n regim
interactiv. Un asemenea regim permite utilizatorului s comunice cu procesul de calcul n timpul
desfurrii acestuia.
n modul de comunicare prin linie de comand, operatorul uman transmite calculatorului comenzi, pe
care le introduce de la tastatur sub forma unor linii de text, folosind un anumit limbaj de comand.
Exemplele cele mai cunoscute sunt limbajele de comand ale sistemelor de operare MS-DOS i Unix.
Interfaa utilizator grafic (englez: GUI - graphical user interface) este o interfa om-main care
permite operatorului s dea comenzi i s introduc date prin acionarea asupra unor obiecte grafice
vizualizate pe ecran: butoane, pictograme, meniuri etc.
Un avantaj important al platformei Java 2 este c ofer pachete de clase, care permit programatorului
realizarea comod i eficient a interfeelor grafice. n prezent, exist dou grupuri de pachete de clase
pentru interfee grafice, care corespund la dou principii diferite de realizare a interfeei:
1. AWT (englez: Abstract Windowing Toolkit - setul de dezvoltare de ferestre abstracte) - este un
set de clase care permit realizarea de interfee grafice n care se folosesc obiectele grafice specifice
platformei pe care se execut programul. Aceasta nseamn c, dac programul se execut - de
exemplu - sub Windows, diferitele obiecte grafice (butoane, meniuri, bare de defilare etc.) vor avea
aspectul specific sistemului Windows, n timp ce dac se executa sub X-Window vor avea aspectul
specific acestui sistem.
2. JFC (englez: Java Foundation Classes - clase de baz Java), este un set de pachete de clase,
care extind posibilitile oferite de AWT, pentru realizarea de interfee utilizator de calitate
superioar. Dintre acestea, cele mai larg folosite constituie setul cunoscut sub numele de cod Swing
(sau JFC/Swing), care ofer posibilitatea de a realiza interfee grafice al cror aspect nu depinde de
platforma pe care se execut programul.
38
115. Clasa Component
Avnd n vedere c ntreaga ierarhie de clase de obiecte de interfa utilizator grafic folosite n Java
(att cele din AWT, ct i din JFC/Swing) are ca rdcin clasa Component, este util s ncepem
studiul cu aceast clas.
Componenta este un obiect grafic care este afiabil pe ecran i poate interaciona cu utilizatorul.
Clasa Component este o clas abstract, derivat direct din clasa Object.
Dintre numeroasele metode ale acestei clase, prezentm aici numai cteva mai frecvent folosite:
public boolean isVisible() - testeaz dac aceast component este vizibil, atunci cnd este vizibil
i containerul n care se gsete;
public void setVisible(boolean visible) - face componenta sa fie vizibil sau nu, dup cum
argumentul este true sau false;
n aceste metode se utilizeaz i clasele auxiliare Point i Dimension din pachetul java.awt. Instanele
clasei Point conin coordonatele unui punct. Se consider c originea sistemului de coordonate se afl
n colul din stnga sus, axa Ox este orientat ctre dreapta, iar axa Oy este orientata n jos. Instanele
clasei Dimension conin dimensiunile componentei: limea i nlimea.
Este varianta Swing a clasei Frame din AWT, fiind o subclas a acesteia. O deosebire important ntre
cele dou clase este c, n clasa JFrame, componentele nu se mai adaug direct la fereastra (la frame),
ci la un panou coninut de aceasta, numit contentPane. O referin la contentPane se obine prin
metoda getContentPane(). Operaiile cu acest contentPane (adugarea i eliminarea de componente,
setarea gestionarului de poziionare etc) se fac folosind metodele clasei Container.
Constructori
public JFrame() - construiete un JFrame, iniial invizibil i fr titlu.
Cnd se lucreaz cu o interfa grafic, pe ecranul staiei de lucru apar diferite obiecte grafice:
ferestre, meniuri, butoane, bare de defilare etc. Operatorul poate utiliza tastatura staiei de lucru, la fel
ca n cazul progrmarii tradiionale, dar, n plus, utilizeaz un dispozitiv de selecie numit mouse, cu
ajutorul cruia poate alege diferite obiecte grafice de pe ecran i poate da anumite comenzi prin
apsarea unuia din butoanele acestui dispozitiv.
Se numeste eveniment orice modificare care are loc, fie n starea dispozitivelor de intrare, fie n cea a
obiectelor grafice de pe ecran: apsarea sau eliberarea unei taste, deplasarea mouse-ului, apsarea sau
eliberarea unui buton al mouse-ului, deschiderea sau nchiderea unei ferestre, efectuarea unui clic de
39
mouse pe un obiect de control (buton, caseta de validare, bara de defilare etc.), intrarea cursorului de
mouse n cmpul activ al unui obiect grafic sau prsirea acestuia etc. Pot exista, desigur, i alte tipuri
de evenimente, dar aici ne intereseaz numai cele legate de interfaa grafic a aplicaiei.
Interaciunea dintre operator i aplicaie ntr-un sistem bazat pe evenimente decurge astfel:
operatorul provoac generarea unui eveniment, acionnd asupra tastaturii, mouse-ului sau a altui
dispozitiv de intrare, iar programul "rspunde" la acest eveniment prin executarea unei anumite
aciuni. Acest mod de lucru impune o nou concepie n proiectarea programelor, numit
programarea orientat pe evenimente.
public Object getSource() - care ntoarce o referin ctre obiectul care a generat evenimentul
respectiv;
public String toString() - care ntoarce o reprezentare sub forma de ir a obiectului.
Orice eveniment AWT (generat de componente AWT sau JFC/Swing) conine un cmp protejat de tip
int numit id, a crui valoare indic tipul evenimentului. Toate clasele de evenimente conin cmpuri
statice finale de tip int, al cror nume indic tipul de eveniment i a cror valoare este valoarea
corespunztoare a cmpului id. Valoarea acestui cmp se poate obine prin metoda
public int getId()
Evenimentele pot fi de nivel cobort (low level event) sau semantice. Numele claselor de evenimente
de nivel cobort indic fie componenta, fie dispozitivul de intrare care le-a generat, de exemplu:
ComponentEvent, WindowEvent, MouseEvent, KeyEvent. Numele claselor de evenimente semantice
indic mai curnd tipul de eveniment, dect sursa acestuia, de exemplu: ActionEvent, TextEvent.
Descrierea claselor de evenimente este dat complet n documentaia Java API.
Exist cte o interfa de asculttor pentru fiecare clas de eveniment. De exemplu, pentru
ComponentEvent exist interfaa ComponentListener, pentru WindowEvent exista intefaa
WindowListener etc.
40
Pentru a se uura munca programatorilor, pentru unele interfee care conin mai multe metode, se
ofer i prototipuri de clase care implementeaz interfaa respectiv, numite adaptoare. De exemplu,
clasa WindowAdapter implementeaz
Evenimentele generate de fereastr sunt instane ale clasei WindowEvent i sunt ascultate de instane
ale unor clase care implementeaz interfaa WindowListener sau extind clasa WindowAdapter. Toate
aceste clase i interfee se gsesc n pachetul java.awt.event.
Pentru a se trata evenimentele generate de fereastr, este necesar s se declare o clas care
implementeaz interfaa WindowListener. n aceast clas se definesc toate metodele interfeei, astfel
nct acestea s execute aciunile adecvate evenimentelor corespunztoare.
Evenimentele de mouse sunt instane ale clasei java.awt.event.MouseEvent i sunt generate de ctre
orice component a interfeei grafice, atunci cnd asupra ei se acioneaza cu mouse-ul. Clasa
MouseEvent este derivat din clasa java.awt.event.InputEvent. Evenimentele de mouse sunt intrarea
cursorului de mouse ntr-o component sau ieirea din aceasta, apsarea unui buton de mouse sau
eliberarea lui, efectuarea unui click de mouse (simplu sau multiplu) pe suprafaa componentei,
micarea mouse-ului.
n AWT se face distincie ntre evenimentele de mouse discrete i evenimentele care caracterizeaz
micarea continu a mouse-lui.
a/ Evenimente de mouse
- a fost apsat un buton al mouse-ului (MOUSE_PRESSED);
- a fost eliberat un buton al mouse-ului (MOUSE_RELEASED);
- s-a fcut click de mouse, adic un buton al acestuia a fost apsat i eliberat imediat
(MOUSE_CLICKED);
- cursorul mouse-ului a intrat ntr-o component (MOUSE_ENTERED);
- cursorul mouse-ului a ieit din component (MOUSE_EXITED).
Ascultarea acestor evenimente se face cu instane ale claselor care implementeaza interfaa
java.awt.event.MouseListener.
b/ Evenimente de micare a mouse-ului
- mouse-ul s-a micat pe suprafaa componentei (MOUSE_MOVED);
- mouse-ul a fost "tras" pe suprafaa componentei, adic a fost micat innd un buton apsat
(MOUSE_DRAGGED).
Aceste evenimente sunt ascultate cu instane ale claselor care implementeaz interfaa
41
java.awt.event.MouseMotionListene
De cte ori se apas sau se elibereaz o tast, componenta activ a interfeei grafice genereaz un
eveniment de tast din clasa java.awt.event.KeyEvent. Acesta poate fi tratat cu un "asculttor de
taste" care implementeaz interfaa java.awt.event.KeyListener sau care extinde clasa
java.awt.event.KeyAdapter.
Se disting urmtoarele evenimente generate la acionarea tastelor:
- a fost apasat o tast (KEY_PRESSED);
- a fost eliberat o tast (KEY_RELEASED);
- a fost "tiprit" un caracter, adic a fost apasat i eliberat o tast care transmite un caracter
tipribil (KEY_TYPED).
Aceste situaii pot fi detectate cu metodele corespunztoare ale interfeei KeyListener.
Evenimentul generat de tast conine, n afar de codul tastei acionate, i informaii privind starea
tastelor auxiliare Ctrl, Alt i Shift n momentul producerii evenimentului respectiv. Aceste stri pot fi
detectate cu metodele corespunztoare ale interfeei superclasei java.awt.event.InputEvent.
Pn n prezent, am artat c, atunci cnd folosim JFC/Swing, fereastra principal a aplicaiei este o
instan a clasei javax.swing.JFrame sau a unei subclase a acesteia. Pentru a construi o interfa
utilizator grafic este necesar ca n fereastra principal s introducem diverse componente. Acestea
pot fi componente simple, ca etichete, butoane, casete de validare, cmpuri de text etc., sau pot fi
containere, care conin - la rndul lor - alte componente. Pentru realizarea acestor componente simple
i containere se folosesc clasele din pachetele java.awt i javax.swing, care sunt descrise n
documentaia Java API.
Adugarea de componente nu se face direct la instanele clasei JFrame. n JFrame exist un Container
(un obiect dintr-o subclas a clasei Container) numit contentPane, la care se pot aduga componente.
O referin la acest Container se obine prin metoda public Container getContentPane(), existent n
clasa JFrame. Adugarea de componente se face prin una din metodele add() ale clasei Container.
Dac, de exemplu, comp este referin la o component, atunci expresia getContentPane().add(comp),
folosit ntr-o metod a clasei JFrame sau a subclaselor ei, adaug componenta comp la containerul
contentPane coninut n JFrame.
42
Fiecare clas de container are un gestionar de poziionare implicit. Acesta este BorderLayout pentru
Frame i JFrame.contentPane i FlowLayout pentru clasa Panel. Modificarea gestionarului de
pozitionare se face prin metoda
public void setLayout(LayoutManager manager)
din clasa java.awt.Container.
Este posibil s se specifice modul de aliniere a componentelor: la stnga, la dreapta sau la centru.
Aceasta se face fie specificnd alinierea ca argument al constructorului, fie invocnd metoda
public void setAlignement(int align)
n care argumentul align poate fi FlowLayout.LEFT, FlowLayout.RIGHT sau FlowLayout.CENTER.
Remarcm c aplicaia ButoaneF este o modificare a aplicaiei Butoane din fiierul Butoane.java i se
deosebete de aceasta prin urmtoarele:
- n metoda main se preia un argument din linia de comand, care trebuie s fie numrul de butoane
de acionare solicitat de utilizator, dup care se construiete fereastra aplicaiei;
- s-a introdus tabloul bc[] care conine referine la instanele clasei ButonContor. Att acest tablou,
ct i butoanele respective, se creeaz n constructorul clasei IUG;
- dup adugarea butoanelor de contorizare, se adaug la fereastra aplicaiei butonul de anulare br,
din clasa JButton;
- pentru ascultarea acionrii butonului de anulare, a fost declarat clasa imbricat Anulare, care
implementeaz interfaa ActionListener.
Dei n constructor se indic att numrul de linii, ct i cel de coloane ale grilei, n realitate numai
numrul de linii este respectat, n timp ce numrul de coloane este practic ignorat. La stabilirea
43
amplasrii componentelor n container, dac numarul lor total este mai mic sau egal cu cel de linii,
toate componentele vor fi aezate vertical, una sub alta. Dac numrul de componente este mai mare
dect numrul de linii, numrul de coloane se stabilete automat, prin mprirea numrului de
componente la cel de linii, cu rotunjire n plus. Plasarea efectiv a componentelor n celulele grilei
astfel creeate se face apoi de la stnga la dreapta i de sus in jos, la fel ca n cazul gestionarului
FlowLayout, dar respectnd alinierea vertical i orizontal impus de gril.
n loc de a folosi gestionarul BoxLayout ntr-un container oarecare, se prefer s se foloseasca clasa
javax.swing.Box, care are acest gestionar implicit.
Instanele acestei clase sunt gestionari de poziionare, care plaseaz componentele n container una
peste alta, ca ntr-un pachet de cri de vizit.La un moment dat este vizibil numai componenta de
deasupra, ns componentele i pot schimba locurile ntre ele prin rotaie.
Constructori
public CardLayout() - construiete un CardLayout fr spaiu liber n jurul componentelor.
public CardLayout(int hgap, int vgap) - construiete un cardLayout care are pe margini spaiile libere
hgap pe orizontal i vgap pe vertical.
Metode
Metodele interfeelor LayoutManager i LayoutManager2, la care se adaug urmtoarele:
public void first(Container parent) - pune deasupra prima component din containerul printe
specificat.
public void next(Container parent) - pune deasupra urmtoarea component a containerului specificat.
44
public void previous(Container parent) - pune deasupra componenta precedent a containerului
specificat.componenta cu numele name din containerul specificat.
public void last(Container parent) - pune deasupra ultima component din containerul specificat.
Pentru a poziiona componentele n structuri mai complicate dect cele oferite de clasele de gestionare
a poziiei existente, se poate recurge la gruparea mai multor componente n containere auxiliare, care
se plaseaz apoi n containerul principal. Drept containere auxiliare, se folosesc cel mai frecvent
instane ale claselor java.awt.Panel, javax.swing.JPanel i javax.swing.Box.
Clasa dispune de metode statice pentru crearea de "casete" (instane ale clasei Box) orizontale sau
verticale:
public static Box createHorizontalBox()
45
public static Box createVerticalBox()
Se pot creea, de asemenea "componente invizibile" de dimensiuni fixe sau variabile, care pot fi
folosite la distanarea componentelor vizibile. n acest scop, se folosesc metodele
public static Component createRigidArea(Dimension d) - creeaza o "component ascuns" de
dimensiune fix;
public static Component createHorizontalStrut(int width) - creeaza o "component ascuns" de
lime fix, dar de nlime variabil;
public static Component createVerticalStrut(int height) - creeaza o "component ascuns" de
nalime fix, dar de lime variabil;
public static Component createGlue() - creaza o "component ascuns" cu ambele dimensiuni
variabile;un container din clasa Box, componentele pot fi amplasate numai pe o singur direcie:
orizontal sau vertical.
Pentru a realiza interfaa utilizator grafic a unei aplicaii folosind JFC/Swing, este necesar ca la
fereastra aplicaiei (din clasa JFrame) s se adauge diferite obiecte grafice numite componente.
Deosebim:
1. Componente de control: butoane, butoane radio, casete de validare, liste, liste ascunse, meniuri,
rigle ajustabile, cmpuri de text.
3. Componente de afiare editabile: zone de text, tabele editabile, selectoare de culori, selectoare de
fiiere, arbori.
46
Aspectul este dat de figura prin care este reprezentat pe ecran componenta respectiv. Fiecare clas
de componente ofer un aspect tipic al instanelor sale. n JFC/Swing programatorului i se pun nsa la
dispoziie metode i clase prin care poate modifica aspectul componentelor.
Starea componentei este dat, ca la orice obiect, de valorile cmpurilor sale. Starea se poate modifica
fie datorit aciunilor utilizatorului, fie datorit invocrii prin program a unor metode ale acesteia. n
general, la modificarea strii componenta genereaz un eveniment, iar uneori i schimb i aspectul.
Comportamentul componentei este modul n care aceasta reacioneaz atunci cnd se acioneaz
asupra ei de ctre utilizator sau cnd este invocat o metod i const n modificarea strii i a
aspectului i n generarea de evenimente.
Componentele din JFC/Swing ofer programatorului unele faciliti importante privind stabilirea
aspectului i comportamentului acestora. Iat unele ditre ele:
- posibilitatea de a introduce n component un text, o imagine, sau ambele;
- posibilitatea de a aduga la fiecare component a unui text explicativ volant (englez: Tool Tip),
care conine indicaii care apar cnd se pune cursorul mouse-ului pe componenta respectiv, fr a
apsa butonul de mouse.
- posibilitatea de a pune n jurul componentei una sau mai multe borduri (englez: Border), cu
diferite aspecte: chenar simplu, chenar cu titlu, bordur care d aspect de supranlare, bordur care
d aspect de scufundare;
- posibilitatea de a alege aspectul general al tuturor componentelor interfeei grafice (englez: Look
and Feel).
Componentele de control sunt dispozitive de intrare virtuale, uor de utilizat, prin intermediul crora
utilizatorul poate introduce anumite comenzi. Din aceast categorie fac parte butoanele, riglele
ajustabile, listele, listele ascunse, meniurile i cmpurile de text.
147. Butoane
Butoanele sunt obiecte grafice, al cror aspect este similar celor al butoanelor folosite n
aparatura electronic i electric. Acionarea butonului se face punnd deasupra lui cursorul
mouse-ului i apasnd un buton al acestuia. n JFC/Swing exist mai multe tipuri de butoane:
butonul simplu, caseta de validare, butonul radio i articolul de meniu. Toate acestea sunt
subclase ale clasei abstracte javax.swing.AbstractButton.
47
butonul radio, realizate prin subclase ale clasei ToggleButton i prezentate n continuare. O
specificare mai detaliat a clasei JToggleButton este dat n indexul de clase.
n JFC/Swing, butoanele radio sunt realizate ca instane ale clasei javax.swing.JRadioButton, care
este derivat din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa
javax.swing.ButtonGroup.
152. Liste
n cazul interfeelor utilizator grafice, se numete list o component care conine articole selectabile.
Selectarea lor se face de ctre utilizator, prin click de mouse pe articolul respectiv. Lista poate fi cu
selecie simpl sau cu selecie multipl, dup cum pot fi selectate simultan unul sau mai multe
articole.
n JFC/Swing, listele se realizeaz ca instane ale clasei javax.swing.JList. Articolele din list pot fi,
n principiu, orice obiecte afiabile. La crearea listei, constructorului i se d ca argument tabloul
obiectelor pe care le va conine lista. Ulterior este posibil s se adauge articole la list, sau s se
elimine.
Daca lista este mai lunga dect spaiul de afiare disponibil, ea poate fi pus pe un panou glisant, din
clasa javax.swing.JScrollPane.
Punerea articolelor n list poate fi fcut astfel:
- la crearea listei, folosind unul din constructorii
public JList(Object[] listData) - primete ca argument un tablou de obiecte, care sunt articolele din
list
public JList(Vector listData)- primete ca argument o instan a clasei java.util.Vector, care are ca
elemente articolele listei;
- n timpul utilizrii listei, invocndu-se una din metodele
public void setListData(Object[] listData)
public void setListData(Vector listData)
153.Liste ascunse
Lista ascuns este o list din care se vede un singur articol (cel care este selectat), deci ocupa pe ecran
spaiu mult mai putin dect una obinuit. Celelalte articole ale listei sunt "ascunse" i devin vizibile
numai dac se face click pe articolul vizibil. Dac acum facem click de mouse pe un alt articol din
lista devenit vizibil, acest nou articol este selectat (rmne vizibil), iar celelalte dispar. ntr-o list
ascuns nu este posibil selecia multipl.
Punerea articolelor n list se poate face astfel:
- la crearea listei ascunse, folosind unul din constructorii
48
public JComboBox(Object[] items)
public JComboBox(Vector items)
- n timpul utilizrii listei, folosind metodele
public void addItem(Object anObject) - adaug un articol la sfritul listei;
public void insertItemAt(Object anObject, int index) - nsereaz un articol pe poziia index.
Clasa javax.swing.JSlider ofer o component care are aspectul unei rigle prevzute cu cursor. Prin
deplasarea cursorului cu ajutorul mouse-ului se modific valoarea indicat de rigl. Valoarea minim
i cea maxim de pe scala riglei i valoarea unei diviziuni se indic prin program. Rolul riglei poate fi
asemnat cu cel al unui dispozitiv de ajustare continu, cum este poteniometrul din aparatura
electronic.
La deplasarea cursorului, rigla genereaz evenimente din clasa javax.swing.event.ChangeEvent,
care sunt ascultate cu o clas care implementeaz interfaa javax.swing.event.ChangeListener.
Crearea riglei se face folosind unul dintre constructorii ei, dintre care cel mai complet este
public JSlider(int orientation, int min, int max, int value)
n care
orientation - orientarea riglei, care poate fi JSlider.HORIZONTAL sau JSlider.VERTICAL;
min, max - valorile minim i maxim de pe scala riglei;
value - valoarea indicat iniial de cursorul riglei (trebuie s fie n intervalul [min,max]).
155. Meniuri
La fel ca listele sau butoanele radio, meniurile permit utilizatorului s aleag una din mai multe
opiuni posibile. n JFC/Swing se disting dou categorii de meniuri:
- meniuri cu bar, care pornesc dintr-o bar situat la partea superioar a ferestrei aplicaiei;
- meniuri derulante (pop-up), care apar n poziia n care se gsete cursorul de mouse.
Bara de meniu poate sa conin unul sau mai multe meniuri, care se realizeaz ca instane ale clasei
javax.swing.JMenu. La rndul su, fiecare meniu poate conine unul sau mai multe articole, care sunt
instane ale claselor javax.swing.JMenuItem sau javax.swing.JCheckBoxMenuItem. Este ns
posibil ca un articol de meniu s fie el nsui un meniu (din clasa JMenu). Dac utilizatorul alege cu
mouse-ul un aricol de meniu, sunt posibile deci dou situaii:
- acesta este un articol propriu-zis (un JMenuItem), n care caz opiunea respectiv este selectat;
49
- articolul ales este el nsui un meniu (un JMenu), n care caz noul (sub)meniu se desfoar i
cutarea continu.
Componentele de afiare sunt cele care servesc pentru a afia anumite texte sau imagini i pot fi
needitabile sau editabile.
- javax.swing.JLabel - pentru realizarea unor "etichete" n care pot fi afiate texte sau imagini, fr
a putea fi editate de utilizator;
- javax.swing.JTooltip - pentru afiarea de "inscripii volante", cnd se pune cursorul de mouse
deasupra unei alte componente;
- javax.swing.JProgressBar - pentru realizarea unor "bare de progres" adic a unor bare de lungime
variabil, care arat cum evolueaz realizarea unei anumite activiti (de la 0% la 100%).
50
162. Utilizarea ferestrelor de dialog
Ferestrele de dialog sunt ferestre care se afieaz pe ecran numai temporar, pentru a transmite anumite
mesaje sau a permite introducerea unor date. Principalul avantaj al folosirii ferestrelor de dialog este
c apar pe ecran numai atunci cnd sunt necesare i nu ncarc fereastra principal a aplicaiei cu
elemente care nu sunt necesare n permanen.
n JFC/Swing, ferestrele de dialog se realizeaz folosind clasa javax.swing.JDialog. Instanele
acestei clase se comport asemanator cu cele ale clasei JFrame, permind adugarea oricror
componente. La fel ca la JFrame, aceste componente nu se adaug direct la fereastr, ci la panoul
contentPane coninut n aceasta i obinut prin metoda public Container getContentPane().
Pentru afiarea pe ecran a ferestrei de dialog se invoc metoda public void show(), iar pentru
ascunderea ei se invoc metoda public void hide(). n fine, pentru a elimina fereastra de dialog,
elibernd toate resursele pe care le folosete, se invoc metoda public void dispose(). Aceste trei
metode sunt motenite de JDialog de la superclasa java.awt.Dialog. Cnd fereastra de dialog este
deschis, ea trece n prim plan sau n plan secund mpreun cu proprietarul ei.
Ferestrele de dialog pot fi modale sau nemodale. Cnd este afiat pe ecran o fereastr modal, toate
celelalte ferestre existente pe ecran sunt blocate (nu se poate aciona asupra lor), pn cnd se ncheie
lucrul cu fereastra de dialog modal respectiv.
163.Clasa Color
Clasa Color ncapsuleaz informaiile despre culoare. n Java AWT se folosete modelul de culori
RGB (englez: red, green, blue) n care fiecare culoare este considerat ca fiind compus din trei
culori fundamentale: rou, verde i albastru. n consecin, culoarea este dat prin trei numere
cuprinse n intervalul [0, 255], reprezentnd ponderile celor trei culori fundamentale. n figura de mai
jos este reprezentat schema de combinare a acestor trei culori fundamentale.
Clasa Color conine i un al patrulea cmp, numit alpha, care poate avea, de asemenea, valori ntregi
n intervalul [0..255] i exprima opacitatea culorii respective. Daca alpha=255, culoarea este complet
opaca. Aceasta nseamn c, dac o figur cu aceast culoare se suprapune peste alta, o mascheaz
complet. Dac alpha=0, culoarea este complet transparent, deci practic invizibil. ntre aceste valori
extreme putem avea diferite opaciti intermediare, cuprinse intre 0 si 255.
Culoarea n sistemul RGB poate fi exprimat nu numai printr-o instan a clasei Color, ci i printr-un
numr ntreg (de tip int), n care cei patru octei au, respectiv, valorile componentelor alpha, r, g, b
exprimate n intervalul [0..255]. Componentele sunt plasate astfel: alpha n biii 24..31, r n biii
16..23, g n biii 8..15 i b n biii 0..7.
Clasa Color conine, de asemenea, constructori i metode care suport sistemele de culori sRBG i
HSB. Standardul sRGB definete o variant standardizat a sistemului RGB, destinat monitoarelor
cu tub catodic. n acest sistem, parametrii r, g, b i alpha se exprim prin numere reale n intervalul
[0.0...1.0].
51
164. Alegerea culorii folosind clasa JColorChooser
Pentru a alege culoarea n mod interactiv, n JFC/Swing este prevazut clasa
javax.swing.JColorChooser. Instanele acestei clase sunt panouri de selectare a culorii, care pot fi
folosite att prin ncorporarea lor ntr-o fereastr obinuit, ct i sub forma unei ferestre de dialog.
Pentru a creea o fereastr de dialog, care conine n ea un JColorChooser i ntoarce culoarea
selectat, n clasa JColorChooser exist metoda
public static JDialog createDialog(Component c,String title, boolean modal, JColorChooser
chooserPane, ActionListener okListener, ActionListener cancelListener)
n care:
- c este componenta beneficiar (owner) a ferestrei de dialog create;
- title este titlul ferestrei de dialog create;
- argumentul boolean modal indic dac fereastra este modal;
- chooserPane este instana clasei JColorChooser care se ntroduce n fereastra de dialog;
- okListener si cancelListener sunt asculttoarele de aciune care reacioneaza la apsarea butonului
OK, respectiv Cancel al selectorului de culoare.
Java API ofera programatorilor posibiliti ample privind realizarea de desene, text stilizat i alte
construcii grafice. Ne vom rezuma aici numai la cteva noiuni elementare, utile n realizarea unor
aplicaii grafice simple.
In principiu, desenarea se poate face pe orice component grafic. Exist ns clasa java.awt.Canvas,
ale crei instane sunt simple panouri destinate desenrii (n englez Canvas este pnza pictorului).
Pentru desenare se mai folosesc frecvent i clasele JPanel i JLabel.
Sistemul de coordonate folosit pentru grafic are originea n colul din stnga sus al componentei,
axa Ox este orientat catre dreapta, iar axa Oy este orientat n jos. Coordonatele se exprim n
numere ntregi (int), avnd ca unitate de msur pixelul (punctul de pe ecran).
52
- fontul curent;
- operaia logic pe pixeli curent (XOR sau paint);
- alternarea curent de culori pentru operaia pe pixeli XOR
Fluxul este un concept situat pe un nivel nalt de abstractizare, fiind privit ca o simpl succesiune
de octei sau de caractere care se transmite ntre surs i destinaie. Nu prezint importan nici
natura sursei sau a destinaiei, nici modul n care trebuie interpretat secvena de octeti sau de
caractere respectiv. De exemplu, un grup de 32 de octei transmii ntre surs i destinaie
poate s reprezinte 32 de caractere ASCII sau 16 caractere Unicode sau 8 numere de tip int sau
4 numere de tip double etc. Aceast abstractizare permite s se trateze n mod unitar toate
tipurile de transmisii de date.
Se disting doua feluri de fluxuri: de ieire i de intrare. Pentru un proces dat, toate fluxurile transmise
de acesta ctre exterior se numesc fluxuri de ieire, iar cele primite din exterior se numesc fluxuri de
intrare. n consecin, acelai flux este de ieire n raport cu sursa i de intrare n raport cu destinaia.
Programatorului procesului surs i revine obligaia de a pregti, sub forma unei succesiuni de
caractere sau de octei, datele care urmeaz a fi transmise pe fluxul de ieire. Interpretarea i tratarea
datelor coninute n flux se face de ctre procesul de destinaie, deci ntreaga responsabilitate i revine
celui care programeaz acest proces. Desigur c este necesar ca interpretarea datelor din flux la
destinaie s corespund cu cea de la surs. Programarea operaiilor de intrare/ieire poate fi destul de
complicat, dar n limbajul Java ea este totui uurat de existena unui numr destul de mare de clase
cu aceast destinaie, grupate n pachetul java.io.
53
169. Clasa Reader
Clasa abstract java.io.Reader este rdcina ierarhiei de clase de fluxuri de intrare de caractere.
Metode:
public int read() throws IOException - citete din fluxul de intrare un singur caracter; ntoarce
caracterul citit (n domeniul 0 .. 16383) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce
blocarea procesului n care este invocat, pn cnd apare un caracter n fluxul de intrare;
public int read(char[] cbuf) throws IOException - citete din flux o secven de caractere i le
depune ntr-o zon tampon (buffer) constituit din tabloul de caractere cbuf; ntoarce numrul de
caractere citite sau -1 dac s-a atins sfritul de fiier; metoda produce blocarea procesului pn cnd
apar caractere n fluxul de intrare, sau se ajunge la sfrit de fiier;
public abstract int read(char[] cbuf, int off, int len) throws IOException - acioneaz asemntor cu
metoda precedent, dar depunerea caracterelor citite n zona tampon de destinaie se face ncepnd de
la poziia off (offset), iar numrul maxim de caractere citite este len;
public long skip(long n) throws IOException - se sare peste n caractere din fluxul de intrare, care
nu vor fi citite; procesul apelant este blocat pan cnd apare cel puin un caracter n fluxul de intrare;
dac se ntlnete sfritul de fiier, se genereaz o excepie de intrare/ieire; ntoarce numrul de
caractere srite efectiv;
public boolean ready() - ntoarce true dac fluxul de intrare este gata pentru a putea fi citit;
public void mark(int readAheadLimit) throws IOException - marcheaz poziia curent n fluxul de
intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de
caractere care vor putea fi ulterior citite din flux,fr ca acest marcaj s se piard; excepia de
intrare/ieire apare dac fluxul nu suport marcarea sau dac se produce alt eroare de intrare/ieire;
public boolean markSupported() - indic dac fluxul suport marcarea;
public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia
corespunztoare ultimului marcaj; dac fluxul nu a fost marcat sau nu suport resetarea, se genereaz
o excepie de intrare/ieire;
public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea
metodelor read(), ready(), mark() sau reset pentru acest flux va genera o excepie de intrare/ieire.
Metode:
54
Metode:
public int read() throws IOException - citete din fluxul de intrare un singur octet; ntoarce octetul
citit (in domeniul 0 .. 255) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce blocarea
procesului n care este invocat, pn cnd apare un octet n fluxul de intrare;
public int read(byte[] buf) throws IOException - citete din flux o secven de octei i i depune
ntr-o zon tampon (buffer) constituit din tabloul de octei buf; ntoarce numrul de octei citii sau -1
dac s-a atins sfritul de fiier; metoda produce blocarea procesului pn cnd apar octei n fluxul de
intrare, sau se ajunge la sfrit de fiier;
public abstract int read(byte[] buf, int off, int len) throws IOException - acioneaz asemntor cu
metoda precedent, dar depunerea octeilor citii n tabloul de destinaie byte[] se face ncepnd de la
poziia off (offset), iar numrul maxim de octei citii este len;
public long skip(long n) throws IOException - se sare peste n octei din fluxul de intrare, care nu
vor fi citii; procesul apelant este blocat pn cnd apare cel puin un octet n fluxul de intrare; dac se
ntlnete sfritul de fiier se genereaz o eroare de intrare/ieire; ntoarce numrul de octei srii
efectiv;
public int available() throws IOException - ntoarce numrul de octei disponibili pentru citire n
fluxul de intrare;
public void mark(int readAheadLimit) throws IOException - marcheaz poziia curenta n fluxul de
intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de octei
care vor putea fi ulterior citii din flux, fr ca acest marcaj s se piard; excepia de intrare/ieire
apare dac fluxul nu suport marcarea sau dac se produce alt eroare de intrare/ieire;
public boolean markSupported() - indic dac fluxul suport marcarea;
public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia
corespunztoare ultimului marcaj; dac fluxul nu a fost marcat sau nu suporta resetarea, se genereaz
o excepie de intrare/ieire;
public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea
metodelor read(), ready(), mark() sau reset() pentru acest flux va genera o excepie de intrare/ieire.
Metode:
public void write(int c) throws IOException - scrie n fluxul de ieire ultimul octet al numrului c;
public void write(byte[] buf) throws IOException - scrie n fluxul de ieire octeii coninuti n
tabloul buf;
public abstract void(byte[] buf, int off, int len) throws IOException - scrie n fluxul de ieire len
octei din tabloul buf, ncepnd de la poziia off (offset);
public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat
ntr-o zon tampon anumii octei scrii cu metodele write(), aceti octei sunt scrii efectiv n fluxul
de destinaie; dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se
"descarc" ntregul lan de fluxuri;
public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a
metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.
55
mod independent, ci adaug altui flux de ieire (de octei sau, respectiv, de caractere) capacitatea de
formatare a datelor n vederea tipririi.
Metode:
Aceasta clas conine metodele clasei java.io.OutputStream, la care se adaug urmtoarele metode
specifice, destinate scrierii n fluxul de ieire a datelor primitive sau a unor iruri de caractere:
56
176. Clasa DataInputStream
Un DataInputStream este un flux de intrare de octei care este conectat la intrare la un alt
InputStream i citeste din acesta date primitive ntr-o form independent de platform. Se pot citi cu
DataInputStream numai date care au fost scrise cu DataOutputStream.
Constructor:
public DataInputStream(InputStream in) - creeaz un flux de date de intrare, care citete date din
fluxul de intrare in, primit ca argument.
Metode:
Aceasta clas conine toate metodele clasei java.io.InputStream, la care se adaug urmtoarele
metode specifice, prin care se implementeaz interfaa java.io.DataInput:
public final void readFully(byte[] b) throws IOException - citete din fluxul de intrare un numr de
octei egal cu lungimea tabloului b, primit ca argument, i i pune n acest tablou. Dac n fluxul de
intrare nu sunt nca suficieni octei, dar nu s-a atins sfritul de fiier, procesul este pus n ateptare
pn apar noi octei. Dac se ntlnete sfritul de fiier (EOF - End of File), se genereaz o
EOFException;
public final void readFully(byte[] b, int off, int len) throws IOException - acioneaz similar cu
metoda precedent, dar se citesc len octei, care sunt depui n tabloul b, ncepand de la poziia off;
public final void skipBytes(int n) throws IOException - sare peste n octei din fluxul de intrare;
ntoarce numrul de octei srii efectiv (este posibil s nu reueasc s sar n octeti, de exemplu dac
a ntalnit sfritul fluxului);
public final boolean readBoolean() throws IOException - citete un octet din fluxul de intrare i l
convertete n valoare boolean;
public final byte readByte() throws IOException - citete din fluxul de intrare un singur octet, pe
care l trateaz ca un numr ntreg cu semn n intervalul [-128, 127]; se consider c a fost scris cu
writeByte(byte v);
public final int readUnsignedByte() throws IOException - citete din fluxul de intrare un singur
octet, pe care l trateaz ca numr ntreg fr semn n intervalul [0, 255] i l ntoarce sub form de
int;
public final short readShort() throws IOException - citete doi octei din fluxul de intrare i i
interpreteaz ca un numr de tip short, scris anterior cu writeShort(short v);
public final int readUnsignedShort() throws IOException - citete din fluxul de intrare doi octei, pe
care i interpreteaz ca numr ntreg fr semn i-l ntoarce sub form de int;
public final char readChar() throws IOException - citete din fluxul de intrare un char (doi octei,
format Unicode);
public final int readInt() throws IOException - citete patru octei si i interpreteaz ca un numr de
tip int scris cu writeInt(int v);
public final long readLong() throws IOException - citeste opt octei si i interpreteaz ca un numr
de tip long, scris cu writeLong(long v);
public final float readFloat() throws IOException - citete patru octei si i interpreteaz ca un
numr de tip float, scris cu writeFloat(float v);
public final double readDouble() throws IOException - citete opt octei si i interpreteaz ca un
numr de tip double, scris cu writeDouble(double v);
public final String readUTF() throws IOException - citete un ir de caractere n format UTF (care
a fost scris cu writeUTF(String str));
Fluxurile de obiecte sunt fluxuri de prelucrare care permit s se transmit obiecte. n acest scop,
obiectele transmise trebuie s fie serializate, nainte de a fi transmise, adic s fie puse sub forma
57
unei serii de octeti, ntr-un format care s permit la destinaie reconstituirea n memorie a obiectului
respectiv. Astfel de obiecte se numesc serializabile.
Interfaa Serializable nu conine cmpuri sau metode. Clauza implements Serializable constituie doar
o indicaie pentru compilatorul Java s o pun sub forma serializabil.
181. Fiiere
n memoria extern a calculatorului, datele se pstreaz sub forma de fiiere. Fiierul (englez: File)
este o colecie de nregistrri situat, de regul, pe un suport extern i identificat printr-un nume.
Fiecare nregistrare (englez: Record) este o grupare de informaii sau de date care poate fi tratat n
mod unitar.
58
Dup formatul nregistrrilor, distingem fiiere de text i fiiere de date.
n fiierele de text, fiecare nregistrare este o linie de text, adic un ir de caractere care se termin
cu un marcaj de trecere la linie nou. Acest marcaj depinde de platform. De exemplu, n fiierele
MS-DOS marcajul de sfrit de linie este format din secvena de caractere "\r\n", adic din caracterul
de ntoarcere la cap de linie (Carriage Return, '\r' ) i caracterul de linie nou (New Line, '\n'), care au
codurile ASCII 0x0D i respectiv 0x0A. Pe platforme Unix, marcajul de sfrit de linie este constituit
numai din caracterul '\n' (New Line, 0x0A). Liniile textului pot avea lungimi diferite. Codificarea
caracterelor n fiier depinde, de asemenea, de platform. n prezent, pentru fiierele de text se
folosete cel mai frecvent codul ASCII, dar pot exista i platforme pe care se folosete Unicode sau o
alt convenie de codificare.
n fiierele de date, nregistrrile au, de regul, lungime predefinit, iar fiecare nregistrare este
constituit din mai multe cmpuri de date. n principiu, toate nregistrrile unui fiier de date au
acelai format. Prin formatul nregistrrii se nelege descrierea structurii acesteia, care const din
specificarea cmpurilor de date pe care le conine, a lungimii fiecrui cmp, a tipului de date coninut
n fiecare cmp i a modului de reprezentare a datelor. Datele din cmpuri pot fi reprezentate fie sub
forma lor extern, fie sub form binar, iar formatul nregistrrilor difer de la un fiier la altul.
Dup modul de exploatare, fiierele pot fi de intrare, de ieire sau de intrare/ieire (de manevr). n
cazul fiierelor de intrare, din momentul deschiderii fiierului i pn n momentul nchiderii acestuia
se pot efectua numai operaii de citire. n cazul fiierelor de ieire, ntre momentele de deschidere i
de nchidere a fiierului respectiv se pot face numai operaii de scrieire. Desigur ns c, dup ce s-a
ncheiat scrierea ntr-un anumit fiier de ieire i acesta a fost nchis, el poate fi deschis ca fiier de
intrare. Acelai fiier poate fi citit de mai multe ori. Fiierele de intrare/ieire permit ca, dup ce au
fost deschise, s se efectueze att operaii de scriere, ct i de citire.
Dup modul de acces fiierele pot fi cu acces secvenial sau cu acces direct. Fiierele cu acces
secvenial se caracterizeaz prin faptul c nregistrrile lor pot fi parcurse ntr-un singur sens, n
ordinea n care acestea sunt plasate n fiier. n cazul fiierelor cu acces direct, numite i fiiere cu
acces aleator (englez: random access file) ordinea de parcurgere a nregistrrilor din fiier este
arbitrar, n sensul c la fiecare operaie de intrare/ieire fcut asupra fisierului respectiv se poate
indica adresa sau numrul de ordine al nregistrrii care va fi citit sau scris.
Se tie c, pe diferite platforme, calea se reprezint n moduri diferite. De exemplu, n sistemul Unix,
calea relativa "../../alpha/beta/fisier1.txt" indic faptul c, pornind de la directorul curent, se face o
deplasare ctre rdcin cu doua directoare, dup care se merge nainte (ctre frunzele arborelui
director) trecnd la subdirectorul alpha i de aici la subdirectorul beta, n care se gsete fiierul
cutat cu numele fiier1.txt. Remarcm c separarea directoarelor se face prin caracterul '/' (slash). Pe
platformele firmei Microsoft (MS-DOS, Windows), ca separator se folosete caracterul '\'
(backslash), care n limbajele C i Java se reprezint sub forma '\\'. n consecin, aceeai cale relativ
se va scrie pe o astfel de platforma sub forma "..\\..\\alpha\\beta\\fisier1.txt".
n clasa File, reprezentarea cii se face sub o form independent de platform. n acest scop, n
instanele clasei File, calea se pstreaz sub forma unui tablou de iruri de caractere, n care se
memoreaza numele fiecrui director coninut n cale. Separatorul se pstreaz ntr-un cmp separat i
59
este setat automat n funcie de sistemul de operare al calculatorului pe care se execut programul. n
acest fel, portabilitatea programului crete, ntruct nu trebuie modificate cile fiierelor folosite n
program atunci cnd se trece de pe o platform pe alta
Metode:
Clasa FileReader nu are metode proprii, dar motenete urmtoarele metode ale clasei
InputStreamReader:
public int read() throws IOException - citete din fluxul de intrare un singur caracter i-l ntoarce
convertit n int;
public int read(char[] buf, int off, int len) throws IOException - citete din fluxul de intrare cel mult
len caractere, pe care le pune n tabloul buf ncepnd de la poziia off (offset);
public boolean ready() throws IOException - verific dac fluxul de intrare este gata pentru citire
(dac conine caractere care pot fi citite);
public void close() throws IOException - nchide fluxul de intrare;
public String getEncoding() - ntoarce numele canonic al codului folosit pentru caractere.
60
Metode:
Metodele clasei FileWriter sunt motenite de la clasa OutputStreamWriter.
Fiierele cu acces direct, numite i fisiere cu acces aleator (engl.: Random Access File), sunt fiiere la
care programatorul poate indica prin program locul (adresa) din fiier de la care ncepe operaia de
citire sau de scriere. De regul, astfel de fiiere pot fi utilizate att pentru citire, ct i pentru scriere.
Pentru ca nregistrrile sale s poat fi parcurse ntr-o ordine arbitrar, fiierul cu acces direct trebuie
s fie stocat pe un suport adresabil, cum ar fi discul magnetic, discul optic, memoria RAM sau ROM.
n JDK, fiierele cu acces direct sunt instane ale clasei RandomAccessFile.
Fiierul cu acces direct este privit aici ca un tablou de octei memorat ntr-un sistem de fiiere (de
regul n memoria extern). Exist un cursor al fiierului (numit n englez File Pointer), care se
comport ca un indice al acestui tablou. Valoarea acestui indice (poziia cursorului de fiier relativ la
nceputul acestuia) poate fi "citit" cu metoda getFilePointer() i poate fi modificat cu metoda
seek(). Orice citire sau scriere se face ncepnd de la poziia pe care se gsete acest cursor. La
sfritul operaiei, cursorul se deplaseaz pe o distan corespunzatoare cu numarul de octei care au
fost citii sau scrii efectiv.
Fiierul cu acces direct poate fi deschis n modul read (numai pentru citire), write (numai pentru
scriere) sau read/write. n ultimul caz, este posibil s se efectueze att citiri , ct i scrieri.
n general, se numete proces o succesiune de transformri sau de operaii care conduce la realizarea
unui anumit rezultat.
Esenial pentru un proces este caracterul su temporal: fiecare transformare elementar necesit un
anumit timp, iar procesul n ansamblu este o succesiune de astfel de transformri elementare.
Termenul este folosit n domenii diferite: procese fizice, procese chimice, procese tehnologice,
procese biologice, procese economice, procese sociale, procese juridice etc
61
intern n care se pstreaz datele programului, acces la procesorul sistemului, acces la anumite
dispozitive de intrare/ieire etc. Procesul const tocmai n efectuarea n timp a succesiunii de operaii
prevzut n program, folosind n acest scop resursele alocate.
n mod tradiional, programul este executat de ctre un singur procesor (dispozitiv de prelucrare), care
poate efectua, la un moment de timp dat, numai o singur operaie. n consecin, operaiile prevzute
n program trebuie executate secvenial, astfel nct operaia urmtoare nu poate ncepe dect dup
ncheierea celei precedente. Toate programele prezentate de noi n capitolele precedente se ncadreaz
n aceast categorie.
Majoritatea sistemelor de operare ale calculatoarelor moderne permit executarea n acelai timp a mai
multor programe, deci permit concurena proceselor la nivel de program (de aplicaie). De exemplu, n
timp ce editm un text, putem tipri alt text la imprimant, putem atepta sosirea de pe reea a unei
pagini de Web etc. Studierea acestui mod de funcionare a calculatorului, cunoscut sub numele de
multitasking, se face la cursul de "Sisteme de operare".
Pentru a pune n eviden distincia ntre program i proces, putem meniona c acelai program poate
da natere la procese diferite: dac programul conine ramificaii i/sau cicluri, parcurgerea efectiv a
acestora (ce ramuri vor fi executate efectiv i de cte ori se vor parcurge ciclurile) depinde de datele
de intrare. n cadrul multitaskingului, este chiar posibil ca doi utilizatori s utilizeze simultan acelai
program folosind date diferite, astfel nct se genereaz procese diferite.
Firul de execuie (n englez: Thread) este, n esen, un subproces strict secvenial. Meninnd
definiia procesului ca un program n curs de execuie, putem considera acum c procesul este format
din mai multe fire de execuie care se deruleaz n paralel, concurnd la utilizarea resurselor alocate
procesului respectiv.
n limbajul Java, exist posibilitatea de a se crea programe care conin mai multe fire de execuie.
Aceasta nseamn c, la executarea lor, se vor crea mai multe subprocese care se vor desfura
simultan, folosind acelai procesor i aceeai zon de memorie. Acest mod de funcionare se numete
n englez multithreading.
Crearea unui fir de execuie se face invocnd unul dintre constructorii clasei Thread. Dintre acetia,
i menionm aici pe urmtorii:
public Thread() - creeaz un nou fir de execuie cu numele implicit Thread-n, unde n este un numr
de ordine;
public Thread(String name) - creeaz un nou fir de execuie cu numele name;
public Thread(Runnable target) - creeaz un nou fir de execuie, care conine obiectul target cu
interfaa Runnable, iar numele firului este cel implicit;
62
public Thread(Runnable target, String name) - creeaz un nou fir de execuie, care conine obiectul
target cu interfaa Runnable i are numele name.
La programarea unui fir de execuie, principala atenie se acord metodei run(), deoarece ea conine
programul propriu-zis, care trebuie executat de acest fir. Totui, metoda run()nu este invocat explicit.
Ea este invocat de maina virtual Java, atunci cnd firul respectiv este pus n mod efectiv n
execuie.
Pentru redefinirea metodei Run este necesar sa creem o subclas a clasei Thread sau sa creem o clas
cu interfaa Runnable, i s dm o instan a acestei clase ca argument constructorului clasei Thread.
Dup ce firul de execuie a fost creat (de exemplu prin expresia new Thread()), el exist n memorie,
dar nca nu poate fi executat. Se gsete, deci, n starea "nou creat" (engleza: born). Pentru a-l face
gata de execuie, pentru firul respectiv este invocat metoda start().
Avnd n vedere cele de mai sus, punem n eviden urmatoarele stri n care se poate gsi un fir de
execuie pe durata ciclului su de via:
- nou creat (englez: born) - este starea n care se gsete imediat ce a fost creat prin operatorul
new; n aceast stare, firul nu poate fi executat;
- gata de execuie (englez: ready) - este starea n care firul poate fi pus n execuie; punerea
efectiv n execuie se face de ctre maina virtuala Java atunci cnd procesorul este liber i nu sunt
gata de execuie fire de prioritate superioar;
- n execuie (englez: running) - este starea n care procesul se execut efectiv (ocup procesorul);
- adormit (englez: sleeping) - este starea de oprire temporar, ca urmare a invocrii metodei
sleep();
- blocat (englez: blocked) - este starea n care ateapt incheierea unei operaii de intrare/ieire;
- n ateptare (englez: waiting) - este starea n care firul se gsete din momentul n care se invoc
metoda wait(), pn cnd primete o confirmare dat prin invocarea metodei notify();
- mort (englez: dead) - este starea n care intr firul de execuie dupa ce s-a ncheiat executarea
metodei run().
Interfaa java.lang.Runnable trebuie implementat de orice clas care nu este descendent a clasei
java.lang.Thread, dar ale crei instane trebuie tratate ca nite fire de execuie. Singura metod a
acestei interfee este
public void run()
care are acelai rol cu cea din clasa Thread.
Necesitatea implementrii interfeei Runnable apare atunci cnd dorim s creem o clasa de fire de
execuie care nu extinde clasa Thread. Motivul ar putea fi, de exemplu, cel c clasa nou creat, B,
trebuie sa extind o alta clas, A, care nu este descendent a clasei Thread Se tie c n Java nu
exist motenire multipl, deci clasa B nu poate avea ca superclase att clasa A, ct i clasa Thread.
n acest caz, vom crea o clas B care extinde clasa A i implementeaza interfaa Runnable, care
conine metoda run().
Utilizarea instanelor claselor cu interfaa Runnable se face, punndu-le ca argumente ale urmtorilor
constructori ai clasei Thread:
public Thread(Runnable target)
public Thread(Runnable target, String name)
O instan a clasei Thread creat cu un astfel de constructor, se comport ca i cum ar fi instana unei
extensii a clasei Thread care ar conine metoda run() a obiectului target cu interfaa Runnable.
63
192. Sincronizarea firelor de execuie
n limbajul Java, sincronizarea firelor de execuie se face prin intermediul monitoarelor. Se numete
monitor instana unei clase care conine cel puin o metod sincronizat, sau o metod care conine un
bloc sincronizat. Se numete metod sincronizat orice metod care conine n antetul su
modificatorul synchronized, deci este declarat sub forma
Cnd un fir ncepe executarea uni metode sincronizate a unui monitor, el devine "proprietarul"
monitorului cruia i aparine aceast metod (englez: owner) i deine aceast calitate pn la
ncheierea executrii metodei sincronizate respective, sau pn cnd se autosuspend invocnd
metoda wait(), aa cum vom explica ulterior. Pe toata durata ct un fir de execuie este proprietarul
unui monitor, nici un alt fir nu poate invoca o metod sincronizat a monitorului respectiv. Aa dar,
orice fir care, n acest interval de timp, ar ncerca s invoce o metod sincronizat a unui monitor al
crui proprietar este alt fir, trebuie s atepte pn cnd monitorul respectiv este eliberat de
proprietarul existent.
n acest fel, se evit situaiile n care un fir de execuie ar interveni s fac modificri asupra unui
obiect, n timp ce acesta se gsete deja n curs de prelucrare de ctre un alt fir. De exemplu, dac un
fir de execuie efectueaz ordonarea datelor dintr-un tablou, nu este corect ca un alt fir, n acest timp,
s modifice datele din acest tablou.
64