Sunteți pe pagina 1din 10

Limbajului JAVA - generalităţi

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.

Dintre caracteristicile principale ale limbajului amintim:

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

- permite creearea unor documente Web îmbunătăţite cu animaţie şi multimedia.

- a fost proiectat pentru a fi folosit în medii distribuite şi sisteme deschise.

- este un limbaj compilat şi interpretat

- este modelat după C şi C++, trecerea de la C, C++ la Java făcându-se foarte uşor.

2. Java : un limbaj compilat şi interpretat

În funcţie de modul de execuţie al programelor, limbajele de programare se împart în două categorii :

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

Programele Java sunt atât interpretate cât şi compilate (vezi Fig.1).

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

3. Cum este rulat un program 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.

Cum este posibilă portarea codului de octeţi pe calculatoare diferite?

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

4. Platforma de lucru 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.

Platforma Java are două componente:

- Maşina Virtuala Java (JVM)

- Interfaţa de Programare a Aplicatiilor (Java API)

Fig. 3 Platforma Java

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)

- folosind "100% Pure Java" evitaţi dependenţa de o platformă anume,

etc.

6. Evolutia platformei Java SE

JDK Alpha and Beta (1995)


JDK 1.0 (January 23, 1996)
JDK 1.1 (February 19, 1997)
J2SE 1.2 (December 8, 1998)
J2SE 1.3 (May 8, 2000)
J2SE 1.4 (February 6, 2002)
J2SE 5.0 (September 30, 2004)
Java SE 6 (December 11, 2006)
Java SE 7 (July 28, 2011)
Java SE 8 (March 18, 2014)
Java SE 9
Java SE 10

7. Adrese utile

Web Site URL

Tutorials http://docs.oracle.com/javase/tutorial/

Bruce Eckel – Thinking in Java http://www.mindview.net/Books/TIJ/

Sun's Java site http://www.oracle.com/technetwork/java/index.html

JavaWorld Magazine http://www.javaworld.com


Gamelan http://www.gamelan.com
8. Câteva particularităti ale programării Java

Crearea tipurilor noi de date (crearea claselor)

Clasa reprezintă în limbajele orientate obiect un tip de dată.

Definiţia oricărui tip de dată se face într-un bloc ce are în antet cuvântului cheie class:

class NumeClasa { /* definiţie clasa */}

Odată definit un nou tip, se poate genera un obiect care să-i aparţină:

NumeClasa a=new NumeClasa ();

Toată programarea JAVA se rezumă la:

 definirea de noi clase;

 crearea de obiecte ce aparţin acestor clase;

 trimiterea de mesaje obiectelor.

Î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:

String ref1 = new String (“Sunt un obiect nou creat”);


Cuvântul cheie new indică, întotdeauna, crearea unui obiect de un anumit tip (în cazul nostru String). În contextul
prezentat anterior, ref1 este o referinţă către un obiect nou creat de tip String şi de argument "Sunt un obiect nou creat".

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:

 permit accesarea la viteză maximă;

 au capacitate de stocare mică;

 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;

 accesarea este realizată prin intermediul pointerului de stivă;

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

 zona de memorie statică (cuvântul static are sensul de locaţie fixă):

 este plasată tot în memoria RAM;

 conţine datele ce sunt disponibile pe întreaga durată a execuţiei programului;

 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:

Tip Dimensiune Minim Maxim Clasa


primitiv acoperitoare
boolean 1 bit - - Boolean
char 16 biţi Unicode 0 Unicode 216-1 Character
byte 8 biţi -128 +127 Byte
short 16 biţi -215 +215-1 Short
int 32 biţi -231 +231-1 Integer
long 64 biţi -263 +263-1 Long
float 32 biţi IEEE754 IEEE754 Float
double 64 biţi IEEE754 IEEE754 Double
void - - - Void

Tabel 1.1 Tipurile primitive de date

Observaţii:

 toate tipurile primitive numerice au semn;

 toate tipurile primitive de date au o clasă acoperitoare; aceasta permite crearea unui obiect non-
primitiv, ce va putea fi memorat în heap:

Character c = new Character(‘x’);

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;

- folosirea locaţiilor trebuie realizată doar după o iniţializare prealabilă.

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:

- durata de viaţă a unei variabile;

- momentul ştergerii acesteia.

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.

În C, C++ şi JAVA orizontul este determinat de poziţia parantezelor{}:

int var1=12;

/* var1 este disponibila */

int var2=40;

/* var1 i var2 sunt disponibila */

/* var1 este disponibila */

/* s-a depasit orizontul corespunzator var2 */


}

Observaţie: următorul cod, deşi valid în C, C++, este nepermis în JAVA:

int var1=12;

int var1=40; /*nepermis în JAVA */

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:

String s=new String ("Obiect nou creat");

} /*sfarsitul orizontului pentru s */

Odată părăsit orizontul de existenţă, referinţa s va dispărea.

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.

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