Sunteți pe pagina 1din 139

1.

Introducere n limbajul de programare Java


1.1. Ce este Java?
o insul din ndonezia (126 650 km,
65 mil. locuitori)
un jargon american pentru cafea
o platform i un limbaj de programare orientat pe obiecte
Utilizarea nternetului
ca mediu pentru difuzarea de informa[ii, dar i de programe, conduce la ideea
de numitor comun, de platform comun pentru care s fie dezvoltate aplica[iile.
Costurile implementrii de aplica[ii pot s scad spectaculos dac nu sunt
necesare adaptri de solu[ii pentru fiecare tip sau versiune hardware sau de sistem
de operare existent n lume.
1.2. Limbajul de programare Java
Java este un limbaj de programare de nivel nalt, dezvoltat de JavaSoft,
companie n cadrul firmei Sun Microsystems. Dintre caracteristicile principale ale
limbajului amintim:
simplitate Java este uor de nv[at, caracteristicile complicate
(suprancrcarea operatorilor, motenirea multipl, abloane) ntlnite n
alte limbaje de programare sunt eliminate.
1
robustee, elimin sursele frecvente de erori ce apar n programare prin
eliminarea pointerilor, administrarea automat a memoriei i eliminarea
fisurilor de memorie printr-o procedur de colectare a 'gunoiului' care
ruleaz n fundal. Un program Java care a trecut de compilare are
proprietatea c la execu[ia sa nu "crap sistemul".
complet orientat pe obiecte - elimin complet stilul de programare
procedural; se bazeaz pe ncapsulare, motenire, polimor!ism
uurin" n ceea ce privete programarea n reea
securitate, este cel mai sigur limbaj de programare disponibil n acest
moment, asigurnd mecanisme stricte de securitate a programelor
concretizate prin: verificarea dinamic a codului pentru detectarea
secven[elor periculoase, impunerea unor reguli stricte pentru rularea
programelor lansate pe calculatoare aflate la distanta, etc
este neutru din punct de vedere ar#itectural
portabilitate, cu alte cuvinte Java este un limbaj independent de
platforma de lucru, aceeai aplica[ie rulnd, fr nici o modificare, pe
sisteme diferite cum ar fi Windows, UNX sau Macintosh, lucru care aduce
economii substan[iale firmelor care dezvolt aplica[ii pentru nternet.
Sloganul de baz este: ,$rite once, run an%&#ere
compilat i interpretat
asigur o per!orman" ridicat" a codului de octe[i
con[ine o libr"rie de clase i inter!ee pentru domenii specifice cum ar fi
programarea interfe[elor utilizator (JFC, AWT, Swing), programare
distribuit (comunicare TCP'P, CORBA, RM etc.)
permite programarea cu !ire de e(ecuie (multithreaded)
dinamicitate
este modelat dup" C i C)), trecerea de la C / C++ la Java fcndu-se
foarte uor.
face diferen[a ntre literele mici i mari (este case sensitive)
permite de*voltarea aplicaiilor pentru Internet crearea unor
documente Web mbunt[ite cu anima[ie i multimedia.
Java Development Kit (JDK) este disponibil gratis
2
1.+. Java , un limbaj compilat i interpretat
n func[ie de modul de execu[ie al programelor, limbajele de programare se
mpart n dou categorii :
interpretate, instruc[iunile sunt citite linie cu linie de un program numit
interpretor i traduse n instruc[iuni main; avantaj: simplitate;
dezavantaj: viteza de execu[ie redus;
compilate, codul surs al programelor este transformat de compilator
ntr-un cod ce poate fi executat direct de procesor; avantaj: execu[ie
rapid; dezavantaj: lipsa portabilit[ii, codul compilat ntr-un format de
nivel sczut nu poate fi rulat dect pe platforma pe care a fost compilat.
Programele Java sunt att interpretate ct i compilate
Codul de octe[i este diferit de codul main. Codul main este reprezentat de
o succesiune de 0 i 1; codurile de octe[i sunt seturi de instruc[iuni care seamn cu
codul scris n limbaj de asamblare. Codul main este executat direct de ctre
procesor i poate fi folosit numai pe platforma pe care a fost creat; codul de octe[i
este interpretat de mediul Java i de aceea poate fi rulat pe orice platform care
folosete mediul de execu[ie Java.
Fazele prin care trece un program Java sunt:
Cod sursa Java -> (compilare) -> Cod de octeti ->
(interpretare)
1.-. Istoria limbajului Java
1991: n cadrul companiei Sun Microsystems ncepe dezvoltarea unui
proiect pentru aparatur electronic inteligent conectat n re[ea.
1992: ncepe dezvoltarea limbajului de programare Oak (James Gosling);
1993: devine disponibil primul browser WWW (World Wide Web) Mosaic;
dezvoltarea unui web-browser (Webrunner), capabil s ncarce i s execute
programe mici scrise n Oak;
3
1994: Oak este redenumit Java iar Webrunner HotJava
1995: Netscape (fondat de cei care au dezvoltat Mosaic-ul) decide s
integreze Java n !etscape !avigator "#$
ianuarie 1996 : apare J%& '#$ (soft gratuit);
februarie
1997: apare J%& '#';
martie 1997: apar (otJava '#$ i JavaO) '#$;
1998 Java Foundation Classes JVC released, incluznd Swing 1.0
dup 1999 apar versiuni noi ale JDK
n prezent s-a ajuns la JDK1.4.
1... /ediul Java
n acest curs se utilizeaz distribu[ia JDK 1.3 (Java Development Kit), produs
de firma Sun.
Exist dou posibilit[i de a lucra n Java: n linie de comand paii fiind
indica[i mai jos, sau folosind un editor Java cum ar fi JCreator, Eclipse, etc.
Realizarea unui program Java const n urmtorii pai:
Editarea programului ntr-un editor de texte;
Salvarea programului sub numele NumeClasa.java unde !ume*lasa este
numele clasei care con[ine metoda main(). ntr-un program Java trebuie s
existe o singur clas care s con[in o metod main(). Cu alte cuvinte, numele
clasei trebuie s coincid cu numele fiierului. Extensia fiierului este #java
Compilarea programului se face cu ajutorul comenzii
javac NumeClasa.java
Executarea programului se face cu ajutorul comenzii
4
java NumeClasa
1.0. Crearea unei aplicaii simple
1. )crierea codului surs+:
class Salut {
public static void main(String args[]) {
Sstem.out.println(!Salut """!)#
$
$
Toate aplica[iile Java con[in o clas principal n care trebuie s se gseasc
metoda main(). Clasele aplica[iei se pot gsi fie ntr-un singur fiier, fie n mai
multe.
2. )alvarea ,iierelor surs+
Se va face n fiiere cu extensia .java. Fiierul care con[ine codul surs al
clasei principale trebuie s aib acelai nume cu clasa principal a aplica[iei (clasa
care con[ine metoda main). Prin urmare, fiierul nostru o s-l salvm sub numele:
Salut.java
3. *ompilarea aplica-iei
Se folosete compilatorul Java, javac. Apelul compilatorului se face pentru
fiierul ce con[ine clasa principal a aplica[iei. Compilatorul creeaz cte un fiier
separat pentru fiecare clas a programului; acestea au extensia .class i sunt
plasate n acelai director cu fiierele surs. Rezultatul comenzii
javac Salut.java
este fiierul Salut.class
4. .ularea aplica-iei
Se face cu interpretorul java, apelat pentru unitatea de compilare
corespunztoare clasei principale, fiind ns omis extensia .class asociat
acesteia.
java Salut
Rularea unei aplica[ii care nu folosete interfa[ grafic, se va face ntr-o fereastr
sistem.
5
1.1. Crearea unui applet
Crearea structurii de fiiere i compilarea applet-urilor sunt identice ca n cazul
aplica[iilor. Difer n schimb structura programului i modul de rulare al acestuia.
1. )crierea codului surs+:
import java%.s&ing.'#
import java.a&t.'#
public class Salut e%tends J(pplet {
public void paint()rap*ics g){
g.dra&String(!Salut!+,-+,-)#
$
$
2. )alvarea ,iierelor surs+
Salvarea se va face n fiierul Salut.java
3. *ompilarea applet/ului
javac Salut.java
n urma compilrii rezult fiierul Salut.class
4. .ularea applet/ului
Applet-urile nu ruleaz independent. Ele pot fi rulate doar prin intermediul unui
browser: nternet Explorer, Netscape sau printr-un program special cum ar fi
appletviewer-ul din setul JDK.
Crearea unui fiier HTML pentru miniaplica[ie (exemplu.html)
<html>
<head>
<title>Primul Applet Java</title>
</head>
<body>
<applet code=Salut.class width=400 height=400>
</applet>
</body>
</html>
5. 0izualizarea applet/tlui
appletvie&er e%emplu.*tml
6
2. 2rogramarea 3rientat" pe 3biecte i Java
2.1. 3biecte i clase
Programarea Orientat pe Obiecte (OOP) este una dintre cele mai mari idei de
programare aprut n anii 1990. deea central a OOP este: organizarea
programelor astfel nct ele s reprezinte un ecou al modului n care lucrurile sunt
puse mpreun n lumea real.
12emplu:
Pentru cine nu s-a jucat niciodat cu Lego, acesta const n diferite buc[i de
plastic, de diferite culori i dimensiuni. Ele sunt dotate cu crescturi i adncituri prin
intermediul crora piesele pot fi conectate ntre ele. Cu diferite componente Lego se
poate forma aproape orice: maini, oameni, castele, case, etc. n func[ie de
imagina[ia fiecruia. Fiecare pies de Lego este un mic obiect care mpreun cu
altele ajut la crearea altor obiecte mai mari. Exact aa stau lucrurile i n
programarea orientat pe obiecte: obiecte mici puse mpreun formeaz obiecte
mari.
Programarea orientat pe obiecte este gndit dup modelul lumii reale
obiectele sunt adesea formate din mai multe tipuri de obiecte mici.
Cnd scriem programe ntr-un limbaj orientat pe obiecte, nu definim obiecte ci
clase de obiecte, unde o clas" repre*int" un ablon pentru mai multe obiecte cu
caracteristici similare. Clasele ntrupeaz toate caracteristicile unei mul[imi
particulare de obiecte. De exemplu, ne putem gndi la clasa Copac care descrie
7
caracteristicile tuturor copacilor (au rdcini, trunchi i frunze, cresc, produc clorofil,
i schimb frunzele, etc). Clasa Copac reprezint un model abstract pentru
conceptul de copac pentru a planta un copac, a-l atinge, a-i rupe o frunz sau a-l
tia avem nevoie de un copac concret, altfel spus de o instan-+ a copacului.
Binen[eles c, odat ce avem clasa copac, putem crea oricte instan[e diferite ale
copacului respectiv copaci concre[i. Acetia pot avea caracteristici diferite (unii
sunt nal[i, al[ii pitici, unii i pierd frunzele toamna, al[ii nu, etc)
O alt no[iune specific OOP este cea de obiect. Obiect sau instan-+ a clasei
reprezint acelai lucru. Clasa este repre*entarea general" a unui obiect iar
instana /obiectul este repre*entarea concret" a clasei.
2.2. 4tribute i comportamente
Fiecare clas scris n Java are dou caracteristici de baz: atribute i
comportament.
2.2.1. 4tribute
8
Atributele diferen[iaz obiectele ntre ele i determin aparen[a, starea sau alte
calit[i ale obiectului n cauz. Dac ne gndim s crem o clas .a/in0+ ea ar
trebui s includ urmtoarele atribute: culoare+ stil+ marc0.
Atributele sunt definite n clase ca variabile. 5ipul i numele variabilelor
sunt de!inite n clase i !iecare obiect are valori proprii pentru !iecare atribut.
Deoarece fiecare instan[ a clasei poate avea valori diferite pentru variabilele sale,
aceste variabile se mai numesc i variabile instan".
12emplu: O instan[ a clasei main, .a/ina.ea ar putea avea urmtoarele
valori pentru atribute:
culoare = alb
stil = elegant
marc0 = Mercedes
Exist, de asemenea, i un alt tip de variabile numite variabile clas".
Diferen[a dintre cele dou tipuri de variabile este aceea c valorile variabilelor
instan[ sunt pstrate n instan[e i se schimb pentru fiecare instan[ iar valorile
variabilelor clas sunt pstrate n clas i nu se schimb pentru fiecare instan[.
Asupra diferen[ei dintre cele dou tipuri de variabile o s revin ntr-un capitol
urmtor.
2.2.2. Comportament
Comportamentul unei clase determin cum opereaz o instan[ a unei clase.
De exemplu, cum reac[ioneaz un obiect atunci cnd un alt obiect sau o alt clas i
cere s fac ceva. S revenim la clasa .a/in0. Comportamentul unei maini const
n: porne/te+ opre/te+ 1r2nea30+ sc*imb0 vite3a+ sc*imb0
direc4ia, etc.
Pentru a defini comportamentul unei clase se definesc metode, echivalentul
func[iilor sau procedurilor din alte limbaje de programare. Spre diferen[ de alte
limbaje de programare, n Java nu se pot defini func[ii n afara claselor. Prin urmare,
metodele sunt !uncii de!inite n interiorul claselor care operea*" n instanele
claselor respective.
Metoda unui obiect poate fi apelat de ctre un alt obiect sau o alt clas.
9
Ca i n cazul atributelor, exist dou tipuri de metode: metode instan" i
metode clas". Metodele instan[ opereaz doar n cadrul instan[ei unei clase. n
schimb, metodele clas opereaz n interiorul clasei.
2.+. 2rincipiile 332
Obiectul este o variabil care are o structura i o stare. Fiecare obiect dispune
de opera[ii prin intermediul crora i se poate manipula starea.
Obiectul trebuie privit ca o unitate atomic pe care utilizatorul nu ar trebui s o
disece. De exemplu, cnd lucrm cu numere ntregi, nu ne punem problema
reprezentrii lor. Utilizatorul nu are acces direct la pr[ile constituente ale unui obiect
sau la implementarea sa; acestea vor putea fi accesate doar prin intermediul
metodelor care au fost furnizate mpreun cu obiectul. Gruparea datelor i a
opera[iilor care pot fi efectuate asupra acestor date, avnd grij ca detaliile de
implementare s fie ascunse, poarta numele de ncapsulare.
Unul din principalele scopuri ale OOP este refolosirea codului. Limbajele de
programare orientate pe obiecte furnizeaz mai multe mecanisme n acest scop.
1. 6olosirea codului generic dac implementarea este identic, i difer
doar tipul de baz al obiectului, nu este necesar rescrierea complet a
codului se scrie un cod generic care func[ioneaz pentru orice tip. De
exemplu, se poate scrie o metod care s ordoneze un ir de numere ntregi,
caractere, iruri de caractere.
2. /otenirea este un mecanism care permite extinderea func[ionalit[ii unei
clase. Se pot crea noi tipuri de date care s extind (sau s restric[ioneze)
propriet[ile tipului de date original.
3. 2olimor!ismul Un tip referin[ polimorfic poate s refere obiecte de mai
multe tipuri. Atunci cnd se apeleaz o metod a tipului polimorfic, se va
selecta automat metoda care corespunde tipului referit n acel moment.
10
+. 7lementele de ba*" ale limbajului de
programare Java
+.1. 8tructura le(ical" a limbajului
+.1.1. 8etul de caractere
Limbajului Java folosete setul de caractere Unicode. Este un standard
interna[ional care nglobeaz setul de caractere ASC (permite reprezentarea a 256
de caractere). Folosete pentru reprezentarea caracterelor 2 octe[i, ceea ce
nseamn c se pot reprezenta 65536 de semne. Primele 256 caractere Unicode
corespund celor din ASC. Referirea la un caracter se face prin \uxxxx, unde xxxx
reprezint codul caracterului.
12emple:
5u--6- - 5u--67 8 ci1re 9S:-;atin - - 7
5u-<<- - 5u-<<7 8 ci1re arabic-indic - - 7
5u=e-- - 5u7111 8 litere din al1abetul >an (C*ine3+ Japone3+
Coreean)
+.1.2. Cuvinte c#eie
Cuvintele rezervate n Java sunt cele din C++, cu cteva excep[ii.
11
+.1.+. Identi!icatori
Sunt secven[e nelimitate de litere i cifre Unicode, ncepnd cu o liter.
dentificatorii nu au voie s fie identici cu cuvintele rezervate.
+.1.-. Constante
Constantele pot fi de urmtoarele tipuri
1. constante ntregi
Sunt acceptate 3 baze de numera[ie : baza 10, baza 16 (ncep cu
caracterele 0x) i baza 8 (ncep cu cifra 0) i pot fi de dou tipuri:
normale, (se reprezint pe 4 octe[i - 32 bi[i)
lungi (8 octe[i - 64 bi[i): se termin cu caracterul L (sau l).
2. constante reale
Pentru ca o constant s fie considerat real ea trebuie s aib cel pu[in
o zecimal dup virgul, s fie n nota[ie exponen[ial sau s aib sufixul F sau f
pentru valorile normale (reprezentate pe 32 bi[i), respectiv D sau d pentru valorile
lungi (reprezentate pe 64 bi[i).

+. constante logice
true : valoarea boolean de adevr
,alse : valoarea boolean de fals
Observa-ie: spre deosebire de C++, constantele ntregi 1 i 0 nu mai au rolul
de adevrat i fals.
-. constante caracter
O constant de tip caracter este utilizat pentru a exprima caracterele
codului Unicode. Reprezentarea se face fie folosind o liter, fie o secven[
escape scris ntre apostrofuri. Secven[ele escape permit reprezentarea
caracterelor care nu au reprezentare grafic i reprezentarea unor caractere
speciale precum backslash, apostrof, etc. Secven[e escape predefinite n Java:
Cod 8ecvena 7scape Caracter
\u0008 '\b' Backspace(BS)
\u0009 '\t' Tab orizontal (HT)
12
\u000a '\n' Linie nou - linefeed (LF)
\u000c '\f' Pagin nou - formfeed (FF)
\u000d '\r' nceput de rnd (CR)
\u0022 '\"' Ghilimele
\u0027 '\'' Apostrof
\u005c '\\' Backslash
\u0008 '\b' Backspace(BS)
.. constante iruri de caractere
Un ir de caractere este format din zero sau mai multe caractere cuprinse
ntre ghilimele. Caracterele care formeaz irul de caractere pot fi caractere
grafice sau secven[e escape. Dac irul este prea lung el poate fi scris ca o
concatenare de subiruri de dimensiune mai mic. Concatenarea irurilor se face
cu operatorul + (!(na ! ? ! are ! ? ! mere !). Sirul vid este "". Dup
cum vom vedea, orice ir este de fapt, o instan[ a clasei String, definit n
pachetul java.lang.
+.1... 8eparatori
Un separator este un caracter care indic sfritul unei unit[i lexicale i
nceputul alteia. n Java separatorii sunt urmtorii: ( ) { } [ ] ; , . nstruc[iunile unui
program se separ cu ;.
+.1.0. 3peratori
1. operator de atribuire, = (semnul egal)
12emplu: a@7 (lui a i se atribuie valoarea 9)
Operatorii de atribuire pot fi nln[ui[i. De exemplu: a@b@c@A-
2. operatori aritmetici binari, +, -, *, /, %
12emplu: s@a?b
n Java exist forme prescurtate care cuprind operatorul de atribuire i un
operator aritmetic binar. Operatorii prescurta[i sunt:+=, -=, *=, /=, %=
12emplu: n ?@ B este echivalent cu n@n?B
13
3. operatori aritmetici unari, +, -, ++ (operator de incrementare), -- (operator de
decrementare). Operatorii de incrementare i decrementare pot fi prefixa[i (??%
sau --%) sau postfixa[i (%?? sau %--). Diferen[a dintre operatorii prefixa[i i cei
postfixa[i este semnificativ doar atunci cnd expresia de incrementare /
decrementare apare n cadrul unei expresii. Exemplele urmtoare vor eviden[ia
aceste lucruri.
12emple:
a) -% reprezint opusul lui x
b) int %@,+@C#
%??# DD % primeste valoarea <
--# DD primeste valoarea <
c) int %@,+@C#
??%# DD % primeste valoarea <
--# DD primeste valoarea <
d) int %@,+#
@%??# DD primeste valoarea ,+ % primeste
valoarea <
e) int %@,+#
@%--# DD primeste valoarea ,+ % primeste
valoarea =
1) int %@,+#
@??%# DD % primeste valoarea <+ primeste
valoarea <
g) int %@,+#
@--%# DD % primeste valoarea =+ primeste
valoarea =
Observa-ii: n exemplele b i c nu se observ nici o diferen[ ntre
operatorii postfixa[i i cei prefixa[i deoarece ei nu sunt folosi[i n cadrul altor
expresii. n exemplele d i ,, respectiv, e i g se observ c % primete aceeai
valoare dar are valori diferite. n exemplele d i e sunt folosi[i operatorii
postfixa[i de incrementare i decrementare care se comport astfel: valoarea
variabilei asupra creia ac[ioneaz operatorul postfixat (n cazul nostru %)
particip la evaluarea expresiei din care face parte ( primete valoarea lui %)
dup care se aplic operatorul (valoarea lui % crete / scade cu o unitate). n
exemplele , i g sunt folosi[i operatorii prefixa[i de incrementare i decrementare
care se comport astfel: valoarea variabilei asupra creia ac[ioneaz operatorul
postfixat (n cazul nostru %) i schimb valoarea (valoarea lui % crete / scade cu
14
o unitate), noua valoare participnd la evaluarea expresiei din care face parte (
primete noua valoare a lui %).
4. operatori logici, &&(and), ||(or), !(not)
Observa-ie: evaluarea expresiilor logice se face prin scurtcircuitare
(evaluarea se oprete n momentul n care valoarea de adevr a expresiei este
sigur determinat)
5. operatori relaionali, <, <=, >, >=, ==, !=
6. operatori pe bii, & (and), |(or), ^(xor), ~(not)
7. operatori de translaie, <<, >>, >>> (shift-are la dreapta fr semn)
8. operatorul condiional, ? : . Are forma:
e%presieElogica F e%presieA 8 e%presieB
Valoarea expresiei este dat de e%presieA dac e%presieElogic0
este true sau de e%presieB dac e%presieElogic0 este false.
12emplu: Metoda de calculul minimului a dou numere este:
public int min (int a+ int b){
return aGbFa8b#
$
9. operatorul , (virgula) este folosit pentru evaluarea secven[ial a opera[iilor
12emplu: int %@-+ @A+ 3@B# (%@A+@a@A-+c@A)
10. operatorul ) pentru concatenarea irurilor:
String s@!abcd!
int %@A--#
Sstem.out.println(s ? ! - ! ? %)# DDa1isea3a abcd-A--
11. operatorul de conversie de tip (cast) este: (tip_de_data)
int i @ B--#
long l @ (long)i# DDconversie prin e%tensie
long lB @ (long)B--#
int iB @ (int)lB# DD conversie prin contractie
12emplu ': Fie programul
public class :perator{
public static void main(String args[]){
int a@B+ b@6+c#
c@a?b#
15
Sstem.out.println(a?! !?b?! !?c)#
a??# --b#
Sstem.out.println(a?! !?b?! !?c)#
c@??a?b??#
Sstem.out.println(a?! !?b?! !?c)#
aD@B#b'@B#
Sstem.out.println(a?! !?b?! !?c)#
c@a-- ? --b#
Sstem.out.println(a?! !?b?! !?c)#
c@b@(a?@A)#
Sstem.out.println(a?! !?b?! !?c)#
$
$
Rezultatul afiat este:
B 6 ,
6 B ,
= 6 <
B < <
A , C
B B B
12emplu ": Fie programul
public class :p;ogic{
public static void main(String args[]){
bte a@-#
Sstem.out.println(!Hrimul i1!)#
i1 ((a"@-) II ((ADa)GA))
Sstem.out.println(!(mbele conditii sunt adevarate!)#
else
Sstem.out.println(!: conditie este 1alsa!)#
Sstem.out.println(!(l doilea i1!)#
i1 ((ADaGA) II (a"@-))
Sstem.out.println(!(mbele conditii sunt adevarate!)#
else
Sstem.out.println(!: conditie este 1alsa!)#
$
$
Rezultatul afiat este:
Hrimul i1
: conditie este 1alsa
(l doilea i1
J%ception in t*read KmainK java.lang.(rit*meticJ%ception8
D b 3ero at :p;ogic.main(:p;ogic.java8AA)
16
Explica[ia se gsete n modul n care sunt evaluate expresiile logice (prin
scurtcircuitare). n primul i1 se evalueaz expresia a"@- care are valoarea 1alse.
ndiferent de rezultatul celei de-a doua expresii, rezultatul final va fi 1alse. Prin
urmare, evaluarea ntregii expresii se oprete dup evaluarea lui a"@-, ceea ce
urmeaz dup nu mai conteaz. n al doilea i1, evaluarea ncepe tot cu prima
expresie, i anume ADaGA. Dar, ea nu poate fi evaluat deoarece ADa nu are sens
(a fiind 0) i, este generat o excep[ie. Din nou, nu se ajunge la evaluarea celei de a
doua expresii.
+.1.1. Comentarii
n Java exist trei feluri de comentarii:
Comentarii pe o singur linie: ncep cu //.
Comentarii pe mai multe linii, nchise ntre /* i */.
Comentarii pe mai multe linii care formeaz documenta[ia, nchise ntre /** i
**/. Textul dintre cele dou secven[e este automat mutat n documenta[ia
aplica[iei de ctre generatorul automat de documenta[ie javadoc.
Observa[ii:
1. nu pot fi scrise comentarii n interiorul altor comentarii.
2. nu pot fi introduse comentarii n interiorul constantelor caracter sau ir de
caractere.
3. secven[ele /* i */ pot s apar pe aceeai linie cu secven[a // dar i pierd
semnifica[ia; la fel se ntmpl cu secven[a // n comentarii care ncep cu /*
sau /**.
+.2. 5ipuri de date
n Java tipurile de date se mpart n dou categorii:
tipuri primitive de date
tipuri re!erin".
17
Java pornete de la premiza c "orice este un obiect". Prin urmare, tipurile de
date ar trebui s fie de fapt definite de clase i toate variabilele ar trebui s
memoreze de fapt instan[e (obiecte) ale acestor clase. n principiu acest lucru este
adevrat, ns, pentru uurin[a programrii, mai exist i aa numitele tipuri
primitive de date, care sunt cele uzuale:
1. tipuri ntregi
Tip de date Dimensiune n octe[i Domeniu
Byte 1 -128 .. 127
Short 2 -32768 .. 32767
nt 4
-2147483648 ..
2147483647
Long 8 -2
63
.. 2
63
-1
2. tipuri reale
Tip de date Dimensiune n octe[i Domeniu
float 4 -10
46
.. 10
38
double 8 -10
324
.. 10
308
3. tipul caracter: char memorat pe 2 octe[i
4. tipul boolean: are dou valori true i false
n alte limbaje formatul i dimensiunea tipurilor primitive de date folosite ntr-un
program pot depinde de platforma pe care ruleaz programul. n Java acest lucru nu
mai este valabil, Java fiind independent de platform.
Vectorii, clasele i interfe[ele sunt tipuri re!erin". Valoarea unei variabile de
acest tip este, spre diferen[ de tipurile primitive, o referin[ (adres de memorie)
ctre valoarea sau mul[imea de valori reprezentat de variabila respectiv.
Exist trei tipuri de date C care nu sunt suportate de limbajul Java: pointer,
struct i union. Pointerii au fost elimina[i din cauza c erau o surs constant de
erori, locul lor fiind luat de tipul referin[, iar struct i union nu i mai au rostul att
timp ct tipurile compuse de date sunt formate n Java prin intermediul claselor.
+.+. 9ariabile
Variabilele pot avea ca tip fie un tip primitiv de dat, fie o referin[ la un obiect.
:eclararea variabilelor se face prin:
tipEdeEdate numeEvariabila
18
Iniiali*area variabilelor se face prin:
numeEvariabila @ valoare
Declararea i ini[ializarea variabilelor pot fi fcute n acelai moment:
tipEdeEdate numeEvariabila @ valoare
:eclararea constantelor se face prin:
1inal tipEdeEdate numeEvariabila
12emple:
int a# a@,#
1inal double H9 @ 6.A=#
int valoare @ A--#
long numarJlemente @ AB6=,<CL;#
String 1loare @ !1re3ie!#
n func[ie de locul n care sunt declarate, variabilele se mpart n urmtoarele
categorii:
1. 9ariabile membru, declarate n interiorul unei clase, vizibile pentru toate
metodele clasei respective i pentru alte clase n func[ie de modificatorul lor
de acces
2. 9ariabile locale, declarate ntr-o metod sau ntr-un bloc de cod, vizibile
doar n metoda / blocul respectiv
3. 2arametrii metodelor, vizibili doar n metoda respectiv
4. 2arametrii de la tratarea e(cepiilor
maginea urmtoare ilustreaz tipurile de variabile i parametrii mpreun cu
domeniul lor de vizibilitate.
19
Observa-ie: Variabilele declarate ntr-un 1or, rmn locale corpului ciclului. De
exemplu:
1or(int i@-# iGA--# i??) { $
int i# DDposibil Mn Java+ eroare Mn C??
+.-. Instruciuni
+.-.1. Instruciunea vid"
Este format din #.
+.-.2. Instruciuni de deci*ie
1. Instruciunea ifelse are forma:
if (e%presieElogic0)
20
{
...
declararea variabilelor membru
public void Metoda (parametrii metodei)
{
;
;
}
declararea variabilelor locale
;
catch (parametrii de la tratarea
e(cepiilor)
{
;
}
;
}
public class Nume_Clasa
instruc4iuniA
else
instruc4iuniB
instruc4iuni
Dac e2presie3logic+ are valoarea true atunci se execut instruc-iuni', altfel
se execut instruc-iuni". 12presie3logic+ este obligatoriu s fie cuprins ntre
paranteze. Dac pe una din ramuri sunt mai multe instruc[iuni ele trebuie s fie
cuprinse ntre acolade <.=. Ramura
else
instruc4iuniB
poate s lipseasc.
12emplu 4: S se calculeze maximul a dou numere.
A. public class .a%im
B. { public static void main(String args[])
6. {int a@AB+ b@,+m#
=. i1 (a>b)
,. m@a#
<. else
C. m@b#
L. Sstem.out.println(!.a%imul dintre !?a?! si !?b?! este8 !?m)#
7. $
A-. $
12emplu 5: S se rezolve ecua[ia de gradul a%?b@- cunoscnd coeficien[ii a i b.
A. public class ec)r9
B. { public static void main(String args[])
6. {int a@AB+ b@,#
=. Sstem.out.print(!Jcuatia8 !?a?!%?!?b?!@-!)#
,. i1 (a@@-)
<. i1 (b@@-)
C. Sstem.out.println(! are o in1initate de solutii!)#
L. else
7. Sstem.out.println(! nu are solutii!)#
A-. else { double % @-(double)bDa#
AA. Sstem.out.println(! are solutia !?%)#
AA. $
AB. $
13. }
n e2emplu 5 au fost folosite i1-uri imbricate. Pe linia 10 a fost folosit
operatorul de conversie pentru ca rezultatul mpr[irii s se fie numr real. Dac
21
acest operator nu ar fi fost folosit, mpr[irea ar fi fost efectuat ntre doi operanzi
ntregi i, prin urmare, rezultatul ar fi fost numr ntreg.
2. Instruciunea switch are forma:
s&itc* (e%presieEselectare){
case valEA8 instruc4iuneEA# breaN#
case valEB8 instruc4iuneEB# breaN#
. . .
case valEi8 instruc4iuneEi# breaN#
. . .
case valEn8 instruc4iuneEn# breaN#
de1ault8 instruc4iune#
$
nstruc[iunea s&itc* selecteaz dintre mai multe secven[e de cod una care
va fi executat. Se evalueaz e%presieEselectare; rezultatul ob[inut se compar
pe rnd cu valEA, valEB, ..., valEn. Dac se ntlnete o valoare valEi pentru
care se ob[ine egalitate (e%presieEselectare @ valEi ) se execut
instruc[iunile instruc4iuneEi. Altfel, (dac nu are loc nici o egalitate) se execut
instruc[iunile de pe ramura de1ault.
nstruc[iune breaN ntlnit pe fiecare ramur are rolul de a ntrerupe execu[ia
instruc[iunii s&itc* dup ce au fost executate instruc[iunile aferente ramurii alese.
Dac instruc[iunea breaN lipsete atunci se execut i instruc[iunile de pe
urmtoarele ramuri pn la ntlnirea primului breaN.
12emplu 6: Se citete de la tastatur un caracter reprezentnd un operator: '+', '',
'*' sau '/'. n func[ie de operatorul citit s se fac suma, diferen[a, nmul[irea sau
mpr[irea celor dou numere a i b.
A. public class :peratii{
B. public static void main(String args[]){
6. double a@AB+ b@,+ r@-#
=. c*ar oper@O O#
,. tr{
<. Sstem.out.println(!9ntroduceti operatorul!)#
C. oper@(c*ar)Sstem.in.read()#
L. $
7. catc*(J%ception e){$
A-. s&itc* (oper) {
AA. case O?O8
AB. r@a?b# breaN#
A6. case O-O8
A=. r@a-b# breaN#
22
A,. case O'O8
A<. r@a'b# breaN#
AC. case ODO8
AL. r@aDb# breaN#
A7. de1ault8
B-. Sstem.out.println(!:perator invalid!)#
BA. Sstem.e%it(A)#
BB. $
B6. Sstem.out.println(a?! !?oper?! !?b?! @ !?r)#
B=. $
B,. $
n linia 7 se citete un caracter de la tastatur memorat n oper i, n func[ie de
el se execut instruc[iunile de pe liniile 12, 14, 16, 18 sau 20-21. nstruc[iunile de pe
liniile 20-21 se execut doar n cazul n care nu a fost introdus un operator corect.
12emplu 7: S se spun dac un numr dat mai mic dect 10 este par sau impar.
A. public class Har9mpar{
B. public static void main(String args[]){
6. int %@B#
=. s&itc* (%) {
,. case -8
<. case B8
C. case =8
L. case <8
7. case L8
A-. Sstem.out.println(%?! este numar par!)#breaN#
AA. de1ault8
AB. Sstem.out.println(%?! este numar impar!)#
A6. $
A=. $
A,. $
n exemplul precedent ne intereseaz ca aceeai instruc[iune, cea din linia 9
s fie executat pentru mai multe potriviri. n acest caz, sunt folosite mai multe linii
de case fr nici un rezultat, instruc[iunea s&itc* executnd prima instruc[iune
ntlnit dup gsirea potrivirii. Prin urmare, instruc[iunea breaN nu apare pe nici
una din liniile 5, 6, 7,8.
+.-.+. Instruciuni repetitive
23
1. Instruciunea for repet un bloc de instruc[iuni ct timp o condi[ie este
adevrat. n general, se cunoate de la nceput de cte ori urmeaz s se
execute blocul de instruc[iuni. Are forma general:
1or (ini4iali3are# test# incrementare)
instruc4iuni
unde:
ini4iali3are este o expresie care ini[ializeaz variabila de control
a instruc[iunii 1or
test este o expresie boolean evaluat naintea fiecrei reluri a
buclei; ct timp valoarea ei este true blocul de instruc[iuni se execut. Cnd
valoarea ei este 1alse, se prsete instruc[iunea 1or.
incrementare este o expresie care modific variabila de control a
instruc[iunii 1or.
Oricare dintre cele trei pr[i constituente ale instruc[iunii 1or poate s
lipseasc.
1or ( # # )
n acest caz se ob[ine o bucl infinit. Pentru a evita acest lucru este necesar
ca n cadrul blocului de instruc[iuni s existe o condi[ie de oprire.
De asemenea, blocul de instruc[iuni poate s lipseasc, el fiind nlocuit de
instruc[iunea vid. Exemplul 8 de mai jos ilustreaz aceast situa[ie.
12emplu 8: S se calculeze n9 unde n este ini[ializat n program.
B. public class Pactorial{
6. public static void main(String args[]){
=. long 1@A#
,. int n@A,#
<. 1or(int i@B# iG@n# i??)
C. 1'@i# DD1@1'i#
L. Sstem.out.println(n?!"@!?1)#
7. $
A-. $
12emplu :: S se calculeze n9 unde n este ini[ializat n program.
A. public class Pactorial{
B. public static void main(String args[]){
6. long 1@A#
=. int n@A,#
,. 1or(int i@B# iG@n# 1'@i+ i??)
24
<. #
C. Sstem.out.println(n?!"@!?1)#
L. $
7. $
Dup cum se poate remarca, pe linia 6 este folosit instruc[iunea vid
deoarece codul 1'@i a fost mutat n cadrul pr[ii de incrementare.
O alt observa[ie ar fi c, oricare dintre pr[ile constituente ale instruc[iunii 1or
poate fi format din mai multe instruc[iuni. Acest lucru este ilustrat n programul
urmtor.
12emplu ;:
A. public class Pactorial{
B. public static void main(String args[]){
6. long 1+ ;imSup#
=. int n@A-+i#
,. ;imSup@(long).at*.po&(B+<6)#
<. 1or(i@B+1@A# iG@n II 1G@;imSupDi# 1'@i+i??)
C. #
L. i1 (i@@n?A)
7. Sstem.out.println(n?!"@!?1)#
A-. else
AA. Sstem.out.println(n?!"@este prea mare pentru puterile mele!)#
AB. $
A6. $
n linia 5 este calculat numrul maxim reprezentabil, de tip long. n 1or,
ini[ializm dou variabile i@B+1@A. Qest-ul este format din dou condi[ii unite prin
II. 9ncrementarea este, de asemenea, format din dou instruc[iuni 1'@i+i??.
11. Instruciunea while are forma:
&*ile (condi4ie)
instruc4iuni
nstruc[iunea &*ile este folosit pentru a repeta execu[ia unui grup de
instruc[iuni atta timp ct condi4ie are valoare true.
12emplu '$: S se calculeze suma cifrelor unui numr.
A. public class SumCi1Nr{
B. public static void main(String args[]){
6. long %@AB6=,+%9nit@%#
25
=. int s@-#
,. &*ile(%>-){
<. s?@%RA-#
C. %D@A-#
L. $
7. Sstem.out.println(!Suma ci1relor numarului !?%9nit?!
este8 !?s)#
A-. $
AA. $
nstruc[iunea while se mai numete i instruc[iune cu test ini[ial. Dac la prima
evaluarea a condi4iei aceasta are valoarea 1alse instruc[iunile din corpul
&*ile-ului nu se execut niciodat. n exemplul precedent, dac ini[ializm % cu -,
condi[ia %>- este fals i se continu cu instruc[iunea din linia 9.
12. Instruciunea do-while are forma:
do{
instruc4iuni
$&*ile (condi4ie)#
Ca i &*ile, instruc[iunea do-&*ile este folosit pentru a repeta execu[ia
unui grup de instruc[iuni atta timp ct condi4ie are valoare true. Diferen[a dintre
cele dou instruc[iuni este c, dac la &*ile se executau instruc[iunile doar dac
condi4ie era adevrat, n cazul lui do-&*ile blocul de instruc[iuni se execut
cel pu[in o dat dup care se verific valoarea condi[iei.
nstruc[iunea do-while se mai numete i instruc[iune cu test final.
12emplu '': S se calculeze cel mai mare divizor comun a dou numere a i b.
A. public class Cmmdc{
B. public static void main(String args[]){
6. long a@,=+b@<L+r#
=. Sstem.out.print(!Cmmdc-ul numerelor !?a?! si !?b?!
este8 !)#
,. do{
<. r@aRb#
C. a@b#
L. b@r#
7. $&*ile(r>-)#
A-. Sstem.out.println(a)#
AA. $
AB. $
26
13. Instruciunea break
breaN
Este folosit pentru prsirea for[at a corpurilor instruc[iunilor repetitive (1or+
&*ile+ do-&*ile).
12emplu '": S se caute un numr cuprins n intervalul <ab=.
A. public class J%SreaN{
B. public static void main(String args[]){
6. int a@A-+ b@B-+ %#
=. &*ile(true){
,. %@(int)(.at*.random()'b)#
<. i1 ( (aG@%) II (%G@b) )
C. breaN#
L. $
7. Sstem.out.println(%)#
A-. $
AA. $
n linia 5 se genereaz aleator un numr ntreg mai mic dect b. Dac numrul
este cuprins n intervalul <ab= se prsete instruc[iunea &*ile.
Dac instruc[iunea break este plasat n cadrul mai multor instruc[iuni
repetitive imbricate, ea are ca efect prsirea doar a instruc[iuni care o con[ine.
12emplu:
A. 1or(...){
B. ...
6. 1or(...){
=. ...
,. breaN#
<. ...
C. $
L. ...
7. $
Efectul instruc[iunii breaN este prsirea 1or-ului din linia 3, execu[ia
continundu-se cu instruc[iunile de pe linia 8.
14. Instruciunea continue
Are ca efect ntreruperea execu[iei itera[iei curente i trecerea la itera[ia
urmtoare.
27
12emplu '4: Urmtorul cod afieaz toate caracterele citite cu excep[ia cifrelor de la
0 la 9.
A. public class J%Continue{
B. public static void main(String args[]){
6. 1or(int i@-# iG@A-# i??){
=. c*ar c@O O#
,. tr{
<. c@(c*ar)Sstem.in.read()#
C. $
L. catc*(J%ception e){$
7. i1 ( (O-OG@c) II (cG@O7O) )
A-. continue#
AA. Sstem.out.print(c?! !)#
AB. $
A6. $
A=. $
n cazul n care se citete o cifr, se execut instruc[iunea continue de pe
linia 10, nu se mai execut linia 11 i se sare direct la linia 3.
Observa-ie: nstruc[iunile breaN i continue pot s apar doar n cadrul unor
instruc[iuni repetitive. Excep[ie face instruc[iunea breaN care poate s apar i n
cadrul instruc[iunii s&itc*.
+... 5ablouri >vectori?
+...1. 5ablouri >vectori? unidimensionale
:eclararea unui vector se face prin
TipElement[] numeVector; sau TipElement numeVector[];
unde QipJlement reprezint tipul elementelor vectorului, iar parantezele []
aezate fie naintea fie dup numele vectorului arat c este vorba despre un vector.
12emple:
int[] v#
String adrese[]#
28
Instanierea unui vector se realizeaz cu operatorul ne& i are ca efect
alocarea memoriei necesare pentru memorarea elementelor vectorului, mai precis
specificarea numrului maxim de elemente pe care l va avea vectorul. nstan[ierea
unui vector se face astfel:
numeVector = new TipElement[dimensiune];
12emple:
v @ ne& int[A-]# //se aloc spa[iu pentru 10 ntregi
adrese @ ne& String[A--]# //se aloc spa[iu pentru 100 de String-uri
Declararea i instan[ierea unui vector pot fi fcute simultan astfel:
TipElement[] numeVector = new TipElement[dimensiune];
12emple8
int [] v @ ne& int[A-]#
Dup declararea unui vector, acesta poate fi ini[ializat, adic elementele sale
pot primi valori. n acest caz instan[ierea lipsete, alocarea memoriei fcndu-se
automat n func[ie de numrul de elemente cu care se ini[ializeaz vectorul.
12emple:
String culori[] @ {!Tosu!+ !)alben!+ !Uerde!$#
int []v @ {B+ =+ <+ L+ A-+ AB$#
Observa-ii:
Primul indice al unui vector este 0, deci pozi[iile unui vector cu n elemente vor
fi cuprinse ntre 0 i n-1.
Nu sunt permise construc[ii de genul:
TipElement numeVector[dimensiune]
alocarea memoriei fcndu-se doar prin intermediul operatorului ne& sau prin
ini[ializare.
12emple:
int v[A-]# //incorect
int v[] @ ne& int[A-]# //corect
29
4ccesul la elementul unui vector se face prin:
numeVector[indice]
12emplu ':
int v[]@ne& int[A-]#
1or(i@-# iGA-# i??)
v[i]@i#
12emplu ":
int v[]@{A+B+6+=+,$#
1or(i@-# iG,# i??)
Sstem.out.println(v[i]?K V)#
+...2. 5ablouri >vectori? cu mai multe dimensiuni
n Java tablourile cu mai multe dimensiuni sunt de fapt vectori de vectori. Prin
urmare, declararea, instan[ierea i ini[ializarea se fac la fel ca n cazul vectorilor
unidimensionali.
TipElement numeVector[][] = new TipElement[dim!][dim"]
sau
TipElement[][] numeVector = new[dim!][dim"] TipElement
sau parantezele pot fi de o parte i de alta a lui numeUector.
12emplu:
int m[][]# DDdeclararea unei matrice
m @ ne& int[,][A-]# DDcu , linii+ A- coloane
Observa-ie:
m[-]+ m[A]+ ...+ m[=] sunt vectori de ntregi cu 10 elemente
+...+. :imensiunea unui vector
Cu ajutorul cuvntului cheie len#th se poate afla dimensiunea unui vector.
12emple:
Fie vectorul
int []a @ ne& int[,]#
atunci a.lengt* are valoarea 5.
Fie matricea
int m @ ne& int[,][A-]#
30
atunci:
m.lengt* are valoarea 5 i reprezint numrul de linii al matricei
m[-].lengt* are valoarea 10 i reprezint numrul de elemente al
primei linii a matricei,
m[A].lengt* are valoarea 10 i reprezint numrul de elemente al
celei de-a doua linii a matricei, etc.
12emplu '5: S se calculeze minimul elementelor unui vector.
A. public class .inUect{
B. public static void main(String args[]){
6. int a[]@{B+A+=+C+6$#
=. int min@a[-]#
,. 1or(int i@-# iGa.lengt*# i??)
<. i1 (min>a[i])
C. min@a[i]#
L. Sstem.out.println(!.inimul este !?min)#
7. $
A-. $
12emplu '6: S se ordoneze elementele de pe diagonala principal a unei matrice.
A. public class :rdWiagHrinc{
B. public static void main(String args[]){
6. int a[][]@{{B+A+=+C$+{6+,+A+L$+{B+,+A+7$+{6+B+,+L$$#
=. boolean ordonat#
,. 1or(int i@-# iGa.lengt*# i??){
<. 1or(int j@-# jGa[i].lengt*# j??)
C. Sstem.out.print(a[i][j]?! !)#
L. Sstem.out.println(!!)#
7. $
A-. do{
AA. ordonat@true#
AB. 1or(int i@-# iGa.lengt*-A# i??)
A6. i1 (a[i][i]>a[i?A][i?A]){
A=. int au%@a[i][i]#
A,. a[i][i]@a[i?A][i?A]#
A<. a[i?A][i?A]@au%#
AC. ordonat@1alse#
AL. $
A7. $&*ile("ordonat)#
B-. Sstem.out.println(!.atricea cu diagonala
ordonata8!)#
BA. 1or(int i@-# iGa.lengt*# i??){
BB. 1or(int j@-# jGa[i].lengt*# j??)
B6. Sstem.out.print(a[i][j]?! !)#
B=. Sstem.out.println(!!)#
B,. $
31
B<. $
BC. $
+...-. 5ablouri cu dimensiuni variabile
Java permite folosirea tablourilor cu dimensiuni variabile adic, a vectorilor de
vectori cu dimensiuni variabile.
12emplu '7: S se genereze i s se afieze triunghiul lui Pascal.
A. public class QrHascal{
B. public static void main(String args[]){
6. int []a[]@ne& int[A-][]#
=. a[-]@ne& int[A]#
,. a[A]@ne& int[B]#
<. a[-][-]@a[A][-]@a[A][A]@A#
C. 1or(int i@B# iGa.lengt*# i??){
L. a[i]@ne& int[i?A]#
7. a[i][-]@a[i][i]@A#
A-. 1or(int j@A# jGa[i].lengt*-A# j??)
AA. a[i][j]@a[i-A][j-A]?a[i-A][j]#
AB. $
A6. 1or(int i@-# iGa.lengt*# i??){
A=. 1or(int j@-# jGa[i].lengt*# j??)
A,. Sstem.out.print(a[i][j]?! !)#
A<. Sstem.out.println(!!)#
AC. $
AL. $
A7. $
n linia 8 se observ c, pentru fiecare linie a matricei se aloc memorie pentru
un numr variabil de elemente: pe linia 0 va fi memorat un element, pe linia 1 vor fi
memorate dou elemente, etc.
+.0. @iruri de caractere
n Java, un ir de caractere poate fi reprezentat printr-un vector format din
elemente de tip c*ar, un obiect de tip String sau un obiect de tip StringSu11er.
12emple echivalente de declarare a unui ir:
String str @ !abc!#
c*ar data[] @ {OaO+ ObO+ OcO$#
String str @ ne& String(data)#
String str @ ne& String(!abc!)#
32
Concatenarea irurilor de caractere se face prin intermediul operatorului ).
String strA @ !abc! ? !%3!#
String strB @ !AB6!#
String str6 @ strA ? strB#
n Java, operatorul de concatenare ) este extrem de flexibil n sensul c
permite concatenarea irurilor cu obiecte de orice tip care au o reprezentare de tip
ir de caractere.
12emplu:
Sstem.out.print(!Uectorul v are! ? v.lengt* ? !
elemente!)#
33
-. Clase i obiecte n Java
-.1. Ae!erine
Dup cum am artat n capitolul 2, o clas este un ablon pentru mai multe
obiecte cu caracteristici asemntoare. Un obiect este o colec[ie de variabile
(atribute) i metode asociate descrise n clas.
Clasa poate fi asemnat cu un tip de date iar obiectul cu o variabil. Dac se
declar o variabil folosind numele unei clase ca i tip, aceast variabil con[ine o
re!erin" ctre un obiect al clasei respective. Cu alte cuvinte, variabila nu va con[ine
obiectul actual ci o referin[ ctre un obiect / o instan[ a clasei. Deoarece folosind
numele unei clase ca i tip se declar o referin[ ctre un obiect, aceste tipuri poart
numele de tipuri re!erin".
Se disting dou caracteristici principale ale obiectelor n Java:
obiectele sunt ntotdeauna alocate dinamic. Durata de via[ a unui
obiect este determinat de logica programului. Ea ncepe atunci cnd
obiectul este creat i se termin n momentul n care obiectul nu mai
este folosit, el fiind distrus de un mecanism de cur[enie oferit de
limbajul Java garbage collector (colectorul de gunoaie).
obiectele nu sunt con[inute de ctre variabile. O variabil pstreaz o
referin[ ctre un obiect. o referin[ este similar cu ceea ce se
numete pointer n alte limbaje de programare cum ar fi C++. Dac
exist dou variabile de acelai tip referin[ i o variabil este atribuit
celeilalte, ambele vor referi acelai obiect. Dac informa[ia din obiect se
modific, schimbarea este vizibil n ambele variabile.
O variabil referin[ poate con[ine i o referin[ ctre nimic. Valoarea unei
asemenea variabile referin[ este null.
n Java nu se permite tipurilor referin[ s fie convertite ctre tipuri primitive
sau invers.
34
n capitolul 2 am vzut cum se poate lucra cu tablouri (iruri) fr s ne punem
problema cu ce tip de date lucrm primitiv sau referin[. n Java, irurile nu sunt
tipuri primitive ci referin[. Ele se comport ca nite obiecte.
-.2. 3biecte
-.2.1. Boiuni generale
n Java obiectele sunt create prin instan[ierea unei clase, cu alte cuvinte prin
crearea unei instan[e a unei clase.
:eclararea obiectului se face prin:
NumeClasa nume:biect#
Exemplu:
String s#
Comple% c#
n urma declarrii, variabila este ini[ializat cu null.
Crearea obiectului echivalent cu instan[ierea clasei se realizeaz prin
intermediul operatorului new i presupune alocarea spa[iului de memorie necesar
pstrrii obiectului. Adresa (referin[a) ctre obiectul respectiv o s fie memorat n
variabila nume:biect.
nume:biect @ ne& NumeClasa()#
Exemplu:
s@ne& String() #
Comple% c@ne& Comple%(B+6)#
Declararea i crearea obiectului pot fi fcute pe aceeai linie.
Exemplu:
String s@ne& String() #
Comple% c@ne& Comple%(B+6)#
n momentul n care se realizeaz crearea obiectului are loc i ini[ializarea lui.
4tenie
Spa[iul de memorie nu este alocat n momentul declarrii obiectului.
12emplu:
35
Comple% c#
c.re @ A-# DDJT:(TJ"
Alocarea memoriei se face doar la apelul instruc[iunii new !
Ae!erirea valorii unei variabile se face prin
obiect$%ariabila
12emplu:
Comple% c @ ne& Comple%()#
c.re @ B#
c.im @ 6#
Sstem.out.println(!Te@! ?c.re? ! 9m@!?c.im)#
Observa-ie: Accesul la variabilele unui obiect se face n conformitate cu drepturile de
acces pe care le ofer variabilele respective celorlalte clase.
4pelul unei metode se face prin
obiect$metoda([parametri])
12emplu:
Comple% c @ ne& Comple%()#
c.setTe(B)#
c.set9m(6)#
n Java programatorul nu mai are responsabilitatea distrugerii obiectelor sale
ntruct, n momentul rulrii unui program, simultan cu interpretorul Java ruleaz i
un proces care se ocup de distrugerea obiectelor care nu mai sunt folosite. Acest
proces pus la dispozi[ie de platforma Java de lucru se numete garbage collector
(colector de gunoaie). Un obiect este eliminat din memorie de procesul de colectare
atunci cnd nu mai exista nici o referin[ la acesta. Referin[ele (care sun de fapt
variabile) sunt distruse:
natural, atunci cnd variabila respectiv nu mai este folosit (de exemplu,
la terminarea unei metode)
e2plicit, dac atribuim variabilei respective valoare null.
-.2.2. 3peratorul de atribuire C
n cazul n care operatorul = este folosit mpreun cu date de tip primitiv, are
loc o atribuire de valori.
12emplu:
36
int % @ AB+ @ A-#
% @ #
Valoarea lui x se schimb, primind valoarea lui y.
n cazul n care operatorul = este folosit mpreun cu date de tip referin[, are
loc tot o atribuire de valori. Atta doar c valorile sunt n acest caz adrese.
12emplu:
A. class Nimic{
B. int %#
6. $
=. class Qest{
,. public static void main(String args[]){
<. Nimic aA@ne& Nimic()+aB#
C. aA.%@A-#
L. a"=a!;
7. Sstem.out.println(aA.%?! !?aB.%)#
A-. aA.%@,#
AA. Sstem.out.println(aA.%?! !?aB.%)#
AB. $
A6. $
n linia 7 se modific valoarea atributului % a obiectului aA. n linia 8 con[inutul
variabilei aA se copiaz n aB. Se afieaz 10 10. Se schimb valoarea atributului lui
aA i, ne-am atepta s se afieze 5 10 dar se afieaz 5 5. Nu este greit! n linia 8
se copiaz valoarea lui aA adic referin[a ctre obiect n aB. Din acest moment
exist un singur obiect ctre care refer att aA ct i aB. Orice modificare are loc
asupra obiectului, ea este vzut i de aA i de aB.
12emplu:
public class Qest{
public static void main(String args[]){
int[] aA@{A+B+6+=+,$#
int[] aB#
aB@aA#
1or(int i@-# iGaA.lengt*# i??)
aB[i]??#
1or(int i@-# iGaA.lengt*# i??)
Sstem.out.print(aA[i]?! !)#
Sstem.out.println(!!)#
1or(int i@-# iGaB.lengt*# i??)
Sstem.out.print(aB[i]?! !)#
$
$
37
Rezultatul este:
2 3 4 5 6
2 3 4 5 6
-.2.+. 3peratorul de egalitate CC
n cazul n care operatorul == este folosit mpreun cu date de tip primitiv, are
loc o testare a egalit[ii valorilor celor dou variabile.
12emplu:
int % @ AB+ @ A-+ 3 @ AB#
% @@ are valoarea false; % i au valori diferite
% @@ 3 are valoarea true; % i 3 au valori egale
n cazul n care operatorul = este folosit mpreun cu date de tip referin[, se
verific dac cele dou variabile refer acelai obiect.
12emplu:
A. class Nimic{
B. int %#
6. Nimic(int %){
=. t*is.%@%#
,. $
<. $
C. class Qest{
L. public static void main(String args[]){
7. Nimic aA@ne& Nimic(A)+aB@ne& Nimic(A)#
A-. i1(aA@@aB)
AA. Sstem.out.println(!Sunt egale!)#
AB. else
A6. Sstem.out.println(!Nu sunt egale!)#
A=. aB@aA#
A,. i1(aA@@aB)
A<. Sstem.out.println(!Sunt egale!)#
AC. else
AL. Sstem.out.println(!Nu sunt egale!)#
A7. $
B-. $
n linia 9 se creeaz dou obiecte cu aceeai valoare. Totui testul din linia 10
are ca rezultat valoarea 1alse. Dup linia 14 cele dou variabile refer acelai
obiect i, prin urmare, testul din linia 15 are ca rezultat valoarea true.
38
-.+. Clase
-.+.1. :e!inirea claselor
[public][abstract][1inal] class &ume'lasa
[e%tends NumeSuperclasa]
[implements 9nter1ataA [+ 9nter1ataB ... ]]
{
DDcorpul clasei
$
4ntetul clasei:
[public][abstract][1inal] class &ume'lasa
este format din modi!icatorii clasei, cuvntul rezervat class i numele clasei
NumeClasa.
Prezen[a parantezelor [] indic faptul c ceea ce este cuprins ntre ele este
op[ional.
/odi!icatorii clasei sunt:
public( dac o clas este declarat public, ea este accesibil oricrei
alte clase. Dac modificatorul public nu apare, clasa poate fi accesat
doar de ctre clasele din pachetul cruia apar[ine clasa (dac nu se
specific un anume pachet, toate clasele din directorul curent sunt
considerate a fi n acelai pachet). Spa[iul de cutare este definit de
variabila sistem CLASSPATH.
abstract( o clas declarat abstract este o clas ablon adic ea este
folosit doar pentru a crea un model comun pentru o serie de subclase. O
clas trebuie declarat abstract daca ea este incomplet implementat
adic nu toate metodele ei sunt definite. O astfel de clas nu poate !i
instaniat", dar poate fi extins de alte clase care s implementeze
metodele nedefinite. Doar clasele abstracte pot s con[in metode
abstracte (metode declarate dar nu implementate).
final o clas poate fi declarat final dac a fost complet definit i nu se
dorete s fie extins (s aib subclase); cu alte cuvinte ea nu poate apare
n clauza extends a altei clase.
39
Observa-ie: O clas declarat att abstract ct i final genereaz eroare.
Dac clasa este abstract nseamn c ea con[ine metode neimplementate i, prin
urmare trebuie extins de o alt clas care s le implementeze. Dar, dac ar fi i
final, nu ar putea fi extins.
Dup numele clasei se pot specifica, dac este cazul, clasele motenite i
interfe[ele implementate. O clas poate moteni o singur clas, prin urmare dac
apare clauza e%tends ea este urmat doar de numele unei clase. ns, o clas
poate implementa mai multe interfe[e, ale cror nume apar dup clauza
implements i trebuie separate prin virgul. Asupra motenirii i interfe[elor se
gsesc mai multe detalii n subcapitolele ,Motenire respectiv ,nterfe[e.
Corpul unei clase urmeaz dup antetul clasei i este cuprins ntre acolade.
Con[ine:
declararea variabilelor instan[ i clas care mpreun formeaz
variabilele membru;
definirea metodelor instan[ i clas care mpreun formeaz metodele
membru.
Observa-ie: variabilele unei clase pot avea acelai nume cu metodele clasei.
-.+.2. 9ariabile membru
Variabilele se declar de obicei naintea metodelor, dei acest lucru nu este
impus de compilator.
class NumeClasa {
DDdeclararea variabilelor
DDdeclararea metodelor
$
Variabilele unei clase sunt doar cele care sunt declarate n corpul clasei i nu
n corpul unei metode. Variabilele declarate n cadrul unei metode sunt locale
metodei respective.
Declararea unei variabile presupune specificarea urmtoarelor lucruri:
numele variabilei;
tipul de date;
nivelul de acces la acea variabil de ctre alte clase;
40
dac este constant sau nu;
tipul variabilei: instan[ sau clas
Tiparul declarrii unei variabile este:
[modificatori] Tip)e)ate numeVariabila [ = %aloare*nitiala ] ;
unde un modificator poate fi :
un specificator de acces: public+ protected+ private#
unul din cuvintele rezervate: static+ 1inal+ transient+ volatile.
12emple:
double %#
protected static int n#
public String s @ !abcd!#
private Hoint p @ ne& Hoint(A-+ A-)#
1inal long .(X @ A-----;#
Detalii despre modificatorii de acces se gsesc n subcapitolul ,Modificatori de
acces pentru membrii unei clase.
Cuvintele rezervate: static+ 1inal+ transient+ volatile au urmtoarele
roluri:
static este folosit pentru declararea variabilelor clas.
12emplu:
int % # //variabil instan[
static int nrWe:biecteCreate# //variabil clas
final este folosit pentru declararea constantelor. O constant este o
variabil a crei valoare nu mai poate fi schimbat. Valoarea unei variabile
finale nu trebuie specificat neaprat la declararea ei, ci poate fi specificat
i ulterior, dup care ea nu va mai putea fi modificat.
12emplu: se declar i se ini[ializeaz o variabil final (linia 1). Valoarea ei nu mai
poate fi modificat (linia 3).
A. 1inal double H9 @ 6.A= #
B. ...
6. H9 @ 6.A=A DD eroare la compilare
12emplu: se declar o variabil final (linia 2). n linia 4 se ini[ializeaz iar n linia 5
se dorete modificarea valorii ei.
A. class Qest {
B. 1inal int .(X#
6. Qest() {
41
=. .(X @ A--# DD legal
,. .(X @ B--# DD ilegal -> eroare la compilare
<. $
C. $
transient este folosit la serializarea obiectelor, pentru a specifica ce
variabile membru ale unui obiect nu participa la serializare.
%olatile este folosit pentru a semnala compilatorului s nu execute
anumite optimizri asupra membrilor unei clase. Este o facilitate avansat
a limbajului Java.
-.+.+. /etode
4.3.3.1 Definirea metodelor
Metodele sunt folosite pentru descrierea comportamentului unui obiect. O
metod se declar astfel:
[modi1icatori] QipTeturnat nume.etoda ([argumente])
[t*ro&s QipJ%ceptie]
{
DDcorpul metodei
$
4.3.3.2 Modificatorii metodelor
Un modificator poate fi :
un specificator de acces: public+ protected+ private#
unul din cuvintele rezervate: static+ abstract+ 1inal+ native+
snc*roni3ed.
Detalii despre modificatorii de acces se gsesc n subcapitolul ,Modificatori de
acces.
Cuvintele rezervate: static+ abstract+ 1inal+ native+ snc*roni3ed
au urmtoarele roluri:
static este folosit pentru declararea metodelor clas.
12emplu:
void metodaA() # DDmetoda de instanta
static void metodaB()# DDmetoda de clasa
42
abstract este folosit pentru declararea metodelor abstracte. O metod
abstract este o metod care nu are implementare i trebuie s apar[in
unei clase abstracte.
final este folosit pentru a specifica faptul c acea metod nu mai poate fi
supradefinit n subclasele clasei n care ea este definit ca fiind final.
Acest lucru este util dac respectiva metod are o implementare care nu
trebuie schimbat n subclasele ei.
nati%e este folosit pentru refolosirea unor func[ii scrise n alt limbaj de
programare dect Java (C de exemplu).
s+nchroni,ed este folosit n cazul n care se lucreaz cu mai multe fire de
execu[ie iar metoda respectiv se ocup cu partajarea unei resurse
comune. Are ca efect construirea unui semafor care nu permite executarea
metodei la un moment dat dect unui singur fir de execu[ie.
4.3.3.3 Tipul returnat de o metod
Metodele pot s returneze sau nu o valoare (un obiect) la terminarea lor. Tipul
valorii returnate poate fi att un tip primitiv de date (int, double, etc.) ct i o referin[
la un obiect al unei clase. n cazul n care o metoda nu returneaz nimic atunci
QipTeturnat este %oid.
12emplu: void a1isareTe3ultat()
Returnarea valorii de ctre o metod se realizeaz prin intermediul instruc[iunii
return.
Dac o metod returneaz o valoare de un tip de baz atunci tipul ei trebuie s
coincid cu QipTeturnat, n caz contrar se primete eroare la compilare.
12emplu: Metod care calculeaz maximul a dou numere
public int ma%(int a+ int b){
return a>bFa8b#
$
Dac valoarea returnat este o referin[ la un obiect al unei clase, atunci clasa
obiectului returnat trebuie s coincid sau s fie o subclas a clasei specificate la
declararea metodei.
43
4.3.3.4 Parametrii unei metode
Dup cum am vzut, numele clasei este urmat de lista parametrilor
(argumentelor), list care este op[ional (o metod poate s nu aib parametrii).
Parametrii sunt specifica[i prin numele i tipul lor, fiind despr[i[i unul de altul prin
virgul.
Nume.etoda([tipA argumentA]+ [tipB
argumentB] ... )
Tipul de date al unui argument poate fi orice tip valid al limbajului, att tip
primitiv de date ct i referin[ la un obiect.
Exemplu:
void adaugareHersoana(String nume+ int varsta+ 1loat
salariu){
...
$
unde String este tip referin[+ int /i 1loat sunt tipuri primitive.
n Java o metod nu poate primi un numr variabil de argumente, ceea ce
nseamn c apelul unei metode trebuie s se fac cu specificarea exact a
numrului i tipurilor argumentelor.
Nu este permis gruparea parametrilor dup tipul lor.
12emplu:
public int ma%(int a+b){...$ DDeste gre/it
public int ma%(int a+ int b){ ...$ DDeste corect
Numele argumentelor primite trebuie s difere ntre ele i nu trebuie s
coincid cu numele nici uneia din variabilele locale ale metodei. Pot ns, s coincid
cu numele variabilelor membre ale clasei caz n care diferen[ierea se va face prin
intermediul variabile this. Vezi subcapitolul ,Obiectul t*is
12emplu:
class Comple%{
int re+im#
public sc*imba(int re+ int im){
t*is.re @ re#
t*is.im @ im#
$
$
4tenie, n Java argumentele sunt trimise doar prin valoare !!!
44
Asta nsemn c metoda recep[ioneaz doar valorile variabilelor primite ca
parametri. Cnd argumentul are tip primitiv de date metoda nu-i poate schimba
valoarea dect local (n cadrul metodei); la revenirea din metod variabila are
aceeai valoare ca la apelul ini[ial al metodei (modificrile fcute n cadrul metodei
sunt pierdute). Cnd argumentul este de tip referin[ metoda nu poate schimba
referin[a obiectului ns poate schimba variabilele membru ale respectivului obiect.
Prin urmare, dac dorim ca o metod s schimbe starea (valoarea) unui argument
primit, atunci el trebuie s fie neaprat de tip referin[ (trebuie s fie un obiect!).
-.+.-. Constructorii unei clase
Constructorii unei clase sunt metode speciale care au acelai nume cu cel al
clasei, nu returneaz nici o valoare i sunt folosi[i pentru ini[ializarea obiectelor
acelei clase n momentul instan[ierii lor. Constructorii controleaz modul n care un
obiect este creat i ini[ializat.
Class C:.H;JX {
C:.H;JX() {
DDconstructor
$
$
O clas poate avea unul sau mai mul[i constructori care trebuie ns s difere
prin lista de parametri primi[i. Astfel sunt permise diferite tipuri de ini[ializri ale
obiectului la crearea sa, n func[ie de numrul parametrilor cu care este apelat
constructorul.
12emplu: Clasa COMPLEX are trei constructori: unul fr parametrii definit n liniile
3-5, altul cu doi parametrii definit n liniile 6-8, altul cu un parametru definit n liniile 9-
11.
A. class C:.H;JX {
B. double re+ im#
6. C:.H;JX () {
=. re@im@-#
,. $
<. C:.H;JX (double r+ double i ) {
C. re@r# im@i#
L. $
7. C:.H;JX (double r) {
A-. re@r# im@-#
45
AA. $
AB. $
Constructorii sunt apela[i automat la instan[ierea unui obiect. n cazul n care
dorim s apelm explicit constructorul unei clase folosim metoda this(ar#umente),
care apeleaz constructorul corespunztor (ca argumente) al clasei respective.
Aceast metod este folosit atunci cnd sunt implementa[i mai mul[i constructori
pentru o clas pentru a nu repeta secven[ele de cod scrise la constructorii cu mai
pu[ine argumente.
12emplu: n clasa COMPLEX a fost definit constructorul cu doi parametrii. Ceilal[i doi
constructori fac apel la constructorul cu doi parametrii n liniile 4 i 10.
A. class C:.H;JX {
B. double re+ im#
6. C:.H;JX () {
=. t*is(-+-)#
,. $
<. C:.H;JX (double r+ double i ) {
C. re@r# im@i#
L. $
7. C:.H;JX (double r) {
A-. t*is(r+-)#
AA. $
AB. $
Dac ntr-o clas nu este definete nici un constructor, sistemul i creeaz
automat un constructor implicit care nu primete nici un argument. El ini[ializeaz
variabilele membru de tipuri primitive cu 0 i pe cele de tipuri referin[ cu null. Deci
prezen[a constructorilor n corpul unei clase nu este obligatorie. Dac ntr-o clas a
fost definit cel pu[in un constructor cu parametrii, atunci constructorul implicit (fr
parametrii) nu va mai fi creat automat.
12emplu: n clasa COMPLEX nu a fost definit nici un constructor. n linia 5 se
apeleaz constructorul implicit creat automat pentru clasa Complex.
A. class C:.H;JX {
B. double re+ im#
6. $
=. ...
,. C:.H;JX c@ ne& C:.H;JX ()#
46
12emplu: n clasa COMPLEX au fost defini[i doi constructori: cu un parametru i cu
doi parametrii. n linia 11 se apeleaz constructorul fr parametrii. Aceast linie
genereaz o eroare deoarece nu exist constructor fr parametrii el nu a fost
creat implicit.
A. class C:.H;JX {
B. double re+ im#
6. C:.H;JX (double r+ double i ) {
=. re@r# im@i#
,. $
<. C:.H;JX (double r) {
C. t*is(r+-)#
L. $
7. $
A-. ...
AA. C:.H;JX c@ ne& Comple%()# DDeroare
Constructorii unei clase pot avea urmtorii specificatori de acces:
pri%ate: nici o alt clas nu poate instan[ia obiecte ale acestei clase. O astfel
de clas poate con[ine metode publice care s-i creeze propriile obiecte i s le
returneze altor clase;
public: orice clas poate crea instan[e ale clasei respective;
protected: doar subclasele pot crea obiecte de tipul clasei respective.
Dac specificatorul lipsete, doar clasele din acelai pachet pot crea instan[e
ale clasei respective.
-.+... 3biectul this
Obiectul t*is este o referin[ ctre obiectul curent.
Este folosit n trei situa[ii:
n cadrul unei metode care are parametrii cu nume identic cu numele
atributelor clasei. n aceast situa[ie, trebuie fcut o diferen[ ntre cele
dou. Cu t*is se calific atributele clasei.
12emplu: Metoda sc*imba primete doi parametrii cu acelai nume cu atributele
clasei: re i im.
A. class Comple%{
B. int re+im#
6. public sc*imba(int re+ int im){
47
=. this$re @ re#
,. this$im @ im#
<. $
C. $
n cadrul constructorilor pentru a apela ceilal[i constructori ai clasei.
12emplu: n liniile 4 i 11 se apeleaz constructorul cu doi parametrii definit n liniile
6-9.
A. public class Tational{
B. private long m+n#
6. public Tational(){
=. this(-.!);
,. $
<. public Tational(long m+long n){
C. t*is.m@m#
L. t*is.n@n#
7. $
A-. public Tational(long m){
AA. this(m.!);
AB. $
A6. $
pentru a testa c obiectul primit ca parametru nu este chiar obiectul curent.
12emplu: Clasa ContSancar con[ine metoda trans1er n care se transfer suma
de bani din contul primit n contul curent liniile 10, 11. n linia 15 se creeaz un
obiect ContBancar. n linia 16 se apeleaz metoda transfer a obiectului c cu
parametru c. Asta nseamn c, suma din contul c va fi transferat tot n contul c.
Citind cu aten[ie codul din liniile 10, 11 observm c se adun suma primit
(c.suma) la suma actual (t*is.suma) n cazul nostru, contul i dubleaz suma,
dup care suma contului primit (c.suma) se face zero.
A. public class ContSancar{
B. private long suma#
6. public ContSancar(){
=. t*is(-)#
,. $
<. public ContSancar(long suma){
C. t*is.suma@suma#
L. $
7. public void trans1er(ContSancar c){
A-. t*is.suma?@c.suma#
AA. c.suma@-#
AB. $
A6. $
48
A=. ...
A,. ContSancar c@ne& ContSancar(A--)#
A<. c.trans1er(c)#
Din punct de vedere logic, nu este corect. Ar trebui ca naintea nceperii
transferului de bani s se verifice dac nu cumva este vorba despre acelai cont,
caz n care nu ar trebui s se ntmple nimic. Metoda trans1er ar arta astfel:
A. public void trans1er(ContSancar c){
B. i1 (this == c)
6. return#
=. t*is.suma?@c.suma#
,. c.suma@-#
<. $
C. $
n linia 2, t*is reprezint obiectul curent iar c obiectul primit ca parametru.
-.+.0. 8upranc"rcarea i suprade!inirea metodelor
supra>nc+rcarea ?overloading): n cadrul unei clase pot exista metode cu
acelai nume cu condi[ia ca ele s difere prin lista parametrilor diferen[a
const n numrul parametrilor sau n tipul lor. Astfel la apelul metodei cu
acel nume se poate face distinc[ia ntre ele i se stabilete n mod unic
care dintre ele se execut.
12emplu: n clasa .a%im sunt definite dou metode ma% cu doi respectiv cu trei
parametrii.
A. public class .a%im {
B. public static int ma%(int a+ int b){
6. return a>bFa8b#
=. $
,. public static int ma%(int a+ int b+ int c){
<. int m@a>bFa8b#
C. m@m>cFm8c#
L. return m#
7. $
A-. public static void main(String args[]){
AA. int a@AB+ b@,+c@7-+m#
AB. m@ma%(a+b)#
49
A6. Sstem.out.println(!.a%. dintre !?a?! si !?b?!
este8 !?m)#
A=. m@ma%(a+b+c)#
A,. Sstem.out.println(!.a%. dintre !?a?!+ !?b?! si
!?c?! este8 !?m)#
A<. $
AC. $
.
suprade,inirea ?overriding): o subclas a unei clase poate rescrie o metod
a clasei printe, prin implementarea unei metode cu acelai antet ca al
superclasei.
-.+.1. /odi!icatori de acces pentru membrii unei clase
Sunt cuvinte rezervate ce controleaz accesul celorlalte clase la membrii unei
clase. Modificatoriii de acces pentru variabilele i metodele unei clase sunt: public+
protected+ private i cel implicit. Nivelul lor de acces este dat n tabelul de mai
jos:
Modificat
or
Clas Subclas Pachet Altundev
a
private
x
protected
x x x
public
x x x x
implicit x x
Dup cum se vede n tabelul de mai sus, modificatorii au urmtoarele
semnifica[ii.
private un membru declarat private este accesibil doar n clasa n care
este declarat;
protected un membru declarat protected este accesibil oricrei clase
care apar[ine aceluiai pachet ca i clasa n care este declarat membrul; de
asemenea, este accesibil i oricrei subclase a clasei respective;
public un membru declarat public este accesibil oricrei clase indiferent
de locul unde se afl ea.
Dac modificatorul unui membru lipsete, se consider implicit un modificator
,friendly care d acces oricrei clase din pachetul respectiv.
12emple:
50
private int re+im#
protected String secret#
public 1loat[] elemente#
long %#
private void metoda9nterna()#
public void setTe(int re)#
Observa-ie: n cazul n care declarm un membru "protected" atunci accesul la
acel membru din subclasele clasei n care a fost declarat variabila depinde i de
pachetul n care se gsete subclasa: dac sunt n acelai pachet accesul este
permis, dac nu sunt n acelai pachet accesul nu este permis dect pentru obiecte
de tipul subclasei.
-.+.D. /embrii instan" i membrii clas"
O clas Java poate con[ine dou tipuri de variabile i metode :
instan", declarate !"r" modificatorul static, specifice fiecrei
instan[e
clas", declarate cu modificatorul static, specifice clasei
Dac o variabil este declarat static atunci exist doar o copie a variabilei
asociat cu clasa respectiv i nu mai multe copii ale ei asociate cu fiecare instan[
a clasei.
O variabil clas exist i poate fi folosit chiar dac clasa nu a fost instan[iat
spre diferen[ de variabilele instan[ care exist doar dup ce a fost creat o
instan[ a clasei.
Pentru variabilele statice sistemul aloc o singur zon de memorie la care au
acces toate instan[ele clasei respective, ceea ce nseamn c dac un obiect
modific valoarea unei variabile statice, modificarea va fi vzut de ctre toate
celelalte obiecte. Variabilelor statice nu li se aloc dinamic memorie; memoria pentru
ele este rezervat nainte ca oricare obiect al clasei s fie creat. n cazul variabilelor
instan[, la fiecare creare a unei instan[e a clasei sistemul aloc o zon de memorie
separat pentru memorarea valorii ei.
12emplu: Clasa Hunct con[ine dou variabile instan[ declarate pe linia 2 i o
variabil clas declarat i ini[ializat pe linia 3. Constructorul clasei Hunct
ini[ializeaz variabilele instan[ i incrementeaz variabila clas. Cu alte cuvinte,
51
variabila nrEpuncte va contoriza cte puncte (instan[e ale clasei Hunct) se
creeaz. n clasa QestHunct se creeaz trei obiecte de tipul Hunct i se afieaz
valoarea variabilei clas nrEpuncte. Trebuie remarcat c variabila nrEpuncte
este accesat prin intermediul numelui clasei.
A. class Hunct{
B. int %+ #
6. static int nrEpuncte@-#
=. Hunct(int %%+ int ){
,. %@%%# @#
<. nrpuncte??#
C. $
L. $
7. class QestHunct{
A-. public static void main(String args[]){
AA. Hunct pA@ne&Hunct(A-+ A-)#
AB. Hunct pB@ne&Hunct(B-+ B-)#
A6. Hunct p6@ne&Hunct(6-+ 6-)#
A=. Sstem.out.println(Hunct.nrEpuncte)#
A,. $
A<. $
ntruct metodele clas nu depind de starea obiectelor clasei respective, apelul
lor se poate face prin:
NumeClasa.metodaStatica()#
sau
NumeClasa obiect @ ne& NumeClasa()#
obiect.metodaStatica()#
n cazul metodelor instan[ apelul nu se poate face dect prin intermediul unui
obiect:
NumeClass.metoda9nstanta()+ DDile#al
NumeClasa obiect @ ne& NumeClasa()#
obiect. metodaWe9nstanta()# DDlegal
12emplu: n clasa Cerc sunt definite: o metod instan[ n liniile 6-11 care
returneaz cercul cu raza cea mai mare i o metod clas n liniile 12-18 care
returneaz cercul cu raza cea mai mare dintre cele dou cercuri primite ca
parametru. n liniile 21, 22 sunt create dou cercuri a i b cu raze diferite. n linia 23
este apelat metoda maimare a obiectului a. n linia 24 este apelat metoda
maimare a clasei Cerc.
A. class Cerc{
52
B. double %++r#
6. Cerc(double %+ double + double r) {
=. t*is.%@%# t*is.@# t*is.r@r#
,. $

<. Cerc maimare(Cerc c) {
C. i1(c.r>r)
L. return c#
7. else
A-. return t*is#
AA. $
AB. static Cerc maimare(Cerc a+ Cerc b) {
A6. i1 (a.r>b.r)
A=. return a#
A,. else
A<. return b#
AC. $
AL. $
A7.
B-. ...
BA. Cerc a@ne& Cerc(A-+ A-+ ,-)#
BB. Cerc b@ne& Cerc(B-+ B-+ A--)#
B6. Cerc c @ a.maimare(b)#
B=. Cerc d @ Cerc.maimare(a+b)#
Metodele clas nu pot accesa cmpuri sau metode instan[.
Metodele instan[ pot accesa att membrii clas ct i instan[.
Membrii clas (statici) sunt folosi[i pentru a pune la dispozi[ie valori i metode
independente de starea obiectelor dintr-o anumit clas.
Spre deosebire de C++, n Java nu putem avea func[ii globale definite ca
atare, ntruct "orice este un obiect". Din acest motiv i metodele care au o
func[ionalitate global trebuie implementate n cadrul unei clase. Acest lucru se va
face prin intermediul metodelor clas (globale), deoarece acestea nu depind de
starea particular a obiectelor din clasa respectiv. De exemplu, s considerm
func[ia global sYrt care extrage radicalul dintr-un numr i care se gsete n clasa
.at*. Dac nu ar fi fost func[ie clas, apelul ei ar fi trebuit fcut astfel:
.at* m @ ne& .at*()#
double radABA @ m.sYrt(ABA)#
ceea ce ar fi fost extrem de neplcut pentru programatori. Fiind ns func[ie
static ea poate fi apelat prin: .at*.sYrt(ABA).
53
-.+.E. 4rgumente n linia de comand"
n sfrit suntem n msur s descifrm antetul metodei main.
public static void main(String args[])
Metoda main primete un ir de String-uri ca parametru. Prin intermediul lui
o aplica[ie Java poate primi oricte argumente din linia de comand n momentul
lansrii ei. Aceste argumente sunt utile pentru a permite utilizatorului s specifice
diverse op[iuni legate de func[ionarea aplica[iei sau s furnizeze anumite date ini[iale
programului.
Argumentele din linia de comand sunt introduse la lansarea unei aplica[ii,
fiind specificate dup numele aplica[iei i sunt separate prin spa[iu.
Formatul general pentru lansarea unei aplica[ii care primete argumente din
linia de comand este:
/a%a &ume0plicatie [ar#! ar#" $ $ $ ar#n]
Evident, o aplica[ie poate s nu primeasc nici un argument sau poate s
ignore argumentele primite din linia de comand.
n momentul lansrii unei aplica[ii interpretorul parcurge linia de comand cu
care a fost lansat aplica[ia i, n cazul n care exist argumente, i transmite
aplica[iei sub forma irului de String-uri.
Numrul argumentelor primite de un program este dat de dimensiunea
vectorului args args.lengt*:
numar(rgumente @ args.len#th #
12emplu: Afiarea argumentelor primite din linia de comand
public class (rg;inCom {
public static void main (String[] args) {
1or (int i @ -# i G args.lengt*# i??)
Sstem.out.println(args[i])#
$
$
Un apel de genul:
java (rg;inCom Nu mai vine primavara odata
va produce urmtorul rezultat:
Nu
mai
vine
primavara
odata
54
Dac o anumit parte din irul de intrare este cuprins ntre ghilimelele se
interpreteaz ca un singur argument, spa[iile fiind ignorate.
Una apel de genul:
java (rg;inCom !Nu mai vine! primavara odata
va produce urmtorul rezultat:
Nu mai vine
primavara
odata
Dac se dorete ca din linia de comand s fie transmise argumente
numerice, acestea sunt primite de metoda main sub forma unui vector de String-
uri. Ulterior ele trebuie convertite din String-uri n numere. Acest lucru se
realizeaz cu metode de tipul parse111 aflate n clasa XXX corespunztoare tipului
n care vrem s facem conversia: 9nteger+ Ploat+ Wouble+ etc.
12emplu:
A. public class .a%im {
B. public static int ma%(int a+ int b){
6. return a>bFa8b#
=. $
,. public static int ma%(int a+ int b+ int c){
<. int m@a>bFa8b#
C. m@m>cFm8c#
L. return m#
7. $
A-. public static void main(String args[]){
AA. i1 (args.lengt*"@6){
AB. Sstem.out.println(!Nu ati introdus trei
numere!)#
A6. return#
A=. $
A,. int a@9nteger.parse9nt(args[-])+
A<. b@9nteger.parse9nt(args[A])+
AC. c@9nteger.parse9nt(args[B])+
AL. m#
A7. m@ma%(a+b)#
B-. Sstem.out.println(!.a%imul dintre !?a?! si !?b?!
este8 !?m)#
BA. m@ma%(a+b+c)#
BB. Sstem.out.println(!.a%imul dintre !?a?!+ !?b?! si
!?c?! este8 !?m)#
B6. $
B=. $
55
n linia 11 se verific dac au fost transmii at[ia parametrii c[i sunt necesari.
n liniile 15-17 se convertesc argumentele n ntregi.
-.-. /otenirea
-.-.1. 2rincipiul motenirii
Dup ncapsularea datelor, este al doilea principiu de baz al programrii
orientate pe obiecte. Motenirea este folositoare deoarece reduce rescrierea codului.
Adic, o clas poate fi motenit de ctre o alt clas (toate caracteristicile primei
clase se regsesc i n a doua clas). Noua clas i poate modifica o parte din
comportament, poate aduga ceva nou sau poate ignora ceea ce este neinteresant.
Aceast idee provine din lumea nconjurtoare. De exemplu, primul model de
main a fost mult timp gndit i dificil de construit. Evident c nu a atins
perfec[iunea i, omul a dorit repede ceva mai performant i mai frumos. Prin urmare,
s-a trecut la crearea celui de-al doilea model. Ar fi o naivitate s credem c lucrul la
acest al doilea model a fost luat de la zero. De fapt, s-a pornit de la primul model i
s-a ncercat o mbunt[ire a lui n diferite direc[ii s-a redus ceea ce nu era bun, s-
au adugat elemente noi i au fost fcute modificri. Astfel s-a nscut i al doilea
model. Pornind de la el, n acelai stil, s-au creat noi modele. Si mainile elegante pe
care le vedem azi rulnd cu vitez pe osele se trag tot din acea prim main. Baza
este aceeai, ,pu[in mbunt[it.
n Java pentru a crea o clas nou trebuie specificate: clasa motenit i
diferen[ele fa[ de clasa motenit. Clasa motenit se specific n clauza e%tends.
modi1icator NumeClasa e2tends 'lasa)e3a,a
Clasa motenete toate metodele accesibile i variabilele superclasei sale.
56
12emplu: Urmtoare ierarhie de clase:
se exprim n Java astfel:
class ({
...
$
class S e%tends ({
...
$
class C e%tends S{
...
$
class W e%tends S{
...
$
Dac clauza e%tends lipsete, implicit clasa motenete clasa :bject.
Observa-ie: n Java motenirea multipl nu este permis. Adic o clas poate
s moteneasc o singur clas nu mai multe.
Prin urmare, orice clas are o superclas i poate avea una sau mai multe
subclase.
n exemplul nostru avem:
clasa A este subclas a clasei :bject i are o subclas: clasa B.
clasa B este subclas a clasei A i are o subclas: clasa C.
clasele C i D sunt subclase ale clasei B i nu au subclase.
Nu este permis o asemenea motenire (motenire multipl):

4vantajele cre"rii unei ierar#ii de clase
- func[ionalitatea comun a mai multor clase se pune n superclase. Acest
aranjament permite ca func[ionalitatea s fie refolosit n mod repetat
deoarece fiecare subclas primete informa[ia comun din superclas.
57
A
B
C D
A B
C
- schimbarea sau inserarea unei clase n partea de sus a ierarhiei
determin automat schimbri n comportamentul claselor de jos
Ce se ntmpl cnd o clas con[ine o metod care are acelai antet cu
metoda unei superclase? Este executat prima metod ntlnit cutarea fcndu-
se pornind de la baza ierarhiei n sus. Datorit acestui fapt, se pot scrie metode care
s ascund metodele din superclase.
Dac o metod din superclas nu este rescris ea va fi luat ca atare de
subclas. Nu acelai lucru se ntmpl i cu constructorii. Fiecare clas derivat
trebuie s i defineasc proprii constructori. Dac nu se scrie nici un constructor n
subclas, atunci se genereaz constructorul implicit.
12emplu: Se definesc dou clase Tational i Tational9red care motenete
clasa Tational. n linia 15 se construiete un obiect al clasei Tational prin
apelarea constructorului cu doi parametrii. Acest constructor exist deci, totul este n
regul. n linia 16 se dorete construirea unui obiect al clasei Tational9red tot
prin apelarea constructorului cu doi parametrii. Dar, n acest caz este generat o
eroare deoarece clasa Tational9red nu are definit constructorul cu doi parametrii.
A.public class Tational{
B. private long m+n#
6. public Tational(){
=. m@-# n@A#
,. $
<. public Tational(long m+long n){
C. t*is.m@m#
L. t*is.n@n#
7. $
A-. $
AA. public class Tational9red e%tends Tational {
AB. ...
A6. $
A=. ...
A,. Tational r @ ne& Tational(B+,)#
A<. Tational9red rA @ ne& Tational9red(B+,)#

Pentru ca linia 16 s nu mai genereze eroare, clasa Tational9red trenbuie
s arate astfel:
A. public class Tational9red e%tends Tational {
58
B. public Tational9red(){
6. m@-# n@A#
=. $
,. public Tational9red(long m+long n){
<. t*is.m@m#
C. t*is.n@n#
L. $
7. $
n cadrul unei metode a subclasei care supradefinete o metod din
superclas se poate apela metoda supradefinit (a superclasei), folosind super.
12emplu: Relum exemplul precedent. Subclasa Tational9red con[ine ca i
superclasa Tational doi constructori: unul fr parametrii i unul cu doi parametrii.
Constructorii subclasei au aceeai func[ionalitate cu cei ai superclasei. n linia 16 se
apeleaz constructorul fr parametrii ai superclasei Tational. n linia 19 se
apeleaz constructorul cu doi parametrii ai superclasei Tational. Pe lng cei doi
constructori care au aceeai func[ionalitate n ambele clase, a mai fost definit o
metod produs care este suprascris n subclas. Metoda produs din subclas
trebuie s fac ceva n plus fa[ de metoda superclasei. Prin urmare, ,se copiaz
comportamentul metodei din liniile 10-12 i se adaug ceva n plus. ,Copierea se
realizeaz n linia 22, iar adugarea n linia 23. Aceast ,copiere const n apelarea
metodei din superclas.
A. public class Tational{
B. public long m+n#
6. public Tational(){
=. m@-# n@A#
,. $
<. public Tational(long m+long n){
C. t*is.m@m#
L. t*is.n@n#
7. $
A-. public void produs(){
AA. Sstem.out.println(!9nmultesc doua numere
rationale!)#
AB. $
A6. $
A=. public class Tational9red e%tends Tational {
A,. public Tational9red(){
A<. super()#
AC. $
59
AL. public Tational9red(long m+long n){
A7. super(m.n);
B-. $
BA. public Tational9red produs(Tational9red r){
BB. super$produs(r)#
B6. Sstem.out.println(!si ireductibile!)#
B=. $
B,. $
Observa-ii:
Cnd se dorete apelarea constructorului superclasei se folosete doar
super(...).
Cnd se dorete apelarea unei metode a superclasei se folosete
super.Nume.etoda(...).
-.-.2. Inter!ee
nterfe[ele duc conceptul de clas abstract cu un pas nainte prin eliminarea
oricrei implementri a metodelor, punnd n practic unul din conceptele OOP de
separare a modelului unui obiect (interfa[a) de implementarea sa.
O interfa[ Java definete un set de metode dar nu specific nici o
implementare pentru ele. O clas care implementeaz o interfa[ trebuie obligatoriu
s defineasc toate metodele interfe[ei. Prin urmare, o interfa este o colecie de
metode !"r" implementare i declaraii de constante.
Definirea unei interfe[e se face prin intermediul cuvntului cheie interface:
[public] interface Nume9nter1ata
e%tends Super9nter1ataA [+e%tends
Super9nter1ataB...]]
{
DDcorpul inter1etei8constane si metode abstracte
$
O interfa[ poate fi declarat doar public. O clas poate extinde oricte
interfe[e. Acestea se numesc superinter,e-e i sunt separate prin virgul.
Corpul unei interfe[e con[ine:
constante: acestea pot fi sau nu declarate cu modificatorii public+
static i 1inal care sunt implici[i; nici un alt modificator nu poate aprea
n declara[ia unei variabile a unei interfe[e. Constantele dintr-o interfa[
trebuie obligatoriu ini[ializate.
60
12emplu:
A. inter1ace Nume9nter1ata {
B. int % @ A--# DDcorect
6. public static 1inal int @ A--# DDcorect
=. private 3@A--# DDincorect
,. int a# DDincorect
<. $
metode !"r" implementare: acestea pot fi sau nu declarate cu
modificatorul public care este implicit; nici un alt modificator nu poate
aprea n declara[ia unei metode a unei interfe[e.
12emplu:
C. inter1ace Nume9nter1ata {
L. void metodaA()# DDcorect
7. public void metodaB()# DDcorect
A-. private void metoda6()# DDincorect
AA. $
4tenie,
Variabilele i metodele unei interfe[e sunt implicit publice chiar dac nu sunt
declarate cu modificatorul public.
Variabilele unei interfe[e sunt implicit constante chiar dac nu sunt declarate
cu modificatorii static i 1inal.
Implementarea unei inter!ee se face prin intermediul cuvntului cheie
implements:
class NumeClasa implements Nume9nter1ata
sau
class NumeClasa implements 9nter1ataA+ 9nter1ataB...
O clas poate implementa oricte interfe[e. O clas care implementeaz o
interfa[ trebuie obligatoriu s defineasc toate metodele interfe[ei.
12emplu: Se definete o interfa[ FigGeom care este implementat de clasa
Cerc i clasa Wreptung*i. Clasa Hatrat motenete clasa Wreptung*i+ iar
clasa Hataratel motenete clasa Hatrat.
A. inter1ace Pig)eom{
B. void desen()#
6. void arie()#
=. $
,. class Cerc implements Pig)eom{
61
<. int r#
C. Cerc(int r){
L. t*is.r@r#
7. Sstem.out.println(!Constructor cerc !?r)#
A-. $
AA. public void desen(){
AB. Sstem.out.println(!Wesenea3a cercul !?r)#
A6. $
A=. public void arie(){
A,. double s@.at*.H9'r'r#
A<. Sstem.out.println(!Cercul !?r?! are aria !?s)#
AC. $
AL. $
A7. class Wreptung*i implements Pig)eom{
B-. int ;+l#
BA. Wreptung*i(){$
BB. Wreptung*i(int ;+int l){
B6. t*is.;@;#
B=. t*is.l@l#
B,. Sstem.out.println(!Constructor dreptung*i !?;?!
!?l)#
B<. $
BC. public void desen(){
BL. Sstem.out.println(!Wesenea3a dreptung*iul !?;?!
!?l)#
B7. $
6-. public void arie(){
6A. double s@;'l#
6B. Sstem.out.println(!Wreptung*iul !?;?! !?l?! are
aria !?s)#
66. $
6=. $
6,. public class QestPig)eom{
6<. public static void main(String args[]){
6C. Pig)eom c@ne& Cerc(A-)+
6L. d@ne& Wreptung*i(B-+B,)+
67. c.desen()#
=-. c.arie()#
=A. d.desen()#
=B. d.arie()#
=6. $
==. $
Rezultatul execu[iei este:
Constructor cerc 10
Constructor dreptunghi 20 25
Deseneaza cercul 10
Cercul 10 are aria 314.1592653589793
Deseneaza dreptunghiul 20 25
62
Dreptunghiul 20 25 are aria 500.0
:i!erena dintre o inter!a" i o clas" abstract"
La prima vedere o interfa[ nu este altceva dect o clas abstract n care
toate metodele sunt abstracte (nu au nici o implementare). Deosebirea dintre ele
const n faptul c unele clase sunt for[ate s extind o anumit clas (de exemplu
orice applet trebuie s fie subclas a clasei Applet) i nu ar mai putea s extind o
clas abstract deoarece n Java nu exist dect motenire simpl. Fr folosirea
interfe[elor nu am putea for[a clasa respectiva s respecte un anumit protocol.
La nivel conceptual diferen[a const n:
extinderea unei clase abstracte for[eaz o rela[ie ntre clase;
implementarea unei interfe[e specific doar necesitatea implementrii
unor anumite metode.
-... 2robleme
12emplu ': Exemplificarea motenirii.
class .asina {
private String s @ ne& String(!.asina!)#
public void append(String a){
s ?@ a#
$

public void porneste(){
append(! porneste()!)#
$

public void merge(){
append(! merge()!)#
$
public void opreste(){
append(! opreste()!)#
$
public void print(){
Sstem.out.println(s)#
$
$
class S.Z e%tends .asina {
DDsc*imbarea unei metode
public void opreste() {
63
append(! S.Z opreste sigur()!)#
super.opreste()# DD apelul metodei clasei de ba3a
$
DD adaugarea unei metode noi
public void 1ranea3aSine(){
append(! 1ranea3aSine()!)#
$
$

DD testarea noii clase
public class Qest.asina{
public static void main(String[] args) {
S.Z bm& @ ne& S.Z()#
D' Sstem.out.println(bm&.s)# DDJroare s nu apartine lui
bm& 'D
bm&.porneste()#
bm&.merge()#
bm&.1ranea3aSine()#
bm&.opreste()#
bm&.print()#
$
$
Rezultatul execu[iei este:
Masina porneste() merge() franeazaBine() BMW opreste sigur()
opreste()
12emplu ": Exemplificarea motenirii i a polimorfismului.
abstract class Pig)eom{
abstract void desen()#
abstract void arie()#
$
class Cerc e%tends Pig)eom{
int r#
Cerc(int r){
t*is.r@r#
Sstem.out.println(!Constructor cerc !?r)#
$
void desen(){
Sstem.out.println(!Wesenea3a cercul !?r)#
$
void arie(){
double s@.at*.H9'r'r#
Sstem.out.println(!Cercul !?r?! are aria !?s)#
$
$
class Wreptung*i e%tends Pig)eom{
64
int ;+l#
Wreptung*i(){$
Wreptung*i(int ;+int l){
t*is.;@;#
t*is.l@l#
Sstem.out.println(!Constructor dreptung*i !?;?!
!?l)#
$
void desen(){
Sstem.out.println(!Wesenea3a dreptung*iul !?;?!
!?l)#
$
void arie(){
double s@;'l#
Sstem.out.println(!Wreptung*iul !?;?! !?l?! are
aria !?s)#
$
$
class Hatrat e%tends Wreptung*i{
int l#
Hatrat(int l){
DD super(l+l)#
t*is.l@l#
Sstem.out.println(!Constructor patrat !?l)#
$
void desen(int N){
Sstem.out.println(!Wesenea3a patratul !?l?! indice
!?N)#
$
void arie(){
double s@l'l#
Sstem.out.println(!Hatrat !?l?! are aria !?s)#
$
$
class Hatratel e%tends Hatrat{
int l#
Hatratel(int l){
super(l)#
t*is.l@l#
Sstem.out.println(!Constructor patratel !?l)#
$
void desen(int N){
Sstem.out.println(!Wesenea3a patratelul !?l?!
indice !?N)#
$
void arie(){
double s@l'l#
Sstem.out.println(!Hatratelul !?l?! are aria !?s)#
$
$
65
public class QestPig)eom{
public static void main(String args[]){
Pig)eom c@ne& Cerc(A-)+
d@ne& Wreptung*i(B-+B,)+
p@ne& Hatrat(6-)+
pm@ne& Hatratel(=-)#
c.desen()#
c.arie()#
d.desen()#
d.arie()#
DD p.desen(A--)# da eroare p 1iind o 1igura
geometrica
p.desen()# DDse apelea3a desen din dreptung*i
p.arie()#
pm.desen()# DDse apelea3a desen din dreptung*i
pm.arie()#
Hatrat pA@ne& Hatrat(6--)#
pA.desen(A--)# DDeste oN
pA.arie()#
$
$
Rezultatul afiat este:
Constructor cerc 10
Constructor dreptunghi 20 25
Constructor patrat 30
Constructor patrat 40
Constructor patratel 40
Deseneaza cercul 10
Cercul 10 are aria 314.1592653589793
Deseneaza dreptunghiul 20 25
Dreptunghiul 20 25 are aria 500.0
Deseneaza dreptunghiul 0 0
Patrat 30 are aria 900.0
Deseneaza dreptunghiul 0 0
Patratelul 40 are aria 1600.0
Constructor patrat 300
Deseneaza patratul 300 indice 100
Patrat 300 are aria 90000.0
66
12emplu 4: lustreaz ordinea ini[ializrilor
class Ploare {
Ploare(int nr) {
Sstem.out.println(!Ploare(! ? nr ? !)!)#
$
void actiune(String 1el) {
Sstem.out.println(!actiune(! ? 1el ? !)!)#
$
$
class Ua3a {
static Ploare 1A @ ne& Ploare(A)# DDvar SQ(Q9C(
Ua3a() {
Sstem.out.println(!Ua3a()!)#
1B.actiune(!Ploare in va3a!)#
$
void po3itie(String loc) {
Sstem.out.println(!po3itie(! ? loc ? !)!)#
$
static Ploare 1B @ ne& Ploare(B)# DDvar SQ(Q9C(
$
class )radina {
Ploare 16 @ ne& Ploare(6)#
static Ploare 1= @ ne& Ploare(=)# DDvar SQ(Q9C(
)radina() {
Sstem.out.println(!)radina()!)#
1=.actiune(!Ploare doarme!)#
$
void aspect(String tip) {
Sstem.out.println(!aspect(! ? tip ? !)!)#
$
static Ploare 1, @ ne& Ploare(,)# DDvar SQ(Q9C(
$
public class Static9nit {
public static void main(String[] args) {
Sstem.out.println(
!Crea3a o )radina() noua in main!)#
ne& )radina()#
Sstem.out.println(
!Crea3a o )radina() noua in main!)#
ne& )radina()#
vB.po3itie(!pe masa!)#
g6.aspect(!1rumos!)#
$
static Ua3a vB @ ne& Ua3a()# DDvar SQ(Q9C(
static )radina g6 @ ne& )radina()# DDvar SQ(Q9C(
$
Rezultatul execu[iei este:
67
Floare(1)
Floare(2)
Vaza()
actiune(Floare in vaza)
Floare(4)
Floare(5)
Floare(3)
Gradina()
actiune(Floare doarme)
Creaza o Gradina() noua in main
Floare(3)
Gradina()
actiune(Floare doarme)
Creaza o Gradina() noua in main
Floare(3)
Gradina()
actiune(Floare doarme)
pozitie(pe masa)
aspect(frumos)
12emplu 5: Exemplificarea motenirii. Clasa Tational implementeaz lucrul cu
numere ra[ionale. Clasa Tational9red motenete clasa Tational i
implementeaz lucrul cu numere ra[ionale ireductibile.
public class Tational{
private long m+n#
public Tational(){
t*is(A+-)#
$
public Tational(long m+long n){
setm(m)#
setn(n)#
$
public Tational(long m){
t*is(m+A)#
$
public void setm(long m){
68
t*is.m@m#
$
public long getm(){
return m#
$
public void setn(long n){
t*is.n@n#
$
public long getn(){
return n#
$
public Tational produs(Tational r){
return ne& Tational(m'r.m+n'r.n)#
$
public String toString(){
return m?!D!?n#
$
$

public class Tational9red e%tends Tational {
public Tational9red(){
super()#
$
public Tational9red(long m+long n){
super(m+n)#
$
public Tational9red(long m){
super(m)#
$
private void simpli1ica(){
long %@getm()+ @getn()#
&*ile(%"@){
i1(%>) %-@#
else -@%#
$
setm(getm()D%)#
setn(getn()D%)#
$
public Tational9red produs(Tational9red r){
Tational9red p@ne& Tational9red()#
69
p.setm(getm()'r.getm())#
p.setn(getn()'r.getn())#
p.simpli1ica()#
return p#
$
$

public class QestTational{
public static void main(String[] args) {
Tational9red rA+rB+p#
rA@ne& Tational9red(9nteger.parse9nt(args[-])+
9nteger.parse9nt(args[A]))#
rB@ne& Tational9red(9nteger.parse9nt(args[B])+
9nteger.parse9nt(args[6]))#
Sstem.out.println(rA)#
Sstem.out.println(rB)#
p@rA.produs(rB)#
Sstem.out.println(p)#
$
$
70
.. 2ac#ete
Un pac@et este o colec[ie de clase i interfe[e nrudite. Sunt folosite pentru
gsirea i utilizarea mai uoar a claselor, pentru a evita conflictele de nume i
pentru a controla accesul la anumite clase.
n Java toate clasele i interfe[ele sunt grupate n diferite pachete dup
func[ionalitatea lor. Cu ajutorul lor se pot construi aplica[iile. Cele mai importante
pachete pe care le pune Java la dispozi[ie sunt:
pachetul /a%a$lan# cuprinde clasele de baz ale limbajului;
pachetul /a%a$io cuprinde clasele pentru intrri/ieiri, lucru cu fiiere;
pachetul /a%a$math cuprinde clasele n care sunt definite opera[iile
matematice;
pachetul /a%a$util cuprinde clasele utile : Vector, Stack, Random,
Date etc;
pachetul /a%a$te2t ofer suport pentru formatarea textelor;
pachetul /a%a$s4l ofer suport pentru interogri SQL;
pachetul /a%a$beans cuprinde clasele necesare scrierii de
componente reutilizabile;
pachetul /a%a$net cuprinde clasele care asigur accesul la re[ea;
pachetul /a%a$awt cuprinde clasele pentru grafic (Abstract
Windowing Toolkit);
pachetul /a%a2$swin# cuprinde clasele pentru grafic; extinde
func[ionalitatea claselor din pachetul /a%a$awt$
pachetul /a%a$rmi cuprinde clasele care asigur execu[ie la distan[
(Remote Message nterface);
pachetul /a%a$securit, cuprinde clasele care asigur mecanisme de
securitate: criptare, autentificare;
Pentru a folosi o component a unui pachet trebuie fcut cunoscut clasei
curente fie pachetul n care se gsete componenta, fie doar componenta. Acest
lucru se realizeaz prin importarea pachetului sau, doar a clasei.
71
..1. Importul unui pac#et, al unei clase sau a unei inter!ee
mportul se realizeaz prin instruc[iunea import.
Importul pac#etelor se face prin specificarea numelui pachetului urmat de
simbolul FGF. FGF are semnifica[ia c toate clasele i interfe[ele pachetului sunt
importate.
import &ume5achet$6;
12emple:
import java.io.'#
import java%.s&ing.'#
O dat realizat ntr-un fiier importul pachetului, orice clas din pachet poate fi
accesat prin numele ei.
12emplu: Clasa Wate apar[ine pachetului java.util.
import java.util.'#
public class J%Wata{
public static void main(String[] args) {
Wate d@ne& Wate(B--6+=+A6)#
Sstem.out.println(d)#
$
$
4tenie, n cazul n care sunt importate dou pachete care con[in o clas cu
acelai nume atunci referirea la ea trebuie fcut folosind numele complet al clasei
respective (nume pachet urmat de nume clas).
mplicit, mediul Java import trei pachete:
pachetul java.lang
pachetul curent
pachetul implicit (fr nume)
Importul claselor >inter!eelor? se realizeaz prin specificarea numelui clasei
(interfe[ei) pe care dorim s o folosim dintr-un pachet:
import &ume5achet$&ume'lasa;
12emple:
import java.util.Wate#
O dat realizat ntr-un fiier importul clasei (interfe[ei), aceasta poate fi
accesat prin numele ei.
72
12emplu:
import java.util.Wate#
public class J%Wata{
public static void main(String[] args) {
Wate d@ne& Wate(B--6+=+A6)#
Sstem.out.println(d)#
$
}
n cazul n care nu avem nevoie dect de cteva clase dintr-un pachet este
mai eficient s importm clasele dect ntregul pachet.
..2. Crearea unui pac#et
Se creeaz un director cu numele NumeHac*et n care vor fi salvate toate
fiierele surs ce con[in clasele i interfe[ele pe care dorim s le grupm ntr-un
pachet. Numele directorului d numele pachetului.
n prima linie a fiecrui fiier din directorul NumeHac*et se specific faptul c
toate clasele din fiierul respectiv vor apar[ine clasei. Aceasta se realizeaz prin:
packa#e &ume5achet;
Prin urmare codul unei clase care se adaug la un pachet arat astfel:
pacNage NumeHac*et#
public class NumeClasa{
. . .
}
nstruc[iunea pacNage ac[ioneaz asupra ntregului fiier surs la nceputul
cruia apare. Cu alte cuvinte nu putem specifica faptul c anumite clase dintr-un
fiier surs apar[in unui pachet iar altele altui pachet.
Dac nu este specificat un anumit pachet, clasele unui fiier surs vor face
parte din pachetul implicit (care nu are nici un nume). n general, pachetul implicit
este format din toate clasele i interfe[ele directorului curent.
Pentru compilare trebuie s ne plasm n directorul printe al directorului
NumeHac*et.
Se execut comanda:
javac NumeHac*et5'.java
n cazul n care nu sunt erori n pachet, n directorul NumeHac*et trebuie s
se creeze fiierele .class.
73
Clasele care folosesc pachetul creat se aeaz n afara directorului. Pentru ca
ele s aib acces la pachet trebuie setat variabila sistem CLASSPATH:
SJQ C;(SSH(Q> @ CaleWirectorNumeHac*et
12emplu ': n directorul c85lucru se formeaz un director Hac*ete n care se
salveaz urmtoarele fiiere:
Fiierul (A.java con[ine clasa:
pacNage Hac*ete#
public class (A{
int a@-#
public int b@-#
private int c@-#
protected int d@-#
void a(){
Sstem.out.println(a)#
$
public void b(){
Sstem.out.println(!public !? b)#
$
protected void d(){
Sstem.out.println(!protected !?d)#
$
$
Fiierul (B.java con[ine clasa:
pacNage Hac*ete#
public class (B implements (6{
public void a6(){
(A aA@ne& (A()#
aA.a@A#
aA.b@A#
aA.d@A#
Sstem.out.println(aA.a?! !?aA.b?! !?aA.d)#
aA.a()#
aA.b()#
aA.d()#
$
$
Fiierul (6.java con[ine clasa:
pacNage Hac*ete#
public inter1ace (6{
public void a6()#
$
Setm variabila CLASSPATH:
74
SJQ C;(SSH(Q> @ c85lucru
Pentru compilare ne pozi[ionm n directorul c85lucru i executm
comanda:
javac Hac*ete5'.java
Construim o clas de test (=.java pe care o salvm n c85lucru:
import Hac*ete.'#
public class (={
public static void main(String args[]){
(B a@ne& (B()#
a.a6()#
(A aA@ne& (A()#
DDaA.a()# eroare [ metoda a() este ca /i protected
aA.b()#
DDaA.d()# eroare [ metoda d() este protected
$
$
Se compileaz i se execut ca orice clas Java .
Exemplu 2: Construim un pachet Tablou care con[ine o clas .atrice i una
Uector.
pacNage Qablou#
public class Uector{
private double a[]#

public Uector(){
a@ne& double[A]#
$
public Uector(int n+ double a[]){
t*is.a@ne& double[n]#
1or(int i@-# iGn# i??)
t*is.a[i]@a[i]#
$

public int get;ungime(){
return a.lengt*#
$

public double getJlem(int po3){
return a[po3]#
$

public double[] getUector(){
return a#
$
75
public void setJlem(int po3+ double val){
a[po3]@val#
$

public void setUector(double a[]){
t*is.a@ne& double[a.lengt*]#
1or(int i@-# iGa.lengt*# i??)
t*is.a[i]@a[i]#
$

public String toString(){
String s@!!#
1or(int i@-# iGa.lengt*# i??)
s@s?a[i]?! !#
return s#
$
$
pacNage Qablou#
public class .atrice{
private double a[][]#

public .atrice(){
a@ne& double[A][]#
$
public .atrice(int n+ int m+ double a[][]){
t*is.a@ne& double[n][m]#
1or(int i@-# iGn# i??)
1or(int j@-# jGm# j??)
t*is.a[i][j]@a[i][j]#
$


public int getNr;in(){
return a.lengt*#
$
public int getNrCol(int l){
return a[l].lengt*#
$

public double getJlem(int l+ int c){
return a[l][c]#
$

public double[][] get.atrice(){
return a#
$

public String toString(){
76
String s@!!#
1or(int i@-# iGa.lengt*# i??){
1or(int j@-# jGa[i].lengt*# j??)
s?@a[i][j]?! !#
s?@!5n!#
$
return s#
$
$
O clas care folosete pachetul Tablou ar fi:
A. import Qablou.'#
B. public class QestQablou{
6. public static void main(String args[]){
=. double %[][]@{{B+=$+{,+<$+{A+6$$#
,. .atrice m@ne& .atrice(6+B+%)#
<. Sstem.out.println(m)#
C. double []@{B+=+,+<$#
L. Uector v@ne& Uector(=+)#
7. Sstem.out.println(v)#
A-. java.util.Uector vv@ne& java.util.Uector(,)#
AA. 1or (int i@-#iG,#i??)
AB. vv.add(ne& 9nteger(i))#
A6. Sstem.out.println(vv)#
A=. $
A,. $
Se observ c n linia 10 se creeaz un obiect folosind de data aceasta clasa
Vector din pachetul java.util. Pentru a face diferen[ ntre clasa pachetului
nostru i clasa pachetului java.util trebuie s specificm i numele pachetului.
77
0. 7(cepii
0.1. 4specte generale
O e2cep-ie este un eveniment ce se produce n timpul execu[iei unui program
i care provoac ntreruperea cursului normal al execu[iei.
De exemplu, o mpr[ire la 0 sau utilizarea unui indice care depete o
dimensiune declarat a unui tablou reprezint un eveniment care perturb execu[ia
normal a programului este vorba despre o excep[ie. Cnd apare o astfel de
eroare n timpul execu[iei programului sistemul genereaz automat un obiect de tip
excep[ie ce con[ine:
informa[ii despre excep[ia respectiv;
starea programului n momentul producerii excep[iei
12emplu:
public class J%ceptii {
public static void main(String args[]) {
int v[] @ ne& int[A-]#
v[A-] @ -# DDe(ceptie, vectorul are elementele vHIJ...vHEJ
Sstem.out.println(!(ici nu se mai ajunge...!)#
$
$
La rularea programului va fi generat o excep[ie i se va afia mesajul :
J%ception in t*read !main!
java.lang.(rra9nde%:ut:1SoundsJ%ception 86
at J%ceptii.main (J%ceptii.java8=)
Java dispune de un mecanism care permite programatorului s preia controlul
programului n momentul n care apare o excep[ie i s o trateze.
Crearea unui obiect de tip excep[ie se numete aruncarea unei e2cep-ii
("throwing an exception"). n momentul n care o metod genereaz o excep[ie
(arunc o excep[ie) sistemul de execu[ie este responsabil cu gsirea unei secven[e
de cod dintr-o metod care s trateze acea excep[ie. Excep[iile sunt propagate
napoi prin secven[a de metode apelate pn cnd o anumit metod prinde
excep[ia. Secven[a de cod dintr-o metod care trateaz o anumit excep[ie se
numete analizor de e2ceptie ("exception handler") iar interceptarea i tratarea
78
excep[iei se numete prinderea e2cep-iei ("catch the exception").
Cu alte cuvinte la apari[ia unei erori este "aruncat" o excep[ie iar cineva trebuie s
o "prind" pentru a o trata. Dac sistemul nu gsete nici un analizor pentru o
anumita excep[ie atunci programul Java se oprete cu un mesaj de eroare.
erarhia claselor ce con[in excep[ii este:
Toate excep[iile Java sunt subclase ale clasei J%ception.
0.2. Instruciunea tr%
tr{
instruc[iuni ce pot declana excep[ii
$
[catc*(ClasaExceptie obiectExceptie){
instruc[iuni de tratare a excep[iei de clas ClasaExceptie
}]*
[1inall{
instruc[iuni care se execut necondi[ionat n final
}]
nstruc[iunea tr con[ine un bloc de instruc[iuni ce trebuie executate. Punerea
unor instruc[iuni n cadrul lui tr nseamn c exist posibilitatea apari[iei unor
excep[ii sau terminrii anormale a unei instruc[iuni. O instruc[iune tr poate avea
oricte clauze catc* (op[ionale) n care sunt tratate excep[iile. De asemenea,
instruc[iunea tr poate avea o clauz 1inall a crui bloc se execut ntotdeauna
79
naintea prsirii instruc[iunii tr. nstruc[iunea tr trebuie s aib fie o clauz
catc*+ fie una 1innal.
Formele generale ale instruc[iunii tr.
1.
tr{
...
$
catc*(ClasaExceptie obiectExceptie){
...
}
B.
tr{
...
$
catc*(ClasaExceptie obiectExceptie){... }
...
catc*(ClasaExceptie obiectExceptie){... }
6.
tr{
...
$
1innal{... }
=.
tr{
...
$
catc*(ClasaExceptie obiectExceptie){... }
...
catc*(ClasaExceptie obiectExceptie){... }
1innal{... }
n cazul n care este declanat o excep[ie i exist mai multe clauze catc*+
este cutat, n ordine, acea clauz care poate trata excep[ia. Adic este gsit o
clauz a crui parametru are un tip care se potrivete cu tipul excep[iei. Ordinea n
care clauzele catc* apar este important: clauzele catc* mai specifice trebuie s
apar naintea celor mai generale. Dac nu exist o clauz care s trateze excep[ia,
aceasta este propagat n sus, la instruc[iunile imediat urmtoare.
80
Excep[ii uzuale:
(rit*meticJ%ception
Depire limit tip sau mpr[ire la 0
NumberPormatJ%ception
Conversia nepermis a unui
String la un tip numeric
9nde%:ut:1SoundsJ%ception
ndice ilegal ntr-un ir
Negative(rraSi3eJ%ception
Crearea unui ir cu numr negativ
de elemente
NullHointerJ%ception
Tentativ de a folosi o referin[ care
are valoarea null
SecuritJ%ception
nclcarea normelor de securitate n
timpul execu[iei
0.+. Crearea unei e(cepii
Adeseori poate aprea necesitatea crerii unor excep[ii proprii pentru a pune
n eviden[ cazuri speciale de erori provocate de clasele unei librrii, cazuri care nu
au fost prevzute n ierarhia excep[iilor standard Java.
O excep[ie proprie trebuie s se ncadreze n ierarhia excep[iilor Java, cu alte
cuvinte clasa care o implementeaz trebuie s fie subclas a clasei J%ception.
public class E2ceptie&oua e2tends E2ception7 ... $
12emplu:
A. public class J%c e%tends J%ception{
B. public J%c(){
6. super()# DDapelea3a constructorul clasei J%ception
=. ...
,. $
<. $
ntr-o clas n care se dorete folosirea unei excep[ii exist o metod care creeaz
excep[ia (obiect al clasei de excep[ii), mai multe metode care arunc excep[ia
primit i, eventual o metod care o prinde, adic o trateaz. Dac ntr-o metod
apare o excep[ie creat n metoda respectiv sau ca urmare a apelrii unei
metode care a aruncat o excep[ie, atunci ea trebuie fie s fie tratat, fie s fie
aruncat mai departe. n ambele cazuri codul care ar putea genera excep[ia trebuie
pus n cadrul unei instruc[iuni tr care s aib o clauz catc* cu parametru care
s coincid cu clasa excep[iei. Dac excep[ia se dorete s fie tratat, atunci n
81
clauza catc* se pune un cod corespunztor. Dac se dorete ca excep[ia s nu fie
tratat atunci ea trebuie aruncat mai departe (metodei care a fcut apelul) i acest
lucru se realizeaz prin adugarea clauzei t*ro&s ClasaJ%ceptie n antetul
metodei.
12emplu ': n clasa Rationalred se verific dac numitorul frac[iei este 0. Dac da
atunci se creeaz o excep[ie linia 53.
A. public class J%c e%tends J%ception{
B. public J%c(){
6. super()#
=. Sstem.out.println(!Numitor -!)#
,. $
<. $
C. public class Tational{
L. private long m+n#
7. public Tational(){
A-. t*is(A+-)#
AA. $
AB. public Tational(long m+long n){
A6. setm(m)#
A=. setn(n)#
A,. $
A<. public Tational(long m){
AC. t*is(m+A)#
AL. $
A7. public void setm(long m){
B-. t*is.m@m#
BA. $
BB. public long getm(){
B6. return m#
B=. $
B,. public void setn(long n){
B<. t*is.n@n#
BC. $
BL. public long getn(){
B7. return n#
6-. $
6A. public Tational produs(Tational r){
6B. return ne& Tational(m'r.m+n'r.n)#
66. $
6=. public String toString(){
6,. return m?!D!?n#
6<. $
6C. $
6L. public class Tational9red e%tends Tational {
82
67. public Tational9red(){
=-. super()#
=A. $
=B. public Tational9red(long m+long n) t*ro&s J%c{
=6. setm(m)#
==. tr{
=,. set9n(n)#
=<. $
=C. catc*(J%c e){t*ro& e#$
=L. $
=7. public void set9n(long n) t*ro&s J%c{
,-. i1 (n"@-)
,A. super.setn(n)#
,B. else
,6. t*ro& ne& J%c()#
,=. $
,,. private void simpli1ica(){
,<. long %@getm()+ @getn()#
,C. &*ile(%"@){
,L. i1(%>) %-@#
,7. else -@%#
<-. $
<A. setm(getm()D%)#
<B. setn(getn()D%)#
<6. $
<=. public Tational9red produs(Tational9red r){
<,. Tational9red p@ne& Tational9red()#
<<. p.setm(getm()'r.getm())#
<C. p.setn(getn()'r.getn())#
<L. p.simpli1ica()#
<7. return p#
C-. $
CA. $
CB. public class QestTational{
C6. public static void main(String[] args) {
C=. Tational9red rA+rB+p#
C,. tr{
C<. rA@ne& Tational9red(
CC. 9nteger.parse9nt(args[-])+
CL. 9nteger.parse9nt(args[A]))#
C7. rB@ne& Tational9red(
L-. 9nteger.parse9nt(args[B])+
LA. 9nteger.parse9nt(args[6]))#
LB. $
L6. catc*(J%c e){
L=. Sstem.e%it(A)#
L,. $
L<. Sstem.out.println(rA)#
LC. Sstem.out.println(rB)#
LL. p@rA.produs(rB)#
L7. Sstem.out.println(p)#
83
7-. $
7A. $
84
1. Intr"ri i ieiri

nforma[ia poate fi preluat de oriunde (fiier, disk, re[ea, memorie, alt
program) i poate fi de orice tip (obiecte, caractere, imagini, sunete).
Pentru a aduce informa[ii, un program Java deschide un flux (canal de
comunica[ii) la o surs de informa[ii i citete informa[ia. Un flux care citete date se
numete ,lu2 de intrare.
Similar, un program poate trimite informa[ii ctre o destina[ie extern
deschiznd un flux (canal de comunica[ii) ctre acea destina[ie i scriind serial
informa[iile respective. Un flux care scrie date se numete ,lu2 de ieire.
Algoritmul de citire este:
desc*ide 1lu%
c2t timp e%ist0 in1orma4ie
cite/te in1orma4ia
85
Mnc*ide 1lu%
Algoritmul de afiare este:
desc*ide 1lu%
c2t timp e%ist0 in1orma4ie
scrie in1orma4ia
Mnc*ide 1lu%
Pachetul java.io con[ine o colec[ie de clase folosite pentru citiri i afiri.
Prin urmare, orice program care necesit opera[ii de intrare / ieire trebuie s
importe pachetul java.io:
import /a%a$io$6.
1.1. Clasi!icarea !lu(urilor
Exist trei tipuri de clasificare a fluxurilor:
Dup "direc[ia" canalului de comunica[ie deschis, fluxurile se mpart n:
o fluxuri de intrare (pentru citirea datelor)
o fluxuri de ieire (pentru scrierea datelor)
Dup tipul de date pe care opereaz:
o fluxuri de octe[i (comunicarea serial se realizeaz pe 8 bi[i)
o fluxuri de caractere (comunicarea serial se realizeaz pe 16
bi[i)
Dup ac[iunea lor:
o fluxuri pentru citirea / scrierea datelor
o fluxuri pentru procesarea datelor
1.2. Ierar#ia claselor pentru lucrul cu !lu(uri
1.2.1. 6lu(uri de caractere
Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de caractere
sunt Teader (pentru fluxuri de intrare) i Zriter (pentru fluxuri de ieire).
86
erarhia claselor pentru fluxuri de intrare pe caractere este:
erarhia claselor pentru fluxuri de ieire pe caractere este:
1.2.2. 6lu(uri de octei
Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de octe[i sunt
9nputStream (pentru fluxuri de intrare) i :utputStream (pentru fluxuri de ieire).
Subclasele lor sunt folosite pentru citiri i scrieri de date binare cum ar fi imagini i
sunete.
erarhia claselor pentru fluxuri de intrare pe octe[i:
87
erarhia claselor pentru fluxuri de ieire pe octe[i:
1.+. 8uperclasele de intrare ' ieire
Clasele Reader i nputStream definesc metode similare pentru citirea
datelor, tipul parametrilor variind.
Clasa Teader
int read()
int read(c*ar cbu1[ ])
int read(c*ar cbu1[ ]+ int inde%+ int lungime)
Clasa 9nputStream
int read()
int read(bte cbu1[ ])
int read(bte cbu1[ ]+ int inde%+ int lungime)
88
Analog, clasele Writer i OutputStream definesc metode similare pentru
afiarea datelor, tipul parametrilor variind.
Clasa Zriter
int &rite()
int &rite(c*ar cbu1[ ])
int &rite(c*ar cbu1[ ]+ int inde%+ int lungime)
Clasa :utputStream
int &rite()
int &rite(bte cbu1[ ])
int &rite(bte cbu1[ ]+ int inde%+ int lungime)
1.-. Crearea unui !lu(
Orice flux este un obiect al clasei ce implementeaz fluxul respectiv. Crearea
unui flux se realizeaz similar cu crearea obiectelor, prin instruc[iunea new().
12emple:
DDcrearea unui 1lu% de intrare pe caractere
PileTeader in @ ne& PileTeader(!1isierEintrare.t%t!)#
DDcrearea unui 1lu% de iesire pe caractere
PileZriter out @ ne& PileZriter(!1isierEiesire.t%t!)#
DDcrearea unui 1lu% de intrare pe octeti
Pile9nputStream in @ ne&
Pile9nputStream(!1isierEintrare.t%t!)#
DDcrearea unui 1lu% de iesire pe octeti
Pile:utputStrem out @ ne&
Pile:utputStream(!1isierEiesire.t%t!)#
Prin urmare, crearea unui flux de date care scrie / citete informa[ii de la un
dispozitiv extern are formatul general:
8lu25rimiti% nume8lu2 = new 8lu25rimiti% (dispo,iti% e2tern)
89
1... Citirea datelor de la tastatur"
1...1. 3biectul 9+stem$in
n general, tastatura reprezint perifericul standard pentru introducerea datelor.
Clasa Sstem con[ine o variabil membru care reprezint tastatura sau fluxul de
intrare standard. Aceast variabil membru se numete in i este o instan[ a clasei
9nputStream.
12emplu ': Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un
ir de caractere. Citirea se ncheie cnd se apas tasta Enter.
A. class CitireA {
B. public static void main(String args[]) {
6. StringSu11er s@ne& StringSu11er()#
=. c*ar c#
,. tr {
<. &*ile((c@(c*ar)Sstem.in.read()) "@ \5n\)
C. s.append(c)#
L. $
7. catc*(J%ception e) {
A-. Sstem.out.println(KJrror8K?e.get.essage())#
AA. $
AB. Sstem.out.println(!Sirul este8!?s)#
A6. $
A=. $
12emplu ": Se citesc de la tastatur caractere. Ele sunt memorate ntr-un vector de
bytes (linia 5). Citirea se ncheie cnd se apas tasta Enter. Pe baza vectorului se
formeaz un String (linia 10) care este afiat.
A. class CitireB {
B. public static void main(String args[]) {
6. bte bu1[]@ne& bte[6-]#
=. tr {
,. Sstem.in.read(bu1)#
<. $
C. catc*(J%ception e) {
L. Sstem.out.println(KJrror8K?e.get.essage())#
7. $
A-. String s@ne& String(bu1)#
AA. Sstem.out.println(s)#
AB. $
A6. $
90
1...2. Clasa *nput9tream:eader
Reprezint legtura dintre fluxurile de octe[i i fluxurile de caractere: citete
octe[i i i transform n caractere. Transformarea octe[ilor n caractere este
efectuat conform unei reguli de codificare. Dac nu se specific o astfel de regul,
atunci se utilizeaz codificarea implicit (dat de proprietatea de sistem file
encoding).
Clasa 9nputStreamTeader are urmtorii constructori:
9nputStreamTeader(9nputStream in)
9nputStreamTeader(9nputStream in+ String enc)
Metoda principal pentru citirea unui caracter este:
int read()
12emplu 4: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un
ir de caractere. Citirea se ncheie cnd se apas tasta Enter.
A. import java.io.'#
B. class Citire6 {
6. public static void main(String args[]) {
=. 9nputStreamTeader in@
,. ne& 9nputStreamTeader(Sstem.in)#
<. c*ar c#
C. StringSu11er s@ne& StringSu11er()#
L. tr {
7. &*ile((c@(c*ar)in.read()) "@ \5n\)
A-. s.append(c)#
AA. $
AB. catc*(J%ception e) {
A6. Sstem.out.println(KJrror8K?e.get.essage())#
A=. $
A,. Sstem.out.println(s)#
A<. $
AC. $
1...+. Clasa 3uffered:eader
91
n cazul folosirii clasei 9nputStreamTeader, citirea se face caracter cu
caracter (adic, discul este accesat de fiecare dat). Pentru a crete eficien[a se
folosete un flux care utilizeaz o zon tampon pentru citire (Su11eredTeader).
Clasa Su11eredTeader are definit metoda read() cu aceeai signatur ca i cea
definit n 9nputStreamTeader dar, n plus, definete i metoda read;ine().
Aceast metod poate fi folosit pentru a citi un ir de caractere terminat cu '\n','\r'
sau '\r\n'.
12emplu 5: Se introduce un ir de caractere de la tastatur. La apsarea tastei Enter
irul este citit n ntregime i este depus ntr-un String.
A. import java.io.'#
B. class Citire= {
6. public static void main(String args[]) {
=. 9nputStreamTeader inA@
ne& 9nputStreamTeader(Sstem.in)#
,. String s@ne& String()#
<. tr {
C. Su11eredTeader in@ ne& Su11eredTeader(inA)#
L. s@in.read;ine()#
7. $
A-. catc*(J%ception e) {
AA. Sstem.out.println(KJrror8K?e.get.essage())#
AB. $
A6. Sstem.out.println(s)#
A=. $
A,. $
1.0. Citirea i scrierea datelor din !iier
1.0.1. Clasele 8ile:eader i 8ile;riter
Clasa PileTeader este folosit la citirea datelor dintr-un fiier text. Cei mai
importan[i constructori ai si sunt:
creeaz un flux care citete caractere din fiierul nume
public PileTeader(String nume) t*ro&s
PileNotPoundJ%ception
92
creeaz un flux care citete caractere din fiierul varFis.
public PileTeader(Pile varPis) t*ro&s
PileNotPoundJ%ception
Clasa PileZriter este folosit la scrierea datelor ntr-un fiier text. Cei mai
importan[i constructori ai si sunt:
creeaz un flux care scrie caractere in fiierul nume
public PileZriter (String nume) t*ro&s 9:J%ception
creeaz un flux care citete caractere din fiierul varFis
public PileZriter (Pile varPis) t*ro&s 9:J%ception
12emplu 6: Citete caracter cu caracter un fiier n linia 8. Cnd valoarea
caracterului citit este 1 nseamn c s-a ajuns la sfritul fiierului. Caracterele sunt
adugate la un ir de caractere n linia 9, care la sfrit este afiat.
A. import java.io.'#
B. public class CitirePis {
6. public static void main(String args[]) {
=. int c#
,. StringSu11er s@ne& StringSu11er()#
<. tr {
C. PileTeader in@ ne& PileTeader(Kcit=.t%tK)#
L. &*ile((c@in.read())"@-A)
7. s.append((c*ar)c)#
A-. $
AA. catc*(J%ception e) {
AB. Sstem.out.println(KJrror8K?e.get.essage())#
A6. $
A=. Sstem.out.println(s)#
A,. $
A<. $
12emplu 7: Copiaz con[inutul unui fiier n alt fiier.
A. import java.io.'#
B. public class CitirePis {
6. public static void main(String[] args){
=. tr{
,. PileTeader in @ ne& PileTeader(!cit=.t%t!)#
<. PileZriter out @ ne& PileZriter(!out.t%t!)#
C. int c#
L. &*ile ((c @ in.read()) "@ -A)
7. out.&rite(c)#
A-. in.close()#
AA. out.close()#
AB. $
93
A6. catc* (9:J%ception e) {
A=. Sstem.out.println(!Jrror8 ! ? e.toString())#
A,. $
A<. $
AC. $
D. 4ppletKuri
D.1. Ce este un applet?
Unul dintre scopurile limbajului Java a fost crearea unor programe mici
(applet) care s ruleze n interiorul unui browser Web.
Un applet reprezint o suprafa[ de afiare (container) ce poate fi inclus ntr-o
pagina Web i gestionat printr-un program Java. Un astfel de program se mai
numete miniaplica-ie.
Codul unui applet poate fi format din una sau mai multe clase. Una dintre
acestea este principal+ i extinde clasa J4pplet, fiind clasa ce trebuie specificat n
documentul HTML ce descrie pagina de Web n care dorim s includem applet-ul.
Diferen[a fundamental dintre un applet i o aplica[ie const n faptul c, un applet
nu poate fi executat independent, ci va fi executat de browser-ul n care este
ncrcat pagina Web ce con[ine applet-ul respectiv. O aplica[ie independent este
executat prin apelul interpretorului java, avnd ca parametru numele clasei
principale a aplica[iei, clasa principal fiind cea care con[ine metoda main.
Un applet nu se poate atinge de hardisk-ul local prin citiri sau scrieri. Scrierea
este mpiedicat din cauza viruilor care s-ar putea instala, iar citirea deoarece nu se
dorete preluarea de informa[ii de pe sta[ia local.
Un neajuns al applet-urilor ar putea fi timpul destul de lung necesar ncrcrii
lor. O metod de nlturare a acestui neajuns ar fi arhivarea applet-urilor ntr-un fiier
JAR (Java ARchive) care s cuprind toate componentele. Astfel, fiierul compresat
este download-at la o singur tranzac[ie cu server-ul.
Un avantaj al folosirii applet-urilor este lipsa necesit[ii instalrii lor. De fapt,
instalarea este automat de cte ori utilizatorul ncarc pagina Web care con[ine
applet-ul.
Pachetul care ofer suport pentru crearea de applet-uri este java(.s&ing.
Clasa J(pplet furnizeaz tot ce este necesar pentru construirea i ntre[inerea unui
94
applet. Crearea unui applet implic implementarea metodelor puse la dispozi[ie de
clasa J(pplet care ne ajut s descriem comportamentul dorit al applet-ului.
erarhia de clase este:
java.lang.:bject
]
?--java.a&t.Component
]
?--java.a&t.Container
]
?--java.a&t.Hanel
]
?--java.applet.(pplet
]
?--/a%a2$swin#$<0pplet

D.2. 6unciile unui applet
Execu[ia unui applet ncepe n momentul n care un browser afieaz o pagin
Web n care este inclus applet-ul respectiv i poate trece prin mai multe etape.
Fiecare etap este strns legat de un eveniment generat de ctre browser i
determin apelarea unei metode specifice din clasa ce implementeaz appletul.
Lnc"rcarea n memorie se creeaz o instan[ a clasei principale a
applet-ului i se ncarc n memorie.
Iniiali*area se apeleaz metoda init ce permite ini[ializarea
diverselor variabile, citirea unor parametri de intrare, etc. Metoda init
este responsabil i pentru aezarea tuturor componentelor pe form.
2ornirea se apeleaz metoda start
7(ecuia propriuK*is" const n interac[iunea dintre utilizator i
componentele afiate pe suprafa[a applet-ului.
3prirea temporar" n cazul n care utilizatorul prsete pagina Web
n care ruleaz applet-ul se apeleaz metoda stop a acestuia, dndu-i
astfel posibilitatea s se opreasc temporar ct timp nu este vizibil,
pentru a nu consuma inutil din timpul procesorului. Acelai lucru se
ntmpl dac fereastra browser-ului este minimizat. n momentul cnd
pagina Web ce con[ine applet-ul devine din nou activ, va fi reapelat
metoda start.
95
3prirea de!initiv" La nchiderea tuturor instan[elor browser-ului folosit
pentru vizualizare, applet-ul va fi eliminat din memorie i va fi apelat
metoda destro a acestuia, pentru a-i permite s elibereze resursele
de[inute. Apelul metodei destro este ntotdeauna precedat de apelul lui
stop.

D.+. 8tructura general" a unui applet
import java%.s&ing.J(pplet#
import java.a&t.'#
import java.a&t.event.'#
public class Structura(pplet e%tends J(pplet {
public void init() {
/* codul descrie ac[iunile care dorim s fie efectuate la instan[ierea clasei
applet-ului. */
$
public void start() {
/* codul descrie ac[iunile care dorim s fie executate la lansarea applet-
ului n execu[ie sau la rentoarcerea n pagina applet-ului */
$
public void paint()rap*ics g) {
/* codul descrie ac[iunile care dorim s fie executate la fiecare redesenare
a ferestrei applet-ului */
$
public void stop() {
/* codul descrie ac[iunile care dorim s fie executate la oprirea temporar
a applet-ului (pagina Web nu mai este vizibil, fereastra browser-ului este
minimizat, etc) */
$
public void destro+() {
/* codul descrie ac[iunile care dorim s fie executate la distrugerea applet-
ului (browser-ul prsete documentul .html din care a fost apelat applet-ul) */
$
96
$
Observa-ie: Aceste metode sunt apelate automat de browser i nu trebuie
apelate explicit din program !
D.-. M5/L
Un browser Web interpreteaz con[inutul (textul) unui fiier .html (Hyper Text
Markup Language). Limbajul HTML const ntr-o colec[ie de marcaje (tag-uri).
Marcajele au rolul de a descrie modul n care va aprea afiat textul, de a comanda
browser-ului s utilizeze i alte resurse nternet, aflate n fiiere diferite.
Sintaxa unui marcaj este:
<NumeQag [parametri ]> te%t </NumeQag>
Parametrii se scriu sub forma:
NumeHarametru @ valoare
Structura unui document .*tml este:
G>Q.;>
G>J(W>
GQ9Q;J>
titlul documentului
<DQ9Q;J>
<D>J(W>
GS:W^>
. . .
G(HH;JQ parametrii>
GH(T(. parametrii>
GH(T(. parametrii>
. . .
GH(T(. parametrii>
GD(HH;JQ>
. . .
GDS:W^>
<D>Q.;>
Considerm cunoscute no[iunile de baz ale HTML. Ceea ce ne intereseaz
pentru construirea applet-urilor este marcajul <APPLET>. Acesta are parametrii
obligatorii i op[ionali.
Parametrii obligatorii:
97
CODE valoarea lui este numele fiierului care con[ine clasa applet-
ului: NumeClasa.class;
WDTH valoarea lui este l[imea ferestrei atribuit de browser applet-
ului la afiarea documentului .html;
HEGHT valoarea lui este nl[imea ferestrei atribuit de browser
applet-ului la afiarea documentului .html;
Parametrii op[ionali:
CODEBASE valoarea lui este adresa URL (Universal Resource
Locator) sau calea la fiierul cu clasa applet-ului. Dac parametru
lipsete, cutarea clasei se face n directorul curent (cel din care a fost
ncrcat fiierul .*tml);
VSPACE valoarea lui este nl[imea zonei (exprimat n pixeli) care
se las liber deasupra i dedesubtul ferestrei applet-ului;
HSPACE valoarea lui este l[imea zonei (exprimat n pixeli) care se
las liber n stnga i n dreapta ferestrei applet-ului;
ALT Specific textul ce trebuie afiat dac browser-ul n[elege
marcajul <APPLET> dar nu poate rula applet-uri Java.
NAME Ofer posibilitatea de a da un nume respectivei instan[e a
applet-ului, astfel nct mai multe applet-uri aflate pe aceeai pagin s
comunice ntre ele folosindu-se de numele lor.
ALGN Semnific modalitatea de aliniere a applet-ului n pagina Web.
Acest atribut poate primi una din urmtoarele valori: le1t+ rig*t+
top+ te%ttop+ middle+ absmiddle+ baseline+ bottom+
absbottom, semnifica[iile lor fiind aceleai ca i la marcajul 9.).
Marcajul <PARAM> nu este obligatoriu i poate s apar atunci cnd se
dorete ca applet-ul s preia parametrii. Un parametru este definit prin:
NAME reprezint numele variabilei recunoscut de applet;
VALUE reprezint valoarea recep[ionat de applet; este de tip String.
D... 7(emple
12emplu ': Exemplific ordinea apelrii metodelor.
98
import java%.s&ing.'#
import java.a&t.'#
public class appA e%tends J(pplet{
public void init(){
Sstem.out.println(!Sunt in init!)#
$
public void start(){
Sstem.out.println(!Sunt in start!)#
$

public void paint()rap*ics g){
g.dra&String(!Sunt in paint!+ B-+ AB-)#
Sstem.out.println(!Sunt in paint!)#
$
public void stop(){
Sstem.out.println(!Sunt in stop!)#
$
public void destro(){
Sstem.out.println(!Sunt in destro!)#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Hrimul (pplet GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!appA.class! Z9WQ>@6-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
12emplu ": Afieaz nite figuri geometrice.
import java%.s&ing.'#
import java.a&t.'#
public class appB e%tends J(pplet{
public void paint()rap*ics g){
g.setColor(Color.red)#
g.dra&Tect(A-+A-+A--+B--)#
g.setColor(ne& Color(B--+A--+B,,))#
g.1illTect(B-+B-+,-+,-)#
g.setColor(Color.blue)#
g.dra&:val(<-+<-+,-+,-)#
$
99
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Piguri geometrice GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!appB.class! Z9WQ>@6-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
12emplu 4: Afieaz lista tuturor font-urilor cunoscute de sistem.
import java.a&t.'#
import java%.s&ing.'#
public class app6 e%tends J(pplet
{
public void init(){
Container c@getContentHane()#
c.set;aout(ne& Plo&;aout())#
JQe%t(rea ta@ne& JQe%t(rea()#
JScrollHane sp@ne& JScrollHane(ta)#
sp.setHre1erredSi3e(ne& Wimension(A--+ A--))#
c.add(sp+ Sorder;aout.CJNQJT)#
)rap*icsJnvironment gr@)rap*icsJnvironment.
get;ocal)rap*icsJnvironment()#
Pont []1@gr.get(llPonts()#
1or (int i@-#iG1.lengt*#i??)
ta.append(1[i].getPontName()?!5n!)#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Ce de mai 1ont-uri """ GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!app6.class! Z9WQ>@6-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
12emplu 5: Seteaz un font i i tiprete caracteristicile.
import java%.s&ing.J(pplet#
100
import java.a&t.)rap*ics#
import java.a&t.Pont#
public class app< e%tends J(pplet {
private Pont 1on#
public void init()
{
1on@ne& Pont(!Courier!+ Pont.9Q(;9C ? Pont.S:;W+ B=)#
$
public void paint ()rap*ics g)
{
int stil+ dim#
String str+ nume#
g.setPont (1on)#
stil @ 1on.getStle()#
i1 ( stil @@ Pont.H;(9N)
str @ !Hlin!#
else i1 (stil @@ Pont.S:;W)
str @ !Sold!#
else i1 (stil @@ Pont.9Q(;9C)
str @ !9talic!#
else
str @ !Sold italic!#
dim @ 1on.getSi3e()#
str ?@ dim ? ! puncte !#
nume @ 1on.getName()#
str ?@ nume#
g.dra&String (str+ B-+ =-)#
g.dra&String (!Pamilia de 1ont-uri este ! ?
1on.getPamil()+ B-+ <-)#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Ce 1ont 1rumos """ GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!app<.class! Z9WQ>@C-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
101
12emplu 6: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei.
import java%.s&ing.J(pplet#
import java.a&t.'#
public class appC e%tends J(pplet {
int %Ualues[] @ {B-+ =-+ ,-+ 6-+ B-+ A,+ B-$#
int Ualues[] @ {B-+ B-+ 6-+ ,-+ ,-+ 6-+ B-$#
private Holgon pB#
public void init ()
{
pB @ ne& Holgon()#
pB.addHoint (C-+ C-)#
pB.addHoint (7-+ C-)#
pB.addHoint (A--+ L-)#
pB.addHoint (L-+ A--)#
pB.addHoint (C-+ A--)#
pB.addHoint (<,+ L-)#
pB.addHoint (<-+ <-)#
$
public void paint ()rap*ics g)
{
DDdesenea3a conturul unui poligon
g.dra&Holgon (%Ualues+ Ualues+ C)#
DDdesenea3a un poligon
g.1illHolgon (pB)#
DDcopia3a cele doua poligoane la noile coordonate
g.cop(rea (-+ -+ A--+ A--+ A-+A- )#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Ce poligoane... GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!appC.class! Z9WQ>@6-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
12emplu 7: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei.
import java%.s&ing.J(pplet#
import java.a&t.'#
102
public class appC e%tends J(pplet {
int %Ualues[] @ {B-+ =-+ ,-+ 6-+ B-+ A,+ B-$#
int Ualues[] @ {B-+ B-+ 6-+ ,-+ ,-+ 6-+ B-$#
private Holgon pB#
public void init ()
{
pB @ ne& Holgon()#
pB.addHoint (C-+ C-)#
pB.addHoint (7-+ C-)#
pB.addHoint (A--+ L-)#
pB.addHoint (L-+ A--)#
pB.addHoint (C-+ A--)#
pB.addHoint (<,+ L-)#
pB.addHoint (<-+ <-)#
$
public void paint ()rap*ics g)
{
DDdesenea3a conturul unui poligon
g.dra&Holgon (%Ualues+ Ualues+ C)#
DDdesenea3a un poligon
g.1illHolgon (pB)#
DDcopia3a cele doua poligoane la noile coordonate
g.cop(rea (-+ -+ A--+ A--+ A-+A- )#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Ce poligoane... GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!appC.class! Z9WQ>@6-- >J9)>Q@B-->
GD(HH;JQ>
GDS:W^>
GD>Q.;>
12emplu 8: Suma a dou numere folosind preluarea parametrilor.
import java%.s&ing.'#
import java.a&t.'#
public class suma e%tends J(pplet
{
int m+n#
String s#

public void init(){
103
String sm@getHarameter(!m!)+
sn@getHarameter(!n!)#
m@9nteger.parse9nt(sm)#
n@9nteger.parse9nt(sn)#
s@ne& 9nteger(m?n).toString()#
$
public void paint()rap*ics g){
g.dra&String(!Cmmdc @ !?s+ ,-+ <- )#
$
$

Documentul .html este:
G>Q.;>
G>J(W>
GQ9Q;J> Suma... GDQ9Q;J>
GD>J(W>
GS:W^>
G(HH;JQ C:WJ@!suma.class! Z9WQ>@6-- >J9)>Q@B-->
GH(T(. name@!m! value@!B!>
GH(T(. name@!n! value@!6!>
GD(HH;JQ>
GDS:W^>
GD>Q.;>
104
E. Inter!ee gra!ice
E.1. Ce este o inter!a" gra!ic"?
nterfa[a grafic se refer la toate tipurile de comunicare vizual ntre un
program i utilizatorii si. nterfa[a grafic se refer nu numai la ceea ce utilizatorul
vede pe ecran ci i la toate mecanismele de comunicare ntre acesta i program.
Limbajul Java pune la dispozi[ie numeroase clase pentru implementarea
diferitelor functionalit[i ale interfa[ei grafice, ns ne vom ocupa n continuare de
acelea care permit realizarea unei intefe[e grafice cu utilizatorul (GU Nraphical
Oser Interface).
n principiu, crearea unei aplica[ii grafice presupune urmtorii pai:
1. crearea unei suprafe[e de afiare (cum ar fi o fereastr) pe care vor fi
aezate obiectele grafice care servesc la comunicarea cu utilizatorul
(butoane, controale de editare, texte, etc);
2. crearea i aezarea obiectelor grafice pe suprafa[a de afiare n
pozi[iile corespunztoare;
3. definirea unor ac[iuni care trebuie s se execute n momentul cnd
utilizatorul interac[ioneaz cu obiectele grafice ale aplica[iei;
4. "ascultarea" evenimentelor generate de obiecte n momentul
interac[iunii cu utilizatorul i executarea ac[iunilor corespunztoare aa
cum au fost ele definite.
n Java exist dou pachete de clase care ofer servicii grafice: java.awt i
java(.s&ing. n acest curs ne vom ocupa de pachetul Swing care este o extensie a
pachetului awt. "Swing" a fost numele de cod dat proiectului care dezvolta
componente noi. ncepnd cu java%.s&ing este numele pachetelor pentru Swing
AP.
105
Majoritatea obiectelor grafice sunt subclase ale clasei <'omponent, clas
care definete generic o component grafic care poate interac[iona cu utilizatorul.
Aadar, printr-o component grafic vom n[elege orice obiect care are o
reprezentare grafic ce poate fi afiat pe ecran i care poate interac[iona cu
utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc.
n general, toate componentele sunt definte de clase proprii ce se gsesc n pachetul
java%.s&ing, clasa JComponent fiind superclasa abstract a tuturor acestor clase.
Crearea obiectelor grafice nu realizeaz automat i afiarea lor pe ecran. Mai
nti ele trebuie aezate pe o suprafa[ de afiare, care poate fi o fereastr sau
suprafa[a unui applet, i vor deveni vizibile n momentul n care suprafa[a pe care
sunt afiate va fi vizibil. O astfel de suprafa[ pe care se aeaz obiectele grafice
reprezint o instan[ a unei clase ob[inut prin extensia clasei 'ontainer; din acest
motiv suprafe[ele de afiare vor mai fi numite i containere. Clasa Container este o
subclas aparte a clasei Component, fiind la rndul ei superclasa tuturor suprafe[elor
de afiare Java (ferestre, applet-uri, etc).
Pachetul Swing ofer programelor care folosesc componentele lui posibilitatea
s-i aleag natura interfe[ei (,look and feel) sau, pur i simplu, s o conserve pe
cea caracteristic platformei respective.
E.2. 2rimele aplicaii 8&ing
E.2.1. 7(emple
12emplu ': O aplica[ie de sine stttoare, care nu utilizeaz applet-ul.
A. import java%.s&ing.'#
B. import java.a&t.'#
6. import java.a&t.event.'#
=. public class S&ingQest {
,. private static String Hre1i% @ !Numarul de clicN-
uri8 !#
<. private int nrClicN @ -#
C. J;abel etic*eta @ ne& J;abel(Hre1i% ? !- !)#
L. JSutton buton @ ne& JSutton(!Suton S&ing"!)#
7.
A-. public Component crea3aComponente() {
AA. buton.add(ction;istener(ne& (ction;istener() {
106
AB. public void actionHer1ormed((ctionJvent e) {
A6. nrClicN??#
A=. etic*eta.setQe%t(Hre1i% ? nrClicN)#
A,. $
A<. $)#
AC. JHanel panou @ ne& JHanel()#
AL. panou.setSorder(SorderPactor.createJmptSorder( 6
-+6-+A-+6-))#
A7. panou.set;aout(ne& Plo&;aout())#
B-. panou.add(buton)#
BA. panou.add(etic*eta)#
BB. return panou#
B6. $DDcrea3aComponente
B=.
B,. public static void main(String[] args) {
B<. tr {
BC. _9.anager.set;ooN(ndPeel(
_9.anager.get;ooN(ndPeel())
#
BL. $catc* (J%ception e) { $
B7. JPrame 1rame @ ne& JPrame(!Hrima aplicatie
S&ing!)#
6-. S&ingQest app @ ne& S&ingQest()#
6A. Component comp @ app.crea3aComponente()#
6B. 1rame.getContentHane().add(comp)#
66. 1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
6=. 1rame.pacN()#
6,. 1rame.setUisible(true)#
6<. $DDmain
6C. $DDclass
n linia 17 se creaz un panel (panou) pe care vor fi aezate componentele.
n linia 18 se seteaz marginea panel-ului cu dimensiunile pentru (sus,
stnga, jos, dreapta).
n linia 29 se creaz container-ul principal (din vrful ierarhiei) i n linia 32 se
adaug componentele pe el.
n liniile 3335 se ncheie setrile pentru frame i se afieaz.
12emplu ": O aplica[ie care utilizeaz applet-ul.
A. import java%.s&ing.'#
B. import java.a&t.'#
6. public class S&ing(ppletQest e%tends J(pplet {
107
=. public void init() {
,. J;abel etic*eta@ne& J;abel(!: etic*eta
1rumoasa"!)#
<. etic*eta.set>ori3ontal(lignment(J;abel.CJNQJT)#
C.
label.setSorder(SorderPactor.create.atteSorder( A+A+
B+B+Color.blacN))#
L. getContentHane().add(etic*eta+
Sorder;aout.CJNQJT)#
7. $
A-. $
E.2.2. Comentarea e(emplelor
9.2.2.1 Alegerea naturii interfeei
n codul urmtor se specific natura interfe[ei:
tr {
=*>ana#er$set?ook0nd8eel(
=*>ana#er$ #et?ook0nd8eel());
$ catc* (J%ception e) { $
9.2.2.2 Setarea container-ului principal din !"rful ierar#iei$
Orice program care prezint o GU Swing con[ine cel pu[in un container Swing.
n general, container-ele principale sunt instan[e ale lui JPrame, JWialog sau (pentru
appleturi) J(pplet. Fiecare obiect JPrame implementeaz o singur fereastr
principal, fiecare obiect JWialog cte o fereastr secundar i fiecare obiect
J(pplet implementeaz un applet n cadrul unui browser. Container-ul principal
Swing furnizeaz suportul necesar componentelor Swing pentru a fi afiate i pentru
a manipula evenimentele. n exemplu 1 container-ul folosit este JPrame i este creat
n linia 29. n exemplu 2 container-ul folosit este J(pplet (vezi linia 3).
Aplica[iile Swing grupeaz etichetele i butoanele ntr-un container (un
JHanel) nainte s le adauge pe frame. Adugarea componentelor pe panel
nseamn c ele vor fi controlate de manager-ul de layout al panel-ului. Manager-ul
de layout al unui container determin dimensiunea i pozi[ia fiecrei componente
care este adugat pe container.
108
9.2.2.3 Manipularea e!enimentelor
Aplica[ia din exemplu 1 con[ine dou evenimente tratate. Una trateaz click-ul
pe buton (action events); cealalt trateaz nchiderea ferestrei (window events):
button.add(ction;istener(ne& (ction;istener() {
public void actionHer1ormed((ctionJvent e) {
numClicNs??#
label.setQe%t(labelHre1i% ? numClicNs)#
$
$)#
...
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
E.+. Containere principale
Dup cum am vzut, suprafe[ele de afiare ale componentelor grafice
(containerele) sunt extensii ale clasei Container.
Spre deosebire de un applet care i poate plasa componentele direct pe
suprafa[a de afiare a browser-ului n care ruleaz, o aplica[ie independent are
nevoie de propriile ferestre pe care s fac afiarea componentelor sale grafice. O
astfel de suprafa[ pe care se aeaz obiectele grafice se numete supra,a-+ de
a,iare sau container i reprezint o instan[ a unei clase ob[inut prin extensia
superclasei 'ontainer.
Cele mai importante containere principale sunt: JPrame+ JWialog+
JZindo& i J(pplet. erarhia de clase este:
java.a&t.Container
]EE java.a&t.Hanel
]EE java.applet.(pplet
]EE java%.s&ing.<0pplet
]EE java.a&t.Zindo&
]EE java.a&t.Prame
] ]EE java%.s&ing.<8rame
]EE java.a&t.Wialog
] ]EE java%.s&ing.<)ialo#
]EE java%.s&ing.<;indow
109
E.+.1. Clasa <8rame
Clasa <8rame este folosit pentru implementarea ferestrelor principale.
Aceast component are caracteristic cadrul, bara de titlu i controalele ferestrei
furnizate de sistemul de operare. Acestea nu pot fi modificate. Comportamentul
ferestrelor (redimensionare, minimizare, pozi[ionare) este controlat de sistemul de
operare.
Constructorii clasei JPrame sunt:
JPrame() construiete o fereastr, fr titlu, ini[ial invizibil.
JPrame(String title) construiete o fereastr, cu titlu specificat,
ini[ial invizibil.
Aadar, o fereastr nou creat este invizibil. Pentru a fi fcut vizibil se va
apela metoda s*o&().
12emplu 4: Se construiete i se afieaz o fereastr cu titlul "Prima
fereastra".
import java%.s&ing.'#
public class (plJPrame {
public static void main(String args[]) {
JPrame 1 @ ne& JPrame(!Hrima 1ereastra!)#
1.s*o&()#
$
$
Cteva dintre metodele cele mai folosite ale clasei JPrame sunt prezentate n
continuare.
Metoda pacN() este folosit pentru a da o dimensiune frame-ului. O
alternativ pentru pacN() este setarea explicit a dimensiunii frame-ului prin
apelarea metodei setSi3e(). n general, folosirea lui pacN() este preferabil
folosirii lui setSi3e(), deoarece pacN() las n seama layout manager-ului calculul
dimensiunii frame-ului care [ine seama i de al[i factori care pot afecta dimensiunea
componentelor.
Metoda setUisible() este folosit pentru a afiarea frame-ului.
Metoda getContentHane() returneaz obiectul contentPane al frame-ului.
Orice component se adaug pe contentPane-ul frame-ului curent.
12emplu 5:
110
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plicPrame{
public static void main(String[] args) {
tr {
_9.anager.set;ooN(ndPeel(
_9.anager.get;ooN(ndPeel())#
$ catc* (J%ception e) { $
D'Se crea3a container-ul principal (din var1ul
ierar*iei) si se adauga componentele pe el'D
JPrame 1rame @ ne& JPrame()#
J;abel comp @ ne& J;abel(!etic*etaA!)#
J;abel compA @ ne& J;abel(!etic*etaB!)#
DDetic*etaB va 1i pusa peste etic*etaA
1rame.getContentHane().add(comp)#
1rame.getContentHane().add(compA)#
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1rame.pacN()#
1rame.setUisible(true)#
$
$
E.+.2. 6erestre secundare i clasa <)ialo#
Pentru a crea ferestre secundare se folosete, de obicei, JWialog. Alte
ferestre secundare pot fi create cu:
J:ptionHane creeaz o fereastr standard de dialog
Hrogress.onitor creeaz o fereastr care arat progresul unei opera[ii
JColorC*ooser creeaz o fereastr pentru alegerea culorii
JPileC*ooser creeaz o fereastr pentru selectarea unui fiier
12emplu 6:
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plicJ:ptionHane{
111
public static void main(String[] args) {
tr {
_9.anager.set;ooN(ndPeel(
_9.anager.get;ooN(ndPeel())#
$ catc* (J%ception e) { $
JPrame 1rame @ ne& JPrame()#
JSutton b@ne& JSutton(!(pasa-ma!)#
1rame.getContentHane().add(b)#
b.add(ction;istener(ne& (ction;istener(){
public void actionHer1ormed((ctionJvent e) {
J:ptionHane.s*o&.essageWialog(ne& Prame()+
!Pereastra de in1ormare!)#
$
$)#
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1rame.pacN()#
1rame.setUisible(true)#
$
$
Fiecare fereastr secundar este dependent de una principal (de un frame).
O fereastr de dialog poate fi modal. Dac este modal, ea blocheaz
accesul la oricare alt fereastr din program.
Cele mai simple ferestre modale pot fi create folosind una din metodele:
J:ptionHane.s*o&.essageWialog fereastr modal nzestrat
cu un buton. Se poate specifica mesajul, icoana i titlul ferestrei .
J:ptionHane.s*o&:ptionWialog fereastr modal nzestrat
cu butoane, mesaj, icoana i titlul ferestrei. Pot fi modificate de
utilizator.
12emplu 7:
:bject[] options @ {!Wa"""!+!Niciodata"""!+!Cine stie"""!$#
int n@J:ptionHane.s*o&:ptionWialog(
ne& Prame()+
!.a parasestiF!+
!Pereastra de :ptiuni!+
J:ptionHane.^JSEN:EC(NCJ;E:HQ9:N+
J:ptionHane.`_JSQ9:NE.JSS()J+
null+
options+
options[B])#
112
J:ptionHane.s*o&Con1irmWialog fereastr modal
nzestrat cu dou butoane.
12emplu 8:
J:ptionHane.s*o&Con1irmWialog(
null+
!(lege un buton!+
!Pereastra de con1irmare!+
J:ptionHane.^JSEN:E:HQ9:N)#
Parametrii folosi[i de aceste metode:
parentComponent: poate fi frame-ul care con[ine fereastra de dialog
(ea este afiat pornind de la coordonatele ferestrei printe) sau null
(se folosete un frame implicit i fereastra de dialog este centrat pe
ecran);
message: mesajul care apare n fereastra de dialog;
messageQpe: definete stilul mesajului. Valori posibile sunt:
ERROR_MESSAGE
NFORMATON_MESSAGE
WARNNG_MESSAGE
QUESTON_MESSAGE
PLAN_MESSAGE
optionQpe: definete mul[imea de butoane care apar pe fereastr:
DEFAULT_OPTON
YES_NO_OPTON
YES_NO_CANCEL_OPTON
OK_CANCEL_OPTON
Pot fi folosite i alte tipuri de butoane;
options: descriere detaliat a mul[imii butoanelor afiate pe fereastr;
n general, este un vector de String-uri;
icon: icoana a,iat+ pe ,ereastr+;
title: titlul ferestrei;
initialUalue: butonul selectat implicit.
113
Metodele s*o&.essageWialog, s*o&Con1irmWialog i s*o&:ptionWialog
returneaz un ntreg semnificnd op[iunea utilizatorului. Valorile acestui ntreg pot fi
^JSE:HQ9:N, N:E:HQ9:N, C(NCJ;E:HQ9:N, :aE:HQ9:N i C;:SJWE:HQ9:N.
Ferestre de dialog nemodale se pot crea cu J:ialog.
<)ialo# este folosit pentru implementarea ferestrelor secundare (cum ar fi
dialog bo%es i alert bo%es) i a celor utilitare. Aceast component are
caracteristic cadrul i bara de titlu furnizate de sistemul de operare. Aduce nou fa[
de clasa Dialog suportul pentru opera[ia de nchidere implicit.
12emplu ::
import java%.s&ing.'#
import java.a&t.event.'#
import java.a&t.'#
public class Wialog{
public static void main(String a[]){
1inal JPrame 1rame@ne& JPrame(!Prame-ul meu!)#
Container contentHane @ 1rame.getContentHane()#
contentHane.set;aout(ne& )rid;aout(A+A))#
JSutton Suton @ ne& JSutton(!(pasa-ma"!)#
contentHane.add(Suton)#
Suton.add(ction;istener(ne& (ction;istener() {
public void actionHer1ormed((ctionJvent e) {
i1 (e.get(ctionCommand().eYuals(!(pasa-ma"!)) {
1inal JWialog dialog@ne& JWialog(1rame+
!: 1ereastra copil!+true)#
Container c@dialog.getContentHane()#
J;abel label@ne& J;abel(!Jtic*eta 1rumoasa!)#
c.add(label)#
dialog.pacN()#
dialog.setUisible(true)#
$
$
$)#
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1rame.pacN()#
1rame.setUisible(true)#
$
$
114
E.+.+. Clasa <;indow
Clasa JZindo& este folosit pentru implementarea ferestrelor pline
(dreptunghiuri albe pline). Aceste ferestre nu con[in bar de titlu sau controale de
fereastr.
12emplu ;:
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plicJZindo& {
public static void main(String[] args) {
tr {
_9.anager.set;ooN(ndPeel(
_9.anager.get;ooN(ndPeel())#
$ catc* (J%ception e) { $
1inal JPrame 1rame@ne& JPrame(!Prame-ul meu!)#
Container contentHane @ 1rame.getContentHane()#
contentHane.set;aout(ne& )rid;aout(A+A))#
JSutton Suton @ ne& JSutton(!(pasa-ma"!)#
contentHane.add(Suton)#
Suton.add(ction;istener(ne& (ction;istener() {
public void actionHer1ormed((ctionJvent e) {
i1 (e.get(ctionCommand().eYuals(!(pasa-ma"!))
{
JZindo& &in @ ne& JZindo&()#
JTootHane pane@ne& JTootHane()#
J;abel label@ne& J;abel(!*asd!)#
pane.set;aout(ne& Plo&;aout())#
pane.add(label)#
&in.getContentHane().add(pane)#
&in.setSi3e(B--+B--)#
&in.setUisible(true)#
$
$
$)#
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1rame.pacN()#
1rame.setUisible(true)#
$
$
115
E.+.-. Clasa <0pplet
Clasa J(pplet este folosit pentru implementarea applet-urilor. A se vedea
exemplul 2.
Forma containere-lor principale este ilustrat n figura urmtoare:
E.-. Containere intermediare
Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele
intermediare folosesc la mpr[irea ferestrei n mai multe zone sau la gruparea
componentelor. Swing furnizeaz urmtoarele containere intermediare:
2anel Este cel mai flexibil i frecvent utilizat container
intermediar. Se implementeaz folosind clasa JHanel. Un
panel grupeaz componentele dintr-o fereastr sau dintr-un
alt panel. Un panel poate folosi orice layout manager i poate
avea o margine (border).
116
8croll
2ane
Furnizeaz scroll bar (orizontal i vertical) pentru
componentele prea mari.
8plit
2ane
Afieaz dou componente ntr-un spa[iu fix, oferind
utilizatorului posibilitatea s redimensioneze fiecare
component.
5abbed
2ane
Con[ine mai multe componente dar afieaz numai
una la un moment dat. Utilizatorul poate alege ntre
componente.
5ool
Par
Grupeaz componentele (n general butoane) ntr-o
linie sau o coloan, permi[nd utilizatorului s o mute
oriunde.
Forma containere-lor intermediare este ilustrat n figura urmtoare:
12emplu '$: Pentru JScrollHane
JPrame 1rame @ ne& JPrame(!Woar un e%emplu!)#
JQe%t(rea t @ ne& JQe%t(rea(B-+ =-)#
JScrollHane scrpane@ne& JScrollHane(t)#
117
scrpane.setHre1erredSi3e(ne& Wimension(A--+ A--))#
1rame.getContentHane().add(scrpane)#
1or(int i@-#iGA--#i??)
t.append(i?!5n!)#DD(ne& 9nteger(i)).toString())#

12emplu '': Pentru JSplitHane
JPrame 1rame @ ne& JPrame(!Woar un e%emplu!)#
JQe%t(rea t@ne& JQe%t(rea()#
1or(int i@-#iGA--#i??)
t.append(i?!5n!)#
J;abel label@ne& J;abel(!*jsdNljasldjasljdla1j!)#
JSplitHane splitpane@ne& JSplitHane()#
splitpane.set:neQouc*J%pandable(true)#
splitpane.set;e1tComponent(t)#
splitpane.setTig*tComponent(label)#
splitpane.setHre1erredSi3e(ne& Wimension(A--+ A--))#
1rame.getContentHane().add(splitpane)#
12emplu '': Pentru JQabbedHane
import java%.s&ing.JQabbedHane#
import java%.s&ing.9mage9con#
import java%.s&ing.J;abel#
import java%.s&ing.JHanel#
import java%.s&ing.JPrame#
import java.a&t.'#
import java.a&t.event.'#
public class (plicQabbed e%tends JHanel {
public (plicQabbed() {
JQabbedHane tabbedHane @ ne& JQabbedHane()#
Component panelA @ creareHanel(!Salut!)#
tabbedHane.addQab(!_nu!+ panelA)#
tabbedHane.setSelected9nde%(-)#
Component panelB @ creareHanel(!Salut Salut!)#
tabbedHane.addQab(!Woi!+ panelB)#
Component panel6 @ creareHanel(!Salut Salut Salut!)#
tabbedHane.addQab(!Qrei!+ panel6)#
Component panel= @ creareHanel(!Salut Salut Salut
Salut!)#
tabbedHane.addQab(!Hatru!+ panel=)#
DDSe adauga tabbed pane-ul pe panel.
set;aout(ne& )rid;aout(A+ A))#
add(tabbedHane)#
118
$
protected Component creareHanel(String te%t) {
JHanel panel @ ne& JHanel(1alse)#
J;abel label @ ne& J;abel(te%t)#
label.set>ori3ontal(lignment(J;abel.CJNQJT)#
panel.set;aout(ne& )rid;aout(A+ A))#
panel.add(label)#
return panel#
$
public static void main(String[] args) {
JPrame 1rame @ ne& JPrame(!J%emplu de QabbedHane!)#
1rame.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1rame.getContentHane().add(
ne& (plicQabbed()+ Sorder;aout.CJNQJT)#
1rame.setSi3e(=--+ AB,)#
1rame.setUisible(true)#
$
$
Figura urmtoare ilustreaz execu[ia exemplului.
E... 6olosirea gestionarilor de po*iionare >La%out /anager?
Un program poate avea interfe[e diferite, chiar dac sunt folosite aceleai
componente. Acest lucru se datoreaz folosirii a diferi[i gestionari de pozi[ionare
care controleaz dimensiunea i pozi[iile componentelor.
Aestionarea pozi-ion+rii este procesul prin care se determin dimensiunea i
pozi[ia componentelor. mplicit, fiecare container are un gestionar de pozi-ionare
un obiect care gestioneaz pozi[ionarea fiecrei componente de pe container. Acest
obiect implementeaz interfa[a ;aout.anager. Acesta poate fi nlocuit cu altul care
119
s fie pe msura cerin[elor. n general, se seteaz gestionarul de pozi[ionare pentru
dou tipuri de containere: contentpane (folosete implicit Sorder;aout) i
JHanel (folosete implicit Plo&;aout).
De cte ori se adaug o component pe container trebuie [inut cont de
gestionarul de pozi[ionare al containerului respectiv.
E...1. 8etarea po*iion"rii >La%out /anagerului?
Pentru schimbarea layout manager-ului folosit de un container se apeleaz
metoda set;aout. Metoda poate primi ca parametru orice instan[ a unei clase
care implementeaz interfa[a ;aout.anager. Secven[a de ataare a unui gestionar
pentru un container este:
Plo&;aout gestionar @ ne& Plo&;aout()#
container.set;aout(gestionar)#
sau:
container.set;aout(ne& Plo&;aout())#
De exemplu:
JHanel jp @ ne& JHanel()#
jp.set;aout(ne& Sorder;aout())#
Dac argumentul este null, container-ul nu folosete un layout manager. n
acest caz trebuie specificate dimensiunile i pozi[iile fiecrei componente de pe
container.
Cei mai folosi[i gestionari n Java sunt: Sorder;aout, So%;aout,
Plo&;aout, )ridSag;aout i )rid;aout.
9.%.1.1 &order'a(out
Sorder;aout este layout manager-ul implicit pentru fiecare container
principal. Un Sorder;aout are cinci zone n care pot fi aezate componentele:
nord, sud, est, vest i centru.
12emplu '":
A. import java%.s&ing.'#
B. import java.a&t.'#
120
6. import java.a&t.event.'#
=. public class (plicSorder;aout e%tends JPrame{
,. public static void main(String[] args) {
<. (plicSorder;aout 1@ne& (plicSorder;aout()#
C. Container contentHane @ 1.getContentHane()#
L. contentHane.set;aout(ne& Sorder;aout())#
7. contentHane.add(ne& JSutton(!Suton A N:TW!)+
Sorder;aout.N:TQ>)#
A-. contentHane.add(ne& JSutton(!B CJNQT_!)+
Sorder;aout.CJNQJT)#
AA. contentHane.add(ne& JSutton(!Suton 6 UJSQ!)+
Sorder;aout.ZJSQ)#
AB. contentHane.add(ne& JSutton(!Suton = S_W!)+
Sorder;aout.S:_Q>)#
A6. contentHane.add(ne& JSutton(!Suton , JSQ!)+
Sorder;aout.J(SQ)#
A=. 1.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
A,. 1.setSi3e(=--+ AB,)#
A<. 1.setUisible(true)#
AC. $
AL. $
|innd cont c pentru frame-uri gestionarul implicit este BorderLayout, linia 8
nu mai este necesar. Rezultatul execu[iei acestui program este:
9.%.1.2 &o)'a(out
Gestionarul So%;aout aeaz componentele pe o singur linie sau coloan.
Respect dimensiunile minime ale componentelor i permite alinierea lor.
12emplu '4:
import java%.s&ing.'#
121
import java.a&t.'#
import java.a&t.event.'#
public class (plicSo%;aout e%tends JPrame{
private static void adaugSut(String te%t+
Container container+ 1loat unde) {
JSutton button @ ne& JSutton(te%t)#
button.set(lignmentX(unde)#
container.add(button)#
$
public static void main(String[] args) {
(plicSo%;aout 1@ne& (plicSo%;aout()#
Container contentHane @ 1.getContentHane()#
contentHane.set;aout(ne& So%;aout(
contentHane+ So%;aout.^E(X9S))#
adaugSut(!Suton A!+ contentHane+
Component.CJNQJTE(;9)N.JNQ)#
adaugSut(!B!+ contentHane+Component.T9)>QE(;9)N.JNQ)#
adaugSut(!Suton 6!+ contentHane+
Component.;JPQE(;9)N.JNQ)#
adaugSut(!Suton = 1oarte lung!+ contentHane+
Component.CJNQJTE(;9)N.JNQ)#
adaugSut(!Suton ,!+ contentHane+
Component.;JPQE(;9)N.JNQ)#

1.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#$
$)#
1.pacN()#
1.setUisible(true)#
$
$
Rezultatul execu[iei acestui program este:
122
9.%.1.3 *ard'a(out
Clasa Card;aout permite implementarea unei arii care con[ine diferite
componente la momente diferite. Tabbed pane-urile sunt containere intermediare
care furnizeaz o func[ionalitate similar. Un Card;aout este n general controlat
de un Combo Box, starea lui determinnd panel-ul de afiat.
12emplu '5:
import java.a&t.'#
import java.a&t.event.'#
import java%.s&ing.'#
public class (plicCardZindo& e%tends JPrame
implements 9tem;istener {
JHanel cards#
String S_Q:NH(NJ; @ !Hanel cu Sutoane!#
String QJXQH(NJ; @ !Hanel cu Qe%tPield-uri!#
public (plicCardZindo&() {
Container contentHane @ getContentHane()#

String comboSo%9tems[] @ { S_Q:NH(NJ;+ QJXQH(NJ; $#
JHanel cbp @ ne& JHanel()#
JComboSo% c @ ne& JComboSo%(comboSo%9tems)#
c.setJditable(1alse)#
c.add9tem;istener(t*is)#
cbp.add(c)#
contentHane.add(cbp+ Sorder;aout.N:TQ>)#
cards @ ne& JHanel()#
cards.set;aout(ne& Card;aout())#

JHanel pA @ ne& JHanel()#
pA.add(ne& JSutton(!Suton A!))#
pA.add(ne& JSutton(!Suton B!))#
pA.add(ne& JSutton(!Suton 6!))#
JHanel pB @ ne& JHanel()#
pB.add(ne& JQe%tPield(!Qe%tPield!+ B-))#
cards.add(pA+ S_Q:NH(NJ;)#
cards.add(pB+ QJXQH(NJ;)#
contentHane.add(cards+ Sorder;aout.CJNQJT)#

addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
123
$
public void itemStateC*anged(9temJvent evt) {
Card;aout cl @ (Card;aout)(cards.get;aout())#
cl.s*o&(cards+ (String)evt.get9tem())#
$
public static void main(String args[]) {
(plicCardZindo& &indo& @ ne& (plicCardZindo&()#
&indo&.setQitle(!Card;aout!)#
&indo&.pacN()#
&indo&.setUisible(true)#
$
$
n imaginea urmtoare se vd cele dou stri ale ferestrei n func[ie de starea
Combo Box-ului:
9.%.1.4 +lo,'a(out
Plo&;aout este layout manager-ul implicit pentru orice JHanel. Aeaz
componentele de la stnga spre dreapta, de sus n jos.
12emplu '6:
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plicPlo&;aout e%tends JPrame{
private static void adaugSut(String te%t+
Container container){
JSutton button @ ne& JSutton(te%t)#
container.add(button)#
$
public static void main(String[] args) {
(plicPlo&;aout 1@ne& (plicPlo&;aout()#
Container contentHane @ 1.getContentHane()#
contentHane.set;aout(ne& Plo&;aout())#
adaugSut(!Suton A!+ contentHane)#
adaugSut(!B!+ contentHane)#
adaugSut(!Suton 6!+ contentHane)#
124
adaugSut(!Suton = 1oarte lung!+ contentHane)#
adaugSut(!Suton ,!+ contentHane)#

1.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#$
$)#
1.pacN()#
1.setUisible(true)#
$
}
Rezultatul execu[iei acestui program este:
9.%.1.% -rid'a(out
)rid;aout-ul aeaz componentele n celulele unui tabel. Fiecare
component ocup tot locul disponibil din celul. Toate celulele au aceeai
dimensiune. La redimesionarea ferestrei )rid;aout-ului, celulele i vor schimba
dimensiunile astfel nct s fie ocupat tot spa[iul ferestrei.
Clasa GridLayout are doi constructori:
public )rid;aout(int rows+ int columns)
public )rid;aout(int rows+ int columns+
int horizontalGap+ int verticalGap)
Cel pu[in unul din cele dou argumente roBs i columns trebuie s fie nenul.
Argumentele @orizontalAap i verticalAap din cel de-al doilea constructor permit
specificarea numrului de pixeli dintre celule. mplicit ele au valoarea 0.
12emplu '7:
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plic)rid;aout e%tends JPrame{
public static void main(String[] args) {
(plic)rid;aout 1@ne& (plic)rid;aout()#
Container contentHane @ 1.getContentHane()#
contentHane.set;aout(ne& )rid;aout(-+B))#
125
contentHane.add(ne& JSutton(!Suton A!))#
contentHane.add(ne& JSutton(!B!))#
contentHane.add(ne& JSutton(!Suton 6!))#
contentHane.add(ne& JSutton(!Suton = 1oarte lung!))#
contentHane.add(ne& JSutton(!Suton ,!))#
1.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#$
$)#
1.pacN()#
1.setUisible(true)#
$
$
Rezultatul execu[iei acestui program este:
Constructorul apelat creeaz o instan[ a lui )rid;aout care are dou
coloane i oricte linii sunt necesare ne& )rid;aout(-+B).
9.%.1.. -rid&ag'a(out
)ridSag;aout este cel mai sofisticat i flexibil layout manager pe care
platforma Java l furnizeaz. Aeaz componentele n celulele unui tabel, fiecare
component putnd s ocupe mai multe celule. Liniile / coloanele tabelului nu este
obligatoriu s aib aceeai nl[ime / l[ime. Pentru fiecare component care se
adaug pe fereastr se seteaz o serie de constrngeri prin crearea unui obiect al
clasei )ridSagConstraints. Aceeai instan[ a lui )ridSagConstraints
poate fi folosit pentru mai multe componente, chiar dac ele au constrngeri
diferite. )ridSag;aout extrage valorile constrngerilor i nu refolosete
)ridSagConstraints. Clasa con[ine urmtoarele atribute care pot fi setate:
grid%+ grid Specific linia i coloana col[ului din stnga sus a
componentei. Coloana cea mai din stnga are gridx=0 iar linia cea mai de sus are
gridy=0.
126
grid&idt*+ grid*eig*t Reprezint numrul de coloane (pentru
gridwidth) sau de linii (pentru gridheight) pe care va fi afiat componenta. Valoarea
implicit este 1.
1ill Este folosit atunci cnd aria de afiare a componentei este mai mare
dect dimensiunea cerut, pentru a determina cum poate fi redimensionat
componenta. Valorile valide sunt:
NONE (implicit),
HORZONTAL (mrete componenta pe orizontal astfel nct s
acopere ntreaga suprafa[ disponibil dar nu schimb nl[imea),
VERTCAL (mrete componenta pe vertical astfel nct s
acopere ntreaga suprafa[ disponibil dar nu schimb l[imea),
BOTH (mrete componenta astfel nct s acopere ntreaga
suprafa[ disponibil.
ipad%+ ipad Folosite pentru redimensionarea celulelor. Specific ct
trebuie adunat la dimensiunea minim a componentei. Valoarea implicit este 0.
L[imea / nl[imea va avea valoarea minim plus ipadx*2 / ipady*2 pixeli (se aplic
n ambele capete ale componentei).
insets Specific distan[a dintre component i col[urile suprafe[ei pe care
se afieaz. Valoarea atribuit este un obiect 9nsets.
anc*or Este folosit atunci cnd componenta este mai mic dect suprafa[a
pe care urmeaz s fie afiat, pentru a determina unde se plaseaz componenta.
Valori valide sunt CENTER (implicit), NORTH, NORTHEAST, EAST, SOUTHEAST,
SOUTH, SOUTHWEST, WEST i NORTHWEST.
&eig*t%+ &eig*t Folosite pentru a determina modul n care s fie
repartizat spa[iul dintre coloane / linii. Dac nu se specific nici o valoare (implicit
este 0) atunci toate componentele vor fi grupate n centru container-ului deoarece
)ridSag;aout pune orice spa[iu n plus ntre tabel i col[urile container-ului.
12emplu '8:
import java.a&t.'#
import java.a&t.event.'#
import java%.s&ing.'#
public class (plic)ridSag;aout e%tends JPrame {
1inal boolean s*ouldPill @ true#
1inal boolean s*ouldZeig*tX @ true#
127

public (plic)ridSag;aout() {
JSutton buton#
Container contentHane @ getContentHane()#
)ridSag;aout gridbag @ ne& )ridSag;aout()#
)ridSagConstraints c @ ne& )ridSagConstraints()#
contentHane.set;aout(gridbag)#
i1 (s*ouldPill) {
DDinaltime implicita+ latime ma%ima
c.1ill @ )ridSagConstraints.>:T9b:NQ(;#
$

buton @ ne& JSutton(!Suton A!)#
i1 (s*ouldZeig*tX) {
c.&eig*t% @ -.,#
$
c.grid% @ -#
c.grid @ -#
gridbag.setConstraints(buton+ c)# DDconstrangerile
impuse sunt atasate componentei
contentHane.add(buton)#
buton @ ne& JSutton(!B!)#
c.grid% @ A#
c.grid @ -#
gridbag.setConstraints(buton+ c)#
contentHane.add(buton)#
buton @ ne& JSutton(!Suton 6!)#
c.grid% @ B#
c.grid @ -#
gridbag.setConstraints(buton+ c)#
contentHane.add(buton)#
buton @ ne& JSutton(!Suton = 1oarte lung!)#
c.ipad @ =-# DDsetea3a cu cat va creste
inaltimea componentei
c.&eig*t% @ -.-#
c.grid&idt* @ 6#
c.grid% @ -#
c.grid @ A#
gridbag.setConstraints(buton+ c)#
contentHane.add(buton)#
buton @ ne& JSutton(!Sutton ,!)#
c.ipad @ -# DDse revine la inaltimea implicita
c.&eig*t @ A.-# DDspatiu vertical intre celule
suplimentar
c.anc*or @ )ridSagConstraints.S:_Q># DDcomponenta va
1i plasata in partea de jos a 1erestrei
c.insets @ ne& 9nsets(A-+-+-+-)#
128
c.grid% @ A# DDcomponenta se aliniea3a cu
butonul B
c.grid&idt* @ B# DDocupa latimea a doua butoane
c.grid @ B# DDse a1la pe a treia linie
gridbag.setConstraints(buton+ c)#
contentHane.add(buton)#
addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
$
public static void main(String args[]) {
(plic)ridSag;aout &indo& @ ne& (plic)ridSag;aout()#
&indo&.setQitle(!J%emplu )ridSag;aout!)#
&indo&.pacN()#
&indo&.setUisible(true)#
$
$
Rezultatul execu[iei acestui program este:
E.0. 5ratarea evenimentelor
Apsarea unei taste sau a unui buton al mouse-ului declaneaz un
eveniment. Pentru a trata evenimentul este necesar un obiect care s implementeze
interfa[a corespunztoare i s fie nregistrat ca un consumator de evenimente
(event listener). Componentele Swing pot genera mai multe tipuri de evenimente.
Cteva dintre interfe[ele corespunztoare ar fi:
(ction;istener
ac[iuni asupra unui control (click pe un
buton, Enter dup introducerea unui text ntr-
129
un cmp, selectarea ntr-un meniu)
Component;istener
redimensionri, deplasri, ascunderi ale
unei componente
Pocus;istener
preluare / pierdere focus
9tem;istener
selec[ie / deselec[ie obiect n list,
meniu, etc.
Qe%t;istener
modificarea textului din control
(djustment;istener
modificarea unei valori variind ntre
dou limite (ex: ScrollBar)
ae;istener
ac[ionarea unei taste
.ouse;istener
apsarea butonului mouse-ului n timp
ce cursorul se afl pe componenta respectiv
.ouse.otion;istener
drag; micarea mouse-ului pe o
component
Zindo&;istener
nchidere, minimizare, maximizare etc.
Container;istener
adugare, tergere component
ListSelectionListener schimbarea selec[iei ntr-o tabel sau
ntr-o list
Fiecare eveniment este reprezentat de un obiect care d informa[ii despre
eveniment i identific sursa evenimentului. Fiecare generator de eveniment poate
avea mai mul[i consumatori.
generator obiect eveniment /----> consummator de eveniment
de eveniment------------------------------------------> consummator de eveniment
\----> consummator de
eveniment
Un eveniment, o dat aprut, este distribuit tuturor asculttorilor nregistra[i (nu
este consumat numai de primul).
Aa cum am spus mai devreme, pentru ca evenimentele unei componente s
fie interceptate de ctre o instan[ a unei clase asculttor, aceast clas trebuie
nregistrat n lista asculttorilor componentei respective. Am spus list, deoarece
evenimentele unei componente pot fi ascultate de oricte clase - cu condi[ia ca
acestea s fie nregistrate la componenta respectiv. nregistrarea unei clase n lista
asculttorilor unei componente se face cu metode din clasa Component de tipul
130
addQQQListener, iar eliminarea ei din aceasta lista cu removeQQQListener unde
CCC reprezint tipul evenimentului.
E.0.1. 7(emplu de tratare a unui eveniment
Sunt necesari urmtorii pai:
1. Clasa trebuie s implementeze interfa[a corespunztoare sau s
extind o clas care implementeaz interfa[a.
public class NumeClasa implements (ction;istener {...$

2. Scrierea codului care nregistreaz o instan[ a clasei (care va
consuma evenimentul) ca i consumator pentru una sau mai multe componente.
Componenta.add(ction;istener(instantaNumeClasa)#

3. Scrierea codul care implementeaz metodele din interfa[a
consumator.
public void actionHer1ormed((ctionJvent e) {
//cod care reacioneaza la aciune
$

12emplu '::
import java%.s&ing.'#
import java.a&t.'#
import java.a&t.event.'#
public class (plicJv e%tends JPrame{
JSutton uS+lS+rS#
JHanel pbut#
JQe%tPield t%t#
;istener lsn#
Qe%tZorNer t%tZorNer#
public (plicJv() {
uS@ne& JSutton(!.ajuscule!)#
lS@ne& JSutton(!.inuscule!)#
rS@ne& JSutton(!Sterge!)#
uS.set(ctionCommand(!(ct.ajuscule!)#
lS.set(ctionCommand(!(ct.inuscule!)#
131
pbut@ne& JHanel()#
pbut.add(uS)#
pbut.add(lS)#
pbut.add(rS)#
t%t@ ne& JQe%tPield(!9ntroduceti te%t"!)#
lsn@ne& ;istener()#
getContentHane().set;aout(ne& Sorder;aout())#
getContentHane().add(!Nort*!+t%t)#
getContentHane().add(!Center!+lsn)#
getContentHane().add(!Sout*!+pbut)#
t%tZorNer@ne& Qe%tZorNer(t%t)#
rS.add(ction;istener(lsn)#
uS.add(ction;istener(lsn)#
lS.add(ction;istener(lsn)#
rS.add(ction;istener(t%tZorNer)#
uS.add(ction;istener(t%tZorNer)#
lS.add(ction;istener(t%tZorNer)#
$
public static void main(String[] args) {
(plicJv 1@ne& (plicJv()#
1.addZindo&;istener(ne& Zindo&(dapter() {
public void &indo&Closing(Zindo&Jvent e) {
Sstem.e%it(-)#
$
$)#
1.addZindo&;istener(1.lsn)#
1.setSi3e(=--+ AB,)#
DD1.pacN()#
1.setUisible(true)#
$
$
class Qe%tZorNer implements (ction;istener {
private JQe%tPield t%t#

public Qe%tZorNer(JQe%tPield t%t){
t*is.t%t@t%t#
$

public void actionHer1ormed((ctionJvent e){
String c@e.get(ctionCommand()#
i1(c.eYuals(!Sterge!))
t%t.setQe%t(!!)#
i1(c.eYuals(!(ct.ajuscule!)){
String oldQe%t@t%t.getQe%t()#
String uQe%t@oldQe%t.to_pperCase()#
t%t.setQe%t(uQe%t)#
$
i1(c.eYuals(!(ct.inuscule!)){
String oldQe%t@t%t.getQe%t()#
132
String lQe%t@oldQe%t.to;o&erCase()#
t%t.setQe%t(lQe%t)#
$
$
$
class ;istener e%tends JQe%t(rea implements (ction;istener+
Zindo&;istener{
public ;istener(){
super()#
t*is.setJditable(1alse)#
$
public void actionHer1ormed((ctionJvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&Closed(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&:pened(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&Closing(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&9coni1ied(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&Weiconi1ied(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&(ctivated(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
public void &indo&Weactivated(Zindo&Jvent e){
append(e.paramString()?! [ !?e.toString()?! ]5n!)#
$
$
Rezultatul execu[iei programului este:
E.1. 6olosirea componentelor
E.1.1. Clasa JLabel
133
Un obiect de tip JLabel >etic#et"? reprezint o component pentru plasarea
unui text pe o suprafa[ de afiare. O etichet este format dintr-o singur linie de
text static ce nu poate fi modificat de ctre utilizator, dar poate fi modificat din
program.
E.1.2. Clasa JPutton
Un obiect de tip JPutton >buton? reprezint o component pentru plasarea
unui buton etichetat pe o suprafa[ de afiare.
E.1.+. Clasa J5e(t6ield
Un obiect de tip J5e(t6ield definete un control de editare a textului pe o
singur linie. Este util pentru interogarea utilizatorului asupra unor valori.
E.1.-. Clasa J5e(t4rea
Un obiect de tip J5e(t4rea definete un control de editare a textului pe mai
multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc .
E.1... Clasa JC#ecRPo(
Un obiect de tip JC#ecRbo( >comutator? reprezint o component care se
poate afla n dou stri : "selectat" sau "neselectat" (on/off). Ac[iunea utilizatorului
asupra unui comutator l trece pe acesta n starea complementar celei n care se
gsea. Este folosit pentru a prelua o anumit op[iune de la utilizator.
E.1.0. Clasa JAadioPutton
Un obiect de tip JAadioPutton definete un grup de comutatoare din care
doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio
butoane.
134
E.1.1. Clasa JComboPo(
Un obiect de tip JComboPo( definete o list" de opiuni din care utilizatorul
poate selecta una singur. La un moment dat, din ntreaga lista doar o singur
op[iune este vizibil, cea selectat. O component JComboBox este nso[it de un
buton etichetat cu o sgeat vertical la apsarea cruia este afiat ntreaga sa
list, pentru ca utilizatorul s poat selecta o anumit op[iune.
E.1.D. Clasa JList
Un obiect de tip JList definete o list" de opiuni care poate fi setat astfel
nct utilizatorul s poat selecta o singur op[iune sau mai multe. Toate op[iunile
listei sunt vizibile n limita dimensiunilor grafice ale componentei.
E.1.E. Clasa J8crollPar
Un obiect de tip J8crollbar definete o bar" de de!ilare vertical sau
orizontal. Este util pentru punerea la dispozi[ie a utilizatorului a unei modalit[i
sugestive de a alege o anumit valoare dintr-un interval.
1. ntroducere n limbajul de programare Java..................................................1
1.1. Ce este Java?......................................................................................... 1
1.2. Limbajul de programare Java ................................................................1
1.3. Java : un limbaj compilat i interpretat....................................................3
1.4. storia limbajului Java.............................................................................3
1.5. Mediul Java............................................................................................ 4
1.6. Crearea unei aplica[ii simple ..................................................................5
1.7. Crearea unui applet................................................................................6
2. Programarea Orientat pe Obiecte i Java...................................................7
2.1. Obiecte i clase...................................................................................... 7
2.2. Atribute i comportamente......................................................................8
2.2.1. Atribute............................................................................................. 8
2.2.2. Comportament.................................................................................9
135
2.3. Principiile OOP..................................................................................... 10
3. Elementele de baz ale limbajului de programare Java..............................11
3.1. Structura lexical a limbajului...............................................................11
3.1.1. Setul de caractere..........................................................................11
3.1.2. Cuvinte cheie.................................................................................11
3.1.3. dentificatori....................................................................................12
3.1.4. Constante....................................................................................... 12
3.1.5. Separatori...................................................................................... 13
3.1.6. Operatori........................................................................................ 13
3.1.7. Comentarii......................................................................................17
3.2. Tipuri de date........................................................................................ 17
3.3. Variabile................................................................................................ 18
3.4. nstruc[iuni............................................................................................ 20
3.4.1. nstruc[iunea vid...........................................................................20
3.4.2. nstruc[iuni de decizie.....................................................................20
3.4.3. nstruc[iuni repetitive......................................................................23
3.5. Tablouri (vectori)...................................................................................28
3.5.1. Tablouri (vectori) unidimensionale..................................................28
3.5.2. Tablouri (vectori) cu mai multe dimensiuni.....................................30
3.5.3. Dimensiunea unui vector ...............................................................30
3.5.4. Tablouri cu dimensiuni variabile.....................................................32
3.6. Siruri de caractere................................................................................32
4. Clase i obiecte n Java..............................................................................34
4.1. Referin[e............................................................................................... 34
4.2. Obiecte................................................................................................. 35
4.2.1. No[iuni generale.............................................................................35
4.2.2. Operatorul de atribuire =................................................................36
4.2.3. Operatorul de egalitate ==..............................................................38
4.3. Clase.................................................................................................... 39
4.3.1. Definirea claselor...........................................................................39
4.3.2. Variabile membru...........................................................................40
4.3.3. Metode........................................................................................... 42
4.3.3.1 Definirea metodelor..................................................................42
4.3.3.2 Modificatorii metodelor..............................................................42
136
4.3.3.3 Tipul returnat de o metod........................................................43
4.3.3.4 Parametrii unei metode.............................................................44
4.3.4. Constructorii unei clase..................................................................45
4.3.5. Obiectul this...................................................................................47
4.3.6. Suprancrcarea i supradefinirea metodelor.................................49
4.3.7. Modificatori de acces pentru membrii unei clase............................50
4.3.8. Membrii instan[ i membrii clas..................................................51
4.3.9. Argumente n linia de comand......................................................54
4.4. Motenirea............................................................................................56
4.4.1. Principiul motenirii........................................................................56
4.4.2. nterfe[e.......................................................................................... 60
4.5. Probleme..............................................................................................63
5. Pachete....................................................................................................... 71
5.1. mportul unui pachet, al unei clase sau a unei interfe[e........................72
5.2. Crearea unui pachet.............................................................................73
6. Excep[ii ...................................................................................................... 78
6.1. Aspecte generale..................................................................................78
6.2. nstruc[iunea try....................................................................................79
6.3. Crearea unei excep[ii............................................................................81
7. ntrri i ieiri ..............................................................................................85
7.1. Clasificarea fluxurilor............................................................................86
7.2. erarhia claselor pentru lucrul cu fluxuri................................................86
7.2.1. Fluxuri de caractere........................................................................86
7.2.2. Fluxuri de octe[i..............................................................................87
7.3. Superclasele de intrare / ieire.............................................................88
7.4. Crearea unui flux..................................................................................89
7.5. Citirea datelor de la tastatur................................................................90
7.5.1. Obiectul System.in.........................................................................90
7.5.2. Clasa nputStreamReader..............................................................91
7.5.3. Clasa BufferedReader....................................................................91
7.6. Citirea i scrierea datelor din fiier.......................................................92
7.6.1. Clasele FileReader i FileWriter ....................................................92
8. Applet-uri .................................................................................................... 94
8.1. Ce este un applet?................................................................................94
137
8.2. Func[iile unui applet .............................................................................95
8.3. Structura general a unui applet ..........................................................96
8.4. HTML.................................................................................................... 97
8.5. Exemple................................................................................................ 98
9. nterfe[e grafice......................................................................................... 105
9.1. Ce este o interfa[ grafic?.................................................................105
9.2. Primele aplica[ii Swing........................................................................106
9.2.1. Exemple....................................................................................... 106
9.2.2. Comentarea exemplelor...............................................................108
9.2.2.1 Alegerea naturii interfe[ei .......................................................108
9.2.2.2 Setarea container-ului principal (din vrful ierarhiei)...............108
9.2.2.3 Manipularea evenimentelor.....................................................109
9.3. Containere principale..........................................................................109
9.3.1. Clasa JFrame...............................................................................110
9.3.2. Ferestre secundare i clasa JDialog ...........................................111
9.3.3. Clasa JWindow ...........................................................................115
9.3.4. Clasa JApplet ..............................................................................116
9.4. Containere intermediare.....................................................................116
9.5. Folosirea gestionarilor de pozi[ionare (Layout Manager)....................119
9.5.1. Setarea pozi[ionrii (Layout Managerului)..................................120
9.5.1.1 BorderLayout..........................................................................120
9.5.1.2 BoxLayout...............................................................................121
9.5.1.3 CardLayout.............................................................................123
9.5.1.4 FlowLayout.............................................................................124
9.5.1.5 GridLayout .............................................................................125
9.5.1.6 GridBagLayout .......................................................................126
9.6. Tratarea evenimentelor ......................................................................129
9.6.1. Exemplu de tratare a unui eveniment ..........................................131
9.7. Folosirea componentelor....................................................................133
9.7.1. Clasa JLabel................................................................................133
9.7.2. Clasa JButton ..............................................................................134
9.7.3. Clasa JTextField .........................................................................134
9.7.4. Clasa JTextArea ..........................................................................134
9.7.5. Clasa JCheckBox.........................................................................134
138
9.7.6. Clasa JRadioButton .....................................................................134
9.7.7. Clasa JComboBox .......................................................................135
9.7.8. Clasa JList ...................................................................................135
9.7.9. Clasa JScrollBar ..........................................................................135
139

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