You are on page 1of 16

Introducere

Scurt istoric
Limbajul Java mpreun cu mediul su de dezvoltare i execuie au fost proiectate pentru a rezolva o parte dintre problemele actuale ale programrii. Proiectul Java a pornit cu scopul declarat de a dezvolta un software performant pentru aparatele electronice de larg consum. Aceste echipamente se definesc ca: mici, portabile, distribuite i lucrnd n timp real. De la aceste aparate, ne-am obinuit s cerem fiabilitate i uurin n exploatare. Limbajul luat iniial n considerare a fost C++. Din pcate, atunci cnd s-a ncercat crearea unui mediu de execuie care s respecte toate aceste condiii s-a observat c o serie de trsturi ale C++ sunt incompatibile cu necesitile declarate. n principal, problema vine din faptul c C++ este prea complicat, folosete mult prea multe convenii i are nc prea multe elemente de definiie lsate la latitudinea celor care scriu compilatoare pentru o platform sau alta. n aceste condiii, firma Sun a pornit proiectarea unui nou limbaj de programare asemntor cu C++ dar mult mai flexibil, mai simplu i mai portabil. Aa s-a nscut Java. Printele noului limbaj a fost James Gostling care este cunoscut ca autor al editorului emacs i al sistemului de ferestre grafice NeWS. Proiectul a nceput nc din 1990 dar Sun a fcut public specificaia noului limbaj abia n 1995 la SunWorld n San Francisco. Numele iniial al limbajului a fost Oak, numele unui copac care crete n faa biroului lui James Gostling. Ulterior, s-a descoperit c numele fusese deja folosit n trecut pentru un alt limbaj de programare aa c a fost abandonat i nlocuit cu Java, spre deliciul programatorilor care iubesc cafenelele i aromele exotice.

Ce este Java?
n primul rnd, Java ncearc s rmn un limbaj simplu de folosit chiar i de ctre programatorii neprofesioniti, programatori care doresc s se concentreze asupra aplicaiilor n principal i abia apoi asupra tehnicilor de implementare a acestora. Aceast trstur poate fi considerat ca o reacie direct la complexitatea considerabil a limbajului C++. Au fost ndeprtate din Java aspectele cele mai derutante din C++ precum suprancrcarea operatorilor i motenirea multipl. A fost introdus un colector automat de gunoaie care s rezolve problema dealocrii memoriei n mod uniform, fr intervenia programatorului. Colectorul de gunoaie nu este o trstur nou, dar implementarea acestuia n Java este fcut inteligent i eficient folosind un fir separat de execuie, pentru c Java are ncorporate faciliti de execuie pe mai multe fire de execuie. Astfel, colectarea gunoaielor se face de obicei n timp ce un alt fir ateapt o operaie de intrare-ieire sau pe un semafor.

Limbajul Java este independent de arhitectura calculatorului pe care lucreaz i foarte portabil. n loc s genereze cod nativ pentru o platform sau alta, compilatorul Java genereaz o secven de instruciuni ale unei maini virtuale Java (numit bytecod). Execuia aplicaiilor Java este interpretat. Singura parte din mediul de execuie Java care trebuie portat de pe o arhitectur pe alta este mediul de execuie cuprinznd interpretorul i o parte din bibliotecile standard care depind de sistem. n acest fel, aplicaii Java compilate pe o arhitectur SPARC de exemplu, pot fi rulate fr recompilare pe un sistem bazat pe procesoare Intel. Una dintre principalele probleme ale limbajelor interpretate este viteza de execuie, considerabil sczut fa de cea a limbajelor compilate. Dac nu v mulumete viteza de execuie a unei astfel de aplicaii, putei cere mediului de execuie Java s genereze automat, plecnd de la codul mainii virtuale, codul specific mainii pe care lucrai, obinndu-se astfel un executabil nativ care poate rula la vitez maxim. De obicei ns, n Java se compileaz doar acele pri ale programului mari consumatoare de timp, restul rmnnd interpretate pentru a nu se pierde flexibilitatea. Mediul de execuie nsui este scris n C, ceea ce l face extrem de portabil. Interpretorul Java este gndit s lucreze pe maini mici, precum ar fi procesoarele cu care sunt dotate aparatele casnice. Interpretorul plus bibliotecile standard cu legare dinamic nu depesc 300 Koctei. Chiar mpreun cu interfaa grafic totul rmne mult sub 1 Moctet. Limbajul Java este n totalitate orientat obiect. Cu el se pot crea clase de obiecte i instane ale acestora, se pot ncapsula informaiile, se pot moteni variabilele i metodele de la o clas la alta, etc. Singura trstur specific limbajelor orientate obiect care lipsete este motenirea multipl, dar pentru a suplini aceast lips, Java ofer o facilitate mai simpl, numit interfa, care permite definirea unui anumit comportament pentru o clas de obiecte, altul dect cel definit de clasa de baz. n Java orice element este un obiect, n afar de datele primare. Din Java lipsesc funciile i variabilele globale. Ne rmn desigur metodele i variabilele statice ale claselor. Java este distribuit, avnd implementate biblioteci pentru lucrul n reea care ne ofer TCP/IP, URL i ncrcarea resurselor din reea. Aplicaiile Java pot accesa foarte uor reeaua, folosindu-se de apelurile ctre un set standard de clase. Java este robust. n Java legarea funciilor se face n timpul execuiei i informaiile de compilare sunt disponibile pn n momentul rulrii aplicaiei. Acest mod de lucru face ca sistemul s poat determina n orice moment neconcordana dintre tipul referit la compilare i cel referit n timpul execuiei evitndu-se astfel posibile intruziuni ruvoitoare n sistem prin intermediul unor referine falsificate. n acelai timp, Java detecteaz referinele nule dac acestea sunt folosite n operaii de acces. Indicii n tablourile Java sunt verificai permanent n timpul execuiei i tablourile nu se pot parcurge prin intermediul unor pointeri aa cum se ntmpl n C/C++. De altfel, pointerii lipsesc complet din limbajul Java, mpreun cu ntreaga lor aritmetic, eliminndu-se astfel una din principalele surse de erori. n plus, eliberarea memoriei ocupate de obiecte i tablouri se face automat, prin mecanismul de colectare de gunoaie, evitndu-se astfel ncercrile de eliberare multipl a unei zone de memorie. Java este un limbaj cu securitate ridicat. El verific la fiecare ncrcare codul prin mecanisme de CRC i prin verificarea operaiilor disponibile pentru fiecare set de obiecte. Robusteea este i ea o trstur de securitate. La un al doilea nivel, Java are incorporate faciliti de protecie a obiectelor din sistem la scriere i/sau citire. Variabilele protejate ntr-un obiect Java nu pot fi accesate fr a avea drepturile necesare, verificarea fiind fcut n timpul execuiei. n plus, mediul de execuie Java poate fi configurat pentru a proteja reeaua local, fiierele i celelalte resurse ale calculatorului pe care ruleaz o aplicaie Java. Limbajul Java are inclus suportul nativ pentru aplicaii care lucreaz cu mai multe fire de execuie, inclusiv primitive de sincronizare ntre firele de execuie. Acest suport este independent de

sistemul de operare, dar poate fi conectat, pentru o performan mai bun, la facilitile sistemului dac acestea exist. Java este dinamic. Bibliotecile de clase n Java pot fi reutilizate cu foarte mare uurin. Cunoscuta problem a fragilitii superclasei este rezolvat mai bine dect n C++. Acolo, dac o superclas este modificat, trebuie recompilate toate subclasele acesteia pentru c obiectele au o alt structur n memorie. n Java aceast problem este rezolvat prin legarea trzie variabilelor, doar la execuie. Regsirea variabilelor se face prin nume i nu printr-un deplasament fix. Dac superclasa nu a ters o parte dintre vechile variabile i metode, ea va putea fi refolosit fr s fie necesar recompilarea subclaselor acesteia. Se elimin astfel necesitatea actualizrii aplicaiilor, generat de apariia unei noi versiuni de bibliotec aa cum se ntmpl, de exemplu, cu MFC-ul Microsoft (i toate celelalte ierarhii C++).

Reprezentarea informaiilor cu obiecte


Obiecte
Informaiile pe care le reprezentm n memoria calculatorului sunt rareori att de simple precum culorile sau literele. n general, dorim s reprezentm informaii complexe, care s descrie obiectele fizice care ne nconjoar sau noiunile cu care operm zilnic, n interiorul crora culoarea sau o secven de litere reprezint doar o mic parte. Aceste obiecte fizice sau noiuni din lumea real trebuiesc reprezentate n memoria calculatorului n aa fel nct informaiile specifice lor s fie pstrate la un loc i s se poat prelucra ca un tot unitar. S nu uitm ns c, la nivelul cel mai de jos, informaia ataat acestor obiecte continu s fie tratat de ctre compilator ca un ir de numere binare, singurele informaii reprezentabile direct n memoria calculatoarelor actuale. Putem s extindem cerinele noastre mai departe, spunnd c, atunci cnd analizm un obiect fizic sau o noiune pentru a le reprezenta n calculator, trebuie s analizm nu numai proprietile acestora dar i modul n care acestea pot fi utilizate i care sunt operaiile care pot fi executate asupra lor sau cu ajutorul lor. Uneori, setul de operaii specifice unui obiect mpreun cu modul n care acesta reacioneaz la stimuli exteriori se numete comportamentul obiectului. De exemplu, dac dorim s construim un obiect care reprezint o minge de form sferic n spaiu, este necesar s definim trei numere care s reprezinte coordonatele x, y i z relativ la un sistem de axe dat, precum i o valoare pentru raza sferei. Aceste valori numerice vor face parte din setul de proprieti ale obiectului minge. Dac mai trziu vom dori s construim o operaie care s reprezinte mutarea n spaiu a obiectului minge, este suficient s ne folosim de operaiile cu numere pentru a modifica valorile coordonatelor x, y i z. Desigur, obiectul minge este insuficient descris prin aceste coordonate i, pentru a simula n calculator obiectul real este nevoie de multe proprieti suplimentare precum i de multe operaii n plus. Dar, dac problema pe care o avem de rezolvat nu necesit aceste proprieti i operaii, este preferabil s nu le definim n obiectul folosit pentru reprezentare. Rezultatul direct al acestui mod de abordare este acela c vom putea defini acelai obiect real n mai multe feluri pentru a-l reprezenta n memoria intern. Modul de definire depinde de problema de rezolvat i de programatorul care a gndit reprezentarea. De altfel, aceste diferene de percepie ale unui obiect real exist i ntre diveri observatori umani. Din punctul de vedere al programrii, un obiect este o reprezentare n memoria calculatorului a proprietilor i comportamentului unei noiuni sau ale unui obiect real.

Figura 1 Modelul de reprezentare al unui obiect n memorie. Stratul exterior reprezint doar operaiile care ofer calea de a interaciona cu proprietile obiectului i nu are corespondent direct n zona de memorie ocupat de obiect.

ncapsularea informaiilor n interiorul obiectelor


Exist situaii n care accesul din exterior la proprietile unui obiect poate s pun probleme acestuia. Din aceste motive, este preferabil s lsm modificarea acestor parametri n sarcina exclusiv a unor operaii definite de ctre obiect, operaii care vor verifica noile valori nainte de a le schimba n interiorul obiectului. n lipsa acestui filtru, putem s stricm coerena valorilor memorate n interiorul unui obiect, fcndu-l inutilizabil. Din acest punct de vedere, putem privi obiectul ca pe un set de valori care formeaz miezul obiectului i un set de operaii care mbrac aceste valori, protejndu-le. Vom spune c proprietile obiectului sunt ncapsulate n interiorul acestora. Mai mult, obiectul ncapsuleaz i modul de funcionare a operaiilor lui specifice, din exterior neputndu-se observa dect modul de apelare a acestor operaii i rezultatele apelurilor. Cu alte cuvinte, procesul de ncapsulare este procesul de ascundere a detaliilor neimportante sau sensibile de construcie a obiectului. Dar nu numai proprietile unui obiect trebuiesc protejate ci i operaiile definite de ctre acesta. Unele dintre operaiile definite pentru un obiect sunt periculos de lsat la dispoziia oricui. Este preferabil s putem controla foarte exact cine ce operaii poate apela pentru un anumit obiect. Aceast protejare i ncapsulare a proprietilor i operaiilor ce se pot executa cu ajutorul unui obiect are i o alt consecin i anume aceea c utilizatorul obiectului respectiv este independent de detaliile constructive ale obiectului respectiv. Structura intern a obiectului poate fi astfel schimbat i perfecionat n timp fr ca funcionalitatea de baz s fie afectat.

Clase de obiecte
n lumea real se pot identifica uor familii de obiecte. Este greu s descriem ntr-un limbaj de programare fiecare minge din lume dar, pentru a putea folosi orice minge din lume, este suficient s descriem o singur dat care sunt proprietile unei mingi n general, precum i operaiile care pot fi executate cu aceasta. Aceasta nu nseamn c toate obiectele minge din lume sunt identice. Diferena dintre ele se afl reprezentat n primul rnd n valorile proprietilor lor care difer de la un obiect de acelai fel la altul. De exemplu, n fiecare obiect minge vom avea un numr natural care reprezint

culoarea mingii. Acest numr poate s difere de la o minge la alta exact aa cum, n realitate, culoarea difer de la o minge la alta. La fel coordonatele poziiei mingii la un moment dat sau raza mingii precum i materialul din care este confecionat au valori care variaz de la o minge la alta. Cu alte cuvinte, fiecare minge din lume are acelai set de proprieti, dar valorile acestora pot s difere de la o minge la alta. Modelul de reprezentare n memorie a unui obiect este ntotdeauna acelai, dar valorile memorate n locaiile corespunztoare proprietilor sunt n general diferite. n ceea ce privete operaiile, acestea sunt ntotdeauna aceleai dar rezultatul aplicrii lor poate s difere n funcie de valorile proprietilor obiectului asupra cruia au fost aplicate. De exemplu, atunci cnd aruncm o minge spre pmnt ea va ricoa din acesta ridicndu-se din nou n aer. nlimea la care se va ridica ns, este dependent de dimensiunile i materialul din care a fost confecionat mingea. Cu alte cuvinte, noua poziie n spaiu se va calcula printr-o operaie care va ine cont de valorile memorate n interiorul obiectului. Se poate ntmpla chiar ca operaia s hotrasc faptul c mingea va strpunge podeaua n loc s fie respins de ctre aceasta. S mai observm c operaiile nu depind numai de proprietile obiectului ci i de unele valori exterioare acestuia. Atunci cnd aruncm o minge spre pmnt, nlimea la care va ricoa aceasta depinde i de viteza cu care a fost aruncat mingea. Aceast vitez este un parametru al operaiei de aruncare. Nu are nici un rost s transmitem ca parametrii ai unei operaii valorile proprietilor unui obiect pentru c acestea sunt ntotdeauna disponibile operaiei. Nici o operaie nu se poate aplica asupra unui obiect fr s tim exact care este obiectul respectiv i ce proprieti are acesta. Este absurd s ne gndim la ce nlime se va ridica o minge n general, fr s facem presupuneri asupra valorilor proprietilor acesteia. S mai observm ns c, dac toate mingile ar avea aceleai valori pentru proprietile implicate n operaia descris mai sus, am putea s calculm nlimea de ricoeu n general, fr s fim dependeni de o anumit minge. n concluzie, putem spune c obiectele cu care lucrm fac parte ntotdeauna dintr-o familie mai mare de obiecte cu proprieti i comportament similar. Aceste familii de obiecte le vom numi n continuare clase de obiecte sau concepte n timp ce obiectele aparinnd unei anumite clase le vom numi instane ale clasei de obiecte respective. Putem vorbi despre clasa de obiecte minge i despre instanele acesteia, mulimea tuturor obiectelor minge care exist n lume. Fiecare instan a clasei minge are un loc bine precizat n spaiu i n timp, un material i o culoare. Aceste proprieti difer de la o instan la alta, dar fiecare instan a aceleiai clase va avea ntotdeauna aceleai proprieti i aceleai operaii vor putea fi aplicate asupra ei. n continuare vom numi variabile aceste proprieti ale unei clase de obiecte i vom numi metode operaiile definite pentru o anumit clas de obiecte. Pentru a clarifica, s mai relum nc o dat: O clas de obiecte este o descriere a proprietilor i operaiilor specifice unui nou tip de obiecte reprezentabile n memorie. O instan a unei clase de obiecte este un obiect de memorie care respect descrierea clasei. O variabil a unei clase de obiecte este o proprietate a clasei respective care poate lua valori diferite n instane diferite ale clasei. O metod a unei clase este descrierea unei operaii specifice clasei respective. S mai precizm faptul c, spre deosebire de variabilele unei clase, metodele acesteia sunt memorate o singur dat pentru toate obiectele. Comportarea diferit a acestora este dat de faptul c ele depind de valorile variabilelor. O categorie aparte a claselor de obiecte este categoria acelor clase care reprezint concepte care nu se pot instania n mod direct, adic nu putem construi instane ale clasei respective, de obicei pentru c nu avem destule informaii pentru a le putea construi. De exemplu, conceptul de om nu se poate instania n mod direct pentru c nu putem construi un om despre care nu tim exact dac este brbat sau femeie. Putem n schimb instania conceptul de brbat i conceptul de femeie care sunt nite subconcepte ale conceptului om.

Clasele abstracte, neinstaniabile, servesc n general pentru definirea unor proprieti sau operaii comune ale mai multor clase i pentru a putea generaliza operaiile referitoare la acestea. Putem, de exemplu s definim n cadrul clasei de obiecte om modul n care acesta se alimenteaz ca fiind independent de apartenena la conceptul de brbat sau femeie. Aceast definiie va fi valabil la amndou subconceptele definite mai sus. n schimb, nu putem dect cel mult s precizm faptul c un om trebuie s aib un comportament social. Descrierea exact a acestui comportament trebuie fcut n cadrul conceptului de brbat i a celui de femeie. Oricum, este interesant faptul c, indiferent care ar fi clasa acestuia, putem s ne bazm pe faptul c acesta va avea definit un comportament social, specific clasei lui. Cele dou metode despre care am vorbit mai sus, definite la nivelul unui superconcept, sunt profund diferite din punctul de vedere al subconceptelor acestuia. n timp ce metoda de alimentaie este definit exact i amndou subconceptele pot s o foloseasc fr probleme, metoda de comportament social este doar o metod abstract, care trebuie s existe, dar despre care nu se tie exact cum trebuie definit. Fiecare dintre subconcepte trebuie s-i defineasc propriul su comportament social pentru a putea deveni instaniabil. Dac o clas de obiecte are cel puin o metod abstract, ea devine n ntregime o clas abstract i nu poate fi instaniat, adic nu putem crea instane ale unei clase de obiecte abstracte. Altfel spus, o clas abstract de obiecte este o clas pentru care nu s-au precizat suficient de clar toate metodele astfel nct s poat fi folosit n mod direct.

Derivarea claselor de obiecte


O alt proprietate interesant a claselor de obiecte este aceea de ierarhizare. Practic, ori de cte ori definim o nou clas de obiecte care s reprezinte un anumit concept, specificm clasa de obiecte care reprezint conceptul original din care provine noul concept mpreun cu diferenele pe care le aduce noul concept derivat fa de cel original. Aceast operaie de definire a unei noi clase de obiecte pe baza uneia deja existente o vom numi derivare. Conceptul mai general se va numi superconcept iar conceptul derivat din acesta se va numi subconcept. n acelai mod, clasa original se va numi superclas a noii clase n timp ce noua clas de obiecte se va numi subclas a clasei derivate. Uneori, n loc de derivare se folosete termenul de extindere. Termenul vine de la faptul c o subclas i extinde superclasa cu noi variabile i metode. n spiritul acestei ierarhizri, putem presupune c toate clasele de obiecte sunt derivate dintr-o clas iniial, s-i spunem clasa de obiecte generice, n care putem defini proprietile i operaiile comune tuturor obiectelor precum ar fi testul de egalitate dintre dou instane, duplicarea instanelor sau aflarea clasei de care aparine o anumit instan. Ierarhizarea se poate extinde pe mai multe nivele, sub form arborescent, n fiecare punct nodal al structurii arborescente rezultate aflndu-se clase de obiecte. Desigur, clasele de obiecte de pe orice nivel pot avea instane proprii, cu condiia s nu fie clase abstracte, imposibil de instaniat.

Figura 2 O ierarhie de clase de obiecte n care clasele sunt reprezentate n cmpuri eliptice iar instanele acestora n cmpuri dreptunghiulare. Clasele abstracte de obiecte au elipsa dublat.

Desigur, este foarte dificil s construim o ierarhie de clase de obiecte complet, care s conin clase de obiecte corespunztoare fiecrui concept cunoscut. Din fericire, pentru o problem dat, conceptele implicate n rezolvarea ei sunt relativ puine i pot fi uor izolate, simplificate i definite. Restrngerea la minimum a arborelui de concepte necesar rezolvrii unei anumite probleme fr a se afecta generalitatea soluiei este un talent pe care fiecare programator trebuie s i-l descopere i s i-l cultive cu atenie. De alegerea acestor concepte depinde eficiena i flexibilitatea aplicaiei. O clas de obiecte derivat dintr-o alt clas pstreaz toate proprietile i operaiile acesteia din urm aducnd n plus proprieti i operaii noi. De exemplu, dac la nivelul clasei de obiecte om am definit forma biped a acestuia i capacitatea de a vorbi i de a nelege, toate acestea vor fi motenite i de ctre clasele derivate din clasa om, i anume clasa brbailor i cea a femeilor. Fiecare dintre aceste clase de obiecte derivate i vor defini propriile lor proprieti i operaii pentru a descrie diferena dintre ele i clasa original. Unele dintre proprietile i operaiile definite n superclas pot fi redefinite n subclasele de obiecte derivate. Vechile proprieti i operaii sunt disponibile n continuare, doar c pentru a le putea accesa va trebui s fie specificat explicit superclasa care deine copia redefinit. Operaia de redefinire a unor operaii sau variabile din interiorul unei clase n timpul procesului de derivare o vom numi rescriere. Aceast redefinire ne d de fapt o mare flexibilitate n construcia ierarhiei unei probleme date pentru c nici o proprietate sau operaie definit ntr-un punct al ierarhiei nu este impus definitiv pentru conceptele derivate din acest punct direct sau nu. Revenind pentru un moment la protejarea informaiilor interne ale unui obiect s precizm faptul c gradul de similitudine de care vorbeam mai sus este mrit n cazul n care vorbim de dou clase derivate una din cealalt. Cu alte cuvinte, o subclas a unei clase are acces de obicei la mult mai multe informaii memorate n superclasa sa dect o alt clas de obiecte oarecare. Acest lucru este firesc innd cont de faptul c, uneori, o subclas este nevoit s redefineasc o parte din funcionalitatea superclasei sale.

Interfee spre obiecte


Un obiect este o entitate complex pe care o putem privi din diverse puncte de vedere. Omul de exemplu poate fi privit ca un mamifer care nate pui vii sau poate fi privit ca o fiin gnditoare care nv s programeze calculatoare sau poate fi privit ca un simplu obiect spaio-temporal care are propria lui form i poziie n funcie de timp. Aceast observaie ne spune c trebuie s dm definiii despre ce nseamn cu adevrat faptul c un obiect poate fi privit ca un mamifer sau ca o fiina gnditoare sau ca un obiect spaio-temporal. Aceste definiii, pe care le vom numi n continuare interfee, sunt aplicabile nu numai clasei de obiecte om dar i la alte clase de obiecte derivate sau nu din acesta, superclase sau nu ale acesteia. Putem s gsim o mulime de clase de obiecte ale cror instane pot fi privite ca obiecte spaio-temporale dar care s nu aib mare lucru n comun cu omul. Practic, atunci cnd construim o interfa, definim un set minim de operaii care trebuie s aparin obiectelor care respect aceast interfa. Orice clas de obiecte care declar c respect aceast interfa va trebui s defineasc toate operaiile. Operaiile ns, sunt definite pe ci specifice fiecrei clase de obiecte n parte. De exemplu, orice obiect spaial trebuie s defineasc o operaie de modificare a poziiei n care se afl. Dar aceast operaie este diferit la un om, care poate s-i schimbe singur poziia, fa de o minge care trebuie ajutat din exterior pentru a putea fi mutat. Totui, dac tim cu siguran c un obiect este o instan a unui clase de obiecte care respect interfaa spatio-temporal, putem linitii s executm asupra acestuia o operaie de schimbare a poziiei, fr s trebuiasc s cunoatem amnunte despre modul n care va fi executat aceast operaie. Tot ceea ce trebuie s tim este faptul c operaia este definit pentru obiectul respectiv. n concluzie, o interfa este un set de operaii care trebuiesc definite de o clas de obiecte pentru a se nscrie ntr-o anumit categorie. Vom spune despre o clas care definete toate operaiile unei interfee c implementeaz interfaa respectiv. Cu alte cuvinte, putem privi interfeele ca pe nite reguli de comportament impuse claselor de obiecte. n clipa n care o clas implementeaz o anumit interfa, obiectele din clasa respectiv pot fi privite n exclusivitate din acest punct de vedere. Interfeele pot fi privite ca nite filtre prin care putem privi un anumit obiect, filtre care nu las la vedere dect proprietile specifice interfeei, chiar dac obiectul n vizor este mult mai complicat n realitate. Interfeele creaz o alt mprire a obiectelor cu care lucrm. n afar de mprirea normal pe clase, putem s mprim obiectele i dup interfeele pe care le implementeaz. i, la fel cu situaia n care definim o operaie doar pentru obiectele unei anumite clase, putem defini i operaii care lucreaz doar cu obiecte care implementeaz o anumit interfa, indiferent de clasa din care acestea fac parte.

Structura lexical Java


Setul de caractere
Limbajului Java lucreaz n mod nativ folosind setul de caractere Unicode. Acesta este un standard internaional care nlocuiete vechiul set de caractere ASCII. Motivul acestei nlocuiri a fost necesitatea de a reprezenta mai mult de 256 de caractere. Setul de caractere Unicode, fiind reprezentat pe 16 bii are posibiliti mult mai mari. Vechiul standard ASCII este ns un subset al setului Unicode, ceea ce nseamn c vom regsi caracterele ASCII cu exact aceleai coduri ca i mai nainte n noul standard.

Java folosete setul Unicode n timpul rulrii aplicaiilor ca i n timpul compilrii acestora. Folosirea Unicode n timpul execuiei nu nseamn nimic altceva dect faptul c o variabil Java de tip caracter este reprezentat pe 16 bii iar un ir de caractere va ocupa fizic n memorie de dou ori mai muli octei dect numrul caracterelor care formeaz irul. n ceea ce privete folosirea Unicode n timpul compilrii, compilatorul Java accept la intrare fiiere surs care pot conine orice caractere Unicode. Se poate lucra i cu fiiere ASCII obinuite n care putem introduce caractere Unicode folosind secvene escape. Fiierele surs sunt fiiere care conin declaraii i instruciuni Java. Aceste fiiere trec prin trei pai distinci la citirea lor de ctre compilator: 1. irul de caractere Unicode sau ASCII, memorat n fiierul surs, este transformat ntr-un ir de caractere Unicode. Caracterele Unicode pot fi introduse i ca secvene escape folosind doar caractere ASCII. 2. irul de caractere Unicode este transformat ntr-un ir de caractere n care sunt evideniate separat caracterele de intrare fa de caracterele de sfrit de linie. 3. irul de caractere de intrare i de sfrit de linie este transformat ntr-un ir de cuvinte ale limbajului Java. n primul pas al citirii fiierului surs, sunt generate secvene escape. Secvenele escape sunt secvene de caractere ASCII care ncep cu caracterul backslash \. Pentru secvenele escape Unicode, al doilea caracter din secven trebuie s fie u sau U. Orice alt caracter care urmeaz dup backslash va fi considerat ca fiind caracter nativ Unicode i lsat nealterat. Dac al doilea caracter din secvena escape este u, urmtoarele patru caractere ASCII sunt tratate ca i cifre hexazecimale (n baza 16) care formeaz mpreun doi octei de memorie care reprezint un caracter Unicode. Se pot folosi la intrare i fiiere ASCII normale, pentru c ASCII este un subset al Unicode. De exemplu, putem scrie: int f\u0660 = 3; Numele variabilei are dou caractere i al doilea caracter este o cifr codificat Unicode. Exemple de secvene Unicode:
\uaa08 \U0045 \u6abe

n al doilea pas al citirii fiierului surs, sunt recunoscute ca i caractere de sfrit de linie caracterele ASCII CR i ASCII LF. n acelai timp, secvena de caractere ASCII CR-ASCII LF este tratat ca un singur sfrit de linie i nu dou. n acest mod, Java suport n comun standardele de terminare a liniilor folosite de diferite sisteme de operare: MacOS, Unix i DOS. Este important s separm caracterele de sfrit de linie de restul caracterelor de intrare pentru a ti unde se termin comentariile de o singur linie (care ncep cu secvena //) precum i pentru a raporta odat cu erorile de compilare i linia din fiierul surs n care au aprut acestea. n pasul al treilea al citirii fiierului surs, sunt izolate elementele de intrare ale limbajului Java, i anume: spaii, comentarii i uniti lexicale. Spaiile pot fi caracterele ASCII SP (spaiu), FF (avans de pagin) sau HT (tab orizontal) precum i orice caracter terminator de linie.

Uniti lexicale
Unitile lexicale sunt elementele de baz cu care se construiete semantica programelor Java. n irul de cuvinte de intrare, unitile lexicale sunt separate ntre ele prin comentarii i spaii. Unitile lexicale n limbajul Java pot fi:

Cuvinte cheie

Identificatori Literali Separatori Operatori

Cuvinte cheie
Cuvintele cheie sunt secvene de caractere ASCII rezervate de limbaj pentru uzul propriu. Cu ajutorul lor, Java i definete unitile sintactice de baz. Nici un program nu poate s utilizeze aceste secvene altfel dect n modul n care sunt definite de limbaj. Singura excepie este aceea c nu exist nici o restricionare a apariiei cuvintelor cheie n iruri de caractere sau comentarii. Cuvintele cheie ale limbajului Java sunt:
abstract boolean break byte case cast catch char class const continue default do double else extends final finally float for future generic goto if implements import inner instanceof intinterface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient try var void volatile while byvalue

Dintre acestea, cele ngroate sunt efectiv folosite, iar restul sunt rezervate pentru viitoare extensii ale limbajului.

Identificatori
Identificatorii Java sunt secvene nelimitate de litere i cifre Unicode, ncepnd cu o liter. Identificatorii nu au voie s fie identici cu cuvintele rezervate. Cifrele Unicode sunt definite n urmtoarele intervale: Reprezentare Unicode Caracter ASCII
\u0030-\u0039 \u0660-\u0669 \u06f0-\u06f9 \u0966-\u096f \u09e6-\u09ef 0-9

Explicaie
cifre ISO-LATIN-1 cifre Arabic-Indic cifre Eastern Arabic-Indic cifre Devanagari cifre Bengali

\u0a66-\ u0a6f \u0ae6-\u0aef \u0b66-\u0b6f \u0be7-\u0bef \u0c66-\u0c6f \u0ce6-\u0cef \u0d66-\u0d6f \u0e50-\u0e59 \u0ed0-\u0ed9 \u1040-\u1049
Tabelul 1 Cifrele Unicode.

cifre Gurmukhi cifre Gujarati cifre Oriya cifre Tamil cifre Telugu cifre Kannada cifre Malayalam cifre Thai cifre Lao cifre Tibetan

Un caracter Unicode este o liter dac este n urmtoarele intervale i nu este cifr: Reprezentare Unicode Caracter ASCII
\u0024 \u0041-\u005a \u005f \u0061-\u007a \u00c0-\u00d6 \u00d8-\u00f6 \u00f8-\u00ff \u0100-\u1fff \u3040-\u318f \u3300-\u337f \u3400-\u3d2d \u4e00-\u9fff \uf900-\ufaff $ A-Z _ a-z

Explicaie
semnul dolar (din motive istorice) litere majuscule Latin underscore (din motive istorice) litere minuscule Latin diferite litere Latin cu diacritice diferite litere Latin cu diacritice diferite litere Latin cu diacritice alte alfabete i simboluri non-CJK Hiragana, Katakana, Bopomofo, i Hangul cuvinte ptratice CJK simboluri Hangul coreene Han (Chinez, Japonez, Corean) compatibilitate Han

Tabelul 2. Literele Unicode.

Literali
Un literal este modalitatea de baz de exprimare n fiierul surs a valorilor pe care le pot lua tipurile primitive i tipul ir de caractere. Cu ajutorul literalilor putem introduce valori constante n variabilele de tip primitiv sau n variabilele de tip ir de caractere. n limbajul Java exist urmtoarele tipuri de literali:

literali ntregi literali flotani literali booleeni literali caracter literali ir de caractere Literali ntregi

Literalii ntregi pot fi reprezentai n baza 10, 16 sau 8. Toate caracterele care se folosesc pentru scrierea literalilor ntregi fac parte din subsetul ASCII al setului Unicode. Literalii ntregi pot fi ntregi normali sau lungi. Literalii lungi se recunosc prin faptul c se termin cu sufixul l sau L. Un literal ntreg este reprezentat pe 32 de bii iar unul lung pe 64 de bii. Un literal ntreg n baza 10 ncepe cu o cifr de la 1 la 9 i se continu cu un ir de cifre de la 0 la 9. Un literal ntreg n baza 10 nu poate s nceap cu cifra 0, pentru c acesta este semnul folosit pentru a semnaliza literalii scrii n baza 8. Exemple de literali ntregi n baza 10:
12356L 234871 2345678908

Exemplul al d oilea i al patrulea sunt literali ntregi lungi. Pentru a exprima un literal ntreg n baza 16 trebuie s definim cifrele de la 10 la 15. Convenia va fi urmtoarea:
10 - a, A 11 - b, B 12 - c, C 13 - d, D 14 - e, E 15 - f, F

n plus, pentru c un literal ntreg n baza 16 poate ncepe cu o liter, vom aduga prefixul 0x sau 0X. Dac nu am aduga acest sufix, compilatorul ar considera c este vorba despre un identificator. Exemple de literali ntregi n baza 16:
0xa34 0X123 0x2c45L 0xde123abccdL

Ultimele dou exemple sunt literali ntregi lungi. Pentru a reprezenta un literal ntreg n baza 8, l vom preceda cu cifra 0. Restul cifrelor pot fi oricare ntre 0 i 7. Cifrele 8 i 9 nu sunt admise n literalii ntregi n baza 8. Exemple de literali ntregi n baza 8:
0234500123001234567712345677L

Valoarea maxim a unui literal ntreg normal este de 2147483647 (231-1), scris n baza 10. n baza 16, cel mai mare literal pozitiv se scrie ca 0x7fffffff iar n baza 8 ca 017777777777. Toate trei scrierile reprezint de fapt aceeai valoare, doar c aceasta este exprimat n baze diferite. Cea mai mic valoare a unui literal ntreg normal este -2147483648 (-231), respectiv 0x80000000 i 020000000000. Valorile 0xffffffff i 037777777777 reprezint amndou valoarea -1. Specificarea n surs a unui literal ntreg normal care depete aceste limite reprezint o eroare de compilare. Cu alte cuvinte, dac folosim n surs numrul: 21474836470 de exemplu, fr s punem sufixul de numr lung dup el, compilatorul va genera o eroare la analiza sursei.

Valoarea maxim a unui literal ntreg lung este, n baza 10, 9223372036854775807L (263-1). n octal, asta nseamn 0777777777777777777777L iar n baza 16 0x7fffffffffffffffL. n mod asemntor, valoarea minim a unui literal ntreg lung este -9223372036854775808L (-263-1), n octal aceast valoare este 0400000000000000000000L iar n baza 16 este 0x8000000000000000L. La fel ca i la literalii ntregi normali, depirea acestor limite este o eroare de compilare. Literali flotani Literalii flotani reprezint numere reale. Ei sunt formai dintr-o parte ntreag, o parte fracionar, un exponent i un sufix de tip. Exponentul, dac exist, este introdus de litera e sau E urmat opional de un semn al exponentului. Este obligatoriu s existe mcar o cifr fie n partea ntreag fie n partea zecimal i punctul zecimal sau litera e pentru exponent. Sufixul care indic tipul flotantului poate fi f sau F n cazul n care avem o valoare flotant normal i d sau D dac avem o valoare flotant dubl. Dac nu este specificat nici un sufix, valoarea este implicit dubl. Valoarea maxim a unui literal flotant normal este 3.40282347e+38f iar valoarea cea mai mic reprezentabil este 1.40239846e-45f, ambele reprezentate pe 32 de bii. Valoarea maxim reprezentabil a unui literal flotant dublu este de 1.79769313486231570e+308 iar valoarea cea mai mic reprezentabil este 4.94065645841246544e-324, ambele reprezentate pe 64 de bii. La fel ca i la literalii ntregi, este o eroare s avem exprimat n surs un literal mai mare dect valoarea maxim reprezentabil sau mai mic dect cea mai mic valoare reprezentabil. Exemple de literali flotani:
1.0e45f -3.456f 0. .01e-3

Primele dou exemple reprezint literali flotani normali, iar celelalte literali flotani dubli. Literali booleeni Literalii booleeni nu pot fi dect true sau false, primul reprezentnd valoarea boolean de adevr iar cellalt valoarea boolean de fals. True i false nu sunt cuvinte rezervate ale limbajului Java, dar nu vei putea folosi aceste cuvinte ca identificatori. Literali caracter Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode. Reprezentarea se face fie folosind o liter, fie o secven escape. Secvenele escape ne permit reprezentarea caracterelor care nu au reprezentare grafic i reprezentarea unor caractere speciale precum backslash i nsi caracterul apostrof. Caracterele care au reprezentare grafic pot fi reprezentate ntre apostrofe, ca n exemplele:
'a' '' ','

Pentru restul caracterelor Unicode trebuie s folosim secvene escape. Dintre acestea, cteva sunt predefinite n Java, i anume:

Secven escape '\b' '\t' '\n' '\f' '\r' '\"' '\'' '\\'

Caracterul reprezentat caracterul backspace BS \u0008 caracterul tab orizontal HT \u0009 caracterul linefeed LF \u000a caracterul formfeed FF \u000c caracterul carriage return CR \u000d caracterul ghilimele \u0022 caracterul apostrof \u0027 caracterul backslash \u005c

Tabelul 3 Secvene escape predefinite n Java.

n form general, o secven escape se scrie sub una din formele:


'\o' '\oo' '\too'

unde o este o cifr octal iar t este o cifr octal ntre 0 i 3. Nu este corect s folosii ca valori pentru literale caracter secvena '\u000d' (caracterul ASCII CR), sau altele care reprezint caractere speciale, pentru c acestea fiind secvene escape Unicode sunt transformate foarte devreme n timpul procesrii sursei n caractere CR i sunt interpretate ca terminatori de linie. Exemple de secvene escape:
'\n' '\u23a' '\34'

dac dup caracterul backslash urmeaz altceva dect: b, t, n, f, r, ", ', \, 0, 1, 2, 3, 4, 5, 6, 7 se va semnala o eroare de compilare. n acest moment secvenele escape Unicode au fost deja nlocuite cu caractere Unicode native. Dac u apare dup \, se semnaleaz o eroare de compilare. Literali ir de caractere Un literal ir de caractere este format din zero sau mai multe caractere ntre ghilimele. Caracterele care formeaz irul de caractere pot fi caractere grafice sau secvene escape ca cele definite la literalii caracter. Dac un literal ir de caractere conine n interior un caracter terminator de linie va fi semnalat o eroare de compilare. Cu alte cuvinte, nu putem avea n surs ceva de forma:
"Acesta este greit! "

chiar dac aparent exprimarea ar reprezenta un ir format din caracterele A, c, e, s, t, a, spaiu, e, s, t, e, linie nou, g, r, e, , i, t, !. Dac dorim s introducem astfel de caractere terminatoare de linie ntr-un ir va trebui s folosim secvene escape ca n:
Acesta este\ngreit

Dac irul de caractere este prea lung, putem s-l spargem n buci mai mici pe care s le concatenm cu operatorul +.

Fiecare ir de caractere este n fapt o instan a clasei de obiecte String declarat standard n pachetul java.lang. Exemple de iruri de caractere:
"" "\"""ir de caractere" "unu" + "doi"

Primul ir de caractere din exemplu nu conine nici un caracter i se numete irul vid. Ultimul exemplu este format din dou iruri distincte concatenate.

Separatori
Un separator este un caracter care indic sfritul unei uniti lexicale i nceputul alteia. Separatorii sunt necesari atunci cnd uniti lexicale diferite sunt scrise fr spaii ntre ele. Acestea se pot totui separa dac unele dintre ele conin caractere separatori. n Java separatorii sunt urmtorii:
(){}[];,.

Exemple de separare:
a[i] sin(56)

n primul exemplu nu avem o singur unitate lexical ci patru: a, [, i, ]. Separatorii [ i ] ne dau aceast informaie. n al doilea exemplu, unitile lexicale sunt tot 4 sin, (, 56, ). Atenie, separatorii particip n acelai timp i la construcia sintaxei limbajului. Ei nu sunt identici cu spaiile dei, ca i acestea, separ uniti lexicale diferite.

Operatori
Operatorii reprezint simboluri grafice pentru operaiile elementare definite de limbajul Java. Lista tuturor operatorilor limbajului Java este:
= > < ! ~ ?: = = <= >= != && || ++ -+ - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>=

S mai precizm deocamdat c toi operatorii joac i rol de separatori. Cu alte cuvinte, din secvena de caractere:
vasile+gheorghe

putem extrage trei uniti lexicale, vasile, + i gheorghe.

Comentarii
Un comentariu este o secven de caractere existent n fiierul surs dar care servete doar pentru explicarea sau documentarea sursei i nu afecteaz n nici un fel semantica programelor. n Java exist trei feluri de comentarii:

Comentarii pe mai multe linii, nchise ntre /* i */. Toate caracterele dintre cele dou secvene sunt ignorate. Comentarii pe mai multe linii care in de documentaie, nchise ntre /** i */. Textul dintre cele dou secvene este automat mutat n documentaia aplicaiei de ctre generatorul automat de documentaie. Comentarii pe o singur linie care ncep cu //. Toate caracterele care urmeaz acestei secvene pn la primul caracter sfrit de linie sunt ignorate.

n Java, nu putem s scriem comentarii n interiorul altor comentarii. La fel, nu putem introduce comentarii n interiorul literalilor caracter sau ir de caractere. Secvenele /* i */ pot s apar pe o linie dup secvena // dar i pierd semnificaia. La fel se ntmpl cu secvena // n comentarii care ncep cu /* sau /**. Ca urmare, urmtoarea secven de caractere formeaz un singur comentariu: /* acest comentariu /* // /* se termin abia aici: */

You might also like