Professional Documents
Culture Documents
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++).
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.
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.
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.
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
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
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
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
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: */