Sunteți pe pagina 1din 49

Ce este Java

Java este un limbaj de programare cu larga utilizare ce permite sa scriem aplicatii indifferent de domeniul
de utilizare.

Caracteristici ale limbajului Java


-simplu-are o sintaxa asemnatoare cu C++ dar simplificat prin numarul de date primitive
-s-a introdus tipul de date Boolean
-s-a introdus clasa string
-s-au eliminate pointerii
-s-a renuntat la supraincarcarea operatorilor
-limbajul este strict tipizat
-nu se mai foloseste mostenirea multipla ci doar simpla
-nu mai sunt destructori
-administrare automata a memoriei
-este orientate pe obiecte
-portabilitatea

Maina virtual Java


-este implementata software
-pe fiecare calculatr trebuie sa avem o masina virtual pentru a rula programe java
-ea este un calculator abstract care se ocupa cu incarcarea claselor, organizarea memoriei, conventiile de
reprezentare a datelor in memorie, managementul memoriei tip, verificarea codului de octeti

Tipuri de produse software scrise in Java


aplicaie - este un produs software care se instaleaz pe un anumit calculator i funcioneaz direct sub
controlul sistemului de operare, avnd acces la toate resursele calculatorului respectiv. Una din clasele
aplicaiei trebuie sa conin metoda principal , cu care ncepe execuia aplicatiei.
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.

Introducere n programarea orientat pe obiecte


Programarea orientat pe obiecte (POO) este o form de programare, n care programatorii definesc clase de
obiecte, iar programul conine un ansamblu de clase i obiecte, care comunic ntre ele prin mesaje.
Clasa este o extensie a conceptului de tip de date i conine o structur de date, mpreun cu metodele
(functiile) care se aplica acestor date.
Obiectul este o instantiere (o instanta) a clasei. In acelasi program se pot folosi mai multe obiecte apartinand
aceleeasi clase, sau unor clase diferite. Fiecare obiect se caracterizeaza prin stare si comportament. Starea
obiectului depinde de datele pe care acesta le contine, in timp ce comportamentul este dat de metodele clasei
respective.
Atat variabilele, cat si metodele pot fi statice sau nestatice.
Variabilele statice (ale clasei) apartin clasei, adica au aceeasi valoare pentru toate obiectele clasei respective.
Variabilele de instanta (nestatice) apartin obiectului (instantei), deci au valori diferite de la un obiect la
altul.
Metodele statice (ale clasei) pot folosi numai variabilele statice ale clasei respective, in timp ce metodele
nestatice pot folosi atat variabilele statice, cat si pe cele ale instantei.

Din punct de vedere al modului de acces, datele si metodele unei clase pot fi publice sau private. Cele
publice sunt accesibile din orice alta clasa, in timp ce cele private sunt accesibile numai din clasa careia ii
apartin.

ablonul unei aplicaii simple in limbajul Java

class <nume_clasa> {
public static void main(String args[]) {
// corpul metodei main
}
}

Editarea fiierului sursa


De exemplu, clasa PrimaAplicatie va fi editat sub forma unui fiier de text cu numele PrimaAplicatie.java.
Este preferabil s punei acest fiier ntr-un subdirector separat. De exemplu puteti crea un subdirector numit
javaLab, n care s creai un alt subdirector numit sapt1, n care sa punei fiierul PrimaAplicatie.java.

Compilarea si eliminarea erorilor semnalate de compilator


Translatarea programului surs n program sub forma de cod de octei (bytecode) se face cu ajutorul
compilatorului Java, numit javac. n acest scop, va deplasai n subdirectorul n care se gsete programul
surs pe care dorii s-l compilai i dai comanda
javac <fisier_sursa>
Dup ce ai dat aceast comand, vei obine unul din urmtoarele rezultate:

1.

Pe ecran apare din nou promptul sistemului de operare, fr a se afia un mesaj de eroare. n acest
caz, compilarea a decurs normal, iar dac dai comanda dir vei constata ca n subdirectorul curent a
aprut un nou fiier, care poart numele clasei i extensia class. Acesta este fiierul care conine
bytecode-ul clasei compilate.

2.

Obinei un mesaj de eroare, care indic fie c exist erori n program, care au fost sesizate de
compilator, fie c exist erori n linia de comand prin care ai cerut compilarea. n ambele cazuri,
este necesar s eliminai erorile i s reluai compilarea.
Executarea aplicatiei

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

iruri de caractere
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).

Operaii asupra irurilor de caractere


Concatenarea
Asupra irurilor se poate aplica operaia de concatenare, reprezentata prin operatorul +. Expresia ir1+ir2,
n care operatorul + este plasat ntre dou iruri, are ca rezultat un nou ir, care conine cele dou irurioperanzi puse unul dup altul. De exemplu, expresia
"abcde"+"fgh"
d ca rezultat irul "abcdefgh".

Metode pentru afiarea pe ecran a irurilor


n capitolul precedent, am folosit deja pentru afiarea irurilor de caractere metoda
System.out.println(<ir>)
la care vom aduga acum i metoda
System.out.print(<ir>)
n ambele metode, argumentul <ir> este un ir de caractere, care se afieaza pe ecran. Deosebirea dintre ele
const n faptul c, dup afiarea irului, metoda println transmite i comanda de trecere la linie nou, n timp
ce metoda print nu transmite o astfel de comand. n consecin, n cazul afirii cu println, urmtoarea
afiare se va face de la nceput de linie nou, iar la afiarea cu print afiarea urmtoare se va face n
continuare, pe aceeai linie.

Unitile lexicale ale limbajului Java


Unitile lexicale, numite i lexeme (engl. token, lexeme) sunt construciile elementare ale limbajului
("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumit
semnificaie n limbaj. Dup rolul ndeplinit, unitile lexicale sunt: identificatori, cuvinte cheie, cuvinte
rezervate, literali, separatori,operatori, comentarii i spaii

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.

Cuvinte cheie
n orice limbaj de programare, exist un set de cuvinte, numite cuvinte cheie, care sunt considerate
simboluri sintactice i nu pot fi folosite n program ca identificatori.
n limbajul Java, exist urmtoarele cuvinte cheie :
abstract

double

int

strictfp

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.

Cuvinte rezervate
Se consider cuvinte rezervate acele cuvinte, care nu pot fi folosite ca identificatori, avnd semnificaii
speciale. Cuvintele cheie sunt i ele considerate n majoritatea limbajelor, inclusiv Java, drept cuvinte
rezervate. n afar de acestea, n limbajul Java exist urmatoarele cuvinte rezervate: true, false, null.
Primele dou sunt valorile logice adevrat i fals, iar al treilea are semnificaia de referin nul. De fapt,
aceste cuvinte rezervate sunt forme speciale de literali.

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.
Am subliniat faptul c literalul este forma sub care o anumita valoare este reprezentat n fiierul
surs, deci n programul scris n limbaj de nivel superior (n cazul nostru n limbajul Java). Vom arta

ulterior c forma de reprezentare a acelorai valori n memoria intern a calculatorului (forma intern)
este diferit de cea extern. Vom reveni asupra regulilor de scriere a literalilor cnd vom prezenta
tipurile de date din limbajul Java.

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.

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.

Dup numrul de operanzi deosebim:


operatori unari, care se aplic unui singur operand, de ex. operatorul - n expresia -x; utilizarea
operatorului unar se face, de regula, sub forma "prefix" operator operand, n care operatorul se pune n faa
operandului; uneori ns se foloseste i forma "postfix"
operand operator
n care operatorul se pune dup operand;
operatori binari, care se aplic asupra a doi operanzi, operatorul fiind situat ntre acetia; de ex.
operatorul de concatenare + n expresia "acesta este " + "un exemplu" sau operatorul de adunare a dou
numere + n expresia 17+28.Operatorii binari se folosesc sub forma "infix"
operand1 operator operand2
n care operatorul este situat ntre cei doi operanzi;
operatori ternari, care se aplic asupra a trei operanzi; n limbajul Java exist un singur operator ternar
( ?:)folosit n expresiile condiionale. Operatorul ternar se scrie sub forma
operand1 ? operand2 : operand3
n care operand1 are o valoare logic (true sau false), iar ceilalti doi operanzi sunt expresii aritmetice sau
logice (dar de acelai tip).
Din exemplele de mai sus, observm c semnificaia unui operator poate s depind de context, ca n cazul
operatorului +, care a fost folosit att pentru operaia de concatenare a irurilor, ct i pentru cea de adunare
a numerelor.

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.

Comentarii n fiierul surs


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.

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

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.
Valoarea variabilei trebuie s fie reprezentat n memoria calculatorului la o anumit adres i s
ocupe acolo un anumit spaiu (un anumit numr de bii). n consecin, numim variabil o zon de
memorie care poarta un nume i care conine o anumit valoare, apartinnd unui tip de date .
Programatorul care folosete un limbaj de nivel nalt, cum este i limbajul Java, nu trebuie s cunoasc
adresa de memorie, la care este plasat valoarea variabilei, i nici reprezentarea intern a acesteia, fiind
suficient s-i cunoasca numele i tipul. Alocarea de spaiu n memorie pentru fiecare variabil se face,
dup caz, de ctre compilator sau interpretor. n schimb, numele i tipul variabilei trebuie declarate de
ctre programator.
Remarcm c n matematic operaiile cu variabile se fac, de cele mai multe ori, la nivel abstract,
asupra simbolurilor variabilelor i nu asupra valorilor acestora. De exemplu, n identitatea a+a=2.a nu
are importana ce valoare are variabila a, egalitatea fiind ntotdeauna adevarat.
n programare se are n vedere faptul c, att timp ct ea exista n memorie, variabila are ntotdeauna
o valoare (deoarece zona de memorie aferent nu poate fi vid), iar operaiile se fac asupra valorilor
variabilelor i nu asupra numelor acestora.

Declararea si iniializarea variabilelor


n limbajul Java, orice variabil trebuie declarat nainte de a fi utilizat . Prin declararea variabilei se
nelege precizarea, pentru compilator, a tipului i numelui acesteia. Iniializarea variabilei se face
atunci, cnd acesteia i se d pentru prima dat o valoare i deci i se aloc spaiu n memorie. Dac, la
declararea variabilei, aceasta nu este i iniializat n mod explicit, atunci ea este iniializata cu o
valoare implicit, care va fi specificat la descrierea fiecrui tip.
Remarcam c:

declaraia de tip este o instructiune care se termin obligatoriu prin simbolul ; (punct i virgul);

este posibil ca, ntr-o singur declaraie, s apar mai multe variabile; n acest caz, specificaiile
variabilelor respective sunt separate prin virgule;

indicarea valorii variabilei este opional.

n declaraia de tip, valoarea iniial a variabilei poate fi dat sub forma unui literal sau a unei expresii. n
ultimul caz, este necesar ca expresia s fie calculabil, deci toate variabilele pe care le conine s aiba deja
valori date anterior.
Prin convenie, n limbajul Java numele de variabile ncep ntotdeauna cu liter mic . Este permis ns ca, n
interiorul numelui, sa existe i litere mari. Aceasta se ntampl atunci cnd numele variabilei este format din
mai multe cuvinte ale limbii naturale, de exemplu vitezaMedie.

Variabile finale
n limbajul Java, se numesc variabile finale acele "variabile", ale cror valori nu pot fi modificate prin
program. Acestea sunt deci, de fapt, nite constante cu nume. Ele se aseamn cu variabilele propriuzise prin faptul c sunt tot perechi nume - valoare, numai c valoarea lor se d o singur dat, sub
forma de iniializare n declaraia de tip sau sub forma de atribuire, dup care nu mai poate fi
modificat. Se obinuiete ca numele de variabile finale s fie scrise n ntregime cu majuscule.
Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final, care
este un cuvnt cheie.

De exemplu, declaraia
final int ALPHA=17, BETA=-1453;
servete pentru a specific faptul c ALPHA i BETA sunt variabile finale de tip int, ale caror valori sunt,
respectiv, 17 si -1453 i nu mai pot fi ulterior modificate (deci ALPHA i BETA sunt, de fapt, nite
constante).

Tipuri de date
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.

Tipuri de date primitive


Tipurile de date primitive sunt predefinite n limbaj. Aceasta nseamn c numele, mulimea de valori,
mulimea de operaii i tipul rezultatului operaiilor pentu fiecare tip primitiv sunt impuse prin limbaj i, deci,
nu trebuie definite i nu pot fi modificate de programator.
Tipurile de date primitive n limbajul Java se clasific astfel:

tipul boolean;

tipurile numerice
o

tipuri intregi: byte, short, int, long;

tipuri reale: float si double;

tipul char

Operaia de atribuire simpl


Operaia de atribuire se poate aplica tuturor tipurilor de date, deci i celor numerice. n expresia
variabil = expresie
daca variabila din partea stng aparine unuia din tipurile numerice, atunci valoarea expresiei din partea
dreapt trebuie sa fie, de asemenea, numeric i s aib un tip compatibil cu cel al variabilei din partea
stng. Prin tip compatibil nelegem fie acelai tip cu cel al variabilei din stnga, fie un tip numeric care
poate fi convertit implicit la acesta.
Dac tipul operandului din dreapta este numeric, dar nu se convertete implicit la cel din stnga, se poate
folosi conversia de tip explicit prin operatorul cast. n acest caz, ns, exist pericolul ca valoarea s se
altereze prin conversie.
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.

Operaia de comparare
Comparaiile sunt operaii binare fr efect lateral , n care se compar dou numere, obinndu-se ca
rezultat o valoare de tip boolean. Operatorii prin care se efectueaz comparaia a dou numere se
numesc operatori relaionali i sunt dai n tabela de mai jos.

Operator

Semnificatie

<

mai mic dect

<=

mai mic dect sau egal cu

>

mai mare dect

>=

mai mare dect sau egal cu

==

este egal cu

!=

este diferit de

Operaii aritmetice
Operaiile aritmetice sunt cele care se aplic unor operanzi numerici, avnd ca rezultate tot numere.
Dup numrul de operanzi, ele pot fi unare sau binare. Unele operaii aritmetice unare au i efect
lateral.
Tipul rezultatului operaiilor aritmetice depinde de tipul operanzilor i va fi discutat la fiecare din
tipurile numerice n parte.
n exemplele de expresii din aceast seciune, vom considera c a i b sunt doi operanzi numerici .
n limbajul Java exist urmtorii operatori aritmetici:
Operatori unari fr efect lateral:

Operator

Exemplu de expresie

Valoarea expresiei

+a

aceeai cu valoarea operandului

-a

valoarea operandului cu semn schimbat

Operatori unari cu efect lateral


Operatorii de incrementare ++ i decrementare -- au ca operanzi variabile numerice. Operatorul de
incrementare ++ are ca efect lateral creterea cu o unitate a valorii variabilei-operand, iar operatorul de
decrementare -- are ca efect lateral micorarea cu o unitate a acestei valori. Acest efect are loc
indiferent dac operatorul este plasat naintea operandului sau dup acesta. n schimb, poziia
operatorului fa de operand are importan la stabilirea valorii expresiei rspective. Daca operatorul
este plasat n fata operandului, operaia de incrementare sau decremantare are loc nainte de a se stabili
valoarea expresiei; dac, ns, operatorul este plasat dupa operand, valoarea expresiei se stabilete
nainte de a se face incrementarea sau decrementarea. Efectul operaiilor este prezentat n tabelul de
mai jos.

Operator

Expresie

Operatie

Valoarea expresiei

Efect lateral

++

++a

preincrementare

a+1

valoarea variabilei a creste cu 1

++

a++

postincrementare

valoarea variabilei a creste cu 1

--

--a

predecrementare

a-1

valoarea variabilei a scade cu 1

--

a--

postdecrementare

valoarea variabilei a scade cu 1

Operatorii logici binari


Operatorii binari nu au efect lateral - deci nu modific valorile operanzilor - i sunt dai n tabela de
mai jos.

Operator

Expresie

Operatie

Valoarea expresiei

a+b

adunare

suma valorilor operanzilor

a-b

scadere

diferenta valorilor operanzilor

a*b

inmultire

produsul valorilor operanzilor

a/b

impartire

catul (rezultatul impartirii) primului operand la al doilea

a%b

modulo

restul impartirii intregi a primului operand la al doilea

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

Operatorii logici binari


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.

Operatii de deplasare binara


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

Operator

Expresie

Efect

<<

a<<s

deplasare la stnga cu s poziii binare

>>

a>>s

deplasare la dreapta cu s poziii binare, cu conservarea semnului

10

>>>

a>>>s

deplasare la dreapta fr semn, cu s poziii binare

Expresii cu date primitive


n programare, expresia este o combinaie permis ("legal", corect) de simboluri, care reprezint o
valoare. Tipul expresiei este acelai cu tipul valorii ei. Putem avea, deci, expresii de tip boolean, int,
long, float, double etc. Fiecare limbaj de programare are regulile sale, prin care se stabilete ce expresii
sunt permise sau nepermise.
n limbajul Java, expresia poate conine literali, variabile, operatori, operanzi, funcii i paranteze i
trebuie s poat fi evaluat (calculat), astfel nct s se obin o valoare.

Precedenta operatorilor

La evaluarea unei expresii, prezinta o importan deosebit ordinea n care se aplic operatorii pe care i
conine, deoarece de aceast ordine poate s depind valoarea expresiei. n toate limbajele de programare, n
care se folosesc expresii, se stabilesc i anumite reguli de preceden i de asociativitate, pe baza crora se
stabilete ordinea de evaluare.
Fiecrui operator i se asociaz o preceden, adic un nivel de prioritate n aplicarea operatorului respectiv.
De exemplu, n expresia a+b*c operatorul * se va aplica naintea operatorului +, deoarece are precedena
superioar. n consecin, aceasta expresie se va calcula ca i cnd ar fi scris sub forma a+(b*c).
n limbajul Java, la stabilirea ordinii operaiilor se aplica urmtoarele reguli:
- operatorii unari se aplic naintea celor binari;
- expresiile din interiorul parantezelor se evalueaz naintea celor din exterior;
- dac, ntr-o expresie, toi operatorii au acelai nivel de preceden, ei se aplic de la stnga la dreapta;
- operanzii unui operator se evalueaza nainte de a se aplica operatorul respectiv (deci operatorul se aplic
ntotdeauna asupra valorilor operanzilor si); dac operaia este binar, operandul din partea stng se
evalueaz naintea celui din partea dreapt;
- nivelul de preceden al operatorilor se stabilete conform cu tabela de mai jos, n care:

toi operatorii din aceeai celul a tabelei au acelai nivel de preceden;

operatorii de pe un nivel superior se aplic naintea celor de pe nivelurile inferioare.


Expresia conditionala
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;

11

operand2 i operand3 - expresii de tipuri compatibile: fie ambii operanzi de tip boolean, fie ambii de
tipuri numerice, fie ambii de tipuri referin.
Evaluarea expresiei decurge astfel:
- se evalueaz operand1 obinndu-se o valoare boolean;
- dac operand1 are valoarea true, atunci valoarea expresiei condiionale este cea care se obine
evalund operand2; altfel, este cea care se obine evalund operand3.

Instruciunea
n limbajul Java, procesul de calcul este controlat de instruciuni (enunuri). Fiecare instruciune indic una
sau mai multe aciuni pe care trebuie s le execute calculatorul. Corpul oricrei metode este constituit dintr-o
succesiune de instruciuni. Executarea metodei const n executarea acestor instruciuni ntr-o ordine
determinat. Instruciunile pot fi grupate n blocuri.
Dup structura lor, instruciunile pot fi simple sau structurate.
Instruciunile simple nu conin n interiorul lor alte instruciuni. Exist trei categorii principale de
instruciuni (enunuri) simple: declaraiile de variabile locale, instruciunile-expresie i instruciunea vid. La
scrierea lor se respect urmtoarele reguli:
toate instruciunile simple se termin cu caracterul ';' (punct i virgul). Instruciunea vid este
format numai din acest caracter;
declaraiile de variabile locale servesc pentru a specifica tipul, numele i (opional) valoarea iniial
a variabilelor. Forma sintactic i utilizarea declaraiilor au fost prezentate anterior;
instruciunile-expresie sunt formate dintr-o expresie de atribuire, de incrementare/decrementare sau
de invocare de metod, urmat de caracterul ';'.
Not pentru programatorii n alte limbaje
n limbajul Java, declaraiile de variabile locale sunt considerate instruciuni executabile, deci ele au efect
la executarea programului.
n majoritatea limbajelor compilate, declaraiile de variabile locale sunt luate n consideraie numai la
compilare, deci sunt considerate instruciuni neexecutabile. n limbajul Java declaraiile sunt, de asemenea,
luate n consideraie de compilator, care verific dac declaraia este corect sintactic i, de asemenea,
verific la fiecare apariie a unei variabile locale n programul surs dac:
- variabila respectiv a fost declarat;
- tipul variabilei corespunde contextului n care este folosit variabila respectiv;
- variabila are deja o valoare.

Principiile programrii structurate


Programarea structurat este o orientare n conceperea i alctuirea programelor, avnd ca obiectiv o
mai bun gestionare a complexitii acestora, innd cont de particularitile gndirii umane.
Conform metodei programrii structurate, la conceperea unui program, este recomandabil s se respecte
urmtoarele principii:

12

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.
n limbajul Java, pentru rezolvarea problemei realizrii creterii eficienei muncii programatorilor s-a
adoptat concepia modern a programrii orientate pe obiecte. In consecin, modulele de program sunt
mici i rolul programrii structurate este sensibil redus. Totui, fiecare metod din limbajul Java este
un mic program, la elaborarea cruia se aplic principiile programrii structurate , ceeace s-a avut n
vedere i la adoptarea instruciunilor de baz oferite de acest limbaj. Este deci util ca i programatorii
n Java sa cunoasc principiile fundamentale ale programrii structurate.

Structura secveniala
Blocul este o secven de instruciuni cuprins ntre acolade. Forma sintactic a blocului este, deci,
urmtoarea:
{
secven_de_instruciuni
}
unde secven_de_instruciuniconst dintr-un numr oarecare de instruciuni succesive, putnd fi i
vid. Instruciunile din aceast secven pot fi att simple, ct i structurate, inclusiv alte blocuri.
Din punct de vedere al programrii structurate, blocul este realizarea structurii de control secveniale.
Aceasta inseamn c instruciunile dintr-un bloc se execut una dupa alta, n ordinea n care ele sunt
scrise n program. Tocmai de aceea se i folosete termenul secven de instruciuni pentru a indica ce
conine blocul.

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.

Instructiunea if .. else
Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma
if(expresie_boolean)
instruciune_1
else
instruciune_2

13

n care instruciune_1 i instruciune_2 pot fi instruciuni simple sau structurate.


Interpretarea acestui if..else este urmtoarea: dac expresie_logic are valoarea true, atunci se execut
instruciune_1, iar altfel se execut instruciune_2.

Instructiunea switch

n limbajul Java, structura de comutare se realizeaz prin instruciunea switch, care are urmtoarea
form general:
switch (expresie) {
case valoare_1: secven_1
[break;]
case valoare_2: secven_2
[break;]
..........................
case valoare_N: secven_N
[default: secven ]
}
n care:
- switch, case si default sunt cuvinte cheie ale limbajului Java;
- expresie este o expresie de tip byte, short, int sau char;
- valoare este fie un literal de tip byte, short, int sau char, fie o expresie constant de tip int, adic o
expresie care conine numai literali sau variabile finale din tipurile menionate;
- secvena este o secven de instruciuni simple sau structurate;
- parantezele drepte roii []nu apar n program, ci indic faptul c coninutul lor este opional (poate
sa lipseasc).
n limba englez, switch nseamn comutator. Conform acestei forme generale, dup cuvantul cheie
switch, exist o expresie de tip int sau compatibil cu aceasta (deci poate fi i de tip char, byte sau
short, dar nu de tip long), a crei valoare servete drept "comutator". Se deschide apoi acolada corpului
instruciunii, n care exist mai multe "cazuri". Fiecare "caz" ncepe prin cuvantul cheie case, urmat de
o valoare de tip ntreg, dup care apar una sau mai multe instruciuni (simple sau compuse) i opional
intruciunea break. Dup ce s-au epuizat toate cazurile, opional se poate scrie cuvntul cheie default
urmat de una sau mai multe instruciuni. La sfrit, se nchide acolada corpului instruciunii switch.
Executarea instruciunii switch decurge astfel: se evalueaz mai nti expresie i se obine o valoare de
tip ntreg, care servete drept comutator. Aceast valoare se compar, pe rnd de sus n jos, cu fiecare
din valorile indicate dup cuvintele cheie case, pn cnd se gsete prima valoare care coincide cu
cea a comutatorului. Dac s-a gsit o astfel de valoare, se execut toate instruciunile care ncep de la
cazul respectiv, pn la prima instruciune break ntalnit sau, n lipsa acesteia, pn la acolada de
nchidere a corpului instruciunii switch. Dac ns nici unul din cazuri nu conine valoarea potrivit a
comutatorului, atunci se execut instruciunile care urmeaz dup cuvntul cheie default sau, n lipsa
acestuia, nu se execut nimic.

14

Instruciunea while (ciclul cu test initial)


Aceast instruciune are forma general
while (condiie)
instruciune
n care
condiie - este o expresie de tip boolean;
instruciune - poate fi orice instruciune (simpl sau structurat) a limbajului Java, inclusiv alt
instruciune while.
Executarea acestei instruciuni se face astfel: se evalueaz expresia boolean condiie i - dac valoarea
acesteia este true, deci condiia este satisfacut - se execut instruciune,dup care se revine la
evaluarea condiiei. acest ciclu se repet ct timp este satisfacut condiia.

Instructiunea do..while (ciclul cu test final)


Forma general a instruciunii de control, prin care se realizeaz n limbajul Java ciclul cu test final
este urmtoarea:
do
instruciune
while (condiie);
unde, la fel ca n cazul instruciunii while, condiie este o expresie de tip boolean, iar instruciune este
orice instruciune (simpl sau structurat) din limbajul Java. Remarcm c la sfritul acestei
instruciuni (dup condiie) se pune obligatoriu ';' (punct i virgul).
Principala deosebire fa de instruciunea while pentru ciclul cu test iniial este c testarea condiiei
se face dup ce a fost executat instruciunea din corpul ciclului. n consecin, corpul ciclului va fi
executat cel puin o dat.

Instructiunea for (ciclul cu contor generalizat)

n unele limbaje de programare, pentru realizarea ciclurilor la care numrul de pai este dinainte
cunoscut, se folosete o instruciune de control special, numit "ciclu cu contor". n pseudocod,
aceast instruciune poate fi scris n modul urmtor:
pentru variabila de_la val_init la val_fin [cu_pasul pas] execut
<instruciune sau secven de instruciuni>
sfrit_ciclu

15

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.

Tratarea excepiilor
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 acelai tip de incident formeaz o clas de excepii.
Tratarea prin program a excepiilor se face, n limbajul Java, folosind instruciunea try urmat de una
sau mai multe clauze catch i, opional, de o clauz finally sub forma urmatoare:
try {
secventa
}
catch (ClasaExceptie1variabila1) {
secventa1
}
catch (ClasaExceptie2 variabila2) {
secventa2
}
...............
catch (ClasaExceptieN variabilaN) {
secventaN
}
[finally {
secventa_finalizatoare
}]

Instruciuni etichetate
n principiu, orice instruciune n limbajul Java poate purta o etichet. Instruciunile etichetate au forma
etichet : instruciune
unde
etichet este un identificator;
instruciune este o instruciune simpl sau structurat.
Exemplu
alpha: x=2*a+b;
Se permite s se foloseasc drept etichete chiar i identificatori care mai sunt folosii n acelasi
program ca nume de variabile, clase, metode etc., far a se crea prin aceasta confuzii, deoarece
compilatorul face distincie ntre etichete i nume n funcie de contextul n care acestea sunt utilizate.

16

Instruciunea break
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
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.

Tipul referin
n memoria mainii virtuale Java, obiectele sunt plasate ntr-o zon de memorie special, numit memorie
dinamic (n englez: heap, adic "gramad"). Localizarea n memorie a obiectelor se face cu ajutorul unor
variabile speciale, numite variabile referin. Valoarea unei variabile referin nu este obiectul nsui, ci o
referin la acest obiect. Din aceast cauz, se consider c variabilele referint aparin unui tip de date
numit tip referin. Mulimea de valori a acestui tip este mulimea referinelor, adic mulimea locaiilor
(adreselor) din memoria dinamic. Operaiile permise asupra datelor de tip referina sunt cele date de
operatorii de atribuire (=), egalitate (==) i inegalitate (!=) care au aceleai semnificaii i mod de utilizare
ca pentru toate celelalte tipuri de date.

Clase, campuri, metode


Clasa este o structur de date, asociat cu o colecie de proceduri sau funcii, metode, care utilizeaz
datele din aceast structur.
Datele unei clase se numesc cmpuri, sau variabile membre. Cmpurile pot fi statice (ale clasei) sau
nestatice (ale instanei). Cnd clasa este instaniat, n memoria mainii virtuale Java se construiete
un obiect (o instan a clasei respective). Obiectul conine numai cmpuri nestatice. Cmpurile statice
se pstreaza n memorie ntr-un singur loc, care este rezervat clasei respective.
Metoda este o funcie, care ntoarce o valoare i poate avea, de asemenea, efect lateral. Ca i
cmpurile, metodele pot fi statice (ale clasei) i nestatice (ale instanei). Metodele statice pot invoc
numai cmpurile statice ale clasei respective, n timp ce metodele nestatice pot invoca att cmpurile
statice, ct i pe cele nestatice (ale unei instane a clasei respective). Dac valoarea ntoars de metod
este void, metoda respectiv este o procedur i trebuie s aib obligatoriu efect lateral.
Invocarea unei metode statice (a clasei) se face printr-o expresie de forma
nume_clasa.nume_metoda(parametri_efectivi)
a crei valoare este valoarea ntoars de funcia respectiv. O astfel de invocare de funcie poate fi deci
folosit ca o component ntr-o alt expresie. De exemplu, expresia Math.sqrt(a) serveste pentru a
calcula rdcina patrat a lui a, n care scop este invocat funcia sqrt, care este o metod static a
clasei Math (clasa funciilor matematice uzuale). Putem folosi aceast invocare de metod ntr-o
expresie mai complicat, de exemplu
x=2*Math.sin(a)+3;
Invocarea unei metode nestatice (a instanei) se face sub forma
referina_la_obiect.nume_metod(parametri_efectivi)
deci numele metodei nu mai este calificat prin (nsoit de) numele clasei, ci prin cel al variabilei
referin la obiectul respectiv, sau prin o expresie care are ca valoare o astfel de referin. De exemplu,

17

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);
Motenirea i polimorfismul
Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte. Ea
const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i superclas, iar
clasele derivate se numesc i subclase.
Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate cmpurile i
metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm pot exista, de
asemenea, cmpuri i/sau metode suplimentare.
Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o metod a
superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai nume i aceeasi
lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un comportament diferit.

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.

Ierarhia de clase Java


n general, n programarea orientat pe obiecte este permis motenirea multipl, adic o clas poate avea mai
multe superclase. n limbajul Java este permis numai motenirea simpl , deci fiecare clas poate avea numai
o singur superclas. Aceast ierarhie de clase este unic, adic orice clas are obligatoriu o superclas i
numai una. Singura excepie o constituie clasa Object, care este rdcina ierarhiei de clase Java i nu are
superclas.

Pachetele de clase
Principalele pachete de clase sunt:
java.lang - conine clasele de baz necesare programrii n limbajul Java;
java.io - conine clasele necesare pentru programarea operaiilor de intrare/ieire;
java.util - conine clase pentru anumite structuri de date tipice (list, stiv etc) i alte clase utile;
java.awt si javax.swing - conin clase necesare pentru realizarea interfeelor grafice;
java.applet - pentru programarea appleturilor.

Declaraia import
Pentru a putea utiliza ntr-un fiier-sursa Java un anumit pachet (subpachet) de clase, la nceputul
fiierului respectiv trebuie pus declaraia
import nume_pachet.*;
n care nume_pachet este numele calificat al pachetului respectiv. De exemplu, pentru a utiliza orice

18

clase din pachetul java.io se pune declaraia


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

Pachetul java.lang
Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet nu este
necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din pachetul
java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet.

Clasa Object
Clasa Object este rdcina ierarhiei de clase a platformei Java. Este singura clas care nu are o
superclas. Orice alt clasa este derivat direct sau indirect din clasa Object.
Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin
la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori
referine la orice fel de obiecte, indiferent de clasa creia i aparin.
n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate
celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua
aciuni specifice acestor clase.

Metodele clasei Object


Clasa Object nu are date membre. n consecin, obiectele acestei clase nu au stare (cu excepia faptului
ce ele exist sau nu).
Clasa are un singur constructor, Object(), care nu are parametri. Obiectele acestei clase nu conin date.
n schimb, clasa dispune de un set de metode. Conform cu principiul motenirii, toate celelalte clase
posed metodele clasei Object.
Metodele clasei Object sunt descrise n Java API. Noi vom prezenta aici numai o parte dintre ele, care
vor fi utilizate n cele ce urmeaz.
Metoda equals() este declarat sub forma:
public boolean equals(Object obj)

Clase de exceptii
n pachetul java.lang exist i numeroase clase de excepii. Instanele acestor clase sunt creeate de
ctre maina virtual Java atunci cnd se produce o excepie, adic o situaie anormal n procesul de
calcul. Toate aceste clase sunt descrise n documentatia Java API. Vom meniona aici numai dou dintre
ele, celelalte urmnd s fie indicate la descrierea claselor care conin metode care pot genera excepii.
n limbajul Java se face distincie ntre excepie i eroare. Se consider ca excepiile sunt incidente care pot
fi captate prin mecanismul try .. catch i pot fi deci tratate prin program, n timp ce erorile sunt incidente

19

grave, care - de regul - nu pot fi tratate prin program ci produc oprirea executrii acestuia.

Clasa Exception
Aceast clas este rdcina ierarhiei claselor de excepii. n consecin, atunci cnd dorim ca in clauza
catch sa fie captat orice fel de excepie, scriem aceast clauz sub forma
catch(Exception e) {
instructiuni_de_tratare_a_exceptiei e
}
unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori:
public Exception()
creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj.
public Exception(String s)
creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se
indic, de regul, ce incident a condus la generarea excepiei respective.

Clasa Class
O caracteristic important a limbajului i platformei Java este c clasele i interfeele utilizate n program
sunt prezente n memoria mainii virtuale Java n timpul executrii programului, sub forma de instane ale
clasei Class. n consecin, se pot obine n timpul executrii unui program informaii despre clasele crora
le aparin obiectele din memorie.
Clasa Class nu are un constructor public. n schimb, putem obine un obiect din aceast clas folosind
metoda getClass() a clasei Object. Exist i instane ale clasei Class pentru tipurile de date primitive.
Acestea sunt coninute sub forma de cmpuri statice n clasele acoperitoare ale tipurilor primitive
respective.
Clasa system
Clasa System conine cmpuri i metode utile pentru realizarea legturii dintre aplicaie i sistemul de
execuie Java (cel care implementeaz maina virtual Java). Aceast clas nu poate fi instaniat.
Cmpuri statice:
Clasa System are trei cmpuri statice care reprezint unitile standard de intrare/ieire ale sistemului:
public static final InputStream in - este intrarea standard a sistemului. De regul, aceasta este tastatura, dar
poate fi i alt dispozitiv indicat de utilizator.
public static final PrintStream out - este ieirea standard a sistemului. De regul este unitatea de afiare
standard (ecranul) dar poate fi i alt dispozitiv indicat de utilizator. Afiarea datelor pe ecran se face, de
regul folosind metoda System.out.println(sir) sau System.out.print(sir).
public static final PrintStream err - unitatea standard de ieire pentru erori. De regul este aceeai ca pentru
obiectul out, dar poate fi i alt dispozitiv indicat de utilizator.

20

Tablouri (Arrays)
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.

Tablouri cu un singur indice


Aceste tablouri corespund conceptului matematic de vector. Nu le vom numi totui astfel, pentru a nu face
confuzie cu obiectele clasei Vector din pachetul java.util.
Tabloul unidimensional este constituit dintr-un ansamblu de componente indexate (cu un singur indice),
cruia i se asociaz i o variabila de tip int numita length, care reprezint lungimea tabloului (numrul de
componente). Indicii elementelor de tablou sunt cuprini n intervalul [0, length-1]. Utilizarea unui indice
situat n afara acestui interval genereaz o excepie.
ntruct tablourile sunt obiecte, pentru indicarea lor n program se folosesc variabile referin.

Tablouri cu doi indici


Tablourile bidimensionale din limbajul Java sunt o generalizare a conceptului de matrice, n matematic,
toate liniile unei matrice au acelai numr de componente, n timp ce n Java numrul de componente poate fi
diferit de la o linie la alta (deci liniile "matricei" pot avea lungimi diferite). Tabloul cu doi indici este privit ca
un tablou ale crui componente sunt referine la tablouri cu cte un singur indice. Putem, deci, s ne
imaginm un "tablou coloan" care conine n fiecare component o referin ctre un "tablou linie". Fiecare
din aceste "tablouri linie" are propria sa variabil length i deci propria sa lungime. n schimb, variabila
length a "tabloului coloan" reprezint lungimea acestui tablou, adic numrul de linii. "Tipul tabloului" este,
de fapt, tipul componentelor "liniilor" acestuia.

Tablouri cu mai multi indici


Modul de tratare al tablourilor cu doi indici poate fi extins i la tablouri cu mai muli indici (tablouri
multidimensionale). Se are n vedere ca tabloul cu N indici conine referine la tablouri cu N-1 indici. De
exemplu un tablou cu trei indici (tridimensional) poate fi considerat c conine mai multe "pagini", iar fiecare
"pagin" este un tablou cu doi indici (bidimensional). n acest caz, primii doi indici specifica linia i,
respeectiv, coloana, iar al treilea indice specifica "pagina" n care se gsete o anumit component. Un
tablou cu patru indici poate fi asemnat cu un set de "volume", n care fiecare "volum" este un tablou cu trei
indici, iar cel de al patrulea indice specifica numarul "volumului" din acest set. Putem sa ne imaginam astfel
si semnificaii ale unor tablouri cu mai mult de patru indici. Totui, n practic, cele mai frecvent folosite
tablouri au cel mult trei indici.

Declararea claselor
Pn n prezent, s-a artat modul n care putem utiliza n programul nostru clase existente n biblioteci
(n pachetele de clase). Vom studia n continuare cum putem crea propriile noastre clase.
Cea mai simpl form a unei declaraii de clas este urmtoarea:

class NumeClasa {
declaratii_de_membri
}
Observm c declaraia ncepe cu cuvntul-cheie class, urmat de numele clasei i de corpul clasei,
cuprins ntre acolade.

21

Numele clasei este un identificator. Se obisnuiete ca numele clasei sa nceap cu liter majuscul.
Dac numele este compus din mai multe cuvinte, fiecaredin acestea ncepe cu majuscul.
Corpul clasei cuprinde declaraii de membri ai clasei respective. Acestea pot fi:
- declaraii de cmpuri;
- declaraii de constructori;
- declaraii de metode.
Nu este obligatoriu ca ntr-o clas s existe toate aceste categorii de declaraii. Pot exista, de exemplu,
clase n care apar numai declaraii de metode. n principiu, pot exista i clase care conin numai
cmpuri i nu conin metode, dei astfel de situaii apar foarte rar n practic.

Declararea campurilor (variabile membre)


Declaraiile de cmpuri servesc pentru a descrie structura de date specific clasei respective.
Cmpurile se mai numesc i variabile membre i pot fi ale clasei sau ale instanei (ale obiectului). Se
prefer denumirea de cmpuri, pentru a le deosebi de variabilele locale ale metodelor.
Cmpurile instanei se declar la fel ca variabilele locale ale metodelor, numai c declaraia
respectiv nu apare n blocul unei metode, ci n corpul clasei. De exemplu:
int m=172, n=2*m-4, r;
Aceste cmpuri pot avea valori diferite pentru fiecare instan a clasei respective. n consecin,
cmpurile instanei sunt plasate n zona de memorie rezervat instanei respective , astfel c ele sunt
distincte pentru fiecare instan.
Cmpurile clasei se numesc i cmpuri statice. Declararea unor astfel de cmpuri se face asemntor
cu cea a cmpurilor de instan, dar declaraia are n fa, n acest caz, modificatorul static. De
exemplu:
static double u=3.65, v=2.87*u-3.1, x;
La iniializarea cmpurilor de instan se pot folosi att valori ale cmpurilor statice, ct i ale altor
cmpuri de instan. n schimb, la iniializarea cmpurilor statice se pot folosi numai valori ale altor
cmpuri statice.

Declararea metodelor
n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i
metodele prin care se trateaz aceste cmpuri.
Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile
argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv.

n principiu, deosebirea dintre funcie i procedur este c funcia "ntoarce" o valoare, n timp ce metoda nu
ntoarce o valoare, ci are numai efect lateral. O funcie fr efect lateral este realizarea n program a
conceptului matematic de funcie i este folosit n expresiile de calcul numai pentru valoarea ei. n
limbajele C/C++ i Java, procedurile se scriu, din punct de vedere sintactic, la fel ca funciile, dar se
consider c ele intorc o valoare special numit void. Acesta este un artificiu pentru a indica faptul c o
asemenea "funcie" nu ntoarce o valoare.
n limbajele de programare tradiionale, o funcie (sau procedura) folosete ca date argumentele sale i
variabilele globale. n limbajul Java nu exist variabile globale i nici funcii independente (care s nu fie
metode ale unor clase). n schimb, fiecare metod poate folosi ca date att argumentele salei variabilele

22

locale, ct i cmpurile clasei creia i aparine metoda respectiv.

Cea mai simpl form sintactic a declaraiei de metod este urmtoarea:


tip_valoare_intoarsa nume_metoda(declaratii_de_argumente) {
corpul_metodei
}

Instructiunea return
Dac funcia ntoarce o valoare (diferit de void), aceasta se indic prin instruciunea
return expresie;
Efectul acestei instruciuni este urmtorul: se evalueaza expresia expresie i se ncheie executarea funciei
respective, ntorcnd valoarea astfel obinut. n consecin, chiar dac dup instruciunea return mai apar n
corpul funciei respective i alte instruciuni, acestea nu vor mai fi executate.
Dac metoda nu ntoarce o valoare (ntoarce void), folosirea instruciunii return nu este absolut necesar,
ncheierea execuiei fcndu-se cnd se ajunge la acolada prin care se sfrsete blocul funciei. Totui, dac
este necesar s se ncheie n mod abrupt executarea corpului funciei, se poate folosi instruciunea return fr
expresie.

Metode statice
La declararea metodelor statice, n faa tipului valorii ntoarse se pune modificatorul static. Metodele care
conin n declaraie acest modificator se numesc statice sau ale clasei, spre deosebire de metodele obinuite
care sunt ale instanei. n corpul metodelor statice se pot folosi numai cmpurile statice ale clasei respective
i se pot invoca numai alte metode statice ale acestei clase.

Metode cu acelasi nume. Signatura metodei


n aceeai clas pot exista mai multe metode cu acelai nume, cu condiia ca ele s difere prin numrul
i/sau tipul argumentelor. Pentru a deosebi ntre ele astfel de metode, s-a introdus conceptul de
signatur.
Signatura metodei const din numele acesteia, nsoit de lista de argumente. n consecin, dou
metode pot avea acelai nume, dac difer ntre ele prin signatur

Transferul de parametri catre metode


La invocarea unei metode, este necesar s se transmit de la metoda care invoc la metoda invocat
parametrii (argumentele) acesteia. De exemplu, la executarea invocrii Math.sin(a), este necesar s se
transmit ctre metoda sin argumentul acesteia, a.
n teoria i practica programrii se cunosc diferite moduri n car se poate face transmiterea argumentelor
ctre o funcie sau procedur:
- transmitere prin valoare: de la programul apelant ctre funcie (procedur) se transmit valorile
argumentelor;
- transmitere prin adresa: de la programul apelant ctre funcie (procedur) se transmit adresele la care se
gsesc n memorie valorile argumentelor;

23

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

Consecina faptului c parametrii metodelor se transmit prin valoare este urmtoarea: chiar dac
n corpul unei metode se atribuie unui argument formal al acesteia o nou valoare, aceast atribuire nu
modific valoarea argumentului efectiv corespunztor din programul apelant. Daca ns, n cazul unui
argument-referin, nu se modifica referina nsi, ci valorile cmpurilor obiectului indicat de ctre
aceasta, modificarea respectiv se va transmite i la programul apelant, constituind efectul lateral al
metodei respective.

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

Instructiunea throw
Cunoatem deja c, la apariia anumitor anomalii n executarea programului, maina virtual Java
genereaz excepii. Excepiile sunt obiecte din clasa Exception s-au dintr-o subclas a acesteia. Este
posibil ca programatorul s prevad, n anumite puncte ale programului, generarea unor excepii,
folosind n acest scop instruciunea throw, care are forma urmtoare:
throw new ConstructorExceptie(lista_argumente);
n limba englez, throw este imperativul de la "a arunca". n aceast instruciune, se folosete
operatorul new pentru a genera un obiect al clasei de excepii creia i aparine constructorul invocat,

24

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.

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

Clase publice
Clasele publice sunt clase care pot fi utilizate i n alte pachete, dect cel din care fac parte.
Fiecare clas public se declar ntr-un fiier separat, care are obligatoriu acelai nume cu cel al clasei
i extensia java. n declaraia de clas, n faa numelui clasei se pune modificatorul public.

Colectorul de reziduuri
Dac un obiect nu mai este necesar, el poate fi distrus, adic eliminat din memorie. n maina virtual
Java, exist un colector de reziduuri de memorie (englez: garbage collector) care elibereaz automat
spaiul de memorie ocupat de obiectele ctre care nu mai exist nici o referin. n consecin,
programatorul nu mai este pus n situaia s prevad explicit n program distrugerea obiectelor i, deci
clasele nu mai conin destructori, ca n alte limbaje de POO.

Metoda finalize din clasa Object


n clasa Object exista metoda
protected void finalize() throws Throwable
Aceasta metod este invocat de colectorul de reziduuri, atunci cnd acesta determin c nu mai exist
referine ctre obiectul respectiv. n clasa Object, aceast metod nu efectueaz nimic.
Metoda finalize poate fi redefinit n orice alt clas, pentru a elibera resurse sau a efectua orice alte
aciuni necesare nainte de distrugerea obiectului respectiv. De exemplu, dac obiectul respectiv a
deschis anumite fiiere sau conexiuni externe, n metoda finalize se poate efectua nchiderea lor.
Metoda finalize nu este apelat explicit n programul de aplicaie. Apelarea metodei finalize se face
numai de ctre colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rmas fr
referin, ci abia atinci cnd acest obiect a "intrat n atenia" colectorului. Este posibil ca executarea
aplicaiei s se incheie nainte ca "finalizarea" unor obiecte s aib loc.

25

Caracteristicile obiectelor i claselor: ncapsularea (encapsulation)


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.
Obiectul se comport ca i cnd ar avea doua "nveliuri": unul "transparent", care permite accesul la
datele i metodele publice ale obiectului, i un al doilea inveli "opac", care cuprinde datele i metodele
invizibile (inaccesibile) din exterior. Starea obiectului depinde att de datele publice, ct i de cele
ncapsulate. Metodele publice ale obiectului au acces la datele i metodele ncapsulate (ascunse) ale
acestuia. In consecin, starea obiectului poate fi modificata att prin modificarea direct, din exterior,
a valorilor variabilelor publice, fie prin utilizarea unor metode publice care modifica valorile
variabilelor ncapsulate. n mod similar, valorile variabilelor ncapsulate pot fi obinute numai utilizand
metode publice ale obiectului respectiv.
ncapsularea obiectelor prezint avantaje importante n programare, deoarece mrete sigurana i
fiabilitatea programelor, prin eliminarea posibilitii modificrii accidentale a valorilor acestora, ca
urmare a accesului neautorizat din exterior. Din aceast cauz, programatorii evit n general s
prevad ntr-un obiect date publice, preferand ca accesul la date s se fac numai prin metode.
Partea vizibil (public) a obiectului constituie interfaa acestuia cu "lumea exterioar". Este posibil ca
dou obiecte diferite s aib interfee identice, adic s prezinte n exterior aceleai date i metode.
Datorit faptului c partea ncapsulat difer, astfel de obiecte pot avea comportament diferit.

Modificatori de acces pentru campuri si metode


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

Caracteristicile obiectelor i claselor: Mostenirea

Motenirea este o trstur fundamental a programrii orientate pe obiecte, conform creia:


- dintr-o clas se pot deriva alte clase. Dac din clasa A este derivat clasa B, atunci A se numete
clas de baz, sau superclas, iar B se numete clas derivat, sau subclas;
- subclasa mosteneste cmpurile i metodele superclasei;

26

- metodele superclasei pot fi redefinite n subclas prin alte metode cu aceeai signatur;
- metodele statice ale superclasei pot fi ascunse n subclas;
- cmpurile superclasei pot fi ascunse n subclas prin cmpuri cu acelai nume dar care pot avea,
eventual, alt tip.
- cmpurile unei clase pot fi ascunse chiar i n metodele clasei respective, dac aceste metode au
argumente sau variabile locale cu acelai nume.

Caracteristicile obiectelor i claselor: Polimorfismul

Polimorfismul (englez: polymorphism) permite ca aceeai operaie s se realizeze n mod diferit n


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

Caracteristicile obiectelor i claselor: Identitatea


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.

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.
Caracteristicile obiectelor i claselor: Clasificarea
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.
n functie de nivelul de abstractizare, clasele pot forma o structura ierarhic. De exemplu, clasa mijloacelor
de transport cuprinde subclasele mijloacelor de transport terestre, navale i aeriene. Clasa mijloacelor de

27

transport terestre le cuprinde pe cele rutiere i feroviare. Clasa mijloacelor de transport rutiere cuprinde
clasele automobilelor i autocamioanelor etc. Fiecare subclas a unei clase este ea nsi o clas. O astfel de
ierarhie de clase este reprezentat n Figura 2.

Referintele this si super


n orice clas pot fi utilizate dou referine predefinite:
this - este o referin la "aceast" instan, adic la instana (obiectul) din care se face referina
respectiv;
super - este o referin la superclas.

Declararea claselor derivate. Clauza extends


n declaraia clasei derivate (subclasei), numele clasei care se declar este urmat de clauza extends, n
care se indic numele superclasei. n consecin, clasa derivat poate fi declarat astfel:
class NumeClasa extends NumeSuperclasa {
declaratii_de_membri
}
Amintim c n limbajul Java orice clas are o superclas i numai una . Excepie face clasa Object,
care este rdcina ierarhiei de clase. Daca lipsete clauza extends, superclasa implicit este Object.

Declararea constructorului clasei derivate


Pentru a se da valori iniiale cmpurilor superclasei, n declaraia constructorului subclasei poate fi
invocat constructorul superclasei prin instruciunea
super(lista_parametri_efectivi);
unde lista parametrilor efectivi este cea a constructorului superclasei. Aceasta instruciune, dac exist,
trebuie s fie prima instruciune din corpul constructorului clasei derivate. n lipsa ei, va fi invocat
constructorul fr parametri al superclasei.
Este posibil, de asemenea, ca ntr-un constructor s se invoce alt constructor al aceleeai clase, sub
forma
this(lista_parametri_efectivi);

Metode finale
Metodele finale sunt metode care nu mai pot fi redefinite n clasele derivate. Astfel de metode se
declar cu modificatorul final. De exemplu, n clasa Object, metoda getClass este o metoda final, fiind
declarat sub forma public final Class getClass(). Aceasta inseamn c n nici o alt clas nu este
posibil ca aceasta metod s fie redefinit. Cnd declarm propriile noastre clase, avem i noi
posibilitatea s declarm c unele din metodele lor sunt finale.

28

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

Redefinirea metodelor nestatice


Metodele de instan (nestatice) ale unei clase pot fi redefinite n subclasele acesteia. Redefinirea unei
metode se face declarnd n subclas o metod avnd aceeai signatur cu una din superclas. Atunci
cnd se redefinete o metoda protejat, modificatorul de acces al acesteia poate fi meninut, sau poate
fi transformat n public.
n subclas pot fi folosite, totui, i metodele superclasei care au fost redefinite, dac la invocarea
acestor metode se foloseste referina super.

Ascunderea metodelor statice


Metodele statice nu aparin instanelor, ci clasei. Din aceast cauz, dac ntr-o subclas se declara o
metoda static cu aceeai signatur ca o metod a superclasei, atunci se spune c metoda din subclas o
ascunde pe cea din superclas (nu o redefinete). Modul de lucru cu metodele ascunse este similar cu
cel n care se lucreaz cu cmpurile ascunse. Vom nelege mai bine deosebirea dintre redefinire i
ascundere cnd vom studia polimorfismul

Ascunderea campurilor
Cmpurile declarate ntr-o clas pot fi ascunse prin cmpuri cu acelai nume declarate n subclas,
chiar dac acestea au tipuri diferite. Aceasta nseamna c, n mod normal, n metodele clasei se folosesc
cmpurile declarate n clasa respectiv, i nu cele cu acelai nume ale superclasei. n subclas pot fi,
totui, folosite i cmpurile superclasei, dac sunt calificate cu referina super.

Instanierea clasei care conine metoda main


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

29

metode, pot fi create instane ale acestei clase, putndu-se astfel utiliza i cmpurile i metodele de
instan ale acestora.

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

Din punct de vedere conceptual, clasa abstract modeleaz un concept general, care trebuie apoi dezvoltat
prin subclase. Subclasele unei clase abstracte pot fi, la rndul lor, abstracte sau concrete. De exemplu, clasa
abstract FiguraPlana poate avea ca subclase clasele Cerc, Elipsa, Poligon etc.
Din punct de vedere al progrmarii, clasa abstract conine cel puin o metod abstract, adic o metod
pentru care s-a declarat numai antetul, fr s i se defineasc i corpul. O clas poate s conin o metod
abstract n mai multe moduri:
a/ n corpul clasei este declarat explicit o metod abstract;
b/ clasa mostenete de la superclasa ei o metod abstract, care nu este definita nici n corpul clasei
curente;
c/ clasa implementeaza o interfa, dar nu definete una sau mai multe din metodele acesteia.
Dac apare o astfel de situaie, iar clasa nu este declarat n mod explicit abstract, se genereaza o eroare la
compilare.

Declararea unei metode abstracte:


- antetul metodei trebuie sa conina modificatorul abstract;
- corpul metodei se nlocuiete prin caracterul ';' (punct i virgul).

Interfete
Interfaa este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie sa le
aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe interfee, ea
conine toate metodele publice i variabilele finale publice ale acestora.
Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot
declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la
obiecte aparinnd unei clase, adic sub forma:
interfaa nume_variabila1[=initializare1], ..., nume_variabilaN[=initializareN];

30

Declararea interfetelor
O declaraie de interfa introduce un nou tip referin, ai crui membri sunt cmpuri statice finale i
metode abstracte. n consecin, interfaa se aseamn cu o clasa abstract pur, care nu conine dect
metode abstracte i cmpuri statice finale i nu se ncadreaz n ierarhia unic de clase descendente din
Object (amintim ca o clasa abstract, n afar de una sau mai multe metode abstracte, poate conine i
cmpuri de date i metode concrete i este descendent a clasei Object).
Dei nu se ncadreaz n ierarhia claselor, interfeele se pot constitui in diverse ierarhii de interfee,
aplicndu-li-se principiul mostenirii. O clas poate implementa mai multe interfee.
Cel mai important avantaj al folosirii interfeelor este c mai multe clase, de pe diferite ramuri ale
arborelui ierarhic al claselor, pot fi "vzute" printr-o singur interfa. Se pot declara variabile referin
la interfa la fel cum se pot declara variabile referin la clas. Interfaa este abstract i deci nu poate
fi instaniat. n schimb, unei variabile referin la interfa i se pot atribui ca valori referine la
obiecte din orice clas care implementeaz interfaa respectiv.
Declaraia de interfa are forma general urmtoare:
[public] interface NumeInterfata [extends lista_superinterfete] {
declaratii_de_membri_ai_interfetei
}

Clase imbricate si clase interioare


n limbajul Java se permite ca o clas s aib ca membri alte clase. Acestea se numesc clase imbricate
sau clase ncuibate (engleza: nested classes). Ca i ceilali membri, clasele imbricate pot fi statice sau
nestatice i se declar n corpul clasei care le ncorporeaz. Clasele imbricate nestatice se numesc clase
interioare (englez: inner classes). O clas care ncorporeaz (imbric) alte clase se declar astfel:
[public] class NumeClasa {
declaratii_de_membri_ai_clasei
[modificatori_de_camp] class NumeClasaImbricata {
declaratii_de_membri_ai_clasei_imbricate
}
declaratii_de_membri_ai_clasei
}
Se recurge la aceasta tehnic atunci cnd utilizarea unei clase are sens numai n cadrul altei clase.
Aadar, prin imbricare se creeaz o legatur strnsa ntre dou clase. Este posibil, desigur, ca o clasa
s conin mai multe clase imbricate. Remarcm c declaraia clasei imbricate este tratata ca oricare
alta declaraie de membru al clasei, putnd avea i modificatori de cmp (de exemplu static).
Fiind membru al clasei, clasa imbricat are acces la toi membrii clasei care o conine, chiar i la cei
privai. Dac clasa imbricat este static, ea nu poate referi direct dect membrii statici ai clasei care o
conine. Clasa imbricat static exist, la fel ca i cmpurile sau metodele statice, numai n cadrul
clasei care o conine, nu i n instanele acesteia. n consecin, pentru a referi membrii acestei clase, se
folosete pentru calificare numele clasei.

31

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

Clasa java.awt.Component
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;
public boolean isShowing() - determin dac componenta este efectiv afiat pe ecran;
public Point getLocation() - ntoarce locaia componentei (poziia colului din stnga sus n containerulprinte) sub forma unei instane a clasei Point;
public void setLocation(Point location) - seteaz noua poziie a componentei n cadrul containerului
printe;
public Dimension getSize() - ntoarce dimensiunea componentei;
public void setSize(int latime, int inaltime) - seteaz noile dimensiuni ale componentei.
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.

Clasa JFrame
are o structur destul de complicat i este descris complet n documentaia Java.API. Pentru a nu
intra de la nceput n detalii, vom da, deocamdat, numai cateva informaii strict necesare pentru
folosirea acestei clase, urmnd s revenim ulterior cu indicaii suplimentare.
Principalul constructor este:
JFrame(String titlu)
unde titlu este titlul ferestrei.
Clasa JFrame are numeroase metode, att proprii, ct i motenite de la superclasele ei. n afar de
metodele motenite de la clasa Component, deocamdat, vom mai meniona aici numai dou, care sunt
motenite de la clasa Frame:
public String getTitle() - ntoarce titlul ferestrei;
public void setTitle(String titlu) - pune ferestrei un titlu (n locul celui existent).

32

La crearea ei, instana clasei JFrame nu este vizibil. Pentru a o face vizibil se folosete metoda public
void setVisible(boolean visible) a clasei Component.

Clase de evenimente
Clasele de evenimente se gsesc n pachetele java.awt.event i javax.swing.event i formeaz o ierarhie
de clase, care are ca radacin clasa abstract java.awt.AWTEvent. Aceasta, la rndul ei, extinde clasa
java.util.EventObject din pachetul java.util.
Orice eveniment conine urmtoarele metodele declarate n clasa java.util.EventObject:
public Object getSource() - care ntoarce o referin ctre obiectul care a generat evenimentul
respectiv;
public String toString() - care ntoarce o reprezentare sub forma de ir a obiectului.
Orice eveniment AWT (generat de componente AWT sau JFC/Swing) conine un cmp protejat de tip
int numit id, a crui valoare indic tipul evenimentului. Toate clasele de evenimente conin cmpuri
statice finale de tip int, al cror nume indic tipul de eveniment i a cror valoare este valoarea
corespunztoare a cmpului id. Valoarea acestui cmp se poate obine prin metoda
public int getId()
Evenimentele pot fi de nivel cobort (low level event) sau semantice. Numele claselor de evenimente de
nivel cobort indic fie componenta, fie dispozitivul de intrare care le-a generat, de exemplu:
ComponentEvent, WindowEvent, MouseEvent, KeyEvent. Numele claselor de evenimente semantice
indic mai curnd tipul de eveniment, dect sursa acestuia, de exemplu: ActionEvent, TextEvent.

Interfete si clase adaptoare pentru ascultatori de evenimente


Evenimentele generate de surse, sunt captate i tratate de asculttori. Sursele sunt componente ale
interfeei grafice care, de regul, sunt preluate din pachetele de clase ale platformei Java 2, deci nu sunt
programate de ctre programatorul de aplicaie, ci doar utilizate de acesta. n schimb, programatorul de
aplicaie trebuie s creeze clasele de asculttori de evenimente specifice aplicaiei pe care o dezvolt.
Metodele acestor clase trebuie sa reacioneze la apariia evenimentelor i s execute aciunile
corespunztoare, conform cu obiectivele aplicaiei. n consecin, platforma Java 2 nu pune la
dispoziie clase asculttoare predefinite, ci doar interfeele pe care trebuie s le implementeze aceste
clase, pentru a putea trata evenimentele pe care le recepioneaz.
Exist cte o interfa de asculttor pentru fiecare clas de eveniment. De exemplu, pentru
ComponentEvent exist interfaa ComponentListener, pentru WindowEvent exista intefaa
WindowListener etc.
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 interfaa WindowListener, clasa MouseAdapter implementeaz
interfaa MouseListener etc.

33

Adugarea asculttoarelor la sursele de evenimente se face prin metode de adugare corespunztoare,


existente n clasele de surse. De exemplu, pentru a se aduga la o instan a clasei Window sau a
subclaselor acesteia (de exemplu JFrame) un asculttor de evenimente de fereastr, n clasa Window
exist metoda
public void addWindowListener(WindowListener l)

Evenimente generate de o fereastra


Pentru a ne familiariza cu modelul de evenimente al platformei Java 2, vom urmri acum evenimentele
generate de o fereastr i modul cum acestea pot fi tratate. Vom folosi n acest scop o interfa din clasa
javax.swing.JFrame. Aceasta este derivat din clasa java.awt.Frame care, la rndul ei, este derivat din
clasa java.awt.Window. Evenimentele prezentate n aceast seciune sunt generate de orice instan a
clasei Window i ale subclaselor sale.
Evenimentele generate de fereastr sunt instane ale clasei WindowEvent i sunt ascultate de instane
ale unor clase care implementeaz interfaa WindowListener sau extind clasa WindowAdapter. Toate
aceste clase i interfee se gsesc n pachetul java.awt.event.

Metodele interfeei WindowListener sunt urmtoarele:


public void windowOpened(WindowEvent e)- fereastra a fost deschis
public void windowClosing(WindowEvent e)- fereastra se nchide
public void windowClosed(WindowEvent e)- fereastra a fost inchis
public void windowIconified(WindowEvent e)- fereastra a fost iconificat
public void windowDeiconified(WindowEvent e)- fereastra a fost deiconificat
public void windowActivated(WindowEvent e)- fereastra a fost activat
public void windowDeactivated(WindowEvent e)- fereastra a fost dezactivat

Terminarea aplicatiei la inchiderea ferestrei


Pentru ca la acionarea butonului de nchidere din colul din dreapta-sus al ferestrei s se nchid nu
numai fereastra respectiv, ci si aplicaia, este necesar ca metoda windowClosing() a asculttorului de
fereastr s conin invocarea metodei System.exit(0) din clasa System. Dac nu dorim s utilizam i
alte metode de tratare a evenimentelor generate de fereastr, vom deriva clasa de ascultare a ferestrei
AF din clasa WindowAdapter.

Evenimente de mouse
Evenimentele de mouse sunt instane ale clasei java.awt.event.MouseEvent i sunt generate de ctre
orice component a interfeei grafice, atunci cnd asupra ei se acioneaza cu mouse-ul. Clasa
MouseEvent este derivat din clasa java.awt.event.InputEvent. Evenimentele de mouse sunt intrarea
cursorului de mouse ntr-o component sau ieirea din aceasta, apsarea unui buton de mouse sau
eliberarea lui, efectuarea unui click de mouse (simplu sau multiplu) pe suprafaa componentei,
micarea mouse-ului.

34

Pentru ascultarea evenimentelor de mouse se folosesc interfeele java.awt.event.MouseListener,


java.awt.event.MouseMotionListener i javax.swing.event.MouseInputListener. Asculttoarele de
mouse se pot obine, de asemenea, prin extinderea claselor java.awt.event.MouseAdapter,
java.awt.event.MouseMotionAdapter i javax.swing.event.MouseInputAdapter.

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
java.awt.event.MouseMotionListener.

Evenimente de tastatura

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.

35

Adaugarea unei componente la fereastra principala a aplicatiei


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.

Managementul poziiei componentelor (Layout Manager).

Gestionarul de poziionare este o clas care asigur poziionarea i redimensionarea automat a


componentelor situate ntr-un container, att la crearea containerului, ct i la modificarea dimensiunilor
acestuia. Orice gestionar de poziionare implementeaz interfaa java.awt.LayoutManager sau subinterfaa
acesteia java.awt.LauoutManager2. n cele ce urmeaz, vom studia cele mai larg utilizate clase de
gestionare a poziionrii, existente n pachetele java.awt i javax.swing.

36

Clasa BorderLayout

ncepem cu aceast clas, deoarece este gestionarul de poziionare implicit pentru coninutul instanelor
clasei JFrame. n acest caz, se consider c suprafaa containerului este imparit n cinci zone numite,
respectiv, NORTH, SOUTH, WEST, EAST si CENTER. n fiecare din aceste zone se poate plasa numai o
singur component, care poate fi ns ea nsi un container. Adugarea de componente la container se face,
n acest caz, folosind metoda add(componenta, BorderLayout.ZONA), unde componenta este referina la
componenta adaugat, iar ZONA este una din cele cinci zone menionate mai sus. Dac se folosete metoda
add(componenta), fr a indica zona, componenta respectiv este plasat implicit n zona CENTER, aa cum
s-a procedat n seciunea precedenta, n exemplul din fiierul AdComp.java.

Clasa FlowLayout

Gestionarul de poziionare java.awt.FlowLayout plaseaz componentele pe suprafaa containerului una dup


alta, n ordinea n care acestea sunt adugate, de la stnga la dreapta i de sus n jos. Cnd s-a terminat o linie,
se trece la linia urmtoare. Numrul de componente pe o linie depinde de limea componentelor i de limea
containerului n care sunt acestea plasate.
Este posibil s se specifice modul de aliniere a componentelor: la stnga, la dreapta sau la centru. Aceasta se
face fie specificnd alinierea ca argument al constructorului, fie invocnd metoda
public void setAlignement(int align)
n care argumentul align poate fi FlowLayout.LEFT, FlowLayout.RIGHT sau FlowLayout.CENTER.

Clasa java.awt.GridLayout
Gestionarele de poziionare din clasa java.awt.GridLayout plaseaz componentele n celulele unei
grile rectangulare. n consecin, toate componentele de pe aceeai coloan sunt aliniate vertical.
Clasa are doi constructori:
public GridLayout(int rows, int cols) - are ca argumente numrul de linii i de coloane al grilei;
public GridLayout(int rows, int cols, int hgap, int vgap) - are n plus ca argumente spaiul orizontal
i, respectiv, vertical ntre componente.
Dei n constructor se indic att numrul de linii, ct i cel de coloane ale grilei, n realitate numai
numrul de linii este respectat, n timp ce numrul de coloane este practic ignorat. La stabilirea
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.

37

Clasa javax.swing.BoxLayout
Gestionarul de poziionare javax.swing.BoxLayout plaseaz toate componentele containerului pe o
singur direcie, care poate fi orizontal sau vertical.
Constructorul clasei este
public BoxLayout(Container target, int axis)
n care target este o referina la containerul int (al crui gestionar de poziionare este creat), iar axis
poate fi BoxLayout.X_AXIS sau BoxLayout.Y_AXIS i indic direcia (axa) dup care vor fi plasate
componentele.

Pozitionarea absoluta a componentelor in container

n general, este recomandabil ca pentru amplasarea componentelor n containere s se foloseasc gestionari


de poziionare. n acest fel se asigur modificarea automat a poziiei i dimensiunilor componentelor, atunci
cnd se modific dimensiunile containerului. Exist totui situaii, n care se prefer ca poziiile i
dimensiunile componentelor s fie fixe i s fie indicate prin program. Din aceast cauz, n afar de
amplasarea flexibil a componentelor n containere, folosind clasele de gestionare a poziionrii, este posibil
s se proiecteze i interfee grafice n care poziionarea componentelor se face folosind coordonatele i
dimensiunile absolute ale acestora. n acest scop:
a/ pentru a se indica faptul c nu se folosete un gestionar de poziionare, se recurge la instruciunea:
setLayout(null);
b/ pentru stabilirea coordonatelor colului din stnga sus i dimensiunilor fiecrei componente se folosete
metoda
public void setBounds(int x, int y, int width, int height);
din clasa java.awt.Component. n acest mod, fiecare component este plasat n container cu colul stnga-sus
n punctul de coordonate (x,y)i are dimensiunile date prin limea width i nlimea height.
n locul metodei setBounds se pot folosi i metodele
public void setLocation(Point location)
public void setSize(int latime, int inaltime)
care exist, de asemenea, n clasa Component i permit setarea separat a poziiei i dimensiunilor
componentelor.
Poziia i dimensiunile astfel stabilite ale componentelor rmn neschimbate, chiar dac se modific
dimensiunile containerului care le conine.

Clasele Panel si JPanel


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.

Clasele Panel si JPanel

38

Clasa java.awt.Panel (panou) reprezinta cel mai simplu container, care este o suprafa
dreptunghiular fr bordur. Gestionarul de poziionare implicit este FlowLayout, dar se poate pune
oricare altul. Panourile sunt frecvent folosite pentru a plasa pe ele diferite componente, formnd un
grup care se plaseaza apoi ntr-un alt container. Clasa javax.swing.JPanel este varianta de Panel
folosit n JFC/Swing, fiind un container genreric.

Clasa Box
Clasa javax.swing.Box are ca instane containere speciale, care nu pot folosi dect gestionarul de
poziionare javax.swing.BoxLayout. Orice incercare de a-i pune alt gestionar produce o eroare de
execuie din clasa AWTError.
ntr-un container din clasa Box, componentele pot fi amplasate numai pe o singur direcie: orizontal
sau vertical.

Clasa dispune de metode statice pentru crearea de "casete" (instane ale clasei Box) orizontale sau verticale:
public static Box createHorizontalBox()
public static Box createVerticalBox()
Se pot creea, de asemenea "componente invizibile" de dimensiuni fixe sau variabile, care pot fi folosite la
distanarea componentelor vizibile. n acest scop, se folosesc metodele
public static Component createRigidArea(Dimension d) - creeaza o "component ascuns" de dimensiune
fix;
public static Component createHorizontalStrut(int width) - creeaza o "component ascuns" de lime fix,
dar de nlime variabil;
public static Component createVerticalStrut(int height) - creeaza o "component ascuns" de nalime fix,
dar de lime variabil;
public static Component createGlue() - creaza o "component ascuns" cu ambele dimensiuni variabile;
Combinarea adecvat de containere din clasa Box i folosirea n acestea a diferitelor componente
vizibile i ascunse permite crearea de interfee grafice cu aspecte foarte diversificate.

Componentele din JFC/Swing


Pentru a realiza interfaa utilizator grafic a unei aplicaii folosind JFC/Swing, este necesar ca la
fereastra aplicaiei (din clasa JFrame) s se adauge diferite obiecte grafice numite componente.
Deosebim:
1. Componente de control: butoane, butoane radio, casete de validare, liste, liste ascunse, meniuri,
rigle ajustabile, cmpuri de text.
2. Componente de afiare needitabile: etichete, indicatoare, etc.
3. Componente de afiare editabile: zone de text, tabele editabile, selectoare de culori, selectoare de
fiiere, arbori.
4. Containere: panouri, panouri glisante, etc

39

Clasa javax.swing.JComponent
Clasa abstracta javax.swing.JComponent extinde clasa java.awt.Container. In consecin, orice
componenta Swing are i caracteristici de container.
Iat, ca exemplu, cteva faciliti pe care le ofera orice JComponent:
- posibilitatea de a-i ataa componentei o "inscripie volanta" (englez: ToolTip), adic o inscripie
explicativ care apare cnd punem cursorul de mouse pe componenta respectiv, fr s apsm butonul. O
astfel de inscripie se ataeaz componentei prin metoda
public void setToolTipText(String text);
- posibilitatea de a-i pune componentei o bordur, folosind metoda
public void setBorder(Border border);
- posibilitatea de a modifica culoarea de fond i culoarea de primplan ale componentei folosind metodele:
public void setBackground(Color color);
public void setForeground(Color color);

Caracteristicile componentelor JFC/Swing


Fiecare component a interfeei utilizator grafice se caracterizeaz prin aspect, stare i comportament.
Aspectul este dat de figura prin care este reprezentat pe ecran componenta respectiv. Fiecare clas de
componente ofer un aspect tipic al instanelor sale. n JFC/Swing programatorului i se pun nsa la
dispoziie metode i clase prin care poate modifica aspectul componentelor.
Starea 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).

Componente de control
Componentele de control sunt dispozitive de intrare virtuale, uor de utilizat, prin intermediul crora
utilizatorul poate introduce anumite comenzi. Din aceast categorie fac parte butoanele, riglele
ajustabile, listele, listele ascunse, meniurile i cmpurile de text.

40

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.

Butonul obinuit (cu o singur stare stabil)


Butoanele obinuite se realizeaz folosind clasa javax.swing.JButton, derivat din clasa
javax.swing.AbstractButton, aa cum am artat n exemplele date n capitolul precedent. Butonul obinuit
are o singur stare stabil, n care ajunge cnd este eliberat. Ct timp se ine butonul de mouse apsat
deasupra lui, butonul se afl n starea "apsat" ("acionat"). De fiecare dat cnd este acionat, butonul
genereaz un AcionEvent i un ChangeEvent. Cnd este eliberat, genereaz numai un ChangeEvent. Butonul
genereaz de asemenea, ca orice alt component, evenimente de component, de mouse i de tast. Totui, n
cazul butoanelor obinuite, cel mai frecvent se folosesc evenimentele de aciune (ActionEvent), care sunt
ascultate de un asculttor de aciune (ActionListener). Clasele Button i JButton sunt specificate mai detaliat
n Indexul de clase.
Butonul cu dou stri stabile
Clasa javax.swing.JToggleButton este derivata din javax.swing.AbstractButton i reprezint butoane
cu dou stri stabile. Trecerea de la o stare la alta este impus de utilizator prin click de mouse sau este
comandat prin program. n practic, cel mai frecvent se folosesc caseta de validare i butonul radio,
realizate prin subclase ale clasei ToggleButton i prezentate n continuare. O specificare mai detaliat a
clasei JToggleButton este dat n indexul de clase.

Caseta de validare
Caseta de validare este un obiect de control cu dou stri stabile. La fiecare click de mouse pe
suprafata casetei de validare, aceasta trece dintr-o stare n cealalt. n mod obinuit, caseta de validare
este reprezentat grafic printr-un patrat, n care apare un simbol de bifare (de validare), cum ar fi
simbolul V sau X, cnd caseta se gsete n starea "selectat". n starea opus (deselectat), caseta este
vid. Imaginea casetei este insoit i de un text explicativ.

Butonul radio
Butonul radio este un buton cu dou stri stabile, care face parte dintr-un grup de butoane, astfel c la un
moment dat numai unul dintre ele poate fi "selectat". n momentul n care este selectat ("apsat") un buton al
grupului, se deselecteaz automat cel care era selectat anterior.
n JFC/Swing, butoanele radio sunt realizate ca instane ale clasei javax.swing.JRadioButton, care este
derivat din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa
javax.swing.ButtonGroup.

41

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.

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.
n JFC/Swing, pentru realizarea listelor ascunse se folosete clasa javax.swing.JComboBox
Rigla ajustabil
Clasa javax.swing.JSlider ofer o component care are aspectul unei rigle prevzute cu cursor. Prin
deplasarea cursorului cu ajutorul mouse-ului se modific valoarea indicat de rigl. Valoarea minim i cea
maxim de pe scala riglei i valoarea unei diviziuni se indic prin program. Rolul riglei poate fi asemnat cu
cel al unui dispozitiv de ajustare continu, cum este poteniometrul din aparatura electronic.
La deplasarea cursorului, rigla genereaz evenimente din clasa javax.swing.event.ChangeEvent, care sunt
ascultate cu o clas care implementeaz interfaa javax.swing.event.ChangeListener.
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.
Meniuri cu bar
Bara de meniu se poate plasa, daca este necesara, numai la partea superioara a ferstrei aplicatiei si se
realizeaza ca o instanta a clasei javax.swing.JMenuBar.
Bara de meniu poate sa conin unul sau mai multe meniuri, care se realizeaz ca instane ale clasei
javax.swing.JMenu. La rndul su, fiecare meniu poate conine unul sau mai multe articole, care sunt
instane ale claselor javax.swing.JMenuItem sau javax.swing.JCheckBoxMenuItem. Este ns posibil ca
un articol de meniu s fie el nsui un meniu (din clasa JMenu). Dac utilizatorul alege cu mouse-ul un aricol
de meniu, sunt posibile deci dou situaii:
- acesta este un articol propriu-zis (un JMenuItem), n care caz opiunea respectiv este selectat;
- articolul ales este el nsui un meniu (un JMenu), n care caz noul (sub)meniu se desfoar i cutarea
continu.
Meniuri derulante (pop-up)
Spre deosebire de meniurile cu bar, meniurile derulante sunt tratate ca nite componente obinuite,
care pot s fie afiate prin program, atunci cnd este necesar. n JFC/Swing, meniurile derulante se
realizeaz ca instane ale clasei javax.swing.JPopupMenu. n rest, meniul pop-up se comport la fel
ca un meniu cu bar.

42

Componente de afiare needitabile


Componentele de afiare needitabile sunt realizate ca instane ale urmtoarelor clase:
- javax.swing.JLabel - pentru realizarea unor "etichete" n care pot fi afiate texte sau imagini, fr a putea
fi editate de utilizator;
- javax.swing.JTooltip - pentru afiarea de "inscripii volante", cnd se pune cursorul de mouse deasupra
unei alte componente;
- javax.swing.JProgressBar - pentru realizarea unor "bare de progres" adic a unor bare de lungime
variabil, care arat cum evolueaz realizarea unei anumite activiti (de la 0% la 100%).
Componente de afiare editabile
Componentele de afiare editabile permit utilizatorului operaii de editare n timpul executrii programului. n
JFC/Swing exist un numr important de clase pentru astfel de componente. Astfel, pentru editare de texte
exist clasele javax.swing.JTextArea, javax.swing.JTextPane i javax.swing.JEditorPane. n aceeai
categorie pot fi ncadrate i clasele javax.swing.JTextField i javax.swing.JPasswordField, care au fost
prezentate anterior.
Tot n categoria componentelor editabile intr i clasele javax.swing.JTable (pentru realizarea de tabele
editabile), javax.swing.JFileChooser (pentru realizarea de selectoare de fiiere), javax.swing.JTree (pentru
realizarea de arbori) i javax.swing.JColorChooser (pentru realizarea de selectoare de culori).
Vom prezenta aici numai clasa JTextArea, iar pentru celelalte recomandm folosirea documentaiei indicate.
Utilizarea ferestrelor de dialog
Ferestrele de dialog sunt ferestre care se afieaz pe ecran numai temporar, pentru a transmite anumite mesaje
sau a permite introducerea unor date. Principalul avantaj al folosirii ferestrelor de dialog este c apar pe ecran
numai atunci cnd sunt necesare i nu ncarc fereastra principal a aplicaiei cu elemente care nu sunt
necesare n permanen.
n JFC/Swing, ferestrele de dialog se realizeaz folosind clasa javax.swing.JDialog. Instanele acestei clase
se comport asemanator cu cele ale clasei JFrame, permind adugarea oricror componente. La fel ca la
JFrame, aceste componente nu se adaug direct la fereastr, ci la panoul contentPane coninut n aceasta i
obinut prin metoda public Container getContentPane().
Fereastra de dialog poate avea ca "proprietar" (owner) o instan a claselor java.awt.Frame,
javax.swing.JFrame, java.awt.Dialog sau javax.swing.JDialog. Proprietarul se transmite ca argument al
constructorului ferestrei de dialog. Se permite ca, n loc de proprietar, s se pun argumentul null, n care caz
se atribuie un proprietar implicit.
Pentru afiarea pe ecran a ferestrei de dialog se invoc metoda public void show(), iar pentru ascunderea ei
se invoc metoda public void hide(). n fine, pentru a elimina fereastra de dialog, elibernd toate resursele pe
care le folosete, se invoc metoda public void dispose(). Aceste trei metode sunt motenite de JDialog de la
superclasa java.awt.Dialog. Cnd fereastra de dialog este deschis, ea trece n prim plan sau n plan secund
mpreun cu proprietarul ei.
Ferestrele de dialog pot fi modale sau nemodale. Cnd este afiat pe ecran o fereastr modal, toate
celelalte ferestre existente pe ecran sunt blocate (nu se poate aciona asupra lor), pn cnd se ncheie lucrul
cu fereastra de dialog modal respectiv.

43

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.
Prin modificarea ponderilor celor trei culori se pot obine, n principiu, toate culorile posibile, de la negru
[r=0,g=0,b=0] la alb [r=255,g=255,b=255]. Dac ponderile celor trei culori sunt egale, se obin diferite nuane
de gri. Culoarea galben are ponderile [r=255,g=255,b=0], culoarea cyan (azuriu) are ponderile
[r=0,g=255,b=255] iar culoarea magenta are ponderile [r=255,g=0,b=255]. Alte culori: orange:
[r=255,g=200,b=0], pink (roz): [r=255,g=175,b=175].
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.
Alegerea culorii folosind clasa JColorChooser
Pentru a alege culoarea n mod interactiv, n JFC/Swing este prevazut clasa javax.swing.JColorChooser.
Instanele acestei clase sunt panouri de selectare a culorii, care pot fi folosite att prin ncorporarea lor ntr-o
fereastr obinuit, ct i sub forma unei ferestre de dialog.
Pentru a creea o fereastr de dialog, care conine n ea un JColorChooser i ntoarce culoarea selectat, n
clasa JColorChooser exist metoda
public static JDialog createDialog(Component c,String title, boolean modal, JColorChooser chooserPane,
ActionListener okListener, ActionListener cancelListener)
n care:
- c este componenta beneficiar (owner) a ferestrei de dialog create;
- title este titlul ferestrei de dialog create;
- argumentul boolean modal indic dac fereastra este modal;
- chooserPane este instana clasei JColorChooser care se ntroduce n fereastra de dialog;
- okListener si cancelListener sunt asculttoarele de aciune care reacioneaza la apsarea butonului OK,
respectiv Cancel al selectorului de culoare.
Folosind un JColorChooser, alegerea culorii se poate face n trei moduri:
- folosind un tablou de culori, n care fiecare celul este colorat n alt culoare;
- n sistemul RGB, folosind trei rigle de ajustare a culorilor fundamentale;
- n sistemul HSB, selectnd culoarea prin alegerea cu mouse-ul a punctului de pe panou care are culoarea
potrivita (trei butoane alturate, notate H, S, B, arat care din cele trei componente se menine constant,
celelalte dou fiind date de coordonatele punctului ales pe panou).

Contextul grafic
Modul de realizare a imaginilor i desenelor este strns dependent att de echipament (hardware) ct i de
sistemul de operare. Pentru a se asigura independena de platform, n Java API a fost introdus clasa
abstract java.awt.Graphics. Aceasta este clasa de baz a tuturor contextelor grafice, care permit trasarea de
desene pe suprafaa componentelor grafice realizate pe diverse dispozitive fizice. Pe fiecare platform, n
mediul de execuie Java, trebuie s existe o implementare a contextului grafic, adic o extindere a clasei

44

Graphics, care conine toate cmpurile i metodele acestei clase, dar este specific platformei respective.
Un obiect din clasa Graphics ncapsuleaz informaia de stare a contextului grafic la care se refer i anume:
- referina la obiectul din clasa Component (sau dintr-o subclasa a acesteia) pe care se deseneaz;
- o translaie a originii sistemului de coordonate; toate coordonatele din desen sunt raportate la aceast
origine;
- decupajul curent (dreptunghiul n interiorul cruia se traseaz desenul);
- culoarea curent;
- fontul curent;
- operaia logic pe pixeli curent (XOR sau paint);
- alternarea curent de culori pentru operaia pe pixeli XOR.
Originea sistemului de axe (punctul de coordonate 0,0) se gsete n colul din stnga-sus al dreptunghiului
de desenare. Axa 0x este ndreptat spre dreapta, iar axa 0y - in jos.
Practic, clasa abstract Graphics conine acele metode, care trebuie s existe n orice context grafic.
Coninutul concret al acestor metode, deci modul efectiv n care se realizeaz funciile respective, depinde de
contextul grafic real, deci de dispozitivul fizic pe care se face desenarea i de sistemul de operare folosit. Pe
programatorul de aplicaii sau miniaplicaii n Java nu l intereseaz ns acest lucru, deoarece el folosete n
programele sale metodele clasei abstracte Graphics, fr s se preocupe de modul n care acestea vor fi
executate.

Fluxuri de intrare/ieire i fiiere


Introducere
n majoritatea aplicaiilor, este necesar s se transmit date ntre diferite componente cum sunt:
memoria intern, tastatura, ecranul, fiierele de pe disc, reeaua de calculatoare etc. Poate fi necesar, de
asemenea, s se transmit date ntre dou aplicaii sau ntre dou fire de execuie ale aceleeai aplicaii.
n limbajul Java, fluxul (englez: stream) este o cale de comunicaie ntre o surs de date i o
destinaie (Figura 1).

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.

45

Principalele operaii care au loc asupra unui flux sunt:

La surs (flux de ieire)

La destinaie (flux de intrare)

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

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

Pachetul java.io
n Java 2 SDK se consider c fluxurile pot fi de caractere sau de octei. n primul caz, de la surs la
destinaie se transmite o succesiune de caractere Unicode (de cte 16 bii), iar n al doilea caz - o
succesiune de octei (de 8 bii). n mod corespunztor, pentru fiecare din cele dou categorii de fluxuri
exist cte o ierarhie de clase de fluxuri de intrare i o ierarhie de clase de fluxuri de iesire. Pentru
fluxurile de caractere, rdcinile ierarhiilor de clase sunt clasele abstracte Reader i Writer.Pentru
fluxurile de octei, rdcinile acestor ierarhii sunt clasele abstracte InputStream i OutputStream.
Aceste ierarhii de clase sunt reprezentate n figurile 2, 3, 4 i 5. n afar de cele patru ierarhii
menionate, n pachetul java.io exist i clase auxiliare i interfete. Distingem trei tipuri de clase, care
sunt reprezentate n aceste figuri prin culori diferite:
- clase abstracte (culoare albastr);
- clase care efectueaz operaiile de intrare sau de ieire propriu-zise (culoare verde) i modeleaz
sursele sau destinaiile fluxurilor (englez: Data Sink Streams);
- clase care efectueaz unele operaii de transformare a datelor de pe flux (culoare violet) i
reprezinta "fluxuri de prelucrare" (englez: Processing Streams).

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

46

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

47

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.
Clasa OutputStream
Clasa java.io.OutputStream este rdcina ierarhiei de clase pentru fluxuri de iesire de octei.
Metode:
public void write(int c) throws IOException - scrie n fluxul de ieire ultimul octet al numrului c;
public void write(byte[] buf) throws IOException - scrie n fluxul de ieire octeii coninuti n tabloul buf;
public abstract void(byte[] buf, int off, int len) throws IOException - scrie n fluxul de ieire len octei din
tabloul buf, ncepnd de la poziia off (offset);
public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat ntr-o
zon tampon anumii octei scrii cu metodele write(), aceti octei sunt scrii efectiv n fluxul de destinaie;
dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se "descarc" ntregul
lan de fluxuri;
public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a
metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.
Clasele PrintStream i PrintWriter
Clasele java.io.PrintStream i java.io.PrintWriter se folosesc pentru a transmite ctre un flux se ieire date
formatate pentru tiprire (afiare). Se tie c forma intern a datelor difer de forma extern. De exemplu,
numerele ntregi sunt reprezentate intern sub form binar, n timp ce pe ecranul calculatorului sau la
imprimant apar sub forma unor iruri de cifre zecimale, precedate eventual de semn. Metodele claselor
PrintStream i PrintWriter fac aceast conversie din forma intern n cea extern a diferitelor tipuri de date,
genernd reprezentrile datelor respective sub forma de iruri de octei (caractere n codul ASCII) sau,
respectiv, de caractere Unicode. Aceste clase nu se folosesc n mod independent, ci adaug altui flux de ieire
(de octei sau, respectiv, de caractere) capacitatea de formatare a datelor n vederea tipririi.
Clasa PrintStream
Clasa PrintStream conine doua feluri de metode de scriere a datelor: metodele cu numele write() scriu
ntotdeauna octei (fr formatare), n timp ce cele cu numele print() sau println() formateaz datele,
respectnd convenia de codificare (pe octeti sau pe caractere) specific platformei pe care ruleaza
aplicaia respectiv. Totui, se recomand ca pentru a obine fluxuri de caractere s se foloseasc clasa
PrintWriter.
Deosebirea dintre print() i println() este c metodele cu numele println() adaug, la sfritul irului de
octei generat, un caracter de sfrit de linie ('\n'). n consecin, dac se folosete metoda print(),
afiarea se face fr a se trece la o linie nou, n timp ce dac se folosete metoda println(), dup
afiare se trece la linie nou. Dac fluxul este cu descrcare automat, metoda println() provoac, de
asemenea, descrcarea acestuia (flush).
Clasa PrintWriter
Constructori:
public PrintWriter(Writer out) - creeaz un nou flux de formatare pentru afiare, fr descrcare
automat, conectndu-l la fluxul de ieire pe caractere out;
public PrintWriter(Writer out, boolean autoFlush) - la fel ca i constructorul precedent, dar al doilea
argument specific dac are loc descrcarea automat a fluxului;
public PrintWriter(OutputStream out) - creeaz un nou flux de formatare pe caractere, fr
descrcare automat, conectndu-l la fluxul de ieire pe octei out; el creeaz i un OutputStreamWriter

48

intermediar, care face conversia caracterelor pe unul sau doi octei, dependent de platform;
public PrintWriter(OutputStream out, boolean autoFlush) - la fel ca i constructorul precedent, dar al
doilea argument indic dac se face descrcare automat a fluxului.

49

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