Sunteți pe pagina 1din 20

Capitolul III.

Noţiuni introductive despre JAVA

3.1. Ce este Java?

Java este un concept care include mai multe înţelesuri. În primul rînd Java este un
limbaj de programare orientat pe obiecte. El a fost dezvoltat de către o echipă de la
Sun Microsystems condusă de James Gosling (1990-1993). Iniţial, numele limbajului
de programare a fost 'Stejarul' (numele copacului din faţa biroului lui Gosling), dar
cum exista un alt limbaj cu acelaşi nume a fost redenumit Java, după numele cafenelei
de lîngă sediul Sun Microsystems. În 1993, ca urmare a dezvoltării World Wide Web,
la Sun a fost creat un browser numit la început WebRunner iar apoi HotJava.

Java se prezintă şi sub forma unei maşini virtuale care execută instrucţiunile pe care le
generează compilatorul Java. Această maşină virtuală (sau mediu "run time") poate fi
încorporată în diverse produse cum sînt browser-ele Web sau în nucleul unor sisteme
de operare (OS/2, Windows NT).

În plus, Java este constituit din biblioteci de clase (sau "pachete" în terminologia
Java). Fiecare din aceste biblioteci de clase este dedicată unui anumit domeniu. Unele
biblioteci de clase sînt construite pentru lucrul cu GUI, altele controlează lucrul în
multimedia sau pe reţele.

Cele trei înţelesuri ale noţiunii Java sînt:

 Limbaj de programare orientat pe obiecte


 Maşină virtuală care poate fi integrată într-un browser Web (cum sînt Netscape
Navigator sau Microsoft Internet Explorer)
 Set standardizat de biblioteci de clase care reprezintă fundamentul pentru crearea
interfeţelor grafice (GUI - Graphical User Interface), pentru controlul fluxului de
date în multimedia şi pentru comunicarea în reţele.

3.2. Java - limbaj de programare concurentă

Java nu este doar un limbaj de programare orientat pe obiect ci şi un limbaj de


programare concurentă. Cu el se pot crea clase şi obiecte şi se pot utiliza moştenirea
şi constructorii, caracteristici ale programării orientate pe obiect. Acestea fac din Java
un limbaj puternic. Multe din proprietăţile limbajului Java sînt moştenite de la alte
limbaje moderne, orientate pe obiect, utilizate în prezent.
3.2 - Java - limbaj de programare concurentă 39

Sintaxa Java seamănă foarte mult cu cea a limbajului C++. Java utilizează
sintaxa similară din C++ pentru instrucţiuni 'if' şi 'while' şi de asemenea pentru
alţi constructori de control. De asemenea, structura sintaxei Java conţine clase,
metode (în loc de funcţii membre) şi acces protejat (private, public, protected).
Noţiunea de 'constructor' în Java este similară cu cea din C++.

Deci, limbajul Java are cîteva caracteristici pe care le are şi limbajul C++.

 Aceeaşi sintaxă a expresiilor


 Sintaxă orientată pe obiect similară (clase, acces protejat,
constructori, declaraţii de metode, etc.).

În plus faţă de C++, limbajul Java are două proprietăţi care îl fac mai puternic
decît acesta, şi anume, dă posibilitatea programatorului să construiască fire de
execuţie şi să sincronizeze metode.

3.3. Maşina Virtuală Java

În spatele limbajului Java este Maşina Virtuală Java (MVJ) care reprezintă un
element important al tehnologiei Java (în engl. Java Virtual Machine).

Cum am menţionat anterior, MVJ poate fi cuprinsă într-un mediu oarecare. Odată ce o
parte de cod Java este încărcată într-un mediu, ea este verificată. Din procesul de
încărcare face parte invocarea unui "încărcător de clasă" care face verificarea codului-
octet. Acesta este un cîştig din punctul de vedere al securităţii deoarece prin această
verificare se asigură faptul că maşina pe care este încărcat codul generat de compilator
(sau provenit de la orice altă sursă) nu este deranjată (coruptă) de către acesta.

Funcţionarea în acest mod este importantă deoarece utilizarea tehnologiei Java pe


Internet implică transferul de programe (download) de pe diverse maşini de pe
Internet din întreaga lume, pe maşina locală pe care lucrează utilizatorul. Se obţin
astfel garanţii privind codul care a fost salvat, şi anume că el nu va strica ceva pe
maşina pe care a fost salvat.

Verificarea codului-octet are loc la sfîrşitul compilării pentru a asigura utilizatorul de


corectitudine şi precizia codului. Verificarea codului-octet este prima fază în procesul
de încărcare a clasei şi este operaţiunea care asigură corectitudinea obţinerii lui (v.
explicaţii la Fig. 3.4).

Figura 3.1 conţine procesul de dezvoltare pe care îl parcurge un programator în Java


pentru a produce cod-octet pe care apoi îl va pune în execuţie.
40 Noţiuni introductive despre Java - 3

Mediu
javac
Sursa Java Cod-octet MV Java
Java

.java
.class

Fig. 3.1. Procesul de dezvoltare al unui program în Java

Codul sursă Java se găseşte într-un fişier .java care va fi prelucrat cu un compilator
Java (javac). Compilatorul Java produce un fişier .class care va conţine codul-octet.
Acest fişier .class va fi încărcat pe reţea sau local pe maşina curentă
în mediul de execuţie de pe platforma respectivă. MVJ este cuprinsă în acest mediu şi
interpretează şi execută codul octet.

Deci, în legătură cu MVJ se remarcă următoarele:

 Un program în Java este compilat în codul-octet a cărui arhitectură ţintă este MVJ;
 Maşina virtuală este cuprinsă în alte medii (web browser, sistem de operare);
 MVJ utilizează un verificator de cod atunci cînd citeşte cod-octet; 'Class Loader'
încarcă clasele peste reţea şi măreşte astfel securitatea procesului.

3.4. Bibliotecile de clase în Java

În afară de limbajul Java şi de MVJ, Java furnizează şi un set puternic de biblioteci de


clase.

Una dintre bibliotecile de clase este biblioteca GUI (graphical user interface) bazată pe
ferestre. Numele acestei biblioteci de clase este setul abstract de unelte de lucru
(toolkit) bazat pe ferestre (AWT - abstract window toolkit). Cu ajutorul său se pot crea
butoane, etichete, cîmpuri de text, etc. Acestea au calitatea, apreciată de mulţi
utilizatori, de a fi uşor de folosit.
O altă bibliotecă de clase se referă la imagini şi prelucrări de imagini şi permite
crearea imaginilor care provin din fişiere .gif sau .jpeg. De asemenea, se mai pot
realiza prelucrări de imagini (filtrări sau manipulări de imagini). Prin intermediul
acestei biblioteci de clase se realizează prelucrarea fişierelor audio (redare, buclare,
oprire).

O bibliotecă de clase importantă este cea care cuprinde integrarea în reţea, un subiect
major în conexiune cu prelucrările Java. Cea mai importantă proprietate este cea de a
permite utilizarea adreselor URL (Uniform Resource Locators) pentru a ieşi în reţeaua
Internet după o anumită informaţie care poate fi adusă apoi pe maşina locală. În plus
faţă de utilizarea URL-urilor (la un nivel mai scăzut) se mai pot crea intrări (sockets)
folosind protocolul TCP/IP. Această bibliotecă de clase este asociată cu mediile de
operare şi interfeţele către alte platforme cu care lucrează Java. Acestea sînt servicii
bazate pe Internet şi deci se poate lucra cu servicii Internet de interes general cum sînt
FTP şi gopher.

În concluzie, principalele biblioteci de clase Java sînt orientate pe :

 Ferestrele GUI
 Set complet de clase bazate pe ferestre standard GUI
 Uşor de utilizat pentru a construi clienţi GUI

 Imagini şi audio
 Suport pentru crearea de imagini din .gif, .jpeg, etc.
 Includ interfeţe pentru a suporta filtre de prelucrare a imaginilor
 Applet-urile pot reda fişiere audio
 Lucrul în reţea
 Suport pentru aducerea fişierelor, imaginilor, etc. utilizînd URL
 Sistem-suport pentru intrări de flux, furnizînd acces la serviciile bazate pe
Internet
 Maşina virtuală, în conexiune cu Internet poate încărca dinamic clasele pe
reţea.

3.5. Elemente de tehnologie Java

3.5.1. Elemente ale limbajului Java

Limbajul Java este un limbaj de programare orientat pe obiecte, deci lucrează cu


obiecte, clase şi utilizează moştenirea.

O clasă poate fi asemănată unui model (sau şablon) care defineşte un obiect. Clasa
defineşte modul în care
42 Noţiuni introductive despre Java - 3

 va arăta (atribute = valori)


 se va comporta (metode = funcţii)
obiectul odată ce a fost instanţiat.

Exemplu: O
formă de
prăjitură (clasa)
care se aplică şi
taie
(instanţiere)
dintr-o bucată
mai mare şi
scoate prăjituri
(obiecte) care
pot fi diferite
totuşi ca
parametri.
Pentru a afla
cum e
umplutura
prăjiturii
trebuie să pătrundem din afară în interior. Astfel se pune în practică principiul
încapsulării, ca principiu de bază al POO.
Fig. 3.2. Exemplu grafic cu elemente ale limbajului Java

În Fig. 3.2. se prezintă o reprezentare grafică a uni obiect Java numit Punct. În
interiorul cercului sînt precizate două valori pentru coordonatele x şi y. Cel mai
adesea, datele sau valorile (variabilele instanţiate) se află în centrul cercului. În afara
sa sînt poziţionate funcţiile pe care le va avea (metodele). În Fig. 3.2. apare metoda
numită distantaDeLa poziţionată la baza cercului. x şi y din interiorul cercului sînt
încapsulate în obiect (ascunse, izolate) şi singurul mod în care se pot afla informaţii
despre ceea ce se găseşte în centrul cercului este pătrunderea din exterior. Acesta este
un principiu de bază al programării orientate pe obiect (v. Capitolul 2).

3.5.2. Fragment de program în Java

Modul de programare în Java este asemănător cu cel din C++ (ceea ce pot remarca cu
uşurinţă cei care cunosc limbajul C++).

Exemplu de secvenţă de program în Java:

public class Punct {


3.5. - Elemente de tehnologie Java 43

private float x_;


private float y_;

public Punct (float xval, float yval)


{ x_=xval; y_=yval; }

public float distantaDeLa


(Punct refpt)
{
...
}
}

Secvenţa de program începe cu o clasa definită 'public'. Se defineşte (folosind class) o


clasă numită Punct cu care se asociază două piese de informaţie. Imediat după
instrucţiunea class se declară x şi y ca variabile de tip float, float x_ şi float y_. Se
foloseşte semnul '_' după variabilele instanţe pentru a le diferenţia faţă de metode
(convenţie utilă dar nu obligatorie).

Pentru cei care cunosc fundamente de programare în C++ se observă o uşoară


diferenţă de sintaxă între cele două limbaje:
 nu se pun două puncte după cuvîntul 'private', deoarece nu este un
specificator de acces care reprezintă un grup de lucruri. Fiecare variabilă
şi metodă trebuie să conţină unul din cuvintele: 'private', 'public',
'protected' sau nimic (specificatori de acces care vor fi detaliaţi pe
parcurs).
 Clasa are cuvîntul public plasat înainte de class. Aceasta înseamnă că se
exportă această clasă în afara pachetului şi o vom folosi mai tîrziu.
 La sfîrşitul clasei nu se pune punct şi virgulă (ca în C++).
 Nu există fişiere header ci numai fişiere sursă.

Prima metodă (Punct) folosită în secvenţa de program se numeşte constructor. Se


observă că este vorba de un constructor definit public. El are acelaşi nume ca şi clasa
şi nu returnează nici un tip. Lucrează cu doi parametri (două valori în virgulă mobilă,
xval, yval) şi în corpul metodei se atribuie valoarea xval lui x_ şi yval lui y_. Astfel se
iniţializează obiectul pentru a avea o valoare iniţială. Cînd se creează un nou punct se
ştie că el are asociată o valoare pentru x şi una pentru y. Ultima metodă, al cărui corp
nu este detaliat din motive de concizie, este distantaDeLa. Ea preia un punct ca
argument şi returnează o valoare în virgulă mobilă. Se presupune că această rutină va
furniza distanţa dintre două puncte, folosind o anumită formulă.

Urmărind această secvenţă de cod Java se pot evidenţia elementele limbajului Java:
44 Noţiuni introductive despre Java - 3

 Orientarea pe obiecte folosind instanţierea;


 Utilizarea claselor, ca modele care definesc modul în care apare şi se
comportă un obiect odată ce a fost instanţiat.

3.5.3. Obiectul în Java

Se consideră obiectul constituit dintr-un cont de bancă (Fig. 3.3.). Numele clasei este
scris deasupra cercului, ContBancar, iar numele obiectului, rezultat al instanţierii, este
scris sub cerc, aCB. În interiorul cercului sînt plasate două piese de informaţie:
variabile instanţiate sau date: un cîmp id şi o balanta. În jurul variabilelor sînt plasate
metodele (care dau comportamentul obiectului). Metodele implementează orice funcţii
necesare. În cazul unui cont bancar este vorba de: depuneri, retrageri şi alte funcţii
utile pentru accesul la informaţii despre id şi balanţă.

depunere()

Fig. 3.3. Reprezentare grafică pentru un exemplu de obiect Java, ContBancar

O proprietate tipică limbajului Java este modalitatea de preluare a unui şir pentru un
obiect, folosind toString. Acesta preia conţinutul intern al unui obiect şi furnizează un
şir care poate fi tipărit. De asemenea, se poate folosi şi pentru operaţiuni de diagnoză.

Deci,

 în interiorul obiectului se găsesc


3.5. - Elemente de tehnologie Java 45

 datele
 corpul metodei, care reflectă aspectul de calcul din metodă (şi imprimă
comportamentul obiectului)
 în afara obiectului este:
 identitatea obiectului (numele variabilei sau instanţei); în exemplu
identitatea obiectului este dată prin aCB şi reprezintă un cont bancar.
Identitatea este legată de adresa obiectului. Toate obiectele sînt unic
identificate prin adresa lor. Adresa de memorie este diferită pentru diferite
piese de date.
 interfaţa obiectului aflată într-o anumită conexiune cu comportamentul
său; pentru exemplul din Fig 3.3. aceasta înseamnă că există o metodă de
depunere care nu foloseşte parametri şi returnează un anumit tip de
rezultat, o metodă de retragere, dar fără precizarea corpului metodei, este
doar o "semnătură" a metodei. Pe parcurs, se va aprofunda conceptul de
interfaţă, legat de programarea orientată pe obiect.

Codul sursă pentru programul simplu care descrie cîteva operaţii legate de un cont
bancar este prezentat în continuare. El are ca scop doar o prezentare de "sus" a
problemelor de programare Java astfel încît să creeze o idee generală asupra
posibilităţilor de programare în acest limbaj fără să intre în probleme de sintaxă care
vor fi prezentate pe larg în capitolele următoare.

public class ContBancar {

public ContBancar () { this(0.0) ; }

public ContBancar( double initBal )


{ balanta_=initBal; id_=newID(); }

public double balanta() { return balanta_; }


public int id() { return id_; }

public void retragere(double cant) { balanta_ -=cant; }


public void depunere(double cant) { balanta_ +=cant; }

public String toString()


{ return super.toString() + "(id:" + id_ + ", bal:" + balanta_ + ")" ; }

// variabile instanţe
private double balanta_;
private int id_;
46 Noţiuni introductive despre Java - 3

// variabilele şi metodele clasei


public static int nextID_=100;
private static int newID() { return nextID_++; }

// altă metodă "specială" a clasei


public static void main(String args[]) {

ContBancar a=new ContBancar(110000);


ContBancar b=new ContBancar();

System.out.println("a=" + a.toString() );
System.out.println("b=" + b.toString() );

a.retragere(50000);
b.depunere(300000);

System.out.println("a=" + a);
System.out.println("b=" + b);

System.exit(0);
} // fără punct şi virgulă
}

Descrierea secvenţei de program:

În primul rînd se defineşte clasa ContBancar.

public class ContBancar { …


.
.
}

Această clasă poate fi definită public, ceea ce înseamnă că poate fi "exportată" în afara
bibliotecii de clase curente (în care este definită). Numele clasei este ContBancar. Se
observă că în numele clasei pot să apară litere mari, ceea ce conferă claritate numelui.
Definiţia clasei începe cu o acoladă deschisă - { - şi se termină cu o acoladă închisă - }
- la finalul secvenţei prezentate.

În primul rînd se definesc aşa numiţii constructori care reprezintă metodele publice.
Constructorii sînt un tip special de metode avînd acelaşi nume ca şi clasa în care se
3.5. - Elemente de tehnologie Java 47

definesc şi nu returnează nici un fel de tip. În primul constructor se foloseşte cuvîntul


cheie this. Acesta reprezintă obiectul curent.

public ContBancar () { this(0.0) ; }

În cazul de faţă this este urmat de 0.0 în paranteze. În acest mod cu un constructor se
invocă un alt constructor. Constructorul acesta nu are nici un argument şi invocă un
argument de constructor pasîndu-i o valoare implicită.

Java nu are argumente implicite, ca şi C++, deci aceasta este o modalitate de a-i
crea şi această facilitate.

Cel de-al doilea constructor va fi invocat folosind primul constructor:

public ContBancar( double initBal )


{ balanta_=initBal; id_=newID(); }

Acesta are un singur argument, de tip double, care reprezintă valoarea iniţială a
balanţei, iar în corpul funcţiei (între acolade) se atribuie pentru balanta_ aceasta
valoare iniţială. De asemenea, se face şi atribuirea cîmpului de identificare, id_.

În liniile care urmează se definesc metodele de acces la datele din interiorul


obiectului.

public double balanta() { return balanta_; }


public int id() { return id_; }

public void retragere(double cant) { balanta_ -=cant; }


public void depunere(double cant) { balanta_ +=cant; }

Metodele balanta şi id permit accesul la informaţia care se află în variabilele instanţe


balanta_ şi id_. Aceste metode au rolul de a prelua valorile variabilelor şi de a le face
accesibile utilizatorului. Urmează definiţiile metodelor retragere şi depunere. Prin
metoda retragere se pasează un tip double, reprezentînd cantitatea de bani care trebuie
retrasă, iar prin depunere, cea care trebuie depusă. Operatorii -= şi += se folosesc
pentru decrementa, respectiv incrementa balanţa în funcţie de cantitatea de bani
transferată (cant).

Funcţia următoare este una specială şi are ca rezultat conversia unei date într-un obiect
de tip şir de caractere (string) şi se numeşte toString.

public String toString()


48 Noţiuni introductive despre Java - 3

{ return super.toString() + "(id:" + id_ + ", bal:" + balanta_ + ")" ; }

Funcţia toString nu are parametri şi trebuie să returneze o valoare de tip şir de


caractere. Ea face parte dint-o altă clasă Java (clasa Object, superclasă abstractă pentru
toate celelalte tipuri de clase).
return super.toString arată că va fi invocată superclasa toString. Cum superclasa lui
ContBancar este Object (nu s-a specificat altă superclasă, deci implicit este Object)
înseamnă că va fi invocată superclasa Object prin metoda toString şi apoi va
concatena (folosind semnul '+') cu şirul acesta un şir care conţine semnul de
identificare, id şi un altul care conţine balanţa. În final va rezulta un indicator care
specifică obiectul însuşi urmat de aceste două valori. Object va returna numele clasei,
ContBancar, urmat de semnul @ şi de un număr în hexazecimal care reprezintă adresa
obiectului. Astfel se comportă implicit metoda toString din Object. Folosirea lui
super.toString este opţională.

Următoarele două linii din program se referă la două variabile instanţe: balanta_ şi
id_. Prima este de tip double, iar cea de a doua de tip întreg. Double şi int sînt cuvinte
rezervate care reprezintă tipuri. Acestea vor fi prezentate în capitolul următor.
Deocamdată trebuie reţinut că variabilele pot fi reprezentate pe mai mulţi octeţi şi
aceste reprezentări poartă diferite denumiri.

// variabile instanţe
private double balanta_;
private int id_;

Ambele variabile sînt urmate de linia de subliniere (underscore), _, care marchează


faptul că sînt variabile instanţe. Ele sînt definite private, adică sînt încapsulate. În
general este bine ca datele să fie private.

// variabilele şi metodele clasei


public static int nextID_=100;
private static int newID() { return nextID_++; }

Astfel se precizează informaţia statică. Static înseamnă că ceea ce urmează sînt


variabilele şi metodele clasei. Cîmpul nextID_ precizează că sursa comună pentru
identificatorii conturilor bancare va începe de la valoarea 100. Formatul expresiilor de
mai sus implică scrierea modului de acces, public sau protejat (public sau private),
urmat de cuvîntul rezervat static, apoi de tip şi de numele variabilei iniţializată cu o
anumită valoare. În momentul încărcării clasei valoarea variabilei va iniţializată la
100.
3.5. - Elemente de tehnologie Java 49

Acest mod de lucru se deosebeşte de cel în C++ unde există un fişier header şi un
fişier cu cod sursă. În Java totul este într-un fişier, combinîndu-se cele două
structuri, declaraţia şi iniţializarea.

După variabila clasei urmează metoda cu numele newID care este o metodă a clasei şi
face referinţă la variabila clasei. Funcţia ei este de a returna şi incrementa nextID_ .
Aceasta înseamnă că, ori de cîte ori se construieşte o clasă se va începe cu valoarea
100, va continua cu 101, ş.a.m.d.

Piesa de informaţie care urmează în secvenţa de program este necesară pentru a o


putea rula ca o aplicaţie Java.

// altă metodă "specială" a clasei


public static void main(String args[]) { …}

Aceasta este metoda main. Se putea construi o clasă separată care să conţină metoda
main. Atunci cînd se execută aplicaţia utilizînd comenzi Java se face verificarea dacă
există metoda main în interiorul clasei. Dacă metoda main este cu semnătura
corespunzătoare, adică este publică, atunci returnează void şi preia un tablou de şiruri
de caractere (String args[]).

Prima dată, în corpul metodei main se definesc două conturi bancare, ContBancar 'a' şi
ContBancar 'b' şi se creează pentru ele obiectele corespunzătoare.

ContBancar a=new ContBancar(110000);


ContBancar b=new ContBancar();

Primul obiect are un argument cu valoarea 110 000, iar cel de-al doilea nu are nici un
argument. Revenind la codul prezentat anterior se reaminteşte că prima linie, 'a',
specifică un argument şi invocă al doilea constructor menţionat anterior. Cea de-a
doua intrare, 'b', va invoca primul constructor care folosind this(0.0) va invoca cel de-
al doilea constructor, determinînd o cascadă de invocări. Rezultatul sînt două obiecte
care reprezintă conturi bancare, 'a' şi 'b'. 'a' şi 'b' nu sînt ele însele obiecte, ci variabile
care fac referinţă la obiecte.

Odată create cele două obiecte este posibilă tipărirea lor.

System.out.println("a=" + a.toString() );
System.out.println("b=" + b.toString() );

Structura care face posibil acest lucru este System.out.println().


50 Noţiuni introductive despre Java - 3

System este o clasă, out este o variabilă a clasei (un PrintStream) şi println este o
metodă care scrie un şir la consolă. Şirul este argumentul pasat metodei println: "a="
urmat de semnul plus, +, care realizează concatenarea cu a.toString(). Rezultatul
tipăririi va fi: a = cu orice va conţine toString asociat lui ContBancar. Sarcina sa este
aceea de a tipări ceea ce creează super.toString() şi apoi să tipărească valoarea id şi a
balanţei. Cea de a doua linie are acelaşi efect, dar pentru ContBancar 'b'.

Următoarele metode sînt cele de retragere şi depunere pentru conturile 'a' şi 'b'.

a.retragere(50000);
b.depunere(300000);

a.retragere(50000) presupune trimiterea mesajului de retragere a 50 000 lei către


obiectul a. Balanţa obiectului 'a' va fi ajustată în jos cu 50 000 lei. Obiectul 'b' va primi
o depunere de 300 000 lei prin b.depunere(300000). 'b' nu a avut balanţă, iar acum va
avea una de 300 000 lei.

La fel ca şi anterior, se pot tipări rezultatele.

System.out.println("a=" + a);
System.out.println("b=" + b);

Se remarcă faptul că există o convenţie prin care, dacă trebuie convertit ceva în şir de
caractere, metoda toString este invocată implicit, deci nu mai e nevoie să fie
specificată explicit. Acest fapt simplifică codul şi îl face mai uşor de citit. Deci se va
scrie doar "a="+a.

Secvenţa de program se termină cu

System.exit(0);

o ieşire pe un cod zero. System este o clasă generală, intens folosită, iar exit determină
oprirea MVJ şi terminarea programului.

Deci, secvenţa de program prezentată creează două conturi, le tipăreşte conţinutul,


realizează o retragere, o depunere, tipăreşte rezultatele şi se termină.

3.6. Mecanismul execuţiei aplicaţiilor Java. Avantaje

Unul din marile avantaje ale utilizării limbajului Java este portabilitatea, independenţa
sa faţă de platforma pe care se execută. Nu numai sintaxa este importantă în Java. Un
3.5. - Elemente de tehnologie Java 51

concept deosebit în Java este codul octet şi posibilitatea de a rula pe platforme


multiple pentru care a fost creat un interpretor Java. În trecut, cei care dezvoltau
produse software trebuiau să lucreze pe o anumită platformă. Aceasta înseamnă o
anumită structură hardware şi un mediu de dezvoltare fixat. Cu ajutorul limbajului
Java producătorii de software pot genera cod care este executabil pe o gamă largă de
platforme, Java dovedindu-se astfel mult mai flexibil decît limbajele C sau C++. O
aplicaţie scrisă în Java poate fi rulată pe un PC, pe un MacIntosh sau pe un calculator
cu sistem de operare Unix sau pe orice alt sistem existent într-o companie. Aplicaţiile
pot fi vîndute companiilor care folosesc diferite platforme. Producătorii au astfel la
dispoziţie o piaţă lărgită şi ca urmare avantaje economice.
Fig.
3.4.

Mecanismul de încărcare a claselor în Java

Fig. 3.4. prezintă schematic mecanismul de încărcare a codului octet în mediul


platformei pe care va rula un program în Java. Fişierul care conţine codul octet, fişier
care are extensia class (*.class) este preluat de mediul platformei pe care lucrează şi
este încărcat de către un "încărcător de clase" (ClassLoader, o clasă specială care se
ocupă de acţiunile care au loc la încărcarea codului octet). Clasele care sînt încărcate
se află într-o secţiune care este controlată de încărcătorul de clase.

Cînd se încarcă pe o maşină cod Java (de undeva de pe reţea, ţinînd cont că maşina
virtuală poate fi înglobată într-un web browser), acesta este verificat. “Încărcătorul de
clase” este o parte importantă a procesului de încărcare care face şi verificarea codului
octet. Această verificare este cea care asigură securitatea procesului. Şi anume, codul
furnizat de către compilator (sau din orice altă sursă) nu va influenţa negativ
(“corupe”) maşina pe care a fost încărcat. Verificarea codului octet se face la sfîrşitul
compilării pentru a asigura asupra faptului că rezultă un cod corect şi sigur.
Verificarea codului octet este prima acţiune pe care o face încărcătorul de clase.
Acţiunea aceasta de verificare este necesară deoarece utilizarea limbajului Java pe
Internet implică şi transferul (download) unor programe de pe diverse maşini de pe
Internet pe maşina pe care lucrăm.
52 Noţiuni introductive despre Java - 3

MVJ, Java Runtime, se află în legătură cu clasele care au fost încărcate şi foloseşte
fişiere de tip *.dll care sînt special implementate pentru mediul utilizat. Deci, codul
Java este independent de mediul pe care se încarcă. El se execută în cod octet fără să
ţină cont de arhitectura de bază. Dar, fişierele de tip *.dll transferate pentru a
implementa MVJ, Java runtime, trebuie să cunoască arhitectura de bază. Acest proces
este cunoscut sub numele de interpretare. El presupune parcurgerea unor etape
(preluarea codului, decodificarea, execuţia fiecărui cod) care au o anumită durată.
Aceasta înseamnă un timp mai lung de prelucrare decît în cazul limbajelor procedurale
(de ex. C).

Pentru a îmbunătăţi performanţele limbajului Java în sensul precizat anterior, se


utilizează tehnologia JIT (Just In Time) pentru compilare. Un compilator JIT este
invocat atunci cînd codul octet este încărcat în MVJ. Codul octet este independent de
platformă. Compilatorul JIT preia controlul, preia codul octet (care este un cod pseudo
maşină) şi îl converteşte în cod nativ (care este codul maşină pentru platforma
respectivă). Această procedură poate îmbunătăţi performanţele codului Java care
rulează pe o anumită platformă. Se apreciază că rularea codului Java folosind JIT este
de 3-5 ori mai înceată decît atunci cînd se foloseşte cod nativ. Aceasta înseamnă o
îmbunătăţire de 10 ori a performanţelor faţă de cazul folosirii codului octet.

Legat de problema dezvoltării produselor software mai trebuie menţionat un fapt. În


timpul procesului de dezvoltare al unui produs software, echipa care lucrează în C sau
C++ compilează produsul şi îl execută pe un echipament cu o arhitectură particulară
pe care îl au la dispoziţie în compania respectivă. Un utilizator nu are întotdeauna
posibilitatea să modifice arhitectura pentru a fi la fel cu cea pentru care s-a făcut
dezvoltarea produsului. Se pot pierde astfel segmente importante din piaţa de
desfacere a produselor. În schimb, folosind Java, rezultă un cod independent de
platformă care poate fi transferat, spre exemplu de pe Internet, direct pe echipamentul
utilizatorului. Aici el poate fi compilat cu un compilator JIT care verifică arhitectura
echipamentului înainte de compilare şi realizează procesul de compilare în consecinţă,
pentru un Pentium sau 486, etc.
3.5. - Elemente de tehnologie Java 53

REZUMAT

Limbajul Java este un limbaj orientat pe obiecte,


modern, care asigură portabilitate ridicată.

Limbajul Java are următoarele proprietăţi care îl


recomandă:
 simplu
 distribuit
 interpretabil, portabil, independent de
platformă
 robust
 asigură performanţe ridicate
 utilizează fire de execuţie.

Cele trei înţelesuri ale noţiunii Java sînt:


 Limbaj de programare orientat pe obiecte
 Maşină virtuală care poate fi integrată într-un
browser
 Set standardizat de biblioteci de clase care
reprezintă fundamentul pentru crearea
interfeţelor GUI, pentru controlul fluxului de
date în multimedia şi pentru comunicarea în
reţele.

Un program în Java este compilat în codul-octet a


cărui arhitectură ţintă este MVJ. Maşina virtuală
este cuprinsă în alte medii (web browser, sistem de
operare). MVJ utilizează un verificator de cod
atunci cînd citeşte cod-octet; 'Class Loader' se
ocupă de clasele încărcate de pe reţea mărind astfel
54 Noţiuni introductive despre Java - 3

Principalele biblioteci de clase Java sînt orientate


pe:

 Ferestre GUI
 Set complet de clase bazate pe ferestre

standard GUI
 Uşor de utilizat pentru a construi clienţi

GUI

 Imagini şi audio
 Suport pentru crearea de imagini din

.gif, .jpeg, etc.


 Includ interfeţe pentru a suporta filtre de

prelucrare a imaginilor
 Applet-urile pot reda fişiere audio

 Lucrul în reţea
 Suport pentru aducerea fişierelor,
imaginilor, etc. utilizînd URL
 Sistem-suport pentru intrări de flux,
furnizînd acces la serviciile bazate pe
Internet
 Instrumentul virtual în conexiune cu
Internet poate încărca dinamic clasele pe
reţea.
Limbajul Java este un limbaj de programare
orientat pe obiecte, deci lucrează cu obiecte, clase şi
utilizează moştenirea.
3.5. - Elemente de tehnologie Java 55

O clasă poate fi asemănată unui model (sau şablon)


care defineşte un obiect. Clasa defineşte modul în
care
 va arăta (atribute = valori)

 se va comporta (metode = funcţii)

obiectul odată ce a fost instanţiat.


Elementele limbajului Java:
 Orientarea pe obiecte folosind
instanţierea;
 Utilizarea claselor, ca modele care
definesc modul în care apare şi se
comportă un obiect odată ce a fost
instanţiat.
Obiectul în Java:
 în interiorul obiectului se găsesc
 datele

 corpul metodei, care reflectă aspectul de

calcul din metodă (şi imprimă


comportamentul obiectului)
 în afara obiectului este:
 identitatea obiectului (numele variabilei

sau instanţei. Identitatea este legată de


adresa obiectului. Toate obiectele sînt unic
identificate prin adresa lor. Adresa de
memorie este diferită pentru diferite piese
de date.
 interfaţa obiectului aflată într-o anumită
conexiune cu comportamentul său.

Constructorii sînt un tip special de metode avînd


acelaşi nume ca şi clasa în care se definesc şi nu
56 Noţiuni introductive despre Java - 3

Întrebări pentru Capitolul II

Care sînt cele trei înţelesuri fundamentale ale


noţiunii Java?

Ce sînt bibliotecile de clase ale limbajului Java?

Precizaţi cele trei pachete principale ale limbajului


Java.

Descrieţi relaţia care există între obiecte şi clase în


Java.

Pentru Fig. 3.1. indicaţi o nouă metodă potrivită


exemplului dat. Definiţi un nou constructor şi
explicaţi utilitatea folosirii constructorilor.

Care este diferenţa între efectul apariţiei cuvintelor


public, private, protected, înaintea unei variabile
sau metode?

Creaţi un exemplu, referitor la un magazin şi


operaţiunile care au loc, asemănător celui care
descrie contul bancar.

Definiţi noţiunea de portabilitate. Descrieţi


mecanismul încărcării claselor în Java.

Care sînt problemele care apar atunci cînd se


foloseşte cod Java şi cum pot fi minimalizate?
3.5. - Elemente de tehnologie Java 57

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