Sunteți pe pagina 1din 20

Paradigme de Programare Laboratorul 3

Laboratorul 3
3.1. Limbajul Java

3.1.1. Introducere Tehnologia Java este n acelai timp un limbaj de programare i o platform. Limbajul de programare Java este un limbaj de nivel nalt ce poate fi caracterizat de multe atribute: orientat obiect, simplu, dinamic, portabil, independent de arhitectur, robust, distribuit. Codul surs este scris n fiiere text cu extensia .java. Aceste fiiere sunt compilate cu compilatorul javac n fiiere .class. Fiierele compilate nu conin cod nativ procesorului ci conin bytecode, limbajul main folosit de Java Virtual Machine (JVM). Aplicaiile java sunt lansate n cadrul unei instane JVM prin utilitarul java. JVM este disponibil pe multe sisteme de operare (Windows, Solaris, Linux, Mac), de unde rezult c i aplicaiile java deja compilate pot rula pe aceste sisteme fr a mai fi necesar recompilarea codului surs. O platform este un mediu (hard sau soft) n care o aplicaie ruleaz. Multe astfel de platforme sunt o combinaie ntre sistemul de operare i suportul hard pe care ruleaz: Windows, Linux . Platforma Java este un tip diferit de platform (doar soft) care ruleaz pe aceste platforme menionate anterior. Se deduce deci ca java este o platform independent dar i faptul c poate fi un pic mai lent dect codul nativ de pe platformele de baz. Platforma are dou componente: JVM (Java Virtual Machine) i Java API (Application Programming Interface). API-ul Java este o colecie de componente deja create care pot oferi multe funcionaliti utile. Aceste librrii sunt grupate n librrii de clase i interfee nrudite: packages.

Orice implementare complet de platform Java trebuie s ofere urmtoarele: Tool-uri de dezvoltare: principalele sunt javac, java i javadoc. API-ul: ofer funcionalitatea de baz a limbajului de programare precum i o arie larg de componente gata de folosit: Java SE 6 doc. Tehnologii de deployment: mecanisme precum Java Web Start sau Java Plug-In. Kit-uri pentru crearea interfeelor utilizator: AWT, Swing, Java 2D.

3.1.2. Variabile n Java exist urmtoarele tipuri de variabile: Variabile de instan. Sunt unice fiecrei instane le clasei. Variabile de clas. O singur copie pentru toate instanele clasei. Se folosete modificatorul de acces static. 1

Paradigme de Programare Laboratorul 3 Variabile locale. Variabile temporare declarate n cadrul unei metode. Sunt vizibile doar n cadrul acelei metode. Parametri. Variabilele prin care se trimit argumente la apelul metodelor.

Convenii de denumire Numele variabilelor sunt case-sensitive i pot fi orice identificator legal: orice lungime, cifre i caractere Unicode, trebuie s nceap cu un caracter, $ sau _. Se convine ca numele variabilelor s respecte notaia Cammel: ex. getCurrentValue. Pentru variabilele constante se convine o notaie de genul: NUMBER_OF_ROWS.

Tipuri de date primitive Tipul de Reprezentare date byte short int long float double boolean char 16 bii \u0000 \uffff 8 bii 16 bii 32 bii 64 bii 32 bii 64 bii Valoare minim Valoare maxim Valoare default 0 0 0

-128 -32,768 -2,147,483,648 -9,223,372,036,854,775,808

127 32,767 2,147,483,647

9,223,372,036,854,775,807 0L 0.0f 0.0d false \u0000

Valorile default se aplic n cazul variabilelor membre de clas. Variabilele locale nu sunt iniializate implicit de compilator i trebuie iniializate de ctre programator nainte de a fi accesate. Pentru lucrul cu irurile de caractere se folosete clasa special java.lang.String. Obiectele String n Java sunt immutable: odat create, valoarea lor nu mai poate fi modificat prin nici un fel de operaii. Valoarea default pentru obiectele String este null, la fel ca pentru orice alt obiect. Arrays Un array (vector) este un container care conine un numr fix de valori de acelai tip. Lungimea vectorului este stabilit la crearea sa, dup care rmne fix. Un obiect din array se numete element. Declarare
int[] numbers;

Creare i iniializare
numbers = new int[10]; numbers[0] = 0;

Paradigme de Programare Laboratorul 3 Sintax prescurtat


int[] numbers = {0, 1, 2, 3};

Se pot folosi i vectori multidimensionali:


int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

Copierea vectorilor Se folosete metoda arraycopy din package-ul System:


public static void arraycopy(Object destPos, int length) int[] arrayFrom = {1, 2, 3, 4, 5, 6}; int[] arrayTo = new int[4]; arraycopy(copyFrom, 0, arrayTo, 0, 4); src, int srcPos, Object dest, int

3.1.3. Operatori Operatorii sunt simboluri speciale care execut operaii specifice asupra unui numr de 1, 2 sau 3 operanzi. Tabelul urmtor prezint operatorii i prioritile lor. Prioritile scad de sus n jos, iar operatorii aflai pe aceeai linie au aceeai prioritate. Nume operator postfix unar multiplicativ aditiv shift relaional de egalitate AND pe bii XOR pe bii OR pe bii AND OR ternar Atribuire Simbol expr++ expr-++expr expr +expr expr ~ ! */% +<< >> >>> < > <= >= instanceof == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= >>>=

1) Operatorul de atribuire simpl


int number = 0; char ch = A; String s = a string;

2) Operatori aritmetici
+, -, *, / (mprire ntreag), % (restul mpririi)

Pot fi folosii la crearea atribuirilor compuse:


+=, -=, *=, /=, %=

Paradigme de Programare Laboratorul 3 Operatorul + poate fi folosit i pentru concatenarea string-urilor. 3) Operatori unari
+, -, ++, --, !(complementar logic)

Operatorii prefix i postfix ++, -- au efect acelai efect asupra variabilei, dar evalueaz expresia n mod diferit, dup cum sugereaz i denumirea. 4) Operatorii de egalitate i operaionali
==, !=, >, >=, <, <=

5) Operatorii condiionali
&&(AND), ||(OR)

Aceti operatori funcioneaz prin scurtcircuitare: al doilea operand logic mai este evaluat numai dac mai poate schimba valoarea rezultatului.
? : (ternar)

Operatorul ternar este o form prescurtat a unei instruciuni de genul if-then-else. 6) Operatorul de comparare a tipului
instanceof

Compar un obiect cu un tip specificat. Obiectul poate fi i o instan a unei subclase a tipului dat. De reinut c null nu este instana nici unui tip. 7) Operatori pe bii
~(inverseaz biii), ^(XOR), |(OR) <<, >>, >>>(deplasare dreapta fr semn), &(AND),

3.1.4. Expresii, instruciuni i blocuri Operatorii pot fi folosii n construirea expresiilor, care sunt procesate i au valori. Expresiile sunt componentele elementare din instruciuni (statements), iar instruciunile pot fi grupate la rndul lor n blocuri. 1) Expresiile Expresiile sunt compuse din variabile, operatori i apeluri de metode care sunt evaluate ntr-o singur valoare.
int nr = 10; array[10] = 10;

Tipul de dat al valorii returnate de o expresie depinde de elementele folosite. Expresii compuse se pot forma din expresii mai mici, cu condiia ca tipurile de dat returnate de expresiile folosite s se potriveasc cu cele necesare n construirea expresiei compuse.
nr = 1 * 2 * 3; rez = (x + y) / z;

Paradigme de Programare Laboratorul 3 2) Instruciunile (statements) O instruciune formeaz o unitate de execuie complet. Atribuirile, folosirile operatorilor ++ --, apelurile de metode i crerile de obiecte sunt instruciuni expresie.
nr = 10; //atribuire nr++; //incrementare System.out.println(mesaj); //apel metod String s = new String(); //creare obiect

Pe lng acestea, mai sunt i instruciuni de declaraie i instruciuni control.


int nr = 10; //declaraie

3) Blocuri Un bloc de cod este un grup de 0 sau mai multe instruciuni cuprinse ntre acolade. Blocurile pot fi folosite oriunde este permis doar o singur instruciune.
if (expr) { //bloc 1 //set instruciuni } else { //bloc 2 //set instruciuni }

3.1.5. Instruciuni de control n mod normal instruciunile scrise n codul surs java sunt executate de sus n jos, n ordinea n care apar. Acest comportament poate fi modificat prin instruciunile de control, care permit luarea deciziilor, execuiile n bucl, mprirea codului n ramuri, executarea condiionat a unor poriuni de cod. 1) If-then Instruciunile din blocul if-then sunt executate numai dac expresia logic este evaluat la valoarea boolean true.
if (expr) instruciune; if (expr) { instruciunii; }

Recomandare: chiar dac avem nevoie de o singur instruciune n blocul if-then, este preferabil s se foloseasc totui acoladele, pentru a evita eventualele bug-uri atunci cnd este necesar adugarea de noi instruciuni. 2) If-then-else Se ofer posibilitatea de execuie a unor instruciuni i cnd expresia este evaluat la valoarea false.
if (expr) instruciune; else instruciune; if (expr) { instruciuni; } else { instruciuni; }

Paradigme de Programare Laboratorul 3 Recomandarea cu privire la folosirea acoladelor rmne valabil pentru ambele blocuri ale instruciunii. 3) Switch Ofer orice numr de ci de execuie. Variabilele aplicabile pot fi de tipurile byte, short, char sau int. Se accept de asemenea tipuri enumerabile i clase speciale care mapeaz tipuri primitive: Character, Bzte, Short i Integer.
int sw = 3; switch (sw) { case 1: case 2: instruciuni; break; case 3: instruciuni; break; default: instruciuni; break; }

Trebuie remarcat fiecare instruciune break folosit. Acestea determin terminarea execuiei instruciunii switch. Numai n cazul n care se dorete i executarea blocului case urmtor se omite break la sfritul blocului case curent. 4) While i do-while Blocul while este executat n bulc att timp ct expresia evaluat este adevrat. Folosind while se pot implementa bucle infinite.
while (expr) { instruciuni; }

O bucl do-while este asemntoare, doar c testul expresiei se face la urm, blocul executndu-se cel puin o dat.
do { instruciuni; } while (expr);

5) For O instruciune compact prin care se pot itera o serie de valori. Forma general a instruciunii este:
for (iniializare; condiie; incrementare) { instruciuni; }

O alt form faciliteaz parcurgerea vectorilor (arrays) i a coleciilor:


int[] nrs = {1, 2, , 10}; for (int number : nrs) { instruciuni; }

Oriunde se poate folosi, a doua variant a instruciunii for este cea recomandat. 6) Break Instruciunea break termin execuia celei mai interioare instruciuni de tipul switch, for, while sau do-while. Pentru a se termina execuia unei bucle exterioare se folosesc instruciunile break cu etichet. 6

Paradigme de Programare Laboratorul 3


outer: for (; ; ) { for (; ; ) { ; break outer; } }

n acest caz este terminat execuia buclei etichetat cu eticheta respectiv. Firul execuiei ajunge la instruciunea imediat urmtoare acestei bucle etichetate, i nu la etichet. 7) Continue Instruciunea continue termin execuia iteraiei curente a unei bucle, determinnd reluarea corpului buclei de la urmtoarea iteraie, dac aceasta exist. Se aplic la instruciunile for, while i do-while. Pentru terminarea execuiei iteraiei curente a unei bucle exterioare, se folosete instruciunea continue cu etichet.
outer: for (; ; ) { for (; ; ) { ; continue outer; } }

8) Return Determin terminarea execuiei metodei curente, firul execuiei relundu-se din punctul unde metoda a fost apelat. Return mai are i rolul de a returna o valoare. Tipul acesteia trebuie s corespund cu cel precizat la declararea metodei. Dac tipul de returnare este void, atunci instruciunea return nu mai are nici un parametru. 3.1.6. Clase 1) Declaraii de clase
class MyClass { //cmpuri //constructori //dclaraii de metode }

Aceasta este o declaraie de clas simpl. Corpul clasei, cuprins ntre acolade, conine tot codul necesar ciclului de via al obiectelor instaniate: constructori pentru crearea i iniializarea de instane, declaraii de cmpuri care dau starea clasei i a obiectelor i metodele care implementeaz comportamentul clase i al obiectelor. Declaraia de clas anterioar este una minimal. Ea poate fi extins prin precizarea clasei de baz sau a interfeelor implementate:
class MyClass extends BaseClass implements InterfaceOne, InterfaceTwo { //... }

De asemenea se mai pot aduga i modificatori de acces, cum ar fi public sau private.

Paradigme de Programare Laboratorul 3 2) Variabile membre Declaraiile de cmpuri sunt compuse din unul sau mai muli modificatori (public, private,...), tipul i numele variabilei. Denumirile cmpurilor se ncadreaz n recomandrile despre numele variabilelor din subcapitolul anterior. 3) Metode
Public void doAction(int param1, double param2) { //instruciuni }

Aceasta este e o declaraie minimal de metod. Elementele minime necesare la declararea unei metode sunt tipul returnat, numele metodei, lista e 0 sau mai muli parametri i corpul metodei. Pe lng acestea, declaraia unei metode mai poate conine modificatori de acces (private, public,...) i o list de excepii pe care metoda le-ar putea arunca. Signatura unei metode cuprinde numele i lista de parametri. Metodele declarate intr-o clas trebuie s aib signaturi diferite. Se observ ca tipul return nu poate diferenia dou metode care are restul elementelor identice. Metodele pot fi suprancrcate: mai multe metode pot avea acelai nume att timp ct signaturile lor sunt diferite, adic listele de parametri sunt diferite. Aceste liste pot diferi prin numrul i prin tipul parametrilor. Numele metodelor pot fi orice identificator, dar conveniile sugereaz ca aceste nume s respecte notaia Camel i s sa nceap cu verbul care descrie aciunea implementat de metod. Observaie: parametri se refer la lista de variabile din declaraia metodei, iar noiunea de argumente se refer valorile efective care sunt primite atunci cnd metoda este apelat. Parametrii unei metode pot avea orice tip, att tipuri primitive ct i tipuri referin. Alte limbaje de programare (ex. C/C++) pot trimite la apelul metodelor referine la alte metode. n Java nu se permite o astfel de tehnic, dar se poate trimite de exemplu un obiect ale crui metode pot fi apelate apoi n cadrul metodei. Se poate trimite unei metode un numr variabil de parametri. Aceast tehnic este posibil prin folosirea unei construcii numit varargs i poate fi util atunci cnd nu se tie ce numr de argumente de un anumit tip vor fi trimii metodei la apel.
public int addNumbers (int... numbers) { //operaii }

Metoda poate fi apelat cu orice numr de parametri sau chiar cu nici unul. n interiorul metodei parametrul este vzut ca un array, iar metoda poate fi apelat cu un vector sau cu o secven de argumente. Numele parametrilor declarai n metode trebuie s fie diferite ntre ele i nu pot coincide cu numele variabilelor locale declarate n metod. Un parametru poate avea ns acelai nume cu un cmp al clasei, cmp care va fi ascuns n corpul metodei. Astfel de tehnici pot duce la confuzii i sunt folosite de regul doar n cazul metodelor care seteaz un anumit cmp. Variabila membr a clasei poate fi accesat n acest caz doar dac este calificat. 8

Paradigme de Programare Laboratorul 3


... private int dim; pubic void setDim(int fdim) { this.dim = dim; }

Se observ folosirea cuvntului cheie this. Acesta este o referin ctre obiectul curent, obiectul a crui instan a fost folosit pentru apelarea metodei. Argumentele de tip primitiv sunt trimise la apel prin valoare. Aceasta nseamn c orice modificri aduse argumentelor n cazul metodei nu vor afecta variabila trimisa la apelul metodei. Argumentele de tip referin sunt trimise de asemenea la apel prin valoare. Asta nseamn c variabila folosit ca argument la apelul metodei va referi acelai obiect dup terminarea execuiei metodei, chiar dac n cadrul acesteia i s-ar fi atribuit parametrului respectiv o referin la un alt obiect. Totui, metoda apelat poate aduce modificri obiectului referit fie prin apelul unor metode fie direct prin modificarea cmpurilor, dac aceste sunt accesibile. Execuia unei metode se ntoarce la codul de unde a fost apelat atunci cnd termin de executat toate instruciunile sau ajunge la o instruciune return sau arunc o excepie. O metod care returneaz altceva dect void trebuie s conin o instruciune de tipul return value;. Dac returneaz void se poate folosi la nevoie return fr parametru, dar existena acestei instruciuni nu este obligatorie. Valoarea returnat trebuie s corespund cu tipul de returnare din declaraia metodei. Obiectul returnat trebuie s fie exact de tipul clasei declarate sau instan a unei clase derivate din clasa declarat. Se pot declara ca tipuri de returnare si interfee. n acest caz obiectul returnat trebuie s fie o instan a unei clase care implementeaz acea interfa. 4) Constructori Declaraiile constructorilor sunt asemntoare declaraiilor metodelor, cu excepia faptului c nu au un tip returnat iar numele trebuie s coincid cu numele clasei.
public MyClass (int param1, int param2) { //instruciuni }

Regulile de suprancrcare a metodelor se aplic i n cazul constructorilor, putndu-se astfel declara mai muli constructori, cu condiia ca listele lor de parametri s fie diferite. Cnd se declar mai muli constructori i se dorete apelarea unuia din cadrul celuilalt se poate folosi cuvntul cheie this. Apelul ctre un alt constructor trebuie s fie prima instruciune.
class Line { ... public Line(Point p1, Point p2) { this(p1.x, p1.y, p2.x, p2.y); } public Line(int x1, int y1, int x2, int y2) { ... }

Programatorul nu este obligat s declare constructori pentru clasa sa. Compilatorul creeaz automat un constructor implicit, fr parametri. Acesta este creat numai atunci cnd nu se creeaz nici un constructor explicit.

Paradigme de Programare Laboratorul 3 Se pot folosi modificatori de acces i n cazul constructorilor. Dac o clas nu are acces la nici un constructor al unei clasei, atunci aceasta nu poate crea direct instane ale clasei respective, ci numai printr-o modalitate oferit explicit de ctre programator (aa cum se ntmpl n cazul pattern-ului Singleton). 5) Controlul accesului Controlul accesului la clase sau la anumii membri ale claselor se face cu ajutorul modificatorilor de acces. Acetia sunt la nivel de clas sau la nivel de membru. O clas poate avea modificatorul public i poate fi vizibil din toate clasele, sau poate s nu aib nici un modificator specificat, ceea ce se numete package-private: vizibil doar n cadrul pachetului din care face parte. Pentru membrii claselor se pot folosi aceiai modificatori ca la clase, avnd aceleai semnificaii. n plus se mai pot folosi modificatorii private (membrii pot fi accesai doar din interiorul clasei) i protected (membrii pot fi accesai din acelai pachet sau din clasele care deriveaz clasa i se afl n alte pachete). Urmrii n tabelul urmtor accesibilitatea oferit de fiecare modificator: Modificator Clasa Pachet Subclas Oriunde

(n alt pachet) (n afara pachetului) Da Da Da Da public Da Da Da protected Da Da package-private Da private Se recomand folosirea unui acces ct mai restrictiv posibil atunci cnd se concepe structura claselor. Folosirea modificatorilor mai puin restrictivi fr un motiv anume tinde evoluia aplicaiei la o implementare particular i mai puin flexibil, ceea ce ngreuneaz modificrile ulterioare asupra codului. 6) Iniializri Iniializrile variabilelor statice se pot face prin simple atribuiri atunci cnd se cunosc exact valorile iniiale. Dac aceste valori necesit calcule mai complicate atunci se pot folosi blocurile statice de iniializare.
static { //cod de iniializare }

Pot fi oricte blocuri statice ntr-o clas i se pot afla oriunde n corpul clasei. La execuie vor rulate n ordinea n care apar n codul surs. O alternativ la blocurile statice este folosirea metodelor statice private.
... public static int nr = initStaticNr(); private static int initStaticNr() { //cod iniializare } ...

10

Paradigme de Programare Laboratorul 3 Avantajul folosirii acestor metode este c variabilele pot fi reiniializate la nevoie folosind acelai cod. Blocuri de iniializare pot fi folosite i pentru membrii de instan. Aceste blocuri sunt copiate de ctre compilator n fiecare constructor, fiind o modalitate facil de a folosi cod comun pentru toi constructorii.
{ //cod iniializare }

De asemenea exist o alternativ i la aceste blocuri: metodele de instan finale. Modificatorul final mpiedic o metod s fie suprascris ntr-o clas derivat.
private int nr = initInstanceNr(); protected final int initInstanceNr() { //cod iniializare }

Apelul metodelor care nu sunt finale n timpul iniializrii instanei poate crea probleme, motiv pentru care metoda de iniializare a fost declarat final. 3.1.7. Obiecte 1) Crearea obiectelor
Line line = new Line(point1, point2);

Aceast instruciune conine 3 pri: Declararea variabilei, instanierea obiectului i iniializarea variabilei cu obiectul creat. Instanierea clasei este realizat prin operatorul new. Acesta aloc memorie pentru noul obiect, apeleaz constructorul potrivit i returneaz o referin la zona de memorie alocat. Constructorul este ales dup signatur, iar numele clasei este dat de numele constructorului. De obicei operatorul new este folosit pentru atribuirea obiectului nou creat unei variabile, dar acest lucru nu este obligatoriu. Referina returnat de operator poate fi folosit direct n expresii:
int x1 = new line(point1, point2).x1;

Acest obiect creat nu are nici o referin ctre el iar dup executarea instruciunii resursele sale pot fi eliberate de ctre maina virtual. 2) Membri de clas i membri de instan Cnd mai multe obiecte sunt instaniate din aceeai clas fiecare obiect creat are o copie proprie a variabilelor de instan. Cnd se dorete crearea unor variabile comune tuturor obiectelor se folosete modificatorul static. Acestea sunt membri de clas i se numesc cmpuri statice. Fiecare obiect poate avea acces la membrii statici ai claselor, dar acetia pot fi manipulai i fr a instania clasa.
class Line { public static int maxLength = 100; ... } ... Line.maxLength = 200;

11

Paradigme de Programare Laboratorul 3 Se poate accesa un cmp static i folosind o instan a clasei dar aceast practic nu este recomandat deoarece nu este vizibil c este vorba despre o variabil de clas. Asemenea variabilelor de clas se pot declara i metode de clas. n concluzie: metodele de instan pot accesa direct metodele i variabilele de instan i cele de clas. metodele de clas pot accesa direct metodele i variabile de clas. metodele de clas NU pot accesa direct metodele i variabilele de instan, ele trebuie s foloseasc n schimb instane ale clasei. De asemenea cuvntul cheie this nu poate fi folosit n metodele de clas (nu exist nici o instan la care this s refere).

3) Constante Pentru a defini variabile constante se poate folosi modificatorul static mpreun cu modificatorul final, care indic ca valoare variabilei nu poate fi modificat.
static final double PI = 3,141592;

O ncercare de a atribui alt valoare unei variabile constante s-ar solda cu o eroare de compilare. Prin convenie, numele variabilelor constante se scriu cu litere mari iar cuvintele se separ prin _. 4) Gestionarea memoriei Unele limbaje de programare oblig programatorul s in evidena obiectelor create i s elibereze memoria n mod explicit atunci cnd aceste obiecte nu mai sunt folosite. Aceast gestionare explicit a memorie este dificil i poate duce cu uurin la bug-uri. Platforma Java unui numr nelimitat de obiecte (limitat doar de capacitile sistemului) fr a avea grij de gestionarea memoriei. La execuie, cnd maina virtual constat c un obiect nu mai este folosit, elibereaz memoria ocupat de acesta. Acest proces se numete Garbage Collection. Un obiect este candidat la colectare atunci cnd nu mai sunt referine ctre el. Referinele pstrate n variabile sunt terse atunci cnd variabila nu mai exist (iese din scopul de existen) sau cnd variabilei i se atribuie alt valoare. Astfel se poate renuna explicit la o referin ctre un obiect prin atribuirea valorii null acelei variabile. Dac un obiect este referit de mai multe referine, toate aceste referine trebuiesc terse pentru ca obiectul s fie un candidat la colectare. 3.1.8. Interfee n general interfeele sunt ca nite contracte stabilite prin care diverse componente software comunic ntre ele. n Java o interfa este un tip referin, similar clasei, car pot conine doar constante, signaturi de metode i tipuri imbricate (nu exist corpuri de metod). Interfeele nu pot fi instaniate, ele pot fi doar implementate de clase sau extinse de alte interfee. Pentru a folosi o interfa avem nevoie de o clas care s implementeze acea interfa (s ofere un corp pentru toate metodele declarate n interfa), iar apoi putem folosi instane ale acelei clasei.

12

Paradigme de Programare Laboratorul 3 n Java (fa de alte limbaje) o clas nu poate deriva din mai multe clase, ci doar din una. Interfeele ofer o alternativ la aceast facilitate, deoarece o clas poate deriva dintr-o singur clas, dar poate implementa zero sau mai multe interfee. 1) Declarare Declararea unei interfee cuprinde eventuali modificatori de acces, o eventual list de interfee extinse i corpul interfeei.
public interface BigInterface extends Interface1, Interface2 { //constante double PI = ...; //signaturi de metode double doAction(); }

Ca i clasele, interfeele pot avea modificatorii de acces public sau package-private. Toate metodele declarate n corpul interfeei sunt implicit publice, prin urmare modificatorul public poate fi omis. Metodele sunt de asemenea implicit abstracte, dar modificatorul abstract poate lipsi. Constantele declarate au implicit modificatorul public static final, acesta putnd fi omis. 2) Implementare i folosire Cnd o clas implementeaz o interfa, prin convenie cuvntul cheie implements i lista de interfee implementate se pune dup extends, dac clasa respectiv extinde o alt clas. Spuneam c o interfa este un tip referin. Cnd se definete o variabil referin al crei tip este o interfa, orice obiect care este atribuit acelei variabile trebuie s fie o instan a unei clase care implementeaz acea interfa. Cnd se concepe structura unei interfee este de preferat s se anticipeze toate cazurile de folosire i deci structura complet necesar. Simpla adugare a unei noi metode ntr-o interfa face ca toate clasele care implementeaz deja acea interfa s nu mai compileze. Dac nu se pot observa din start toate metodele necesare atunci eventualele metode suplimentare se pot aduga prin extinderea interfeei. Clasele care implementeaz vechea interfa vor funciona n continuare, ele putnd modificate dup nevoie s se adapteze la noua interfa. 3.1.9. Clase imbricate n Java se pot defini clase n interiorul altor clase. Acestea se numesc clase imbricate (nested classes).
class ExternClass { ... class InternClass { ... } ... }

O clas imbricat se comport ca un membru al clasei n care a fost definit, prin urmare are acces la ceilali membri ai clasei externe, chiar dac acetia sunt declarai ca fiind privai. Dac o clas extern poate avea doar doi posibili modificatori de acces (public i package-private), o clas intern, ca un membru de clas, poate avea i modificatorii de acces private i protected. n funcie de prezena modificatorului static, clasele imbricate pot fi de dou feluri: clase imbricate statice i clase interne. 13

Paradigme de Programare Laboratorul 3 Clasele imbricate pot fi utile din mai multe puncte de vedere: grupeaz logic mai multe clase care sunt folosite ntr-un singur loc, ajut la ncapsularea obiectelor i mrete claritatea codului. O clas imbricat static este din punct de vedere comportamental asemntoare cu o clas extern, imbricarea ei fiind cauzat doar de motive de grupare a codului. Accesul la o astfel de clas se face prin folosirea numelui clasei externe:
ExternClass.InternClass obj = new ExternClass.InternClass();

O clas intern (nestatic) este asociat cu o instan a clasei externe i are acces direct la membrii privai ai acelei instane. Fiind asociat cu un obiect, o clas intern nu poate declara membri statici. Pentru a instania o clas intern este mai nti nevoie de o instan a clasei externe:
ExternClass.InnerClass obj = externObject.new InnerClass();

Clasele interne sunt utile atunci cnd este nevoie de clase ajuttoare ce pot astfel avea acces la membrii privai ai clasei externe. Acestea sunt folosite extensiv n sistemul de gestionare a evenimentelor. Exist 2 tipuri speciale de clase interne: locale (declarate n corpul unei metode) i anonime (declarate n corpul unei metode fr a li se da nume). Urmtorul tabel prezint tipurile de clase imbricate i scopul lor.

Tip clas imbricat static clas intern (nestatic) clas local clas anonim

Scop membru membru local n punctul de definiie

Intern NU Da Da Da

3.1.10. Moeniri Cnd o clas deriveaz (extinde) o alt clas, ea motenete toi membrii acelei clase (cmpuri, metode i clase imbricate). Constructorii nu sunt membri, deci nu sunt motenii, dar pot fi n schimb apelai din constructorii clasei derivate. Clasa care deriveaz se numete subclas, clas derivat, clas extins sau clas fiu. Clasa din care se deriveaz se numete superclas, clas de baz sau clas printe. Orice clas are exact o clas de baz, cu excepia clasei java.lang.Object. Dac nu este specificat o clas de baz, atunci clasa extinde implicit clasa Object. Se creeaz astfel o ierarhie de clase cu rdcina n clasa Object. O clas care se afl n subarborele unei clase se numete clas descendent din acea clas. n orice package s-ar afla, clasa derivat motenete toi membrii public i protected din clasa de baz. Dac se afl n acelai pachet, motenete i membrii package-private. Membrii privai ai clasei de baz nu pot accesai din clasa derivat (facem referire aici i la membrii package-private atunci cnd clasa derivat nu se afl n acelai pachet). S ne reamintim c o clas imbricat poate avea acces la toi membrii clasei externe, inclusiv cei privai (cu restriciile implicate atunci cnd clasa imbricat este static). O astfel de clas, dac poate fi motenit de o clas derivat (se aplic aceleai reguli de motenire) are de asemenea acces la membrii privai ai clasei de baz.

14

Paradigme de Programare Laboratorul 3 1) Motenirea cmpurilor Cmpurile motenite pot fi folosite direct, ca i cum ar fi fost declarate n acea clas. Se pot de asemenea declara cmpuri cu acelai nume, care vor ascunde cmpurile din clasa de baz (practic nerecomandat). Aceste cmpuri pot avea tipuri diferite fa de tipurile cmpurilor ascunse din clasa de baz. Accesul la cmpul ascuns din clasa de baz se poate face prin calificare cu cuvntul cheie super. Pe lng cele motenite, se pot declara i noi cmpuri. 2) Motenirea metodelor Metodele motenite pot fi accesate direct, ca i cum ar fi fost declarate n acea clas. Se pot declara metode de instan cu aceleai signaturi ca cele din clasa de baz, care vor fi astfel suprascrise. Pentru a suprascrie o metod din clasa de baz trebuie pstrat i tipul returnat. Se poate ca tipul returnat de noua metod s fie un subtip al celui returnat de metoda suprascris (covariant return type). Pentru a accesa metodele de instan suprascrise din clasa de baz se poate folosi calificarea cu cuvntul cheie super. Se pot declara metode de clas cu aceleai signaturi ca cele din clasa de baz, acestea fiind ascunse. Pentru a suprascrie o metod de clas din clasa de baz trebuie return acelai tip ca n metoda de baz sau un subtip al acestuia. Metodele suprascrise nu pot avea modificatori de acces mai restrictivi dect modificatorii metodelor din clasele de baz. Metodele statice nu pot fi suprascrise de metode de instan, iar metodele de instan nu pot fi suprascrise de metode de clas. Pe lng cele motenite, se pot declara i metode noi. Aceste metode noi pot suprancrca la nevoie metode motenite din clasa de baz, fr a se suprascrie sau ascunde. Un constructor din clasa de baz poate fi apelat dintr-un constructor din clasa derivat prin cuvntul cheie super. Invocarea constructorului de baz prin super trebuie s fie prima instruciune din constructorul curent. Dac nu este chemat explicit un constructor din clasa de baz, compilatorul insereaz implicit un apel la constructorul fr argumente. Dac clasa de baz nu are un constructor fr parametri, atunci vom avea o eroare la compilare. Se observ astfel c se creeaz un lan de apeluri de constructori pn la constructorul fr argumente din clasa Object (constructor chaining). 3) Clasa Object Clasa Object se afl n vrful ierarhiei de clase iar orice alt clas este descendent direct sau indirect a clasei Object i motenete metodele sale de instan.
public public public public public final final final final final void void void void void notify(); notifyAll(); wait(); wait(long timeout); wait(long timeout, int nanos);

Aceste metode ajut la sincronizrile firelor de execuie i nu pot fi suprascrise. Celelalte metode pot fi suprascrise (exceptnd getClass) i uneori chiar este necesar pentru a le adapta la specificului claselor create.
protected Object clone() throws CloneNotSupportedException

15

Paradigme de Programare Laboratorul 3 Creeaz i returneaz o copie a obiectului curent. n implementarea din clasa Object, n metoda clone() se verific mai nti dac clas din care a fost instaniat obiectul implementeaz interfaa Cloneable. Dac nu, se arunc o excepie CloneNotSupportedException. Dac da, se creeaz un obiect de acelai tip i se iniializeaz cmpurile acestuia cu valorile cmpurilor din obiectul curent. Cel mai simplu mod de a face obiectele unei clase clonabile este s facem clasa s implementeze interfaa Clonable. Implementarea implicit din clasa Object este de obicei suficient, mai puin atunci cnd clasa declar referine la obiecte externe. Dac se dorete ca obiectele clone s aib referine la copii proprii ale acestor obiecte externe, atunci trebuie s se suprascrie metoda clone. Prin clonarea obiectelor referite se obine independena ntre obiectul original i clona sa. La suprascrierea metodei clone trebuie avut grij ca modificatorul de acces s nu fie mai restrictiv dect cel din clasa de baz. Dac se motenete direct din clasa Object, atunci acesta poate fi protected sau public.
public int hashCode()

Returneaz codul hash al obiectului curent, care este adresa de memorie n hexazecimal. Prin definiie, dac dou sunt considerate egale, atunci codurile lor hash trebuie obligatoriu s fie egale.
public boolean equals(Object obj)

Indic dac dou obiecte sunt considerate egale. Implementarea din clasa Object compar referinele celor dou obiecte, adic dac cele dou referine comparate refer aceeai instan de obiect. Dou obiecte pot fi considerate egale prin echivalena informaiilor pe care le dein, chiar dac sunt dou instane diferite, caz n care implementarea implicit din Object nu mai este de ajutor. n astfel de cazuri n care echivalena a dou obiecte nu coincide cu egalitatea referinelor, clasa trebuie s suprascrie metoda equals. ntotdeauna cnd metoda equals este suprascris, metoda hashCode trebuie suprascris de asemenea (a se revedea definiia: dou obiecte sunt egale, atunci codurile lor hash trebuie s fie egale).
public final Class getClass()

Aceast metod nu poate fi suprascris. Ea returneaz un obiect de tip java.lang.Class prin care se pot obine diverse informaii despre obiectul curent. Printre metodele utile oferite de clasa Class sunt: getSimpleName() (numele clasei), getSuperClass() (clasa de baz), getinterfaces() (interfeele implementate), isAnnotation(), isInterface(), isEnum(), getFields(), getMethods().
public String toString()

Returneaz o reprezentare n format text a obiectului. Este recomandat suprascrierea acestei metode n toate clasele.
protected void finalize()

Metoda finalize poate fi invocat atunci cnd obiectul este colectat de ctre Garbage Collector. Implementarea din Object nu face nimic, iar o eventual suprancrcare ar putea fi folosit pentru eliberarea unor resurse. Momentul apelului metodei nu poate fi cunoscut cu siguran, nici nu se poate ti exact dac metoda va fi apelat, motiv pentru care eliberarea unor resurse nu poate fi lsat n baza acestei metode ci trebuie fcut n mod explicit.

16

Paradigme de Programare Laboratorul 3 4) Clase i metode finale Declararea unor metode ca fiind finale (modificatorul final) mpiedic clase derivate s suprascrie acele metode. Sa observat c i n clasa Object sunt o serie de metode finale. De obicei metodele apelate din constructori sau din blocurile de iniializare se declar finale. Dac o metod este suprascris iar constructorul o apeleaz pot aprea rezultate imprevizibile i nedorite. O ntreag clas poate fi declarat final, mpiedicnd astfel orice ncercare de extindere a sa. 5) Clase i metode abstracte O clas declarat cu modificatorul abstract se numete clas abstract. Ea nu poate fi instaniat dar poate fi extins. O metod declarat cu acest modificator se numete metod abstract. O metod abstract nu are corp iar declaraia este urmat de ; (identic ca la interfee). O clas abstract poate conine metode abstracte, dar nu este obligatoriu, n schimb o clas care conine o metod abstract trebuie declarat obligatoriu ca fiind abstract. Cnd o clas extinde o clas abstract trebuie s implementeze toate metodele sale abstracte (dac nu, trebuie declarat de asemenea abstract). n mod asemntor, o clas care implementeaz o interfa fr s-i implementeze toate metodele trebuie declarat ca fiind abstract. Fa de interfee, clasele abstracte pot conine cmpuri care nu sunt public static final i pot avea metode implementate. Dac o clas abstract nu conine nici un astfel de element, atunci ar trebui declarat ca fiind interfa. O clas abstract poate avea cmpuri i metode statice, iar acestea pot fi accesate numai prin calificare cu numele clasei. 6) Convertiri Obiectele instaniate dintr-o anumit clas pot fi folosite i n locaii unde sunt ateptate instane ale unor clase din care clasa respectiv descinde.
Object obj = new MyObject();

Convertirea care are loc la o astfel de atribuire este o convertire implicit (implicit casting).
MyObject myObj = obj;

O astfel de instruciune duce la o eroare de compilare, deoarece compilatorul nu mai poate face o conversie implicit. n astfel de situaii se folosete o convertire explicit (explicit casting).
MyObject myObj = (MyObject)obj;

n timpul execuiei se verific dac tipul obiectului referit de obj poate fi convertit la tipul cerut. Dac nu o excepie va fi aruncat. Pentru a evita astfel de excepii se poate folosi operatorul instanceof pentru a vedea dac un obiect poate fi convertit la un anumit tip. 3.1.11. Enumerri Un tip enumerare este un tip ale crui cmpuri constau ntr-un set fix de constante (fiind constante, numele cmpurilor se scriu prin convenie cu litere mari). Pentru definirea unui tip enumerare se folosete cuvntul cheie enum.
public enum Direction { NORD, SUD, EST, VEST }

17

Paradigme de Programare Laboratorul 3 O declaraie enum definete de fapt o clas. Aceasta extinde implicit java.lang.Enum i prin urmare nu mai poate extinde altceva. Corpul unei clase enum poate include de asemenea metode i alte cmpuri. Unele sunt adugate implicit de ctre compilator. De exemplu, tipul enum are o metod static values, care ntoarce un array cu toate valorile, n ordinea n care au fost declarate.
for (Direction dir : Direction.values()) { // }

Atunci cnd definim cmpuri i metode n tipurile enum, constantele enumerrii trebuie s fie primele instruciuni i trebuie terminate cu ;. Tipurile enum pot avea i constructori. Constructorul este apelat la crearea constantelor declarate la nceputul tipului. Eventualii parametri sunt trecui la declararea constantelor. Programatorul nu poate apela (i nu are pentru ce) constructorul unui enum, drept pentru care acesta trebuie s aib accesul package-private sau private.
public NORD EST SUD VEST enum Direction { (0, -1), (1, 0), (0, -1), (-1, 0);

private final int x, y; Direction(int x, int y) { this.x = x; this.y = y; } int x() { return x; } int y() { return y; } }

3.1.12. Adnotri Adnotrile (annotations) ofer date despre un program, date care nu fac parte din programul n sine i nici nu au un efect direct asupra codului pe care l adnoteaz. Adnotrile pot oferi informaii la compilare, n timpul rulrii sau pot fi folosite n tipul distribuirii. Adnotrile pot fi aplicate declaraiilor de clase, cmpuri, metode i alte elemente de program. Adnotrile apar naintea declaraiei, de regula pe o linie proprie i pot conine elemente cu sau fr nume.
@Author ( name = ..., date = ... ) class Aclass { .. }

Dac exist un singur element atunci numele lui poate fi omis, iar dac nu exist nici un element pot fi omise i parantezele. 1) Documentarea codului Adnotrile pot fi folosite pentru generarea automat a documentaiei codului. Mai nti se definete un tip de adnotare (annotation type). Se folosete cuvntul cheie interface precedat de @ (at = Annotation Type). 18

Paradigme de Programare Laboratorul 3


@interface ClassDoc { String author(); String date(); int version default 1; }

Corpul definiiei cuprinde declaraii de elemente, care seamn cu nite metode i pot avea opional valori implicite. Odat definit tipul adnotrii, acesta poate fi folosit (cu cmpurile completate) la adnotarea efectiv a unei clase.
@ClassDoc ( author = ..., date = ..., version = 3 ) public class Aclass { ... }

Pentru ca informaiile din adnotare s apare n documentaia generat de Javadoc, nsi definiia adnotrii trebuie adnotat:
import java.lang.annotation.*; @Documented @interface ClassDoc( ... )

2) Adnotri folosite de compilator Exist 3 tipuri de adnotri predefinite n specificaiile limbajului. @Deprecated: indic faptul c elementul respectiv este deprecated i nu ar mai trebui folosit. n acest sens compilatorul genereaz un mesaj de avertizare atunci cnd elementul este folosit. Aceast avertizare trebuie menionat i n comentariile pentru Javadoc printr-un tag asemntor.
/** * @Deprecated * text explicativ */ @Deprecated void aMethod() { ... }

@Override: indic faptul c se intenioneaz ca metoda adnotat s suprascrie o metod din clasa de baz. Cnd se dorete suprascrierea unei metode din clasa de baz nu este obligatorie folosirea acestei adnotri dar aceasta poate fi de folos. Dac metoda nu suprascrie cu succes metoda corespunztoare din clasa de baz atunci compilatorul va genera o eroare, lucru care nu s-ar fi ntmplat fr adnotare, deoarece compilatorul nu poate ti dac se dorete o suprascriere sau declararea unei alte metode. @SuppressWarnings: indic compilatorului s renune la generarea unor mesaje de avertizare n clasa sau metoda adnotat.
@SuppressWarnings(deprecation) void method() { .. }

Dac se dorete suprimarea a mai multor categorii de mesaje de avertizare se folosete urmtoarea sintax:
@SuppressWarnings({deprecation, unchecked})

19

Paradigme de Programare Laboratorul 3

3.2.

Tem

Realizai o aplicaie care va gestiona o list de publicaii (cri i reviste) i va permite introducerea, tergerea i afiarea lor. Pentru implementare se va folosi diagrama de clase din Figura 2-6 Diagram UML de clase (din Laboratorul 2). La rularea programului se va afia la consol un meniu care va permite adugarea, tergerea, afiarea publicaiilor i ieirea din program. Informaiile despre cri i reviste se vor citi de la tastatur.

20

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