Documente Academic
Documente Profesional
Documente Cultură
Teorie Java
Teorie Java
Ce este Java
un limbaj de programare, ale crui caliti i-au permis rspndirea rapid, fiind n prezent unul
din limbajele cele mai larg folosite.
un mediu de execuie pentru aplicaiile Java, numit n prezent n englez "Java 2 Runtime
Environment", care conine maina virtual Java i un nucleu al bibliotecilor de clase Java;
o platform pentru dezvoltarea de aplicaii n care se folosete limbajul Java, care se numete n
prezent n englez "Java 2 Platform" i conine:
o compilatorul Java (Java Compiler);
o maina virtual Java (Java Virtual Machine);
o bibliotecile de clase Java (Java Class Libraries);
o vizualizatorul de appleturi Java (Java AppletViewer);
o depanatorul Java (Java Debbuger) i alte instrumente de dezvoltare;
o documentaia;
o tehnologie software puternic i modern, care corespunde cerinelor lucrului n reele de
calculatoare
sloganul "Write Once, Run Anywhere" (scrie o singur dat i ruleaz oriunde), care arat
c un program, dup ce a fost scris i compilat, poate fi executat (rulat) pe orice calculator .
Pentru realizarea acestui obiectiv, s-a decis ca n tehnologia Java portabilitatea
programelor sa se realizeze la nivel de cod de octei (bytecode), adic sub forma de cod
binar destinat unui calculator abstract , numit maina virtual Java
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.
Prile scrise cu negru (inclusiv parantezele i acoladele) le vom considera obligatorii, iar cele
scrise cursiv cu rou sunt la latitudinea programatorului.
<nume_clasa> - este numele clasei, fiind ales de ctre programator cu respectarea
urmtoarelor condiii:
- numele clasei trebuie s nceap cu o liter i este format numai din litere, cifre i - eventual
- liniua de subliniere;
- prin convenie (dei aceasta nu este o regul de sintax), numele de clas ncepe ntotdeauna
cu o majuscul;
- n cazul numelor compuse din mai multe cuvinte, fiecare cuvnt ncepe cu majuscul;
- lungimea numelui nu este limitat, dar nu este recomandabil sa fie prea mare.
// corpul metodei main - este o succesiune de instruciuni i comentarii care respect sintaxa
limbajului Java
"abcde"+"fgh"
d ca rezultat irul "abcdefgh".
Operaia de concatenare este asociativ, dar nu este comutativ.
De exemplu, expresiile urmtoare sunt echivalente, ca urmare a asociativitii:
"ABC"+"DEF"+"GH"
("ABC"+"DEF")+"GH"
"ABC"+("DEF"+"GH")
"ABCDEFGH"
n schimb, expresia "uvw"+"ab" este echivalent cu "uvwab", n timp ce expresia "ab"+"uvw"
este echivalent cu "abuvw", deci concatenarea nu este comutativ
14.Metode pentru afiarea pe ecran a irurilor
n capitolul precedent, am folosit deja pentru afiarea irurilor de caractere metoda
System.out.println(<ir>)
la care vom aduga acum i metoda
System.out.print(<ir>)
n ambele metode, argumentul <ir> este un ir de caractere, care se afieaza pe ecran.
Deosebirea dintre ele const n faptul c, dup afiarea irului, metoda println transmite i
comanda de trecere la linie nou, n timp ce metoda print nu transmite o astfel de comand. n
consecin, n cazul afirii cu println, urmtoarea afiare se va face de la nceput de linie nou,
iar la afiarea cu print afiarea urmtoare se va face n continuare, pe aceeai linie.
Numele metodei println provine de la print line, care se traduce prin "tiprete o linie". Metodele
println si print aparin obiectului out din clasa System.
n limbajul Java, clasa System conine metodele prin care se comunic cu sistemul de operare al
calculatorului, iar obiectul out al acestei clase reprezint dispozitivul de ieire standard al
sistemului, care este de obicei unitatea de afiare de la consol (ecranul).
Metoda println actioneaz la fel ca metoda print, cu deosebirea c adaug la sfritul irului
afiat caracterul de control \n care constituie comanda de trecere la linie nou ( New Line).
15. Unitile lexicale ale limbajului Java
Unitile lexicale, numite i lexeme (engl. token, lexeme) sunt construciile elementare ale
limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere,
care au o anumit semnificaie n limbaj. Dup rolul ndeplinit, unitile lexicale sunt:
identificatori, cuvinte cheie, cuvinte rezervate, literali, separatori,operatori, comentarii i
spaii.
16.Identificatori
Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc
identificatori. Identificatorii se aleg de ctre programator, respectnd anumite reguli.
n limbajul Java, identificatorii sunt iruri formate din litere, cifre i caractere de subliniere ('_'),
care ncep cu o liter. Lungimea identificatorului nu prezint importan, ns acesta nu poate
conine spaii libere sau alte caractere, dect cele menionate aici.
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.
21. Operatori
Operatorii sunt simboluri ale unor operaii. Am folosit deja simbolul + ca operator de
concatenare (deci simbol al operaiei de concatenare). Operatorul poate fi format din unul sau
mai multe caractere. Entitatea asupra creia se aplic operatorul se numete operand. Dup
numrul de operanzi, operatorii pot fi unari, binari sau ternari.
Din punct de vedere matematic, operatorii sunt funcii cu unul, dou sau trei argumente
(argumentele fiind operanzii). De exemplu, expresia a+b, n care + este un operator binar, iar a i
b sunt operanzi, este o funcie de argumente a si b, care are ca valoare suma valorilor celor dou
argumente.
Dup efectul operatorului asupra operanzilor, operatorii pot fi fr efect lateral, care lasa
valorile operanzilor nemodificate, i cu efect lateral, care modific valorile operanzilor. Astfel,
operatorul + din exemplul anterior, este un operator fr efect lateral. n schimb, n expresia ++a
operatorul de incrementare ++ are efect lateral deoarece, n urma efectuarii operaiei, valoarea
operandului a crete cu o unitate.
22. Comentarii in fisierul sursa
Dup cum s-a aratat deja, n fiierele surs pot fi introduse comentarii , care au rolul de a da
omului, care citete programul respectiv, anumite explicaii necesare pentru o mai buna
nelegere a acestuia. Din punct de vedere sintactic, ntregul comentariu este privit ca o singur
unitate lexical, care este ignorat de ctre compilator, deci nu are efect asupra codului de octei
generat de acesta.
23. Spaii
ntre unitile lexicale ale programului pot fi introduse orict de multe spaii libere, fr ca
acestea s aib influen asupra sintaxei sau semanticii programului. Mai multe spaii libere
succesive sunt tratate de compilator ca i cnd ar fi un singur spaiu.
24. Variabile
In matematic, variabila este un simbol dat unei valori, care aparine unei mulimi de valori ce
constituie domeniul de definiie al variabilei respective.
n programare, variabila este un nume cruia i se asociaz o valoare. Numele variabilei este un
identificator , iar valoarea variabilei trebuie s aparin unui anumit tip de date . Asupra valorilor
variabilelor pot fi efectuate prin program anumite operaii.
25. Declararea i iniializarea variabilelor
n limbajul Java, orice variabil trebuie declarat nainte de a fi utilizat . Prin declararea
variabilei se nelege precizarea, pentru compilator, a tipului i numelui acesteia. Iniializarea
variabilei se face atunci, cnd acesteia i se d pentru prima dat o valoare i deci i se aloc
spaiu n memorie. Dac, la declararea variabilei, aceasta nu este i iniializat n mod explicit,
atunci ea este iniializata cu o valoare implicit, care va fi specificat la descrierea fiecrui tip
variabilele propriu-zise prin faptul c sunt tot perechi nume - valoare, numai c valoarea lor se
d o singur dat, sub forma de iniializare n declaraia de tip sau sub forma de atribuire, dup
care nu mai poate fi modificat. Se obinuiete ca numele de variabile finale s fie scrise n
ntregime cu majuscule.
Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final,
care este un cuvnt cheie
27. Tipul de date
-este unul din conceptele fundamentale ale programrii calculatoarelor. Tipul de date este o
mulime de valori, asociat cu o mulime de operaii care se pot face asupra valorilor
respective.
n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.
n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.
28. Tipurile de date primitive sunt predefinite n limbaj. Aceasta nseamn c numele,
mulimea de valori, mulimea de operaii i tipul rezultatului operaiilor pentu fiecare tip
primitiv sunt impuse prin limbaj i, deci, nu trebuie definite i nu pot fi modificate de
programator.
Tipurile de date primitive n limbajul Java se clasific astfel:
tipul boolean;
tipurile numerice
o tipuri intregi: byte, short, int, long;
o tipuri reale: float si double;
o tipul char
Pentru fiecare tip de date vom arta reprezentarea extern, reprezentarea intern, operaiile i
operatorii corespunztori.
Prin reprezentare extern, nelegem regulile dup care se scriu valorile datelor respective n
programe, n documente sau pe ecranul calculatorului. Reprezentarea extern a valorii ntr-un
program se numete literal.
Prin reprezentare intern, nelegem forma sub care datele respective apar n memoria mainii
virtuale Java. O proprietate foarte important a reprezentrii interne a datelor este c aceasta,
fiind destinat mainii virtuale Java, nu depinde de calculatorul concret pe care se va executa
programul.
29. Operaia de atribuire
Prin operaia de atribuire se d (se atribuie) unei variabile o nou valoare, care o nlocuiete pe
cea deja existent. Operatorul de atribuire este = (semnul egal, care ns aici se citete "se
atribuie") este un operator binar cu efect lateral. Expresia a=b, n care a este o variabila, iar b
este un operand care poate fi un literal, o variabil sau o expresie, are semnificaia "se atribuie
variabilei a valoarea operandului b". Atribuirea este posibil numai daca valoarea operandului
b este de acelasi tip cu variabila a, sau dac se poate converti implicit la acest tip. Atribuirea
este o operaie cu efect lateral, deoarece produce modificarea valorii operandului situat n partea
stnga a operatorului de atribuire.
Valoarea expresiei
a+b
adunare
a-b
scadere
a*b
a/b
a%b
modulo
Prin mprire ntreag nelegem mprirea fcut astfel, nct ctul sa fie un numr ntreg (fr
extragerea prii fracionare (situate dupa virgul).
10
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.
a<<s
>>
a>>s
>>>
Semnificatie
<
<=
>
>=
==
este egal cu
!=
este diferit de
11
bitului i al rezultatului.
ai
bi
~a
a&b
a|b
a^b
short
int
long
float
double
short
char
byte
int
long
float
De exemplu, tipul int se poate converti implicit n oricare din tipurile long, float sau double, dar
nu i n tipurile byte sau short.
38. Conversia de tip explicit se face prin operatorul unar numit cast, care are forma (tip),
adic este format din numele tipului ctre care se face conversia, cuprins ntre paranteze. Acesta
este un operator fr efect lateral, deci care nu modific valoarea operandului. De exemplu,
expresia (byte)a se va folosi pentru a converti valoarea operandului a la tipul byte. Aceasta
nseamn c valoarea variabilei a rmne neschimbat, ns valoarea expresiei (byte)a se obine
din cea a lui a prin convertirea ei la tipul byte.
Utilizarea operatorului cast se justific atunci cnd, n situaia respectiv, conversia implicit nu
este posibil. Nu este ns greit dac folosim acest operator chiar i cnd conversia respectiv
se poate face i implicit.
39. Tipuri numerice
Sub aspect conceptual, datele care aparin acestor tipuri sunt numere, asupra crora pot fi
aplicate operaiile aritmetice (adunare, scdere, nmulire, mprire) i operaiile de comparaie
aritmetic (mai mic, mai mare, egal, diferit de).
12
Din punct de vedere matematic, aceste date pot fi numere ntregi sau reale. Existena mai multor
tipuri n cadrul fiecreia din aceste dou categorii se datorete particularitilor de reprezentare a
datelor n memorie.
Tipurile de date numerice n Java sunt urmtoarele:
13
Lungimea
Intervalul de valori
float
double
14
Caracterul
Reprezentarea in Unicode
Semnificatia
'\b'
'\u0008'
'\t'
'\u0009'
'\n'
'\u000a'
'\f'
'\u000c'
'\r'
'\u000d'
'\"'
'\u0022'
'\''
'\u0027'
'\\'
'\u005c'
bar invers (backslash)
Datele de tip char pot fi folosite n operaii numerice, n care caz ele sunt interpretate drept numere
intregi fr semn, conform cu reprezentarea lor intern prin numere binare. Din acest motiv, n
limbajul Java datele de tip char sunt incluse n categoria celor de tipuri ntregi.
15
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:
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 ';'.
16
52. Instruciunea if
Instruciunea if servete pentru realizarea structurii alternative din programarea structurat. Sub forma
ei cea mai simpl, aceast instruciune se scrie astfel:
if(expresie_boolean) instruciune
unde instruciune poate fi orice instruciune valabil n limbajul Java: instruciune simpl sau
structurat, inclusiv un bloc sau un alt if. Remarcm c n forma general de mai sus nu am pus la
17
sfrit caracterul ';' (punct i virgul). Dac instruciune este o instruciune simpl, ea include i acest
simbol.
Semnificaia instruciunii if este urmtoarea: dac valoarea expresiei booleene din parantez este
true, atunci se execut instruciune, iar altfel nu se execut nimic, continundu-se programul.
53. Instruciunea if .. else
Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma
if(expresie_boolean)
instruciune_1
else
instruciune_2
n care instruciune_1 i instruciune_2 pot fi instruciuni simple sau structurate.
Interpretarea acestui if..else este urmtoarea: dac expresie_logic are valoarea true, atunci se
execut instruciune_1, iar altfel se execut instruciune_2.
18
19
20
21
22
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,
daca r1 este o variabil referin care indic un anumit obiect din memorie, iar met(a)este o metod
nestatic a clasei creia i aparine acest obiect, atunci r1.met(a) are ca efect invocarea metodei met
pentru obiectul indicat de r1. n acest fel, metoda met(a) va folosi att cmpurile (nestatice ale)
obiectului indicat de referina r1, ct i cmpurile (statice ale) clasei creia i aparine acest obiect.
Dac o metoda are efect lateral, ea poate fi invocat i sub forma de instruciune. Aceast instruciune
const numai din expresia de invocare a metodei, urmat de punct_i_virgul. n acest caz, valoarea
ntoars de metod (valoarea expresiei) este ignorat, folosindu-se numai efectul lateral al metodei
respective. Un exemplu cunoscut deja este instruciunea
System.out.println(sir);
Este evident c metodele care ntorc void (procedurile) pot fi invocate numai sub form de
instruciuni, fiind folosite pentru efectul lor lateral.
66. Motenirea i polimorfismul
Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte.
Ea const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i
superclas, iar clasele derivate se numesc i subclase.
Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate
cmpurile i metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm
pot exista, de asemenea, cmpuri i/sau metode suplimentare.
Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o
metod a superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai
nume i aceeasi lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un
comportament diferit.
67. Constructori
Constructorul este o procedur special, prin care se construiesc obiecte dintr-o anumit clas.
Constructorul are ntotdeauna acelai nume cu clasa. n schimb, o clas poate avea mai muli
23
constructori, care pot s difere ntre ei prin numrul i/sau tipul argumentelor. Constructorul aloc n
memoria dinamic spaiul necesar pentru un obiect din clasa creia i aparine i iniializeaz
cmpurile acestui obiect cu valori care depind de argumentele sale.
68. Ierarhia de clase Java
n general, n programarea orientat pe obiecte este permis motenirea multipl, adic o clas poate
avea mai multe superclase. n limbajul Java este permis numai motenirea simpl, deci fiecare clas
poate avea numai o singur superclas. Aceast ierarhie de clase este unic, adic orice clas are
obligatoriu o superclas i numai una. Singura excepie o constituie clasa Object, care este rdcina
ierarhiei de clase Java i nu are superclas.
Vom arata ulterior c lipsa motenirii multiple este compensat n Java prin faptul c fiecare clasa
poate avea mai multe interfee.
69. Pachetele de clase din Java API
Clasele sunt grupate n pachete (englez: package). Pachetul este o colecie de clase reutilizabile
destinate unui anumit domeniu de utilizare, care sunt puse la dispoziia programatorului sub form
compilat (bytecode). Ar putea fi numit i "bibliotec de clase", dar autorii platformei Java au preferat
denumirea de pachet.
Pachetul poate avea subpachete. Daca pachetul p are subpachetul q, atunci p.q este numele complet
(numele calificat) al subpachetului q. Acest subpachet poate avea, la rndul sau, alte subpachete.
Java API (Application Programming Interface - interfaa de programare de aplicaii) este descrierea
unui set standard de pachete necesare programrii n Java. Pentru pachetele coninute n Platforma
Java 2 Standard Edition (J2SE) aceast documentaie poate fi gasit pe Internet la urmatoarea adres:
java.sun.com/products/j2se/1.3/docs/api/index.html - la firma Sun Microsystems;
Principalele pachete de clase sunt:
java.lang - conine clasele de baz necesare programrii n limbajul Java;
java.io - conine clasele necesare pentru programarea operaiilor de intrare/ieire;
java.util - conine clase pentru anumite structuri de date tipice (list, stiv etc) i alte clase utile;
java.awt si javax.swing - conin clase necesare pentru realizarea interfeelor grafice;
java.applet - pentru programarea appleturilor.
Exist ns i multe alte pachete, necesare n diferite domenii de aplicaie.
70. Declaraia import
Pentru a putea utiliza ntr-un fiier-sursa Java un anumit pachet (subpachet) de clase, la nceputul
fiierului respectiv trebuie pus declaraia
import nume_pachet.*;
n care nume_pachet este numele calificat al pachetului respectiv. De exemplu, pentru a utiliza orice
clase din pachetul java.io se pune declaraia
import java.io.*;
Pentru clasele din pachetul java.lang nu este necesar o declaraie de import, acestea fiind importate
implicit.
Pentru a importa numai o anumita clas dintr-un pachet, se foloseste declaraia
import nume_pachet.NumeClasa;
De exemplu, pentru a importa clasa File din pachetul java.io se folosete declaraia
24
import java.io.File;
71. Utilizarea claselor din pachetul java.lang
Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet
nu este necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din
pachetul java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet. Noi vom
prezenta aici cteva clase mai frecvent utilizate.
72. Clasa Object
Clasa Object este rdcina ierarhiei de clase a platformei Java. Este singura clas care nu are o
superclas. Orice alt clasa este derivat direct sau indirect din clasa Object.
Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin
la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori
referine la orice fel de obiecte, indiferent de clasa creia i aparin.
n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate
celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua
aciuni specifice acestor clase.
73. Clase de excepii
n pachetul java.lang exist i numeroase clase de excepii. Instanele acestor clase sunt creeate de
ctre maina virtual Java atunci cnd se produce o excepie, adic o situaie anormal n procesul de
calcul. Toate aceste clase sunt descrise n documentatia Java API. Vom meniona aici numai dou
dintre ele, celelalte urmnd s fie indicate la descrierea claselor care conin metode care pot genera
excepii.
n limbajul Java se face distincie ntre excepie i eroare. Se consider ca excepiile sunt incidente
care pot fi captate prin mecanismul try .. catch i pot fi deci tratate prin program, n timp ce erorile
sunt incidente grave, care - de regul - nu pot fi tratate prin program ci produc oprirea executrii
acestuia
74. Clasa Exception
Aceast clas este rdcina ierarhiei claselor de excepii. n consecin, atunci cnd dorim ca in clauza
catch sa fie captat orice fel de excepie, scriem aceast clauz sub forma
catch(Exception e) {
instructiuni_de_tratare_a_exceptiei e
}
unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori:
public Exception()
creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj.
public Exception(String s)
creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se
indic, de regul, ce incident a condus la generarea excepiei respective.
75. Clasa Class
25
26
27
28
Remarcm, deci, c exist o deosebire ntre crearea cmpurilor (variabilelor membre) i crearea
variabilelor locale. La crearea cmpurilor, acestora li se atribuie implicit o valoare iniial, n timp ce
la crearea variabilelor locale acestora trebuie sa li se atribuie valori n mod explicit. Dac o variabil
local apare ntr-o expresie fr s aib o valoare atribuit anterior, compilatorul Java semnaleaza
aceast situaie ca o eroare de programare.
85. Declararea metodelor
n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i
metodele prin care se trateaz aceste cmpuri.
Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile
argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv.
Cea mai simpl form sintactic a declaraiei de metod este urmtoarea:
tip_valoare_intoarsa nume_metoda(declaratii_de_argumente) {
corpul_metodei
}
n care:
tip_valoare_intoarsa - este tipul valorii primitive sau clasa valorii-referin ntoars de aceasta
metod;
nume_metoda- este un identificator care, n mod uzual, ncepe cu liter mic i constituie numele
metodei;
declaratii_de argumente - este o list de declaraii de argument separate prin virgul, deci ea poate
avea forma:
declaratie_argument1, declaratie_argument2, ... declaratie_argumentN
dar poate fi i vid. Lista declaraiilor de argument este cuprins ntre paranteze rotunde. Fiecare
declaraie de argument are forma
tip_argument nume_argument
n care
tip_argument - este tipul sau clasa argumentului respectiv;
nume_argument- este un identificator care, n mod uzual, ncepe cu liter mic.
Dup aceast list de argumente se deschide acolada unui bloc, care conine corpul metodei, adic
secvena de instruciuni prin care se calculeaz valoarea funciei respective i/sau - dac este cazul se efectueaz aciunile care constituie efectele laterale ale acesteia.
86. Instruciunea return
Dac funcia ntoarce o valoare (diferit de void), aceasta se indic prin instruciunea
return expresie;
Efectul acestei instruciuni este urmtorul: se evalueaza expresia expresie i se ncheie executarea
funciei respective, ntorcnd valoarea astfel obinut. n consecin, chiar dac dup instruciunea
return mai apar n corpul funciei respective i alte instruciuni, acestea nu vor mai fi executate.
Dac metoda nu ntoarce o valoare (ntoarce void), folosirea instruciunii return nu este absolut
necesar, ncheierea execuiei fcndu-se cnd se ajunge la acolada prin care se sfrsete blocul
funciei. Totui, dac este necesar s se ncheie n mod abrupt executarea corpului funciei, se poate
folosi instruciunea return fr expresie.
87. Metode statice
La declararea metodelor statice, n faa tipului valorii ntoarse se pune modificatorul static. Metodele
care conin n declaraie acest modificator se numesc statice sau ale clasei, spre deosebire de metodele
obinuite care sunt ale instanei. n corpul metodelor statice se pot folosi numai cmpurile statice ale
clasei respective i se pot invoca numai alte metode statice ale acestei clase.
29
30
31
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.
32
n general, n programarea orientat pe obiecte, motentirea poate fi simpl sau multipl. n cazul
motenirii simple fiecare clas are cel mult o superclas,
Polimorfismul (englez: polymorphism) permite ca aceeai operaie s se realizeze n mod diferit n
clase diferite. S considerm, de exemplu, c n clasa Figura_geometrica exist metoda arie(), care
calculeaza aria figurii respective. Clasele Cerc, Triunghi, Patrat sunt subclase ale clasei
Figura_geometrica si vor moteni, deci, de la aceasta metoda arie(). Este ns evident c aria cercului
se calculeaz n alt mod dect aria patratului sau cea a triunghiului. Pentru fiecare din instanele
acestor clase, la calcularea ariei se va aplica metoda specific clasei respective.
33
exist, trebuie s fie prima instruciune din corpul constructorului clasei derivate. n lipsa ei, va fi
invocat constructorul fr parametri al superclasei.
Este posibil, de asemenea, ca ntr-un constructor s se invoce alt constructor al aceleeai clase, sub
forma
this(lista_parametri_efectivi);
102. Metode finale
Metodele finale sunt metode care nu mai pot fi redefinite n clasele derivate. Astfel de metode se
declar cu modificatorul final. De exemplu, n clasa Object, metoda getClass este o metoda final,
fiind declarat sub forma public final Class getClass(). Aceasta inseamn c n nici o alt clas nu este
posibil ca aceasta metod s fie redefinit. Cnd declarm propriile noastre clase, avem i noi
posibilitatea s declarm c unele din metodele lor sunt finale.
103. Clase finale
Dac se dorete ca o clas s nu poat avea subclase, la declararea acesteia se folosete modificatorul
final. De exemplu, dac se dorea ca clasa CD1, dat ca exemplu mai sus, s fie finala, ea trebuia
declarata sub forma
public final class CD1 extends S1
sau, dac nu se dorea sa fie publica, sub forma
final class CD1 extends S1
104. Redefinirea metodelor
Metodele de instan (nestatice) ale unei clase pot fi redefinite n subclasele acesteia. Redefinirea
unei metode se face declarnd n subclas o metod avnd aceeai signatur cu una din superclas.
Atunci cnd se redefinete o metoda protejat, modificatorul de acces al acesteia poate fi meninut,
sau poate fi transformat n public.
n subclas pot fi folosite, totui, i metodele superclasei care au fost redefinite, dac la invocarea
acestor metode se foloseste referina super.
105. Ascunderea cmpurilor
Cmpurile declarate ntr-o clas pot fi ascunse prin cmpuri cu acelai nume declarate n subclas,
chiar dac acestea au tipuri diferite. Aceasta nseamna c, n mod normal, n metodele clasei se
folosesc cmpurile declarate n clasa respectiv, i nu cele cu acelai nume ale superclasei. n subclas
pot fi, totui, folosite i cmpurile superclasei, dac sunt calificate cu referina super.
106. Ascunderea metodelor statice
Metodele statice nu aparin instanelor, ci clasei. Din aceast cauz, dac ntr-o subclas se declara o
metoda static cu aceeai signatur ca o metod a superclasei, atunci se spune c metoda din subclas
o ascunde pe cea din superclas (nu o redefinete). Modul de lucru cu metodele ascunse este similar
cu cel n care se lucreaz cu cmpurile ascunse. Vom nelege mai bine deosebirea dintre redefinire i
ascundere cnd vom studia polimorfismul.
34
clas ca oricare alta, care poate avea i instane. Metoda main(), fiind static, nu poate utiliza direct
dect cmpurile statice i metodele statice ale acestei clase. Totui, n metoda main() sau n alte
metode, pot fi create instane ale acestei clase, putndu-se astfel utiliza i cmpurile i metodele de
instan ale acestora.
108. Clase abstracte
Clasele abstracte conin n declaraia lor modificatorul abstract. Clasele abstracte nu pot fi
instaniate. Remarcm nsa c pot exista clase care nu pot fi instaniate dei nu sunt abstracte, cum
sunt, de exemplu, clasele care nu au dect constructori privai.
Cu toate c clasa abstract nu poate fi instaniat, se pot declara variabile aparinnd unor clase
abstracte. Acestor variabile li se pot da nsa ca valori numai referine ctre instane ale unor subclase
concrete. De exemplu, daca A este o clas abstracta, iar B este o subclas concreta a clasei A, atunci
este corect declaraia
A a1=new B();
Declararea unei metode abstracte:
- antetul metodei trebuie sa conina modificatorul abstract;
- corpul metodei se nlocuiete prin caracterul ';' (punct i virgul).
109. Interfee
Conform principiului ncapsulrii, fiecare clas are "interfaa" sa intrinsec, prin care poate fi accesata
din exterior. Aceasta "interfa" conine toate datele i metodele publice ale clasei respective.
Pentru a compensa lipsa motenirii multiple, n limbajul Java s-a admis c o clas poate avea mai
multe interfee i c mai multe clase pot implementa aceeai interfa. S-a introdus astfel o nou
categorie de componente, numite interfee, care se declar n mod asemntor cu nite clase abstracte,
dar nu sunt nglobate, aa cum sunt clasele abstracte, n ierarhia unic de clase .
Interfaa este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie
sa le aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe
interfee, ea conine toate metodele publice i variabilele finale publice ale acestora.
Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot
declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la
obiecte aparinnd unei clase, adic sub forma:
interfaa nume_variabila1[=initializare1], ..., nume_variabilaN[=initializareN];
n care interfaa este numele unei interfee, iar celelalte elemente ale declaraiei sunt aceleai ca n
cazul declarrii de referine la obiecte. Interfeele pot fi i ele organizate ierarhic, aplicndu-se
principiul motenirii. n schimb, pentru interfee, ierarhia nu mai este unic, aa cum este n cazul
claselor, i se admite motenirea multipl.
v4=(B)w1;
110. Declararea interfeelor
O declaraie de interfa introduce un nou tip referin, ai crui membri sunt cmpuri statice finale i
metode abstracte. n consecin, interfaa se aseamn cu o clasa abstract pur, care nu conine
dect metode abstracte i cmpuri statice finale i nu se ncadreaz n ierarhia unic de clase
35
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
}
Spre deosebire de clase, la care motenirea multipl este interzis (o clas poate avea numai o singura
superclas), n cazul interfeelor motenirea multipl este permis. n consecin, clauza extends
poate conine o list de nume de interfee separate prin virgule.
36
o instan. Clasa interioar are acces la toi membrii clasei care o conine, att la cei statici, ct i la
cei de instan (nestatici).
112. Clasa String
public final class String
extends Object
implements Serializable, Comparable
Instantele clasei String sunt siruri de caractere. Orice literal sir in limbajul Java, de exemplu "abc",
este un astfel de obiect. Sirurile sunt constante, deci continutul lor nu poate fi modificat. Pentru a
obtine siruri modificabile se va folosi clasa StringBuffer.
Nota: amintim ca in limbajul Java reprezentarea interna a caracterelor se face pe 16 biti, in Unicode.
Campuri:
public static Comparator CASE_INSENSITIVE_ORDER
Campul contine un Comparator care ordoneaza obiectele-sir cand ele sunt comparate cu metoda
comparetoIgnoreCase().
Constructori:
public String()
Creeaza un sir vid.
public String(byte[] bytes)
Creeaza un obiect al clasei String care contine caracterele din tabloul de octeti primit ca
argument. Se considera ca in acest tablou caracterele sunt reprezentate pe 8 biti, in codul local valabil
pe calculatorul pe care se executa programul. Daca referinta la tablou este nula se genereaza o
NullPointerException.
112. Clasa StringBuffer
public final class StringBuffer
extends Object
implements Serializable
Un StringBuffer implementeaza un sir de caractere care poate fi modificat. El reprezinta o zona
tampon din memorie, in care se ppoate plasa un sir de caractere.
Operatiile principale asupra unui StringBuffer sunt metodele append si insert. Fiecare din ele
converteste o data intr-un String, pe care apoi il adauga la sirul din StringBuffer sau il insereaza in
acesta pe o pozitie data.
Fiecare StringBuffer are o capacitate si o lungime. Lungimea este numarul efectiv de caractere
continute, iar capacitatea este numarul maxim de caractere care incap in zona tampon rezervata in
memorie. Daca, printr-o noua adaugare de caractere, lungimea depaseste capacitatea, atunci
capacitatea se mareste in mod automat.
113. Clasa Math
37
38
39
40
41
(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.MouseMotionListene
123. Evenimente de tast
De cte ori se apas sau se elibereaz o tast, componenta activ a interfeei grafice genereaz un
eveniment de tast din clasa java.awt.event.KeyEvent. Acesta poate fi tratat cu un "asculttor de
taste" care implementeaz interfaa java.awt.event.KeyListener sau care extinde clasa
java.awt.event.KeyAdapter.
Se disting urmtoarele evenimente generate la acionarea tastelor:
- a fost apasat o tast (KEY_PRESSED);
- a fost eliberat o tast (KEY_RELEASED);
- a fost "tiprit" un caracter, adic a fost apasat i eliberat o tast care transmite un caracter tipribil
(KEY_TYPED).
Aceste situaii pot fi detectate cu metodele corespunztoare ale interfeei KeyListener.
Evenimentul generat de tast conine, n afar de codul tastei acionate, i informaii privind starea
tastelor auxiliare Ctrl, Alt i Shift n momentul producerii evenimentului respectiv. Aceste stri pot fi
detectate cu metodele corespunztoare ale interfeei superclasei java.awt.event.InputEvent.
124. Adugarea unei componente la fereastra principal a aplicaiei
Pn n prezent, am artat c, atunci cnd folosim JFC/Swing, fereastra principal a aplicaiei este o
instan a clasei javax.swing.JFrame sau a unei subclase a acesteia. Pentru a construi o interfa
utilizator grafic este necesar ca n fereastra principal s introducem diverse componente. Acestea
pot fi componente simple, ca etichete, butoane, casete de validare, cmpuri de text etc., sau pot fi
containere, care conin - la rndul lor - alte componente. Pentru realizarea acestor componente simple
i containere se folosesc clasele din pachetele java.awt i javax.swing, care sunt descrise n
documentaia Java API.
Adugarea de componente nu se face direct la instanele clasei JFrame. n JFrame exist un Container
(un obiect dintr-o subclas a clasei Container) numit contentPane, la care se pot aduga componente.
O referin la acest Container se obine prin metoda public Container getContentPane(), existent n
clasa JFrame. Adugarea de componente se face prin una din metodele add() ale clasei Container.
Dac, de exemplu, comp este referin la o component, atunci expresia getContentPane().add(comp),
folosit ntr-o metod a clasei JFrame sau a subclaselor ei, adaug componenta comp la containerul
contentPane coninut n JFrame.
125.
Gestionarea poziionrii componentelor
42
Am artat n seciunea precedent cum se poate plasa ntr-un container (n particular ntr-un
contentPane) o singur component. n mod normal ns, ntr-un comtainer se plaseaz mai multe
componente. n acest caz, este foarte important s se stabileasc modul n care aceste componente
sunt poziionate pe suprafaa containerului. n acest scop, a fost introdus conceptul de gestionar de
poziionare (n englez: Layout Manager).
Gestionarul de poziionare este o clas care asigur poziionarea i redimensionarea automat a
componentelor situate ntr-un container, att la crearea containerului, ct i la modificarea
dimensiunilor acestuia. Orice gestionar de poziionare implementeaz interfaa
java.awt.LayoutManager sau subinterfaa acesteia java.awt.LauoutManager2. n cele ce urmeaz,
vom studia cele mai larg utilizate clase de gestionare a poziionrii, existente n pachetele java.awt i
javax.swing.
Fiecare clas de container are un gestionar de poziionare implicit. Acesta este BorderLayout pentru
Frame i JFrame.contentPane i FlowLayout pentru clasa Panel. Modificarea gestionarului de
pozitionare se face prin metoda
public void setLayout(LayoutManager manager)
din clasa java.awt.Container.
126. Clasa BorderLayout
ncepem cu aceast clas, deoarece este gestionarul de poziionare implicit pentru coninutul
instanelor clasei JFrame. n acest caz, se consider c suprafaa containerului este imparit n cinci
zone numite, respectiv, NORTH, SOUTH, WEST, EAST si CENTER. n fiecare din aceste zone se
poate plasa numai o singur component, care poate fi ns ea nsi un container. Adugarea de
componente la container se face, n acest caz, folosind metoda add(componenta,
BorderLayout.ZONA), unde componenta este referina la componenta adaugat, iar ZONA este una
din cele cinci zone menionate mai sus. Dac se folosete metoda add(componenta), fr a indica
zona, componenta respectiv este plasat implicit n zona CENTER, aa cum s-a procedat n seciunea
precedenta, n exemplul din fiierul AdComp.java.
127. Clasa FlowLayout
Gestionarul de poziionare java.awt.FlowLayout plaseaz componentele pe suprafaa containerului
una dup alta, n ordinea n care acestea sunt adugate, de la stnga la dreapta i de sus n jos. Cnd sa terminat o linie, se trece la linia urmtoare. Numrul de componente pe o linie depinde de limea
componentelor i de limea containerului n care sunt acestea plasate.
Este posibil s se specifice modul de aliniere a componentelor: la stnga, la dreapta sau la centru.
Aceasta se face fie specificnd alinierea ca argument al constructorului, fie invocnd metoda
public void setAlignement(int align)
n care argumentul align poate fi FlowLayout.LEFT, FlowLayout.RIGHT sau FlowLayout.CENTER.
Remarcm c aplicaia ButoaneF este o modificare a aplicaiei Butoane din fiierul Butoane.java i se
deosebete de aceasta prin urmtoarele:
- n metoda main se preia un argument din linia de comand, care trebuie s fie numrul de butoane
de acionare solicitat de utilizator, dup care se construiete fereastra aplicaiei;
- s-a introdus tabloul bc[] care conine referine la instanele clasei ButonContor. Att acest tablou,
ct i butoanele respective, se creeaz n constructorul clasei IUG;
- dup adugarea butoanelor de contorizare, se adaug la fereastra aplicaiei butonul de anulare br,
din clasa JButton;
- pentru ascultarea acionrii butonului de anulare, a fost declarat clasa imbricat Anulare, care
implementeaz interfaa ActionListener.
43
44
45
oricare altul. Panourile sunt frecvent folosite pentru a plasa pe ele diferite componente, formnd un
grup care se plaseaza apoi ntr-un alt container. Clasa javax.swing.JPanel este varianta de Panel
folosit n JFC/Swing, fiind un container genreric.
143. Clasa Box
Clasa javax.swing.Box are ca instane containere speciale, care nu pot folosi dect gestionarul de
poziionare javax.swing.BoxLayout. Orice incercare de a-i pune alt gestionar produce o eroare de
execuie din clasa AWTError.
Clasa dispune de metode statice pentru crearea de "casete" (instane ale clasei Box) orizontale sau
verticale:
public static Box createHorizontalBox()
public static Box createVerticalBox()
Se pot creea, de asemenea "componente invizibile" de dimensiuni fixe sau variabile, care pot fi
folosite la distanarea componentelor vizibile. n acest scop, se folosesc metodele
public static Component createRigidArea(Dimension d) - creeaza o "component ascuns" de
dimensiune fix;
public static Component createHorizontalStrut(int width) - creeaza o "component ascuns" de
lime fix, dar de nlime variabil;
public static Component createVerticalStrut(int height) - creeaza o "component ascuns" de
nalime fix, dar de lime variabil;
public static Component createGlue() - creaza o "component ascuns" cu ambele dimensiuni
variabile;un container din clasa Box, componentele pot fi amplasate numai pe o singur direcie:
orizontal sau vertical.
143. Componentele din JFC/Swing
Pentru a realiza interfaa utilizator grafic a unei aplicaii folosind JFC/Swing, este necesar ca la
fereastra aplicaiei (din clasa JFrame) s se adauge diferite obiecte grafice numite componente.
Deosebim:
1. Componente de control: butoane, butoane radio, casete de validare, liste, liste ascunse, meniuri,
rigle ajustabile, cmpuri de text.
2. Componente de afiare needitabile: etichete, indicatoare, etc.
3. Componente de afiare editabile: zone de text, tabele editabile, selectoare de culori, selectoare de
fiiere, arbori.
4. Containere: panouri, panouri glisante, etc.
144. Clasa JComponent
Clasa abstracta javax.swing.JComponent extinde clasa java.awt.Container. In consecin, orice
componenta Swing are i caracteristici de container.
Iat, ca exemplu, cteva faciliti pe care le ofera orice JComponent:
- posibilitatea de a-i ataa componentei o "inscripie volanta" (englez: ToolTip), adic o inscripie
explicativ care apare cnd punem cursorul de mouse pe componenta respectiv, fr s apsm
butonul. O astfel de inscripie se ataeaz componentei prin metoda
public void setToolTipText(String text);
- posibilitatea de a-i pune componentei o bordur, folosind metoda
46
47
mouse apsat deasupra lui, butonul se afl n starea "apsat" ("acionat"). De fiecare dat cnd este
acionat, butonul genereaz un AcionEvent i un ChangeEvent. Cnd este eliberat, genereaz numai
un ChangeEvent. Butonul genereaz de asemenea, ca orice alt component, evenimente de
component, de mouse i de tast. Totui, n cazul butoanelor obinuite, cel mai frecvent se folosesc
evenimentele de aciune (ActionEvent), care sunt ascultate de un asculttor de aciune
(ActionListener). Clasele Button i JButton sunt specificate mai detaliat n Indexul de clase.
149. Butonul cu dou stri stabile
Clasa javax.swing.JToggleButton este derivata din javax.swing.AbstractButton i reprezint
butoane cu dou stri stabile. Trecerea de la o stare la alta este impus de utilizator prin click de
mouse sau este comandat prin program. n practic, cel mai frecvent se folosesc caseta de validare i
butonul radio, realizate prin subclase ale clasei ToggleButton i prezentate n continuare. O specificare
mai detaliat a clasei JToggleButton este dat n indexul de clase.
150. Caseta de validare
Caseta de validare este un obiect de control cu dou stri stabile. La fiecare click de mouse pe
suprafata casetei de validare, aceasta trece dintr-o stare n cealalt. n mod obinuit, caseta de validare
este reprezentat grafic printr-un patrat, n care apare un simbol de bifare (de validare), cum ar fi
simbolul V sau X, cnd caseta se gsete n starea "selectat". n starea opus (deselectat), caseta este
vid. Imaginea casetei este insoit i de un text explicativ.
151. Butonul radio
Butonul radio este un buton cu dou stri stabile, care face parte dintr-un grup de butoane, astfel c la
un moment dat numai unul dintre ele poate fi "selectat". n momentul n care este selectat ("apsat")
un buton al grupului, se deselecteaz automat cel care era selectat anterior.
n JFC/Swing, butoanele radio sunt realizate ca instane ale clasei javax.swing.JRadioButton, care
este derivat din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa
javax.swing.ButtonGroup.
152. Liste
n cazul interfeelor utilizator grafice, se numete list o component care conine articole selectabile.
Selectarea lor se face de ctre utilizator, prin click de mouse pe articolul respectiv. Lista poate fi cu
selecie simpl sau cu selecie multipl, dup cum pot fi selectate simultan unul sau mai multe
articole.
n JFC/Swing, listele se realizeaz ca instane ale clasei javax.swing.JList. Articolele din list pot fi,
n principiu, orice obiecte afiabile. La crearea listei, constructorului i se d ca argument tabloul
obiectelor pe care le va conine lista. Ulterior este posibil s se adauge articole la list, sau s se
elimine.
Daca lista este mai lunga dect spaiul de afiare disponibil, ea poate fi pus pe un panou glisant, din
clasa javax.swing.JScrollPane.
Punerea articolelor n list poate fi fcut astfel:
- la crearea listei, folosind unul din constructorii
public JList(Object[] listData) - primete ca argument un tablou de obiecte, care sunt articolele din
list
public JList(Vector listData)- primete ca argument o instan a clasei java.util.Vector, care are ca
elemente articolele listei;
- n timpul utilizrii listei, invocndu-se una din metodele
public void setListData(Object[] listData)
public void setListData(Vector listData)
48
153.Liste ascunse
Lista ascuns este o list din care se vede un singur articol (cel care este selectat), deci ocupa pe ecran
spaiu mult mai putin dect una obinuit. Celelalte articole ale listei sunt "ascunse" i devin vizibile
numai dac se face click pe articolul vizibil. Dac acum facem click de mouse pe un alt articol din
lista devenit vizibil, acest nou articol este selectat (rmne vizibil), iar celelalte dispar. ntr-o list
ascuns nu este posibil selecia multipl.
Punerea articolelor n list se poate face astfel:
- la crearea listei ascunse, folosind unul din constructorii
public JComboBox(Object[] items)
public JComboBox(Vector items)
- n timpul utilizrii listei, folosind metodele
public void addItem(Object anObject) - adaug un articol la sfritul listei;
public void insertItemAt(Object anObject, int index) - nsereaz un articol pe poziia index.
Eliminarea unui articol din list se face cu una din metodele
public void removeItem(Object anObject) - elimin articolul anObject;
public void removeItemAt(int anIndex) - elimin articolul de pe poziia anIndex.
154. Rigla ajustabil
Clasa javax.swing.JSlider ofer o component care are aspectul unei rigle prevzute cu cursor. Prin
deplasarea cursorului cu ajutorul mouse-ului se modific valoarea indicat de rigl. Valoarea minim
i cea maxim de pe scala riglei i valoarea unei diviziuni se indic prin program. Rolul riglei poate fi
asemnat cu cel al unui dispozitiv de ajustare continu, cum este poteniometrul din aparatura
electronic.
La deplasarea cursorului, rigla genereaz evenimente din clasa javax.swing.event.ChangeEvent,
care sunt ascultate cu o clas care implementeaz interfaa javax.swing.event.ChangeListener.
Crearea riglei se face folosind unul dintre constructorii ei, dintre care cel mai complet este
public JSlider(int orientation, int min, int max, int value)
n care
orientation - orientarea riglei, care poate fi JSlider.HORIZONTAL sau JSlider.VERTICAL;
min, max - valorile minim i maxim de pe scala riglei;
value - valoarea indicat iniial de cursorul riglei (trebuie s fie n intervalul [min,max]).
Pentru a stabili aspectul riglei se folosesc metodele
public void setMajorTickSpacing(int n) - stabilirea valorii diviziunilor mari
public void setMinorTickSpacing(int n) - stabilirea valorii diviziunilor mici
public void setPaintTicks(boolean b) - determin dac diviziunile vor fi vizibile
public void setPaintLabels(boolean b) - determin dac vor fi afiate valorile numerice ale
diviziunilor.
155. Meniuri
La fel ca listele sau butoanele radio, meniurile permit utilizatorului s aleag una din mai multe
opiuni posibile. n JFC/Swing se disting dou categorii de meniuri:
- meniuri cu bar, care pornesc dintr-o bar situat la partea superioar a ferestrei aplicaiei;
- meniuri derulante (pop-up), care apar n poziia n care se gsete cursorul de mouse.
49
50
51
Culoarea n sistemul RGB poate fi exprimat nu numai printr-o instan a clasei Color, ci i printr-un
numr ntreg (de tip int), n care cei patru octei au, respectiv, valorile componentelor alpha, r, g, b
exprimate n intervalul [0..255]. Componentele sunt plasate astfel: alpha n biii 24..31, r n biii
16..23, g n biii 8..15 i b n biii 0..7.
Clasa Color conine, de asemenea, constructori i metode care suport sistemele de culori sRBG i
HSB. Standardul sRGB definete o variant standardizat a sistemului RGB, destinat monitoarelor
cu tub catodic. n acest sistem, parametrii r, g, b i alpha se exprim prin numere reale n intervalul
[0.0...1.0].
164.
Alegerea culorii folosind clasa JColorChooser
Pentru a alege culoarea n mod interactiv, n JFC/Swing este prevazut clasa
javax.swing.JColorChooser. Instanele acestei clase sunt panouri de selectare a culorii, care pot fi
folosite att prin ncorporarea lor ntr-o fereastr obinuit, ct i sub forma unei ferestre de dialog.
Pentru a creea o fereastr de dialog, care conine n ea un JColorChooser i ntoarce culoarea
selectat, n clasa JColorChooser exist metoda
public static JDialog createDialog(Component c,String title, boolean modal, JColorChooser
chooserPane, ActionListener okListener, ActionListener cancelListener)
n care:
- c este componenta beneficiar (owner) a ferestrei de dialog create;
- title este titlul ferestrei de dialog create;
- argumentul boolean modal indic dac fereastra este modal;
- chooserPane este instana clasei JColorChooser care se ntroduce n fereastra de dialog;
- okListener si cancelListener sunt asculttoarele de aciune care reacioneaza la apsarea butonului
OK, respectiv Cancel al selectorului de culoare.
Folosind un JColorChooser, alegerea culorii se poate face n trei moduri:
- folosind un tablou de culori, n care fiecare celul este colorat n alt culoare;
- n sistemul RGB, folosind trei rigle de ajustare a culorilor fundamentale;
- n sistemul HSB, selectnd culoarea prin alegerea cu mouse-ul a punctului de pe panou care are
culoarea potrivita (trei butoane alturate, notate H, S, B, arat care din cele trei componente se
menine constant, celelalte dou fiind date de coordonatele punctului ales pe panou).
165. Elemente de grafic
Java API ofera programatorilor posibiliti ample privind realizarea de desene, text stilizat i alte
construcii grafice. Ne vom rezuma aici numai la cteva noiuni elementare, utile n realizarea unor
aplicaii grafice simple.
In principiu, desenarea se poate face pe orice component grafic. Exist ns clasa java.awt.Canvas,
ale crei instane sunt simple panouri destinate desenrii (n englez Canvas este pnza pictorului).
Pentru desenare se mai folosesc frecvent i clasele JPanel i JLabel.
Sistemul de coordonate folosit pentru grafic are originea n colul din stnga sus al componentei,
axa Ox este orientat catre dreapta, iar axa Oy este orientat n jos. Coordonatele se exprim n
numere ntregi (int), avnd ca unitate de msur pixelul (punctul de pe ecran).
52
- 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
Programatorului procesului surs i revine obligaia de a pregti, sub forma unei succesiuni de
caractere sau de octei, datele care urmeaz a fi transmise pe fluxul de ieire. Interpretarea i tratarea
datelor coninute n flux se face de ctre procesul de destinaie, deci ntreaga responsabilitate i revine
celui care programeaz acest proces. Desigur c este necesar ca interpretarea datelor din flux la
destinaie s corespund cu cea de la surs. Programarea operaiilor de intrare/ieire poate fi destul de
complicat, dar n limbajul Java ea este totui uurat de existena unui numr destul de mare de clase
cu aceast destinaie, grupate n pachetul java.io.
53
54
55
public void write(int c) throws IOException - scrie n fluxul de ieire ultimul octet al numrului c;
public void write(byte[] buf) throws IOException - scrie n fluxul de ieire octeii coninuti n
tabloul buf;
public abstract void(byte[] buf, int off, int len) throws IOException - scrie n fluxul de ieire len
octei din tabloul buf, ncepnd de la poziia off (offset);
public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat
ntr-o zon tampon anumii octei scrii cu metodele write(), aceti octei sunt scrii efectiv n fluxul
de destinaie; dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se
"descarc" ntregul lan de fluxuri;
public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a
metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.
172. Clasele PrintStream i PrintWriter
Clasele java.io.PrintStream i java.io.PrintWriter se folosesc pentru a transmite ctre un flux se
ieire date formatate pentru tiprire (afiare). Se tie c forma intern a datelor difer de forma
extern. De exemplu, numerele ntregi sunt reprezentate intern sub form binar, n timp ce pe ecranul
calculatorului sau la imprimant apar sub forma unor iruri de cifre zecimale, precedate eventual de
semn. Metodele claselor PrintStream i PrintWriter fac aceast conversie din forma intern n cea
extern a diferitelor tipuri de date, genernd reprezentrile datelor respective sub forma de iruri de
octei (caractere n codul ASCII) sau, respectiv, de caractere Unicode. Aceste clase nu se folosesc n
mod independent, ci adaug altui flux de ieire (de octei sau, respectiv, de caractere) capacitatea de
formatare a datelor n vederea tipririi.
173. Fluxuri de prelucrare
Fluxurile de prelucrare se conecteaz la alte fluxuri de intrare/ieire pentru a face anumite
transformri asupra datelor din fluxul respectiv. Clasele de fluxuri de prelucrare din Java API au fost
prezentate pe scurt la descrierea pachetului java.io. n aceast seciune ne vom ocupa de dou
categorii de fluxuri de prelucrare: fluxurile de date i fluxurile de obiecte.
174. Fluxuri de date
n unele aplicaii se dorete s se transmit ntr-un flux de ieire sau s se recepioneze dintr-un flux
de intrare date primitive reprezentate binar (de tip boolean, char, byte, short, int, long, float sau
double) i iruri de caractere. n acest scop, pot fi folosite clasele java.io.DataOutputStream i
java.io.DataInputStream. Se pot citi cu un DataInputStream numai date care au fost scrise cu un
DataOutputStream.
175. Clasa DataOutputStream
Clasa java.io.DataOutputStream este derivat din clasa java.io.FilterOutputStream i
implementeaz interfaa java.io.DataOutput. Ea permite s se transmit date primitive ctre un flux
de ieire ntr-o form portabil (independent de platform), cu condiia ca aceste date s fie citite
ulterior printr-un DataInputStream.
Constructor:
public DataOutputStream(OutputStream out) - creeaz un nou flux de ieire de date, conectat la
ieire la un OutputStream (adic la o instan a unei clase derivate din clasa OutputStream).
Metode:
Aceasta clas conine metodele clasei java.io.OutputStream, la care se adaug urmtoarele metode
specifice, destinate scrierii n fluxul de ieire a datelor primitive sau a unor iruri de caractere:
public final void writeBoolean(boolean v) throws IOException - scrie o valoare boolean;
public final void writeChar(char v) throws IOException - scrie o valoare de tip char, n format
Unicode;
56
public final void writeByte(byte v) throws IOException - scrie o valoare de tip byte pe un octet;
public final void writeShort(short v) throws IOException - scrie o valoare de tip short pe doi octei;
public final void writeInt(int v) throws IOException - scrie o valoare de tip int pe 4 octei;
public final void writeLong(long v) throws IOException - scrie o valoare de tip long pe 8 octei;
public final void writeFloat(float v) throws IOException - scrie o valoare de tip float pe 4 octei;
public final void writeDouble(double v) throws IOException - scrie o valoare de tip double pe opt
octei;
public final void writeBytes(String v) throws IOException - scrie un ir de caractere, convertit ntrun ir de octei prin suprimarea octetului superior al fiecrui caracter;
public final void writeChars(String v) throws IOException - scrie n flux un ir de caractere (n
Unicode);
public final void writeUTF(String v) throws IOException - scrie un ir de caractere codificat n
formatul UTF-8 ntr-o form independent de main (se scrie mai nti lungimea irului pe doi octei,
apoi fiecare caracter din ir pe cte un singur octet);
public final int size() - ntoarce numrul de octei scrii n acest flux de ieire.
176. Clasa DataInputStream
Un DataInputStream este un flux de intrare de octei care este conectat la intrare la un alt
InputStream i citeste din acesta date primitive ntr-o form independent de platform. Se pot citi cu
DataInputStream numai date care au fost scrise cu DataOutputStream.
Constructor:
public DataInputStream(InputStream in) - creeaz un flux de date de intrare, care citete date din
fluxul de intrare in, primit ca argument.
Metode:
Aceasta clas conine toate metodele clasei java.io.InputStream, la care se adaug urmtoarele
metode specifice, prin care se implementeaz interfaa java.io.DataInput:
public final void readFully(byte[] b) throws IOException - citete din fluxul de intrare un numr de
octei egal cu lungimea tabloului b, primit ca argument, i i pune n acest tablou. Dac n fluxul de
intrare nu sunt nca suficieni octei, dar nu s-a atins sfritul de fiier, procesul este pus n ateptare
pn apar noi octei. Dac se ntlnete sfritul de fiier (EOF - End of File), se genereaz o
EOFException;
public final void readFully(byte[] b, int off, int len) throws IOException - acioneaz similar cu
metoda precedent, dar se citesc len octei, care sunt depui n tabloul b, ncepand de la poziia off;
public final void skipBytes(int n) throws IOException - sare peste n octei din fluxul de intrare;
ntoarce numrul de octei srii efectiv (este posibil s nu reueasc s sar n octeti, de exemplu dac
a ntalnit sfritul fluxului);
public final boolean readBoolean() throws IOException - citete un octet din fluxul de intrare i l
convertete n valoare boolean;
public final byte readByte() throws IOException - citete din fluxul de intrare un singur octet, pe
care l trateaz ca un numr ntreg cu semn n intervalul [-128, 127]; se consider c a fost scris cu
writeByte(byte v);
public final int readUnsignedByte() throws IOException - citete din fluxul de intrare un singur
octet, pe care l trateaz ca numr ntreg fr semn n intervalul [0, 255] i l ntoarce sub form de
int;
public final short readShort() throws IOException - citete doi octei din fluxul de intrare i i
interpreteaz ca un numr de tip short, scris anterior cu writeShort(short v);
public final int readUnsignedShort() throws IOException - citete din fluxul de intrare doi octei, pe
care i interpreteaz ca numr ntreg fr semn i-l ntoarce sub form de int;
public final char readChar() throws IOException - citete din fluxul de intrare un char (doi octei,
format Unicode);
57
public final int readInt() throws IOException - citete patru octei si i interpreteaz ca un numr de
tip int scris cu writeInt(int v);
public final long readLong() throws IOException - citeste opt octei si i interpreteaz ca un numr
de tip long, scris cu writeLong(long v);
public final float readFloat() throws IOException - citete patru octei si i interpreteaz ca un
numr de tip float, scris cu writeFloat(float v);
public final double readDouble() throws IOException - citete opt octei si i interpreteaz ca un
numr de tip double, scris cu writeDouble(double v);
public final String readUTF() throws IOException - citete un ir de caractere n format UTF (care
a fost scris cu writeUTF(String str));
58
59
60
len caractere, pe care le pune n tabloul buf ncepnd de la poziia off (offset);
public boolean ready() throws IOException - verific dac fluxul de intrare este gata pentru citire
(dac conine caractere care pot fi citite);
public void close() throws IOException - nchide fluxul de intrare;
public String getEncoding() - ntoarce numele canonic al codului folosit pentru caractere.
61
62
n limbajul Java, exist posibilitatea de a se crea programe care conin mai multe fire de execuie.
Aceasta nseamn c, la executarea lor, se vor crea mai multe subprocese care se vor desfura
simultan, folosind acelai procesor i aceeai zon de memorie. Acest mod de funcionare se numete
n englez multithreading.
Exist dou moduri de a programa un fir de execuie:
- prin extinderea clasei Thread;
- prin implementarea interfeei Runnable.
190. Clasa Thread
Clasa java.lang.Thread realizeaz un fir de execuie. Acesta poate fi un fir de execuie obinuit, sau
un demon.
Crearea unui fir de execuie se face invocnd unul dintre constructorii clasei Thread. Dintre acetia,
i menionm aici pe urmtorii:
public Thread() - creeaz un nou fir de execuie cu numele implicit Thread-n, unde n este un numr
de ordine;
public Thread(String name) - creeaz un nou fir de execuie cu numele name;
public Thread(Runnable target) - creeaz un nou fir de execuie, care conine obiectul target cu
interfaa Runnable, iar numele firului este cel implicit;
public Thread(Runnable target, String name) - creeaz un nou fir de execuie, care conine obiectul
target cu interfaa Runnable i are numele name.
La programarea unui fir de execuie, principala atenie se acord metodei run(), deoarece ea conine
programul propriu-zis, care trebuie executat de acest fir. Totui, metoda run()nu este invocat explicit.
Ea este invocat de maina virtual Java, atunci cnd firul respectiv este pus n mod efectiv n
execuie.
Pentru redefinirea metodei Run este necesar sa creem o subclas a clasei Thread sau sa creem o clas
cu interfaa Runnable, i s dm o instan a acestei clase ca argument constructorului clasei Thread.
Dup ce firul de execuie a fost creat (de exemplu prin expresia new Thread()), el exist n memorie,
dar nca nu poate fi executat. Se gsete, deci, n starea "nou creat" (engleza: born). Pentru a-l face
gata de execuie, pentru firul respectiv este invocat metoda start().
Avnd n vedere cele de mai sus, punem n eviden urmatoarele stri n care se poate gsi un fir de
execuie pe durata ciclului su de via:
- nou creat (englez: born) - este starea n care se gsete imediat ce a fost creat prin operatorul
new; n aceast stare, firul nu poate fi executat;
- gata de execuie (englez: ready) - este starea n care firul poate fi pus n execuie; punerea
efectiv n execuie se face de ctre maina virtuala Java atunci cnd procesorul este liber i nu sunt
gata de execuie fire de prioritate superioar;
- n execuie (englez: running) - este starea n care procesul se execut efectiv (ocup procesorul);
- adormit (englez: sleeping) - este starea de oprire temporar, ca urmare a invocrii metodei
sleep();
- blocat (englez: blocked) - este starea n care ateapt incheierea unei operaii de intrare/ieire;
- n ateptare (englez: waiting) - este starea n care firul se gsete din momentul n care se invoc
metoda wait(), pn cnd primete o confirmare dat prin invocarea metodei notify();
- mort (englez: dead) - este starea n care intr firul de execuie dupa ce s-a ncheiat executarea
metodei run().
191. Interfaa Runnable
63
Interfaa java.lang.Runnable trebuie implementat de orice clas care nu este descendent a clasei
java.lang.Thread, dar ale crei instane trebuie tratate ca nite fire de execuie. Singura metod a
acestei interfee este
public void run()
care are acelai rol cu cea din clasa Thread.
Necesitatea implementrii interfeei Runnable apare atunci cnd dorim s creem o clasa de fire de
execuie care nu extinde clasa Thread. Motivul ar putea fi, de exemplu, cel c clasa nou creat, B,
trebuie sa extind o alta clas, A, care nu este descendent a clasei Thread Se tie c n Java nu exist
motenire multipl, deci clasa B nu poate avea ca superclase att clasa A, ct i clasa Thread. n acest
caz, vom crea o clas B care extinde clasa A i implementeaza interfaa Runnable, care conine
metoda run().
Utilizarea instanelor claselor cu interfaa Runnable se face, punndu-le ca argumente ale urmtorilor
constructori ai clasei Thread:
public Thread(Runnable target)
public Thread(Runnable target, String name)
O instan a clasei Thread creat cu un astfel de constructor, se comport ca i cum ar fi instana unei
extensii a clasei Thread care ar conine metoda run() a obiectului target cu interfaa Runnable.
64
65