Documente Academic
Documente Profesional
Documente Cultură
1. Ce este Java ?
Java este un limbaj de programare de nivel înalt, dezvoltat de JavaSoft, companie în cadrul firmei Sun
Microsystems. El rulează pe aproape un miliard de PC-uri şi pe mai multe milarde de dispozitive mobile şi TV.
- complet orientat pe obiecte si oferă posibilitatea reală de refolosire a codului (care este de fapt promisiunea
făcută la apariţia programării orientate pe obiecte) - elimină aşadar complet stilul de programare procedural
- neutru din punct de vedere arhitectural – codul compilat nu are nici o legătură cu nici o platformă a unui
procesor sau sistem de operare particular.
- portabil, cu alte cuvinte Java este un limbaj independent de platforma de lucru, aceeaşi aplicaţie rulând, fără
nici o modificare, pe sisteme diferite cum ar fi Windows, UNIX sau Macintosh, lucru care aduce economii
substanţiale firmelor care dezvoltă aplicaţii pentru Internet.
- sigur : permite verificarea dinamică a codului pentru detectarea secvenţelor periculoase; limitează sursele
frecvente de erori ce apar în programare prin eliminarea pointerilor, administrarea automată a memoriei şi
eliminarea fisurilor de memorie printr-o procedură de colectare a “gunoiului” care rulează în fundal;
- permite dezvoltări cu grad de securitate ridicat prin impunerea unor reguli stricte pentru rularea programelor
lansate pe calculatoare aflate la distanţă (acestea nu au acces la reţeaua locală, la fişierele stocate în
sistemul local şi nu pot lansa în execuţie programe locale), etc.
- este modelat după C şi C++, trecerea de la C, C++ la Java făcându-se foarte uşor.
- interpretate :
instrucţiunile sunt citite linie cu linie de un program numit interpretor şi traduse în instrucţiuni maşină;
avantaj : simplitate;
dezavantaje : viteză de execuţie redusă
- compilate :
codul sursă al programelor este transformat de compilator într-un cod ce poate fi executat direct de
procesor;
avantaj : execuţie rapidă;
dezavantaj : lipsa portabilităţii, codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe
platforma pe care a fost compilat.
Codul de octeţi este diferit de codul maşină. Codul maşină este reprezentat de o succesiune de 0 şi 1; codurile
de octeţi sunt seturi de instrucţiuni care seamănă cu codul scris în limbaj de asamblare.
Codul maşină este executat direct de către procesor şi poate fi folosit numai pe platforma pe care a fost creat;
codul de octeţi este interpretat de mediul Java şi de aceea poate fi rulat pe orice platformă care foloseşte mediul
de execuţie Java.
Cod sursă Java -> (compilare) -> Cod de octeţi -> (interpretare)
Fig. 1
Execuţia
codului Java
Interpretorul Java transformă codul de octeţi într-un set de instrucţiuni maşină, întârzierea interpretării fiind însă
foarte mică datorită asemănării dintre codul de octeţi şi limbajul de asamblare şi din acest motiv execuţia se face
aproape la fel de repede ca în cazul programelor compilate.
Codul sursă este compilat nu pentru calculatorul pe care se lucrează ci pentru un calculator inexistent, acest
calculator imaginar fiind numit Maşina Virtuală Java (Java Virtual Machine). Interpretorul acţionează apoi ca
un intermediar între Maşina Virtuală Java şi maşina reală pe care este rulat programul.
Aşadar, codurile de octeti sunt intructiuni cod maşină pentru Maşina Virtuală Java şi orice interpretor Java, fie
el un mediu de dezvoltare a aplicatiilor Java, fie un browser de Web ce poate rula applet-uri Java este de fapt o
implementare a Maşinii Virtuale Java.(Obs: MV Java poate fi implementata si hardware.)
Codurile de octeţi fac posibilă portabilitatea programelor Java ("write once, run anywhere"), acestea putând fi
rulate pe orice implementare a MV Java. De exemplu, acelaşi program poate rula pe Window NT, Solaris,
Macintosh.
Fig. 2 Portabilitatea codului Java
O platformă de lucru este un mediu hardware sau software în care un program se execută.
In general, limbajele de programare sunt gândite pentru o platformă hardware /sistem de operare anume şi
folosesc resursele oferite de acel sistem. Pentru a realiza neutralitatea arhitecturală a limbajului Java pune la
dispozitie o întreagă platformă de lucru, care să realizeze legătura cu platformele hardware/software existente
într-un sistem de calcul.
Platforma Java diferă de celelalte platforme în sensul că este o platformă numai software care ruleaza deasupra
platformelor hard existente în sistemul de lucru.
Java API este o colecţie de componente soft care pun la dispoziţie diverse instrumente utile în dezvoltarea unei
aplicaţii, grupate în pachete (librarii) de componente.
5. Avantajele limbajului Java
- uşor de învăţat : deşi este un limbaj de nivel înalt, orientat pe obiecte, Java este uşr de învăţat, în special pentru
programatorii familiarizaţi cu C sau C++
- scrieţi mai puţin cod sursă : comparaţii făcute folosind divesre metrici de programe (numarul claselor, numarul
metodelor, etc) sugerează că un program scris în Java poate fi de până la 4 ori mai mic decât acelaşi program
scris în C++
- scrieţi un cod mai bun: limbajul Java încurajeaza tehnicile bune de programare (denumirea sugestiva a
variabilelor, metodelor, claselor, etc)
etc.
7. Adrese utile
Tutorials http://docs.oracle.com/javase/tutorial/
Definiţia oricărui tip de dată se face într-un bloc ce are în antet cuvântului cheie class:
Odată definit un nou tip, se poate genera un obiect care să-i aparţină:
În corpul ce defineşte o clasă pot exista două tipuri de elemente: câmpuri de date şi metode.
Manipularea obiectelor
Obiectul, ca structură elementar adresabilă în orice limbaj orientat obiect, este accesat în JAVA prin intermediul unei
referinţe (numită în alte documentaţii handle sau pointer, deşi JAVA nu lucrează cu pointeri). Comunicarea cu un
obiect se realizează strict prin intermediul referinţei asociate.
Reciproc, o referinţă poate să existe în absenţa unui obiect la care să se refere:
String ref1;
Dacă în acest moment se încearcă trimiterea unui mesaj la ref1, va apărea o eroare în faza de rulare, el nefiind conectat
la nimic.
Alternativ:
Memorarea obiectelor
Există şase zone diferite de memorie ce pot stoca obiectele unei aplicaţii JAVA pe parcursul sau în afara rulării
acesteia:
regiştrii procesorului:
sunt alocaţi de compilator în funcţie de necesităţile acestuia (în consecinţă nu permit un control
direct şi nici măcar o evidenţă a existenţei lor în codul sursă).
stiva:
este plasată în zona de memorie RAM, deci este caracterizată prin acces foarte rapid;
deplasarea pointerului de stivă se realizează prin cod generat de compilatorul JAVA; din acest motiv
acesta va trebui să cunoască din program dimensiunea şi durata exactă de existenţă a oricărei date ce
va fi memorată în stivă;
Caracteristicile prezentate anterior duc la scăderea flexibilităţii programului; din acest motiv se preferă stocarea
în stivă doar a referinţelor la obiecte şi nu a acestora.
zona heap – este o zonă din memoria RAM, destinată salvărilor uzuale. JAVA stochează toate obiectele în
această zonă. Are următoarele caracteristici:
alocarea memoriei din această zonă se realizează în mod dinamic. Din acest motiv compilatorul nu
solicită precizarea dimensiunii şi timpului de alocare pentru diferite porţiuni din heap;
ori de câte ori codul sursă conţine cuvântul cheie new se alocă memorie pentru un obiect nou creat.
Astfel se asigură o flexibilitate maximă pentru care, însă, este un preţ de plătit – viteza de lucru
scade.
datele stocate în această zonă (definite cu ajutorul cuvântului cheie static) reprezintă elementele ce
nu se modifică de la o instanţiere la alta a unui tip de dată; niciodată un obiect nu va fi memorat în
memoria statică din RAM.
zona rezervată constantelor (plasată uneori în ROM, dacă respectivele constante sunt separate de codul
programului);
zona de memorie externă RAM-lui – este folosită pentru datele ce au o dura de viaţă mai mare decât
programul în care sunt definite (de exemplu, obiectele “revărsate” (streamed objects) ce vor fi convertite
într-un flux de biţi pentru a fi trimise, de regulă, către o altă maşină.) Aceste date sunt convertite şi trimise
către alte medii şi, la nevoie, readuse şi memorate din nou în memoria RAM rezervată obiectelor uzuale.
Tipurile de date ce apar cel mai frecvent în programe sunt reunite sub apelativul de tipuri primitive. Ele
beneficiază de un tratament special, împrumutat de limbajul JAVA de la limbajele C şi C++. Astfel, se va evita
crearea unei variabile prin folosirea cuvântului cheie new şi va fi generată o variabilă de tip automatic (nu o
referinţă). Eficienţa va creşte deoarece obiectul nou creat nu va fi memorat în heap, ci în stivă.
În JAVA tipurile primitive au o dimensiune fixă, invariantă la modificarea arhitecturii maşinii de calcul. Această
proprietate, alături de alte caracteristici conferă portabilitatea programelor JAVA:
Observaţii:
toate tipurile primitive de date au o clasă acoperitoare; aceasta permite crearea unui obiect non-
primitiv, ce va putea fi memorat în heap:
Masivele de date
Toate limbajele de programare lucrează cu masive de date. În C şi C++ trebuie acordată o atenţie deosebită
manipulării blocurilor de date, acestea fiind doar blocuri de memorie:
- accesul nu trebuie făcut în afara zonei de memorie atribuite;
JAVA oferă, în acest sens, un grad de siguranţă sporit deoarece iniţializarea şi accesul în zona de memorie
atribuită masivului sunt realizate în mod automat. Astfel:
spaţiul exterior oricărui masiv este redus şi indexarea este verificată în momentul rulării;
crearea unui masiv de obiecte înseamnă crearea unui masiv de referinţe la respectivele obiecte.
Acestea sunt iniţializate automat pe valoarea null, valoare ce indică absenţa obiectului referit. Orice
tentativă de a folosi o referinţă nulă generează o eroare în faza de rulare.
Observaţie: în JAVA se pot crea şi masive de primitive, pentru care compilatorul efectuează iniţializarea pe
valoarea 0 în mod automat.
Distrugerea obiectelor
În majoritatea limbajelor de programare, eliberarea zonelor de memorie aferente variabilelor ce şi-au încetat
activitatea implică un efort de programare considerabil. Va trebui să se stabilească cu exactitate:
Majoritatea limbajelor procedurale apelează, pentru soluţionarea acestei probleme, la conceptul de orizont. Acesta
determină pentru numele definite în interiorul său, atât durata de viaţă cât şi vizibilitatea.
int var1=12;
int var2=40;
int var1=12;
El va determina o eroare de compilare (var1 deja creată). JAVA nu acceptă ascunderea unei variabile într-un orizont mai
larg deoarece, astfel, creşte gradul de confuzie al codului.
Tipurile primitive de date şi obiecte JAVA au durată de viaţă diferită. Crearea unui obiect este desemnată prin cuvântul
cheie new; obiectul va exista până la sfârşitul propriului său orizont:
Obiectul de tip String referit va rămâne, însă, în memorie, dar va fi imposibil de accesat. JAVA intervine ulterior prin
componenta numită garbage collector (colectorul de reziduuri) şi verifică toate obiectele create cu new; cele ce nu mai
au referinţă vor fi şterse. Acest mecanism reprezintă un pas evolutiv al limbajului JAVA (în C++ obiectele sunt distruse
doar în mod explicit) şi permite eliminarea problemelor de programare generate de ocuparea excesivă a spaţiului de
memorare.