Sunteți pe pagina 1din 118

Exemplu 2: Fie programul public class OpLogic{ public static void main(String args[]){ byte a=0; System.out.

println("Primul if"); if ((a!=0) && ((1/a)<1)) System.out.println("Ambele conditii else System.out.println("O conditie este System.out.println("Al doilea if"); if ((1/a<1) && (a!=0)) System.out.println("Ambele conditii else System.out.println("O conditie este } } Rezultatul afiat este: Primul if O conditie este falsa Al doilea if Exception in thread main java.lang.ArithmeticException: / by zero at OpLogic.main(OpLogic.java:11)

sunt adevarate"); falsa"); sunt adevarate"); falsa");

Exemplu 3: S se calculeze maximul a dou numere. 1. public class Maxim 2. { public static void main(String args[]) 3. {int a=12, b=5,m; 4. if (a>b) 5. m=a; 6. else 7. m=b; 8. System.out.println("Maximul dintre "+a+" si "+b+" este: "+m); 9. } 10. }

Exemplu 4: S se rezolve ecuaia de gradul I ax+b=0 cunoscnd coeficienii a i b. 1. 2. 3. 4. 5. 6. 7. 8. public class ecGrI { public static void main(String args[]) {int a=12, b=5; System.out.print("Ecuatia: "+a+"x+"+b+"=0"); if (a==0) if (b==0) System.out.println(" are o infinitate de solutii"); else

9. 10. 11. 11. 12. 13.

System.out.println(" nu are solutii"); else { double x =-(double)b/a; System.out.println(" are solutia "+x); } } }

n exemplu 4 au fost folosite if-uri imbricate. Pe linia 10 a fost folosit operatorul de conversie pentru ca rezultatul mpririi s se fie numr real. Dac acest operator nu ar fi fost folosit, mprirea ar fi fost efectuat ntre doi operanzi ntregi i, prin urmare, rezultatul ar fi fost numr ntreg. 1. Instruciunea switch are forma: switch (expresie_selectare){ case val_1: instruciune_1; case val_2: instruciune_2; . . . case val_i: instruciune_i; . . . case val_n: instruciune_n; default: instruciune; } Instruciunea switch selecteaz break; break; break; break; dintre mai multe secvene de cod una care

va fi executat. Se evalueaz expresie_selectare; rezultatul obinut se compar pe rnd cu val_1, val_2, ..., val_n. Dac se ntlnete o valoare val_i pentru care se obine egalitate (expresie_selectare = val_i ) se execut

instruciunile instruciune_i. Altfel, (dac nu are loc nici o egalitate) se execut instruciunile de pe ramura default. Instruciune break ntlnit pe fiecare ramur are rolul de a ntrerupe execuia instruciunii switch dup ce au fost executate instruciunile aferente ramurii alese. Dac instruciunea break lipsete atunci se execut i instruciunile de pe urmtoarele ramuri pn la ntlnirea primului break. Exemplu 5: Se citete de la tastatur un caracter reprezentnd un operator: +, , * sau /. n funcie de operatorul citit s se fac suma, diferena, nmulirea sau mprirea celor dou numere a i b. 1. public class Operatii{ 2. public static void main(String args[]){ 3. double a=12, b=5, r=0;

4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. }

char oper=' '; try{ System.out.println("Introduceti operatorul"); oper=(char)System.in.read(); } catch(Exception e){} switch (oper) { case '+': r=a+b; break; case '-': r=a-b; break; case '*': r=a*b; break; case '/': r=a/b; break; default: System.out.println("Operator invalid"); System.exit(1); } System.out.println(a+" "+oper+" "+b+" = "+r); }

n linia 7 se citete un caracter de la tastatur memorat n oper i, n funcie de el se execut instruciunile de pe liniile 12, 14, 16, 18 sau 20-21. Instruciunile de pe liniile 20-21 se execut doar n cazul n care nu a fost introdus un operator corect. Exemplu 6: S se spun dac un numr dat mai mic dect 10 este par sau impar. 1. public class ParImpar{ 2. public static void main(String args[]){ 3. int x=2; 4. switch (x) { 5. case 0: 6. case 2: 7. case 4: 8. case 6: 9. case 8: 10. System.out.println(x+" este numar par");break; 11. default: 12. System.out.println(x+" este numar impar"); 13. } 14. } 15. } n exemplul precedent ne intereseaz ca aceeai instruciune, 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, instruciunea switch executnd prima instruciune

ntlnit dup gsirea potrivirii. Prin urmare, instruciunea break nu apare pe nici una din liniile 5, 6, 7,8.

1.1.1. Instruciuni repetitive


1. Instruciunea for repet un bloc de instruciuni ct timp o condiie este adevrat. n general, se cunoate de la nceput de cte ori urmeaz s se execute blocul de instruciuni. Are forma general: for (iniializare; test; incrementare) instruciuni unde:

iniializare este o expresie care iniializeaz variabila de control a instruciunii for

test este o expresie boolean evaluat naintea fiecrei reluri a buclei; ct timp valoarea ei este true blocul de instruciuni se execut. Cnd valoarea ei este false, se prsete instruciunea for.

incrementare este o expresie care modific variabila de control a instruciunii for. Oricare dintre cele trei pri constituente ale instruciunii for poate s

lipseasc. for ( ; ; ) n acest caz se obine o bucl infinit. Pentru a evita acest lucru este necesar ca n cadrul blocului de instruciuni s existe o condiie de oprire. De asemenea, blocul de instruciuni poate s lipseasc, el fiind nlocuit de instruciunea vid. Exemplul 8 de mai jos ilustreaz aceast situaie. Exemplu 7: S se calculeze n! unde n este iniializat n program. 2. public class Factorial{ 3. public static void main(String args[]){ 4. long f=1; 5. int n=15; 6. for(int i=2; i<=n; i++) 7. f*=i; //f=f*i; 8. System.out.println(n+"!="+f);

9. 10.

} }

Exemplu 8: S se calculeze n! unde n este iniializat n program. 1. public class Factorial{ 2. public static void main(String args[]){ 3. long f=1; 4. int n=15; 5. for(int i=2; i<=n; f*=i, i++) 6. ; 7. System.out.println(n+"!="+f); 8. } 9. } Dup cum se poate remarca, pe linia 6 este folosit instruciunea vid deoarece codul f*=i a fost mutat n cadrul prii de incrementare. O alt observaie ar fi c, oricare dintre prile constituente ale instruciunii for poate fi format din mai multe instruciuni. Acest lucru este ilustrat n programul urmtor. Exemplu 9: 1. public class Factorial{ 2. public static void main(String args[]){ 3. long f, LimSup; 4. int n=10,i; 5. LimSup=(long)Math.pow(2,63); 6. for(i=2,f=1; i<=n && f<=LimSup/i; f*=i,i++) 7. ; 8. if (i==n+1) 9. System.out.println(n+"!="+f); 10. else 11. System.out.println(n+"!=este prea mare pentru puterile mele"); 12. } 13. } n linia 5 este calculat numrul maxim reprezentabil, de tip long. n for, iniializm dou variabile i=2,f=1. Test-ul este format din dou condiii unite prin &&. Incrementarea este, de asemenea, format din dou instruciuni f*=i,i++. 11. Instruciunea while are forma: while (condiie) instruciuni

Instruciunea while este folosit pentru a repeta execuia unui grup de instruciuni atta timp ct condiie are valoare true.

Exemplu 10: S se calculeze suma cifrelor unui numr. 1. public class SumCifNr{ 2. public static void main(String args[]){ 3. long x=12345,xInit=x; 4. int s=0; 5. while(x>0){ 6. s+=x%10; 7. x/=10; 8. } 9. System.out.println("Suma cifrelor numarului "+xInit+" este: "+s); 10. } 11. } Instruciunea while se mai numete i instruciune cu test iniial. Dac la prima evaluarea a condiiei aceasta are valoarea false instruciunile din corpul while-ului nu se execut niciodat. n exemplul precedent, dac iniializm x cu 0, condiia x>0 este fals i se continu cu instruciunea din linia 9. 12. Instruciunea do-while are forma: do{ instruciuni }while (condiie); Ca i while, instruciunea do-while este folosit pentru a repeta execuia unui grup de instruciuni atta timp ct condiie are valoare true. Diferena dintre cele dou instruciuni este c, dac la while se executau instruciunile doar dac condiie era adevrat, n cazul lui do-while blocul de instruciuni se execut cel puin o dat dup care se verific valoarea condiiei. Instruciunea do-while se mai numete i instruciune cu test final. Exemplu 11: S se calculeze cel mai mare divizor comun a dou numere a i b. 1. 2. 3. public class Cmmdc{ public static void main(String args[]){ long a=54,b=68,r;

4.

System.out.print("Cmmdc-ul numerelor "+a+" si "+b+" este: "); 5. do{ 6. r=a%b; 7. a=b; 8. b=r; 9. }while(r>0); 10. System.out.println(a); 11. } 12. } 13. Instruciunea break break Este folosit pentru prsirea forat a corpurilor instruciunilor repetitive ( for, while, do-while). Exemplu 12: S se caute un numr cuprins n intervalul [a,b]. 1. public class ExBreak{ 2. public static void main(String args[]){ 3. int a=10, b=20, x; 4. while(true){ 5. x=(int)(Math.random()*b); 6. if ( (a<=x) && (x<=b) ) 7. break; 8. } 9. System.out.println(x); 10. } 11. } n linia 5 se genereaz aleator un numr ntreg mai mic dect b. Dac numrul este cuprins n intervalul [a,b] se prsete instruciunea while. Dac instruciunea break este plasat n cadrul mai multor instruciuni repetitive imbricate, ea are ca efect prsirea doar a instruciuni care o conine. Exemplu: 1. 2. 3. 4. 5. 6. 7. 8. 9. for(...){ ... for(...){ ... break; ... } ... }

Efectul instruciunii break este prsirea for-ului din linia 3, execuia continundu-se cu instruciunile de pe linia 8.

14. Instruciunea continue Are ca efect ntreruperea execuiei iteraiei curente i trecerea la iteraia urmtoare. Exemplu 13: Urmtorul cod afieaz toate caracterele citite cu excepia cifrelor de la 0 la 9. 1. public class ExContinue{ 2. public static void main(String args[]){ 3. for(int i=0; i<=10; i++){ 4. char c=' '; 5. try{ 6. c=(char)System.in.read(); 7. } 8. catch(Exception e){} 9. if ( ('0'<=c) && (c<='9') ) 10. continue; 11. System.out.print(c+" "); 12. } 13. } 14. } n cazul n care se citete o cifr, se execut instruciunea continue de pe linia 10, nu se mai execut linia 11 i se sare direct la linia 3. Observaie: Instruciunile break i continue pot s apar doar n cadrul unor instruciuni repetitive. Excepie face instruciunea break care poate s apar i n cadrul instruciunii switch.

1.2. Tablouri (vectori)

1.2.1. Tablouri (vectori) unidimensionale


Declararea unui vector se face prin

TipElement[] numeVector; unde TipElement

sau

TipElement numeVector[];

reprezint tipul elementelor vectorului, iar parantezele []

aezate fie naintea fie dup numele vectorului arat c este vorba despre un vector. Exemple: int[] v; String adrese[]; Instanierea unui vector se realizeaz cu operatorul new i are ca efect alocarea memoriei necesare pentru memorarea elementelor vectorului, mai precis specificarea numrului maxim de elemente pe care l va avea vectorul. Instanierea unui vector se face astfel: numeVector = new TipElement[dimensiune]; Exemple: v = new int[10]; //se aloc spaiu pentru 10 ntregi adrese = new String[100]; //se aloc spaiu pentru 100 de String-uri

Declararea i instanierea unui vector pot fi fcute simultan astfel: TipElement[] numeVector = new TipElement[dimensiune]; Exemple: int [] v = new int[10]; Dup declararea unui vector, acesta poate fi iniializat, adic elementele sale pot primi valori. n acest caz instanierea lipsete, alocarea memoriei fcndu-se automat n funcie de numrul de elemente cu care se iniializeaz vectorul. Exemple: String culori[] = {"Rosu", "Galben", "Verde"}; int []v = {2, 4, 6, 8, 10, 12}; Observaii: Primul indice al unui vector este 0, deci poziiile unui vector cu n elemente vor fi cuprinse ntre 0 i n-1. Nu sunt permise construcii de genul: 9

TipElement numeVector[dimensiune]

alocarea memoriei fcndu-se doar prin intermediul operatorului new sau prin
iniializare.

Exemple: int v[10]; //incorect int v[] = new int[10]; //corect Accesul la elementul unui vector se face prin: numeVector[indice] Exemplu 1: int v[]=new int[10]; for(i=0; i<10; i++) v[i]=i; Exemplu 2: int v[]={1,2,3,4,5}; for(i=0; i<5; i++) System.out.println(v[i]+ );

1.2.2. Tablouri (vectori) cu mai multe dimensiuni


n Java tablourile cu mai multe dimensiuni sunt de fapt vectori de vectori. Prin urmare, declararea, instanierea i iniializarea se fac la fel ca n cazul vectorilor unidimensionali.
TipElement numeVector[][] = new TipElement[dim1][dim2] sau TipElement[][] numeVector = new[dim1][dim2] TipElement sau parantezele pot fi de o parte i de alta a lui numeVector.

Exemplu: int m[][]; m = new int[5][10]; Observaie: //declararea unei matrice //cu 5 linii, 10 coloane

m[0], m[1], ..., m[4] sunt vectori de ntregi cu 10 elemente

1.2.3. Dimensiunea unui vector


10

Cu ajutorul cuvntului cheie length se poate afla dimensiunea unui vector. Exemple: Fie vectorul int []a = new int[5]; atunci a.length are valoarea 5. Fie matricea int m = new int[5][10]; atunci: m.length are valoarea 5 i reprezint numrul de linii al matricei m[0].length are valoarea 10 i reprezint numrul de elemente al primei linii a matricei, m[1].length are valoarea 10 i reprezint numrul de elemente al celei de-a doua linii a matricei, etc. Exemplu 14: S se calculeze minimul elementelor unui vector. 1. public class MinVect{ 2. public static void main(String args[]){ 3. int a[]={2,1,4,7,3}; 4. int min=a[0]; 5. for(int i=0; i<a.length; i++) 6. if (min>a[i]) 7. min=a[i]; 8. System.out.println("Minimul este "+min); 9. } 10. } Exemplu 15: S se ordoneze elementele de pe diagonala principal a unei matrice. 1. public class OrdDiagPrinc{ 2. public static void main(String args[]){ 3. int a[][]={{2,1,4,7},{3,5,1,8},{2,5,1,9},{3,2,5,8}}; 4. boolean ordonat; 5. for(int i=0; i<a.length; i++){ 6. for(int j=0; j<a[i].length; j++) 7. System.out.print(a[i][j]+" "); 8. System.out.println(""); 9. } 10. do{ 11. ordonat=true; 12. for(int i=0; i<a.length-1; i++) 13. if (a[i][i]>a[i+1][i+1]){ 14. int aux=a[i][i]; 15. a[i][i]=a[i+1][i+1]; 16. a[i+1][i+1]=aux;

11

17. ordonat=false; 18. } 19. }while(!ordonat); 20. System.out.println("Matricea cu diagonala ordonata:"); 21. for(int i=0; i<a.length; i++){ 22. for(int j=0; j<a[i].length; j++) 23. System.out.print(a[i][j]+" "); 24. System.out.println(""); 25. } 26. } 27. }

1.2.4. Tablouri cu dimensiuni variabile


Java permite folosirea tablourilor cu dimensiuni variabile adic, a vectorilor de vectori cu dimensiuni variabile. Exemplu 16: S se genereze i s se afieze triunghiul lui Pascal. 1. public class TrPascal{ 2. public static void main(String args[]){ 3. int []a[]=new int[10][]; 4. a[0]=new int[1]; 5. a[1]=new int[2]; 6. a[0][0]=a[1][0]=a[1][1]=1; 7. for(int i=2; i<a.length; i++){ 8. a[i]=new int[i+1]; 9. a[i][0]=a[i][i]=1; 10. for(int j=1; j<a[i].length-1; j++) 11. a[i][j]=a[i-1][j-1]+a[i-1][j]; 12. } 13. for(int i=0; i<a.length; i++){ 14. for(int j=0; j<a[i].length; j++) 15. System.out.print(a[i][j]+" "); 16. System.out.println(""); 17. } 18. } 19. } 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.

12

1.3. iruri de caractere


n Java, un ir de caractere poate fi reprezentat printr-un vector format din elemente de tip char, un obiect de tip String sau un obiect de tip StringBuffer. Exemple echivalente de declarare a unui ir: String str = "abc"; char data[] = {'a', 'b', 'c'}; String str = new String(data); String str = new String("abc"); Concatenarea irurilor de caractere se face prin intermediul operatorului +. String str1 = "abc" + "xyz"; String str2 = "123"; String str3 = str1 + str2; 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. Exemplu: System.out.print("Vectorul elemente"); v are" + v.length + "

13

2. Clase i obiecte n Java


2.1. Referine
Dup cum am artat n capitolul 2, o clas este un ablon pentru mai multe obiecte cu caracteristici asemntoare. Un obiect este o colecie 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 conine o referin ctre un obiect al clasei respective. Cu alte cuvinte, variabila nu va conine 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 referin. 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 curenie oferit de limbajul Java garbage collector (colectorul de gunoaie). obiectele nu sunt coninute 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 informaia din obiect se modific, schimbarea este vizibil n ambele variabile. O variabil referin poate conine 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.

14

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

2.2.1. Noiuni generale


n Java obiectele sunt create prin instanierea unei clase, cu alte cuvinte prin crearea unei instane a unei clase. Declararea obiectului se face prin: NumeClasa numeObiect; Exemplu: String s; Complex c; n urma declarrii, variabila este iniializat cu null. Crearea obiectului echivalent cu instanierea clasei se realizeaz prin intermediul operatorului new i presupune alocarea spaiului de memorie necesar pstrrii obiectului. Adresa (referina) ctre obiectul respectiv o s fie memorat n variabila numeObiect. numeObiect = new NumeClasa(); Exemplu: s=new String() ; Complex c=new Complex(2,3); Declararea i crearea obiectului pot fi fcute pe aceeai linie. Exemplu: String s=new String() ; Complex c=new Complex(2,3); n momentul n care se realizeaz crearea obiectului are loc i iniializarea lui. Atenie Spaiul de memorie nu este alocat n momentul declarrii obiectului. Exemplu:

15

Complex c; c.re = 10; //EROARE! Alocarea memoriei se face doar la apelul instruciunii new ! Referirea valorii unei variabile se face prin
obiect.variabila

Exemplu: Complex c = new Complex(); c.re = 2; c.im = 3; System.out.println("Re=" +c.re+ "

Im="+c.im);

Observaie: Accesul la variabilele unui obiect se face n conformitate cu drepturile de acces pe care le ofer variabilele respective celorlalte clase. Apelul unei metode se face prin
obiect.metoda([parametri])

Exemplu: Complex c = new Complex(); c.setRe(2); c.setIm(3); 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 dispoziie 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. Referinele (care sun de fapt variabile) sunt distruse:

natural, atunci cnd variabila respectiv nu mai este folosit (de exemplu, la terminarea unei metode) explicit, dac atribuim variabilei respective valoare null.

2.2.2. Operatorul de atribuire =


n cazul n care operatorul = este folosit mpreun cu date de tip primitiv, are loc o atribuire de valori. Exemplu:

16

int x = 12, y = 10; x = y; 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. Exemplu: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. class Nimic{ int x; } class Test{ public static void main(String args[]){ Nimic a1=new Nimic(),a2; a1.x=10; a2=a1; System.out.println(a1.x+" "+a2.x); a1.x=5; System.out.println(a1.x+" "+a2.x); } }

n linia 7 se modific valoarea atributului x a obiectului a1. n linia 8 coninutul variabilei a1 se copiaz n a2. Se afieaz 10 10. Se schimb valoarea atributului lui a1 i, ne-am atepta s se afieze 5 10 dar se afieaz 5 5. Nu este greit! n linia 8 se copiaz valoarea lui a1 adic referina ctre obiect n a2. Din acest moment exist un singur obiect ctre care refer att a1 ct i a2. Orice modificare are loc asupra obiectului, ea este vzut i de a1 i de a2. Exemplu: public class Test{ public static void main(String args[]){ int[] a1={1,2,3,4,5}; int[] a2; a2=a1; for(int i=0; i<a1.length; i++) a2[i]++; for(int i=0; i<a1.length; i++) System.out.print(a1[i]+" "); System.out.println(""); for(int i=0; i<a2.length; i++) System.out.print(a2[i]+" "); } }

17

Rezultatul este: 23456 23456

2.2.3. Operatorul de egalitate ==


n cazul n care operatorul == este folosit mpreun cu date de tip primitiv, are loc o testare a egalitii valorilor celor dou variabile. Exemplu: int x = 12, y = 10, z = 12; x == y are valoarea false; x i y au valori diferite x == z are valoarea true; x i z 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. Exemplu: 1. 2. 3. 4. 5. 6. class Nimic{ int x; Nimic(int x){ this.x=x; } }

7. class Test{ 8. public static void main(String args[]){ 9. Nimic a1=new Nimic(1),a2=new Nimic(1); 10. if(a1==a2) 11. System.out.println("Sunt egale"); 12. else 13. System.out.println("Nu sunt egale"); 14. a2=a1; 15. if(a1==a2) 16. System.out.println("Sunt egale"); 17. else 18. System.out.println("Nu sunt egale"); 19. } 20. } n linia 9 se creeaz dou obiecte cu aceeai valoare. Totui testul din linia 10 are ca rezultat valoarea false. Dup linia 14 cele dou variabile refer acelai obiect i, prin urmare, testul din linia 15 are ca rezultat valoarea true. 18

2.3. Clase

2.3.1. Definirea claselor


[public][abstract][final] class NumeClasa [extends NumeSuperclasa] [implements Interfata1 [, Interfata2 ... ]] { //corpul clasei } Antetul clasei: [public][abstract][final] class NumeClasa este format din modificatorii clasei, cuvntul rezervat class i numele clasei NumeClasa. Prezena parantezelor [] indic faptul c ceea ce este cuprins ntre ele este opional. Modificatorii 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 aparine clasa (dac nu se specific un anume pachet, toate clasele din directorul curent sunt considerate a fi n acelai pachet). Spaiul 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 fi instaniat, dar poate fi extins de alte clase care s implementeze metodele nedefinite. Doar clasele abstracte pot s conin 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.

19

Observaie: O clas declarat att abstract ct i final genereaz eroare. Dac clasa este abstract nseamn c ea conine 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 interfeele implementate. O clas poate moteni o singur clas, prin urmare dac apare clauza extends ea este urmat doar de numele unei clase. ns, o clas poate implementa mai multe interfee, ale cror nume apar dup clauza implements i trebuie separate prin virgul. Asupra motenirii i interfeelor se gsesc mai multe detalii n subcapitolele Motenire respectiv Interfee. Corpul unei clase urmeaz dup antetul clasei i este cuprins ntre acolade. Conine:

declararea variabilelor variabilele membru;

instan i clas care mpreun formeaz

definirea metodelor instan i clas care mpreun formeaz metodele membru.

Observaie: variabilele unei clase pot avea acelai nume cu metodele clasei.

2.3.2. Variabile membru


Variabilele se declar de obicei naintea metodelor, dei acest lucru nu este impus de compilator. class NumeClasa { //declararea variabilelor //declararea 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;

20

dac este constant sau nu; tipul variabilei: instan sau clas

Tiparul declarrii unei variabile este:


[modificatori] TipDeDate numeVariabila [ = valoareInitiala ] ;

unde un modificator poate fi :


un specificator de acces: public, protected, private; unul din cuvintele rezervate: static, final, transient, volatile. double x; protected static int n; public String s = "abcd"; private Point p = new Point(10, 10); final long MAX = 100000L;

Exemple:

Detalii despre modificatorii de acces se gsesc n subcapitolul Modificatori de acces pentru membrii unei clase. Cuvintele rezervate: static, final, transient, volatile au urmtoarele
roluri:

static este folosit pentru declararea variabilelor clas.

Exemplu: int x ; //variabil instan static int nrDeObiecteCreate; //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.

Exemplu: se declar i se iniializeaz o variabil final (linia 1). Valoarea ei nu mai poate fi modificat (linia 3). 1. 2. 3. final double PI = 3.14 ; ... PI = 3.141 // eroare la compilare

Exemplu: se declar o variabil final (linia 2). n linia 4 se iniializeaz iar n linia 5 se dorete modificarea valorii ei. 1. 2. 3. class Test { final int MAX; Test() { 21

4. 5. 6. 7.

MAX = 100; MAX = 200; } }

// legal // ilegal -> eroare la compilare

transient este folosit la serializarea obiectelor, pentru a specifica ce variabile membru ale unui obiect nu participa la serializare. volatile este folosit pentru a semnala compilatorului s nu execute anumite optimizri asupra membrilor unei clase. Este o facilitate avansat a limbajului Java.

2.3.3. Metode

2.3.3.1 Definirea metodelor


Metodele sunt folosite pentru descrierea comportamentului unui obiect. O metod se declar astfel: [modificatori] TipReturnat numeMetoda ([argumente]) [throws TipExceptie] { //corpul metodei }

2.3.3.2 Modificatorii metodelor


Un modificator poate fi :

un specificator de acces: public, protected, private; unul din cuvintele rezervate: static, abstract, final, native,
synchronized.

Detalii despre modificatorii de acces se gsesc n subcapitolul Modificatori de acces. Cuvintele rezervate: static, abstract, final, native, synchronized
au urmtoarele roluri:

static este folosit pentru declararea metodelor clas. void metoda1() ; static void metoda2(); //metoda de instanta //metoda de clasa

Exemplu:

22

abstract este folosit pentru declararea metodelor abstracte. O metod abstract este o metod care nu are implementare i trebuie s aparin 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.

native este folosit pentru refolosirea unor funcii scrise n alt limbaj de programare dect Java (C de exemplu).
synchronized este folosit n cazul n care se lucreaz cu mai multe fire de

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

2.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 TipReturnat este void.
Exemplu: void afisareRezultat()

Returnarea valorii de ctre o metod se realizeaz prin intermediul instruciunii


return.

Dac o metod returneaz o valoare de un tip de baz atunci tipul ei trebuie s coincid cu TipReturnat, n caz contrar se primete eroare la compilare. Exemplu: Metod care calculeaz maximul a dou numere public int max(int a, int b){ return a>b?a:b; } 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. 23

2.3.3.4 Parametrii unei metode


Dup cum am vzut, numele clasei este urmat de lista parametrilor (argumentelor), list care este opional (o metod poate s nu aib parametrii). Parametrii sunt specificai prin numele i tipul lor, fiind desprii unul de altul prin virgul. NumeMetoda([tip1 argument2] ... ) argument1], [tip2

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 salariu){ ... } adaugarePersoana(String nume, int varsta, float

unde String este tip referin, int i float 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. Exemplu: public int max(int a,b){...} //este greit public int max(int a, int b){ ...} //este 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 diferenierea se va face prin intermediul variabile this. Vezi subcapitolul Obiectul this Exemplu: class Complex{ int re,im; public schimba(int re, int im){ this.re = re; this.im = im; } } Atenie: n Java argumentele sunt trimise doar prin valoare !!!

24

Asta nsemn c metoda recepioneaz 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 iniial al metodei (modificrile fcute n cadrul metodei sunt pierdute). Cnd argumentul este de tip referin metoda nu poate schimba referina 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!).

2.3.4. Constructorii unei clase


Constructorii unei clase sunt metode speciale care au acelai nume cu cel al clasei, nu returneaz nici o valoare i sunt folosii pentru iniializarea obiectelor acelei clase n momentul instanierii lor. Constructorii controleaz modul n care un obiect este creat i iniializat. Class COMPLEX { COMPLEX() { //constructor } } O clas poate avea unul sau mai muli constructori care trebuie ns s difere prin lista de parametri primii. Astfel sunt permise diferite tipuri de iniializri ale obiectului la crearea sa, n funcie de numrul parametrilor cu care este apelat constructorul. Exemplu: 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 911. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. class COMPLEX { double re, im; COMPLEX () { re=im=0; } COMPLEX (double r, double i ) { re=r; im=i; } COMPLEX (double r) { re=r; im=0;

25

11. } 12. } Constructorii sunt apelai automat la instanierea unui obiect. n cazul n care dorim s apelm explicit constructorul unei clase folosim metoda this(argumente), care apeleaz constructorul corespunztor (ca argumente) al clasei respective. Aceast metod este folosit atunci cnd sunt implementai mai muli constructori pentru o clas pentru a nu repeta secvenele de cod scrise la constructorii cu mai puine argumente. Exemplu: n clasa COMPLEX a fost definit constructorul cu doi parametrii. Ceilali doi constructori fac apel la constructorul cu doi parametrii n liniile 4 i 10. 1. 2. class COMPLEX { double re, im; COMPLEX () { this(0,0); } COMPLEX (double r, double i ) { re=r; im=i; } COMPLEX (double r) { this(r,0); }

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. }

Dac ntr-o clas nu este definete nici un constructor, sistemul i creeaz automat un constructor implicit care nu primete nici un argument. El iniializeaz variabilele membru de tipuri primitive cu 0 i pe cele de tipuri referin cu null. Deci prezena constructorilor n corpul unei clase nu este obligatorie. Dac ntr-o clas a fost definit cel puin un constructor cu parametrii, atunci constructorul implicit (fr parametrii) nu va mai fi creat automat. Exemplu: n clasa COMPLEX nu a fost definit nici un constructor. n linia 5 se apeleaz constructorul implicit creat automat pentru clasa Complex. 1. 2. 3. 4. 5. class COMPLEX { double re, im; } ... COMPLEX c= new COMPLEX ();

26

Exemplu: n clasa COMPLEX au fost definii 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. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. class COMPLEX { double re, im; COMPLEX (double r, double i ) { re=r; im=i; } COMPLEX (double r) { this(r,0); } } ... COMPLEX c= new Complex(); //eroare

Constructorii unei clase pot avea urmtorii specificatori de acces: private: nici o alt clas nu poate instania obiecte ale acestei clase. O astfel de clas poate conine metode publice care s-i creeze propriile obiecte i s le returneze altor clase; public: orice clas poate crea instane ale clasei respective; protected: doar subclasele pot crea obiecte de tipul clasei respective. Dac specificatorul lipsete, doar clasele din acelai pachet pot crea instane ale clasei respective.

2.3.5. Obiectul this


Obiectul this este o referin ctre obiectul curent. Este folosit n trei situaii:

n cadrul unei metode care are parametrii cu nume identic cu numele atributelor clasei. n aceast situaie, trebuie fcut o diferen ntre cele dou. Cu this se calific atributele clasei.

Exemplu: Metoda schimba primete doi parametrii cu acelai nume cu atributele clasei: re i im. 1. 2. 3. class Complex{ int re,im; public schimba(int re, int im){

27

4. 5. 6. 7.

this.re = re; this.im = im; } }

n cadrul constructorilor pentru a apela ceilali constructori ai clasei.

Exemplu: n liniile 4 i 11 se apeleaz constructorul cu doi parametrii definit n liniile 6-9. 1. public class Rational{ 2. private long m,n; 3. public Rational(){ 4. this(0,1); 5. } 6. public Rational(long m,long n){ 7. this.m=m; 8. this.n=n; 9. } 10. public Rational(long m){ 11. this(m,1); 12. } 13. }

pentru a testa c obiectul primit ca parametru nu este chiar obiectul curent.

Exemplu: Clasa ContBancar conine metoda transfer 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 atenie codul din liniile 10, 11 observm c se adun suma primit (c.suma) la suma actual (this.suma) n cazul nostru, contul i dubleaz suma, dup care suma contului primit (c.suma) se face zero. 1. public class ContBancar{ 2. private long suma; 3. public ContBancar(){ 4. this(0); 5. } 6. public ContBancar(long suma){ 7. this.suma=suma; 8. } 9. public void transfer(ContBancar c){ 10. this.suma+=c.suma; 11. c.suma=0; 12. } 13. }

28

14. ... 15. ContBancar c=new ContBancar(100); 16. c.transfer(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 transfer ar arta astfel: 1. 2. 3. 4. 5. 6. 7. public void transfer(ContBancar c){ if (this == c) return; this.suma+=c.suma; c.suma=0; } }

n linia 2, this reprezint obiectul curent iar c obiectul primit ca parametru.

2.3.6. Suprancrcarea i supradefinirea metodelor

suprancrcarea (overloading): n cadrul unei clase pot exista metode cu acelai nume cu condiia ca ele s difere prin lista parametrilor diferena const n numrul parametrilor sau n tipul lor. Astfel la apelul metodei cu acel nume se poate face distincia ntre ele i se stabilete n mod unic care dintre ele se execut.

Exemplu: n clasa Maxim sunt definite dou metode max cu doi respectiv cu trei parametrii. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. public class Maxim { public static int max(int a, int b){ return a>b?a:b; } public static int max(int a, int b, int c){ int m=a>b?a:b; m=m>c?m:c; return m; } public static void main(String args[]){ int a=12, b=5,c=90,m; m=max(a,b);

29

13. 14. 15. 16. 17. .

System.out.println("Max. dintre "+a+" si "+b+" este: "+m); m=max(a,b,c); System.out.println("Max. dintre "+a+", "+b+" si "+c+" este: "+m); } }

supradefinirea (overriding): o subclas a unei clase poate rescrie o metod a clasei printe, prin implementarea unei metode cu acelai antet ca al superclasei.

2.3.7. Modificatori 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: Modificator private protected public implicit Clas x x x x Subclas x x x Pachet x x Altundeva x

Dup cum se vede n tabelul de mai sus, modificatorii au urmtoarele semnificaii. private un membru declarat private este accesibil doar n clasa n care este declarat; protected un membru declarat protected este accesibil oricrei clase care aparine 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. Exemple: private int re,im; 30

protected String secret; public float[] elemente; long x; private void metodaInterna(); public void setRe(int re); Observaie: 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.

2.3.8. Membrii instan i membrii clas


O clas Java poate conine dou tipuri de variabile i metode :

instan: declarate fr modificatorul static, specifice fiecrei instane 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 instaniat 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 instanele 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 instane a clasei sistemul aloc o zon de memorie separat pentru memorarea valorii ei. Exemplu: Clasa Punct conine dou variabile instan declarate pe linia 2 i o variabil clas declarat i iniializat pe linia 3. Constructorul clasei Punct iniializeaz variabilele instan i incrementeaz variabila clas. Cu alte cuvinte,

31

variabila nr_puncte va contoriza cte puncte (instane ale clasei Punct) se creeaz. n clasa TestPunct se creeaz trei obiecte de tipul Punct i se afieaz valoarea variabilei clas nr_puncte. Trebuie remarcat c variabila nr_puncte este accesat prin intermediul numelui clasei. 1. 2. 3. 4. 5. 6. 7. 8. class Punct{ int x, y; static int nr_puncte=0; Punct(int xx, int yy){ x=xx; y=yy; nrpuncte++; }

9. class TestPunct{ 10. public static void main(String args[]){ 11. Punct p1=newPunct(10, 10); 12. Punct p2=newPunct(20, 20); 13. Punct p3=newPunct(30, 30); 14. System.out.println(Punct.nr_puncte); 15. } 16. } ntruct metodele clas nu depind de starea obiectelor clasei respective, apelul lor se poate face prin: NumeClasa.metodaStatica(); sau NumeClasa obiect = new NumeClasa(); obiect.metodaStatica(); n cazul metodelor instan apelul nu se poate face dect prin intermediul unui obiect: NumeClass.metodaInstanta(), NumeClasa obiect = new NumeClasa(); obiect. metodaDeInstanta(); //ilegal //legal

Exemplu: 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. 1. class Cerc{

32

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.

double x,y,r; Cerc(double x, double y, double r) { this.x=x; this.y=y; this.r=r; } Cerc maimare(Cerc c) { if(c.r>r) return c; else return this; } static Cerc maimare(Cerc a, Cerc b) { if (a.r>b.r) return a; else return b; }

... Cerc Cerc Cerc Cerc

a=new Cerc(10, 10, 50); b=new Cerc(20, 20, 100); c = a.maimare(b); 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 folosii pentru a pune la dispoziie valori i metode independente de starea obiectelor dintr-o anumit clas. Spre deosebire de C++, n Java nu putem avea funcii globale definite ca atare, ntruct "orice este un obiect". Din acest motiv i metodele care au o funcionalitate 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 funcia global sqrt care extrage radicalul dintr-un numr i care se gsete n clasa
Math. Dac nu ar fi fost funcie clas, apelul ei ar fi trebuit fcut astfel:

Math m = new Math(); double rad121 = m.sqrt(121); ceea ce ar fi fost extrem de neplcut pentru programatori. Fiind ns funcie static ea poate fi apelat prin: Math.sqrt(121).

33

2.3.9. Argumente 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 aplicaie Java poate primi oricte argumente din linia de comand n momentul lansrii ei. Aceste argumente sunt utile pentru a permite utilizatorului s specifice diverse opiuni legate de funcionarea aplicaiei sau s furnizeze anumite date iniiale programului. Argumentele din linia de comand sunt introduse la lansarea unei aplicaii, fiind specificate dup numele aplicaiei i sunt separate prin spaiu. Formatul general pentru lansarea unei aplicaii care primete argumente din linia de comand este: java NumeAplicatie [arg1 arg2 . . . argn] Evident, o aplicaie poate s nu primeasc nici un argument sau poate s ignore argumentele primite din linia de comand. n momentul lansrii unei aplicaii interpretorul parcurge linia de comand cu care a fost lansat aplicaia i, n cazul n care exist argumente, i transmite aplicaiei sub forma irului de String-uri. Numrul argumentelor primite de un program este dat de dimensiunea vectorului args args.length: numarArgumente = args.length ; Exemplu: Afiarea argumentelor primite din linia de comand public class ArgLinCom { public static void main (String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]); } } Un apel de genul:
java ArgLinCom Nu mai vine primavara odata

va produce urmtorul rezultat:


Nu mai vine primavara odata

34

Dac o anumit parte din irul de intrare este cuprins ntre ghilimelele se interpreteaz ca un singur argument, spaiile fiind ignorate. Una apel de genul:
java ArgLinCom "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 Stringuri. Ulterior ele trebuie convertite din String-uri n numere. Acest lucru se realizeaz cu metode de tipul parseXXX aflate n clasa XXX corespunztoare tipului n care vrem s facem conversia: Integer, Float, Double, etc. Exemplu: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. public class Maxim { public static int max(int a, int b){ return a>b?a:b; } public static int max(int a, int b, int c){ int m=a>b?a:b; m=m>c?m:c; return m; } public static void main(String args[]){ if (args.length!=3){ System.out.println("Nu ati introdus trei numere"); return; } int a=Integer.parseInt(args[0]), b=Integer.parseInt(args[1]), c=Integer.parseInt(args[2]), m; m=max(a,b); System.out.println("Maximul dintre "+a+" si "+b+" este: "+m); m=max(a,b,c); System.out.println("Maximul dintre "+a+", "+b+" si "+c+" este: "+m); } }

35

n linia 11 se verific dac au fost transmii atia parametrii ci sunt necesari. n liniile 15-17 se convertesc argumentele n ntregi.

2.4. Motenirea

2.4.1. Principiul 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 perfeciunea 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 mbuntire a lui n diferite direcii s-a redus ceea ce nu era bun, sau 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. i mainile elegante pe care le vedem azi rulnd cu vitez pe osele se trag tot din acea prim main. Baza este aceeai, puin mbuntit. n Java pentru a crea o clas nou trebuie specificate: clasa motenit i diferenele fa de clasa motenit. Clasa motenit se specific n clauza extends. modificator NumeClasa extends ClasaDeBaza Clasa motenete toate metodele accesibile i variabilele superclasei sale.

36

Exemplu: Urmtoare ierarhie de clase: se exprim n Java astfel: class A{ ... } class B extends A{ ... } class C extends B{ ... } class D extends B{ ... }

A B

Dac clauza extends lipsete, implicit clasa motenete clasa Object. Observaie: 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 Object 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):

Avantajele crerii unei ierarhii de clase funcionalitatea comun a mai multor clase se pune n superclase. Acest aranjament permite ca funcionalitatea s fie refolosit n mod repetat deoarece fiecare subclas primete informaia comun din superclas.

37

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 conine o metod care are acelai antet cu metoda unei superclase? Este executat prima metod ntlnit cutarea fcnduse 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. Exemplu: Se definesc dou clase Rational i RationalIred care motenete clasa Rational. n linia 15 se construiete un obiect al clasei Rational prin apelarea constructorului cu doi parametrii. Acest constructor exist deci, totul este n regul. n linia 16 se dorete construirea unui obiect al clasei RationalIred tot prin apelarea constructorului cu doi parametrii. Dar, n acest caz este generat o eroare deoarece clasa RationalIred nu are definit constructorul cu doi parametrii. 1.public class Rational{ 2. private long m,n; 3. public Rational(){ 4. m=0; n=1; 5. } 6. public Rational(long m,long n){ 7. this.m=m; 8. this.n=n; 9. } 10. } 11. public class RationalIred extends Rational { 12. ... 13. } 14. ... 15. Rational r = new Rational(2,5); 16. RationalIred r1 = new RationalIred(2,5); Pentru ca linia 16 s nu mai genereze eroare, clasa RationalIred trenbuie s arate astfel: 1. public class RationalIred extends Rational {

38

2. 3. 4.

public RationalIred(){ m=0; n=1; }

5. public RationalIred(long m,long n){ 6. this.m=m; 7. this.n=n; 8. } 9. } n cadrul unei metode a subclasei care supradefinete o metod din superclas se poate apela metoda supradefinit (a superclasei), folosind super. Exemplu: Relum exemplul precedent. Subclasa RationalIred conine ca i superclasa Rational doi constructori: unul fr parametrii i unul cu doi parametrii. Constructorii subclasei au aceeai funcionalitate cu cei ai superclasei. n linia 16 se apeleaz constructorul fr parametrii ai superclasei Rational. n linia 19 se apeleaz constructorul cu doi parametrii ai superclasei Rational. Pe lng cei doi constructori care au aceeai funcionalitate 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. 1. public class Rational{ 2. public long m,n; 3. public Rational(){ 4. m=0; n=1; 5. } 6. public Rational(long m,long n){ 7. this.m=m; 8. this.n=n; 9. } 10. public void produs(){ 11. System.out.println("Inmultesc doua numere rationale"); 12. } 13. } 14. public class RationalIred extends Rational { 15. public RationalIred(){ 16. super(); 17. }

39

18. 19. 20. 21. 22. 23. 24. 25. }

public RationalIred(long m,long n){ super(m,n); } public RationalIred produs(RationalIred r){ super.produs(r); System.out.println("si ireductibile"); }

Observaii: Cnd se dorete apelarea constructorului superclasei se folosete doar super(...). Cnd se dorete apelarea unei metode a superclasei se folosete super.NumeMetoda(...).

2.4.2. Interfee
Interfeele 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 (interfaa) 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 interfeei. Prin urmare, o interfa este o colecie de metode fr implementare i declaraii de constante. Definirea unei interfee se face prin intermediul cuvntului cheie interface: [public] interface NumeInterfata extends SuperInterfata1 [,extends SuperInterfata2...]] { //corpul interfetei:constane si metode abstracte } O interfa poate fi declarat doar public. O clas poate extinde oricte interfee. Acestea se numesc superinterfee i sunt separate prin virgul. Corpul unei interfee conine:

constante: acestea pot fi sau nu declarate cu modificatorii public,


static i final care sunt implicii; nici un alt modificator nu poate aprea

n declaraia unei variabile a unei interfee. Constantele dintr-o interfa trebuie obligatoriu iniializate.

40

Exemplu: 1. interface NumeInterfata { 2. int x = 100; //corect 3. public static final int y = 100; 4. private z=100; //incorect 5. int a; //incorect 6. }

//corect

metode fr implementare: acestea pot fi sau nu declarate cu modificatorul public care este implicit; nici un alt modificator nu poate aprea n declaraia unei metode a unei interfee.

Exemplu: 7. interface NumeInterfata { 8. void metoda1(); //corect 9. public void metoda2(); //corect 10. private void metoda3(); //incorect 11. } Atenie: Variabilele i metodele unei interfee sunt implicit publice chiar dac nu sunt declarate cu modificatorul public. Variabilele unei interfee sunt implicit constante chiar dac nu sunt declarate cu modificatorii static i final. Implementarea unei interfee se face prin intermediul cuvntului cheie
implements:

class NumeClasa implements NumeInterfata sau class NumeClasa implements Interfata1, Interfata2... O clas poate implementa oricte interfee. O clas care implementeaz o interfa trebuie obligatoriu s defineasc toate metodele interfeei. Exemplu: Se definete o interfa FigGeom care este implementat de clasa Cerc i clasa Dreptunghi. Clasa Patrat motenete clasa Dreptunghi, iar clasa Pataratel motenete clasa Patrat. 1. 2. 3. 4. 5. interface FigGeom{ void desen(); void arie(); } class Cerc implements FigGeom{

41

6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. }

int r; Cerc(int r){ this.r=r; System.out.println("Constructor cerc "+r); } public void desen(){ System.out.println("Deseneaza cercul "+r); } public void arie(){ double s=Math.PI*r*r; System.out.println("Cercul "+r+" are aria "+s); }

19. class Dreptunghi implements FigGeom{ 20. int L,l; 21. Dreptunghi(){} 22. Dreptunghi(int L,int l){ 23. this.L=L; 24. this.l=l; 25. System.out.println("Constructor dreptunghi "+L+" "+l); 26. } 27. public void desen(){ 28. System.out.println("Deseneaza dreptunghiul "+L+" "+l); 29. } 30. public void arie(){ 31. double s=L*l; 32. System.out.println("Dreptunghiul "+L+" "+l+" are aria "+s); 33. } 34. } 35. public class TestFigGeom{ 36. public static void main(String args[]){ 37. FigGeom c=new Cerc(10), 38. d=new Dreptunghi(20,25), 39. c.desen(); 40. c.arie(); 41. d.desen(); 42. d.arie(); 43. } 44. } Rezultatul execuiei este: Constructor cerc 10 Constructor dreptunghi 20 25 Deseneaza cercul 10 Cercul 10 are aria 314.1592653589793 Deseneaza dreptunghiul 20 25 42

Dreptunghiul 20 25 are aria 500.0 Diferena dintre o interfa 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 forate 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 interfeelor nu am putea fora clasa respectiva s respecte un anumit protocol. La nivel conceptual diferena const n:

extinderea unei clase abstracte foreaz o relaie ntre clase; implementarea unei interfee specific doar necesitatea implementrii unor anumite metode.

2.5. Probleme
Exemplu 1: Exemplificarea motenirii. class Masina { private String s = new String("Masina"); 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(){ System.out.println(s); }

class BMW extends Masina { //schimbarea unei metode public void opreste() {

43

append(" BMW opreste sigur()"); super.opreste(); // apelul metodei clasei de baza } // adaugarea unei metode noi public void franeazaBine(){ append(" franeazaBine()"); } } // testarea noii clase public class TestMasina{ public static void main(String[] args) { BMW bmw = new BMW(); /* System.out.println(bmw.s); //Eroare s nu apartine lui bmw */ bmw.porneste(); bmw.merge(); bmw.franeazaBine(); bmw.opreste(); bmw.print(); } } Rezultatul execuiei este: Masina porneste() merge() franeazaBine() BMW opreste sigur() opreste() Exemplu 2: Exemplificarea motenirii i a polimorfismului. abstract class FigGeom{ abstract void desen(); abstract void arie(); } class Cerc extends FigGeom{ int r; Cerc(int r){ this.r=r; System.out.println("Constructor cerc "+r); } void desen(){ System.out.println("Deseneaza cercul "+r); } void arie(){ double s=Math.PI*r*r; System.out.println("Cercul "+r+" are aria "+s); } } class Dreptunghi extends FigGeom{

44

int L,l; Dreptunghi(){} Dreptunghi(int L,int l){ this.L=L; this.l=l; System.out.println("Constructor dreptunghi "+L+" "+l); } void desen(){ System.out.println("Deseneaza dreptunghiul "+L+"

"+l);

} void arie(){ double s=L*l; System.out.println("Dreptunghiul "+L+" "+l+" are aria "+s); } } class Patrat extends Dreptunghi{ int l; Patrat(int l){ // super(l,l); this.l=l; System.out.println("Constructor patrat "+l); } void desen(int k){ System.out.println("Deseneaza patratul "+l+" indice "+k); } void arie(){ double s=l*l; System.out.println("Patrat "+l+" are aria "+s); } } class Patratel extends Patrat{ int l; Patratel(int l){ super(l); this.l=l; System.out.println("Constructor patratel "+l); } void desen(int k){ System.out.println("Deseneaza patratelul "+l+" indice "+k); } void arie(){ double s=l*l; System.out.println("Patratelul "+l+" are aria "+s); } } 45

public class TestFigGeom{ public static void main(String args[]){ FigGeom c=new Cerc(10), d=new Dreptunghi(20,25), p=new Patrat(30), pm=new Patratel(40); c.desen(); c.arie(); d.desen(); d.arie(); // p.desen(100); da eroare p fiind o figura geometrica p.desen(); //se apeleaza desen din dreptunghi p.arie(); pm.desen(); //se apeleaza desen din dreptunghi pm.arie(); Patrat p1=new Patrat(300); p1.desen(100); //este ok p1.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

46

Exemplu 3: Ilustreaz ordinea iniializrilor class Floare { Floare(int nr) { System.out.println("Floare(" + nr + ")"); } void actiune(String fel) { System.out.println("actiune(" + fel + ")"); } } class Vaza { static Floare f1 = new Floare(1); //var STATICA Vaza() { System.out.println("Vaza()"); f2.actiune("Floare in vaza"); } void pozitie(String loc) { System.out.println("pozitie(" + loc + ")"); } static Floare f2 = new Floare(2); //var STATICA } class Gradina { Floare f3 = new Floare(3); static Floare f4 = new Floare(4); //var STATICA Gradina() { System.out.println("Gradina()"); f4.actiune("Floare doarme"); } void aspect(String tip) { System.out.println("aspect(" + tip + ")"); } static Floare f5 = new Floare(5); //var STATICA } public class StaticInit { public static void main(String[] args) { System.out.println( "Creaza o Gradina() noua in main"); new Gradina(); System.out.println( "Creaza o Gradina() noua in main"); new Gradina(); v2.pozitie("pe masa"); g3.aspect("frumos"); } static Vaza v2 = new Vaza(); static Gradina g3 = new Gradina(); } Rezultatul execuiei este:

//var STATICA //var STATICA

47

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) Exemplu 4: Exemplificarea motenirii. Clasa Rational implementeaz lucrul cu numere raionale. Clasa RationalIred motenete clasa Rational i implementeaz lucrul cu numere raionale ireductibile. public class Rational{ private long m,n; public Rational(){ this(1,0); } public Rational(long m,long n){ setm(m); setn(n); } public Rational(long m){ this(m,1); } public void setm(long m){ 48

this.m=m;

public long getm(){ return m; } public void setn(long n){ this.n=n; } public long getn(){ return n; } public Rational produs(Rational r){ return new Rational(m*r.m,n*r.n); } public String toString(){ return m+"/"+n; } } public class RationalIred extends Rational { public RationalIred(){ super(); } public RationalIred(long m,long n){ super(m,n); } public RationalIred(long m){ super(m); } private void simplifica(){ long x=getm(), y=getn(); while(x!=y){ if(x>y) x-=y; else y-=x; } setm(getm()/x); setn(getn()/x); } public RationalIred produs(RationalIred r){ RationalIred p=new RationalIred(); 49

p.setm(getm()*r.getm()); p.setn(getn()*r.getn()); p.simplifica(); return p; } } public class TestRational{ public static void main(String[] args) { RationalIred r1,r2,p; r1=new RationalIred(Integer.parseInt(args[0]), Integer.parseInt(args[1])); r2=new RationalIred(Integer.parseInt(args[2]), Integer.parseInt(args[3])); System.out.println(r1); System.out.println(r2); p=r1.produs(r2); System.out.println(p); } }

50

3. Pachete
Un pachet este o colecie de clase i interfee 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 interfeele sunt grupate n diferite pachete dup funcionalitatea lor. Cu ajutorul lor se pot construi aplicaiile. Cele mai importante pachete pe care le pune Java la dispoziie sunt: pachetul java.lang cuprinde clasele de baz ale limbajului; pachetul java.io cuprinde clasele pentru intrri/ieiri, lucru cu fiiere; pachetul java.math cuprinde clasele n care sunt definite operaiile matematice; pachetul java.util cuprinde clasele utile : Vector, Stack, Random, Date etc; pachetul java.text ofer suport pentru formatarea textelor; pachetul java.sql ofer suport pentru interogri SQL; pachetul
java.beans

cuprinde

clasele

necesare

scrierii

de

componente reutilizabile; pachetul java.net cuprinde clasele care asigur accesul la reea; pachetul
java.awt

cuprinde

clasele

pentru

grafic

(Abstract

Windowing Toolkit); pachetul javax.swing cuprinde clasele pentru grafic; extinde funcionalitatea claselor din pachetul java.awt. pachetul java.rmi cuprinde clasele care asigur execuie la distan (Remote Message Interface); pachetul java.securitz 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.

51

3.1. Importul unui pachet, al unei clase sau a unei interfee


Importul se realizeaz prin instruciunea import. Importul pachetelor se face prin specificarea numelui pachetului urmat de simbolul '*'. '*' are semnificaia c toate clasele i interfeele pachetului sunt importate. import NumePachet.*; Exemple: import java.io.*; import javax.swing.*; O dat realizat ntr-un fiier importul pachetului, orice clas din pachet poate fi accesat prin numele ei. Exemplu: Clasa Date aparine pachetului java.util. import java.util.*; public class ExData{ public static void main(String[] args) { Date d=new Date(2003,4,13); System.out.println(d); } } Atenie: n cazul n care sunt importate dou pachete care conin o clas cu acelai nume atunci referirea la ea trebuie fcut folosind numele complet al clasei respective (nume pachet urmat de nume clas). Implicit, mediul Java import trei pachete: pachetul java.lang pachetul curent pachetul implicit (fr nume) Importul claselor (interfeelor) se realizeaz prin specificarea numelui clasei (interfeei) pe care dorim s o folosim dintr-un pachet: import NumePachet.NumeClasa; Exemple: import java.util.Date; O dat realizat ntr-un fiier importul clasei (interfeei), aceasta poate fi accesat prin numele ei.

52

Exemplu: import java.util.Date; public class ExData{ public static void main(String[] args) { Date d=new Date(2003,4,13); System.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.

3.2. Crearea unui pachet


Se creeaz un director cu numele NumePachet n care vor fi salvate toate fiierele surs ce conin clasele i interfeele pe care dorim s le grupm ntr-un pachet. Numele directorului d numele pachetului. n prima linie a fiecrui fiier din directorul NumePachet se specific faptul c toate clasele din fiierul respectiv vor aparine clasei. Aceasta se realizeaz prin: package NumePachet; Prin urmare codul unei clase care se adaug la un pachet arat astfel: package NumePachet; public class NumeClasa{ ... } Instruciunea package acioneaz asupra ntregului fiier surs la nceputul cruia apare. Cu alte cuvinte nu putem specifica faptul c anumite clase dintr-un fiier surs aparin 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 interfeele directorului curent. Pentru compilare trebuie s ne plasm n directorul printe al directorului NumePachet. Se execut comanda: javac NumePachet\*.java n cazul n care nu sunt erori n pachet, n directorul NumePachet trebuie s se creeze fiierele .class.

53

Clasele care folosesc pachetul creat se aeaz n afara directorului. Pentru ca ele s aib acces la pachet trebuie setat variabila sistem CLASSPATH: SET CLASSPATH = CaleDirectorNumePachet Exemplu 1: n directorul c:\lucru se formeaz un director Pachete n care se salveaz urmtoarele fiiere: Fiierul A1.java conine clasa: package Pachete; public class A1{ int a=0; public int b=0; private int c=0; protected int d=0; void a(){ System.out.println(a); } public void b(){ System.out.println("public "+ b); } protected void d(){ System.out.println("protected "+d); } Fiierul A2.java conine clasa: package Pachete; public class A2 implements A3{ public void a3(){ A1 a1=new A1(); a1.a=1; a1.b=1; a1.d=1; System.out.println(a1.a+" "+a1.b+" a1.a(); a1.b(); a1.d(); } } Fiierul A3.java conine clasa: package Pachete; public interface A3{ public void a3(); } Setm variabila CLASSPATH:

"+a1.d);

54

SET CLASSPATH = c:\lucru Pentru compilare ne poziionm n directorul c:\lucru comanda: javac Pachete\*.java Construim o clas de test A4.java pe care o salvm n c:\lucru: import Pachete.*; public class A4{ public static void main(String args[]){ A2 a=new A2(); a.a3(); A1 a1=new A1(); //a1.a(); eroare metoda a() este ca i protected a1.b(); //a1.d(); eroare metoda d() este protected } } Se compileaz i se execut ca orice clas Java . Exemplu 2: Construim un pachet Tablou care conine o clas Matrice i una Vector. package Tablou; public class Vector{ private double a[]; public Vector(){ a=new double[1]; } public Vector(int n, double a[]){ this.a=new double[n]; for(int i=0; i<n; i++) this.a[i]=a[i]; } public int getLungime(){ return a.length; } public double getElem(int poz){ return a[poz]; } public double[] getVector(){ return a; } 55 i executm

public void setElem(int poz, double val){ a[poz]=val; } public void setVector(double a[]){ this.a=new double[a.length]; for(int i=0; i<a.length; i++) this.a[i]=a[i]; } public String toString(){ String s=""; for(int i=0; i<a.length; i++) s=s+a[i]+" "; return s; }

package Tablou; public class Matrice{ private double a[][]; public Matrice(){ a=new double[1][]; } public Matrice(int n, int m, double a[][]){ this.a=new double[n][m]; for(int i=0; i<n; i++) for(int j=0; j<m; j++) this.a[i][j]=a[i][j]; } public int getNrLin(){ return a.length; } public int getNrCol(int l){ return a[l].length; } public double getElem(int l, int c){ return a[l][c]; } public double[][] getMatrice(){ return a; } public String toString(){ 56

} }

String s=""; for(int i=0; i<a.length; i++){ for(int j=0; j<a[i].length; j++) s+=a[i][j]+" "; s+="\n"; } return s;

O clas care folosete pachetul Tablou ar fi: 1. import Tablou.*; 2. public class TestTablou{ 3. public static void main(String args[]){ 4. double x[][]={{2,4},{5,6},{1,3}}; 5. Matrice m=new Matrice(3,2,x); 6. System.out.println(m); 7. double y[]={2,4,5,6}; 8. Vector v=new Vector(4,y); 9. System.out.println(v); 10. java.util.Vector vv=new java.util.Vector(5); 11. for (int i=0;i<5;i++) 12. vv.add(new Integer(i)); 13. System.out.println(vv); 14. } 15. } 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.

57

4. Excepii
4.1. Aspecte generale
O excepie este un eveniment ce se produce n timpul execuiei unui program i care provoac ntreruperea cursului normal al execuiei. De exemplu, o mprire la 0 sau utilizarea unui indice care depete o dimensiune declarat a unui tablou reprezint un eveniment care perturb execuia normal a programului este vorba despre o excepie. Cnd apare o astfel de eroare n timpul execuiei programului sistemul genereaz automat un obiect de tip excepie ce conine: informaii despre excepia respectiv; starea programului n momentul producerii excepiei Exemplu: public class Exceptii { public static void main(String args[]) { int v[] = new int[10]; v[10] = 0; //exceptie, vectorul are elementele v[0]...v[9] System.out.println("Aici nu se mai ajunge..."); } } La rularea programului va fi generat o excepie i se va afia mesajul : Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException :3 at Exceptii.main (Exceptii.java:4) Java dispune de un mecanism care permite programatorului s preia controlul programului n momentul n care apare o excepie i s o trateze. Crearea unui obiect de tip excepie se numete aruncarea unei excepii ("throwing an exception"). n momentul n care o metod genereaz o excepie (arunc o excepie) sistemul de execuie este responsabil cu gsirea unei secvene de cod dintr-o metod care s trateze acea excepie. Excepiile sunt propagate napoi prin secvena de metode apelate pn cnd o anumit metod prinde excepia. Secvena de cod dintr-o metod care trateaz o anumit excepie se numete analizor de exceptie ("exception handler") iar interceptarea i tratarea

58

excepiei

se

numete

prinderea

excepiei

("catch

the

exception").

Cu alte cuvinte la apariia unei erori este "aruncat" o excepie iar cineva trebuie s o "prind" pentru a o trata. Dac sistemul nu gsete nici un analizor pentru o anumita excepie atunci programul Java se oprete cu un mesaj de eroare. Ierarhia claselor ce conin excepii este:

Toate excepiile Java sunt subclase ale clasei Exception.

4.2. Instruciunea try


try{
instruciuni ce pot declana excepii

} [catch(ClasaExceptie obiectExceptie){ }]* [finally{

instruciuni de tratare a excepiei de clas ClasaExceptie

instruciuni care se execut necondiionat n final

}] Instruciunea try conine un bloc de instruciuni ce trebuie executate. Punerea unor instruciuni n cadrul lui try nseamn c exist posibilitatea apariiei unor excepii sau terminrii anormale a unei instruciuni. O instruciune try poate avea oricte clauze catch (opionale) n care sunt tratate excepiile. De asemenea, instruciunea try poate avea o clauz finally a crui bloc se execut ntotdeauna

59

naintea prsirii instruciunii try. Instruciunea try trebuie s aib fie o clauz catch, fie una finnaly.

Formele generale ale instruciunii try. 1. try{ ... } catch(ClasaExceptie obiectExceptie){ ... } 2. try{ ... } catch(ClasaExceptie obiectExceptie){... } ... catch(ClasaExceptie obiectExceptie){... } 3. try{ ... } finnaly{... } 4. try{ ... } catch(ClasaExceptie obiectExceptie){... } ... catch(ClasaExceptie obiectExceptie){... } finnaly{... } n cazul n care este declanat o excepie i exist mai multe clauze catch, este cutat, n ordine, acea clauz care poate trata excepia. Adic este gsit o clauz a crui parametru are un tip care se potrivete cu tipul excepiei. Ordinea n care clauzele catch apar este important: clauzele catch mai specifice trebuie s apar naintea celor mai generale. Dac nu exist o clauz care s trateze excepia, aceasta este propagat n sus, la instruciunile imediat urmtoare.

60

Excepii uzuale: ArithmeticException NumberFormatException IndexOutOfBoundsException NegativeArraySizeException NullPointerException SecurityException Depire limit tip sau mprire la 0 Conversia nepermis a unui String la un tip numeric Indice ilegal ntr-un ir Crearea unui ir cu numr negativ de elemente Tentativ de a folosi o referin care are valoarea null nclcarea normelor de securitate n timpul execuiei

4.3. Crearea unei excepii


Adeseori poate aprea necesitatea crerii unor excepii proprii pentru a pune n eviden cazuri speciale de erori provocate de clasele unei librrii, cazuri care nu au fost prevzute n ierarhia excepiilor standard Java. O excepie proprie trebuie s se ncadreze n ierarhia excepiilor Java, cu alte cuvinte clasa care o implementeaz trebuie s fie subclas a clasei Exception. public class ExceptieNoua extends Exception{ ... } Exemplu: 1. 2. 3. 4. 5. 6. public class Exc extends Exception{ public Exc(){ super(); //apeleaza constructorul clasei Exception ... } }

ntr-o clas n care se dorete folosirea unei excepii exist o metod care creeaz excepia (obiect al clasei de excepii), mai multe metode care arunc excepia primit i, eventual o metod care o prinde, adic o trateaz. Dac ntr-o metod apare o excepie creat n metoda respectiv sau ca urmare a apelrii unei metode care a aruncat o excepie, atunci ea trebuie fie s fie tratat, fie s fie aruncat mai departe. n ambele cazuri codul care ar putea genera excepia trebuie pus n cadrul unei instruciuni try care s aib o clauz catch cu parametru care s coincid cu clasa excepiei. Dac excepia se dorete s fie tratat, atunci n

61

clauza catch se pune un cod corespunztor. Dac se dorete ca excepia s nu fie tratat atunci ea trebuie aruncat mai departe (metodei care a fcut apelul) i acest lucru se realizeaz prin adugarea clauzei throws ClasaExceptie n antetul metodei. Exemplu 1: n clasa RationalIred se verific dac numitorul fraciei este 0. Dac da atunci se creeaz o excepie linia 53. 1. 2. 3. 4. 5. 6. 7. 8. public class Exc extends Exception{ public Exc(){ super(); System.out.println("Numitor 0"); } } public class Rational{ private long m,n; public Rational(){ this(1,0); } public Rational(long m,long n){ setm(m); setn(n); } public Rational(long m){ this(m,1); } public void setm(long m){ this.m=m; } public long getm(){ return m; } public void setn(long n){ this.n=n; } public long getn(){ return n; } public Rational produs(Rational r){ return new Rational(m*r.m,n*r.n); } public String toString(){ return m+"/"+n; }

9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. }

38. public class RationalIred extends Rational { 62

39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. }

public RationalIred(){ super(); } public RationalIred(long m,long n) throws Exc{ setm(m); try{ setIn(n); } catch(Exc e){throw e;} } public void setIn(long n) throws Exc{ if (n!=0) super.setn(n); else throw new Exc(); } private void simplifica(){ long x=getm(), y=getn(); while(x!=y){ if(x>y) x-=y; else y-=x; } setm(getm()/x); setn(getn()/x); } public RationalIred produs(RationalIred r){ RationalIred p=new RationalIred(); p.setm(getm()*r.getm()); p.setn(getn()*r.getn()); p.simplifica(); return p; }

72. public class TestRational{ 73. public static void main(String[] args) { 74. RationalIred r1,r2,p; 75. try{ 76. r1=new RationalIred( 77. Integer.parseInt(args[0]), 78. Integer.parseInt(args[1])); 79. r2=new RationalIred( 80. Integer.parseInt(args[2]), 81. Integer.parseInt(args[3])); 82. } 83. catch(Exc e){ 84. System.exit(1); 85. } 86. System.out.println(r1); 87. System.out.println(r2); 88. p=r1.produs(r2); 89. System.out.println(p); 63

90. } 91. }

64

5. Intrri i ieiri
Informaia poate fi preluat de oriunde (fiier, disk, reea, memorie, alt program) i poate fi de orice tip (obiecte, caractere, imagini, sunete). Pentru a aduce informaii, un program Java deschide un flux (canal de comunicaii) la o surs de informaii i citete informaia. Un flux care citete date se numete flux de intrare.

Similar, un program poate trimite informaii ctre o destinaie extern deschiznd un flux (canal de comunicaii) ctre acea destinaie i scriind serial informaiile respective. Un flux care scrie date se numete flux de ieire.

Algoritmul de citire este: deschide flux ct timp exist informaie citete informaia 65

nchide flux Algoritmul de afiare este: deschide flux ct timp exist informaie scrie informaia nchide flux Pachetul java.io conine o colecie de clase folosite pentru citiri i afiri. Prin urmare, orice program care necesit operaii de intrare / ieire trebuie s importe pachetul java.io: import java.io.*.

5.1. Clasificarea fluxurilor


Exist trei tipuri de clasificare a fluxurilor:

Dup "direcia" canalului de comunicaie deschis, fluxurile se mpart n: o o fluxuri de intrare (pentru citirea datelor) fluxuri de ieire (pentru scrierea datelor)

Dup tipul de date pe care opereaz: o o fluxuri de octei (comunicarea serial se realizeaz pe 8 bii) fluxuri de caractere (comunicarea serial se realizeaz pe 16 bii)

Dup aciunea lor: o o fluxuri pentru citirea / scrierea datelor fluxuri pentru procesarea datelor

5.2. Ierarhia claselor pentru lucrul cu fluxuri

5.2.1. Fluxuri de caractere


Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de caractere sunt Reader (pentru fluxuri de intrare) i Writer (pentru fluxuri de ieire).

66

Ierarhia claselor pentru fluxuri de intrare pe caractere este:

Ierarhia claselor pentru fluxuri de ieire pe caractere este:

5.2.2. Fluxuri de octei


Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de octei sunt InputStream (pentru fluxuri de intrare) i OutputStream (pentru fluxuri de ieire). Subclasele lor sunt folosite pentru citiri i scrieri de date binare cum ar fi imagini i sunete. Ierarhia claselor pentru fluxuri de intrare pe octei:

67

Ierarhia claselor pentru fluxuri de ieire pe octei:

5.3. Superclasele de intrare / ieire


Clasele Reader i InputStream definesc metode similare pentru citirea datelor, tipul parametrilor variind. Clasa Reader int read() int read(char cbuf[ ]) int read(char cbuf[ ], int index, int lungime) Clasa InputStream int read() int read(byte cbuf[ ]) int read(byte cbuf[ ], int index, int lungime)

68

Analog, clasele Writer i OutputStream definesc metode similare pentru afiarea datelor, tipul parametrilor variind. Clasa Writer int write() int write(char cbuf[ ]) int write(char cbuf[ ], int index, int lungime) Clasa OutputStream int write() int write(byte cbuf[ ]) int write(byte cbuf[ ], int index, int lungime)

5.4. Crearea unui flux


Orice flux este un obiect al clasei ce implementeaz fluxul respectiv. Crearea unui flux se realizeaz similar cu crearea obiectelor, prin instruciunea new(). Exemple: //crearea unui flux de intrare pe caractere FileReader in = new FileReader("fisier_intrare.txt"); //crearea unui flux de iesire pe caractere FileWriter out = new FileWriter("fisier_iesire.txt"); //crearea unui flux de intrare pe octeti FileInputStream in = FileInputStream("fisier_intrare.txt"); //crearea unui flux de iesire pe octeti FileOutputStrem out = FileOutputStream("fisier_iesire.txt"); new

new

Prin urmare, crearea unui flux de date care scrie / citete informaii de la un dispozitiv extern are formatul general: FluxPrimitiv numeFlux = new FluxPrimitiv (dispozitiv extern)

69

5.5. Citirea datelor de la tastatur

5.5.1. Obiectul System.in


n general, tastatura reprezint perifericul standard pentru introducerea datelor. Clasa System conine o variabil membru care reprezint tastatura sau fluxul de intrare standard. Aceast variabil membru se numete in i este o instan a clasei InputStream. Exemplu 1: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un ir de caractere. Citirea se ncheie cnd se apas tasta Enter. 1. class Citire1 { 2. public static void main(String args[]) { 3. StringBuffer s=new StringBuffer(); 4. char c; 5. try { 6. while((c=(char)System.in.read()) != \n) 7. s.append(c); 8. } 9. catch(Exception e) { 10. System.out.println(Error:+e.getMessage()); 11. } 12. System.out.println("Sirul este:"+s); 13. } 14. } Exemplu 2: 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. 1. class Citire2 { 2. public static void main(String args[]) { 3. byte buf[]=new byte[30]; 4. try { 5. System.in.read(buf); 6. } 7. catch(Exception e) { 8. System.out.println(Error:+e.getMessage()); 9. } 10. String s=new String(buf); 11. System.out.println(s); 12. } 13. }

70

5.5.2. Clasa InputStreamReader


Reprezint legtura dintre fluxurile de octei i fluxurile de caractere: citete octei i i transform n caractere. Transformarea octeilor 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 InputStreamReader are urmtorii constructori: InputStreamReader(InputStream in) InputStreamReader(InputStream in, String enc) Metoda principal pentru citirea unui caracter este: int read() Exemplu 3: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un ir de caractere. Citirea se ncheie cnd se apas tasta Enter. 1. import java.io.*; 2. class Citire3 { 3. public static void main(String args[]) { 4. InputStreamReader in= 5. new InputStreamReader(System.in); 6. char c; 7. StringBuffer s=new StringBuffer(); 8. try { 9. while((c=(char)in.read()) != \n) 10. s.append(c); 11. } 12. catch(Exception e) { 13. System.out.println(Error:+e.getMessage()); 14. } 15. System.out.println(s); 16. } 17. }

5.5.3. Clasa BufferedReader

71

n cazul folosirii clasei InputStreamReader, citirea se face caracter cu caracter (adic, discul este accesat de fiecare dat). Pentru a crete eficiena se folosete un flux care utilizeaz o zon tampon pentru citire (BufferedReader). Clasa BufferedReader are definit metoda read() cu aceeai signatur ca i cea definit n InputStreamReader dar, n plus, definete i metoda readLine(). Aceast metod poate fi folosit pentru a citi un ir de caractere terminat cu \n,\r sau \r\n. Exemplu 4: Se introduce un ir de caractere de la tastatur. La apsarea tastei Enter irul este citit n ntregime i este depus ntr-un String. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. import java.io.*; class Citire4 { public static void main(String args[]) { InputStreamReader in1= new InputStreamReader(System.in); String s=new String(); try { BufferedReader in= new BufferedReader(in1); s=in.readLine(); } catch(Exception e) { System.out.println(Error:+e.getMessage()); } System.out.println(s); } }

5.6. Citirea i scrierea datelor din fiier

5.6.1. Clasele FileReader i FileWriter


Clasa FileReader este folosit la citirea datelor dintr-un fiier text. Cei mai importani constructori ai si sunt:

creeaz un flux care citete caractere din fiierul nume public FileReader(String nume) throws FileNotFoundException

72

creeaz un flux care citete caractere din fiierul varFis. public FileReader(File varFis) throws FileNotFoundException

Clasa FileWriter este folosit la scrierea datelor ntr-un fiier text. Cei mai importani constructori ai si sunt:

creeaz un flux care scrie caractere in fiierul nume

public FileWriter (String nume) throws IOException

creeaz un flux care citete caractere din fiierul varFis

public FileWriter (File varFis) throws IOException Exemplu 5: 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. 1. import java.io.*; 2. public class CitireFis { 3. public static void main(String args[]) { 4. int c; 5. StringBuffer s=new StringBuffer(); 6. try { 7. FileReader in= new FileReader(cit4.txt); 8. while((c=in.read())!=-1) 9. s.append((char)c); 10. } 11. catch(Exception e) { 12. System.out.println(Error:+e.getMessage()); 13. } 14. System.out.println(s); 15. } 16. } Exemplu 6: Copiaz coninutul unui fiier n alt fiier. 1. import java.io.*; 2. public class CitireFis { 3. public static void main(String[] args){ 4. try{ 5. FileReader in = new FileReader("cit4.txt"); 6. FileWriter out = new FileWriter("out.txt"); 7. int c; 8. while ((c = in.read()) != -1) 9. out.write(c); 10. in.close(); 11. out.close(); 12. } 73

13. catch (IOException e) { 14. System.out.println("Error: " + e.toString()); 15. } 16. } 17. }

6. Applet-uri
6.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 miniaplicaie. Codul unui applet poate fi format din una sau mai multe clase. Una dintre acestea este principal i extinde clasa JApplet, fiind clasa ce trebuie specificat n documentul HTML ce descrie pagina de Web n care dorim s includem applet-ul. Diferena fundamental dintre un applet i o aplicaie 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 conine applet-ul respectiv. O aplicaie independent este executat prin apelul interpretorului java, avnd ca parametru numele clasei principale a aplicaiei, clasa principal fiind cea care conine 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 informaii de pe staia 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 tranzacie cu server-ul. Un avantaj al folosirii applet-urilor este lipsa necesitii instalrii lor. De fapt, instalarea este automat de cte ori utilizatorul ncarc pagina Web care conine applet-ul. Pachetul care ofer suport pentru crearea de applet-uri este javax.swing. Clasa JApplet furnizeaz tot ce este necesar pentru construirea i ntreinerea unui 74

applet. Crearea unui applet implic implementarea metodelor puse la dispoziie de clasa JApplet care ne ajut s descriem comportamentul dorit al applet-ului. Ierarhia de clase este: java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--java.awt.Panel | +--java.applet.Applet | +--javax.swing.JApplet

6.2. Funciile unui applet


Execuia 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. ncrcarea n memorie se creeaz o instan a clasei principale a applet-ului i se ncarc n memorie. Iniializarea se apeleaz metoda init ce permite iniializarea diverselor variabile, citirea unor parametri de intrare, etc. Metoda init este responsabil i pentru aezarea tuturor componentelor pe form. Pornirea se apeleaz metoda start Execuia propriu-zis const n interaciunea dintre utilizator i componentele afiate pe suprafaa applet-ului. Oprirea 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 conine applet-ul devine din nou activ, va fi reapelat metoda start. 75

Oprirea definitiv La nchiderea tuturor instanelor browser-ului folosit pentru vizualizare, applet-ul va fi eliminat din memorie i va fi apelat metoda destroy a acestuia, pentru a-i permite s elibereze resursele deinute. Apelul metodei destroy este ntotdeauna precedat de apelul lui
stop.

6.3. Structura general a unui applet


import javax.swing.JApplet; import java.awt.*; import java.awt.event.*; public class StructuraApplet extends JApplet { public void init() { /* codul descrie aciunile care dorim s fie efectuate la instanierea clasei applet-ului. */ } public void start() { /* codul descrie aciunile care dorim s fie executate la lansarea appletului n execuie sau la rentoarcerea n pagina applet-ului */ } public void paint(Graphics g) { /* codul descrie aciunile care dorim s fie executate la fiecare redesenare a ferestrei applet-ului */ } public void stop() { /* codul descrie aciunile 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 destroy() { /* codul descrie aciunile care dorim s fie executate la distrugerea appletului (browser-ul prsete documentul .html din care a fost apelat applet-ul) */ }

76

} Observaie: Aceste metode sunt apelate automat de browser i nu trebuie apelate explicit din program !

6.4. HTML
Un browser Web interpreteaz coninutul (textul) unui fiier .html (Hyper Text Markup Language). Limbajul HTML const ntr-o colecie 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 Internet, aflate n fiiere diferite. Sintaxa unui marcaj este: <NumeTag [parametri ]> text </NumeTag> Parametrii se scriu sub forma: NumeParametru = valoare Structura unui document .html este: <HTML> <HEAD> <TITLE> titlul documentului </TITLE> </HEAD> <BODY> . . . <APPLET parametrii> <PARAM parametrii> <PARAM parametrii> . . . <PARAM parametrii> </APPLET> . . . </BODY> </HTML> Considerm cunoscute noiunile de baz ale HTML. Ceea ce ne intereseaz pentru construirea applet-urilor este marcajul <APPLET>. Acesta are parametrii obligatorii i opionali. Parametrii obligatorii:

77

CODE valoarea lui este numele fiierului care conine clasa appletului: NumeClasa.class; WIDTH valoarea lui este limea ferestrei atribuit de browser appletului la afiarea documentului .html; HEIGHT valoarea lui este nlimea ferestrei atribuit de browser applet-ului la afiarea documentului .html; Parametrii opionali: 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 .html); VSPACE valoarea lui este nlimea zonei (exprimat n pixeli) care se las liber deasupra i dedesubtul ferestrei applet-ului; HSPACE valoarea lui este limea 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 nelege marcajul <APPLET> dar nu poate rula applet-uri Java. NAME Ofer posibilitatea de a da un nume respectivei instane a applet-ului, astfel nct mai multe applet-uri aflate pe aceeai pagin s comunice ntre ele folosindu-se de numele lor. ALIGN Semnific modalitatea de aliniere a applet-ului n pagina Web. Acest atribut poate primi una din urmtoarele valori: left, right,
top, texttop, middle, absmiddle, baseline, bottom, absbottom, semnificaiile lor fiind aceleai ca i la marcajul IMG.

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 recepionat de applet; este de tip String.

6.5. Exemple
Exemplu 1: Exemplific ordinea apelrii metodelor.

78

import javax.swing.*; import java.awt.*; public class app1 extends JApplet{ public void init(){ System.out.println("Sunt in init"); } public void start(){ System.out.println("Sunt in start"); } public void paint(Graphics g){ g.drawString("Sunt in paint", 20, 120); System.out.println("Sunt in paint"); } public void stop(){ System.out.println("Sunt in stop"); } public void destroy(){ System.out.println("Sunt in destroy"); }

Documentul .html este: <HTML> <HEAD> <TITLE> Primul Applet </TITLE> </HEAD> <BODY> <APPLET CODE="app1.class" WIDTH=300 </APPLET> </BODY> </HTML> Exemplu 2: Afieaz nite figuri geometrice. import javax.swing.*; import java.awt.*; public class app2 extends JApplet{ public void paint(Graphics g){ g.setColor(Color.red); g.drawRect(10,10,100,200); g.setColor(new Color(200,100,255)); g.fillRect(20,20,50,50); g.setColor(Color.blue); g.drawOval(60,60,50,50); }

HEIGHT=200>

79

} Documentul .html este: <HTML> <HEAD> <TITLE> Figuri geometrice </TITLE> </HEAD> <BODY> <APPLET CODE="app2.class" WIDTH=300 </APPLET> </BODY> </HTML>

HEIGHT=200>

Exemplu 3: Afieaz lista tuturor font-urilor cunoscute de sistem. import java.awt.*; import javax.swing.*; public class app3 extends JApplet { public void init(){ Container c=getContentPane(); c.setLayout(new FlowLayout()); JTextArea ta=new JTextArea(); JScrollPane sp=new JScrollPane(ta); sp.setPreferredSize(new Dimension(100, 100)); c.add(sp, BorderLayout.CENTER); GraphicsEnvironment gr=GraphicsEnvironment. getLocalGraphicsEnvironment(); Font []f=gr.getAllFonts(); for (int i=0;i<f.length;i++) ta.append(f[i].getFontName()+"\n"); } } Documentul .html este: <HTML> <HEAD> <TITLE> Ce de mai font-uri !!! </TITLE> </HEAD> <BODY> <APPLET CODE="app3.class" WIDTH=300 HEIGHT=200> </APPLET> </BODY> </HTML>

Exemplu 4: Seteaz un font i i tiprete caracteristicile. import javax.swing.JApplet; 80

import java.awt.Graphics; import java.awt.Font; public class app6 extends JApplet { private Font fon; public void init() { fon=new Font("Courier", Font.ITALIC + Font.BOLD, 24); } public void paint (Graphics g) { int stil, dim; String str, nume; g.setFont (fon); stil = fon.getStyle(); if ( stil == Font.PLAIN) str = "Plin"; else if (stil == Font.BOLD) str = "Bold"; else if (stil == Font.ITALIC) str = "Italic"; else str = "Bold italic"; dim = fon.getSize(); str += dim + " puncte "; nume = fon.getName(); str += nume; g.drawString (str, 20, 40); g.drawString ("Familia de font-uri este " + fon.getFamily(), 20, 60); } }

Documentul .html este: <HTML> <HEAD> <TITLE> Ce font frumos !!! </TITLE> </HEAD> <BODY> <APPLET CODE="app6.class" WIDTH=700 </APPLET> </BODY> </HTML>

HEIGHT=200>

81

Exemplu 5: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei. import javax.swing.JApplet; import java.awt.*; public class app7 extends JApplet { int xValues[] = {20, 40, 50, 30, 20, 15, 20}; int yValues[] = {20, 20, 30, 50, 50, 30, 20}; private Polygon p2; public void init () { p2 = new Polygon(); p2.addPoint (70, 70); p2.addPoint (90, 70); p2.addPoint (100, 80); p2.addPoint (80, 100); p2.addPoint (70, 100); p2.addPoint (65, 80); p2.addPoint (60, 60); } public void paint (Graphics g) { //deseneaza conturul unui poligon g.drawPolygon (xValues, yValues, 7); //deseneaza un poligon g.fillPolygon (p2); //copiaza cele doua poligoane la noile coordonate g.copyArea (0, 0, 100, 100, 10,10 ); }

Documentul .html este: <HTML> <HEAD> <TITLE> Ce poligoane... </TITLE> </HEAD> <BODY> <APPLET CODE="app7.class" WIDTH=300 </APPLET> </BODY> </HTML>

HEIGHT=200>

Exemplu 6: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei. import javax.swing.JApplet; import java.awt.*;

82

public class app7 extends JApplet { int xValues[] = {20, 40, 50, 30, 20, 15, 20}; int yValues[] = {20, 20, 30, 50, 50, 30, 20}; private Polygon p2; public void init () { p2 = new Polygon(); p2.addPoint (70, 70); p2.addPoint (90, 70); p2.addPoint (100, 80); p2.addPoint (80, 100); p2.addPoint (70, 100); p2.addPoint (65, 80); p2.addPoint (60, 60); } public void paint (Graphics g) { //deseneaza conturul unui poligon g.drawPolygon (xValues, yValues, 7); //deseneaza un poligon g.fillPolygon (p2); //copiaza cele doua poligoane la noile coordonate g.copyArea (0, 0, 100, 100, 10,10 ); } } Documentul .html este: <HTML> <HEAD> <TITLE> Ce poligoane... </TITLE> </HEAD> <BODY> <APPLET CODE="app7.class" WIDTH=300 </APPLET> </BODY> </HTML>

HEIGHT=200>

Exemplu 7: Suma a dou numere folosind preluarea parametrilor. import javax.swing.*; import java.awt.*; public class suma extends JApplet { int m,n; String s; public void init(){

83

String sm=getParameter("m"), sn=getParameter("n"); m=Integer.parseInt(sm); n=Integer.parseInt(sn); s=new Integer(m+n).toString();

public void paint(Graphics g){ g.drawString("Cmmdc = "+s, 50, 60 ); } } Documentul .html este: <HTML> <HEAD> <TITLE> Suma... </TITLE> </HEAD> <BODY> <APPLET CODE="suma.class" WIDTH=300 <PARAM name="m" value="2"> <PARAM name="n" value="3"> </APPLET> </BODY> </HTML>

HEIGHT=200>

84

7. Interfee grafice
7.1. Ce este o interfa grafic?
Interfaa grafic se refer la toate tipurile de comunicare vizual ntre un program i utilizatorii si. Interfaa 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 dispoziie numeroase clase pentru implementarea diferitelor functionaliti ale interfaei grafice, ns ne vom ocupa n continuare de acelea care permit realizarea unei intefee grafice cu utilizatorul (GUI Graphical User Interface). n principiu, crearea unei aplicaii grafice presupune urmtorii pai: 1. crearea unei suprafee 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 suprafaa de afiare n poziiile corespunztoare; 3. definirea unor aciuni care trebuie s se execute n momentul cnd utilizatorul interacioneaz cu obiectele grafice ale aplicaiei; 4. "ascultarea" evenimentelor generate de obiecte n momentul interaciunii cu utilizatorul i executarea aciunilor corespunztoare aa cum au fost ele definite. n Java exist dou pachete de clase care ofer servicii grafice: java.awt i javax.swing. 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 javax.swing este numele pachetelor pentru Swing API.

85

Majoritatea obiectelor grafice sunt subclase ale clasei JComponent, clas care definete generic o component grafic care poate interaciona cu utilizatorul. Aadar, printr-o component grafic vom nelege orice obiect care are o reprezentare grafic ce poate fi afiat pe ecran i care poate interaciona 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
javax.swing, 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 suprafaa unui applet, i vor deveni vizibile n momentul n care suprafaa pe care sunt afiate va fi vizibil. O astfel de suprafa pe care se aeaz obiectele grafice reprezint o instan a unei clase obinut prin extensia clasei Container; din acest motiv suprafeele de afiare vor mai fi numite i containere. Clasa Container este o subclas aparte a clasei Component, fiind la rndul ei superclasa tuturor suprafeelor de afiare Java (ferestre, applet-uri, etc). Pachetul Swing ofer programelor care folosesc componentele lui posibilitatea s-i aleag natura interfeei (look and feel) sau, pur i simplu, s o conserve pe cea caracteristic platformei respective.

7.2. Primele aplicaii Swing

7.2.1. Exemple
Exemplu 1: O aplicaie de sine stttoare, care nu utilizeaz applet-ul. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 86 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingTest { private static String Prefix = "Numarul de clickuri: "; private int nrClick = 0; JLabel eticheta = new JLabel(Prefix + "0 "); JButton buton = new JButton("Buton Swing!"); public Component creazaComponente() { buton.addActionListener(new ActionListener() {

12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ; 28. 29. 30. 31. 32. 33.

public void actionPerformed(ActionEvent e) { nrClick++; eticheta.setText(Prefix + nrClick); } }); JPanel panou = new JPanel(); panou.setBorder(BorderFactory.createEmptyBorder( 3 0,30,10,30)); panou.setLayout(new FlowLayout()); panou.add(buton); panou.add(eticheta); return panou; }//creazaComponente public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getLookAndFeel()) }catch (Exception e) { } JFrame frame = new JFrame("Prima aplicatie Swing"); SwingTest app = new SwingTest(); Component comp = app.creazaComponente(); frame.getContentPane().add(comp); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); }//main }//class

34. 35. 36. 37.

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 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. Exemplu 2: O aplicaie care utilizeaz applet-ul. 1. 2. 3. import javax.swing.*; import java.awt.*; public class SwingAppletTest extends JApplet { (sus,

87

4. 5. 6. 7.

public void init() { JLabel eticheta=new JLabel("O eticheta frumoasa!"); eticheta.setHorizontalAlignment(JLabel.CENTER); 1,1,

label.setBorder(BorderFactory.createMatteBorder( 2,2,Color.black)); 8. getContentPane().add(eticheta, BorderLayout.CENTER); 9. } 10. }

7.2.2. Comentarea exemplelor

7.2.2.1 Alegerea naturii interfeei


n codul urmtor se specific natura interfeei: try { UIManager.setLookAndFeel( UIManager. getLookAndFeel()); } catch (Exception e) { }

7.2.2.2 Setarea container-ului principal (din vrful ierarhiei)


Orice program care prezint o GUI Swing conine cel puin un container Swing. n general, container-ele principale sunt instane ale lui JFrame, JDialog sau (pentru appleturi) JApplet. Fiecare obiect JFrame implementeaz o singur fereastr principal, fiecare obiect JDialog cte o fereastr secundar i fiecare obiect
JApplet 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 JFrame i este creat n linia 29. n exemplu 2 container-ul folosit este JApplet (vezi linia 3). Aplicaiile Swing grupeaz etichetele i butoanele ntr-un container (un
JPanel) 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 poziia fiecrei componente care este adugat pe container.

88

7.2.2.3 Manipularea evenimentelor


Aplicaia din exemplu 1 conine dou evenimente tratate. Una trateaz click-ul pe buton (action events); cealalt trateaz nchiderea ferestrei (window events): button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); ... frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

7.3. Containere principale


Dup cum am vzut, suprafeele de afiare ale componentelor grafice (containerele) sunt extensii ale clasei Container. Spre deosebire de un applet care i poate plasa componentele direct pe suprafaa de afiare a browser-ului n care ruleaz, o aplicaie 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 suprafa de afiare sau container i reprezint o instan a unei clase obinut prin extensia superclasei Container. Cele mai importante containere principale sunt: JWindow i JApplet. Ierarhia de clase este: java.awt.Container |__ java.awt.Panel |__ java.applet.Applet |__ javax.swing.JApplet |__ java.awt.Window |__ java.awt.Frame | |__ javax.swing.JFrame |__ java.awt.Dialog | |__ javax.swing.JDialog |__ javax.swing.JWindow JFrame, JDialog,

89

7.3.1. Clasa JFrame


Clasa JFrame 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, poziionare) este controlat de sistemul de operare. Constructorii clasei JFrame sunt: JFrame() construiete o fereastr, fr titlu, iniial invizibil. JFrame(String title) construiete o fereastr, cu titlu specificat, iniial invizibil. Aadar, o fereastr nou creat este invizibil. Pentru a fi fcut vizibil se va apela metoda show(). Exemplu 3: Se construiete i se afieaz o fereastr cu titlul "Prima fereastra". import javax.swing.*; public class AplJFrame { public static void main(String args[]) { JFrame f = new JFrame("Prima fereastra"); f.show(); } } Cteva dintre metodele cele mai folosite ale clasei JFrame sunt prezentate n continuare. Metoda pack() este folosit pentru a da o dimensiune frame-ului. O alternativ pentru pack() este setarea explicit a dimensiunii frame-ului prin apelarea metodei setSize(). n general, folosirea lui pack() este preferabil folosirii lui setSize(), deoarece pack() las n seama layout manager-ului calculul dimensiunii frame-ului care ine seama i de ali factori care pot afecta dimensiunea componentelor. Metoda setVisible() este folosit pentru a afiarea frame-ului. Metoda getContentPane() returneaz obiectul contentPane al frame-ului. Orice component se adaug pe contentPane-ul frame-ului curent. Exemplu 4:

90

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicFrame{ public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getLookAndFeel()); } catch (Exception e) { } /*Se creaza container-ul principal (din varful ierarhiei) si se adauga componentele pe el*/ JFrame frame = new JFrame(); JLabel comp = new JLabel("eticheta1"); JLabel comp1 = new JLabel("eticheta2"); //eticheta2 va fi pusa peste eticheta1 frame.getContentPane().add(comp); frame.getContentPane().add(comp1); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } }

7.3.2. Ferestre secundare i clasa JDialog


Pentru a crea ferestre secundare se folosete, de obicei, JDialog. Alte ferestre secundare pot fi create cu: JOptionPane creeaz o fereastr standard de dialog ProgressMonitor creeaz o fereastr care arat progresul unei operaii JColorChooser creeaz o fereastr pentru alegerea culorii JFileChooser creeaz o fereastr pentru selectarea unui fiier Exemplu 5: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicJOptionPane{ 91

public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getLookAndFeel()); } catch (Exception e) { } JFrame frame = new JFrame(); JButton b=new JButton("Apasa-ma"); frame.getContentPane().add(b); b.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(new Frame(), "Fereastra de informare"); } }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(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:

JOptionPane.showMessageDialog fereastr modal nzestrat cu un buton. Se poate specifica mesajul, icoana i titlul ferestrei . JOptionPane.showOptionDialog fereastr modal nzestrat cu butoane, mesaj, icoana i titlul ferestrei. Pot fi modificate de utilizator.

Exemplu 6: Object[] options = {"Da!!!","Niciodata!!!","Cine stie!!!"}; int n=JOptionPane.showOptionDialog( new Frame(), "Ma parasesti?", "Fereastra de Optiuni", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]);

92

JOptionPane.showConfirmDialog nzestrat cu dou butoane.

fereastr

modal

Exemplu 7: JOptionPane.showConfirmDialog( null, "Alege un buton", "Fereastra de confirmare", JOptionPane.YES_NO_OPTION); Parametrii folosii de aceste metode: parentComponent: poate fi frame-ul care conine 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; messageType: definete stilul mesajului. Valori posibile sunt: ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE

optionType: definete mulimea de butoane care apar pe fereastr: DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION

Pot fi folosite i alte tipuri de butoane; options: descriere detaliat a mulimii butoanelor afiate pe fereastr; n general, este un vector de String-uri; icon: icoana afiat pe fereastr; title: titlul ferestrei; initialValue: butonul selectat implicit.

93

Metodele showMessageDialog, showConfirmDialog i showOptionDialog

returneaz un ntreg semnificnd opiunea utilizatorului. Valorile acestui ntreg pot fi


YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION i CLOSED_OPTION.

Ferestre de dialog nemodale se pot crea cu JDialog. JDialog este folosit pentru implementarea ferestrelor secundare (cum ar fi dialog boxes i alert boxes) 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 operaia de nchidere implicit. Exemplu 8: import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Dialog{ public static void main(String a[]){ final JFrame frame=new JFrame("Frame-ul meu"); Container contentPane = frame.getContentPane(); contentPane.setLayout(new GridLayout(1,1)); JButton Buton = new JButton("Apasa-ma!"); contentPane.add(Buton); Buton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Apasa-ma!")) { final JDialog dialog=new JDialog(frame, "O fereastra copil",true); Container c=dialog.getContentPane(); JLabel label=new JLabel("Eticheta frumoasa"); c.add(label); dialog.pack(); dialog.setVisible(true); } } }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true);

} }

94

7.3.3. Clasa JWindow


Clasa fereastr. Exemplu 9: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicJWindow { public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getLookAndFeel()); } catch (Exception e) { } final JFrame frame=new JFrame("Frame-ul meu"); Container contentPane = frame.getContentPane(); contentPane.setLayout(new GridLayout(1,1)); JButton Buton = new JButton("Apasa-ma!"); contentPane.add(Buton); Buton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Apasa-ma!")) { JWindow win = new JWindow(); JRootPane pane=new JRootPane(); JLabel label=new JLabel("hasd"); pane.setLayout(new FlowLayout()); pane.add(label); win.getContentPane().add(pane); win.setSize(200,200); win.setVisible(true); } } }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } } JWindow este folosit pentru implementarea ferestrelor pline

(dreptunghiuri albe pline). Aceste ferestre nu conin bar de titlu sau controale de

95

7.3.4. Clasa JApplet


Clasa JApplet este folosit pentru implementarea applet-urilor. A se vedea exemplul 2. Forma containere-lor principale este ilustrat n figura urmtoare:

7.4. Containere intermediare

Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele intermediare folosesc la mprirea ferestrei n mai multe zone sau la gruparea componentelor. Swing furnizeaz urmtoarele containere intermediare: Panel Este cel mai flexibil i frecvent utilizat container intermediar. Se implementeaz folosind clasa JPanel. 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). 96

Scroll Pane Split Pane Tabbed Pane Tool Bar

Furnizeaz scroll bar (orizontal i vertical) pentru componentele prea mari. Afieaz dou componente ntr-un spaiu fix, oferind utilizatorului posibilitatea s redimensioneze fiecare component. Conine mai multe componente dar afieaz numai una la un moment dat. Utilizatorul poate alege ntre componente. Grupeaz componentele (n general butoane) ntr-o linie sau o coloan, permind utilizatorului s o mute oriunde.

Forma containere-lor intermediare este ilustrat n figura urmtoare:

Exemplu 10: Pentru JScrollPane JFrame frame = new JFrame("Doar un exemplu"); JTextArea t = new JTextArea(20, 40); JScrollPane scrpane=new JScrollPane(t);

97

scrpane.setPreferredSize(new Dimension(100, 100)); frame.getContentPane().add(scrpane); for(int i=0;i<100;i++) t.append(i+"\n");//(new Integer(i)).toString()); Exemplu 11: Pentru JSplitPane JFrame frame = new JFrame("Doar un exemplu"); JTextArea t=new JTextArea(); for(int i=0;i<100;i++) t.append(i+"\n"); JLabel label=new JLabel("hjsdkljasldjasljdlafj"); JSplitPane splitpane=new JSplitPane(); splitpane.setOneTouchExpandable(true); splitpane.setLeftComponent(t); splitpane.setRightComponent(label); splitpane.setPreferredSize(new Dimension(100, 100)); frame.getContentPane().add(splitpane); Exemplu 11: Pentru JTabbedPane import import import import import javax.swing.JTabbedPane; javax.swing.ImageIcon; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JFrame;

import java.awt.*; import java.awt.event.*; public class AplicTabbed extends JPanel { public AplicTabbed() { JTabbedPane tabbedPane = new JTabbedPane(); Component panel1 = crearePanel("Salut"); tabbedPane.addTab("Unu", panel1); tabbedPane.setSelectedIndex(0); Component panel2 = crearePanel("Salut Salut"); tabbedPane.addTab("Doi", panel2); Component panel3 = crearePanel("Salut Salut Salut"); tabbedPane.addTab("Trei", panel3); Salut"); Component panel4 = crearePanel("Salut Salut Salut tabbedPane.addTab("Patru", panel4); //Se adauga tabbed pane-ul pe panel. setLayout(new GridLayout(1, 1)); add(tabbedPane); 98

} protected Component crearePanel(String text) { JPanel panel = new JPanel(false); JLabel label = new JLabel(text); label.setHorizontalAlignment(JLabel.CENTER); panel.setLayout(new GridLayout(1, 1)); panel.add(label); return panel; } public static void main(String[] args) { JFrame frame = new JFrame("Exemplu de TabbedPane"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add( new AplicTabbed(), BorderLayout.CENTER); frame.setSize(400, 125); frame.setVisible(true);

} }

Figura urmtoare ilustreaz execuia exemplului.

7.5. Folosirea gestionarilor de poziionare (Layout Manager)


Un program poate avea interfee diferite, chiar dac sunt folosite aceleai componente. Acest lucru se datoreaz folosirii a diferii gestionari de poziionare care controleaz dimensiunea i poziiile componentelor. Gestionarea poziionrii este procesul prin care se determin dimensiunea i poziia componentelor. Implicit, fiecare container are un gestionar de poziionare un obiect care gestioneaz poziionarea fiecrei componente de pe container. Acest obiect implementeaz interfaa LayoutManager. Acesta poate fi nlocuit cu altul care

99

s fie pe msura cerinelor. n general, se seteaz gestionarul de poziionare pentru dou tipuri de containere: contentpane (folosete implicit BorderLayout) i JPanel (folosete implicit FlowLayout). De cte ori se adaug o component pe container trebuie inut cont de gestionarul de poziionare al containerului respectiv.

7.5.1. Setarea poziionrii (Layout Managerului)


Pentru schimbarea layout manager-ului folosit de un container se apeleaz metoda setLayout. Metoda poate primi ca parametru orice instan a unei clase care implementeaz interfaa LayoutManager. Secvena de ataare a unui gestionar pentru un container este: FlowLayout gestionar = new FlowLayout(); container.setLayout(gestionar); sau: container.setLayout(new FlowLayout()); De exemplu: JPanel jp = new JPanel(); jp.setLayout(new BorderLayout()); Dac argumentul este null, container-ul nu folosete un layout manager. n acest caz trebuie specificate dimensiunile i poziiile fiecrei componente de pe container. Cei mai folosii gestionari n Java sunt: BorderLayout, BoxLayout, FlowLayout, GridBagLayout i GridLayout.

7.5.1.1 BorderLayout
BorderLayout este layout manager-ul implicit pentru fiecare container

principal. Un BorderLayout are cinci zone n care pot fi aezate componentele: nord, sud, est, vest i centru. Exemplu 12: 1. 2. import javax.swing.*; import java.awt.*;

100

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

import java.awt.event.*; public class AplicBorderLayout extends JFrame{ public static void main(String[] args) { AplicBorderLayout f=new AplicBorderLayout(); Container contentPane = f.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(new JButton("Buton 1 NORD"), BorderLayout.NORTH); contentPane.add(new JButton("2 CENTRU"), BorderLayout.CENTER); contentPane.add(new JButton("Buton 3 VEST"), BorderLayout.WEST); contentPane.add(new JButton("Buton 4 SUD"), BorderLayout.SOUTH); contentPane.add(new JButton("Buton 5 EST"), BorderLayout.EAST); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(400, 125); f.setVisible(true); } }

15. 16. 17. 18.

innd cont c pentru frame-uri gestionarul implicit este BorderLayout, linia 8 nu mai este necesar. Rezultatul execuiei acestui program este:

7.5.1.2 BoxLayout
Gestionarul BoxLayout aeaz componentele pe o singur linie sau coloan.

Respect dimensiunile minime ale componentelor i permite alinierea lor. Exemplu 13: import javax.swing.*; 101

import java.awt.*; import java.awt.event.*; public class AplicBoxLayout extends JFrame{ private static void adaugBut(String text, Container container, float unde) { JButton button = new JButton(text); button.setAlignmentX(unde); container.add(button); } public static void main(String[] args) { AplicBoxLayout f=new AplicBoxLayout(); Container contentPane = f.getContentPane(); contentPane.setLayout(new BoxLayout( contentPane, BoxLayout.Y_AXIS)); adaugBut("Buton 1", contentPane, Component.CENTER_ALIGNMENT); adaugBut("2", contentPane,Component.RIGHT_ALIGNMENT); adaugBut("Buton 3", contentPane, Component.LEFT_ALIGNMENT); adaugBut("Buton 4 foarte lung", contentPane, Component.CENTER_ALIGNMENT); adaugBut("Buton 5", contentPane, Component.LEFT_ALIGNMENT); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);} }); f.pack(); f.setVisible(true);

} }

Rezultatul execuiei acestui program este:

102

7.5.1.3 CardLayout
Clasa CardLayout permite implementarea unei arii care conine diferite

componente la momente diferite. Tabbed pane-urile sunt containere intermediare care furnizeaz o funcionalitate similar. Un CardLayout este n general controlat de un Combo Box, starea lui determinnd panel-ul de afiat. Exemplu 14: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AplicCardWindow extends JFrame implements ItemListener { JPanel cards; String BUTONPANEL = "Panel cu Butoane"; String TEXTPANEL = "Panel cu TextField-uri"; public AplicCardWindow() { Container contentPane = getContentPane(); String comboBoxItems[] = { BUTONPANEL, TEXTPANEL }; JPanel cbp = new JPanel(); JComboBox c = new JComboBox(comboBoxItems); c.setEditable(false); c.addItemListener(this); cbp.add(c); contentPane.add(cbp, BorderLayout.NORTH); cards = new JPanel(); cards.setLayout(new CardLayout()); JPanel p1 = new JPanel(); p1.add(new JButton("Buton 1")); p1.add(new JButton("Buton 2")); p1.add(new JButton("Buton 3")); JPanel p2 = new JPanel(); p2.add(new JTextField("TextField", 20)); cards.add(p1, BUTONPANEL); cards.add(p2, TEXTPANEL); contentPane.add(cards, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); 103

} public void itemStateChanged(ItemEvent evt) { CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, (String)evt.getItem()); } public static void main(String args[]) { AplicCardWindow window = new AplicCardWindow(); window.setTitle("CardLayout"); window.pack(); window.setVisible(true); }

n imaginea urmtoare se vd cele dou stri ale ferestrei n funcie de starea Combo Box-ului:

7.5.1.4 FlowLayout
FlowLayout este layout manager-ul implicit pentru orice JPanel. Aeaz

componentele de la stnga spre dreapta, de sus n jos. Exemplu 15: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicFlowLayout extends JFrame{ private static void adaugBut(String text, Container container){ JButton button = new JButton(text); container.add(button); } public static void main(String[] args) { AplicFlowLayout f=new AplicFlowLayout(); Container contentPane = f.getContentPane(); contentPane.setLayout(new FlowLayout()); adaugBut("Buton 1", contentPane); adaugBut("2", contentPane); adaugBut("Buton 3", contentPane); 104

adaugBut("Buton 4 foarte lung", contentPane); adaugBut("Buton 5", contentPane); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);} }); f.pack(); f.setVisible(true); } Rezultatul execuiei acestui program este:

7.5.1.5 GridLayout
GridLayout-ul

aeaz

componentele

celulele

unui

tabel.

Fiecare

component ocup tot locul disponibil din celul. Toate celulele au aceeai dimensiune. La redimesionarea ferestrei GridLayout-ului, celulele i vor schimba dimensiunile astfel nct s fie ocupat tot spaiul ferestrei. Clasa GridLayout are doi constructori: public GridLayout(int rows, int columns) public GridLayout(int rows, int columns, int horizontalGap, int verticalGap) Cel puin unul din cele dou argumente rows i columns trebuie s fie nenul. Argumentele horizontalGap i verticalGap din cel de-al doilea constructor permit specificarea numrului de pixeli dintre celule. Implicit ele au valoarea 0. Exemplu 16: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicGridLayout extends JFrame{ public static void main(String[] args) { AplicGridLayout f=new AplicGridLayout(); Container contentPane = f.getContentPane(); contentPane.setLayout(new GridLayout(0,2)); 105

} }

contentPane.add(new JButton("Buton 1")); contentPane.add(new JButton("2")); contentPane.add(new JButton("Buton 3")); contentPane.add(new JButton("Buton 4 foarte lung")); contentPane.add(new JButton("Buton 5")); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);} }); f.pack(); f.setVisible(true);

Rezultatul execuiei acestui program este:

Constructorul apelat creeaz o instan a lui GridLayout care are dou coloane i oricte linii sunt necesare new GridLayout(0,2).

7.5.1.6 GridBagLayout
GridBagLayout 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 nlime / lime. Pentru fiecare component care se adaug pe fereastr se seteaz o serie de constrngeri prin crearea unui obiect al clasei GridBagConstraints. Aceeai instan a lui GridBagConstraints poate fi folosit pentru mai multe componente, chiar dac ele au constrngeri diferite. GridBagLayout extrage valorile constrngerilor i nu refolosete

GridBagConstraints. Clasa conine urmtoarele atribute care pot fi setate: gridx, gridy=0. gridy Specific linia i coloana colului din stnga sus a componentei. Coloana cea mai din stnga are gridx=0 iar linia cea mai de sus are

106

gridwidth, implicit este 1.

gridheight Reprezint numrul de coloane (pentru

gridwidth) sau de linii (pentru gridheight) pe care va fi afiat componenta. Valoarea fill 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), HORIZONTAL (mrete componenta pe orizontal astfel nct s acopere ntreaga suprafa disponibil dar nu schimb nlimea),

VERTICAL (mrete componenta pe vertical astfel nct s acopere ntreaga suprafa disponibil dar nu schimb limea), BOTH (mrete componenta astfel nct s acopere ntreaga suprafa disponibil.

ipadx, ipady Folosite pentru redimensionarea celulelor. Specific ct trebuie adunat la dimensiunea minim a componentei. Valoarea implicit este 0. Limea / nlimea va avea valoarea minim plus ipadx*2 / ipady*2 pixeli (se aplic n ambele capete ale componentei). insets Specific distana dintre component i colurile suprafeei pe care se afieaz. Valoarea atribuit este un obiect Insets. anchor Este folosit atunci cnd componenta este mai mic dect suprafaa 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. weightx, weighty Folosite pentru a determina modul n care s fie repartizat spaiul dintre coloane / linii. Dac nu se specific nici o valoare (implicit este 0) atunci toate componentele vor fi grupate n centru container-ului deoarece GridBagLayout pune orice spaiu n plus ntre tabel i colurile container-ului. Exemplu 17: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AplicGridBagLayout extends JFrame { final boolean shouldFill = true; final boolean shouldWeightX = true; 107

public AplicGridBagLayout() { JButton buton; Container contentPane = getContentPane(); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); contentPane.setLayout(gridbag); if (shouldFill) { //inaltime implicita, latime maxima c.fill = GridBagConstraints.HORIZONTAL; } buton = new JButton("Buton 1"); if (shouldWeightX) { c.weightx = 0.5; } c.gridx = 0; c.gridy = 0; gridbag.setConstraints(buton, c); //constrangerile impuse sunt atasate componentei contentPane.add(buton); buton = new JButton("2"); c.gridx = 1; c.gridy = 0; gridbag.setConstraints(buton, c); contentPane.add(buton); buton = new JButton("Buton 3"); c.gridx = 2; c.gridy = 0; gridbag.setConstraints(buton, c); contentPane.add(buton); buton = new JButton("Buton 4 foarte lung"); c.ipady = 40; //seteaza cu cat va creste inaltimea componentei c.weightx = 0.0; c.gridwidth = 3; c.gridx = 0; c.gridy = 1; gridbag.setConstraints(buton, c); contentPane.add(buton); buton = new JButton("Button 5"); c.ipady = 0; //se revine la inaltimea implicita c.weighty = 1.0; //spatiu vertical intre celule suplimentar c.anchor = GridBagConstraints.SOUTH; //componenta va fi plasata in partea de jos a ferestrei c.insets = new Insets(10,0,0,0);

108

c.gridx = 1; //componenta se alinieaza cu butonul 2 c.gridwidth = 2; //ocupa latimea a doua butoane c.gridy = 2; //se afla pe a treia linie gridbag.setConstraints(buton, c); contentPane.add(buton); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { AplicGridBagLayout window = new AplicGridBagLayout(); window.setTitle("Exemplu GridBagLayout"); window.pack(); window.setVisible(true); } } Rezultatul execuiei acestui program este:

7.6. Tratarea 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 interfaa corespunztoare i s fie nregistrat ca un consumator de evenimente (event listener). Componentele Swing pot genera mai multe tipuri de evenimente. Cteva dintre interfeele corespunztoare ar fi: ActionListener aciuni asupra unui control (click pe un buton, Enter dup introducerea unui text ntr109

ComponentListener FocusListener ItemListener TextListener AdjustmentListener KeyListener MouseListener MouseMotionListener WindowListener ContainerListener ListSelectionListener

un cmp, selectarea ntr-un meniu) redimensionri, deplasri, ascunderi ale unei componente preluare / pierdere focus selecie / deselecie obiect n list, meniu, etc. modificarea textului din control modificarea unei valori variind ntre dou limite (ex: ScrollBar) acionarea unei taste apsarea butonului mouse-ului n timp ce cursorul se afl pe componenta respectiv drag; micarea mouse-ului pe o component nchidere, minimizare, maximizare etc. adugare, tergere component schimbarea seleciei ntr-o tabel sau ntr-o list

Fiecare eveniment este reprezentat de un obiect care d informaii despre eveniment i identific sursa evenimentului. Fiecare generator de eveniment poate avea mai muli consumatori. generator obiect eveniment /----> consummator de eveniment de eveniment------------------------------------------> consummator de eveniment \----> consummator de eveniment

Un eveniment, o dat aprut, este distribuit tuturor asculttorilor nregistrai (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 condiia 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

110

addXXXListener, iar eliminarea ei din aceasta lista cu removeXXXListener unde XXX reprezint tipul evenimentului.

7.6.1. Exemplu de tratare a unui eveniment


Sunt necesari urmtorii pai: 1. Clasa trebuie s implementeze interfaa corespunztoare sau s

extind o clas care implementeaz interfaa. public class NumeClasa implements ActionListener {...} 2. Scrierea codului care nregistreaz o instan a clasei (care va

consuma evenimentul) ca i consumator pentru una sau mai multe componente. Componenta.addActionListener(instantaNumeClasa); 3. consumator. public void actionPerformed(ActionEvent e) { //cod care reacioneaza la aciune } Exemplu 18: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicEv extends JFrame{ JButton uB,lB,rB; JPanel pbut; JTextField txt; Listener lsn; TextWorker txtWorker; public AplicEv() { uB=new JButton("Majuscule"); lB=new JButton("Minuscule"); rB=new JButton("Sterge"); uB.setActionCommand("ActMajuscule"); lB.setActionCommand("ActMinuscule"); 111 Scrierea codul care implementeaz metodele din interfaa

pbut=new JPanel(); pbut.add(uB); pbut.add(lB); pbut.add(rB); txt= new JTextField("Introduceti text!"); lsn=new Listener(); getContentPane().setLayout(new BorderLayout()); getContentPane().add("North",txt); getContentPane().add("Center",lsn); getContentPane().add("South",pbut); txtWorker=new TextWorker(txt); rB.addActionListener(lsn); uB.addActionListener(lsn); lB.addActionListener(lsn); rB.addActionListener(txtWorker); uB.addActionListener(txtWorker); lB.addActionListener(txtWorker); } public static void main(String[] args) { AplicEv f=new AplicEv(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.addWindowListener(f.lsn); f.setSize(400, 125); //f.pack(); f.setVisible(true);

} }

class TextWorker implements ActionListener { private JTextField txt; public TextWorker(JTextField txt){ this.txt=txt; } public void actionPerformed(ActionEvent e){ String c=e.getActionCommand(); if(c.equals("Sterge")) txt.setText(""); if(c.equals("ActMajuscule")){ String oldText=txt.getText(); String uText=oldText.toUpperCase(); txt.setText(uText); } if(c.equals("ActMinuscule")){ String oldText=txt.getText(); 112

String lText=oldText.toLowerCase(); txt.setText(lText); } } class Listener extends JTextArea implements ActionListener, WindowListener{ public Listener(){ super(); this.setEditable(false); } public void actionPerformed(ActionEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowClosed(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowOpened(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowClosing(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowIconified(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowDeiconified(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowActivated(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } public void windowDeactivated(WindowEvent e){ append(e.paramString()+" [ "+e.toString()+" ]\n"); } } Rezultatul execuiei programului este: }

7.7. Folosirea componentelor

7.7.1. Clasa JLabel

113

Un obiect de tip JLabel (etichet) 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.

7.7.2. Clasa JButton


Un obiect de tip JButton (buton) reprezint o component pentru plasarea unui buton etichetat pe o suprafa de afiare.

7.7.3. Clasa JTextField


Un obiect de tip JTextField definete un control de editare a textului pe o singur linie. Este util pentru interogarea utilizatorului asupra unor valori.

7.7.4. Clasa JTextArea


Un obiect de tip JTextArea definete un control de editare a textului pe mai multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc .

7.7.5. Clasa JCheckBox


Un obiect de tip JCheckbox (comutator) reprezint o component care se poate afla n dou stri : "selectat" sau "neselectat" (on/off). Aciunea utilizatorului asupra unui comutator l trece pe acesta n starea complementar celei n care se gsea. Este folosit pentru a prelua o anumit opiune de la utilizator.

7.7.6. Clasa JRadioButton


Un obiect de tip JRadioButton definete un grup de comutatoare din care doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio butoane.

114

7.7.7. Clasa JComboBox


Un obiect de tip JComboBox definete o list de opiuni din care utilizatorul poate selecta una singur. La un moment dat, din ntreaga lista doar o singur opiune este vizibil, cea selectat. O component JComboBox este nsoit de un buton etichetat cu o sgeat vertical la apsarea cruia este afiat ntreaga sa list, pentru ca utilizatorul s poat selecta o anumit opiune.

7.7.8. Clasa JList


Un obiect de tip JList definete o list de opiuni care poate fi setat astfel nct utilizatorul s poat selecta o singur opiune sau mai multe. Toate opiunile listei sunt vizibile n limita dimensiunilor grafice ale componentei.

7.7.9. Clasa JScrollBar


Un obiect de tip JScrollbar definete o bar de defilare vertical sau orizontal. Este util pentru punerea la dispoziie a utilizatorului a unei modaliti sugestive de a alege o anumit valoare dintr-un interval. 1.1.1. Instruciuni repetitive........................................................................4 1.2. Tablouri (vectori).....................................................................................8 1.2.1. Tablouri (vectori) unidimensionale....................................................8 1.2.2. Tablouri (vectori) cu mai multe dimensiuni.....................................10 1.2.3. Dimensiunea unui vector ...............................................................10 1.2.4. Tablouri cu dimensiuni variabile.....................................................12 1.3. iruri de caractere................................................................................13 2. Clase i obiecte n Java..............................................................................14 2.1. Referine...............................................................................................14 2.2. Obiecte.................................................................................................15 2.2.1. Noiuni generale.............................................................................15 2.2.2. Operatorul de atribuire =................................................................16 2.2.3. Operatorul de egalitate ==..............................................................18

115

2.3. Clase....................................................................................................19 2.3.1. Definirea claselor...........................................................................19 2.3.2. Variabile membru...........................................................................20 2.3.3. Metode...........................................................................................22 2.3.3.1 Definirea metodelor..................................................................22 2.3.3.2 Modificatorii metodelor..............................................................22 2.3.3.3 Tipul returnat de o metod........................................................23 2.3.3.4 Parametrii unei metode.............................................................24 2.3.4. Constructorii unei clase..................................................................25 2.3.5. Obiectul this...................................................................................27 2.3.6. Suprancrcarea i supradefinirea metodelor.................................29 2.3.7. Modificatori de acces pentru membrii unei clase............................30 2.3.8. Membrii instan i membrii clas..................................................31 2.3.9. Argumente n linia de comand......................................................34 2.4. Motenirea............................................................................................36 2.4.1. Principiul motenirii........................................................................36 2.4.2. Interfee..........................................................................................40 2.5. Probleme..............................................................................................43 3. Pachete.......................................................................................................51 3.1. Importul unui pachet, al unei clase sau a unei interfee........................52 3.2. Crearea unui pachet.............................................................................53 4. Excepii ......................................................................................................58 4.1. Aspecte generale..................................................................................58 4.2. Instruciunea try....................................................................................59 4.3. Crearea unei excepii............................................................................61 5. Intrri i ieiri ..............................................................................................65 5.1. Clasificarea fluxurilor............................................................................66 5.2. Ierarhia claselor pentru lucrul cu fluxuri................................................66 5.2.1. Fluxuri de caractere.......................................................................66 5.2.2. Fluxuri de octei..............................................................................67 5.3. Superclasele de intrare / ieire.............................................................68 5.4. Crearea unui flux..................................................................................69 5.5. Citirea datelor de la tastatur................................................................70 5.5.1. Obiectul System.in.........................................................................70

116

5.5.2. Clasa InputStreamReader..............................................................71 5.5.3. Clasa BufferedReader....................................................................71 5.6. Citirea i scrierea datelor din fiier.......................................................72 5.6.1. Clasele FileReader i FileWriter ....................................................72 6. Applet-uri ....................................................................................................74 6.1. Ce este un applet?................................................................................74 6.2. Funciile unui applet .............................................................................75 6.3. Structura general a unui applet ..........................................................76 6.4. HTML....................................................................................................77 6.5. Exemple................................................................................................78 7. Interfee grafice...........................................................................................85 7.1. Ce este o interfa grafic?...................................................................85 7.2. Primele aplicaii Swing..........................................................................86 7.2.1. Exemple.........................................................................................86 7.2.2. Comentarea exemplelor.................................................................88 7.2.2.1 Alegerea naturii interfeei .........................................................88 7.2.2.2 Setarea container-ului principal (din vrful ierarhiei).................88 7.2.2.3 Manipularea evenimentelor.......................................................89 7.3. Containere principale............................................................................89 7.3.1. Clasa JFrame.................................................................................90 7.3.2. Ferestre secundare i clasa JDialog .............................................91 7.3.3. Clasa JWindow .............................................................................95 7.3.4. Clasa JApplet ................................................................................96 7.4. Containere intermediare.......................................................................96 7.5. Folosirea gestionarilor de poziionare (Layout Manager)......................99 7.5.1. Setarea poziionrii (Layout Managerului)..................................100 7.5.1.1 BorderLayout..........................................................................100 7.5.1.2 BoxLayout...............................................................................101 7.5.1.3 CardLayout.............................................................................103 7.5.1.4 FlowLayout.............................................................................104 7.5.1.5 GridLayout .............................................................................105 7.5.1.6 GridBagLayout .......................................................................106 7.6. Tratarea evenimentelor ......................................................................109 7.6.1. Exemplu de tratare a unui eveniment ..........................................111

117

7.7. Folosirea componentelor....................................................................113 7.7.1. Clasa JLabel................................................................................113 7.7.2. Clasa JButton ..............................................................................114 7.7.3. Clasa JTextField .........................................................................114 7.7.4. Clasa JTextArea ..........................................................................114 7.7.5. Clasa JCheckBox.........................................................................114 7.7.6. Clasa JRadioButton .....................................................................114 7.7.7. Clasa JComboBox .......................................................................115 7.7.8. Clasa JList ...................................................................................115 7.7.9. Clasa JScrollBar ..........................................................................115

118