Sunteți pe pagina 1din 19

CAP 1.

Prezentarea limbajului Java

Reţeaua Internet este locul în care s-a dezlănţuit pt. prima dată mica fiară numită Java. Acum, mii de
programatori, dezvoltatori de Internet, editori de Web şi firme producătoare de software se întrec în a învăţa totul
despre acest instrument de lucru, pt. a revoluţiona reţeaua Internet şi modul de scriere a programelor. Cei care
nu sunt conectaţi la Internet ar putea să se întrebe de ce atâta agitaţie. În definitiv, şi despre C++ s-a spus că va
revoluţiona industria software; dar, aşa cum veţi vedea în curând, diferenţa între C++ şi Java constă în faptul că
Java îşi ţine promisiunile. Java promite să aducă modificări revoluţionare în software şi în Internet; acest capitol
vă va arăta cum.

Pentru dezvoltatorii de Internet, programatorii şi editorii Web, este momentul unei retrospective a evoluţiei
limbajului Java. În cea mai mare parte a anului 1995, Java a fost în stadiul de testare Alfa şi Beta. În tot acest
timp, dezvoltarea programelor Java s-a limitat la mediile Solaris şi Windows NT. În scurt timp, dezvoltarea
programelor Java s-a răspândit cu viteza vântului. în ianuarie 1996, Sun Microsystems a lansat oficial versiunea
Java 1. 0, iar în acest moment, puteţi obţine gratuit seturi de dezvoltare pentru toate sistemele de operare
importante, printre care Solaris, AIX, Windows 95, Windows NT, OS/2 şi Macintosh.

Pentru cei care nu au experienţă în programare, folosirea unui limbaj precum Java poate părea ceva de domeniul
imposibilului, dar nimic nu este mai departe de adevăr. Dacă ştiţi să creaţi documente HTML, SGML sau
VRML, atunci veţi putea crea şi aplicaţii sau documente îmbunătăţite cu ajutorul programelor Java veţi descoperi
că limbajul Java este uşor de invăţat şi de folosit, deoarece elimină sau automatizează multe dintre problemele
limbajelor de programare anterioare.

Ce este Java ?
JavaSoft, o companie din cadrul firmei Sun Microsystems, a lucrat câţiva ani la dezvoltarea unui limbaj puternic
pentru anii ’90 şi pentru mai departe. Java corespunde acestor promisiuni, fiind cel mai robust, mai uşor de
folosit şi mai flexibil limbaj de programare disponibil în acest moment. Java include cele mai bune aspecte ale
limbajelor de programare anterioare, precum C şi C++, permite crearea unor aplicaţii puternice, conţine
componente avansate, cum ar fi posibilităţile de lucru cu informaţiile multimedia, care fac prezentările
multimedia să poată fi create mai uşor ca niciodată, şi elimină toate acele lucruri pe care le-am detestat cu toţii în
C şi C++, precum moştenirea multiplă, supraincărcarea operatorilor şi pointerii.

Lucrul cel mai interesant la Java este faptul că acest limbaj este complet orientat pe obiecte şi neutru din punct
de vedere arhitectural. Promisiunea făcuta la apariţia programării orientate pe obiecte (OOP- Object Oriented
Programming) este posibilitatea se refolosire a codului. Dar, aşa cum vă pot spune programatorii C++ (daca
sunteţi programator C++, probabil ştiţi deja acest lucru), intenţiile bune nu înseamnă mare lucru atunci când este
vorba de refolosirea codului C++. Prin contrast, în Java veţi vedea imediat avantajele refolosirii codului. Nu
mai este nevoie să dezvoltaţi aplicaţii diferite pentru platforme diferite. în Java, puteţi să dezvoltaţi o singură
aplicaţie care să fie folosită imediat pe mai multe platforme. Imaginati-vă nenumăratele ore de muncă pe care le
puteţi economisi dacă dezvoltaţi o singură aplicaţie pentru sistemele Windows, UNIX şi Macintosh.

Luând în considerare faptul că marile firme pot economisi milioane de dolari la un singur proiect folosind
independenţa de platformă a limbajului Java, nu este de mirare că Java a devenit un cuvânt cheie în tehnologiile
software şi Internet. Java a depăşit imaginaţia celor pasionaţi de tehnică. Companii din toate sectoarele de
activitate, de la finanţe la desfacere, examinează modalităţi de folosire a limbajului.
Oamenilor de afaceri din domeniul software şi programatorilor individuali, independenţa de platformă a
limbajului Java le permite dezvoltarea unor aplicaţii puternice pentru sistemele de operare cu care nu au mai
lucrat niciodată. Dacă rulaţi o afacere legată de dezvoltarea software sau de Internet, indiferent dacă această
1
afacere implică o singură persoană sau un conglomerat de firme, veţi putea avea acces la noi clienţi şi la noi pieţe
de desfacere. Într-o epocă în care toată lumea este interesată de profit, o tehnologie care vă permite să vindeţi
mai mult, să produceţi mai mult şi să aveţi acces la o piaţă mai largă (teoretic, la toţi cei care deţin un calculator)
este cu siguranţă ceva ce merită studiat.
în plus, permiţând folosirea mediului de programare convenabil, Java oferă mai multă putere, ceea ce reprezintă
un avantaj pentru cei cu aptitudini tehnice limitate, dar şi pentru experţii în calculatoare. în cazul în care aveţi
experientă de lucru cu un alt limbaj de programare, veţi descoperi că Java este surprinzător de uşor de invăţat.
Dezvoltatorii limbajului Java au proiectat cu mare grijă structura noului limbaj şi nu este intâmplător faptul că
acesta a fost modelat după C şi C++. C este limbajul favorit al celor care scriu programe procedurale. C++ este
limbajul preferat de cei care scriu programe orientate pe obiecte. Elementele pentru utilizare şi dezvoltare din C
şi C++ sunt de câteva ori mai răspândite decât cele din limbajele de programare aflate cel mai aproape în
competiţie şi, de fapt, se poate spune că sunt singurii competitori adevăraţi.
Aşadar, pentru a se asigura că Java este uşor de folosit şi de inţeles, dezvoltatorii au modelat limbajul după C şi
C++. De asemenea, Java împrumută extensii din Objective C. Aceste extensii permit o rezoluţie dinamică a
metodelor. în felul acesta, trecerea de la C, Objective C şi C++ la Java se face foarte uşor.
Orice programator care a avut vreodată probleme cu pointerii sau cu gestionarea memoriei ar trebui să alerge
către Java cu braţele deschise. Java elimină pointerii, administrează automat memoria şi conţine o procedură de
colectare a gunoiului (eliminărea fisurilor de memorie) care rulează în fundal.
în mediile de lucru distribuite, cum ar fi World Wide Web, mecanismele stricte de securitate sunt esenţiale-
firmele conectate la aceste medii de lucru nu pot risca să îşi compromită sistemele proprii. Dezvoltatorii
limbajului de programare Java ştiu acest lucru. Java este cel mai sigur mediu de programare disponibil în acest
mod. Java nu incearcă să rezolve problemele de securitate, ci le elimină, fiind astfel limbajul perfect pentru
programarea în Web.
Pointerii sunt cea mai mare problema de securitate a programelor C şi C++. “Spărgătorii” pot folosi programe
aparent nevinovate, care forţează pointeri în memorie, fură informaţii din sistem şi îl blochează. în Java nu puteţi
să forţati pointeri, pentru simplul motiv că ei nu există. De asemenea, Java elimină şi alte probleme de
securitate. De exemplu, la compilarea şi rularea programelor Java, acestea sunt supuse unei proceduri de
verificare dinamică a codului, care se asigură că nu există secvenţe de cod periculoase. în plus, mediul de
execuţie Java impune reguli stricte pentru rularea programelor lansate de pe calculatoare aflate la distanţă.
Aceste programe nu au acces la reţeaua locală, la fişierele stocate în sistemul local şi nu pot lansa în execuţie
programe locale.

Evoluţia limbajului Java


Ca multe alte apariţii revoluţionare în ştiinţă şi tehnologie, limbajul Java este rezultatul eforturilor concertate ale
unor grupuri de vizionari. Totuşi, ceea ce se poate părea surprinzător – chiar şocant – în privinţa limbajului Java
este faptul că această ingenioasă dezvoltare tehnologică este rezultatul unui proiect care nu a mers perfect de la
inceput. Dacă proiectul care a luat fiinţă cu numele de cod Green în primăvara anuui 1991 ar fi decurs conform
planurilor, domeniul firmei Sun Microsystems ar fi fost produsele electronice comerciale şi lumea ar fi fost astăzi
lipsită de frumuseţea limbajului Java. Pentru a inţelege evoluţia şi noutatea reprezentată de limbajul Java, trebuie
să ne intoarcem la anul 1991.
în 1991, firma Sun Microsystems îşi incepea evoluţia în topul producătorilor de staţii de lucru UNIX. în anul
precedent, compania avusese o cifră de afaceri de 2, 5 miliarde $, faţă de numai 210 milioane $ în anul 1986, şi
ascensiunea firmei părea a fi de nestăvilit.
Notorietatea firmei Sun să datora în mare masură eforturilor de pionierat în domeniul sistemelor deschise, care
permit construirea şi întreţinerea unor medii deschise de calcul în reţea. Multe corporatii au îmbrăţişat ideea
sistemelor deschise, promovate de Sun Microsystems, deoarece costurile de achiziţionare şi de întreţinere ale
sistemelor inchise deveniseră greu de suportat. Sun îşi incepuse ascensiunea, şi conducerea firmei ştia acest
lucru.
Compania a lansat un proces de dezvoltare a noilor tehnologii, cu scopul de a menţine pe termen indelungat
fenomenalul ritm de creştere. Unul dintre domeniile cheie asupra cărora s-a concentrat atenţia firmei a fost piaţa

2
produselor electronice comerciale; proiectul Green s-a născut ca parte a unui proiect mai mare de dezvoltare a
programelor avansate pentru această piaţă. Scopul grupului de lucru Green a fost să introducă firma Sun
Microsystems pe piaţa produselor electronice comerciale. Pentru atingerea acestui scop, inginerii de la Sun
aveau nevoie de microprocesoare care să poată rula pe diferite tipuri de aparate, în special în sisteme inglobate
distribuite în timp real care să fie atât fiabile cât şi portabile.
Elementul cheie al succesului firmei Sun pe această piaţă era posibilitatea de portare a sistemului pe mai multe
platforme. Planul iniţial prevedea dezvoltarea proiectului în C++, dar dezvoltatorii au avut foarte multe
probleme în incercarea de dezvoltare a compilatorului C++. Curând, aceştia şi-au dat seama că, dacă vor să
reuşească, trebuie să incerce o soluţie nouă şi indrazneaţă; ca urmare, James Gosling a inceput să lucreze la
dezvoltarea unui nou limbaj, numit Oak. Mai târziu, noul limbaj avea să fie numit Java, deoarece, ca o ironie a
soartei, Oak nu a putut să fie inregistrat ca marcă.
în final, dezvoltatorii au creeat un dispozitiv de prezentare a rezultatului eforturilor depuse. Deşi folosea o formă
mai veche a limbajului Java, precum şi un sistem de operare şi o interfaţă cu utilizatorul elementare, acest
dispozitiv i-a uimit pe cei din conducerea firmei Sun. Cam în acelaşi timp, grupul Green a fost incorporat sub
numele First Person, nume ce ve fi schimbat ulterior în JavaSoft. A urmat o perioadă mai grea pemtru cei de la
firma JavaSoft. Au pierdut o licitaţie cu firma Time-Warner pentru realizarea unor echipamente pentru
televizune interactivă şi programe TV la cerere. Au pierdut un contract de creare a unui sistem de operare pentru
3DO. Lansarea publică a proiectului a fost anulată şi mulţi au părăsit grupul Green. Acestea se intâmplau la
inceputul anului 1994 şi programatorii firmei Sun au inceput să caute noi domenii de activitate.
în această perioadă a inceput migraţia în masă a celor de la National Center for Supercomputing Applications
( NCSA) către Silicon Valley. Unii dinte ei au infiinţat compania intitulată în prezent Netscape Communications
Corporation. Silicon Valley era locul potrivit pentru idei legate de spaţiul cibernetic şi chestia numită World
Wide Web incepuse să se extindă aşa că nu intâmplător cei din grupul Green s-au orientat către Internet şi Web,
în care au vazut o soluţie a problemelor lor. Mediul multiplatformă distribuit al reţelei Internet era perfect pentru
testarea proiectului.
Restul, aşa cum se spune, este istorie. Patru ani după lansarea proiectului, cei care au perseverat în dezvoltarea
lui au reuşit. Astăzi, Java este subiectul la ordinea zilei din Internet. Mii de editori Web şi de dezvoltatori
Internet vor să afle cum pot să creeze documente Web imbunatăţite cu animaţie şi multimedia. Milioane de
utilizatori Web vor să afle unde pot gasi ultimile pagini Web care conţin programe Java.
Sun Microsystems a reuşit cu succes să ţină pasul cu aceste solicitări. Licenţa pentru tehnologia Java a fost
acordată unor firme precum IBM, Microsoft, Silicon Graphics, Adobe şi Netscape. Limbajul a fost actualizat în
continuu. în conformitate cu idealurile care au facut din Sun Microsystems ceea ce este astăzi, Java şi setul de
dezvoltare Java ( JDK ) sunt oferite gratuit dezvoltatorilor.

Un scurt istoric al reţelei Internet şi al sistemului


Word Wide Web
Privind evoluţia în timp a limbajului Java şi a sistemului WWW, se pare că acestea au urmat un curs de
dezvoltare similar. în definitiv, limbajul Java a fost dezvoltat pentru a fi folosit în medii distribuite şi în sisteme
deschise. WWW este un sistem informaţic deschis, creat pentru a fi folosit în mediul distribuit al reţelei Internet.
Atât Java cât şi WWW au fost proiectate pentru a fi portabile, robuste şi uşor de folosit. De asemenea, Java
asigura rezolvarea unor importante probleme de securitate în Web.
Cum se îmbină aceste elemente şi de ce este Java atât de important pentru dezvoltarea reţelei Internet? Pentru a
inţelege mai bine legătura dintre Java, Internet şi WWW, să aruncăm o privire asupra istoricului reţelei Internet
şi a sistemului WWW.

Inceputurile reţelei Internet

3
Deşi astăzi pare greu de crezut, Internet a fost la inceput un proiect al guvernului SUA. în 1969, 4 calculatoare
aflate la distanţă au fost conectate pentru a dovedi că un astfel de proiect este viabil. Reţeaua formată a fost
numită ARPANET ( Advanced Research Project Agency Network ). Reţeaua ARPANET s-a extins; în 1972
erau conectate 50 de universităţi şi unităţi de cercetare implicate în proiecte militare. La sfârşitul anilor ’80 mai
mult de 80. 000 de calculatoare erau conectate într-o serie de reţele. în final, suma acestor reţele a devenit ceea
ce se numeşte Internet.
Din 1969 până în 1991, reţeaua Internet a fost, în linii mari, un domeniu privat – rezervat cercetatorilor,
invăţamantului şi armatei. Deşi firmele comerciale se puteau conecta la Internet, politica reţelei interzicea
conducerea afacerilor prin intermediul acesteia. Situaţia s-a schimbat în 1991, când interdicţia privind activităţile
comerciale a fost ridicată. Aceasta s-a intâmplat în primul rând datorită formării unei reţele paralele care
permitea separarea fluxului de informaţii comerciale de cel al informaţiilor necomerciale. în acest mod, a apărut
posibilitatea conducerii unor activitati comerciale fără folosirea zonelor rezervate cercetarii şi educaţiei.
Din acel moment, Creşterea reţelei Internet s-a facut intr-un ritm accelerat. Astăzi, la Internet ca reţea globală,
sunt conectate mai multe milioane de calculatoare şi peste 50 de milioane de utilizatori.

Inceputurile sistemului Web


Privind inapoi, este greu de crezut că sistemul Web nu are decât câţiva ani vechime. Dezvoltarea sistemului
WWW a inceput în 1989 la laboratorul european pentru fizica particulelor (European Laboratory for Particle
Physics – CERN). Web este creaţia lui Tim Berners-Lee, care a propus acest sistem ca o modalitate de
colaborare a fizicienilor din întreaga lume prin intermediul informaţiilor stocate în reţea ca documente hipertext.
Structura documentelor hipertext a fost definită cu ajutorul unui nou limbaj, numit HTML ( Hipertext Markup
Language). Tim Berners-Lee a creeat acest limbaj ca subset al limbajului SGML (Standard Generalized Markup
Language). Pentru transferarea documentelor HTML la distanţă, oriunde în lume, a fost creeat un nou protocol
de transfer. Acest protocol, numit HTTP (Hypertext Transfer Protocol), oferă mijloace rapide pentru căutarea,
preluarea şi afişarea documentelor.
Hipertextul vă permite să navigaţi prin resursele de reţea prin simpla apăsare a unor butoane. Folosind o
aplicaţie client numita browser, puteţi să selectaţi anumite cuvinte cheie evidenţiate sau anumite zone dintr-un
document pentru a vă deplasa rapid la un alt document. Primul browser era un program în mod text, cu
posibilităti limitate, din care cauză nu a avut un succes imediat în cadrul comunitaţii Internet.
De fapt, la inceputul anului 1993 nu existau mai mult de 50 de puncte de reţea (site-uri) web în întreaga lume.
Comparând acest număr cu miile de site-uri Web disponibile astăzi, se poate spune că sistemul Web a apărut
peste noapte. în prezent, există aproximativ 100. 000 de site-uri Web. Catalizatorul acestei creşteri exponenţiale
a fost un browser numit Mosaic. Acest browser, dezvoltat de NCSA, a permis utilizatorilor să exploateze
posibilităţile grafice ale sistemului Web şi a corespuns asteptărilor. Astăzi, sistemul Web este segmentul cu cea
mai rapidă creştere din Internet, iar Mosaic, browserul aflat în originea acestei dezvoltari, este doar unul dintre
zecile de browsere disponibile.
Succesul browserului Mosaic a fost elementul care a declanşat, în 1994, migraţia dezvoltatorilor de la NCSA
către Silicon Valley. O parte dintre ei au format o companie cunoscută astăzi sub numele Netscape
Communications Co. Primul browser scos pe piaţa de Netscape, Netscape Navigator, accepta multe dintre
extensiile propuse pentru standardul HTML. Noile componente ale browserului au adus sistemul Web cu un pas
mai aproape de interactivitatea completa multimedia şi au ajutat firma Netscape să declanşeze o noua perioada de
creştere explozivă a sistemului Web.
1995 a fost anul multor inceputuri în Web. Microsoft a introdus primele secvenţe video şi primele documente
care conţineau sunete. Netscape a lansat o nouă versiune a browserului Navigator, care accepta cadrele(frames),
adaugirile(plug-ins) şi multe alte caracteristici speciale. Gavin Bell, Athony Parisi, Mark Pesce şi altii au pus la
punct specificaţiile 1. 0 finale ale limbajului de modelare a realităţii virtuale ( VRML-Virtual Reality Modelling
Language ), iar Sun Microsystems au oferit lumii, pe o tavă de argint, limbajul Java.
în Java, dezvoltatorii Internet şi editorii Web au găsit, în sfârşit, posibilitatea de a crea prezentări multimedia
complet interactive pentru Web. Acest pas important în evoluţia sistemului Web a fost salutat cu surle şi
trâmbiţe de comunitatea Internet şi constituie inceputul unei alte perioade de expansiune în dezvoltarea Web.

4
Elementele de baza ale limbajelor de programare
Dacă aţi vazut limbajul Java în acţiune, probabil că nu mai aveţi dubii privind importanţa să în dezvoltarea
sistemului Web. Java este la fel de important şi pentru industria software. Acest limbaj de programare are multe
caracteristici care îl fac unic, puternic şi flexibil. De exemplu, majoritatea limbajelor de programare sunt fie
compilate, fie interpretate. Java poate fi folosit în ambele moduri, ceea ce îi conferă flexibilitate. Pentru a
inţelege cum pot fi programele Java compilate şi interpretate, să aruncăm o privire asupra elementelor de bază
ale limbajelor de programare interpretate sau compilate.

Limbaje de programare interpretate.


Deşi există un număr mic de limbaje de programare interpretate, acestea sunt, în general, cel mai uşor de invăţat
şi de folosit. Unul dintre limbajele de programare interpretate cunoscute de foarte multă lume, chiar şi de
nespecialişti, este limbajul Basic. Numele său indică faptul că este rudimentar şi în acelaşi timp, uşor de folosit.
Programele Basic sunt create pe baza unei structuri simple, caracteristică limbajelor de nivel inalt. După ce
terminaţi de scris un program Basic, acesta poate fi rulat imediat. Interpretorul Basic citeşte instrucţiunile
codului linie cu linie şi le transformă în seturi de instrucţiuni care pot fi inţelese de calculator. Deoarece
transformarea are loc în timpul rulării, programele interpretate rulează, în general, mai incet decât alte programe
şi folosesc mai mult din timpul de lucru al procesorului.

Limbaje de programare compilate.


Limbajele de programare compilate sunt, în general, mai greu de invăţat şi de folosit decât limbajele de
programare interpretate. Totuşi, majoritatea limbajelor de programare sunt compilate. Prîntre cele mai
cunoscute limbaje de programare compilate se numără COBOL, FORTRAN, C, C++ şi Pascal.
Programele scrise intr-un limbaj de programare compilat sunt create pe baza unei structuri caracteristice
limbjelor de nivel inalt. După ce terminati de scris codul sursă al unui program, folosiţi un compilator pentru a-l
tranforma în cod care poate fi citit şi executat de calculator. în timpul executării programului, calculatorul poate
să interpreteze direct instrucţiunile. Deoarece nu mai este nevoie ca liniile de cod să fie transformate în timpul
rulării, programele compilate sunt executate mai repede decât programele interpretate.
Creşterea vitezei de execuţie are loc insă în dauna portabilităţii. Codul sursă este compilat intr-un format de
nivel scăzut, care poate fi rulat numai pe platfoma pentru care a fost compilat. Deci codurile compilate nu sunt
direct portabile pe alte platforme.

Java : un limbaj compilat şi interpretat


Aşa cum am aratat mai devreme, programele Java pot fi atât compilate, cât şi interpretate. Ele sunt create pe
baza unei structuri simple, caracteristică limbajelor de nivel inalt. După ce terminaţi de scris un program,
compilaţi codul sursă intr-un format de nivel mediu, numit cod de octeţi. Puteţi apoi să rulaţi acest cod de octeţi,
care este interpretat de mediul de execuţie Java.
Codul de octeţi este diferit de codul maşină. Codul maşină este reprezentat prîntr-o succesiune de 0 şi 1.
Codurile de octeţi sunt seturi de instrucţiuni care seamană mai mult cu codul scris în limbaj de asamblare.
Calculatorul poate executa direct codul maşină, insă codurile de octeţi trebuie interpretate inainte de a fi rulate.
Diferenţa dintre codul de octeţi şi codul maşină este mult mai profundă decât pare la prima vedere. Codul
maşină poate fi folosit numai pe platforma pentru care a fost compilat. în schimb, codul de octeţi poate fi rulat
pe orice platformă care foloseşte mediul de execuţie Java. Această posibilitate asigură neutralitatea limbajului
Java din punct de vedere arhitectural.
Interpretorul Java transformă codul de octeţi intr-un set de instrucţiuni pe care calculatorul le poate inţelege.
Deoarece codul de octeţi este o formă intermediară, intârzierea necesară pentru transformarea intr-un cod care
5
poate fi inţeles de calculator este foarte mică. Dacă sunteti familiarizat cu modul de folosire al limbajelor de
nivel intermediar, precum assembler, veţi inţelege adevarata frumuseţe a limbajului Java. Acesta vă permite
compilarea codului sursă într-o formă intermediară, independentă de calculator, care poate fi executată aproape
la fel de repede ca şi un program complet compilat.
Dacă vă întrebaţi în ce mod este obţinută neutralitatea arhitecturală a limbajului Java, nu sunteti singurul; toate
compilatoarele, inclusiv compilatorul Java compilează codul sursa pentru un anumit calculator. Trucul folosit
pentru crearea codului de octeţi este compilarea codului sursă pentru un calculator inexistent. Acest calculator
imaginar este numit Maşina Virtuală Java ( Java Virtual Machine ) şi există doar în nanospaţiu sau în memoria
calculatorului dvs. Deşi crearea unei maşini virtuale în memoria sistemului pe care lucraţi pare un lucru uimitor,
Java constituie dovada vie a faptului că acest concept este nu numai posibil, ci şi foarte puternic.
“Păcălirea” compilatorului Java, astfel incât acesta să creeze coduri de octeţi pentru o masină inexistentă, este
numai jumatate din procesul ingenios care asigură neutralitatea arhitecturală a limbajului Java. La rândul său,
interpretorul Java trebuie să convingă fişierul care conţine codul de octeţi şi calculatorul că rulează pe o masină
virtuală Java. Interpretorul realizează acest lucru actionând ca un intermediar între maşina virtuală Java şi
maşina reală pe care este rulat programul.
Figura de mai jos ilustrează modul real de lucru al limbajului Java pe un calculator obişnuit. După cum se poate
vedea, maşina virtuală Java ocupa un nivel intermediar între sistemul de operare de pe calculatorul dvs. şi cadrul
de dezvoltare Java. Deasupra cadrului de dezvoltare Java este situată aplicaţia scrisă de utilizator în limbaj Java.
( a se vedea capitolul 24 “Maşina Virtuală Java” pentru mai multe detalii )

Aplicaţia utilizatorului

Nivelurile de Obiecte Java


interactine ale
unui program Java Maşina virtuală Java

UNIX Windows OS/2 MacIntosh

Sisteme de operare

Evoluţia logică de la C la C++


Limbajul de programare C a captat atenţia utilizatorilor incă de la apariţie, la inceputul anilor ’70. Popularitatea
limbajului C se bazează, în mare, pe relativa uşurinţă de utilizare, prezentarea prietenoasă şi caracteristicile
avansate, care la apariţia limbajului au trezit atât interesul programatorilor, cât şi al celorlalţi utilizatori. Ţinând
seama de faptul că principalii competitori ai limbajului C din acel moment erau limbaje demodate şi greu de
folosit precum COBOL şi FORTRAN, care erau rulate, de obicei, pe sisteme mainframe, nu este de mirare că
limbajul C a fost considerat prietenos şi că a atras rapid un mare număr de susţinători.
Programatorii de astăzi nu ar considera, probabil, limbajul C ca fiind cel mai prietenos şi mai avansat limbaj de
programare disponibil. Aceasta deoarece chiar şi cei mai experimentaţi programatori au uneori probleme la
folosirea caracteristicilor avansate ale limbajului C. Dacă aţi lucrat în C şi aţi avt vreodată probleme cu pointerii
sau cu gestionarea memoriei, ştiţi, desigur, despre ce vorbim. Pointerii şi gestionarea memoriei sunt concepte
dificile atât pentru incepători, cât şi pentru programatorii experimentaţi. O singură linie de cod care adresează o
locaţie greşită de memorie poate cauza blocarea aplicaţiei şi chiar a calculatorului pe care rulează aceasta.
La inceputul anilor ’80, calculatoarele personale incepuseră să patrundă pe piaţă. Pentru a ţine pasul cu evoluţia
industriei calculatoarelor personale, firmele producătoare de software dezvoltau rapid programe. Principalele
obstacole în calea lansării pe piaţă a unor noi aplicaţii erau timpul de dezvoltare şi costurile legate de lungimea
ciclului de dezvoltare. Pentru reducerea costurilor şi a timpului de dezvoltare, programatorii au inceput să caute
posibilităţi de refolosire a codului existent în proiectele viitoare.
Deci puteţi să luaţi secvenţe de cod C dintr-un proiect şi să le folosiţi în alte proiecte, reutilizarea codului C este
dificilă şi nu este intotdeauna posibilă. Pentru a fi refolosită cu succes, secvenţa de cod respectivă trebuie să

6
respecte unele reguli privind o anumită funcţie sau un anumit set de funcţii, cum ar fi operaţiile de intrare/ieşire
în fişiere sau de afişare pe ecran. De asemenea, secţiunea de cod trebuie să fie generalizată şi să nu determine
conflicte de atribuire. De cele mai multe ori, în funcţie de complexitatea şi de tipul noului proiect pe care vreţi
să-l creaţi în C, este mai bine să luaţi totul de la 0. Cauza principală este faptul că rezolvarea conflictelor
generate de codul pe care incercati să-l refolosiţi poate să vă ia mai mult timp decât crearea codului.
O echipă de la AT&T Bell Labs a pus la punct o posibilă soluţie pentru refolosirea codului. Această soluţie a
fost numită C++. C++ este o extensie a limbajului C, care permite crearea obiectelor. Obiectele sunt module de
cod definite separat, folosite pentru executarea unor funcţii specifice. Cel care a avut ideea dezvoltării acestei
extensii a limbajului C, permiţând separarea unor funcţii dîntr-o aplicaţie în module obiect generalizate şi
refolosibile, a fost Bjarne Stroustrup. La un deceniu de la apariţia limbajului C++, putem afirma că acesta a
constituit o evoluţie logică a limbajului C, destinată acoperirii unor cerinţe ale programatorilor, este motivul
pentru care C++ a devenit cel mai raspândit limbaj de programare.

Marele salt de la C / C++ la Java


Deşi C++ este fără indoială, un limbaj de programare popular şi puternic, el are şi defecte. Acestea provin din
moştenirile pe care C++ le păstreaza din C. Ca şi în C aspectele cele mai greoaie ale limbajului C++ sunt legate
de pointeri şi de gestionarea memoriei. în plus, deoarece C++ este o extensie a limbajului C, programatorii C++
pot cadea în greseala pogramării procedurale, cu care sunt obişnuiţi din alte limbaje, precum C. Dacă scrieti o
aplicaţie C++ folosind metodele programării procedurale, pierdeţi toate avantajele oferite de un limbaj orientat
pe obiecte. Acesta este punctul la care îşi face apariţia limbajul Java.
Limbajul Java este pentru programarea anilor ’90 ceea ce C++ a fost pentru programarea anilor ’80 – un mare
salt inainte. Ca şi C++, Java este următorul pas logic în domeniul limbajelor de programare şi se bazează pe cel
mai popular limbaj de programare al momentului. Cu ajutorul limbajului Java, puteţi obţine programe cu
aspectul şi comportarea programelor C++, dar beneficiind de avantajele oferite de un limbaj proiectat special
pentru programarea orientată pe obiecte. Spre deosebire de C++, Java renunţă complet la programarea
procedurală şi vă obligă să utilizaţi conceptele solide ale programării orientate pe obiecte.
Limbajul Java cuprinde componente care verifică automat respectarea limitelor ( Boundary Checking ),
ceea ce elimină multe dintre problemele programelor C şi C++. în Java nu exista pointeri, iar gestionarea
memoriei se face automat. Avantajul evident al acestui fapt este eliminărea problemelor legate de pointeri şi a
fisurilor de memorie ( memory leaks). Nu mai exista posibilitatea indicarii greşite a unei zone de memorie care
să cauzeze blocarea programului. Sunt excluse erorile apărute la eliberarea memoriei folosite, care să determine
apariţia unor fisuri de memorie si, în final, ocuparea întregii memorii a sistemului.
Java are multe alte caracteristici care fac ca programarea în acest limbaj să constituie un adevărat refugiu pentru
programatorii care s-au săturat de dificultăţile asociate cu dezvoltarea în C++. în Java, matricele sunt încapsulate
într-o structură de clase, ceea ce facilitează verificarea limitelor. De asemenea, Java execută automat operaţiile
de recuperare a memoriei ( “colectarea gunoiului”), o alta caracteristică utilă pentru gstionarea memoriei.
Procedura de “colectare a gunoiului” este, în acelaşi timp, un bun exemplu pentru posibilităţile integrate de
execuţie multifilară ale limbajului Java. Prin rularea în fundal a unor programe care elibereazaă memoria şi
asigură funcţii generale de curăţenie a sistemului, programele Java se execută mai repede şi mai eficient.

Java şi conceptele programării orientate pe obiecte


Multi programatori incepatori şi chiar unii experimentaţi care folosesc limbaje de programare procedurale au
dificultati în inţelegerea conceptelor programării orientate pe obiecte, deoarece acestea sunt destul de abstracte şi
sunt proiectate pornind de la o altă filosofie decât limbajele de programate procedurale tradiţionale. Conceptele
programării orientate pe obiecte cuprind:
• obiectele
• încapsularea şi transmiterea de mesaje
• clasele
• bibliotecile ( numite pachete, în Java )
7
• moştenirea
• modificatorii de acces

Obiectele
Unitatea elementară a programelor orientate pe obiecte este obiectul. Limbajele care respectă conceptele
programării orientate pe obiecte descriu relaţiile dintre acestea. Toate obiectele au o stare şi un comportament.
Starea unui obiect se referă la elementele de date conţinute de obiect şi la valorile asociate acestora. Tot ceea ce
cunoaşte obiectul despre aceste elemente şi despre valorile lor formează starea obiectului. Elementele de date
asociate obiectelor se numesc variabile de instanţă.
Comportamentul unui obiect depinde de acţiunile pe care obiectul poate să le execute asupra variabilelor de
instanţă definite în cadrul său. în programarea procedurală, o astfel de construcţie se numeste funcţie. în
terminologia specifică programării orientate pe obiecte, aceasta construcţie să numeste metodă. O metodă
aparţine clasei a cărei membră este; folosiţi metodele atunci când trebuie să executaţi o anumită operaţie de mai
multe ori.
Astfel, starea unui obiect depinde de lucrurile pe care le cunoaşte obiectul, iar comportamentul lui depinde de
acţiunile pe care le poate executa. în cazul în care creaţi un obiect software care reprezintă modelul unui
televizor, obiectul va avea variabile care descriu starea curentă a televizorului, cum ar fi o variabilă care specifică
dacă televizorul este pornit, precum şi alte variabile care stochează canalul selectat, nivelul de volum şi faptul că
telecomanda nu transmite nimic pentru moment. De asemenea, obiectul va poseda metode care descriu acţiunile
permise, cum ar fi pornirea şi oprirea televizorului, schimbarea canalului, modificarea volumului şi acceptarea
comenzilor de la telecomanda

Sugestie: dacă nu reusiţi să inţelegeţi ce înseamnă un obiect, gândiţi-vă la acesta ca la o secvenţă de cod care
execută un set de acţiuni specifice şi înrudite, numite metode.

Încapsularea şi transmiterea de mesaje


Obiectele încapsulează varibile de instanţă şi metode înrudite într-o singură unitate identificabilă. Ca urmare,
obiectele sunt uşor de refolosit, de actualizat şi de întretinut. Puteţi să realizati rapid urmatoarele:
- să identificaţi intrările necesare unui obiect şi ieşirile acestuia
- să descoperiţi dependenţele variabilelor
- să izolaţi efectele unor modificări
- să faceţi actualizările necesare
- să creaţi subclase bazate pe obiectul original

Obiectele sunt dinamice, în măsura în care dvs le creaţi astfel. Un obiect poate apela una sau mai multe metode
pentru executarea unei operatiuni. Metodele sunt iniţiate prin transmiterea unui mesaj către obiectul respectiv.
Un mesaj trebuie să conţină numele obiectului către care este transmis, numele metodelor care urmează să fie
apelate şi valorile necesare metodelor respective. Obiectul care recepţionează mesajul foloseşte informaţiile
primite pentru a apela metodele corespunzatoare cu valorile specificate.
Avantajul încapsularii variabilelor de instanţă şi a metodelor constă în faptul că puteţi trimite mesaje unui obiect,
fără să cunoaşteti modul de lucru al obiectului respectiv. Tot ceea ce trebuie să ştiţi este tipul valorilor acceptate
de o anumită metodă. Ca urmare, obiectul care modelează televizorul poate fi extrem de complex dar dvs sau
utilizatorul final trb să ştiţi doar pe ce buton al telecomenzii să apasati. Apasarea unui buton de telecomanda
trimite un mesaj la obiectul software care reprezintă televizorul, specificând metoda care trebuie apelată şi
valorile care trebuie metodei respective.

8
Clasele
Clasele încapsulează obiecte. O singură clasă poate fi folosită pentru instanţierea mai multor obiecte. Aceasta
înseamnă că puteţi avea mai multe obiecte active sau mai multe instanţe ale aceleiaşi clase.
Obiectul care descrie funcţiile unui televizor este o instanţă a unei clase numită television.
Retineti faptul că fiecare obiect al unei clase are propria stare şi propriul comportament. Prin încapsularea
obiectelor într-o structură de clasă, puteţi să grupati seturi de obiecte după tipul lor. In interfaţa Java de
programare a aplicaţiilor sunt descrise mai multe clase. Fiecare clasă din interfaţa API specifică un set de obiecte
care realizează funcţii înrudite şi au caracteristici comune. Clasele pe care le creaţi pot servi unor scopuri
asemănătoare.
SUGESTIE:Imaginaţi-vă o clasă ca pe o unitate de cod care ţine un set de module de cod specifice şi, in general,
înrudite, numite obiecte.

Bibliotecile
In C++ şi în alte limbaje de programare o colecţie de clase sau de funcţii înrudite formează o bibliotecă. Java
pune o amprentă proprie asupra bibliotecilor, folosind termenul de pachet pentru descrierea unei colecţii de clase
înrudite. Asa cum clasele încapsulează obiecte , pachetele încapsulează clase. In secţiunea “Modificatorii de
acces “ veţi vedea că acest nivel suplimentar de încapsulare face mai uşor de controlat accesul la metode.

Moştenirea
Moştenirea este o caracteristică puternică a limbajelor de programare orientate pe obiecte, care vă permite să
refolosiţi codul şi să extindeţi funcţionarea claselor existente. In cazul în care creaţi o clasă pentru trasarea pe
ecran a unui dreptunghi umbrit, puteţi să extindeţi clasa astfel incât să mute dreptunghiul desenat într-o altă
poziţie pe ecran, fără să rescrieti clasa originală. De asemenea, puteţi să extindeţi clasa folosită iniţial pentru
desenarea dreptunghiului , astfel incât să creeze un set de dreptunghiuri care pot fi selectate de utilizator. In
ambele cazuri , noua clasa moşteneste metodele clasei originale pentru crearea dreptunghiului umbrit şi extinde
metode pentru efectuarea unor operaţii specifice.
Folosind acest aspect al programării orientate pe obiecte , puteţi să creaţi o nouă clasă care moşteneşte
funcţionarea unei clase extinse . Puteţi apoi să extindeţi funcţiile vechii clase , astfel incât să corespundă
necesităţilor curente. Clasa television poate avea subclase pentru televizoarele alb-negru , pentru televizoarele
color sau pentru televizoare de dimensiuni mari. Noua subclasă television nu este limitată de variabile de instanţă
sau de metodele clasei superioare (superclasa):ea poate include variabile de instanţă şi metode care nu sunt
definite în superclasă. De asemenea, noua subclasă poate redefini metodele moştenite.

Modificatorii de acces
În programarea orientată pe obiecte, accesul la metodele şi variabilele obiectelor este controlat prin intermediul
modificatorilor de acces. Limbajul de programare Java defineşte patru niveluri de control al accesului:
• Metode şi variabile private
• Metode şi variabile protejate
• Metode şi variabile prietenoase
• Metode şi variabile publice

Metode şi variabile private


Metodele şi variabilele controlate de obiectul cărora le sunt asociate şi care nu sunt accesibile obiectele altor
clase se numesc private. Avantajul acestui nivel de control este faptul că nu se permite accesul nelimitat la
metode şi variabile decât obiectelor unei anumite clase. Metodele şi variabilele private din Java sunt accesibile
numai obiectelor care aparţin aceleiaşi clase .

9
Metode şi variabile protejate
Metodele şi variabilele controlate de obiectul cărora le sunt asociate şi care nu sunt accesibile decât obiectelor
din clasa respectivă sau din subclasele clasei respective se numesc protejate. Avantajul acestui nivel de control
este că nu se permite accesul nelimitat la metode şi variabile decât obiectelor unor anumite clase. Metodele şi
variabilele protejate din Java sunt accesibile numai obiectelor care aparţin aceleiaşi clase sau subclaselor clasei
respective.

Metode şi variabile prietenoase


Metodele şi variabilele accesibile, în majoritatea situatiilor, si altor obiecte, se numesc prietenoase. In mod
prestabilit, metodele şi variabilele declarate în Java sunt prietenoase, accesibile tuturor claselor şi obiectelor din
acelaşi pachet. Avantajul acestui nivel de control este că obiectele dintr-un anumit pachet (aceste obiecte fiind,
în general, înrudite) au acces nelimitat între ele.

Metode şi variabile publice


Metodele şi variabilele accesibile tuturor obiectelor se numesc publice. La metodele şi variabilele publice Java au
acces toate obiectele şi clasele, chiar dacă nu fac parte din acelaşi pachet
Asadar, accesul la metodele şi variabilele publice este nelimitat.

Principiul lui Peter: înţelegerea diferitelor niveluri de acces este simplă dacă luaţi în
considerare domeniul:

• Private-accesibile obiectelor din aceeaşi clasă


• Protejate-accesibile obiectelor din aceeaşi clasă şi din subclasele clasei respective
• Prietenoase-nivelul de acces prestabilit; accesibile tuturor claselor din pachetul curent
• Publice-accesibile tuturor claselor din orice pachet

Programarea în limbajul Java


Java ocupă primul loc în lista limbajelor de programare orientate pe obiecte. Mulţi programatori sunt surprinşi
atunci când descoperă cât de uşor este să respecte conceptele proiectării orientate pe obiecte în Java.
Următoarele secţiuni vă vor ajuta să înţelegeţi ce vă oferă limbajul Java.
Caracteristicile de baza în limbajul Java
Usurinţa cu care puteţi face trecerea de la C/C++ la Java şi caracteristicile de orientare pe obiecte ale limbajului
Java sunt doar partea vizibilă a aisbergului. Java are multe caracteristici puternice unele dintre acestea fiind
discutate în secţiunile acestui capitol. Limbajul Java este:
cu execuţie multifilară
dinamic
distribuit
interpretat şi compilat
neutru din punct de vedere arhitectural
orientat pe obiecte
portabil
pregătit şi compatibil cu operarea în reţea
robust
sigur

10
Aceste caracteristici constituie forţa limbajului Java şi motivul popularităţii acestuia. Pe masură ce veţi dezvolta
programe Java, veţi descoperi că multe dintre acestea sunt înrudite şi rezulta din dezvoltarea limbajului pentru:
* Folosirea în medii de reţea distribuite
* Asigurarea performanţei ridicate
* Refolosirea codului
* Asigurarea securitatii

Proiectare pentru folosire în medii de reţea distribuite


Un element care contribuie la succesul unui limbaj proietat pentru un mediu complex, aşa cum este reţeaua
Internet, este posibilitatea acestui limbaj de a rula pe platforme eterogene distribuite. Java are această
posibilitate, deoarece:
• Este neutru din punct de vedere arhitectural, ceea ce înseamnă că programele executabile Java pot fi rulate pe
orice platformă care are instalat mediul de execuţie Java.
• Are un grad ridicat de portabilitate ceea ce înseamnă că Java conţine componente care pot fi uşor folosite pe
platforme eterogene. Pentru menţinerea portabilitatii, Java respectă standardele IEEE(Institute of Electrical and
Electronics Engineers) pentru structurile de date, cum ar fi cele privind folosirea numerelor întregi, a celor în
virgulă mobilă şi a şirurilor de caractere .
• Este distribuit, ceea ce înseamnă că poate folosi atât obiecte memorate local, cât şi obiecte stocate pe
calculatoare aflate la distanţă.
• Este pregătit pentru folosirea în reţea şi compatibil cu mediile de lucru în reţea, ceea ce înseamnă că poate fi
utilizat în reţele complexe şi că acceptă direct protocoalele de reţea obişnuite, cum ar fi FTP şi HTTP.

Proiectare pentru asigurarea performantei ridicate


Un alt element care contribuie la succesul unui limbaj proiecat pentru un mediu de reţea complex este
performanţa. Java are multe caracteristici care îi asigură o performanţă ridicată, printre care compilatorul şi
sistemul de execuţie. Interpretorul Java poate executa codul de octeţi la o viteză apropiată de cea a execuţiei unui
cod compilat într-un format pentru calculator, datorită execuţiei mulifilare.
Spre deosebire de multe alte limbaje de programare Java are încorporate posibilitati de execuţie mulifilară.
Executia multifilară reprezintă posibilitatea de rulare simultana a mai multor procese. Astfel interpretorul Java
poate să ruleze în fundal alte procese, cum ar fi cele pentru “colectarea gunoiului” (recuperarea memoriei care nu
mai este folosită) sau pentru gestionarea memoriei. Procesele rulate în fundal profită de perioadele în care
unitatea centrală de prelucrare nu este ocupată. În lumea reală multe lucrări se petrec simultan: sună soneria de la
usă, sună şi telefonul iar copiii alearga tipînd prin bucatarie. Nu puteţi să raspundeţi la telefon, să deschideţi usa
şi să-l prindeţi pe Johny în acelaşi timp. Asa că îl prindeţi pe Johny cu o mână ridicaţi receptorul cu cealaltă şi îi
spuneţi persoanei de la uşă să aştepte puţin. Pentru a efectua toate cele trei operaţii stabiliţi nişte priorităti.
Prioritatea numărul unu este John. Apelul telefonic pe care l-aţi aşteptat toată după amiaza este prioritatea
numărul doi. Poştaşul care a venit cu scrisorile este prioritatea numărul trei. Programele cu execuţie multifilară
folosesc acelaşi sistem de stabilire a priorităţilor. Atunci când calculatorul asteaptă ca utilizatorul să introducă
informaţii, procesele de fundal se pot ocupa cu curaţirea memoriei. Când procesorul face o pauza după
prelucrarea unor numere, un proces de fundal poate profita de câteva cicluri de ceas pentru a pregati o zonă de
memorie în vederea folosirii. Posibilitatea de rulare a unor procese de fundal în timp ce procesul din prim plan
aşteapta preluarea unor informaţii de la utilizator sau este în repaos este esenţială pentru asigurarea unor
performanţe ridicate.

11
Proiectare pentru refolosirea codului
Deşi proiectarea orientată pe obiecte a limbajului Java este elementul cheie care face posibilă refolosirea codului,
proiectanţii acestui limbaj stiau că mediul reţelelor este într-o schimbare rapidă şi permanentă. Ca urmare pentru
a se asigura că dezvoltatorii Java vor putea refolosi codul existent, chiar daca mediul se schimbă, Java a fost
proiectat ca un limbaj dinamic şi robust.
Aceste obiective se realizează prin întârzierea lărgirii obiectelor prin legarea dinamică a claselor în timpul
execuţiei, ceea ce împiedică apariţia erorilor în cazul modificării mediului de lucru după compilarea programului
sursă. O altă cale de evitare a erorilor este verificarea structurilor de date atât la compilare, cât şi în timpul
execuţiei.
Între robusteţe şi fiabilitate există o strânsă legatură. Pentru ca Java să fie un limbaj robust trebuie să fie în
acelaşi timp şi fiabil. Asa cum am arătat mai devreme, principalele probleme în programele CC++ sunt pointerii
şi gestionarea memoriei. Ca urmare robustetea şi fiabilitatea sunt asigurate prin eliminarea pointerilor, prin
folosirea verificării dinamice a limitelor, ceea ce elimină posibilitatea violării acestora şi prin gestionarea
automată a memoriei, înlaturîndu-se astfel posibilitatea apariţiei fisurilor şi a violarilor de memorie.

Proiectarea pentru asigurarea securitatii


In mediile de reţea distribuite, caracteristicile de securitate sunt esentiale, mai ales într-o lume informatizată în
care abundă viruşii, caii troieni şi viermii. Multe dintre caracteristicile limbajului Java asigură o securitate de
nivel inalt. De exemplu, programatorii cu intenţii rele nu au acces la stiva sistemului, la zona liberă de memorie
şi la secţiunile protejate de memorie, deoarece Java nu foloseşte pointeri, iar memoria este alocată numai în
timpul execuţiei. In acest fel, accesul la resursele protejate ale sistemului este împiedicat.
De asemenea Java asigură securitatea sistemului în timpul execuţiei prin verificarea codului de octeţi de cate
interpretor. Înainte de executarea unui program interpretorul Java efectuiază o examinare a codului, pentru a se
asigura că acesta reprezintă un cod valid de octeţi. Java verifică validitatea codului folosind o schemă care
semnalizează urmatoarele:
* Violările de acces
* Forţarea pointerilor
* Conversiile ilegale de date
* Valori şi parametri incoreţi
* Modificarea claselor sau folosirea incorectă a acestora
* Depaşirea stivei în partea inferioară sau în partea superioară
* Activitaţi suspecte sau neautorizate

Structura limbajului Java


Structura limbajului Java este la fel de important ca şi caracteristicile sale. Secţiunile urmatoare trec în revistă
conceptele legate de structura programelor Java.

Aplicaţii şi miniaplicaţii
Indiferent dacă aţi aflat despre limbajul Java explorând spatiul cibernetic sau citind o publicaţie de specialitate,
aţi remarcat probabil, folosirea termenilor de aplicaţie şi miniaplicaţie. Din nefericire editorii, atât în spatiul
cibernetic cât şi în publicaţiile tipărite, presupun că dumneavoastră cunoaşteţi diferenţa dintre aceşti doi termeni.

Termenul de miniaplicaţie Java (applet) se referă în general la un mic program Java creat pentru a fi folosit în
sistemul Word Wide Web. Miniaplicaţiile Java necesită un program de vizualizare extern, aşa încât pentru a
putea folosi o miniaplicaţie, aveţi nevoie de un browser Web sau de un program specializat de vizualizare (applet
vierwer). Retineţi faptul că dimensiunea mică a unui applet este ceva relativ şi că elementul definitoriu este
faptul că are nevoie de un program de vizualizare extern.

12
Termenul de aplicaţie Java se referă la un program care poate fi folosit în mod independent. În argoul
informaticienilor, termenul folosit pentru acest tip de programe este app. Aplicaţiile Java nu necesită un program
de vizualizare extern. Aceasta înseamnă că puteţi să executaţi o aplicaţie Java folosind direct interpretorul Java.
Reţineţi că există programe Java care pot fi rulate atât că miniaplicatii folosind un program de vizualizare extern
cât şi ca aplicaţii independente.

Spaţii de nume
Cu cât programul pe care îl creaţi este mai mare cu atât creşte posibilitatea de refolosire a numelui unei variabile
sau al unui parametru. În C++, rezolvarea conflictelor legate de spaţiile de nume putea necesita ore sau chiar zile
de lucru, mai ales dacă foloseaţi biblioteci mari de clase. Java are un sistem riguros de denumire, care permite
evitarea conflictelor legate de spaţiile de nume, prin imbricarea numelor pe mai multe niveluri.
Fiecare componentă a unui nume este imbricată în conformitate cu unul dintre urmatoarele niveluri:
* 0-Spaţiul de nume al pachetului
* 1-Spaţiul de nume al unităţii de compilare
* 2-Spaţiul de nume al tipului
* 3-Spaţiul de nume al metodei
* 4-Spaţiul de nume al blocului local
* 5-Spaţiul de nume al blocului imbricat
Interpretorul Java este responsabil pentru menţinerea şi translatarea spaţiului de nume. Interpretorul identifică
numele de obiecte prin verificarea succesivă a spaţiilor de nume. Spaţiile de nume sunt ordonate după
precedenţă, pornind de le spaţiul de nume cu cel mai înalt nivel, spaţiul de nume al pachetului, pâna la nivelul cel
mai scăzut, cel al blocului local imbricat. În general Java foloseşte prima potrivire de nume descoperită.
Nivelurile spaţiilor de nume formează o ierarhie care oglindeşte structura reală a pachetelor şi a claselor Java.
Numele asociate fiecarui nivel sunt separate de numele din alte niveluri prin caracterul punct. Veţi înţelege mai
bine conceptele de spaţiu de nume şi de nivel în momentul în care veţi vedea cum sunt folosite. Pachetele Java
din biblioteca originală de pachete conţin în mod prestabilit numele java, urmat în general, de un nume de clasă
din cadrul pachetului. În exemplul de mai jos, puteţi vedea declaraţia clasei BorderLayout din pachetul AWT
(Abstract WIndowIng Toolkit):
java. awt. BorderLayout

Convenţiile spaţiilor de nume sunt respectate şi de apelurile funcţiilor. În exemplul de mai jos, puteţi vedea
modul de apelare a unei metode numită println:

System. out. println(str);

Calea completă de acces la metoda println( ) din spaţiul de nume Java este:

java:lang. Sistem. out. println

Java determină locul în care se află metodele println( ) prin căutarea apariţiei unice a clasei System în
spaţiul de nume curent. După ce descoperă ocurenţa clasei System, Java cauta apariţia subclasei out, apoi a
metodei println( ).

Structuri de denumire a programelor

Fişierul care conţine instrucţiunile scrise în limbajul Java se numeşte sursă sau cod sursă. Fişierele sursă au
extensia . java . Aceste fişiere trebuie să fie de tip text. În urma compilării fişierelor sursă de către
compilatorul Java, javac, rezultă un cod de octeţi care poate fi executat.

13
În limbajele procedurale, cum ar fi Pascal, codul executabil complet al programului este stocat, in general, într-
un singur fişier. În limbajele orientate pe obiecte, precum Java, codul executabil este stocat conform structurii
clasei sau a bibliotecii. După compilarea codului sursa Java obţineţi câte un fişier pentru fiecare clasă declarată
în codul sursă. Aceste fişiere au extensia . class şi se numesc unităti de compilare.
Unităţile de compilare Java conţin instrucţiuni de pachet şi instrucţiuni de import, precum şi declaraţii ale
claselor şi interfeţelor. Aceste patru componente formează structura de bază a unui program Java.

Instrucţiuni de pachet
Interfaţă Java API include în pachetul principal Java un număr de alte pachete. Toate clasele şi obiectele pe care
le creaţi sunt grupate în mod prestabilit în acest pachet. Ca urmare, dacă nu specificaţi altceva, Java foloseşte
calea de acces curentă şi presupune că fişierele cu codul compilat se află în directorul curent, la rularea unui
program Java. Pentru a preciza poziţia pachetelor, folosiţi instrucţiunile de pachet.
Cei care experimenteaza limbajul Java şi nu îşi propun dezvoltarea lui pot folosi structura de pachet prestabilită.
Dar dacă urmariti să creaţi aplicaţii Java şi vreţi ca obiectele şi clasele să respecte o structură de denumire a
pachetelor diferită de cea prestabilită, trebuie să includeţi în codul sursă o instrucţiune de pachet:

package NumePachet

Când definiţi noile pachete, trebuie să respectaţi structura ierarhică de denumire a limbajului Java. Acesta
înseamnă că nivelurile din structura de denumire a pachetelor trebuie să fie separate de numele de pachete din
celelalte niveluri prin caractere punct. Iată un exemplu de instrucţiuni de pachet pentru un spatiu de nume cu mai
multe niveluri:

package MyPackages.NumeSubPachet;

Numele de pachete de pe fiecare nivel al spaţiului de nume trebuie să respecte structura de directoare a
sistemului de fişiere, deoarece Java transformă numele pachetelor în căi de acces pentru localizarea claselor şi
metodelor asociate pachetelor. Acest lucru este realizat prin înlocuirea punctelor cu separatorii specifici
sistemului de fişiere. Asadar, numele pachet MyPackages. Gizmos va fi transformat în urmatoarea cale de
acces într-un sistem UNIX:

MyPackages/Gizmos

Într-un sistemWIndows 95/NT, numele de pachet MyPackages. Gizmos va fi transformat în:

MyPackages/Gizmos

Java localizează clasele asociate unui pachet folosind calea de acces obţinută aşa cum am aratat mai sus. Java va
căuta pachetul MyPackages.Gizmos, precum şi clasele şi metodele asociate acestuia, în
directorul \MyPackages\Gizmos.
Specificatiile limbajului Java recomandă folosirea numelor unice de pachete, legate de domeniul Internet în care
pachetele pe care le creaţi vor fi disponibile pentru utilizatorii aflati la distanţă. În plus, se recomandă ca numele
domeniului principal să fie scris cu litere mari - de exemplu, COM, EDU sau GOV.
Ţinând seama de ordinea de precedenţă folosită de Java, schimbaţi ordinea care identifică domeniul, componentă
cu componentă. Astfel, un pachet disponibil global, numit zoom şi asociat cu mcp. com, se va numi COM.
mcp. zoom. Numele este tranformat în urmatoarea cale de acces pentru un sistem UNIX:

COM/mcp/zoom

Pentru un sistem WIndows 95/NT, acelaşi nume de pachet va fi transformat în cale de acces:
14
COM\mcp\zoom

Instrucţiuni de import
Ca şi în alte limbaje de programare, Java include un set de funcţii principale, accesibile global. Aceste funcţii
sunt grupate în pachetul java.land. Pentru a obţine accesul la pachete, clase şi obiecte care nu se află în
această bibliotecă, folosiţi instrucţiuni de import. Acestea vă ajută să definiti şi să rezolvaţi spaţiul de nume
curent, permiţând rezolvarea unui pachet importat cu ajutorul numelor claselor componente.

OBSERVATIE: dacă nu folosiţi instrucţiuni de import, trebuie să specificati referinţa completă a pachetului
inaintea numelui fiecarei clase din codul sursă. Această procedură poate deveni foarte repede obositoare, mai
ales în programele mari.
Asadar, este recomandată folosirea instrucţiunilor de import.
Instrucţiunile de impot trebuie să apară inaintea altor declaraţii din codul sursă si, în general, după instrucţiunile
de pachet, dacă acestea sunt folosite. Ideea care stă la baza folosirii instrucţiunilor de import este aceea de a
ajuta compilatorul Java să găsească metodele corespunzatoare şi de a
evita conflictele între nume. Pentru a face disponibile clasele Java de tipAWT, puteţi să folosiţi în codul sursă
urmatoarele instrucţiuni de import:

import java.awt ;

Această instrucţiune permite compilatorului Java să trimită apelul metodei awt. Button către java. awt.
Button. De asemenea, Java vă permite să importaţi numai tipuri de clase de care aveţi nevoie. Pentru aceasta,
folosiţi urmatoarele instrucţiuni de import:

import java. awt. Button;

Această instrucţiune permite compilatorului Java să trimită apelul metodei Button către java. awt. Button.
O metodă mai eficientă pentru importul pachetelor este importul acestora la cerere, astfel:

import java. awt. *;

Caracterul asterisc din instrucţiunea de import îi spune compilatorului să importe numai clasele de care este
nevoie. În acest fel, puteţi să adăugati în mod dinamic noi tipuri în spaţiul de nume;această instrucţiune de
import permite compilatorului Java să trimită apelul metodelor de tip Button către java. awt. Button.

SUGESTIE: Majoritatea programelor Java folosesc instrucţiuni de import la cerere. Deşi în acest fel scrieţi mai
puţin cod, este bine să fiţi cât mai explicit în privinţa pachetelor de care aveţi nevoie. Mai precis, nu este indicat
să folosiţi instrucţiuni de import care fac disponibile toate clasele limbajului Java. Atunci când două clase din
două pachete diferite au acelaşi nume, va apărea un conflict de nume dacă nu precedati numele clasei cu numele
pachetului.

Declaratiile de clasă
În Java toate clasele sunt derivate dintr-o clasă sistem numita Object. Object este radacina ierarhiei de clase,
ceea ce înseamnă că toate metodele variabilele clasei Object sunt disponibile tuturor celorlalte clase. Aceasta
structură face posibilă refolosirea codului Java. În mod prestabilit, toate clasele sunt private, dacă nu sunt
declarate publice în mod explicit.
Declaratiile de clasă fără modificatori respectă următorul format general:

15
class nume {

// metode şi variabile asociate clasei


}

Java acceptă numai moştenirea simplă a claselor. Ca urmare, toate clasele, cu exceptia claselor Object au o
singură clasă parinte, numită superclasă. Aceasta înseamnă că orice clasă pe care o creaţi poate extinde şi
moşteni funcţiile unei singure clase. Deşi aceasta poate părea o limitare faţă de limbajele de programare care
permit moştenirea multiplă, Java permite moştenirea multiplă a metodelor claselor prin intermediul interfeţelor
claselor. Aşa cum veţi vedea în secţiunea urmatoare, interfaţa unei clase este definită printr-o declaratie de
interfaţă.

Declaratiile de interfaţă
Interfeţele sunt clase abstracte. Prin intermediul unei interfeţe, puteţi să definiţi protocoalele pentru metode şi
pentru variabile finale fără să vă puneţi problema implementarii specifice. Acest lucru vă permite să creaţi un
plan al structurii de programare pe care o veţi defini mai târziu. Interfeţele pot fi extensii ale uneia sau ale mai
multor interfete. În mod prestabilit, toate interfeţele sunt private, dacă nu sunt declarate publice în mod explicit,
dar toate metodele şi constantele interfeţei sunt în mod prestabilit publice.

OBSERVATII: Variabilele finale sunt asemanatoare cu constantele denumite folosite în alte limbaje de
programare. Valorile asociate constantelor şi variabilelor finale nu pot fi modificate.
Deoarece nu trebuie să puneţi la punct toate detaliile privind modul intern de lucru al metodelor asociate
interfeţelor, acestea se pot dezvolta foarte rapid. Ulterior, puteţi să implementati interfaţa într-o declaratie de
clasă. Deoarece o singură clasă poate să implementeze mai multe interfeţe, clasa poate să partajeze aceeaşi
interfaţă cu alte clase sau instanţe ale unei clase. Acest lucru furnizează o mai mare flexibilitate şi permite unei
clase să moşteneasca toate proprietatile tuturor apelurilor de metode asociate cu interfeţe multiple, asociate, la
rândul lor, cu clase multiple.
Diferenţa majoră dintre o clasă şi o interfaţă este aceea că interfeţele nu pot stoca date. Mai mult, interfeţele nu
pot conţine implementări ale metodelor, ci doar declaraţii ale acestora. Declaraţiile de interfaţă fără modificatori
respectă următorul format general:

interface nume {
/ / metode şi variabile statice asociate interfeţei
}

Declaraţiile de clase care folosesc interfeţe respectă următorul format:

class nume_clasa implements nume_interfaţă {


/ / corpul clasei
}

Un alt format poate fi:

class nume_implements nume_interfaţă1, . . . nume_interfaţăN {


/ / corpul clasei
}

Singura deficienţă a interfeţelor este aceea că necesită legarea dinamică (dynamic binding), ceea ce reduce
performanţele de execuţie. Retineti, totuşi, că folosirea interfeţelor pentru a realiza moştenirea multiplă reduce
suprasarcina de execuţie, in comparatie cu metodele de moştenire multiplă folosite în C++.

16
Specificaţiile Java şi interfaţa API
Java a fost lansat oficial în luna mai a anului 1995, la SunWorld`95. De atunci , limbajul a evoluat şi, ca urmare,
specificatiile curente ale limbajului de programare Java sunt foarte diferite de cele prezentate iniţial.

Prima versiune a limbajului Java, creată pentru a fi folosită în Internet, a fost Java Alfa. Versiunile Alfa ale
aplicaţiilor şi limbajelor de programare sunt, în general, livrate dezvoltatorilor pentru revizuire, comentarii şi
corectarea erorilor. Ultima versiune Alfa a limbajului Java este Java Alfa3, folosită de versiunea Alfa a
browserului WebHotJava.
HotJava a fost dezvoltat de către firma Sun, ca o exemplificare a posibilităţilor limbajului Java, şi este scris
chiar în limbaj. În ciuda faptului că versiunile Alfa ale limbajului Java şi ale browserului HotJava au
posibilităţi limitate, acestea s-au raspândit foarte rapid, chiar şi după apariţia versiunilor Java 1. 0. Versiunea
Alfa include browserul HotJava , punând limbajul Java şi browserul HotJava la dispoziţia tuturor celor care
vor să dezvolte aplicaţii Java pentru Internet sau să afişeze pagini Web care conţin miniaplicaţii Java. Până spre
sfârşitul anului 1995 HotJava a fost a fost singurul browser disponibil pentru afişarea paginilor Web conţinând
miniaplicaţii Java.
Dezvoltarea limbajului era în plină desfasurare în momentul în care Sun a scos pe piaţă versiunea Java Pre-Beta
1. Odată cu această versiune, au apărut schimbari majore în structura limbajului Java, printre care includerea
superclasei AWT. Superclasa AWT este folosită pentru afişarea obiectelor grafice, precum butoane şi ferestre
derulante. Aceste modificări ale structurii interfeţei Java API fac ca versiunile de după Pre-Beta 1 să nu fie
compatibile cu versiunea Alfa. De asemenea, versiunea Pre-beta 1 a introdus noi instrumente de lucru Java,
precum programul de vizualizare a miniaplicaţiilor şi depanatorului Java.
La câteva luni după apariţia versiunii Java Pre-Beta 1, Sun a lansat pe piaţă versiunea Java Beta. În general,
versiunile Beta ale aplicaţiilor şi limbajelor sunt accesibile unui număr mai mare de persoane şi se concentrează
asupra corectarii erorilor. Deşi versiunea Java Beta corectează unele erori şi imbunătăţeşte securitatea,
principalele modificări aduse limbajului sunt legate tot de superclasa AWT.
Ultima versiune Beta a limbajului a fost Java Beta 2, care a adăugat noi funcţionalităţi pachetelor Java. Deşi a
reprezentat o schimbare majoră a interfeţei Java API, versiunea Java Beta 2 a modificat interfaţa API astfel încât
aceasta să fie compatibilă cu modul în care browserul Netscape Navigator folosea miniaplicaţii scrise cu
versiunea Beta.

În viitor: Capitolul 4. ”Limbajul Java:abecedar”, conţine o secţiune referitoare la trecerea de la versiunile


anterioare la Java1. 0. Programatorii care folosesc versiunile Alfa sau Beta vor găsi această secţiune foarte utilă.

Deoarece toate versiunile programului Netscape Navigator, începând cu versiunea 2. 0 Beta 4, pot afişa
miniaplicaţiile Java Beta, mulţi dezvoltatori Internet au încercat să creeze asemenea miniaplicaţii. Din acest
motiv Java Beta 2 API foloseşte eticheta Netscape<APPLET>şi nu eticheta <APP>utilizată anterior. Eticheta
<APPLET> este standardul pentru versiunea 1. 0 şi pentru versiunile ulterioare ale interfeţei.
O altă schimbare cu efecte majore adusă limbajului în versiunea Beta 2 a fost posibilitatea de a încărca clasele
din fişiere arhivate(zip). Înainte de această modificare, la instalarea în sistemul de fişiere, Java a creat
directoarele subdirectoarele şi structura de fişiere care respectă structura interfeţei Java API. Discuţiile anterioare
despre cautarea spatiilor de nume prin transformarea numelor în căi de acces arăta clar de ce era nevoie de acest
lucru. De exemplu, în versiunile anterioare pentru a gasi metoda println, Java căuta spaţiile de nume de-a
lungul întregii căi de acces: java.lang.System.out.println. Calea de acces era obţinută prin înlocuirea
punctelor cu separatorul corespunzător sistemului. Java se baza pe structura de directoare a sistemului de fişiere,
iar pe harddisk erau instalate mii de fişiere.
Posibilitatea de încărcare a claselor din fişierele arhivate a permis comprimarea întregului conţinut al interfeţei
API într-un singur fişier, economosind spaţiul şi evitând aglomerarea discului. La instalarea versiunii curente a
limbajului Java este copiat pe disc un singur fişier, classes.zip, în subdirectorul lib. În acest fel atunci când
17
programul de încărcare a claselor şi compilatorul Java efectuează o căutare în spaţiul de nume, aceasta se face
mai întâi în calea de acces corespunzătoare.
Dacă fişierul clasei căutate nu este găsit, este căutat fişierul arhivat în classes.zip.

În viitor: Java va permite să arhivati şi pachetele sau clasele creeate de dumneavoastră. Stabilirea mediului de
lucru Java şi creearea pachetelor arhivate sunt discutate în capitolul 2. ”Prezentarea setului de dezvoltare
Java(JDK)”.

În ianuarie 1996, firma Sun a lansat pe piaţă versiunea Java 1. 0. Modificările faţă de versiunea Beta 2 sunt
minore şi se referă în principal la corectarea unor erori. Aceasta înseamnă că miniaplicaţiile Java Beta2 sunt
compatibile cu miniaplicaţiile Java1. 0. De asemenea browserul Netscape Navigator poate afişa atât
miniapliacatiile Java Beta 2, cât şi miniaplicaţiile Java 1. 0.
Iniţial, Sun a păstrat interfaţa Java API din versiunea Java 1. 0. Interfaţa Java API conţine surse de cod ce pot fi
folosite în aplicaţii. Codul organizat în biblioteci de pachete ce conţin clase şi metode proiectate pentru a
simplifica programarea în limbajul Java. Cel mai important lucru legat de pachetele API este că acestea au fost
foarte bine testate. Veţi vedea că aceste pachete conţin toate funcţiile de bază necesare. În acest fel, puteţi să
economisiţi timp şi să începeţi dezvoltarea aplicaţiilor Java fără să fie nevoie să reinventaţi roata.
Pentru a se asigura că modelul de securitate oferit de Java este optim pentru Internet, Sun a cerut programatorilor
să-l testeze. La câteva luni după apariţia Java 1. 0, a fost descoperită o fisură în implementarea modelului de
securitate în codul de octeţi. Această fisură, identificată de cercetătorii de la Universitatea Princeton, dădea
posibilitatea “spărgătorilor” experimentaţi să folosească o adresă IP(Internet Protocol)care permitea
miniaplicaţiei accesul la un alt calculator decât cel pe care era executată. Sun a rezolvat problema şi a lansat
imediat versiunea 1. 0. 1
La scurt timp, au fost descoperite şi alte probleme de securitate. În mai 1996, Sun a lansat versiunea 1. 0. 2.
Această versiune rezolva problemele de securitate descoperite, corecta câteva erori minore din pachetul Java şi
introducea unele modificări ale interfeţei claselor. O altă eroare de securitate, descoperită în iunie 1996, făcea
posibilă manipularea modului în care sunt atribuite obiectele şi a modului în care acesta lucrează împreună,
pentru a submina sistemul de tipuri Java. După ce un cercetator din Marea Britanie a descoperit această
deficienţă, Sun a revizuit complet sistemul de securitate şi a scos o nouă versiune actualizată a setului JDK.
Deoarece firma Sun şi partenerii acesteia pentru dezvoltarea limbajului Java şi-au declarat intenţia de a folosi în
continuare interfaţa API actuală, se poate presupune că limbajul Java a atins, în sfârsit, un nivel de standardizare.
Aceasta este o veste bună pentru toţi cei care vor să dezvolte aplicaţiile în Java.
Evoluţia limbajului nu s-a oprit. Sun va continua să îl dezvolte şi a anunţat deja o nouă versiune majoră a
limbajului. Către sfârşitul anului 1997, este aşteptată o versiune completă JDK 1. 1. Din fericire, introducerea
standardizării ne asigură că programele create astăzi vor putea fi folosite şi mâine.

Maşina virtuală Java


Maşina virtuală Java (JVM) reprezintă motorul limbajului de programare Java. Datorită maşinii virtuale,
limbajul Java este neutru din punct de vedere arhitectural, interpretat şi compilat, pregătit şi compatibil cu
operarea în reţea, portabil, robust şi sigur. JVM asigură aceste caracteristici prin furnizarea unor specificaţii
abstracte, pentru care dezvoltatorii pot crea interpretoare, iar programatorii pot proiecta aplicaţii.
Specificaţiile abstracte creează un calculator imaginar. Deoarece maşina virtuală Java există numai în memorie,
dezvoltatorii Java pot folosi metodologia orientată pe obiecte pentru transmiterea informaţiilor - parametri,
apeluri de metode şi alte tipuri de date-între maşina reala şi maşina virtuală. După ce mapează interacţiunile
dintre maşina virtuală şi maşina reală pentru operaţii standard de intrare/ieşire, operaţii de intrare/ieşire pentru
fişiere şi operaţii de gestionare a memoriei, programatorii pot crea medii adiţionale de execuţie Java pentru alte
sisteme. Deoarece specificaţiile maşinii virtuale Java sunt scrise complet pentru toti utilizatorii si, prin urmare,
sunt deschise pentru dezvoltare, limbajele de programare Java nu sunt restricţionate de vreun proprietar.

18
Aceasta înseamnă că orice dezvoltator poate crea un interpretor pentru maşina virtuală Java. (In capitolul24, vi se
oferă o imagine detaliată a sistemului de execuţie şi a maşinii virtuale Java)

REZUMAT
Aşa cum aţi văzut în acest capitol, dezvoltatorii de la JavaSoft-Sun au depus mari eforturi pentru crearea unui
limbaj de programare revoluţionar. Nici un alt limbaj de programare nu are forţa şi flexibilitatea limbajului Java.
Java este limbajul de programare al anilor `90 şi chiar al următorilor. Limbajul Java pune la dispoziţie o
structură uşor de folosit, modelată pe baza a doua dintre cele mai populare limbaje de programare, C şi C++.
Proiectanţii limbajului Java au eliminat însă problemele din C şi C++. Dacă doriţi să dezvoltaţi aplicaţii Java,
veţi vedea că proiectarea orientată pe obiecte a limbajului este prietenoasă şi familiară. De asemenea, veţi vedea
interfaţa Java API economiseşte multe ore de muncă şi că puteţi crea programe mai bune, fără să fie nevoie să
reinventaţi roata.

19

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