Sunteți pe pagina 1din 195

Introducere in limbajul Java v2.

0
Contents
Introducere in limbajul Java v2.0............................................................................................................. 1
Capitol 1: Ce reprezinta Java? .............................................................................................................. 3
Capitol 2: Programarea orientata pe obiecte ...................................................................................... 40
Capitol 3: Componentele limbajului Java .......................................................................................... 71
Capitol 4: Operatorii si structurile de control ale limbajului Java ................................................... 118
Capitol 5: Fundamentele definirii si utilizarii claselor ..................................................................... 138
Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare ..................................... 162
Capitol 7: Vectori ............................................................................................................................. 182
Capitol 8: Clase si mostenirea claselor ................................ Eroare! Marcaj n document nedefinit.
Capitol 9: Proiectarea interfetelor grafice ............................ Eroare! Marcaj n document nedefinit.
Capitol 10: Programarea bazata pe evenimente si interfetele graficeEroare! Marcaj n document
nedefinit.
Capitol 11: Exceptii in Java ................................................. Eroare! Marcaj n document nedefinit.
Capitol 12: Colectii de obiecte ............................................. Eroare! Marcaj n document nedefinit.
Capitol 13: Fire de executie ................................................. Eroare! Marcaj n document nedefinit.

Capitol 1: Ce reprezinta Java?

Capitol 1: Ce reprezinta Java?


Prezentare generala
Acest modul reprezinta o introducere in limbajului de programare Java.Explica modul in care un
calculator functioneaza si descrie tehnici diferite de programare.Modulul recapituleaza istoria Java si
acopera elementele necesare unui program in Java.Studentii vor mai invata si cum sa creeze si sa
ruleze un program Java.Java este un limbaj de programare dinamic si popular.Utilizarea limbajului
Java a crescut in ultimii cinci ani si cu siguranta va continua sa creasca.Acest curs va prezenta
tehnicile de programare in Java care sunt folosite pentru a crea aplicatii si programe Web-enabled.
Cuvinte cheie:
- Hardware
- Software, programe, aplicatii
- Limbaje de programare procedurale
- Limbaje de programare orientate-pe-obiect
- Compilator
- Interpretor
- Limbajul de programare Java
- Masina Virtuala Java (JVM)
- Cod sursa
- A compila
- Runtime
- Cod binar
- Javac
- Cuvinte cheie si simboluri Java
- Sintaxa Java
- Java 2 Software Development Toolkit (SDK)
- Integrated Development Environment (IDE)
- BlueJ

1.1.1 Prezentare generala


Calculatorul poate parea a fi o inventie recenta.Cu toate acestea,babilonienii au inventat abacul
timpuriu,care era o masina simpla de insumare sau o tabela de numarare,inventata acum mai mult de
5000 de ani.Calculatoarele mecanice au aparut prima data in Europa de Vest la inceputul secolului al
17-lea.
In 1623,un filosof german pe nume Wilhelm Shickard (1592-1635)a inventat prima masina digitala de
calcul.El a denumit-o ceas de calcul.Era o masina cu sase-cifre care putea aduna,scade,si indica
overflow-ul cu sunetul unei sonerii.Un set de tije Nadier (Nadier's Rods)a fost montat pe
masina.Acesta era un ajutor de memorie ce permitea utilizatorilor sa efectueze operatia de adunare.In
1960,masina a fost reconstruita dupa planurile originale.S-a determinat ca este eficienta pentru
adunarea si scaderea numerelor.
3

Capitol 1: Ce reprezinta Java?

Cu timpul,calculatoarele au devenit mult mai complexe si puternice.Ele au devenit o parte integrata a


societatii.
Calculatoarele moderne sunt mai mici,mai rapide,si mai ieftine.Ele pot fi legate pentru a forma
retele.Cea mai mare retea este Internetul.Internetul este construit din mai multe retele mai mici.Cei
care au acces la el pot trimite,primi,si imparti informatii.

1.1.2 Hardware
Hardware-ul calculatorului reprezinta echipamentul fizic folosit pentru a efectua un set de instructiuni
pentru calculator.Calculatoarele se prezinta in mai multe forme.Acestea includ calculatoarele
personale,personal digital assistants (PDA-uri), telefoane mobile,si ceasuri.Partile fizice ale
calculatorului sunt de obicei cunoscute ca si hardware.Cateva exemple de hardware al calculatorului le
reprezinta monitorul,tastatura,mouse-ul,imprimanta,hard drive-ul,placa de retea,CD-ROM-ul,discurile
demontabile,si modemul.CD-urile,si hartia de imprimanta nu sunt hardware de calculator.

Capitol 1: Ce reprezinta Java?


Toate calculatoare constau din trei parti de baza:

- Unitatea centrala de procesare (CPU) - Acesta reprezinta creierul calculatorului.CPU-ul


primeste,interpreteaza,si efectueaza sarcini continute in software-ul programelor.CPU-ul controleaza
actiunile altor hardware-uri din calculator.Gordon Moore,presedintele Intel,a dezvoltat o regula
generala pentru a exprima rata de crestere a puterii cu fiecare generatie de calculatoare noi.El a
determinat ca puterea de procesare se dubleaza la fiecare 18 pana la 24 de luni.Aceasta inseamna ca un
calculator achizitionat acum poate fi de la 5.7 pana la 10 ori mai rapid decat unul de acum cinci
ani.Calculatoarele noi sunt mai mici,mai rapide,si mai ieftine.

- Memoria - Aceasta reprezinta locatia in care datele sunt procesate sau in care instructiunile folosite
sunt stocate.Exista doua tipuri de memorie intr-un calculator.Primul tip este memoria persistenta
precum hard drive-uri,CD-uri.Memoria persistenta isi pastreaza informatiile stocate atunci cand
calculatorul este stins.Memoria dinamica isi pastreaza informatiile stocate in cipul de memorie atata
timp cat calculatorul este pornit.Memoria dinamica mai este numita random-access memory (RAM).
Programele Java sunt stocate in RAM atunci cand sunt folosite.

- Componente electronice si subansamble - Acestea sunt folosite pentru a primi datele de la


dispozitivele de intrare precum tastatura sau mouse-ul.Ele sunt folosite si pentru a trimite datele prin
dispozitivele de iesire precum monitorul sau imprimanta.

1.1.3 Software
Software-ul si sistemul de operare controleaza modul de functionare al hardware-ului.
Hardware-ul nu poate efectua multe sarcini de unul singur.Hardware-ul are nevoie de software pentru
a-l face sa functioneze.Software-ul reprezinta o colectie de instructiuni ce ii impun hardware-ului
comportamentul.De exemplu,software-ul ii impune CD-ROM-ului dintr-un sistem stereo sa cante
muzica.Software-ul furnizeaza CPU-ului pasii necesari pentru a indeplini o sarcina,si ii descrie
detaliat.Imaginati-va ca pasii explica modul de a bea dintr-o cana.Aceasta sarcina simpla implica mai
multi pasi:
Pas 1 Priviti cana
Pas 2 Intindeti mana
Pas 3 Deschideti mana
Pas 4 Prindeti cana
Pas 5 Inchideti mana
Pas 6 Ridicati cana catre gura
Pas 7 Inclinati cana
Pas 8 Beti din cana
Software-ul poate fi clasificat ca si un sistem de operare (SO)sau o aplicatie.Diferentele dintre un SO
si o aplicatie se bazeaza pe tipurile de actiuni pe care aceste programe le efectueaza.Ambii termeni fac
referire la un grup de programe de calculator ce contin un set de instructiuni ce impun hardware-ului

Capitol 1: Ce reprezinta Java?


sa efectueze anumite sarcini.Aceste programe sunt stocate in memoria calculatorului si aceste sarcini
sunt executate pe rand de catre CPU.
Software-ul este rareori proprietar.In schimb,de obicei este achizitionata o licenta de software.Aceasta
nu permite utilizatorilor dreptul de a il copia,partaja,sau vinde.
Daca o companie doreste sa achizitioneze un program de e-mail,trebuie sa achizitioneze o licenta
pentru a folosi software-ul companiei ce a creat programul.Atunci cand oamenii cumpara software,ei
cumpara o licenta de software.
Exista trei metode pentru a obtine un software

si

- Sa cumpere software care este deja scris.Software-ul poate fi astfel obtinut cu usurinta si la un cost
mic.Programul de procesare a cuvintelor care a fost folosit pentru crearea acestui document a fost
achizitionat de la o companie de software.Aceasta inseamna ca a fost achizitionata o licenta pentru
folosirea software-ului.Daca software-ul nu are anumite trasaturi sau nu este compatibil cu hardwareul,utilizatorul nu poate schimba modul in care software-ul functioneaza.

- Sa modifice software-ul,daca licenta permite.Un nou curent in software este denumit open
source.Acesta permite oricui sa obtina drepturile de a folosi software-ul si dreptul de a modifica
programele incluse in software.Pentru a modifica software-ul,majoritatea utilizatorilor trebuie sa fie de
acord sa-si trimita modificarile gratis oricui doreste sa foloseasca sau sa modifice software-ul.

Capitol 1: Ce reprezinta Java?

- Sa scrie software individual.Daca acest tip de software este creat si testat corespunzator,va face exact
ceea ce-si doreste utilizatorul.Acest tip de sofware poate fi scump si crearea sa poate dura.Limbajele
precum Java si alte utilitare de dezvoltare pot reduce timpul de creare a programului.
In figura , potriviti termenii din partea de jos a graficului caracteristicilor lor.Faceti drag and drop
fiecarui termen in spatiul gol din dreapta definitiei.Apoi dati click pe butonul Check pentru a
determina daca termenii au fost pusi in zona potrivita.Dati click pe butonul Show Me pentru a
vizualiza raspunsurile corecte.
Atunci cand o interfata in linia de comanda (CLI)este folosita,utilizatorul interactioneaza cu
calculatorul printr-o combinatie tastatura-monitor.Acest utilizator introduce comenzi text.Acesta este
modul in care lucrurile obisnuiau sa fie rezolvate in zilele timpurii ale calculatoarelor
mainframe,minicalculatoarelor,si calculatoarelor personale pe baza de DOS.Comenzile anterioare
includeau dir,del,edit,cd,ls,si grep . Nici o interfata grafica cu utilizatorul (GUI)nu era folosita in acele
timpuri.
Oamenii de stiinta de la Apple Computer,Inc si Xerox PARC au creat GUI-uri care sunt mai intuitive
pentru utilizatori.Versiunile curente ale acestor GUI-uri includeau Microsoft Windows,Mac OS,si
Unix.Un GUI face referire la folosirea elementelor grafice,precum si a tastaturii si a mouse-ului,pentru
a oferi o interfata usor-de-folosit pentru un program.

1.1.4 Aplicatii
Aplicatiile sunt grupuri de programe de calculator.Editoare de cuvinte,browser-e de Internet,si jocuri
pe calculator sunt toate exemple de aplicatii.Fiecare dintre aceste aplicatii includ programe de
calculator ce efectueaza sarcini prestabilite.De exemplu,exista de obicei un program de verificare a
ortografiei intr-un editor de cuvinte.Exista un alt program ce salveaza documentele pe hard disk-ul
calculatorului.
Un calculator poate de asemenea sa proceseze datele in informatii ce pot fi folosite.Datele reprezinta
fapte si figuri neprelucrate.Aplicatiile contin programe ce ii recomanda calculatorului ce date sa
foloseasca si cum sa le proceseze.Procesul general care este utilizat pentru a afisa informatii este aratat
in Figura .
Datele de intrare includ numele de familie,prenumele si data nasterii.Programul proceseaza aceste date
pentru a produce numele si varsta individului.
Majoritatea utilizatorilor de calculatoare isi cumpara aplicatii pentru calculatoare.Multe companii isi
creaza propriile aplicatii software.Aceste aplicatii sunt specializate si efectueaza sarcini critice
necesare afacerii.La sfarsitul acestui curs,studentii vor fi capabili sa scrie si sa-si creeze propriile
aplicatii.
Acest exemplu demonstreaza modul in care un utilizator ii indica unei aplicatii ce sa faca.Pentru a
verifica ortografia dintr-un document,utilizatorii dau click pe un buton sau selecteaza o optiune dintr7

Capitol 1: Ce reprezinta Java?


un meniu cu optiuni.Butonul sau elementul din meniu trimite un mesaj aplicatiei.Acest mesaj specifica
faptul ca utilizatorul vrea ca aplicatia sa efectueze o sarcina.Dupa ce aplicatia verifica ortografia
documentului,anunta utilizatorul ca s-a terminat.Aplicatiile trebuie sa fie capabile sa primeasca mesaje
atunci cand un utilizator doreste sa efectueze o sarcina si sa trimita rezultatul utilizatorului atunci cand
sarcina a fost efectuata.Mai este importanta intelegerea modului in care mesajele sunt trimise de la un
program la altul.Acest subiect va fi discutat mai tarziu in acest modul.

1.1.5 Sisteme de operare


Sistemul de operare intr-un calculator reprezinta grupul de programe ce controleaza hardware-ul.De ce
este un SO necesar daca o aplicatie manevreaza toate task-urile ce trebuiesc efectuate pe un
calculator?Unul dintre principiile de baza ale calculatoarelor este de a diviza o problema complexa in
parti mai mici.Acest principiu poate fi comparat cu o sarcina impartita pe arii de expertize.Atunci cand
o casa este construita,un arhitect creaza schita,un zidar construieste zidurile exterioare,un tamplar
construieste zidurile interioare,un electrician instaleaza cablurile electrice,si un instalator instaleaza
conductele de apa.Fiecare persoana este experta pe o parte a sarcinii.Procesul este impartit intr-un set
de parti mai mici precum ziduri,accesorii electrice,si instalatii.

Oamenii de stiinta au observat procesul folosit pentru crearea unei aplicatii de calculator si au impartito intr-un set de probleme de baza ce trebuiesc rezolvate.Cum va citi si va scrie calculatorul datele de
pe hard drive?Cum va primi date de la tastatura?Cum va afisa mesaje si documente pe
monitor?Intrucat au fost scrise programe pentru fiecare problema,s-a stabilit ca daca fiecare aplicatie
va rezolva individual aceste probleme,atunci fiecare va trebui sa interactioneze cu hardware-ul si sa
efectueze sarcini functii specifice.Un astfel de exemplu este de a crea documente intr-un editor de
cuvinte.Un SO separa sarcinile folosite pentru controlul hardware-ului de setul de sarcini ale fiecarei
aplicatii.SO-ul controleaza hardware-ul si aplicatia executa restul.
8

Capitol 1: Ce reprezinta Java?


Unii oameni de stiinta sunt experti in abilitatea de a controla hardware-ul.Ei creaza sisteme de operare
pe care alti oameni de stiinta le folosesc pentru a-si crea aplicatiile.Aceasta impartire a sarcinilor a
avut anumite efecte secundare:

- Abilitatea de a trimite mesaje intre programele de calculator a devenit critica pentru dezvoltarea unui
SO.Sistemele de operare au nevoie ca aplicatiile sa trimita mesaje SO-ului pentru a cere folosirea unei
parti de hardware.Doua exemple sunt citirea sau scrierea datelor pe hard drive.Aceasta necesita
folosirea de interfete.Interfetele permit programelor de calculator sa comunice intre ele.Java
Application Programming Interface (API)reprezinta un grup de clase distribuite cu Java Development
Kit.Programatorii le pot folosi pentru a-si construi propriile aplicatii.Aceste interfete sunt discutate
mai tarziu in modul.

- Sistemele de operare au fost create,acestea fiind diferite si incompatibile.Dezvoltatorii aveau nevoie


ca aplicatiile lor sa devina compatibile cu orice tip de SO pe care utilizatorii ar putea sa-l aleaga pentru
a-l rula pe calculatoarele lor.Crearea de aplicatii pentru fiecare SO a devenit prea scumpa.Pentru
reducerea costurilor si a timpului necesar dezvoltarii acestor aplicatii,dezvoltatorii au cautat metode
pentru ca aplicatiile lor sa devina portabile pe mai multe sisteme de operare.Limbajul Java este un
limbaj foarte portabil.Acest lucru va fi explicat in modulul urmator.
Atunci cand primul OS a fost introdus,nu existau monitoare cu ferestre si mouse-ul calculatorului inca
nu se inventase.Tastaturile erau folosite pentru a introduce comenzi si afisajul monitorului era negru
cu litere albe continand un cursor.Cursorul indica oamenilor ca un calculator era pornit si pregatit
pentru datele de intrare.Acest cursor se numeste promptul de comanda.Spatiul liber de dupa cursor a
devenit cunoscut ca si linie de comanda pentru SO.Comenzile erau introduse in acest spatiu.Un sistem
de operare devenea din ce in ce mai complex,comenzile erau introduse si numele comenzilor deveneau
mai greu de inteles si de amintit.DOS-ul Microsoft si versiunea originala UNIX sunt sisteme de
operare bine-cunoscute ce folosesc CLI.
Pe masura ce calculatoarele deveneau tot mai populare,a fost necesara gasirea unei metode mai bune
de interactionare cu SO-ul.Sistemele de operare Windows au fost dezvoltate pentru a simplifica
procesul.Xerox a dezvoltat primul SO comercial cu ferestre.Se numea Star.Inainte de acesta,a fost
creat primul SO necomercial cu ferestre,denumit Mac OS.Microsoft a urmat cu Windows,si exista
multe altele.Sistemele de operare pe baza de Windows au devenit populare datorita usurintei de
utilizare.Programatorii au dezvoltat apoi aplicatiile cu ferestre ce puteau rula pe multe dintre sistemele
de operare ce ofereau de obicei numai linie de comanda precum Solaris,Linux,si UNIX.

1.2.1 Definirea unui limbaj de programare


Software-ul reprezinta un grup de programe ce contin instructiunile de operare hardware.Limbajul de
programare este folosit pentru a scrie programe de calculator.Exista mai multe limbaje de
programare.In cele mai multe cazuri,un program scris intr-un limbaj nu poate comunica cu un program
scris intr-un alt limbaj.Exista metode de a traduce mesaje dintr-un limbaj intr-altul.
9

Capitol 1: Ce reprezinta Java?

Limbajul calculatorului ales pentru un program depinde de mai multi factori.Acesti factori includ
cunoasterea limbajului,a utilitarelor folosite pentru dezvoltarea unui program,caracteristicile
hardware,si tipul de problema ce trebuie rezolvata.
Anumite beneficii ale Java includ:

- Java este un limbaj usor de invatat


- Exista mai multe utilitare folosite pentru a dezvolta aplicatii complexe rapid si eficient
- Programele Java pot rula pe aproape orice hardware
- Aproape orice afacere complexa sau problema stiintifica poate fi rezolvata cu programe scrise in
Java
Aceasta sectiune va prezenta elementele de baza ale unui limbaj de programare si evolutia de la
programe simple pe calculatoarele timpurii la limbaje precum Java.Vor mai fi discutate si detaliile
unui program simplu Java.

1.2.2 Intrerupatoare, unu si zero


Instructiunile unui program trebuie sa fie intr-un limbaj pe care un calculator sa-l inteleaga.La nivelul
hardware,un calculator nu reprezinta nimic altceva decat mii de switch-uri ce pornesc si se opresc
rapid.Dupa cum este demonstrat si in figura,cele doua stari ale unui switch sunt de pornit si
oprit.Starea unui switch poate fi reprezentata printr-un 1 pentru pornit si 0 pentru oprit.In anii timpurii
de programare,un panou de switch-uri reprezenta singura modalitate de a introduce instructiuni intr-un
calculator.Operatorul trecea switch-urile prin starile de pornit si oprit pentru a reprezenta
instructiuni.Aceasta era o forma timpurie a unui limbaj de programare si codul se numea cod binar.
10

Capitol 1: Ce reprezinta Java?

Limbajul vorbit este prea complex pentru un calculator.In timp ce creierul uman poate procesa
propozitii,un calculator intelege numai starile unui switch.Intrucat calculatoarele timpurii nu includeau
programe,programatorii trebuiau sa scrie cod pentru a procesa datele si pentru a calcula
rezultatele.Singura metoda disponibila la acel moment era sa scrie instructiuni in codul binar cu 0 si 1.

1.2.3 Primele limbaje de programare


Scrierea instructiunilor in binar este dificila.Limbajele de programare au fost create ca o legatura intre
limbajul binar al unui calculator si cuvinte.Oamenii pot folosi sintaxa gasita intr-un limbaj de
programare pentru a instrui un calculator sa efectueze sarcini complexe.Limbajele de programare
timpurii foloseau cuvinte scurte pentru a reprezenta un set de instructiuni binare pe care calculatorul
putea sa le inteleaga.De exemplu,cuvantul "add"reprezinta un set de pasi ce instruiesc un calculator
cum sa adune doua numere.Aceste cuvinte scurte se numesc mnemonici.Ele folosesc unul sau mai
multe simboluri pentru a reprezenta un set de instructiuni binare in calculator.Limbajele timpurii se
numeau limbaj masina sau limbaj de asamblare.

11

Capitol 1: Ce reprezinta Java?


Dupa ce calculatoarele puteau fi programate cu grupuri de litere,tastaturile au fost adaugate ca
dispozitive principale de intrare.Un program special software era necesar pentru a traduce programele
din limbaj de asamblare in limbaj binar.Aceste programe de traducere au devenit cunoscute sub
numele de assembler.
Odata ce limbajul de programare de asamblare a fost creat,mai multe companii au inceput sa utilizeze
calculatoarele.Odata cu cresterea utilizarii,a crescut si nevoia de aplicatii software complexe.Limbajele
low-level nu ofereau raspunsul rapid necesar in aplicatiile de business.Limbajele de asamblare erau si
ele complexe si greu de invatat.Acestea constrangeau programatorul sa gandeasca precum un
calculator si sa separe fiecare task intr-o lista lunga de instructiuni simple.Odata ce aplicatiile au
inceput sa devina din ce in ce mai complexe,trebuia depus mai mult efort pentru crearea si mentinerea
aplicatiilor.Limbajele high-level erau folosite pentru a scrie programe de calculator rapid si eficient
pentru a rezolva probleme de actualitate reala.

1.2.4 Limbaje de programare de nivel inalt


Limbajele de nivel inalt au fost dezvoltate pentru ca programatorii sa se preocupe mai putin in privinta
pasilor pe care un calculator trebuie sa ii urmeze pentru a rula un program.Acesta le permitea sa se
concentreze pe proiectarea si construirea unei aplicatii.Aceste limbaje high-level includ cuvinte sau
abrevieri ce au fost recunoscute de catre utilizatori.Astfel,citirea si scrierea limbajului deveneau mai
usoare.
Limbajele de nivel inalt au adaugat un nivel in plus intre un calculator si un programator.Programe noi
au trebuit sa fie create pentru a traduce aceste noi limbaje in limbajul binar al unui
calculator.Programele de traducere converteau instructiunile high-level in codul binar pe care
calculatorul il intelegea.Aceste translatoare erau utilitare oferite de catre dezvoltatorii fiecarui limbaj.
Limbaje precum FORTRAN si COBOL foloseau o abordare liniara cu un singur punct de intrare si
iesire pentru a rezolva o problema.Aceasta se numeste programare procedurala.Programul defineste
toate datele necesare pentru secventa de programare si toate instructiunile pentru procesarea
datelor.Instructiunile sunt efectuate in ordinea descrisa de program.Aceasta metodologie necesita
multa munca de intretinere.Orice schimbare in marimea,tipul,sau locatia datelor necesita schimbari ale
multor programe.Orice schimbare in procedurile si sarcinile business necesita munca de intretinere
pentru modificarea si schimbarea programelor.

12

Capitol 1: Ce reprezinta Java?

Pe masura ce aplicatiile au devenit tot mai complexe,programatorii au realizat ca ei foloseau in mod


repetat aceleasi functii.Functiile care erau create pentru a scrie fisiere pe hard disk-uri,pentru a trimite
mesaje altor calculatoare,sau pentru a calcula probleme de matematica de baza au inceput sa apara in
biblioteci speciale.Programatorii puteau refolosi aceste functii in fiecare aplicatie noua.Astfel erau
reduse durata de timp necesara pentru crearea aplicatiilor si costul acestor programe.Aceste biblioteci
au devenit cunoscute sub numele de Application Program Interface (API).

Aceste limbaje de nivel inalt inca mai constrangeau programatorul sa gandeasca precum un
calculator.Programatorii inca mai trebuiau sa separe o problema in mai multi pasi pe care un calculator
sa ii efectueze.Apoi trebuiau sa descrie problema in termeni in care un calculator ar rezolva-o.

1.2.5 Programarea orientata pe obiecte


Programarea orientata-pe-obiecte asambleaza componente diferite,sau obiecte,intr-o aplicatie.Astfel o
problema este impartita in parti.Aceste parti sunt definite ca si obiecte.Fiecare obiect efectueaza o
13

Capitol 1: Ce reprezinta Java?


sarcina.Pentru a interactiona,obiectele trimit si primesc mesaje.Programatorii se concentreaza pe
modul in care actiunile acestor obiecte sunt coordonate si modul in care acestea comunica intre ele.Ele
nu trebuie sa stie modul in care fiecare obiect isi efectueaza sarcina.
Programatorii mai creaza si obiecte noi ce pot fi folosite in alte aplicatii.Majoritatea problemelor de
business sunt complexe.Nu sunt usor rezolvate de solutii liniare precum programarea procedurala.

Exista trei metode pentru a obtine programe.Acestea sunt de achizitionare,de modificare a celor
vechi,sau de creare a lor.Acelasi lucru este adevarat si referitor la obiecte.Obiectele sunt doar parti ale
programelor.Programatorii trebuie sa-si ia in considerare bugetul si timpul lor inainte de a decide daca
sa cumpere o biblioteca de obiecte sau sa-si creeze propriul obiect.Crearea unui obiect poate fi
costisitoare si limbajul Java ofera mai multe metode de reducere a costului si a timpului necesare
crearii obiectelor particularizate.De exemplu,Sun Microsystems ofera o biblioteca bogata de obiecte si
programe testate ce pot fi refolosite.Java are mai multe site-uri web ce ofera obiecte si programe
testate,gratuite sau cu plata.
Metodele de programare orientata-pe-obiecte reflecta mult mai mult metoda de rezolvare a
problemelor folosita de catre oameni.Ca si rezultat,aceste limbaje sunt populare in industria
software.Aceste metode au adus avantaje in reutilizare,mentenanta si in imbunatatirea productivitatii
software.Limbajele de programare procedurala nu permit programatorilor sa-si refoloseasca partile de
cod in cel mai usor mod posibil.Acelasi cod poate fi folosit in programe diferite in aceeasi
aplicatie.Schimbarile ar trebui realizate pentru fiecare program pentru ajustarea unei parti de cod.In
metodele orientate-pe-obiecte,exista o singura copie a unui cod,astfel ca numai o copie trebuie
actualizata daca o schimbare este necesara.Aceasta este considerata cea mai buna practica in industrie.
Urmatorul modul se va concentra pe modul in care programatorii creaza obiecte diferite.

14

Capitol 1: Ce reprezinta Java?

1.2.6 Elementele de baza ale unui limbaj


Toate
limbajele
de
programare
au
cinci
elemente
comune.Acestea
sunt
vocabularul,punctuatia,identificatorii,operatorii,si sintaxa.Fiecare limbaj de programare isi are setul
unic de astfel de elemente.Studentii trebuie sa invete toate aceste elemente pentru a intelege limbajul
de programare.
Toate programele de calculator sunt acum scrise cu o forma a unui editor de texte,similara
programelor de editare text(programelor de procesare a textului). Programatorii scriu programul intrun editor asemanator unui autor ce scrie o carte.Programul este salvat pe hard disk intr-un fisier
denumit fisier sursa.Fisierul sursa contine codul sursa al programului.Codul sursa trebuie sa respecte
toate regulile de ortografie,sintaxa,si punctuatie a limbajului de programare.Unele editoare de text
cunosc regulile de sintaxa,punctuatie,si ortografie pentru mai multe limbaje de programare pe
calculator,astfel ca ele pot corecta codul sursa asa cum procesoarele de text pot verifica ortografia si
gramatica.

1.2.7 Diferentele dintre limbajele de programare


Limbajele de programare mai sunt caracterizate de modul in care un calculator intelege limbajul.Unele
limbaje sunt compilate si altele sunt interpretate.Java este un limbaj compilat si interpretat.
Atunci cand un program ruleaza,a fost ceruta traducerea codului sursa a programului in limbajul binar
al calculatorului.Atunci cand a avut loc traducerea,programul este gata de utilizare.Modul in care un
15

Capitol 1: Ce reprezinta Java?


program este tradus determina daca este compilat sau interpretat de catre calculator.Creatorii
limbajului si ai programului ce realizeaza traducerea determina modul in care programul este tradus.
Limbaje compilate
Un compilator este un program cu scop special ce converteste intregul fisier din cod sursa in limbajul
binar al unui CPU.Fisierul ce contine codul compilat mai este cunoscut ca si fisier
executabil.Majoritatea compilatoarelor vor denumi noul fisier cu acelasi nume precum originalul si
adauga sufixul .com,.exe,sau .bin.Fiecare compilator este proiectat pentru a traduce codurile sursa
pentru a se conforma limbajul nativ al calculatorului.Programatorii trebuie sa inteleaga regulile
compilatorului pentru fiecare masina pe care vor sa ruleze un program.
Programatorul ruleaza apoi fisierul cu codul compilat si calculatorul efecteaza functiile definite in
fisierul sursa.De fiecare data cand programul ruleaza,calculatorul citeste fisierul cu codul compilat
pentru a gasi instructiunile de cod nativ necesare pentru rularea programului.Codul sursa trebuie sa fie
compilat o singura data si apoi programul compilat poate rula de mai multe ori.
Programul va rula dupa ce fiecare instructiune a fost compilata corect.Prima data cand un programator
scrie un program,apar uneori erori in fisierul sursa.Compilatorul le detecteaza si listeaza aceste
erori.Programatorul trebuie sa parcurga erorile de compilare,sa editeze fisierul sursa,si sa compileze
fisierul sursa pentru ca programul sa compileze cu succes.Pe masura ce programatorii devin mai
experimentati cu un limbaj de programare,acest proces este de obicei scurtat.
Limbaje interpretate
Atunci cand un limbaj este interpretat,calculatorul analizeaza fiecare instructiune din fisierul cu codul
sursa in timp ce programul ruleaza.Interpretatorul de limbaj converteste fiecare instructiune din fisierul
sursa in cod nativ pentru calculator si ruleaza acea instructiune.
Cu un limbaj interpretat,calculatorul analizeaza fiecare instructiune din fisierul sursa pe parcurs ce
programul ruleaza.De fiecare data cand un program este rulat,trebuie sa treaca prin acest proces.Un
dezavantaj al unui limbaj interpretat este acela ca daca un program repeta o instructiune,interpretatorul
trebuie sa reanalizeze si sa converteasca acea instructiune in cod nativ inainte sa fie rulat.Majoritatea
limbajelor compilate se executa mai rapid decat programele interpretate.Un avantaj al limbajelor
interpretate este acela ca programatorul poate introduce la un momentdat o instructiune de la tastatura
si nu trebuie sa scrie un fisier care contine cod sursa.Astfel limbajele interpretate devin foarte populare
datorita programelor mici ce indeplinesc un numar limitat de sarcini asociate.
Exemple de limbaje interpretate includ JavaScript,VBScript,si HMTL.JavaScript si HTML sunt
limbaje ce sunt folosite des pentru dezvoltarea paginilor Web pentru Internet,si VBScript este des
folosit pentru dezvoltarea aplicatiilor de business pe calculatoare ce folosesc Microsoft
Windows.Trebuie sa luati in considerare faptul ca JavaScript nu este asociat cu limbajul de programare
Java,cu exceptia asemanarilor de sintaxa.

16

Capitol 1: Ce reprezinta Java?

1.3.1 Istoria limbajului Java


In 1991,o echipa de ingineri Sun,condusi de Patrick Naughton si James Gosling,au proiectat un limbaj
de calculator cu scop special.Acest nou limbaj a fost folosit pentru a programa echipamentele electrice
de consum precum telecomenzile TV.Pentru a lucra cu toate tipurile de echipamente,limbajul trebuia
sa fie portabil.Aceasta insemna ca trebuia sa fie capabil sa ruleze pe mai multe tipuri de
procesoare.Limbajul trebuia sa creeze programe ce erau mici datorita resurselor limitate in
echipamente electronice.Trebuia sa fie si usor de programat.Desi acest limbaj nu a fost un mare
succes,Java este acum folosit pentru a programa multe echipamente tinute in mana precum mobilele si
PDA-urile.
Pe masura ce utilizarea Internetului crestea,a devenit clar ca Java ar putea fi folosit pentru a programa
pagini Web.Programele Java mici si eficiente denumite applet-uri ar fi putut fi descarcate de pe
Internet.Aceste applet-uri au oferit programatorilor Web mai multa flexibilitate si mai multe elemente
grafice decat HTML.Portabilitatea Java a permis dezvoltarea solutiilor business ce foloseau Java
pentru calculatoare conectate la Internet.Cea mai timpurie utilizare a limbajului a fost odata cu
eliberarea browser-ului Netscape in 1996.Toate versiunile acestuia si ale browser-ului Microsoft
Internet Explorer sunt active-Java.
Pe masura ce programatorii au creat applet-uri Java mai mari si mai complexe,era necesar mai mult
timp pentru descarcarea lor.Applet-urile Java au fost curand inlocuite cu alte limbaje de programare
precum JavaScript si Flash.Acestea erau mai usor de folosit de catre nonprogramatori precum artistii
grafici.
Desi applet-urile Java au fost inlocuite,Java inca mai este folosit ca un limbaj de programare.De
fapt,este unul dintre limbajele cel mai des folosite pentru crearea aplicatiilor business.Java este de
obicei folosit pentru crearea aplicatiilor de scala-larga precum acelea folosite pentru rularea si
accesarea datelor de pe calculatoarele din retea.

17

Capitol 1: Ce reprezinta Java?


Java este un limbaj dinamic.Cantitatea programelor prescrise din API Java s-a dublat cu fiecare
versiune noua.
Autorii Java au descris limbajul Java ca, "Un limbaj simplu,orientat-pe-obiecte,inteles-inretea,interpretat,robust,sigur,neutru-din-punct-de-vedere-arhitectural,portabil,de performante mari,cu
multe threaduri,dinamic".
Urmatoarea sectiune trece in revista cateva tipuri de aplicatii ce au fost create cu limbajul Java.
Nota:De ce a fost ales numele de Java pentru acest limbaj?Numele original era Stea Sapte (*7). Atunci
cand dezvoltatorii nu au acceptat acest nume,a fost ales numele OAK.Deoarece un alt limbaj se mai
numea OAK,a fost ales numele Java.
Versiunile limbajului Java:

18

Capitol 1: Ce reprezinta Java?

1.3.2 Java ca un limbaj de programare


Java este acum folosit pentru crearea programelor de sine statatoare ce ruleaza pe calculatoare de orice
marimi.Acestea pot fi PDA-uri,mobile,sau orice alt tip de dispozitiv.Limbajul mai poate fi folosit
pentru crearea unei aplicatii bancare ce administreaza milioane de tranzactii.Aplicatiile de e-commerce
folosesc programe Java pentru a permite bunurilor si serviciilor sa fie cumparate si vandute prin
Internet.Aceste programe folosesc biblioteci Enterprise Java Beans,Java Beans,si Remote Method
Invocation (RMI)pentru a suporta aceste aplicatii.Aceste utilitare sunt discutate mai tarziu in acest
curs.
Un programator trebuie sa fie familiar cu
termenii comuni folositi in industrie.Acesti
termeni descriu ceea ce un programator
poate realiza cu Java.Pe masura ce mai
multe detalii ale limbajului Java sunt
explorate,acesti termeni devin mai clari.
Internetul contine multe informatii despre
Java,functiile sale,si modul de utilizare.

Avantaje Java:

19

Capitol 1: Ce reprezinta Java?

Pagini web la care se gasesc resurse Java:


http://www.oracle.com/technetwork/java/index.html

20

Capitol 1: Ce reprezinta Java?

1.4.1 Prezentare generala


Atunci cand dezvoltarii Java au creat programe pentru controlul echipamentelor tinute in mana,ei au
trebuit sa ia in considerare limitarile de putere si memorie ale echipamentelor mici.Limbajul nu putea
fi limitat la un singur tip de CPU din moment ce producatorii puteau alege CPU-uri diferite.Astfel s-a
ajuns la proiectarea unui limbaj portabil ce putea rula pe orice platforma.Limbajul trebuia sa genereze
cod pentru un calculator numit masina virtuala.
Masinile virtuale reprezinta programe software ce controleaza comunicatiile dintre aplicatiile scrise
pentru un echipament de tinut in mana si hardware si SO.Programatorul trebuie sa scrie programe ce
sunt intelese de catre masinile virtuale.Acesta este apoi translatat de catre masinile virtuale in cod ce
este inteles de hardware-ul si SO-ul din echipament.Exista masini virtuale Java pentru majoritatea
sistemelor de operare bine-cunoscute precum Solaris,Windows,Linux,si Mac OS.
Inainte de folosirea masinilor virtuale,programele trebuiau sa fie rescrise pentru fiecare tip de CPU.De
exemplu,un program scris in C++ trebuia sa fie rescris si recompilat pentru a rula pe un
Macintosh.Acesta necesita mult timp.Programatorii trebuiau sa scrie codul si sa intretina codurile
pentru versiuni diferite de hardware si de sisteme de operare.In cazul in care companiile schimbau
calculatoarele,o cantitate mare de bani era necesara pentru crearea programelor pentru calculatoare
noi.
Masina virtuala a schimbat toate acestea.Un programator poate scrie un program in limbajul masinei
virtuale si sa il ruleze pe orice calculator ce are o masina virtuala.Masina virtuala citeste si
interpreteaza programul si apoi traduce codul in limbaj hardware.Un program ce este creat si testat pe
un calculator Apple poate fi acum incarcat si rulat pe o masina UNIX sau pe o masina Intel cu
software Windows.Toate aceste masini au o masina virtuala ce poate intelege aplicatia si traduce
instructiunile sale pentru CPU.

21

Capitol 1: Ce reprezinta Java?

1.4.2 Masina virtuala Java


Masina Virtuala Java (Java Virtual Machine - JVM)este un program ce ruleaza pe toate
calculatoarele.JVM creaza simularea software a CPU-ului si a memoriei.Controleaza toate
comunicatiile dintre un program Java si SO si hardware.Necesitatea de intelegere si scriere a codului
pe o platforma hardware trece de la programatorul aplicatiei la programatorii JVM.
Un programator Java scrie un fisier cu cod sursa Java si compileaza codul cu un compilator
Java.Compilatorul Java traduce programul in cod de biti ce va fi inteles de catre JVM in loc de codul
nativ ce este inteles pe fiecare calculator.JVM-ul ia codul de biti si il traduce in cod binar pentru CPUul ce este folosit pentru a rula programul.Codul binar mai este cunoscut ca si cod nativ sau cod
procesor.In versiuni mai vechi decat Java 1.2,JVM-ul are in principiu un interpretator pentru codul de
biti si nu un compilator pentru codul de biti.Versiunile curente de Java includ un compilator la-timp
HotSpot.Compilatorul HotSpot permite JVM-ului sa compileze codul de biti in cod nativ pentru un
CPU.

22

Capitol 1: Ce reprezinta Java?

23

Capitol 1: Ce reprezinta Java?

1.4.3 Cum ruleaza un program Java pe calculator


Exista trei pasi folositi pentru crearea si rularea unui program Java:
1.Crearea fisierului sursa
2.Compilarea fisierului sursa
3.Rularea programului
In primul rand,creati un fisier sursa ce contine instructiuni pentru programul in limbaj Java.Fisierul
sursa este un fisier text simplu ce poate fi creat cu orice editor de text.Un editor de SO Windows poate
fi WordPad,Notepad,sau TextPad.Pe un sistem UNIX editorul poate fi vi.Acest fisier text trebuie
intotdeauna sa aiba .java ca si sufix al numelui de fisier.Sufixul unui numele de fisier este denumit
extensia fisierului.Acesta se gaseste dupa punctul din numele de fisier.
Imaginati-va ca un student scrie un program ce creaza si intretine un director pentru toti studentii
dintr-o clasa Java.Pentru a denumi programul StudentDirectory,fisierul cu codul sursa trebuie denumit
StudentDirectory.java.Exista conventii de codare pe care multi dezvoltatori Java le folosesc pentru a
scrie primul lor cod.In acest exemplu,numele fisierului este construit din doua substantive si prima
litera a fiecarui cuvant este majuscula.
Al doilea pas este de compilare a codului sursa in cod de biti pentru JVM.Compilatorul Java este
denumit javac.Acest program traduce din codul sursa in cod de biti.Compilatorul javac este localizat in
directorul bin al SDK-ului Java.Fisierul ce reprezinta programul javac este executabilul
javac.exe.Compilatorul Java creaza un fisier cu acelasi nume ca si fisierul sursa cu sufixul .class.
Daca nu exista erori de compilare,al treilea pas este de a porni JVM si de a-l instrui sa ruleze
programul.Programul java.exe este folosit pentru lansarea JVM si oferirea unui fisier .class pentru a
rula.Acest program este de obicei cunoscut ca si executabil.Poate fi gasit in directorul bin al SDK-ului
Java.Executabilul java.exe necesita fisierul .class pentru a indeplini unele conditii.Programul java.exe
poate fi rulat din linia de comanda a oricarui SO.Laboratoarele din acest modul exploreaza mai multe
modalitati de a rula acest program.Regulile folosite pentru a rula java.exe sunt aceleasi pentru toate
CLI-urile.Programul java.exe necesita ca utilizatorul sa-i ofere numele fisierului Java .class ce va rula
pe JVM.Acest fisier .class trebuie sa defineasca un set de instructiuni ce sunt etichetate ca si metoda
main(). Conceptul metodelor si regulilor folosite pentru a defini metode va fi explorat in acest
curs.Studentii ar trebui sa ia in considerare ca programul java.exe necesita un fisier .class ce contine
metoda main().
JVM-ul interpreteaza codul de biti ai fisierului .class in limbajul unei masini.Un programator trebuie
sa compileze fisierul sursa si apoi poate sa il ruleze de mai multe ori pe mai multe calculatoare.
Urmatoarea sectiune va trece in revista sintaxa si vocabularul de baza Java.Se va pune accent pe pasii
folositi pentru crearea unui program simplu Java.
24

Capitol 1: Ce reprezinta Java?


Avem codul sursa Java Ex:
public class FirstProgram{
public static void main(String args[] ){

}
}
In urma compilarii,obtinem un fiiser in Bytecode,cod inteles de catre JVM.

1.5.1 Organizarea resurselor pentru crearea unui program Java


In aceasta sectiune,studentii vor scrie si rula primele lor programe Java.Studentii vor scrie multe
programe Java in acest curs.Daca motivele pentru unii dintre pasi sunt neclare,acestea se vor lamuri pe
masura ce studentii vor progresa in acest curs.Scopul acestei sectiuni este de a introduce utilitarele
folosite pentru dezvoltarea programelor Java si de a accentua procesul folosit pentru a scrie,depana,si
pentru a rula un program simplu Java.
In primul rand selectati utilitarele folosite pentru crearea,editarea,compilarea si rularea
programului.Dezvoltatorii limbajului Java au furnizat un set de utilitare pentru a ajuta utilizatorii in
compilarea,editarea,si documentarea programelor.Aceste utilitare nu includ un editor de text pentru
crearea codului pentru program.Mai jos veti gasi o lista de elemente necesare pentru a dezvolta un
program Java:
25

Capitol 1: Ce reprezinta Java?

- Utilitarele necesare rularii unui program Java sunt un compilator si JVM.Codul sursa Java este mai
intai compilat in cod de biti,care este apoi interpretat si convertit in cod nativ de catre JVM.Sun
Microsystems ofera programatorilor Java un set de utilitare ce sunt folosite pentru dezvoltarea si
rularea programelor Java.Acestea includ un compilator si JVM.Aceste programe si biblioteci Java
formeaza Java Development Toolkit (JDK). JDK-ul a evoluat cu fiecare versiune a JVM-ului.Toolkitul curent este denumit Java 2 Software Development Kit (J2SDK). JDK este de obicei folosit pentru a
face referire la toolkit.J2SDK poate fi descarcat gratis de pe site-ul web Sun Microsystems
http://java.sun.com si Java Software Development Kit (SDK)poate fi descarcat de pe acest site
web.Majoritatea fisierelor se extrag singure si se instaleaza cu un program util de instalare.

- Selectati un editor pentru a crea codul sursa Java pentru program.Editorul poate fi un program
simplu precum Notepad,WordPad,TextPad,vi,Emacs,sau un program software Integrated
Development Environment (IDE)precum BlueJ.Unele editoare sau IDE-uri pot ajuta cu
sintaxa,punctuatia,si vocabularul Java.

- Creati un director pentru a stoca fisierele sursa si fisierele .class.Dezvoltarea programului este mult
mai usoara atunci cand fisierele sunt organizate.

1.5.2 Dezvoltarea programelor folosind Java Development Kit (JDK)


Majoritatea utilizatorilor de calculator sunt familiarizati cu mediile SO-ului ce le permit sa lanseze un
procesor de cuvinte,sa navigheze pe Internet,sau sa trimita e-mail-uri.Linia de comanda este o interfata
mai veche.Comenzile sunt introduse pentru a rula programe.Interfata cu linia de comanda difera de la
un SO la altul.Mediul Windows ofera o fereastra de comenzi cu un prompt pentru ca utilizatorul sa
introduca comenzile.Mediile UNIX ofera ferestre similare,care sunt adesea referite ca si command
shell.
Linia de comanda este locul de interactiune al programatorul cu SO-ul calculatorului.Pentru accesarea
liniei de comanda de pe un calculator cu SO Windows,deschideti o fereastra cu prompt DOS.Pe
anumite calculatoare,o iconita pentru fereastra de comanda este oferita pe desktop,sau in meniul Start
din bara de sarcini.Pentru o masina Apple sau UNIX,deschideti fereastra consolei sau a
terminalului.Atunci cand java este introdus in promptul de comenzi,va aparea ecranul de ajutor pentru
comanda java.Intr-un mediu UNIX,linia de comanda este o fereastra consola ce apare in promp-ul de
shell.
J2SDK ofera toate utilitarele necesare dezvoltarii unui program Java.Toate utilitarele din J2SDK
ruleaza numai intr-o fereastra in linie-de-comanda.Pentru accesarea acestor utilitare pe un
PC,deschideti o fereastra MS-DOS.Deschideti o fereastra in linie de comanda pentru o masina Apple
sau UNIX.Cele doua utilitare cu care ar trebui sa va familiarizati sunt javac.exe,care este Java
Compiler,si java.exe,care este executabil pentru JVM.
SO-ul oricarui calculator va localiza si rula un program intr-una sau doua modalitati.Programul este fie
in directorul din care comanda este executata,sau intr-un alt director,care furnizeaza numele
26

Capitol 1: Ce reprezinta Java?


fisierului.Daca studentii introduc javac in linia de comanda si apare un mesaj de eroare,pot exista doua
probleme.SO-ul poate ca nu stie unde este localizat javac.exe.Aceasta problema este usor de
rezolvat.Studentii pot adauga locatia unui fisier in fata numelui de fisier sau pot edita variabila path.A
doua problema este ca J2SDK s-ar putea sa nu se fi instalat corespunzator.
SDK-ul Java nu ofera un editor sau un IDE pentru crearea programelor.

27

Capitol 1: Ce reprezinta Java?

1.5.3 Elementele unui program simplu Java


Acest curs demonstreaza studentilor cum sa foloseasca limbajul Java pentru a realiza atat sarcini
simple cat si complexe.In primul rand studentii trebuie sa inteleaga elementele unui program
Java.Programul Java SayHello va fi folosit pentru a explora cateva dintre elementele limbajului.
Toate
limbajele
de
programare
au
cinci
elemente
de
baza.Acestea
sunt
vocabularul,identificatorii,punctatia,operatorii,si sintaxa.Din moment ce este prima data cand studentii
observa un program Java,multe dintre vocabular,sintaxa,si punctuatie vor fi noi pentru ei.Toate
elementele limbajului sunt explicate mai detaliat in modulele urmatoare.In acest moment,studentii ar
trebui sa invete cum sa compileze si sa ruleze un program Java.

28

Capitol 1: Ce reprezinta Java?

Programul exemplificat aici descrie un obiect denumit SayHello.Acest obiect contine unele date
precum un nume,un numar,si un mesaj si stie cum sa printeze aceste date in consola.
Figura ilustreaza codul sursa din programul SayHello.Dati click pe elementele numarate pentru a
invata despre elementele programului.Exista cateva puncte cheie in acest exemplu:
29

Capitol 1: Ce reprezinta Java?

- Comentariile reprezinta o parte importanta a fiecarui program.Programatorii folosesc comentarii


pentru documentatie si pentru a ajuta sa explice ce trebuie sa faca programul.

- Fiecare fisier cu cod sursa Java defineste una sau mai multe clase.Priviti o clasa ca un negativ al unui
obiect.Fiecare clasa are un nume unic si codul sursa al unei clase trebuie sa fie stocat intr-un fisier
sursa ce are acelasi nume ca si clasa.Daca o clasa este denumita SayHello,este salvata intr-un fisier
denumit SayHello.java.Numele fiecarei clase incepe cu o majuscula.Exista trei nume de clase in
programul SayHello Acestea sunt String,System si SayHello.

- Clasele contin atat date cat si metode.Datele pot fi numere,caractere,sau alte obiecte.Metodele sunt
parti de cod ce ii spun obiectului ce sa faca cu datele din obiect.

- Clasa SayHello are o metoda denumita main(). Metoda main() dintr-un program Java are o definitie
unica.Este punctul in care JVM-ul incepe sa citeasca si sa ruleze programul.Atunci cand studentii isi
scriu propriile clase si definesc metode in aceste clase,vor observa ca exista multe modalitati de a scrie
o metoda.Fiecare metoda are proprietati unice precum numele sau si datele oferite la intrare
metodei.Aceste proprietati mai sunt denumite si semnatura metodei.Semnatura metodei poate fi
inteleasa ca identificatorul unic al unei metode.Metoda main() trebuie sa aiba o semnatura de metoda
astfel incat JVM sa o gaseasca.Exista doua modalitati de a scrie semnatura metodei pentru metoda
main.Acestea sunt ilustrate in Figura .
Nota : Parantezele ( [] ) sunt intr-un alt loc in cele doua semnaturi de metoda.Fiecare modalitate este
corecta si studentii ar trebui sa fie constienti de ambele.

- Simbolul unui punct ( . ) are un rol special in limbajul Java.Este denumit operatorul punct.Acesta
permite programatorului sa acceseze metode sau obiecte din alte obiecte.In programul SayHello,cele
doua puncte din System.out.println ii spun compilatorului Java ca este nevoie de folosirea metodei
println in obiectul out gasit in clasa System.Acestea vor fi explicate in modulele urmatoare.

1.5.4 Trei pasi pentru crearea si rularea unui program Java


Recapitulati cei trei pasi utilizati pentru
crearea si rularea unui program Java:
1.Creati codul sursa cu un editor.Codul sursa
este stocat intr-un fisier java Din moment ce
programul Java SayHello a fost creat,Pasul 1
este terminat.Acesta este ilustrat in Figura

30

Capitol 1: Ce reprezinta Java?


2.Compilati codul sursa pentru a crea codul de biti cu programul javac.Codul de biti este stocat intr-un
fisier .class.Acesta este ilustrat in Figura .

- Introduceti comanda javac SayHello.java.Acest program va crea un fisier cu cod de biti cu acelasi
nume ca si fisierul cod sursa si cu sufixul .class.Java este un program case sensitive.Atunci cand
programul este compilat,in cazul in care comanda javac sayhello.java este introdusa,numele fisierului
sursa nu se va potrivi cu numele clasei din codul sursa.Compilatorul javac va printa un mesaj de eroare
si fisierul SayHello.java nu va fi compilat.

- Verificati daca fisierul .class a fost creat.Introduceti comanda dir SayHello.Fisierul SayHello.class
exista.In acest exemplu fisierul .java si fisierul .class sunt salvate in acelasi director.Pentru a localiza
aceste fisiere,utilitarele Windows sau linia de consola pot fi folosite pentru a accesa directorul in care
fisierul SayHello.java este salvat.Fisierul SayHello.class va fi de-asemenea salvat in aceasta locatie.
3.Rulati programul.Acesta este ilustrat in Figura

- Introduceti comanda java SayHello.Aceasta comanda va functiona numai daca utilizatorul este in
acelasi director in care fisierul SayHello.class este localizat.

- Recapitulati rezultatele programului atunci cand acestea sunt afisate.

31

Capitol 1: Ce reprezinta Java?

1.6.1 Ce reprezinta un IDE?


Multe aplicatii Java contin sute de obiecte Java si sute de fisiere sursa Java.Crearea,editarea,si
administrarea codului sursa Java si a fisierelor clasa pot fi dificile pentru un astfel de proiect
mare.Atunci cand aceste fisiere sunt organizate,programatorii inteleg mai usor rolul tuturor
claselor,relatiile lor cu fiecare,si care dintre ele pot fi refolosite.Multe utilitare software sunt proiectate
pentru a ajuta programatorii sa administreze,sa intretina,si sa creeze cod sursa Java.Acestea sunt
cunoscute ca si IDE-uri.IDE-urile pot integra un procesor de cuvinte,un SDK,o fereastra pentru a afisa
rezultatele,si utiliare pentru a crea GUI-uri.Multe dintre acestea ofera drag and drop si simboluri GUI
pentru proiectarea claselor Java.Unele colecteaza informatii despre definirea claselor pentru crearea
fisierului sursa si generarea codului limbajului Java.Tot ce programatorul trebuie sa faca este sa
adauge orice detalii sau schimbari.
Multe IDE-uri permit unui programator sa planuiasca o aplicatie cu simboluri ce pot fi dragged and
dropped intr-un GUI.Aceste simboluri pot fi conectate pentru a ilustra modul in care clasele
relationeaza si comunica intre ele.IDE-ul va crea fisierele sursa pentru fiecare dintre simbolurile unui
set de sabloane.Programatorul trebuie sa descrie functia fiecarui obiect si sa adauge comentarii pentru
urmatorul programator.Exista un limbaj de simboluri ce s-a dezvoltat in jurul programarii orientate-peobiecte.Se numeste Unified Modeling Language (UML).

1.7.1 Modificarea programului HelloStudent pentru a primi date la rulare


In aceasta sectiune,programul SayHello va fi modificat pentru a citi datele din linia de comanda,sau
din mediul de rulare in BlueJ.Cel mai comun rol al unui program este de a primi date de intrare de la o
sursa precum linia de comanda,un fisier,sau alt program.Apoi va efectua calcule pe baza acelor date si
trimite rezultatele consolei,fisierului,sau programului.

Fereastra consolei folosita pentru compilarea si rularea programelor este un program ce ruleaza pe
calculator.Fereastra liniei de comanda este consola.Fereastra proiectului BlueJ ofera acces la o
fereastra terminal pentru afisarea rezultatelor programului.Linia de comanda accepta textul ca si mesaj
de intrare si poate trimite acel mesaj altor programe si urmatorului program Java.In BlueJ,selectarea
metodei main() pentru o clasa deschide o fereastra in care utilizatorul poate introduce date.
Programul consolei preia tot textul in linia de comanda si interpreteaza primul cuvant ca si numele
unui program si restul cuvintelor ca si parametri de intrare pentru acel program.Atunci cand java
SayHello "Fred Smith"este introdus in linia de comanda,programul consolei ii spune sistemului de
operare sa execute un program denumit java cu parametrul de intrare SayHello "Fred Smith". In
32

Capitol 1: Ce reprezinta Java?


BlueJ, "Fred Smith"este introdus ca si date intre parantezele metodei main(). Datele trebuie sa fie
introduse intre ghilimele (""). Programul Java incearca sa ruleze programul SayHello cu parametrul
de intrare "Fred Smith".
Studentii vor invata mai multe despre metode in urmatoarele module.Mai jos este un exemplu pentru a
va ajuta cu acest laborator.Pentru a observa modul in care programul Java va primi mesajul ce contine
"Fred Smith,studentii trebuie sa inteleaga mai multe despre sintaxa metodei main(), si despre rolul
acestei metode intr-un program Java.Metoda main() este adesea referita ca si punctul de start al unui
program Java.Unele clase Java nu au o metoda main(). Numai clasele ce reprezinta punctul de start al
unui program au nevoie de aceasta metoda.Executabilul java.exe cauta metoda main() intr-o
clasa.Atunci cand programul java.exe este rulat,si un fisier java.class este oferit cu parametrii de
intrare,precum "Fred Smith", programul java.exe trimite datele de intrare metodei main().
Metoda,stocheaza aceste data intr-un loc din memorie numit args.
Definitia metodei main() este urmatoarea:
public static void main (String[] args)
Exista cateva puncte cheie de retinut pentru acest laborator:

- Toate metodele primesc datele de la intrare sub forma unei liste de argumente.Lista de argumente
reprezinta textul din interiorul parantezelor dupa numele metodei.Pentru metoda main(), lista de
argumente este String[] args.
- Lista de argumente pentru o metoda este o lista de perechi de cuvinte.Primul cuvant identifica ce tip
de date trebuie sa fie si al doilea cuvant este identificatorul,sau numele,unui argument.In metoda
main(), identificatorul datelor de intrare este args si tipul datelor este String array.

- Un vector este o lista de elemente care sunt de acelasi tip.Un vector de String-uri este o lista de
obiecte String.Un obiect String contine text.Parantezele drepte ( [] ) sunt operatorii ce indica un vector
in Java.Acestia pot fi plasati langa identificatorul vectorului,sau pot aparea langa numele tipului de
elemente din vector.In acest exemplu,String[] args sau String args[] inseamna un vector de obiecte
String.Acum este clarificat motivul pentru care exista doua modalitati de a scrie metoda main().

- Din moment ce un vector este o lista de elemente,trebuie sa existe o modalitate de a spune


programului sa sa uite la primul,al cincelea,sau ultimul element din lista.Folositi un index pentru a
accesa orice element din vector.Un index este un numar ce corespunde pozitiei unui element in
vector.Numararea vectorilor incepe de la zero in loc de unu.Acest lucru ar putea deruta programatorii
noi.Primul element din vectorul de String-uri este args[0]. Al doilea element este args[1]. Al treizecisi-saptelea element este args[36]. Atunci cand studentii studiaza vectorii mai detaliat,ei vor invata de
ce indicii vectorilor incep de la zero.
33

Capitol 1: Ce reprezinta Java?


Pentru a termina exercitiul din linia de comanda java SayHello "Fred Smith", parametrul de intrare
pentru SayHello este convertit de catre JVM intr-un array de String-uri cu un element, "Fred Smith".
Daca ar fi fost mai mult text in linia de comanda,fiecare cuvant separat printr-un spatiu ar deveni un
element al vectorului.Daca java SayHello "Fred Smith" "John MacKenzie" "Peter Bull"ar fi fost scrise
in linia de comanda,vectorul de String-uri ar fi urmatorul:

- args[0]ar contine Fred Smith.


- args[1]ar contine John MacKenzie.
- args[2]ar contine Peter Bull.
1.8.1 Tipuri de erori in programe
Exista trei tipuri de erori de programare:

- Erori la compilare - Acestea sunt detectate de catre compilator.Ele nu permit compilatorului sa


creeze fisierul .class din codul sursa.

- Erori la rulare - Acestea au loc in timp ce programul ruleaza,dupa ce toate erorile de compilare au
fost corectate.

- Erori logice - Acestea nu sunt detectate de catre compilator.Ele au loc atunci cand un program nu
produce rezultatul intentionat.Daca un program este proiectat pentru a adauga doua numere,o eroare
logica este creata daca programatorul foloseste semnul minus (-) in loc de semnul plus (+).

1.8.2 Modificarea unui program Java pentru probleme de compilare


Majoritatea programatorilor gasesc unele erori comune in codurile pe care le creaza:

- Cuvinte cheie Java sau nume de clase scrise gresit


- Referinte inconsistente la identificatori
- Acolade deschise ( {} ), paranteze patrate ( [] ), sau paranteze
- Lipsa operatorului punct ( . )
34

Capitol 1: Ce reprezinta Java?

- Lipsa semnului punct si virgula ( ; )


Majoritatea acestor erori au loc atunci cand regulile de sintaxa ale limbajului nu sunt
respectate.Compilatorul javac identifica aceste erori si afiseaza mesajele pentru a ajuta programatorii
sa le gaseasca si sa le corecteze.Toti programatorii trebuie sa devina familiari cu mesajele de eroare ale
compilatorului.
Cea mai buna modalitate de a reduce numarul de erori este aceea de a invata cele cinci elemente ale
unui limbaj de programare:

- Vocabularul este setul de cuvinte cheie folosite in cadrul limbajului.


- Punctuatia reprezinta simbolurile folosite de catre limbaj.
- Identificatorii sunt numele folosite pentru referinta datelor stocate in memoria calculatorului.
- Operatorii sunt comenzi sau simboluri folosite pentru procesarea datelor.Unele simboluri ce sunt
folosite pentru activitati aritmetice sau pentru testarea datelor sunt +,*,%,!,>.
- Sintaxa reprezinta gramatica sau regulile de folosire a acestor elemente.
Erori la compilare:

Exista alte metode pentru reducerea numarului de erori de compilare din program:

- Folosirea unui IDE pentru scrierea codului Java.Majoritatea IDE-urilor coloreaza elementele diferite
ale limbajului pentru a ajuta programatorii sa gaseasca erori.Ele si atentioneaza programatorii inainte
de a face erori simple de sintaxa precum parantezele deschise.

- Verificati ortografia tuturor cuvintelor cheie.


- Indentati codul sursa cu doua pana la patru spatii inainte de fiecare acolada.Astfel acoladele devin
mai usor de gasit si codul devine mai cursiv.
Cod sursa identat:
35

Capitol 1: Ce reprezinta Java?

- Asezati prima acolada pe aceeasi linie ca si declararea metodei.Deoarece acolada nu isi are propria
linie,mai multe linii pot fi vazute intr-o fereastra de editor.
Folosirea parantezelor:

- Notati comentariul dupa ultima acolda din exemplu.Folosirea unui astfel de comentariu la sfarsitul
acoladei pentru fiecare metoda o va face mai usor de gasit si de verificat acoladele din codul sursa.

- Pe masura ce studentii progreseaza pe parcursul acestui curs,unele dintre cele mai cunoscute
conventii sau stiluri de codare vor fi evidentiate.

- Verificati daca exista acolade si paranteze deschise.Retineti ca argumentele fiecarei metode sunt
incluse intre paranteze.

- Verificati ortografia si majusculele pentru identificatori,numele metodelor,si numele claselor din


program.Java este un limbaj case-sensitive.O clasa denumita String nu este acelasi lucru cu o clasa
denumita string sau STRING.Din moment ce metoda main() are o semnificatie speciala in Java,daca
programatorii scriu public static void MAIN (String[] args), compilatorul nu va crea metoda main() de
care JVM are nevoie pentru a rula programul.Va crea clasa cu o metoda denumita MAIN(), dar JVM
nu o va recunoaste.Astfel va aparea o eroare de rulare.

- Corectati codul inainte de a fi compilat.


- Cititi mesajele erorilor de compilare cu grija.
- Corectati erorile de compilare in ordinea in care au aparut.Incepeti cu prima eroare.Prima eroare de
compilare va cauza de regula alte erori de compilare.De exemplu,daca o acolada nu este
pusa,compilatorul nu stie unde se opreste o metoda si unde incepe alta.Aceasta poate cauza multe erori
de compilare.Daca studentii gasesc erori de compilare care nu au sens,recompilati codul cu rezolvarea
pe alocuri din erorile anterioare.Astfel unele erori ar putea disparea.

- Salvati codul sursa dupa ce l-ati modificat.Daca apar aceleasi erori de compilare,asigurati-va ca
schimbarile facute codului sursa au fost salvata in fisierul de cod sursa.Compilatorul Java citeste
fisierul de cod sursa.Compilatorul Java citeste fisierul cu cod sursa si nu ce este afisat in fereastra.
36

Capitol 1: Ce reprezinta Java?


Retineti ca fisierul .class sau codul de biti pentru JVM nu sunt create de catre compilator decat atunci
cand toate erorile de compilare sunt rezolvate.Studentii vor trebui sa compileze codul sursa,sa fixeze
erorile de compilare,si apoi sa recompileze codul sursa de mai multe ori inainte ca fisierul .class sa fie
produs.Dupa ce toate erorile au fost rezolvate,programul va compila corect.Un program poate compila
corect si inca sa nu efectueze sarcinile corecte.Pentru a crea un program ce ruleaza corect
programatorul va defini instructiuni pentru una sau mai multe sarcini.Programarea in Java include
metode ce folosesc pasi logici pentru a descrie instructiunile pentru una sau mai multe sarcini.
Depanarea unui program cu erori:

1.8.3 Modificarea unui program Java pentru probleme la rulare


Dupa ce un program a fost compilat,erorile de rulare pot aparea.In limbajul Java,erorile de rulare mai
sunt denumite exceptii deoarece ele creaza o exceptie de la mersul normal al programului.

37

Capitol 1: Ce reprezinta Java?


JVM-ul monitorizeaza fiecare program Java pentru exceptii si mesaje afisate atunci cand au
loc.Majoritatea programelor ce intalnesc exceptii sunt oprite.Unele dintre aceste erori pot fi anticipate
si evitate.Un programator poate scrie cod pentru a remedia exceptiile pe masura ce au loc.Unul dintre
beneficiile Java este setul de utilitare built-in ce controleaza exceptiile.
Un program se poate sa nu se intoarca la rezultatele asteptate dupa ce programul compileaza cu succes
si JVM-ul nu afiseaza nici un mesaj de exceptie.Astfel se ajunge la erori logice.Aceasta inseamna ca
instructiunile nu produc rezultatul asteptat.Va fi nevoie de o analiza a instructiunilor.Aceasta este
folosita pentru depanarea programului.
Exista mai multe modalitati de a depana logica unui cod.Cea mai comuna modalitate este aceea de
analizare a valorilor rezultatelor intermediare pentru asigurare.
Eroare la rularea programului:

38

Capitol 1: Ce reprezinta Java?

Rezumat
Programarea ofera un set de instructiuni logice pentru un calculator astfel incat acesta sa efectueze
sarcini.Limbajele care sunt folosite pentru programarea unui calculator pot fi procedurale sau
orientate-pe-obiecte.
Limbajele de programare procedurale sunt codate cu logica lineara.Fisierele sunt create folosind
compilatoare.FORTRAN si COBOL sunt limbaje procedurale.
Limbajele orientate-pe-obiecte precum Java sparg un program in obiecte ce efectueaza sarcini in
cadrul programului.
Java este atat compilat cat si interpretat.Comanda javac este folosita pentru a compila codul.Comanda
java este apoi folosita pentru a interpreta si a rula codul.
Un program Java poate fi creat cu un editor simplu precum Notepad sau un utilitar IDE precum
BlueJ.Programatorii folosesc utilitare ca ii ajuta sa produca programe mai rapid.BlueJ este un IDE
efectiv pentru a crea programe Java si pentru a invata limbajul Java.Limbajul Java include o biblioteca
de program cunoscuta ca si clase.Acestea formeaza Java API.
Programatorii trebuie sa corecteze erorile.Un tip de eroare este eroarea de compilare.Aceasta nu ii
permite codului sa fie compilat.Erorile de rulare sunt cauzate de exceptii ce se au loc in timpul rularii
programului.Erorile logice au loc daca un program nu indeplineste sarcinile pentru care a fost proiectat
sa le efectueze.

39

Capitol 2: Programarea orientata pe obiecte

Capitol 2: Programarea orientata pe obiecte


Prezentare generala
Programarea orientata pe obiecte (POO)este diferita fata de programarea procedurala.In acest
modul,studentii vor invata despre obiecte si clase.Pentru a crea programe Java,studentii vor trebui sa
inteleaga modul in care functioneaza obiectele si clasele,modul in care sunt create si modul in care
sunt folosite.Studentii vor mai invata cum sa foloseasca UML.UML este un standard folosit pentru
descrierea obiectelor.
Cuvinte cheie
- Obiect
- Clasa
- Atribute sau date ale unei clase
- Comportamente, operatii, si metode ale unei clase
- Instanta unei clase
- Semnatura metodei
- Argumentele metodei
- Metoda constructor
- Accesor, mutator si metode particularizate
- Valori intoarse de metode
- Relatii si asociatii intre obiecte
- Modificatori de acces
- Mostenire
- Modificarea si distrugerea obiectelor
- UML
- Incapsulare
- Ascunderea informatiilor
- Reutilizare

2.1.1 Limbaje procedurale versus limbaje OOP


Modulul 1 introduce programarea procedurala si cea orientata pe obiecte.
Un limbaj procedural creeaza un program in care sarcinile sunt descrise intr-o secventa logica.Atunci
cand programul ruleaza,instructiunile sunt executate in secventa definita in program.Toate datele
procesate sunt descrise in program.Ideea de baza este ca exista o singura modalitate pentru rezolvarea
fiecarei probleme.Programul trebuie sa fie modificat daca datele se modifica.Daca mai multe
programe sunt folosite pentru indeplinirea sarcinilor complexe,atunci aceste modificari vor trebui sa
fie incluse in fiecare dintre aceste programe.Din moment ce aceste modificari sunt de obicei
costisitoare si necesita mai mult timp,POO a devenit populara,in special pentru aplicatiile de business.
Limbajele POO descriu sarcinile ce trebuie sa fie indeplinite pe obiecte.Obiectele sunt create si apoi
stocate in memoria unui calculator.Fiecare obiect contine datele si instructiunile necesare pentru
40

Capitol 2: Programarea orientata pe obiecte


indeplinirea sarcinilor asociate.Atunci cand un program ruleaza,SO-ul incarca aceste obiecte si
efectueaza operatii pe ele cand este cazul.Programul este vazut ca o colectie de obiecte ce
interactioneaza intre ele.
POO este populara din mai multe motive.Din moment ce fiecare obiect este mic si
independent,software-ul scris in limbajele POO poate rula pe echipamente mici la viteze mari.Unele
obiecte ce au fost deja definite si testate pot fi refolosite pentru alte motive.Aceasta permite noilor
solutii sa fie proiectate la costuri mai mici si mai rapid.Productivitatea mai este imbunatatita deoarece
modificarile trebuie sa fie facute o singura data.Aplicatiile pot rula pe masini mai mici din moment ce
doar o copie a codului trebuie sa fie incarcata in memorie.
Abordarea procedurala este urmatoarea:

- Structurile de date pot fi reprezentate ca o retea de structuri asociate ce fac referire una la cealalta.
- Procedurile pot fi reprezentate ca o retea de rutine care se cheama apeleaza una pe cealalta,ca intr-un
arbore de apeluri.
Abordarea orientata pe obiecte este urmatoarea:

- Este o colectie de obiecte discrete ce incorporeaza structuri de date si comportamente asociate.


- Fiecare structura de date are proceduri care i se aplica.
- Aceasta abordare contrasteaza cu programarea conventionala,in care structurile de date si
comportamentul sunt slab conectate.

- Aceste entitati,care sunt denumite obiecte,pot fi asociate intre ele intr-o singura retea in loc de doua.
Cum sa bei dintr-o ceasca:

2.1.2 Terminologia de baza Java


41

Capitol 2: Programarea orientata pe obiecte


Cateva dintre conceptele si termenii comuni Java sunt:

- Obiecte - Acestea contin date si instructiuni de procesare a datelor.


- Clasa - Aceasta este o amprenta pentru un obiect.O clasa contine atributele si comportamentele
fiecarui obiect pe care-l defineste.

- Atribute - Acestea descriu starea unui obiect.Ele mai sunt denumite date.
- Tip de date - Acesta descrie tipul de date al unui atribut.
- Comportamente - Acestea descriu ce poate face un obiect.Ele mai sunt denumite metode.
- Metoda - Aceasta este un set de instructiuni efectuate de catre un obiect.
- Mostenire - Aceasta are loc atunci cand unele obiecte deriva atribute si comportamente din alte
obiecte.

- Incapsulare - Acest proces combina datele si metodele intr-o singura clasa.


2.2.1 Introducere despre obiecte
Aproape orice poate fi atins sau vazut este un obiect.O persoana,o masina sau un eveniment poate fi un
obiect.Acest concept este clarificat in Figura .

Figura

ilustreaza unele trasaturi ale obiectelor.

42

Capitol 2: Programarea orientata pe obiecte

Toate obiectele au atribute si comportamente.Figura ilustreaza cateva obiecte pe care un


programator le poate modela intr-un program orientat pe obiecte.Atributele sunt lucrurile care descriu
un obiect precum marimea,culoarea sau forma sa.De exemplu,un caine poate fi mare sau mic,negru
sau alb si slab sau gras.Comportamentele descriu ce fac obiectele.Un caine alearga,mananca si
doarme.Atributele mai sunt cunoscute si ca date.Comportamentele sunt referite ca si metode.Atunci
cand studentii folosesc Java pentru a descrie si interactiona cu obiecte,termenii date si metode vor fi
folosite mai des decat denumirile atribute si comportamente.

43

Capitol 2: Programarea orientata pe obiecte

Activitatea din Figura

va ajuta studentii sa inteleaga diferentele dintre atribute si comportamente.

2.2.2 Clasificarea obiectelor


44

Capitol 2: Programarea orientata pe obiecte


Obiectele unui calculator fac parte din trei categorii,dupa cum este ilustrat in Figura

- Obiectele interfetei cu utilizatorul - Acestea apar pe un ecran.Utilizatorii interactioneaza direct cu


ele.Aceste obiecte sunt de obicei denumite window gadget-uri sau widget-uri.Butoanele,scrollbarurile,casetele de text,listele cu alegeri,casetele de bifat,si butoanele radio sunt toate obiecte ale
interfetei cu utilizatorul.Pentru a crea GUI-uri,utilizatorii formeaza obiecte ce pot produce imaginea
widget-ului.Ele mai pot contine date despre utilizatori si pot interactiona cu obiecte ce pot procesa
intrarile utilizatorului.De exemplu,un scrollbar stie sa deruleze iar un buton poate fi apasat.Aceste
obiecte sunt ilustrate in Figura (Buton, Meniu, Fereastra etc).

- Obiectele mediului de operare - Acestea exista intr-o retea si sunt controlate de catre SO-ul unui
calculator.De exemplu,un server este un obiect ce furnizeaza servicii pentru alte obiecte,precum
obiectele software-ului.

- Obiectele referitoare la sarcini - Acestea sunt folosite pentru a efectua o activitate.Exista trei grupuri
de obiecte referitoare la sarcini:

-Documente - Acestea includ obiecte create de o aplicatie.World Wide Web este o colectie de obiecte
document.

-Multimedia -

Acestea includ obiecte precum clipuri cu


videoclipuri.Utilizatorii pot interactiona cu cateva din aceste obiecte.

sunet,imagini,animatii

si

-Domeniu de probleme - Acestea un obiect special creat pentru a indeplini nevoile


utilizatorului.Clientii,produsele,comenzile,angajatii,facturile,stocul,inventarul,elementele si rapoartele
sunt exemple de obiecte din domeniul de probleme.De exemplu,un obiect client contine datele despre
clienti.Atributele si comportamentele obiectului client se bazeaza pe ceea ce banca trebuie sa stie
despre client si ce trebuie sa faca pe baza acelor informatii.In aplicatia cu care vor lucra studentii in
acest curs,exista definitii pentru un obiect cont,un obiect client si un obiect banca.

2.2.3 Identificarea obiectelor


Pentru crearea oricarei aplicatii cu o abordare POO,obiectele trebuie sa fie in primul rand
identificate.Limbajul obiectelor este vocabularul folosit pentru a descrie obiectele si caracteristicile lor
in programare.Descoperirea rolului obiectelor este un proces ce poate ajuta utilizatorii sa defineasca si
sa identifice obiectele.

45

Capitol 2: Programarea orientata pe obiecte


Pentru identificarea obiectelor,un programator trebuie sa evalueze nevoile utilizatorilor.Aceasta este
etapa de colectare a cerintelor unui proiect.In urma acestei etape va rezulta de regula o lista cu obiecte
domeniu de probleme sau obiecte referitoare la sarcini.Pentru a indeplini cerintele
utilizatorului,programatorii pot avea nevoie sa defineasca obiecte precum ferestre,butoane si scrollbaruri pentru a permite utilizatorilor sa introduca date.Pentru a oferi utilizatorilor acces la datele din
fisiere,ei pot crea obiecte de medii de operare precum clienti si servere.Pentru a stoca datele,ei pot crea
obiecte ce scriu in fisiere sau baze de date.Interactiunea dintre toate aceste obiecte va rezulta intr-o
aplicatie POO.
Atunci cand un obiect este proiectat,va poate ajuta raspunsul la urmatoarele intrebari:
1.Care sunt atributele obiectului?
2.Care sunt comportamentele obiectului?
Aplicati aceste intrebari obiectelor interfata si celor din domeniul de probleme din Figurile

si

2.2.4 Definirea claselor de obiecte


Obiectele pot fi clasificate in categorii,precum este ilustrat in Figura 1.Camioanele,dubele si masinile
pot fi clasificate ca si vehicule.Obiectele apartin claselor.O masina este un obiect al clasei vechicul.O
clasa este o categorie generala si un obiect este o instanta specifica.O masina este o instanta a clasei
vehicul.
Urmariti exemplul din Figura . Fiecare buton este un obiect.Impreuna ele creaza o clasa.Fiecare
buton este si o instanta a clasei Button.

46

Capitol 2: Programarea orientata pe obiecte

O clasa de clienti poate defini toate caracteristicile comune ale clientilor.Ea caracterizeaza un tip de
client pentru un domeniu de probleme.Intr-un sistem de inregistrare la hotel,definitia clasei
HotelCustomer poate include atribute pentru numele,adresa,cartea de credit si preferintele de camera
ale fiecarei persoane.Definitia unei clase VideoStoreCustomer poate include atribute pentru
numele,adresa,limitele de inchiriere video si data de expirare a numarului de membru pentru fiecare
persoana.Definirea clasei InstantMessengerCustomer poate include atribute pentru numele,adresa de email si numele de ecran ale fiecarei persoane.
Obiectele ce vor fi folosite de catre aplicatie sunt instante ale clasei fiecarui client.Fiecare client ce
rezerva o camera la hotel este o instanta a clasei HotelCustomer.Fiecare client ce inchiriaza un film
este o instanta a clasei VideoStoreCustomer.Programatorul creeaza definitiile pentru clasele de tip
client pe baza datelor si metodelor din fiecare situatie.
Numele unei clase este cunoscut ca identificator.Un identificator reprezinta serii de caractere pe care
programatorul le foloseste pentru a denumi clase,obiecte si variabile.In Java,un identificator este
folosit pentru a denumi clasa,obiectul sau variabila stocata pe calculator atunci cand este necesar.
Fiecare obiect mai are o referinta obiect ce identifica unde este stocat in memorie.Referintele obiect
B1,B2,si B3 din Figura 2 sunt locurile in care obiectele sunt stocate in memorie.Aceste numere sunt
invizibile utilizatorului dar programatorii le pot folosi.Atunci cand programatorul se refera la
B2,programul stie unde sa localizeze butonul de continuare.

2.2.5 Construirea obiectelor


Pentru a crea un obiect este folosita o metoda speciala.Metodele sunt componente functionale ale unei
clasei Java.O metoda constructor este o metoda ce defineste modalitati de a crea un obiect.Metoda
constructor are acelasi nume ca si clasa.Cererea de creare a unui obiect este realizata prin cuvantul
cheie new . In figura alaturata este ilustrat un constructor. Ex: public class Customer

2.2.6 Folosirea unui obiect


Limbajele POO sunt puternice deoarece ele pot defini ce fac obiectele.Acesta este cunoscut ca si
comportamentul,operatiile sau metodele obiectului.Un obiect poate contine mai multe metode si poate
47

Capitol 2: Programarea orientata pe obiecte


avea aceeasi metoda definita in mai multe modalitati.Ganditi-va la o metoda ca la o procedura pas cu
pas folosita pentru a indeplini o sarcina.O metoda este uneori denumita procedura.Procedurile descriu
comportamentele obiectului cu reguli ale programarii procedurale.Programatorii POO vor scrie cod
procedural in metodele unei clase Java.
Metodele sunt bazate pe nevoile utilizatorului.De exemplu,magazinul video Hollywood Best poate
avea mai multe reguli de inchiriere a filmelor decat magazinul Videos4You.Ambele magazine au
nevoie de obiecte pentru a gestiona procesul de inchiriere.Metodele definite intr-o clasa a acestor
obiecte pot fi diferite pentru fiecare magazin. Ex de Metode: vezi public class VideoRented

Obiectele trimit mesaje si efectueaza proceduri pentru a interactiona.Aceste actiuni au loc in


metode.Un obiect trebuie sa stie identificatorul sau referinta altui obiect pentru a interactiona cu el.Un
identificator este numele dat de catre programator.Referinta unui obiect este locatia in memorie.Apelul
unei metode este un mesaj.Mesajul este trimis unui obiect cu semnatura metodei.Aceasta identifica
numele metodei si ofera datele definite in semnatura metodei.Mesajul ofera metodei datele necesare
pentru a efectua procedura.
Definitia unei metode trebuie sa includa un tip returnat.Compilatorul impune definirea unui tip
returnat pentru fiecare metoda.Asa cum atributele unei clase sunt definite in termenii tipului de date pe
care le stocheaza,metodele unei clase sunt de asemenea vazute in termenii tipului de date pe care le
returneaza.O metoda ce returneaza un double este referita ca si o metoda double.Acest lucru este
ilustrat in Figura . Atunci cand un obiect trimite un mesaj,el foloseste identificatorul sau referinta la
obiect,numele metodei,si mesajul pentru acea metoda.
Mai jos este un astfel de exemplu.Clasa VideoRented are o metoda chargeRent care va calcula taxa
pentru inchirierea unui film pe baza numarului de zile in care a fost inchiriat.Metoda va returna
rezultatul calculului din metoda chargeRent:

- Nume - chargeRent
- Datele necesare - numberOfDays
Aceasta va calcula o taxa si va afisa rezultatele.
Metodele ce schimba valorile datelor pentru un obiect se mai numesc mutatori.Aceste metode au
formatul setObjectData.Metodele ce primesc datele de la un obiect se numesc accesori.Aceste metode
au de obicei formatul getObjectData.ObjectData este identificatorul pentru valoarea ambelor metode
mutator si accessor.Acest identificator este definit ca un atribut pentru obiect.
Cum functioneaza metodele:
48

Capitol 2: Programarea orientata pe obiecte

49

Capitol 2: Programarea orientata pe obiecte


Clasa VideoRented poate avea atributele dateRented si dateDue.Clasa mai are si metodele accessor
pentru a obtine datele,metodele mutator pentru a schimba datele,si alte metode particularizate.Acestea
sunt ilustrate in Figurile pana la .

2.2.7 Incapsularea
Incapsularea ascunde detaliile unui obiect.Face obiectele robuste si nu permite altor obiecte sa
acceseze sau sa schimbe datele.Utilizatorii stiu numele metodelor din interiorul obiectului,dar nu si
modul in care metodele functioneaza.In majoritatea cazurilor,utilizatorii nu trebuie sa stie modul lor de
functionare.
Incapsularea inseamna de asemenea impachetare.Un obiect isi va avea datele si metodele impachetate
impreuna.Obiectul Client nu poate accesa atributul DateDue al obiectului VideoRented si nu ii poate
seta valoarea.Obiectul Client va avea nevoie sa trimita un mesaj obiectului VideoRented cu metoda sa
calculateDateDue.
Limbajele POO efectueaza incapsularea prin cuvinte cheie speciale pe care un programator le poate
folosi pentru a defini clasele.Java foloseste cuvintele cheie private,public si protected pentru a
identifica diferite niveluri de incapsulare pentru un obiect.Acesti identificatori se mai numest
modificatori de acces.Acestia definesc nivelul de acces la o clasa,la date sau la o metoda.Un obiect
incapsulat corespunzator va avea toate datele participante identificate ca private si majoritatea
accessorilor si mutatorilor identificati ca public.
Folositi activitatea din Figura pentru a identifica nivelul de acces permis de catre fiecare
modificator.Asezati fiecare element in locatia corecta.

Obiectele pot fi folosite chiar daca modul lor de functionare nu este cunoscut.Obiectele pot fi privite
ca niste cutii negre cu functionalitate.
O cutie neagra este un termen ingineresc.Ea functioneaza astfel:
1.Este introdus un element in cutia neagra.
50

Capitol 2: Programarea orientata pe obiecte


2.Elementul introdus este transformat in interiorul cutiei
3.Rezultatul transformarii este primit din cutie.
Un utilizator trebuie doar sa stie cum sa introduca un element in cutie si la ce sa se astepte in partea
cealalta.El nu trebuie sa cunoasca modul in care functioneaza cutia.

2.2.8 Relatii dintre obiecte


Un programator poate defini o clasa pentru a face referire la alte clase.Descrierea fiecarui tip de relatie
este dupa cum urmeaza:

- Relatii de legatura sau asociere - Aceasta inseamna ca un obiect stie despre existenta altui
obiect.Intr-un program al unui magazin video,obiectul VideoStoreCustomer stie despre obiectul
VideoRented.El cunoaste data inchirierii,data expirarii,data returnarii si suma datorata.Obiectul
VideoRented stie despre fiecare obiect de tip film care este inchiriat de catre un client.Obiectul de tip
film contine titlul,tipul,numarul copiei si ID-ul unic.Acestea sunt ilustrate in Figura .

- Relatii de tip parte-intreg - Aceasta inseamna ca un obiect nu poate exista fara un alt obiect.De
exemplu,obiectul VideoRented nu poate exista fara un VideoStoreCustomer.Datele despre inchirierea
unui film nu exista pana cand un client nu inchiriaza un film.Acestea sunt ilustrate in Figura 2.Relatiile
de legatura si cele de tip parte-intreg sunt ambele relatii de izolare.Ele nu implica mostenirea de
atribute sau comportamente de la alte clase.
51

Capitol 2: Programarea orientata pe obiecte

- Relatia "poseda un" - Aceasta inseamna ca un tip de obiecte contine un altul.O masina "poseda"un
motor si o bicicleta "poseda"o roata.Relatia "este un/o"inseamna ca obiectul este un element specific
unui grup general.O masina "este un"vehicul si o bicicleta "este un"vehicul.
- Relatii de mostenire - Programatorul poate defini o clasa ca parinte sau superclasa.Alte clase sunt
definite ca subclase ce preiau comportamente si atribute de la superclasa.Mostenirea permite
reutilizarea definitiilor clasei si imbunatatirea anumitor metode si comportamente pentru a asigura ca
programul este sigur.

2.2.9 Mostenirea
Mostenirea incorporeaza principiul reutilizarii al limbajelor POO.Ea defineste si relatia dintre
clase.Acest lucru este ilustrat in Figura .

De exemplu,un caine pe nume Rover este o instanta sau obiect al clasei GoldenRetriever.Rover
mosteneste atributele comune tuturor Golden Retriever-ilor.Golden Retriever-ii mostenesc atribute din
clasa Dog.Rover mosteneste comportamentele tuturor cainilor si ale tuturor Golden Retriever-ilor
(vezi figura ).

52

Capitol 2: Programarea orientata pe obiecte

Acest concept se extinde in lumea programarii prin folosirea POO.Java permite comportamentelor si
atributelor sa fie partajate intre clase prin mostenire.O subclasa are acces la datele si metodele
superclasei.Acest lucru este ilustrat in Figura .

53

Capitol 2: Programarea orientata pe obiecte


Proprietatile mostenirii mai sunt referite ca si relatii "este un/o". De exemplu,Rover "este un"Golden
Retriever.Un Golden Retriever "este un"caine.Aceasta relatie functioneaza intr-o singura directie.Un
caine nu este un Golden Retriever si un Golden Retriever nu este un Rover.Acelasi lucru este adevarat
si pentru obiectele si clasele din Java.O clasa ce depinde de alta clasa are o relatie de "este un/o", dar
reciproca nu este adevarata.
Relatiile de asociere si cele de tip parte-intreg sunt relatii "poseda". Un obiect din clasa Student este
legat de un obiect din clasa Teacher.Acest lucru este ilustrat in Figura . Ambele obiecte Student si
Teacher mostenesc clasa Person astfel incat ele au o relatie "este un/o"cu clasa Person.

2.2.10 Modificarea si distrugerea obiectelor


Uneori datele continute de un obiect nu pot fi modificate dupa ce obiectul este creat.In exemplul cu
inchirierea filmului,obiectul DateRented si referinta la obiectul VideoItem nu ar trebui sa se schimbe
odata ce obiectul VideoRented este creat pentru un client.Atunci cand un client inchiriaza un
film,informatiile si datele despre film nu se modifica.Pentru a asigura acest lucru,definitia unei clase
poate specifica optiunile de modificare a datelor obiectului.Limbajul Java foloseste cuvantul cheie
final pentru a preveni orice schimbari ale atributului unui obiect dupa ce a fost creat.
Obiectele sunt create in memorie.Pe masura ce sunt dezvoltate aplicatii mari si complexe,alte obiecte
pot fi necesare.Ce se intampla atunci cand un obiect nu mai este util si foloseste memorie ce ar putea fi
utilizata pentru a adauga un nou obiect?Unele limbaje POO necesita ca programatorul sa trateze toate
problemele de administrare a memoriei.Daca un programator omite sa distruga obiectele care nu mai

54

Capitol 2: Programarea orientata pe obiecte


sunt necesare sau distruge obiectele prea devreme,au loc bug-uri si pierderi de memorie (memory
leaks). Acest lucru cauzeaza programele sa esueze si utilizatorii devin frustrati.
Utilitare precum JVM administreaza memoria.Programatorul trebuie doar sa notifice JVM referitor la
obiectele care nu mai sunt necesare.Programatorul nu trebuie sa distruga obiectele sau sa administreze
memoria necesara obiectelor.JVM implementeaza un program ce administreaza alocarea memoriei
pentru obiecte,denumit garbage collector.Pentru a asigura ca doar obiectele necesare sunt pastrate si ca
memoria este folosita eficient,un programator poate defini metode pentru identificarea obiectelor
pentru distrugere.Programatorul nu are control asupra garbage collector-ului.In programe mici,este
posibil sa nu fie necesara niciodata rularea acestuia,din moment ce exista destula memorie pentru toate
obiectele din program.

2.3.1 Limbaje de modelare si simboluri


Exista multe concepte complexe folosite in POO.Acestea necesita un sistem uniform de simboluri si
termeni pentru a comunica proiectarea claselor si a programelor.Aceasta sectiune descrie un sistem
denumit Unified Modeling Language (UML).
Metodele de proiectare ale POO folosesc UML pentru a defini constructorii si modelele orientate pe
obiecte.UML este un rezultat al eforturilor de standardizare a terminologiei si a diagramelor modelelor
de obiect.Multe produse software ofera utilitare grafice pentru a crea diagrame UML.Produsele
populare precum Rational Rose si Visio sunt folosite pentru dezvoltarea aplicatiilor mari si
complexe.BlueJ,IDE-ul ales pentru acest curs,ofera diagramelor obiect o imagine similara UMLului.Acest lucru este ilustrat in Figura .

55

Capitol 2: Programarea orientata pe obiecte

UML este o colectie de simboluri si modele de simboluri.Este folosit pentru a descrie obiecte,relatiile
dintre ele,utilizarea si starile lor.
ULM este un limbaj mare;poseda mai multe tipuri de diagrame care pot fi folosite pentru a descrie
modelele de obiecte.Trei dintre acestea vor fi folosite in acest curs:

- Diagramea de caz - Aceasta descrie modul in care utilizatorii vor folosit obiectele intr-un
sistem.Acest lucru este ilustrat in Figura :

- Diagrama de clasa - Aceasta descrie atributele obiectelor intr-un sistem.Acest lucru este ilustrat in
Figura .
56

Capitol 2: Programarea orientata pe obiecte

- Diagrama de stare - Aceasta descrie stagiile sau ciclul de viata al obiectelor.Acest lucru este ilustrat
in Figura .

Scopul acestei sectiuni este de a familiariza studentii cu diagramele de clase.Acestea sunt folosite
pentru a comunica definitiile claselor si relatiilor lor cu celelalte clase in moduri usor de inteles.

2.3.2 Simbolul de baza pentru o clasa


57

Capitol 2: Programarea orientata pe obiecte


Mai jos sunt prezentate cateva simboluri folosite in diagrama unei clase.Acestea sunt ilustrate in
Figura :

- Dreptunghiurile descriu clase.


- Liniile descriu relatii.
- Simbolurile descriu accesibilitatea si puterea relatiilor.
Un
dreptunghi
reprezinta
o
clasa
de
obiecte.Acesta
este
impartit
in
trei
compartimente:numele,atributele si metodele.Aceste compartimente sunt ilustrate in Figura .
Simbolurile sunt folosite pentru a ilustra accesibilitatea.Acest lucru este ilustrat in Figurile si .

58

Capitol 2: Programarea orientata pe obiecte

Diagrama din Figura ilustreaza cateva dintre cele mai comune simboluri de diagrame de caz.Linia
punctata este folosita pentru a reprezenta o implementare si o asociere.Formele de la sfarsitul liniilor
de legatura sunt un diamant gol,un diamant plin sau un capat de sageata in forma de triunghi.

59

Capitol 2: Programarea orientata pe obiecte

Simbolurile plus (+), minus (-) si semnul diez (#) sunt folosite pentru a descrie modificatorii de acces
pentru fiecare atribut sau metoda a unei clase.Exista mai multe simboluri folosite in UML.

2.3.3 Tipuri aditionale de diagrame UML


Studentii au invatat despre cele trei tipuri de diagrame UML utilizate in acest curs:
- De clasa
60

Capitol 2: Programarea orientata pe obiecte


- De caz
- De stare
Aceasta sectiune prezinta detalii si introduce mai multe diagrame UML:
- Pachet
- Obiect
- Secventa
- Colaborare
- Activitate
- Componenta
- Dezvoltare
Diagramele de clasa reprezinta esenta tuturor metodelor orientate pe obiecte.Acestea descriu structura
statica a unui sistem.Acest lucru este ilustrat in Figura .

Diagramele pachet reprezinta un subset al diagramelor de clasa.Dezvoltatorii le trateaza uneori ca pe o


tehnica separata.Diagramele pachet organizeaza elementele unui sistem in grupuri relationate.Astfel
minimizeaza dependentele dintre pachete.Acest lucru este ilustrat in Figura .

61

Capitol 2: Programarea orientata pe obiecte

Diagramele obiect desciu structura statica a unui sistem.Acestea pot fi folosite pentru a testa
diagramele de clasa.Acest lucru este ilustrat in Figura .

62

Capitol 2: Programarea orientata pe obiecte


Folositi diagramele de caz pentru a modela functionalitatea unui sistem cu actori si folositi
cazuri.Acest lucru este ilustrat in Figura .

Diagramele de secventa descriu interactiunile claselor in termenii unui schimb de mesaje in timp.Acest
lucru este ilustrat in Figura .

63

Capitol 2: Programarea orientata pe obiecte

Diagramele de colaborare reprezinta interactiunile dintre obiecte ca o serie de mesaje


secventiale.Diagramele de colaborare descriu atat structura statica cat si comportamentul dinamic ale
unui sistem.Acest lucru este ilustrat in Figura .

Diagramele de stare descriu comportamentul dinamic al unui sistem ca raspuns la evenimentele


externe.Diagramele de stare sunt folosite in principal pentru a modela obiectele reactive.Acest lucru
este ilustrat in Figura .

64

Capitol 2: Programarea orientata pe obiecte

Diagramele de activitate ilustreaza natura dinamica a unui sistem.Acestea modeleaza fluxul de control
de la o activitate la alta.O activitate este o operatie pe o clasa care schimba starea unui
sistem.Majoritatea diagramelor de activitate sunt folosite pentru a modela fluxul de lucru sau procesele
business si operatiile interne.Acest lucru este ilustrat in Figura .

65

Capitol 2: Programarea orientata pe obiecte

Diagramele de componenta descriu organizarea componentelor software efective.Acestea includ codul


sursa,codul binar de rulare si executabilele.Acest lucru este ilustrat in Figura .

66

Capitol 2: Programarea orientata pe obiecte


Diagramele de dezvoltare ilustreaza resursele fizice dintr-un sistem.Acestea includ noduri,componente
si
conexiuni.Acest
lucru
este
ilustrat
in
Figura
.

2.4.1 Definirea de clase


Prima linie a unui program incepe definitia clasei.Aceasta include cuvantul cheie class si un nume
pentru clasa:
public class Person
Urmeaza corpul definitiei.Acesta este inclus intr-o pereche de acolade:
public class Person

{
}
Cuvantul cheie public permite altor clase sa foloseasca aceasta clasa.
Clasele publice trebuie sa fie definite in fisiere separate.

2.4.2 Crearea de obiecte


Definitia unei clase poate include metode ce specifica valorile datelor pe care un obiect le va stoca in
timpul crearii.Aceste metode se numesc constructori.
67

Capitol 2: Programarea orientata pe obiecte


In Java,un constructor are acelasi nume ca si clasa si nici un tip returnat.In Figura , a fost definit un
singur constructor.Acest constructor va rula o singura data pentru fiecare obiect care este creat.Acest
lucru este ilustrat in Figura . In Figura , constructorul Person cere utilizatorului clasei Person sa
ofere datele pentru nume,data nasterii si un numar de identificare. Ex: vezi clasa Person.
Termenii String si int fac referire la tipurile de date Java.Un String reprezinta o serie de caractere si un
int un intreg.Procedura constructor creaza o instanta a clasei Person si atribuie datele oferite ca si
valori variabilelor obiecte.
Instantele obiect vor contine valori de date diferite.Datele care fac parte din fiecare instanta sau obiect
al unei clase se numesc date de membru sau atribute membru.In Figura , Liniile 8,9 si 10 definesc
tipul de date.
Variabile si date
Datele fiecarui obiect sunt stocate in memorie.Toate limbajele de programare folosesc variabile pentru
a face referire la datele din memorie.O variabila este caracterizata prin cinci elemente;acestea sunt
ilustrate in Figura :

- Tipul de date
- Identificatorul
- Domeniul de vizibilitate atata timp cat un obiect este folosit
- Adresa adresa in memorie, nu este vizibila programatorului
- Valoare/Datele valoarea este atribuita la creare a unui obiect
Urmeaza un exemplu.Clasa Person defineste trei variabile;acestea sunt name,dateOfBirth si id.Fiecare
variabila are asociat un tip de date.Tipul de date pentru id este int.Tipul de date pentru name este
String.Domeniul de vizibilitate al unei variabile reprezinta punctul in care o variabila este definita si
accesibila si punctul in care nu este accesibila.Datele vor fi stocate in fiecare variabila atunci cand
programul ruleaza;in acelasi timp,variabilei i se atribuie o adresa interna.Aceasta adresa nu este
necesara pentru scrierea unui program.
Java include cuvintele cheie care sunt folosite pentru a implementa incapsularea.In acest
exemplu,cuvantul cheie private este aplicat unui atribut astfel incat alte obiecte sa nu il poata
accesa.Aceste date pot fi accesate numai de catre metode din cadrul clasei.Alte obiecte vor avea
nevoie sa foloseasca o metoda accesor pentru a obtine datele.

2.4.3 Metodele unui obiect


Un program poate defini mai multe metode ale unui obiect dintr-o clasa.Definitia clasei include
metodele standard dar nu are nici o metoda particulara.Instructiunile metodei sunt partajate de catre
obiectele unei clase.Exista o singura copie a unei metode in memorie.Toate metodele cu exceptia
constructorului au un tip returnat.Daca nu sunt returnate niciun fel de date,tipul returnat va fi void .
68

Capitol 2: Programarea orientata pe obiecte


Studentii trebuie sa cunoasca functiile mai multor metode:

- Metoda mutator - Aceasta schimba unui datele obiect.Imaginati-va ca exista un obiect Person
denumit JohnDoe.Daca datele pentru JohnDoe sunt incapsulate,Obiectul A trebuie sa trimita mesaje
obiectului JohnDoe pentru a aplica schimbarile si trebuie sa specifice un nume de metoda din clasa
Person.Acest lucru este ilustrat in Figura .Ex: vezi clasa Person. Metodele setName, setDateOfBirth

- Metoda accesor - Aceasta obtine datele unui obiect.Obiectul A poate trimite un mesaj obiectului
JohnDoe pentru a obtine date.Datele obtinute vor trebui sa fie stocate in Obiectul A.Acest lucru este
ilustrat in Figura .Ex: vezi clasa Person. Metodele getName, getDateOfBirth

- Metoda fara nici un argument - Aceasta nu obtine niciun fel de date.


- Metoda care necesita unul sau mai multe argumente - Aceasta va schimba des datele unui obiect si
va cere utilizatorului obiectului sa ofere datele noi pentru a fi folosite.Exista posibilitatea de a cere
unul sau mai multe elemente de date.Acest lucru este ilustrat in Figurile si .

Obiectul A
opereaza pe obiectul Person prin folosirea unei metode publice pentru a schimba valoarea atributului
name.

- Valori returnate de metode - Un obiect poate interactiona cu alt obiect pentru a obtine date.Mesajul
care este trimis celuilalt obiect poate include argumente.Acest lucru este ilustrat in Figurile si .

2.5.1 Clasa System


Aceasta sectiune va examina codul sursa al SayHello pentru a explora folosirea claselor predefinite din
API-ul Java.
69

Capitol 2: Programarea orientata pe obiecte


Definirea datelor si a atributelor pentru clase este facila.Sunt mai dificile imprimarea,salvarea
datelor,conectarea la o retea si afisarea pe ecran.Aceste sarcini necesita programatorilor sa inteleaga
hardware-ul si regulile SO-ului.POO separa functiile unei aplicatii in mai multe definitii de clase si
permite reutilizarea definitiilor clasei.Java are o multime de clase predefinite.Acestea se afla in Java
SDK.Codul sursa pentru aceste clase poate fi gasit in directorul src din directorul J2SDK.Java SDK
include documentatia fiecarei clase.Un programator poate folosi aceste clase pentru a efectua functiile
necesare rezolvarii problemelor de business.Clasele din API sunt predefinite si testate corect.
Clasa SayHello nu contine niciun atribut.Obiectele SayHello nu stocheaza deloc date obiect.Metoda
main() foloseste datele primite pentru a afisa informatiile.Datele stocate intr-un obiect se numesc date
membru.Datele stocate de catre metodele unui obiect sunt date locale sau temporare.Atunci cand
executia metodelor se incheie,aceste date nu mai exista in memorie.
Metoda main() a obiectului SayHello foloseste metode ale obiectului System.out pentru a-si indeplini
sarcinile.Studentii vor utiliza sintaxa pentru apelul unui obiect si al metodelor sale in majoritatea
claselor.
Analizati folosirea obiectului System.out.Unul dintre cele mai utile obiecte este obiectul de iesire
referit in clasa System.Obiectul de iesire trimite datele la consola pentru a fi afisate.Aplicatiile mari
vor folosi rar acest obiect pentru a afisa datele utilizatorilor.In schimb,programatorii il vor utiliza
frecvent pentru a verifica valorile datelor in obiecte si pentru a-si testa programele.
Clasa System este un exemplu de clasa predefinita care a fost testata si compilata pentru a putea fi
utilizata de catre oricare alta clasa.Clasele precum System formeaza API-ul Java.Studentii vor invata
cum sa foloseasca API-ul in acest curs. Ex: vezi codul sursa la clasa SayHello.java

Rezumat
Acest modul a introdus anumite concepte specifice POO precum obiectele si clasele
Obiectele sunt membri ai unei clase.Ele mai sunt cunoscute ca si instante ale claselor.Obiectele pot
stoca si modifica datele.Fiecare obiect are atribute si comportamente.Obiectele interactioneaza intre
ele prin intermediul metodelor.Un programator defineste metode pentru un obiect.Obiectele trimit si
primesc mesaje pentru a interactiona intre ele.
Clasele sunt schitele folosite pentru a crea obiecte.Clasele contin metode,care sunt seturi de
instructiuni pentru efectuarea unor sarcini.Metodele accesor sunt folosite pentru a obtine
informatii.Metodele mutator sunt folosite pentru a modifica date.
Clasele au relatii cu alte clase.Mostenirea este o relatie in care clasele preiau atribute si
comportamente de la alte clase.Relatiile dintre clase pot fi modelate cu UML.Acest sistem de
simboluri este folosit pentru comunicarea intre utilizatori si programatori.

70

Capitol 3: Componentele limbajului Java

Capitol 3: Componentele limbajului Java


Prezentare generala
Utilizatorii Java trebuie sa inteleaga cuvintele cheie ale limbajului si regulile de sintaxa folosite pentru
a defini clase,constructori,metode,si interactiuni intre obiecte.Acest modul prezinta elementele de baza
ale Java si tehnici de documentare.Sunt descrise utilizarea Java API,documentatia sa,si folosirea
javadoc pentru a crea documentatie pentru clase.Aceasta este similara cu documentatia oferita de Java
API.Un programator trebuie sa devina familiar cu sintaxa utilitarului javadoc.Acest modul introduce
parametrii javadoc si instructiunile folosite pentru introducerea lor in codul sursa.
Unul dintre motivele principale pentru a folosi limbajele orientate pe obiecte este acela de a refolosi
codul programului.Pentru a refolosi codul,programatorii trebuie sa stie cateva lucruri.Ei trebuie sa stie
numele claselor,atributele lor,metodele lor,relatiile cu alte obiecte.Un proiectant trebuie sa
documenteze aceste informatii.
Acest modul descrie stocarea datelor programului si explica modul in care clasele,si metodele sunt
definite.Datele si cerintele de stocare difera pentru fiecare tip de date.Studentii trebuie sa invete
sintaxa folosita pentru a defini atributele si metodele unei clase.
Este important sa includeti comentarii in programele Java care sa le documenteze caracteristicile si
folosirea lor.Aceste comentarii sunt proiectate pentru programator si pentru alti utilizatori care au
nevoie de acces la codul sursa pentru a depana o problema cu un program.
Cuvinte cheie

- Documentatia API
- Utilitarul javadoc
- Cuvinte cheie si simboluri
- Identificatori
- Memoria RAM
- Dimensiunea spatiului de stocare
- Stocarea datelor
- Variabile
- Tipuri de date Java
- Clase de impachetare
- Instanta unei clase
- Reguli de sintaxa Java
- Declaratii
- Modificatori de acces si specificatori
- Mutabilitate
- Metoda finalize

71

Capitol 3: Componentele limbajului Java

3.1.1 Scopul documentatiei


Documentatia unui program include grafice si diagrame ce pot fi vazute de altii.Acestea includ
diagrame UML,instructiuni pentru utilizatori,si comentarii din codul sursa.Atunci cand programele
complexe cu mai multe clase sunt dezvoltate,documentatia este critica.Documentatia poate impacta
succesul sau esecul unui proiect.
Documentatia poate realiza doua lucruri.In primul rand,comentariile din codul sursa pot ajuta un
programator sa modifice codul,sa depisteze erorile,si sa mentina definitia unei clase.Cativa
programatori folosesc comentariile ca prim pas atunci cand proiecteaza o clasa.Comentariile formeaza
planul de baza pentru clasa.Aceasta este o forma modificata a unui pseudocod,sau o schita a
programului.Atunci cand apare o problema,un programator trebuie sa inteleaga problema,sa creeze un
plan de adresare a problemei,sa reduca planul la pseudocod,si sa reduca pseudocodul la codul
limbajului de programare.Pseudocodul este o schita a algoritmului ce foloseste sintaxa asemanatoare
Java dar cu mai putine detalii.Un programator il poate folosi ca un ghid pentru dezvoltarea codului
complet al programului.Pot avea loc rafinamente in etapa de planuire,dar si in etapele de pseudocod si
cod-program.
Al doilea scop al documentatiei este acela de a comunica cu alti programatori ce folosesc
clasa.Comentariile ii ajuta sa inteleaga logica si motivele din spatele fiecarei caracteristici.
Comunitatea de dezvoltare Java foloseste multe caracteristici pentru a documenta clasele.
Documentatia poate fi creata in forma documentelor Web-based sau HTML.Acest lucru este realizat
cu utilitarul javadoc,care este furnizat cu Java2 SDK.Acest utilitar interpreteaza simbolurile
incorporate.Acestea pot fi etichete si parametri sau text din fisierul codului sursa.Sunt astfel create
documente HTML similare cu Java API.Majoritatea IDE-urilor permit utilizatorilor sa produca
documentatie HTML din etichetele javadoc. Ex:vezi java.lang.Math

3.1.2 Sfaturi pentru documentarea claselor


O clasa poate include comentarii ce devin parte a documentatiei publice pentru clasa.Aceasta este
disponibila pentru alti programatori ce folosesc clasa pentru a vizualiza documentul Web.Aceste
comentarii descriu caracteristicile unei clase.Proiectantul fiecarei clase trebuie sa verifice acuratetea
acestor comentarii.Aceste comentarii nu sunt folosite pentru a trimite mesaje utilizatorilor.Mesajele
catre utilizatori devin parte a codului clasei.
Exista doua tipuri de comentarii ce pot fi incluse intr-un fisier sursa ce defineste o clasa
Java.Comentariile si remarcile pot fi lungi de o linie sau pe mai multe linii.Comentariile nu provoaca
un calculator sa efectueaze orice sarcina atunci cand un program ruleaza.
Un comentariu de o linie este precedat de simbolurile //. Acest lucru este ilustrat in Figura

72

Capitol 3: Componentele limbajului Java


Un comentariu pe mai multe linii se numeste comentariu block.Prima linie incepe cu simbolul /* si
ultima linie se termina cu */. Acest lucru este ilustrat in Figura .
Comentariile pot fi de-asemenea primul pas folosit pentru a crea o clasa.Acestea pot fi folosite pentru
a crea un plan logic pentru definitia clasei .
Din moment ce compilatorul ignora comentariile,acestea pot fi folosite in dezvoltarea
programului.Daca o portiune de cod cauzeaza probleme,puneti sintaxa de comentariu in jurul sau
pentru "a o comenta"si sectiunea va fi ignorata de catre compilator.Atunci cand problema este
identificata,eliminati sintaxa de comentariu si recompilati proiectul.

3.1.3 Parametrii pentru utilitarul javadoc


Comentariile sunt folosite pentru a crea documentele HTML pentru clasele javadoc.Acestea se mai
numesc comentarii block deoarece ele pot cuprinde mai multe linii.Aceste comentarii sunt folosite
pentru a explica scopul unei clase,a metodelor,si a argumentelor.Comentariile javadoc sunt cuprinse
intre simbolurile /** si */. Compilatorul ignora aceste comentarii.Comentariile folosite pentru a
genera documente HTML cu utilitarul javadoc au instructiuni speciale si simboluri.Acestea sunt
ilustrate in Figura .

73

Capitol 3: Componentele limbajului Java

Comentariile de o linie pot fi imbricate in comentarii block.Exemplul din Figura ilustreaza folosirea
comentariilor de o linie imbricate.Comentariile de o linie impricate in interiorul comentariilor javadoc
sunt incorporate in documente HTML.
/**
Definirea unei clase incepe aici
//serializarea este o interfata de tip maker.
*/
74

Capitol 3: Componentele limbajului Java


Etichetele HTML pot fi de-asemenea inserate in comentarii.In Figura , eticheta HTML si este
folosita pentru a ilustra textul dintre etichetele dintr-un font monospatiat.HTML are multe etichete
precum cele folosite pentru a formata textul,pentru a ilustra date tabelare,si chemarea altor
programe.Unele etichete HTML cauzeaza conflicte atunci cand utilitarul javadoc creaza documente
HTML.Etichetele care cauzeaza majoritatea conflictelor includ etichetele care seteaza structura unui
document precum antete,subsoluri,si cadre.Acestea ar trebui evitate.Etichetele ce functioneaza bine le
includ pe cele care seteaza fontul sau culoarea si identifica textul titlului.
/**
Stocheaza date, e mai convenabila decat <tt>java.util.Date</tt>
@version 1.3 October 2001
@author Cisco Teacher
*/
Utilitarul javadoc va cauta si etichete speciale precum cele ilustrate in Figura . Aceste etichete sunt
folosite pentru a strange informatii de interest pentru cititor precum parametrii si tipurile de
reintoarcere.Javadoc va trata aceste informatii intr-un mod special,Lansati documentatia referitoare la
utilitar pentru a recapitula utilitarele speciale.Documentatia referitoare la utilitar se numeste
javadoc.html.Aceasta este deseori instalata in directorul tooldocs unde este stocata Java SDK.

75

Capitol 3: Componentele limbajului Java

Utilitarele de cautare pot fi folosite pentru a ajuta la localizarea fisierului javadoc.html.Acest lucru este
ilustrat in Figura .
Mult timp poate fi petrecut pe documentatie dupa ce un program este scris.Utilizarea javadoc ajuta la
automatizarea acestui proces.Acest lucru va reduce costurile de dezvoltarea si de mentenanta.
Toate comentariile javadoc ar trebui plasate inainte sau pe linia anterioara acestor linii de cod:

- Definitia clasei
- Definitia fiecarui atribut
- Definitia metodelor si a constructorilor
Toate comentariile javadoc plasate in interiorul acoladelor de cod a unei metode sau constructor vor fi
ignorate.Din moment ce comentariile javadoc sunt folosite pentru a furniza informatii unui utilizator a
unei clase,comentariile ar trebui plasate deasupra atributelor si metodelor publice si
protejate.Atributele private sau metodele nu necesita comentarii javadoc.Programatorul poate alege sa
includa comentarii java standard intre /* */ sau precedate de //.

3.1.4 Documentatie online pentru Java API


76

Capitol 3: Componentele limbajului Java


Aceasta sectiune va recapitula API Core,care reprezinta setul de clase ce formeaza platforma Java,si
documentatia pentru acest set.Site-ul web listat mai jos contine un link pentru descarcarea
documentatiei pentru Java.Acesta este ilustrat in Figura .
http://www.oracle.com/technetwork/java/index-jsp-142903.html#documentation
Fisierele HTML ar trebui sa fie instalate in directorul jdk#.#.#/doc.Exista multe fisiere HTML care
formeaza documentatia pentru limbaj.Fisierul index.html va duce la afisajul ilustrat in Figura
http://docs.oracle.com/javase/7/docs/api/
Explorati toate caracteristicile.Pentru a invata mai multe despre Java si utilitarele javac,selectati
titlurile ilustrate in Figura . Pentru a folosi tutorialul,selectati titlul ilustrat in Figura .
http://www.oracle.com/technetwork/java/javase/documentation/index.html
Clasele de core pot fi folosite pentru a crea programe ce rezolva probleme simple si complexe.In
modulele anterioare,clasa System a fost folosita pentru a printa sau pentru a afisa informatii pe
ecran.Pentru a invata mai multe despre aceste clase si alte clase,selectati API&Language din ecranul
index.Acest lucru este afisat in Figura
Studentii pot de-asemenea sa ia documentatia pentru clasele core prin intermediul fisierului
jdl#.#.#/docs/api/index.html.Ecranul ce apare dupa ce documentatia API este lansata este ilustrat in
Figura . Acest ecran ilustreaza o privire de ansamblu asupra API-ului.Observati link-urile catre
FRAMES si NOFRAMES din partea superioara a paginii Web.Aceste link-uri vor schimba vederea
documentelor.La vizionarea unui cadru,studentii pot naviga intre trei cadre pe ecran.
Alegeti o clasa precum System pentru a invata sintaxa acestei clase.Aceasta este ilustrata in Figura
Informatiile pentru fiecare clasa includ aceste elemente:

-Declaratia definitiei clasei


-Link-uri catre descrierea oricarui cuvant sau fraza subliniata
-Informatii despre versiune si autor
-O descriere ce include informatii despre utilizarea corespunzatoare a clasei,restrictii,si modul de
localizare a codului mostra
-Un camp sumar ce descrie tipurile de date stocate de un obiect
-Constructorii folositi pentru a construi obiecte
-O metoda sumara ce ilustreaza semnatura metodei si valoarea de intoarcere

77

Capitol 3: Componentele limbajului Java


Numerele din clasa API din Figura
API.

vor ajuta studentii sa devina familiari cu documentatia online

AP-ul ofera un set de utilitare,si metode ce pot fi folosite pentru a dezvolta software.API-ul Java are
utilitare ce pot fi folosite pentru a dezvolta software bazat pe Java.
Figura

ofera o descriere si un exemplu pentru fiecare dintre etichetele javadoc.

78

Capitol 3: Componentele limbajului Java

3.1.5 Generarea de documentatie API pentru clase folosind utilitarul javadoc

79

Capitol 3: Componentele limbajului Java


Atunci cand comentariile si etichetele javadoc au fost adaugate la definitiile clasei,utilitarul javadoc
poate fi folosit pentru a crea documentatia.Pentru a realiza acest lucru,deschideti fereastra de consola
si introduceti javadoc in prompt.Figura ilustreaza folosirea comenzii javadoc pentru a crea
documentatie pentru clasa Teacher.java.
Fisierul sursa va fi incarcat si fisierele HTML vor fi create in acelasi director numai daca nu este
specificat altul.Informatiile despre versiune si autor sunt incluse in etichetele javadoc din comentariile
javadoc.Pentru a genera informatii despre versiune si autor pentru clasa Teacher.java,trebuie folosita o
comanda precum urmatoarea:
C:\BlueJ\code>javadoc -version -author Teacher.java
Utilitarul javadoc are mai multe optiuni care pot fi solicitate,dupa cum este descris in Figura

80

Capitol 3: Componentele limbajului Java

3.2.1 Introducere
Fiecare limbaj de programare este compus din elemente.Majoritatea limbajelor contin cuvinte
cheie,simboluri,nume pentru date sau operatii,si reguli de sintaxa pentru utilizarea lor.Dupa ce un
limbaj a fost invatat,celelalte limbaje sunt sunt mai usor de invatat.
81

Capitol 3: Componentele limbajului Java


Aceasta pagina va recapitula simbolurile folosite pentru a comunica reguli si sintaxa.
Mai jos aveti cateva instructiuni care se aplica deseori pe sintaxa Java.Acestea sunt ilustrate in
Figura .

- [] sau > - Informatiile anexate sunt optionale.


- (), ; sau {} - Simbolurile sunt necesare.
- Cuvinte inclinate - date furnizate de catre programator.
-Cuvinte ingrosate sau simboluri - cuvintele cheie introduse dupa cum este ilustrat.
-Elipse - aceste informatii pot fi repetate.
Alte reguli de sintaxa Java sunt ilustrate in Figura

82

Capitol 3: Componentele limbajului Java

3.2.2 Cuvinte cheie (AC)


Exista multe cuvinte cheie ce formeaza vocabularul Java.Din moment ce compilatorul Java este case
sensitive,toate cuvintele cheie trebuie sa fie introduse fara majuscule.Cuvintele ce nu sunt cuvinte
cheie precum identificatorii pot fi toate cu majuscule,sau fara nicio majuscula,sau combinate.Formatul
ar trebui sa fie consistent.
Secventele de caracte ilustrate in Figura sunt rezervate pentru folosirea ca si cuvinte cheie si nu pot
fi folosite ca si identificatori.Acestea sunt formate din litere American Standard Code for Information
Interchange (ASCII). Codul ASCII seteaza tiparul de biti folosit pentru a reprezenta orice
litera,numar,sau semn de punctuatie folosite in limbajul englez.Mai sunt incluse caracterele de control
invizibile.Codul foloseste sapte sau opt biti de stocare pentru a reprezenta fiecare simbol sau caracter.

83

Capitol 3: Componentele limbajului Java

Cateva cuvinte cheie sunt exceptii.Cuvintele cheie const si goto sunt rezervate.Ele permit unui
compilator Java sa produca mesaje de eroare mai bune,Desi true si false ar parea sa fie cuvinte
cheie,ele sunt de fapt literali boolean.Un literal este o valoare actuala.
Un exemplu este prezentat mai jos:
int myInt = 1;
In aceasta declaratie,1 este un literal intreg.
Desi null poate parea a fi un cuvant cheie,este de fapt literalul null.Null inseamna absenta unei valori.
O valoare semnifica faptul ca este asociata cu datele stocate si procesate de catre un program.Simbolul
9 reprezinta o valoare numerica de noua si simbolurile 4 si 5 pot fi combinate pentru a reprezenta
valoarea numerica patruzecisicinci.Valoarea datelor este cunoscuta in program sau atunci cand
programul ruleaza.Cateva valori sunt mai greu de descris cu simboluri precum caractere sau numere.In
Java,valoarea datelor ce reprezinta un raspuns true sau false este reprezentata cu cuvintele rezervate
true sau false.
Figura ilustreaza o mostra de program Java.Miscati mouse-ul deasupra programului pentru a gasi
cuvintele care sunt si nu sunt cuvinte cheie.Care dintre cuvintele evidentiate nu sunt cuvinte cheie?

84

Capitol 3: Componentele limbajului Java

1.public access nerestrictionat la toate clasele


2.aName un identificator pt a stoca numele unui obiectde tip Person
3. int tip de date simplu, valoarea atribuita intreaga pe 32 biti
4. String un obiect java folosit pt a stoca o serie de caractere
5. return- returneza valoarea unei metode
6. dateOfBirth un identificator pt a stoca data de nastere a unui ob de tip Person
7. void folosit pentru a specifica o metoda care nu returneaza nici o valoare
Exista cateva similaritati intre cuvintele cheie Java si partile engleze de vorbire.Acestea sunt ilustrate
in Figura .

85

Capitol 3: Componentele limbajului Java

86

Capitol 3: Componentele limbajului Java

3.2.3 Identificatori
Identificatorii reprezinta etichete care sunt atribuite datelor.Programatorii Java folosesc etichete pentru
a accesa datele stocate.Identificatorii mai sunt atribuiti numelor de clase si numelor de metode.
Java are cateva reguli care sunt folosite pentru a crea identificatori:

- Orice caracter din orice alfabet poate fi folosit pentru a ii crea.Caracterele care sunt folosite in
limbajul englez sunt reprezentate prin cod ASCII.Java ofera cod international si date cu un set de
simboluri codate cunoscute ca si Unicode.Acestea includ reprezentatii pentru aproape fiecare limba
vorbita din lume.

- Orice caracter din orice alfabet poate fi folosit pentru a ii crea.Caracterele care sunt folosite in
limbajul englez sunt reprezentate prin cod ASCII.Java ofera cod international si date cu un set de
simboluri codate cunoscute ca si Unicode.Acestea includ reprezentatii pentru aproape fiecare limba
vorbita din lume.

- Primul caracter trebuie sa fie o litera.Toate celelalte caractere pot fi litere,numere,sau simboluri.
- Ei nu pot contine simbolul de procent (%) sau semnul diez (#).
87

Capitol 3: Componentele limbajului Java

- Simbolurile speciale precum semnul dolarului ($) si ampersandul (&) ar trebui evitate.
- Ei nu pot contine spatii
- Ei sunt case sensitive
- Ei nu pot folosit anumite cuvinte cheie,care sunt cunoscute ca si cuvinte rezervate.
Aceste reguli sunt ilustrate in Figura

Folositi activitatea din Figura

pentru a gasi identificatorii corecti.

Folositi activitatea din Figura

pentru a aranja termenii Java in codul prezentat.

88

Capitol 3: Componentele limbajului Java

Semnul dolarului ($) poate fi folosit in Java pentru compatibilitatea cu sisteme de mostenire.Mai este
folosit cu clase si nume de interfata generate de compilator.
Linia (_) este uneori folosita pentru a recunoaste identificatorii care sunt compusi din mai multe
cuvinte precum savings_Account_Balance.

3.2.4 Folosirea parantezelor, punct si virgula, virgula si spatiilor


Simbolurile trebuie sa fie folosite pentru compilarea corespunzatoare a codului Java.
Mai jos sunt prezentate cele mai commune simboluri din Java:

- Paranteze ({}) - Acestea sunt folosite pentru a limita declaratiile block,definitiile de clasa,definitiile
de metode,si alte declaratii care ar trebui sa fie rulate intr-un grup.Acestea sunt illustrate in Figura .
Parantezele care sunt folosite pentru a define o clasa sau o metoda ar trebui plasate dupa declaratia
definitiei.Asezarea parantezelor face mai facila depistarea erorilor si depanarea programelor.Unele
editoare precum BlueJ includ utilitare de cautare pentru a gasi parantezele potrivite

- Punct si virgule (;) - Acestea sunt folosite la sfarsitul unei declaratii.Acestea sunt illustrate in
Figura . Inainte ca un program sa fie compilat,asigurati-va ca fiecare linie a codului se termina cu
punct si virgula.

89

Capitol 3: Componentele limbajului Java

- Virgule (,) - Acestea sunt separatorii sau delimitatorii datelor.Fiecare valoare dintr-o metoda trebuie
sa fie separata prin virgula.Declaratia metodei defineste valori necesare pentru o metoda ca una sau
mai multe perechi de lista de tip de date si variabile.In general,daca sintaxa unui limbaj identifica o
virgula in descriere,programatorul trebuie sa foloseasca virgula.Metodele cu mai mult de un parametru
sunt folosite dupa cum este ilustrat in Figura .

- Spatii - Acestea sunt folosite pentru a separa cuvintele cheie si identificatorii si ar trebui sa fie
incluse atunci cand informatiile sunt printate sau ilustrate:
public class Student
Atunci cand codul Java este compilat,Java ignora spatiile precum un spatiu,taburi,si \r.Spatiile sunt
folosite de regula pentru a face programele mai usor de citit.
Urmatoarele caractere sunt interpretate ca si spatii in Java:

- \t - tab orizontal
- \n - linie noua
- \f - spatiu de formular
- \r - enter
- Spatiu
3.3.1 Introducere in stocarea datelor
Toate programele care ruleaza pe un calculator trebuie sa fie stocate in memorie.Studentii nu trebuie
sa stie modul in care un calculator stocheaza electronic datele pentru a crea clase Java.Sunt utile cateva
cunostinte despre modul in care memoria este alocata si folosita in timp ce un program
ruleaza.Acestea vor ajuta la crearea si referintele corespunzatoare la tipurile de date Java.
Folositi jocul de potrivire din figura pentru a invata despre stocarea datelor.Exista sase locuri pentru a
stoca datele:

- Registri - spatiul de memorie din CPU


- Stiva - pentru metode si variabile din RAM
- Heap - pentru obiecte din RAM
- Stocare statica - pentru metode sau variabile partajate in RAM
90

Capitol 3: Componentele limbajului Java

- Stocare constantelor - pentru variabile constante in RAM


- Stocare non-RAM - spatiu pe disc precum un hard drive sau un floppy
Registrii ofera accesul cel mai rapid.Spatiile pentru stiva,heap-ul,stocarea statica,si constanta in RAM
variaza in viteza de acces.Compilatorul determina locatia de stocare pentru acestea si JVM-ul
administreaza toate problemele de stocare.Stocarea non-RAM include locatii permanente precum
discuri.

3.3.2 Stiva, heap, stocare pentru date statistice si constante


Calculatoarele sunt descrise in termeni de memorie in megabytes (MB)sau gigabytes (GB)si viteza cu
care CPU-ul poate procesa datele in megahertz (MHz)sau gigahertz (GHz). Intr-un program,definitiile
de clase vor influenta alocarea si folosirea memoriei RAM.Zonele principale de explorare sunt
stiva,heap-ul,spatiile de stocare statica si constantele.Programatorii definesc clasele care vor stoca
datele intr-unul sau mai multe astfel de spatii.Modul in care compilatorul le foloseste va determina
crearea si distrugerea corespunzatoare a obiectelor si a datelor din acestea.
O stiva este o structura de date din memorie cu un singur capat.Datele sunt plasate acolo si trebuie sa
fie accesate intr-o ordine de ultimul-intrat,primul-iesit.Daca elementul de date X este plasat acolo dupa
elementul Y,atunci X trebuie sa fie scos din stiva inainte ca Y sa poata fi accesat.SO-ul foloseste o
stiva pentru fiecare program care ruleaza.
Ganditi-va la o stiva de carti.Cartile sunt asezate in stiva cu A la capat,apoi B,apoi C,apoi D.Pentru a
accesa cartea C,cartea D trebuie sa fie scoasa prima.Cartea C trebuie sa fie scoasa pentru a acesa cartea
B.Memoriile de tip stiva se comporta ca o stiva de carti.Ultima parte de date stocate in stiva este
accesata prima.
Orice date care trebuie sa existe dupa ce o functie cheama functia de return sau returnarea unei metode
sunt plasate in Heap.O stiva este folosita pentru apeluri de metode si variabile temporare.Un heap este
folosit pentru obiecte.
Ganditi-va la un morman de carti.Cartile sunt plasate in heap in ordine de la cartea A la cartea D.Daca
este necesar accesul la cartea C,aceasta poate fi scoasa direct din heap.Cartea D nu trebuie sa fie
91

Capitol 3: Componentele limbajului Java


scoasa.Memoriile heap se comporta ca un morman de carti.Ultima bucata de date stocate in stiva nu
trebuie sa fie accesate inaintea datelor stocate anterior.Memoria heap este administrata de catre JVM
cu ajutorul unui Hash Table.Aceasta tabela listeaza ID-urile obiectelor pentru obiectele din heap si
locatiile lor.Atunci cand este facuta o cerere pentru a lucra cu un obiect,JVM foloseste Hash Table
pentru a localiza obiectul prin ID.Variabila care face referire la un obiect contine o valoare pentru IDul sau.

92

Capitol 3: Componentele limbajului Java

3.3.3 Variabile si spatiile de stocare pentru date


Datele pentru fiecare obiect sunt stocate in memorie.Toate limbajele de programare folosesc variabile
pentru a face referire la datele din memorie.O variabila este o locatie de stocare din memorie care
poate fi folosita pentru a stoca datele.Tipurile de date sunt declarate atunci cand o variabila este
creata.Datele dintr-o variabila pot fi o primitiva sau pot stoca o referinta la un obiect precum ID-ul
unui obiect.
O variabila are cinci trasaturi:

-Identificatorii sunt etichete pe care programatorii le folosesc pentru a face referire la locatiile de
stocare.

-Domeniu de vizibilitate sau durata unei variabile reprezinta disponibilitatea datelor in timp ce un
program ruleaza.Domeniul de vizibilitate al unei variabile este reprezentat de codul in care este
definita.Variabilele care stocheaza date au un domeniu de vizibilitate pe parcursul existentei
obiectului.Cat timp obiectul este folosit,datele obiectului sunt disponibile.Variabilele definite intr-o
metoda pot fi folosite numai in interiorul metodei.O variabila este limitata in domeniu daca este
continuta in logica unei metode.Atunci cand o metoda nu mai ruleaza,variabila nu mai
exista.Variabilele sunt intr-un domeniu atunci cand exista in memorie.

-Adresa variabilei este locatia variabilei si datele din memorie.Programatorii Java nu trebuie sa stie
locatia datelor.Ei au nevoie doar de un identificator pentru datele ce reprezinta numele
variabilei.Acesta va fi folosit pentru a accesa datele.

-Tipurile de date definesc stocarea si folosirea corespunzatoare a datelor.


-Valoarea unei variabile reprezinta datele stocate in variabila.Daca o variabila este parte a unui
obiect,ii sunt atribute valori implicite atunci cand obiectul este creat.Aceasta valoare este dependenta
de tipul de date al variabilei.Valorile implicite nu sunt atribuite variabilei unei metode.Programatorul
trebuie sa atribuie valorile in cod pentru metoda in care vor fi folosite.
Aceste locatii de stocare sunt denumite variabile deoarece datele se pot modifica in timp ce sunt
procesate.Aceste concepte se mai aplica si constantelor,care nu se modifica,si datelor statice,care sunt
globale sau intr-o clasa.Diferenta majora dintre constante,variabile,si datele statice consta in domeniu
de vizbilitate si proprietatea de a se modifica.

3.4.1 Tipurile de date ale limbajului Java


Tipul unor date spune unui calculator cum sa interpreteze si sa stocheze datele.O persoana poate
observa daca datele sunt in format de numere sau text.Un calculator trebuie sa foloseasca coduri
speciale pentru a identifica tipuri diferite de date.Tipurile de date sunt declarate prin intermediul
cuvintelor cheie.Aceste cuvinte cheie informeaza un calculator despre tipul datelor.In unele
93

Capitol 3: Componentele limbajului Java


limbaje,datele trebuie sa fie identificate dupa tip si cantitatea necesara de stocare.Java necesita doar ca
tipul datelor sa fie declarat.Acestea sunt ilustrate in Figura .

Java este un limbaj "strongly typed". Aceasta inseamna ca fiecare tip de date are o anumita cantitate
de stocare alocata.Compilatorul stie cantitatea de memorie necesara fiecarui tip de date.Datele pot fi
mutate din memoria unui tip de date in altul in conditii specifice.Acest lucru reprezinta conversia
tipului.

3.4.2 Primitive Java si cerinte de stocare


Primitivele Java sunt tipuri de date folosite pentru stocarea tipurilor simple de date.Alte tipuri de date
sunt
denumite
referinte.Exista
opt
tipuri
de
primitive
Java.Acestea
sunt
boolean,char,byte,short,int,long,float,si double.Acestea sunt ilustrate in Figura .

94

Capitol 3: Componentele limbajului Java

Tipul de date boolean stocheaza o reprezentare a valorilor true si false.Tipul de date char stocheaza
orice caracter Unicode.Celelalte sase tipuri de primitive sunt folosite pentru numere.Folositi activitatea
din Figura pentru a identifica tipurile de date care ar putea fi folosite pentru a reprezenta o valoare.

95

Capitol 3: Componentele limbajului Java

Marimea memoriei reprezinta numarul de biti care sunt folositi pentru a stoca o reprezentatie a unui
numar,simbol caracter,sau status boolean.Memoria este masurata in bytes.Exista opt biti intr-un
byte.Fiecare bit poate fi reprezentat ca o valoare de loc in sistemul binar de numarare.Acest sistem
foloseste doua cifre,care sunt 1 si 0.
Fiecare bit poate fi on sau off.Acesta este reprezentat ca 1 pentru on sau 0 pentru off.Pozitita fiecarui
bit reprezinta o putere a lui 2.De exemplu,primul bit reprezinta 2 la puterea 0,care este 1.Al doilea bit
reprezinta 2 la puterea 1,care este 2.Al treilea bit reprezinta 2 la puterea 2,care este 4.Atunci cand un
bit este on,el reprezinta valoarea lui 2 atribuita acelei pozitii.Pentru a reprezenta un numar zecimal in
biti,convertiti numarul in unitati de 2.Adaugati valorile fiecarui bit on pentru a obtine o valoare
zecimala pe care un set de biti o reprezinta.Acestea sunt ilustrate in Figurile si . Al optulea bit este
folosit pentru semnul numarului.Un 0 este pentru numere pozitive si un 1 este pentru numere negative.

Stocarea pe biti ilustrata in Figura

reprezinta valoarea 60.


96

Capitol 3: Componentele limbajului Java

Stocarea pe biti ilustrata in Figura

reprezinta valoarea -60.

97

Capitol 3: Componentele limbajului Java


Folositi activitatea din Figura

pentru a identifica forma binara a valorilor intregi.

Cuvantul "bit"vine de la "binary digit". Exista opt biti intr-un byte deoarece acesta era numarul
necesar pentru a ilustra caracterele folosite de catre calculatoare.Opt biti pot fi folositi pentru a
reprezenta 256 de caractere.
Figura

ilustreaza sistemele octal si hexadecimal si valorile lor zecimale.

98

Capitol 3: Componentele limbajului Java


Tipurile de date Java primitive nu sunt obiecte.Fiecare tip de primitiva are o clasa definita in clasele
principale.Aceste clase pot fi explorate in documentatia Java API.Acestea se numesc clase de
impachetare si sunt afisate in Figura .

Clasele de impachetare impacheteaza trasaturile obiectelor in jurul valorii tipului de date


primitive.Acest lucru permite unui programator sa opereze cu aceste tipuri de date ca si cu
obiecte.Clasele de impachetare contin multe metode gata de folosire.Figura evidentiaza cateva dintre
metodele asociate cu clasa Integer.

99

Capitol 3: Componentele limbajului Java

3.4.3 Referinte Java


Toate obiectele sunt create in memoria heap.Pentru a accesa datele dintr-un obiect sau pentru a opera
pe un obiect,trebuie sa existe o variabila care sa stocheze o referinta la adresa obiectului din
stiva.Aceste tipuri de variabile contin tipuri de date referinta.Acestea sunt ilustrate in Figura .

100

Capitol 3: Componentele limbajului Java

Variabilele studentName si grade din Figura fac referire la obiectele tipului de clasa String.Aceasta
este una dintre clasele principale.Obiectele String sunt unele dintre tipurile Java de baza.Acest lucru se
datoreaza faptului ca majoritatea datelor sunt date text,care reprezinta un sir de caractere.Acestea sunt
ilustrate in Figura .
Retineti ca String este o clasa si char este o primitiva.Unii studenti fac confuzie intre String si un
vector de char.Un vector de caractere este manipulat ca un vector de primitive.Atunci cand String este
instantiata,obiectul are proprietati de clasa care difera de cele ale unui vector.

3.5.1 Variabile
Sintaxa se refera la regulile pentru folosirea simbolurilor si a cuvintelor cheie dintr-un limbaj.Aceasta
pagina acopera sintaxa pentru variabile,clase,metode,constructori,si modificatori.
Atunci cand o variabila este declarata,alocarea memoriei este necesara.Daca variabila este definita ca
si parte a datelor dintr-un obiect,valorile implicite sunt atribuite variabilei atunci cand obiectul este
creat.Daca este o variabila locala sau dintr-o metoda,valoarea sa trebuie sa fie atribuita de catre
programator ca si parte a definitiei metodei.
Figura evidentiaza sintaxa pentru clasa Student. Ex: vezi clasa StudentFigura
pentru fiecare tip de declaratie.

101

descrie sintaxa

Capitol 3: Componentele limbajului Java

3.5.2 Datele obiectelor


Fiecare obiect este o instanta a unei clase.Obiectele stocheaza datele in definitia clasei.Datele stocate
in obiect sunt denumite date membru,date instanta,sau campuri.Atunci cand programatorii definesc o
clasa,ei se asteapta ca fiecare instanta a unei clase sa stocheze datele separat.
Atunci cand un obiect este construit,datelor obiect le este atribuita memorie pe baza tipului de
date.Datele membru pot fi primitive sau tipuri referinta.Obiectele care includ referinte la alte obiecte
demonstreaza conceptul de asociere sau izolare a relatiilor cu obiecte.
Obiectele sunt creata la rulare de catre apelarea constructorilor clasei.In codul ilustrat in Figura
constructorii sunt evidentiati.Acest concept va fi acoperit mai tarziu in acest modul.
Figura ilustreaza cele doua obiecte Student,in memorie.Ambele obiecte au fost create in memoria
heap cu constructorul public Student() {}.
Obiectele Student sunt referite prin variabilele s1 si s2.Examinati datele pentru fiecare obiect.Fiecare
obiect isi stocheaza propriile date.Orice schimbare a obiectului referit prin s1 nu va afecta obiectul
102

Capitol 3: Componentele limbajului Java


referit prin s2.Atunci cand aceste obiecte sunt create,ele vor stoca valori implicite in campurile
lor.Aceste valori sunt bazate pe tipul de date.Toate numerele intregi au valoarea implicita 0.Toate
datele de tip float au valoarea implicita 0.0,datele boolean au valoarea implicita false,si datele char au
valoarea implicita Unicode \u0000.
Un obiect mai poate stoca referinte la alte obiecte.Valoarea implicita pentru tipul de date referinta este
null.Obiectul la care face referire nu a fost creat in memorie astfel ca nu este cunoscuta nici o adresa.

In Figura , valoarea pentru fiecare camp String va fi null.Un obiect String nu a fost creat pentru ca
obiectul Student sa il referentieze.
Atunci cand un obiect este o forma specializata a altuia,acest lucru poate fi exprimat ca o relatie
"este".
Mai jos sunt cateva exemple de specializare:

- Soparla-reptila
- Vaca-mamifer
- Masina-vehicul
- Prajitor de paine-aparat de uz casnic
O relatie de agregare are loc atunci cand un obiect este o parte a unui alt obiect.
Mai jos sunt cateva exemple de agregare:

- Schelet-soparla
103

Capitol 3: Componentele limbajului Java

- Uger-vaca
- Motor-masina
- Element de incalzire-prajitor de paine
O relatie de container este o forma de agregare in care un obiect este continut de catre un alt obiect.
Mai jos sunt cateva exemple de container:

- Oaie-turma
- Leu-mandrie
- Lup-haita
- Nava-flota
O relatie asociere are loc atunci cand un obiect este legat de un alt obiect.Al doilea obiect nu trebuie sa
fie parte sau sa fie continut de catre primul obiect.
Mai jos sunt cateva exemple de asociere:

- Guvern-oras
- Autor-carte
- Proprietar-masina
- Actor-piesa
3.5.3 Datele claselor
Obiectele unei clase trebuiesc deseori sa partajeze valoarea datelor.Toti clientii unei banci partajeaza
cateva informatii despre banca precum adresa si nume.Toti studentii unei clase pot partaja informatii
despre un profesor sau despre cea mai mare nota de la un test.Atunci cand datele sunt partajate de catre
toate obiectele unei clase,datele sunt declarate static si sunt aceleasi pentru toate instantele
clasei.Cuvantul cheie static este folosit pentru a defini datele ca si statice.Atributele clasei Bank vor fi
definite ca si statice.Membrii de tip static si metodele claselor Math si System vor fi si acestea folosite.
Examinati clasa Student din Figura

104

Capitol 3: Componentele limbajului Java


Clasa Student ar putea defini o variabila care contine datele pentru curs,precum si numarul
cursului.Aceste date nu trebuie sa fie stocate in fiecare obiect Student.Numarul cursului poate fi
declarat ca si static.Atunci cand definitia clasei este citita pentru prima oara,variabila static este creata
in memoria statica.Toate obiectele pot folosi apoi aceste date.
Datele sau metodele statice sunt incarcate in memorie inainte ca oricare dintre obiectele unei clase sa
fie create.Acest tip de date este folosit in aplicatii precum cele pentru numararea facturilor sau pentru
setarea valorilor de start precum maxime si minime.De-asemenea poate fi folosit cu dobanzi si pentru
a seta punctele maxime pentru un test.Acestea sunt valori care trebuie sa existe inainte ca obiectele
care le folosesc sa fie create.Domeniu de existenta al variabilelor de tip static este durata programului
care foloseste clasa care le defineste.Acestea sunt ilustrate in Figura .

3.5.4 Datele metodelor


In timp ce obiectele stocheaza date,metodele obiectelor efectueaza operatii cu date.Acestea sunt
variabile care stocheaza datele pentru folosirea intr-o metoda.De exemplu,obiectul trebuie sa
primeasca date noi pentru a modifica numele unui student.Noul nume este stocat in variabila unei
metode inainte sa fie folosita pentru a inlocui datele din obiect.Aceste variabile sunt trimise unei
metode ca si parametri.O metoda poate avea nevoie de alte variabile pentru a efectua calcule.Aceste
variabile definite intr-o metoda sunt locale si sunt intotdeauna create in memoria stiva.Memoria de tip
stiva este a doua locatie de memorie ca si viteza.Compilatorul va aloca memoria stiva pe baza
metodelor actuale.Datele create in memoria stiva sunt valabile in metoda atata timp cat aceasta
ruleaza.Atunci cand o metoda isi termina instructiunile,datele nu mai sunt valabile.
105

Capitol 3: Componentele limbajului Java


Variabilele metodei mai sunt denumite locale sau temporare.Acestea sunt definite in corpul unei
metode.Ele includ argumentele declarate in semnatura metodei.Figura ilustreaza cateva variabile
locale. (vezi clasa Student).Ele sunt folosite numai in metodele in care sunt declarate.Nu pot fi folosite
in alte metode.Variabilele definite fara structuri de control,precum declaratiile if sau while,sunt
folosite numai in interiorul declaratiilor de control.Ele nu sunt valabile in restul metodei.Multe erori de
rulare sunt rezultat al variabilelor apelate necorespunzator.
Variabilele metodei sunt create pe stiva si trebuie sa fie initializate inainte de folosire.Compilatorul
Java nu va compila o clasa daca un student incearca sa faca referinta la o variabila locala care nu a fost
initializata si nu are o valoare.Atunci cand metoda setGrade este apelata,variabila locala newGrade
este intializata.Poate fi apoi folosita pentru a atribui o valoare variabilei grade.Valoarea variabilei
newGreade nu este accesibila de catre alta metoda.Acest lucru este ilustrat in Figura .

3.5.5 Constante
O constanta este o locatie de stocare din memorie.Constantele au aceleasi cinci aspecte ca si
variabilele.Acestea sunt identificatori,scop,adresa,tipul datelor,si valoarea.Datele unei constante nu se
modifica la procesare.In Java,cuvantul cheie final defineste o locatie de stocare ca si constanta.Datele
ambilor membri sau instante si datele statice sau cele ale clasei pot fi declarate ca si constante folosind
cuvantul cheie final.
Clasa Student,courseNumber si studentName pot fi declarate ca si final.Daca este creata o instanta a
obiectului Student,studentName nu poate fi modificata.Atunci cand clasa este incarcata in memorie
106

Capitol 3: Componentele limbajului Java


pentru prima data,metoda niciunui obiect nu poate fi folosita pentru a modifica courseNumber.Aceasta
permite fiecarui obiect al clasei Student sa foloseasca acelasi numar.Cuvantul cheie final este folosit
pentru a intari integritatea datelor.
Folositi des constantele final in definitia claselor.Atunci cand un program este compilat,de fiecare data
cand apare identificatorul pentru constanta final,acesta poate fi inlocuita cu o valoare.Acest lucru
imbunatateste eficienta deoarece masina virtuala trebuie sa acceseze memoria pentru mai putin timp.

3.5.6 Clasa
Sintaxa definitiei unei clase este ilustrata in Figura

Cateva dintre regulile definirii de clase sunt:

- O clasa publica trebuie sa aiba un nume de clasa care sa se potriveasca cu numele fisierului.Numele
fisierului si numele clasei trebuie sa fie aceleasi.Java este case sensitive.Numele de clasa de student si
numele fisierului Student.java nu sunt aceleasi.

- Fisierul sursa sau fisierul .java pot avea definita o singura clasa publica.
- Fisierul sursa poate avea definite mai multe clase.Numai una dintre acestea poate fi declarata ca si
publica.

- Toate numele claselor ar trebui sa inceapa cu majuscule.


Folositi exercitiul din Figura

pentru a exersa sintaxa.


107

Capitol 3: Componentele limbajului Java


Numele
de
clase
depind
de
aplicatie.Unele
exemple
de
nume
sunt Animal,Dog,Cat,Bank,SavingsAccount,CheckingAccount,Student,Teacher,si Class.

de

clase

3.5.7 Metoda
Doua tipuri de metode care pot fi definite pentru o clasa sunt metode standard si particularizate.
Metodele standard seteaza,returneaza,sau modifica datele unui obiect.Metodele care seteaza sau
modifica valorile datelor pentru un obiect se numesc mutatori.Majoritatea acestor metode se numesc
setObjectData precum setAccountBalance.Metodele care returneaza datele de la un obiect se numesc
metode de acces.Majoritatea acestor metode se numesc getObjectData precum
getAccountBalance.ObjectData este identificatorul pentru datele pe care metoda le va modifica sau
returna.Acest identificator este definit ca si atribut pentru obiect.
Metodele particularizate implementeaza reguli precum metoda whenButtonPressed pentru o clasa
Button sau calculateDueDate pentru o clasa Video_rented.

-Mutatorii,modificatorii de acces,si metodele particularizate sunt deseori folosite in cadrul aceleiasi


clase.In programul unui magazin video,clasa Video_Rented poate avea atributele dateRented si
dateDue.Clasa mai poate avea urmatoarele metode:

-setDateRented - o metoda mutator care atribuie data la care un film este inchiriat pentru atributul
dateRented>-getDateRented - o metoda de acces care returneaza data
-calculateDueDate - o metoda particularizata care calculeaza data la care expira inchirierea pe baza
dateRented si seteaza valoarea dateDue.
Un obiect Customer care functioneaza intr-un obiect Video-rented poate folosi metoda mutator
setDateRented pentru a seta data ca si data curenta.Metoda particularizata calculateDueDate poate fi
folosita pentru a seta atributul dateDue al obiectului Video-rented.
Sintaxa pentru declararea metodei este ilustrata in Figura

-Tipul de intoarcere - Fiecare metoda cu exceptia metodei constructor trebuie sa declare un tip de
intoarcere.Acesta
ar
putea
fi
orice
tip
de
date
primitive,precum
boolean,char,byte,short,int,long,float,sau double.Acesta ar mai putea fi o referinta la un obiect.Daca
acesta este cazul,clasa obiect este folosita in locul variabilei referinta.Daca metoda nu returneaza o
valoare,cuvantul cheie void trebuie sa fie folosit.

- Numele metodei - Acesta este identificatorul unei metode.Conventiile folosite pentru a denumi
metodele sunt:

-Numele metodei incepe cu litera mica.


108

Capitol 3: Componentele limbajului Java

-Folositi cuvantul "set"pentru metodele mutator si "get"pentru metodele de acces.


-Includeti numele datelor obiect care se vor modifica in metode mutator sau cele de acces.Acestea sunt
ilustrate in Figura .
- Identificatorul tipului de date al parametrului modificatorului - Acesta reprezinta argumentele unei
metode.Metodele pot fi declarate cu unul,mai multe,sau nici un argument.Argumentele sunt
substituenti.Ele mai sunt cunoscute ca si parametri formali.Acestea definesc tipul de date care sa fie
primite de catre o metoda.Ele mai pot include in final un modificator pentru a asigura ca valoarea
oferita nu poate fi modificata.Atunci cand aceasta metoda este apelata de catre un alt obiect sau
metoda din aceeasi clasa,sintaxa pentru a trimite un mesaj va include numele metodei si valorile
argumentelor.Acestea sunt ilustrate in Figura .

109

Capitol 3: Componentele limbajului Java

Folositi activitatea din Figura pentru a identifica sintaxa pentru declaratiile de metode din clasa
Student.Retineti sa includeti metoda principala in analiza.

110

Capitol 3: Componentele limbajului Java

3.5.8 Constructor
Definitiile tuturor claselor includ o metoda care este folosita pentru a construi obiecte.Aceasta metoda
trebuie sa fie definita pentru a crea un obiect.
Sintaxa pentru un constructor este ilustrata in Figura

Un constructor nu are valori de returnare.Numele metodei trebuie sa fie numele clasei.Pot exista mai
multe metode constructor definite intr-o clasa.Daca un programator nu defineste o metoda
constructor,compilatorul va introduce una in definitia clasei atunci cand codul sursa este compilat.
111

Capitol 3: Componentele limbajului Java


Exista doua tipuri de baza de constructori.Acestea sunt constructori cu nici un argument,care sunt
uneori denumiti constructori null,si constructori cu argumente.
Figura

ilustreaza clasa Student cu trei constructori.

3.5.9 Modificatori
Definirea unei clase,a unei metode sau variabile poate include modificatori.Cele doua tipuri de
modificatori sunt specificator de acces si calificativ.
Specificatorii de acces definesc nivelul de acces.Cuvintele cheie folosite pentru un specificator de
acces sunt private,public si protected.Daca pentru un specificator de acces este lasat spatiu,accesul este
definit implicit.
Calificativul defineste stadiul unui obiect,al unei variabile,sau metode.Cuvintele cheie folosite pentru a
ii defini sunt static,final,native,si transient.
Pentru a exclude un membru de date dintr-un flux puteti declara membrul ca si transient.Acest lucru
impiedica metoda sa scrie acel camp intr-un flux.Declarand un membru ca si transient atunci cand un
obiect este citit dintr-un flux,campurile de date transient vor fi setate la valorile lor implicite.De
exemplu,intregii vor fi setati la 0,si sirurile vor fi setate ca null.Daca trebuie sa restaurati datele
transient la valorile ne-implicite,va trebui sa implementati o metoda.Atunci cand obiectele sunt
serializate,membrii de date transient sunt omise.

112

Capitol 3: Componentele limbajului Java

3.5.10 Mutabilitate
113

Capitol 3: Componentele limbajului Java


Cuvantul cheie final este folosit pentru a declara o metoda,un atribut,sau un obiect care nu poate fi
modificat.
In clasa Student ilustrata in figura,studentName este declarat final.Atunci cand un obiect Student este
creat,valoarea studentName nu poate fi modificata.Numele obiectului apelat de catre s1 nu poate fi
nici el modificat.Obiectul String ce reprezinta numele nu exista.Obiectele apelate de catre s3 si s4 sunt
setate ca si studentNames denumite "Mary Jane"si "Mary Martin". Acestea nu pot fi
modificate.Atributul studentName este invariabil.Valoarea unui atribut non-static care este declarat ca
si final trebuie sa fie atribuit in constructor.

3.6.1 Crearea de obiecte folosind constructori


Crearea unui obiect consta in cinci pasi:
1.Declararea unei variabile referinta pentru obiect,care initiaza o cerere de stocare si de alocare in

RAM
2.Initializare implicita,care seteaza valorile implicite ale obiectelor bazate pe tipul datelor.
3.Initializare explicita de valori
4.Executarea constructorului
5.Atribuirea referintei adresei unui obiect la variabila
In clasa Student,metoda main() a fost folosita pentru a crea obiecte Student.

3.6.2 Crearea de obiecte folosind alte clase


Alta clasa va folosit des clasa Student.Mai jos este un exemplu.
Clasa Student din Figura nu are o metoda main() pentru a crea obiecte Student.Clasa Teacher va
crea aceste obiecte.Acestea sunt ilustrate in Figura .
Ex: vezi clasele Studnet si Teacher

114

Capitol 3: Componentele limbajului Java

Rezumat
Acest modul a introdus cateva elemente de Java.Succesul unui program depinde de folosirea
corespunzatoare a regulilor limbajului si a documentiei functionalitatilor programului.Refolosirea
codului este o caracteristica principala Java.Aceasta trasatura este suportata de documentatia
functionalitatilor publice pentru un program.
Documentatia programului beneficiaza programatorului si altor utilizatori ai unei clase.Utilitarul
javadoc interpreteaza etichetele care sunt introduse in codul sursa pentru a crea documente
HTML.Aceste tipuri de comentarii sunt incluse in documentatia /** */. API-ul este disponibil in
format HTML.Acesta este o referinta pentru folosirea setului extins de clase care formeaza platforma
limbajului Java.
Java are un set bogat de cuvinte cheie si simboluri.Cuvintele rezervate pot fi folosite pentru a defini
cateva tipuri de valori precum true,false,si null.Cuvantul cheie new necesita spatiu de stocare pentru
un obiect.Acesta este cunoscut ca si operatorul new.Cuvintele cheie public,private,protected,static si
final sunt modificatorii de clase,date,sau metode.
Cuvantul cheie static este un specificator de date sau metode si mai este cunoscut ca si classbased.Cuvantul cheie final este si el un specificator de date sau metode si este cunoscut ca si constanta.
Identificatorii sunt etichete pe care programatorii le atribuie datelor sau locatiilor de
stocare.Identificatorii mai sunt atribuiti numelor de clase si numelor de metode.Folosirea
parantezelor,punct si virgula,virgule,si spatii sunt uzuale in cod.Ele trebuie sa se supuna regulilor de
sintaxa Java.
Java este cunoscut ca un limbaj "strongly typed". Acest lucru inseamna ca este importanta stocarea
datelor si ca exista legatura intre tipurile datelor si cantitatea de stocare.Exista sase locuri de stocare a
datelor.Acestea includ stocarea in registrii CPU,RAM,non-RAM precum in spatiul de pe hard
disk.Memoria RAM este impartita in stiva,heap,si memorie constanta.Marimea de stocare este
numarul de biti necesari pentru stocarea reprezentatiei unui numar,simbol caracter,sau simbol boolean.
The Java data types are as follows:
- boolean
- char
- byte
- short
- int
- long
- float
- double
- reference

115

Capitol 3: Componentele limbajului Java


Tipurile de date primitive nu sunt obiecte.Clasele care creeaza obiecte ce stocheaza valoarea unei
primitive sunt cunoscute ca si clase de impachetare.Aceste clase impacheteaza trasaturi si capabilitati
in jurul unei valori.
Toate limbajele au reguli de punctuatie,gramatica,si vocabular.In programare,aceastea reprezinta
sintaxa limbajului.Sintaxa se refera la regulile pentru folosirea simbolurilor si a cuvintelor cheie intrun limbaj.
Mai jos sunt cateva reguli de sintaxa:

- Declararea de variabile
<modifiers>datatype identifier;
- Declararea unei clase
<modifiers>class classname
{
// definition
}
- Declararea de metode
<modifiers>return-type methodname (<modifier
data-type identifier>, <modifier data-type
identifier>, ...)

{
// method instructions
}
-Declararea de constructori
<modifiers>Classname (modifier data-type
identifier>, <modifier data-type identifier>, ...)

{
116

Capitol 3: Componentele limbajului Java

// constructor instructions
}
Modificatorii includ modificatori de acces si specificatori.Modificatorii
public,private,protected si default.Specificatorii sunt static si final.

de

acces

sunt

Mecanismul de garbage collector este un program special ce este rulat de catre JVM pentru a elibera
memorie.Un programator poate seta un obiect pentru distrugere printr-o referinta null la obiect.Metoda
finalize poate fi setata pentru a efectua activitati de curatare,precum inchiderea fisierelor sau salvarea
datelor intr-un fisier.

117

Capitol 4: Operatorii si structurile de control ale limbajului Java

Capitol 4: Operatorii si structurile de control ale limbajului


Java
Prezentare generala
Acest modul demonstreaza studentilor cum sa creeze expresii care sunt folosite pentru a manipula
datele obiect si datele metodelor.Aceste expresii folosesc operatori de acces al obiectului,aritmetici,si
logici.Studentii vor identifica si aplica acesti operatori pe baza ordinei de precedenta si a proprietatilor
de asociere.
Studentii sunt invatati cum sa foloseasca structurile de control pentru a schimba cursul instructiunilor
dintr-o metoda.Cele doua tipuri principale de structuri de control sunt structuri de control al buclelor si
structuri de control al deciziilor.Structurile de control al buclelor repeta un set de
instructiuni.Structurile de control al deciziilor includ operatorii switch,if,si cei conditionali care sunt
folositi pentru a efectua operatii complexe cu date.
Un link catre tabela de operatori apare pe fiecare pagina.Acest link deschide un fisier pdf care
ilustreaza precedenta operatorilor in Java.
Cuvinte cheie
- Operatori
- Precedenta operatorilor si proprietatea de asociativitate
- Tipul de date logic
- Operatori de comparatie
- Operatori logici
- Operator conditional
- Operatori la nivel de bit
- Conversii si schimbari de tip
- Tipul de date caracter
- Caractere Unicode
- Clasele String si StringBuilder
- Supraincarcare

- Concatenare
- Structuri de control
- Structuri de control pentru selectie
- Structuri de control pentru repetitie
- Clasa System
- Clase esentiale
4.1.1 Operatii cu obiecte
Manipularea datelor este efectuata prin intermediul operatorilor.Folosirea datelor si a operatorilor
pentru a obtine un rezultat este cunoscuta ca o formula sau o expresie.In Java,expresiile sunt parti ale
declaratiilor.Valorile membrilor obiect si clasa,sau campuri si sunt lucrurile pe care se opereaza.Si
118

Capitol 4: Operatorii si structurile de control ale limbajului Java


valorile variabilelor locale sau de metode pot fi operate.Expresiile pot include operatii
aritmetice,comparatii si conversii.Datele sau valorile folosite intr-o expresie se numesc
operanzi.Numarul de operanzi necesari pentru a completa o expresie si pentru a obtine un rezultat
depinde de operatorul folosit.Operatorii unari necesita un singur operand.Acestea includ operatorul
obiect new si operatorul de incrementare ++. Majoritatea operatorilor necesita doi operatori.Acestia se
numesc operatori binari.Ei includ operatori de aritmetica simpla,de comparatie si logici.In Java exista
un operator ternar sau conditional.Acesta necesita trei operanzi.Faceti referire la tabelul de operatori
pentru a explora aceste tipuri.
Exista doi operatori principali folositi cu obiecte.Acestia sunt operatorul new si operatorul
punct.Operatorul new este folosit pentru a crea un obiect.Acest lucru este ilustrat in Figura . Noul
operator necesita folosirea unui constructor ca si operand,si rezultatele crearii unui obiect si a unui
constructor pentru clasa care este incarcata si ruleaza.Instructiunile din constructorul clasei sunt
folosite pentru a aloca memorie si pentru a atribui orice valori initiale.Referinta la adresa obiectului
din memorie este stocata in variabila din stanga simbolului de atribuire,care este un semn de egal (=).
De exemplu,s1 contine o valoare care apeleaza un obiect ce a fost creat de catre expresia din dreapta
simbolului de atribuire.Acestea se numesc variabile referinta si sunt folosite pentru a opera cu un
obiect.
Operatorul punct este folosit pentru a accesa metodele publice sau campurile unui obiect.Acest lucru
este ilustrat in Figura . Clasa Student defineste cateva campuri private.Acestea nu pot fi accesate cu
operatorul punct.Operatorul punct este folosit pentru a accesa metoda publica printData a clasei
Student.Operatorul punct mai este folosit pentru a accesa date publice din obiectul Student apelat de
s1.In definitia unei metode,nu e necesara folosirea notatiei punct pentru a accesa datele obiect.In
Figura , metoda printData a clasei Student nu foloseste operatorul punct pentru a accesa atributul
grade.
Atunci cand obiectele unei clase sunt create in alta clasa,numai datele publice si metodele obiectului
pot fi accesate.In Figura , clasa Teacher creaza obiecte Student si acceseaza metodele publice ale
acestor obiecte cu operatorul punct.In clasa Student,variabila courseNumber este declarata public si
static.Datele acestei variabile pot fi partajate cu toate obiectele clasei.Atunci cand obiectul Teacher
recupereaza datele courseNumber,sintaxa foloseste numele clasei si operatorul punct pentru a recupera
datele din campul public courseNumber.
Operatorul punct poate fi legat de mai mult de o metoda sau obiect.De exemplu,atributul studentName
al clasei Student este un obiect String.Clasa String mai are o metoda denumita length ce returneaza
lungimea obiectului String.Pentru a determina lungimea numelui unui student,codul poate fi scris cu
notarea operatorului punct.Declaratia folosita pentru a arata numele studentului si lungimea sa poate
semana cu cea ilustrata in Figura . Operatorul punct functioneaza de la stanga la dreapta.In acest
caz,parantezele au precedenta.Obiectul Student apelat de s1 acceseaza atributul studentName si
metoda length() ale clasei String cu operatorul punct.Acesta returneaza un obiect String in interiorul
parantezelor.Metoda System.out.println foloseste obiectul String ca argument al sau.
119

Capitol 4: Operatorii si structurile de control ale limbajului Java


In clasa Teacher din Figura , numarul de caractere din numele unui student este printat cu metoda
object.getName().length(). Operatorul punct este apoi folosit cu obiectul String pentru a determina
lungimea numelui.

4.2.1 Operatori de atribuire


Operatorul de atribuire este semnul egal (=). Atunci cand sunt folositi operatori de atribuire,exista
cateva reguli ce trebuie urmate:

- Toate numerele trebuie sa fie cu semn.


- Tipul de date logic poate fi adevarat sau fals.
- Operanzii dreapta si stanga trebuie sa fie atribuiti compatibil.
Java functioneaza numai cu numere cu semn.Fiecare numar cu semn contine un bit de semn care
ilustreaza daca este pozitiv sau negativ.Al optulea bit al unui byte este folosit pentru a determina
semnul numarului.Bitul de semn este 1 pentru numerele negative si 0 pentru numerele pozitive.Daca
numarul este 0,bitul de semn este 0.Codul din Figura ilustreaza cum sa fie declarate si atribuite
valori variabilelor cu tipuri de date primitive.
In Java,unui operator logic trebuie sa ii fie atribuit cuvantul cheie adevarat sau fals.Spre deosebire de
C++, 1 si 0 nu pot fi folositi pentru adevarat si fals.Codul din Figura ilustreaza acest lucru si cateva
alte erori comune.
Figura

ilustreaza ca operanzii stang si drept trebuie sa fie compatibili.

4.2.2 Operatori aritmetici


Valorile stocate in calculator pot avea nevoie sa fie modificate prin adunare,scadere,inmultire si
impartire.Java asigura utilizarea simbolurilor operator care sunt similare cu simbolurile
algebrice.Acestea sunt ilustrate in Figura .
Impartirea intregilor va avea ca rezultat un intreg.Orice fractie sau rest se pierde.Acest lucru este
ilustrat in Figura . Operatorul procent (%) este folosit pentru a obtine restul la impartirile
intregilor.Acest operator mai poate fi folosit pentru a determina daca un numar este impar sau par sau
pentru a calcula orele si minutele dintr-un numar total de minute.El este folosit indeosebi cu intregii.
Un exemplu de cod ce foloseste operatori aritmetici este ilustrat in Figura
Folositi activitatea din Figura

pentru a invata despre operatorii aritmetici Java.

120

Capitol 4: Operatorii si structurile de control ale limbajului Java


Java mai include operatori unari,care au nevoie doar de un singur operand.Acestia sunt operatorii de
adunare,scadere,plus unari,minus unari,inversii la nivel de biti,complementi logici,si inmultire si
impartire.
Operatorii unari sunt des folositi pentru a simplifica o expresie de atribuire.Operatiile aritmetice sunt
implicit definite ca si parte a atribuirii.Operatorii simpli pot fi folositi asa cum este ilustrat in Figura .
Aveti grija cu "gotcha"atunci cand este folosit operatorul de atribuire +=, asa cum este ilustrat in
Figura .
O operatie comuna este aceea de a aduna si scade numerele cu unu.Operatorii din Java care furnizeaza
aceasta functie sunt cei de incrementare,care adauga cu unu si de decrementare,care scade cu
unu.Acesti operatori pot fi asezati inainte sau dupa valoare.Asezarea operatorului are un impact asupra
rezultatelor.Acest lucru este ilustrat in Figura . In primele doua exemple,asezarea nu afecteaza
rezultatele.In urmatoarele doua exemple,o afecteaza.Atunci cand operatorii sunt asezati inaintea unei
valori,ei se numesc operatori pre-fix.Atunci cand acestia sunt asezati dupa o valoare ei se numesc
operatori post-fix.Asezarea operatorilor de incrementare si decrementare va avea un impact atunci
cand valoarea este parte a unei expresii.O tabela cu operatori Java este ilustrata in Figura .

4.2.3 Precedenta operatorilor


Java efectueaza operatiile intr-o ordine specifica.Aceasta ordine este bazata pe precedenta
operatorului.Precedenta este un set de reguli care se aplica la folosirea tuturor operatorilor.
Analizati expresia:
number = 8 + 170 * 3
Figura ilustreaza faptul ca doua rezultate ar putea fi obtinute pe baza ordinii operatorilor.Pentru a
evita acest lucru,Java atribuie precedenta fiecarui operator.Acest lucru determina ordinea in care se
efectueaza operatiile.Fiecare operator este atribuit unui grup de precedenta.Toti operatorii dintr-un
grup au prioritate fata de operatorii din grupul anterior lor.Acest lucru permite Java sa efectueze
operatiile intr-o maniera consistenta.
Intr-o expresie complexa cu multe operatii,un programator poate seta ordinea cu paranteze si operatori
unari.Expresiile care nu au paranteze sunt greu de citit.Pentru a evita confuzia si erorile,clarificati
ordinea operatiilor cu paranteze.Figura ilustreaza rezultatul unei expresii neclare.Ambii operatori de
adunare (+) si de incrementare (++) sunt folositi.Din moment ce nu exista paranteze pentru a defini
precedenta,expresia este evaluata pe baza spatiilor.Atunci cand trebuie facuta o alegere,operatorul ++
are precedenta fata de operatorul +. Acesta va incrementa valoarea lui x dupa ce este folosit in
expresie.Rezultatul final este 60 atunci cand valorile operanzilor sunt folosite.In al doilea exemplu
spatiul dintre cei doi operatori reduce confuzia.Operatorul ++ se comporta intr-o maniera pre-fixa si
incrementeaza valoarea lui y inainte sa fie folosit in expresie.Acest lucru va produce un rezultat diferit.
121

Capitol 4: Operatorii si structurile de control ale limbajului Java

4.2.4 Proprietatile asociative ale operatorilor


Atunci cand operatorii din acelasi grup au precedente egale,ei sunt executati de la dreapta la stanga sau
de la stanga la dreapta.Proprietatile asociative ale unui grup de operatori sunt:

- Expresiile aritmetice sunt asociative de stanga.Acest lucru inseamna ca ele sunt evaluate de la stanga
la dreapta.

- Operatorii de atribuire sunt asociativi de dreapta.Acest lucru inseamna ca valoarea trebuie sa fie
determinata inainte de a fi atribuita.
Folositi activitatea din figura pentru a deveni familiar cu ordinea de precedenta si folosirea
parantezelor pentru a administra aceste reguli.

4.2.5 Calcule aritmetice


Folositi instructiunile urmatoare pentru a crea expresii aritmetice:

-" Folositi parantezele pentru a evita ambiguitatea.


-" Luati in considerare marimea valorilor returnate si pierderea preciziei.
-" Inmultiti inainte de impartire.
-" Scoateti semnele negative ale numerelor din calculele de inmultire sau impartire si gasiti
rezultatul.Semnul operandului stang este semnul rezultatului.

-" Folositi operatorul + pentru a aduna numere si a concatena obiectele String.


-" Tineti minte ca operatorii unari diferiti de cei de incrementare post-fix si cei de decrementare postfix sunt evaluati de la dreapta la stanga.
Folositi activitatea din Figura

pentru a gasi rezultatele unor declaratii de cod.

Exemplul din Figura ilustreaza ca un programator trebuie sa se uite la tipul datelor si la ordinea
operatiilor pentru a se asigura ca intr-un obiect sunt stocate valori corecte.Rezultatul acestui cod este
ilustrat in Figura .
Completati propozitiile ce descriu instructiunile operatorului din Figura

4.2.6 Date de tip logic


Operatorul logic se bazeaza pe comparatiile cu adevarat sau fals.Ca si tipurile de date numerice,tipul
de date logic poate contine valori diferite la momente diferite de timp.O variabila logica poate contine
doua valori literale,care sunt adevarat si fals.Codul ilustrat in figura este un exemplu de declaratie si
122

Capitol 4: Operatorii si structurile de control ale limbajului Java


initializare a unei variabile logice.Valoarea unei variabile logice poate fi atribuita cu literalii adevarat
si fals.Mai poate fi atribuita si pe baza rezultatului unei expresii logice.O expresie logica compara
rezultatul uneia sau mai multor expresii.Daca lui x ii este atribuita valoarea 10,si lui y valoarea
10,atunci o comparatie a lui x cu y folosind operatorul mai mare (>) va rezulta fals.Daca cele doua
variabile sunt comparate cu operatorul egal (=), va rezulta adevarat true.

4.2.7 Operatori logici sau de comparatie


Java suporta sase operatori de comparatie.Acestia sunt ilustrati in Figura . Valorile bazate pe
rezultatele acestor comparatii pot fi atribuite variabilelor logice.Acest lucru este ilustrat in
exemple.Atunci cand sunt folositi oricare dintre operatorii ce au doua simboluri,nu poate exista nici un
spatiu intre simboluri.
Expresiile care folosesc operatori aritmetici rezulta in numere.Operatorii de comparatie rezulta intr-o
valoare logica de adevarat sau fals.Figura indica cateva expresii de comparatie.Evaluati-le pe fiecare
pentru a-i gasi rezultatul logic.
Operatorii de comparatie si cei logici sunt des folositi pentru a forma conditii.In cazul in care
conditiile sunt testate si rezultatul logic al testului este folosit pentru a decide pasul urmator,acest lucru
poate schimba ordinea instructiunilor unei metode.Operatorii de comparatie si cei logici sunt folositi in
instructiunile if,for,si while.
Exista trei tipuri de comparatii.Acestea sunt ilustrate in Figura . Rezultatele logice ale comparatiilor
pot fi evaluate cu operatori logici.Operatorii logici necesari sunt SI (&), SAU (|), SAU exclusiv (^),
si operatorii de scurtcircuit precum operatorul logic SI (&&) si operatorul logic SAU (||). Acestia sunt
ilustrati in Figura .
Operatorii &&si || efectueaza expresii logice de scurtcircuit.Acestea sunt ilustrate in Figura .
Operatorul sau exclusiv rezulta adevarat daca fie operandul este adevarat si fals atunci cand ambii
operanzi sunt adevarat sau fals.
Expresia logica ce formeaza argumentul declaratiei if este legala si sigura.Acest lucru are loc deoarece
a doua sub-expresie este sarita atunci cand prima sub-expresie este falsa.Intreaga expresie este
intotdeauna falsa atunci cand prima sub-expresie este falsa.
Daca este folosit operatorul || si prima expresie returneaza adevarat,a doua expresie nu este evaluata
deoarece intreaga expresie este cunoscuta ca si adevarata.
Operatorii &&si || accepta operanzi logici si evalueaza operandul drept daca rezultatul nu este
determinat de catre operandul stang.Rezultatul se bazeaza pe identitatile ilustrate in Figura .
In Figura , fiecare pereche de expresii de comparatie este efectuata cu un operator logic.Gasiti
rezultatul logic in expresie.
123

Capitol 4: Operatorii si structurile de control ale limbajului Java

4.2.8 Operatorul conditional


Analizati atribuirile din Figura . Valoarea lui scorelevel depinde de scor.Daca scorul este mai mare
decat 20, "A"va fi stocat in scorelevel.Daca scorul este mai mic sau egal cu 20, "B"va fi stocat in
scorelevel.Acest exemplu ilustreaza ca pot fi atribuite valori diferite aceleiasi variabile daca este
folosit operatorul conditional.Sintaxa pentru acesta este ilustrata in Figura .
Mai jos sunt cateva instructiuni pentru a folosi un operator conditional:

-Sintaxa este a = x ? b : c;.


- Valoarea tipului de date a lui x trebuie sa fie logica,sau x trebuie sa fie o expresie ce rezulta intr-o
valoare logica.

- Valoarea tipului de date pentru b si c trebuie sa fie compatibila cu a.


- O declaratie if poate efectua aceeasi sarcina ca un operator conditional.
- Valoarea lui a este aceeasi cu valoarea lui b in cazul in care conditia este adevarata sau c in cazul in
care confiditia este falsa.
Analizati codul din Figura

4.2.9 Operatori pe biti


Un programator poate manevra datele la nivelul de bit al valorii reprezentate.Se poate lucra cu doua
tipuri de operatori la nivelul de bit al valorii unor date.Acestia sunt operatorii de deplasare si cei
logici.Operatorii de deplasare schimba pozitia bitilor dintr-un numar pentru a-i creste sau scade
valoarea.Operatorii la nivel de bit deplaseaza bitii din versiunea binara a operandului stang.De
exemplu,2000 <<3,va deplasa bitii pentru operandul 2000.De cate ori bitii vor fi deplasati la stanga
este reprezentat de catre operandul 3.
Operanzii ar trebui sa fie tipuri intregi care sunt de regula int sau long.Tabela din Figura
sumarizeaza operatorii de deplasare in Java.Reprezentatia binara a numarului intreg 13 este
1101.Propozitia 13 >>1 deplaseaza bitul cel mai mare in partea dreapta.Acest lucru rezulta in forma
binara a numarului 6,care este 0110.Bitii din partea stanga sunt umpluti cu cate 0-uri sunt
necesare.Bitii din partea dreapta a numarului original sunt pierduti.Deplasarea la dreapta furnizeaza
acelasi rezultat cu 13 impartit la 2 ridicat la puterea lui 1.
Analizati reprezentatia pe 32 de biti a valorii int 10540.Ce numar este reprezentat de fiecare dintre
deplasarile ilustrate in Figura ?
Operatorii logici la nivel de bit sunt ilustrati in Figura . Figura ilustreaza rezultatele.Tabela
operatorului "&" ilustreaza ca atunci cand operanzii sai sunt numere,operatia &efectueaza functia la
124

Capitol 4: Operatorii si structurile de control ale limbajului Java


nivel de bit SI pe fiecare pereche paralela de biti din fiecare operand.Functia SI seteaza bitul returnat
la 1 daca bitul din ambii operanzi este 1.Propozitia folosita pentru a aplica functia SI pentru valorile 13
si 12 este 13 &12.Rezultatul acesteia este 12 deoarece reprezentatia binara a lui 12 este 1100,si
reprezentatia binara a lui 13 este 1101.Atunci cand ambii operanzi sunt numere,operatorul | efectueaza
operatia de SAU inclusiv si ^ efectueaza operatia de SAU exclusiv,sau operatia XOR.Operatia SAU
inclusiv inseamna ca daca oricare din cei doi biti este 1,rezultatul este 1.Operatia SAU exclusiv
inseamna ca bitii celor doi operanzi sunt diferiti rezultatul este 1.Daca ei sunt aceiasi rezultatul este
0.Operatorul de complementare inverseaza valoarea fiecarui bit a operandului.Daca bitul operandului
este 1 rezultatul este 0.Daca bitul operandului este 0 rezultatul este 1.Figura ilustreaza mai multe
exemple de operatii logice la nivel de bit.
Folositi activitatea din Figura

pentru a gasi numarul reprezentat de catre fiecare dintre schimbari.

Colectiile de biti pot fi folosite pentru a economisi spatiul de stocare daca sunt necesare multe valori
logice,sau pentru a reprezenta starea intrarii binare de la echipamentele fizice.De exemplu,rezultatele
unui chestionar cu raspunsuri da si nu ar putea fi salvate ca si valori logice si operatii ar putea fi
efectuate folosind operatori logici la nivel de bit.Manipularea la nivel de bit pot fi folosita pentru a
administra seturile de flag-uri logice.Un program poate avea mai multe flag-uri logice pentru a ilustra
proprietatile diferitelor componentelor dintr-un program,precum visibile sau draggable.Un
programator ar putea defini o variabila denumita flags pentru toate componentele in loc sa defineasca
variabile pentru fiecare.Fiecare bit din cadrul variabilei flags ar reprezenta starea unuia dintre flaguri.Manipularea bitilor poate fi folosita pentru a seta si a obtine fiecare flag.In primul rand,setati
constantele ce indica flag-urile pentru program.Fiecare flag ar trebui sa fie o putere diferita a lui 2
pentru a va asigura ca fiecare bit este folosit numai de catre un singur flag.Codul exemplu din
Figura seteaza flag-urile la 0.Acest lucru inseamna ca toate flag-urile sunt false din moment ce nici
unul dintre biti nu este setat.

4.3.1 Conversii implicite si schimbari de tip


O valoare a unui tip trebuie des sa fie atribuita unei variabile de alt tip.In acest caz,sunt aplicate cateva
reguli de atribuire.Java ofera conversia automata a tipurilor intre variabilele din aceeasi familie de
tipuri.De exemplu,o variabila byte este atribuita unui int cu usurinta si conversia este implicita.Un byte
este mai mic decat un int si face parte din aceeasi familie de tipuri numerice.O expresie este deseori
compatibila pentru atribuire daca variabila ce primeste atribuirea are un tip de date care are cel putin
atatia biti ca si tipul expresiei.Daca cele doua tipuri sunt compatibile,Java efectueaza conversia.De
exemplu,o valoarea int poate fi intotdeauna atribuita unei variabile long.
Java atribuie tipurile implicite literalilor numerici.Figura ilustreaza tipurile implicite.In cazul
valorilor literale,intregii sunt stocati ca si int si toate numerele reale sunt stocate ca si double.Atunci
cand sunt atribuiti literalii,asigurati-va ca declararea valorii literalului este corecta.Figura ilustreaza
exemple de propozitii de atribuire corecte si incorecte.
125

Capitol 4: Operatorii si structurile de control ale limbajului Java


Conversia atribuie o valoarea de un tip unei variabile de alt tip.Codul mostru din Figura ilustreaza
conversia de la un tip de date la altul.Daca informatiile vor fi pierdute intr-o atribuire,compilatorul
cere utilizatorului sa confirme atribuirea cu un typecast.Acest lucru poate fi realizat atunci o valoare
long este introdusa intr-o variabila intreaga.Acest lucru se numeste conversie explicita.Aceasta este
ilustrata in Figura . Tipul dorit este asezat intre paranteze si folosit ca si prefix pentru expresia care
trebuie modificata.Expresia care va fi schimbata ar trebui sa fie intre paranteze.Daca nu
este,precedenta operatiei de conversie poate cauza probleme.
Variabilele pot fi promovate la o forma mai lunga,in care nu exista pierderi de informatii.Acest lucru
este ilustrat in Figura . Pentru operatorii binari precum operatorul +, atunci cand cei doi operanzi
sunt de tipuri primitive,rezultatul este promovat la un tip mai mare de operanzi sau un int.Acest lucru
depinde de care tipul mai mare.Astfel ar putea rezulta intr-un debit sau pierdere a preciziei.Acest lucru
este ilustrat in Figura . Acest cod cauzeaza o eroare deoarece promoveaza a si b la int inainte sa faca
operatii asupra lor.Incearca apoi sa atribuie valoarea int lui c,ceea ce rezulta intr-o pierdere a
preciziei.Daca c este declarat ca si int,sau un typecast este efectuat asa cum este ilustrat in Figura ,
atunci codul ar functiona.
Nu exista schimbari intre tipurile intreg si tipul logic.Unele limbaje precum C si C++ permit valorilor
numerice sa fie interpretate ca si valori logice.Acest lucru nu este permis in Java.Atunci cand este
necesar un tip logic,numai valorile logice pot fi folosite.

4.4.1 Tipul de date caracter


Java ofera doua optiuni pentru a reprezenta datele textuale.Pot fi reprezentate ca un caracter stocat
intr-un tip de date primitive char sau ca si sir de caractere intr-un obiect al clasei String sau
StringBuffer.Tipul de date char stocheaza un singur caracter Unicode pe 16 biti.Trebuie sa aiba
literalii sai intre ghilimele simple ('')asa cum este 'A' pentru litera A.
Folositi backslash pentru a reprezenta literalul pentru caracterele de ne-printare si cele
speciale.Acestea sunt ilustrate in Figura . Unicode poate fi de asemenea folosit pentru a reprezenta
aceste caractere.
Unele declarari si atribuiri ale datelor char sunt ilustrate in Figura

Operatiile cu datele char includ conversia unei valori char la int,sau conversia unei valori int la
char.Datele de intrare pentru un program de la majoritatea echipamentelor sunt primite ca un sir de
biti.In Java,acesti biti trebuie sa fie schimbati in int,si apoi in char.Valoarea int pentru fiecare char este
definita in simbolurile Unicode pentru fiecare limbaj.Valoarea char '9'are o valoare int de 57.O
referinta care poate ajuta utilizatorii sa converteasca de la char la int este un subset ASCII a tabelei
Unicode,care poate fi gasita pe website-ul Unicode.

126

Capitol 4: Operatorii si structurile de control ale limbajului Java


Figura ilustreaza conversia unui char la un int si a unui int la un char si operatii exemplu cu date de
tip char.Cu valorile unei variabile char se poate opera ca si cu valorile int.Rezultatul este un int,care
este apoi convertit intr-un caracter bazat pe setul de limbaj-caracter folosit.

4.4.2 Operatii cu siruri de caractere


O simpla definitie a unui String este colectia unuia sau mai multor caractere Unicode stocate intr-un
obiect.Toate tipurile de date char stocheaza un caracter Unicode.Un String este mai mult decat un
caracter intre doua ghilimele (""). Astfel,'a' este un caracter si 'abc' este un sir.Valorile String sunt
grupuri de caractere.Valorile String nu fac parte din tipurile de date primitive.Obiectele clasei String
sunt folosite pentru a lucra cu valorile text ale mai mulor caractere.
Operatorul + se poate folosi pentru a concatena sirurile.Metodele clasei String pot fi folosite pentru a
efectua operatii complexe pe siruri.De exemplu "abc" + "def"va rezulta in sirul "abcdef". Operatorul
+ este un operator supraincarcat in limbajul Java.Termenul de supraincarcat se aplica operatorilor si
metodelor cu acelasi nume sau simbol care sa se comporte in acelasi mod cu mai multe tipuri de
operanzi.Operatorul + accepta valori numerice si valorile String ca si operanzi.
Toate tipurile de date pot fi convertite intr-un sir.Clasa String se ocupa de convertirea primitivelor.O
primitiva nu poate fi atribuita direct unui sir.Primitiva se poate alatura unui sir si rezultatul poate fi
stocat intr-un obiect String.Atunci cand un sir este concatenat unei valoari ce nu este sir prin folosirea
operatorului supraincarcat +, cealalta valoarea este convertita la String.Fiecare obiect poate fi
convertit la String cu metoda toString().
Codul din Figura pentru clasa AllStrings ilustreaza atribuirea incorecta a primitivelor la un
sir.Atribuirea corecta necesita ca primitive sau obiectul sa fie legat de sir.Clasa corectata AllStrings
este ilustrata in Figura .
Utilizarea operatorului + cu obiecte String are unele efecte negative.Exemplele din Figura ilustreaza
comportamentul operatorului.Clasa AllStrings a fost modificata pentru a demonstra aceste efecte
negative.Analizati cum va actiona operatorul +. Daca are numere ca ambii sai operanzi,atunci va avea
loc un calcul numeric.Daca unul dintre operanzi este un sir atunci rezultatul este o operatie de
concatenare.

4.4.3 Introducerea claselor String si StringBuilder


Java ofera doua clase principale care sunt folosite pentru a stoca si manipula datele textuale.Acestea
sunt clasa String si clasa StringBuffer.Aceste clase sunt introduse deoarece anumite date trebuie sa fie
stocate ca si text.Membrul out al clasei System si metoda sa println vor fi folosite pentru a afisa
datele.Metoda println accepta un sir ca si argument.

127

Capitol 4: Operatorii si structurile de control ale limbajului Java


Atunci cand un obiect String este creat,valoarea sa nu se poate schimba,Priviti codul din Figura .
Variabila de referinta aphrase este atribuita sirului de caractere "Teacher". In a doua declaratie,datele
obiect String sunt modificate pentru a adauga fraza "Loves teaching". JVM face o copie a datelor din
obiect si creaza un nou obiect care va contine rezultatul adaugarii celor doua siruri.Referinta la acest
obiect este atribuita variabilei aphrase.
Cateva instructiuni pentru folosirea obiectelor String sunt ilustrate in Figura .
Din moment ce obiectele String nu pot fi modificate,operatiile de concatenare a sirurilor folosesc
multa memorie.Clasa principala Java StringBuffer asigura stocarea sirurilor ce se vor modifica.Clasa
StringBuffer ar trebui sa fie folosita pentru a stoca datele sir ce se vor modifica.
Intr-un obiect Teacher,numele cursului nu este predispus pentru modificare dar numele profesorului ar
putea fi.In acest caz,folositi obiectul StringBuffer pentru a stoca numele Teacher si obiectul String
pentru a stoca numele cursului.

4.5.1 Structuri pentru controlul executiei


Toata logica de programare poate fi impartita in una din trei structuri de control.Acestea sunt
secventa,selectie sau decizie,si repetare.O structura de control este o secventa standard de pasi logici
pentru a controla executia declaratiilor.Scopul acestor structuri este de a defini cursul logic al
procedurii.Toate aceste structuri pot fi localizate una inauntrul celeilalte.De exemplu,o structura
secventa poate fi continuta inauntrul unei selectii.O selectie si o secventa pot fi continute inauntrul
unei repetari.
O trasatura importanta a limbajelor orientate pe obiect este aceea ca structurile de control sunt folosite
numai in metodele unei clase.In limbajele procedurale,intregul program implementeaza structuri de
control.Limbajele de programare procedurale folosesc o ordine textuala pentru executia
instructiunilor.Programul va incepe cu prima declaratie si va continua in secventa pana cand o
structura de control cauzeaza programul sa schimbe cursul executiei.In programarea orientata pe
obiecte,ordinea textuala a instructiunilor este impusa cu o metoda.In definitia unei clase,ordinea in
care sunt definite metodele se bazeaza pe conventia de codare.Definitiile clasei nu definesc o secventa
sau ordine dupa care sunt executate metodele.
Modulul 3 introduce clasele Student si Teacher.Aceasta sectiune adauga un nou atribut denumit
pointEarned si o noua metoda denumita getPoints() clasei Student.Acestea sunt ilustrate in Figura .
Acestea vor fi folosite pentru a demonstra structurile de control pentru luarea de decizii si repetare in
metoda main din clasa Teacher.Clasa Teacher este ilustrata in Figura .

4.5.2 Tipuri de structuri de control


Cea mai fundamentala structura de control este secventa.In figura,actiunile sunt efectuate pana cand
vor fi toate terminate.
128

Capitol 4: Operatorii si structurile de control ale limbajului Java


Structura de control selectie este folosita pentru a instrui un program ce actiune sa efectueze pe baza
unei conditii.Exista doua tipuri de structuri de control de selectie folosite in Java.Acestea sunt structuri
if-then-else si pot cauza control asupra structurilor de switch.
Repetarea structurii de control este folosita pentru a instrui un calculator sa efectueze repetat un set de
actiuni.Aceasta structura mai este denumita bucla sau iteratie,care inseamna repetare.Exista trei
structuri de repetare disponibile in Java.Acestea sunt bucla for,bucla while,si bucla do.

4.5.3 Instructiunea if
Declaratiile conditionale permit executia unei parti de program bazat pe valoarea unor expresii.Java
suporta declaratia if pentru alternative cu doua cai.Acestea sunt ilustrate in Figura . Intr-o declaratie
if,actiunile sunt efectuata pe baza unei conditii.Conditia este o expresie logica sau valoare.Conditia
trebuie sa fie true sau false.
Sintaxa de baza pentru o declaratie if/else este ilustrata in Figura

Daca sunt folosite imbricari,operatorul scurcircuit poate fi folosit in locul unei declaratii if.Acest lucru
este ilustrat in Figura .
In unele cazuri,operatorul conditional poate fi folosit in locul unei declaratii if.Acest lucru este ilustrat
in Figura .
Toate cele trei exemple cu clasa Teacher contin urmatoarea atribuire:
int score = s1.getPoints() * 100 / totalPoints;
Operatorii de impartire si inmultire au acelasi grup de precedenta si sunt asociativi de la stanga la
dreapta.Aceasta declaratie poate fi mai clara daca sunt folosite paranteze:
int score = (s1.getPoints() * 100) / totalPoints;
Astfel punctele studentului,sunt inmultite cu 100,impartite cu totalPoints pentru a produce un procent.

4.5.4 Conditii multiple pentru if


Declaratia if poate fi folosita si pentru a lega o serie de conditii.Acest lucru este ilustrat in Figura
Sintaxa de baza pentru o structura if cu conditii multiple este ilustrata in Figura
Codul mostra care foloseste structuri if este ilustrat in Figura

4.5.5 Instructiunea if imbricata

129

Capitol 4: Operatorii si structurile de control ale limbajului Java


Instructiunea if imbricata poate fi ilustrata si ca o diagrama.Cea din Figura
structura if imbricata.Acest lucru mai este ilustrat si in Figura .

este implementata cu

Un test conditional va avea acelasi rezultat ca si operatorii &sau &&. Acelasi cod ar putea fi scris asa
cum este ilustrat in Figura .
Parantezele ar trebui folosite pentru a margini un bloc de declaratii.In exemplul ilustrat in Figura ,
primele declaratii ruleaza in cazul in care conditia este adevarata.Declaratia 2 este rulata
intotdeauna.Lipsa parantezelor face secventa de cod neclara.Un programator ar putea sa nu poata
urmari logica programului pentru a corecta erorile sau problemele.Folosirea corecta a parantezelor este
ilustrata in Figura .

4.5.6 Instructiunea switch


Instructiunile switch mai sunt cunoscute ca si branching sau instructiuni de control in functie de
caz.Acestea sunt structuri de control al selectiei ce permit mai mult de doua variante atunci cand este
evaluata o conditie
Exista cuvinte cheie si simboluri ce trebuie sa fie folosite in structurile de control switch.Sintaxa de
control switch de baza este ilustrata in Figura :

- Switch - Aceasta incepe selectia.Paranteza deschisa continua expresia.


- Case - Conditia este egala cu constanta.Cele doua puncte ( : ) de la sfarsitul instructiunii cunt
necesare.

- break - Aceasta inchide secventa de actiuni si iese din structura de control switch.
- default - Aceasta este un set de actiuni care vor fi executate daca nu este gasita nici o potrivire intre
expresie si fiecare constanta.
In instructiunea switch,expr1 trebuie sa fie compatibil pentru atribuire cu un tip int,byte,short sau
char.Numerele reale,expresiile lungi,sau referintele la clasa precum obiectele String nu sunt
permise.Eticheta implicita poate fi folosita pentru a specifica segmentul de cod in care valoarea
variabilei sau a expresiei nu se poate potrivi cu nici una dintre valorile de caz.Daca nu exista
instructiuni de break ca in ultima instructiune din segmentul de cod pentru un caz,executia continua in
segmentul de cod pentru urmatorul caz.Valoarea expresiei de caz nu va fi verificata.
Codul exemplificat in Figura configureaza un obiect Car pe baza variabilei intregi carModel.Daca
variabila carModel este egala cu constanta intreaga DELUXE,care are o valoare de unu,atunci aerul
conditionat este adaugat la masina.Daca variabila carModel este egala cu constanta intreaga
STANDARD,care are o valoarea de doi,atunci sunt adagaute numai radioul,rotile,si un motor.

130

Capitol 4: Operatorii si structurile de control ale limbajului Java


Unele metode sunt repetate,ceea ce duce la redundanta.Pentru a reduce codul redundant,organizati
secventa de instructiuni de caz pentru a folosi metode cheie intr-o maniera incrementala si pentru a
elimina instructiunea break.
O alta sintax de control switch este ilustrata in Figura

Acest cod rezolva apelurile metodei redundante din exemplul anterior.Acesta permite fluxului de
control sa scada prin mai multe blocuri case.De exemplu,daca variabila carModel este egala cu
constanta intreaga THE_WORKS,atunci pachetul auriu si scaunele ajustabile in sapte moduri sunt
adaugate acestei masini.Masina mai are covorase de podea,aer conditionat,un radio,stergator,roti,si un
motor.Daca variabila carModel este egala cu constanta STANDARD,sunt adaugate numai un
radio,stergatoarele,si un motor.
Noua din zece instructiuni switch necesita break pentru fiecare bloc de caz.Absenta acestei instructiuni
cauzeaza majoritatea erorilor de programare logice in instructiunile switch.
Figura ilustreaza de ce ar putea fi utila folosirea instructiunilor case pana la capat.Acest cod
calculeaza numarul de zile dintr-o luna.
Sintaxa switch evalueaza un tip de date char,byte,sau short.Figura evalueaza variabila month,care a
fost declarata explicit si definita inaintea instructiunii switch.Evaluarea mai poate fi prin comparatie cu
o valore returnata de la o metoda sau expresie daca tipul de date al valorii returnate se potriveste cu
tipul de date al conditiei de caz.

4.5.7 Bucle
Structurile bucla permit executia repetata a blocurilor de instructiuni.Java suporta trei tipuri de
constructii bucla.Acestea sunt buclele for,while si do.Inainte de executia corpului de bucla,care este o
bucla de pretestare,buclele for si while testeaza conditia de bucla.Pentru a verifica o conditie dupa ce
este executata bucla,sunt folosite buclele do,care sunt bucle de posttest.Buclele for si while ar putea sa
nu ruleze corpul de bucla deloc.Buclele do vor rula corpul de bucla cel putin odata.
Folositi bucla for atunci cand bucla este pe cale de a fi executata de un anumit numar setat de
ori.Folosit buclele while si do se vor utiliza daca numarul de repetitii nu este cunonscut.
Toate structurile de bucla au patru elemente sau actiuni care au loc:

- Initializare
- Testarea unei conditii sau expresii
- Executia instructiunilor
- Alterarea conditiei sau a expresiei pentru a iesi din bucla
131

Capitol 4: Operatorii si structurile de control ale limbajului Java


Fiecare structura de bucla implementeaza aceste actiuni in moduri diferite.Multe probleme logice au
loc deoarece aceste elemente sunt ignorate.Un programator care foloseste aceste structuri trebuie sa se
asigure ca toate cele patru elemente au fost adresate.

4.5.8 Instructiunea do while


Sintaxa pentru structura do while este ilustrata in Figura

Sintaxa descrie doua din cele trei elemente.Programatorul introduce celelalte doua
elemente.Instructiunea de initializare dintr-o bucla do este definita inainte de structura de
bucla.Aceasta bucla face un test inainte sa ruleze instructiunile.Aceasta bucla va rula cel putin o
singura data.
Priviti instructiunea i++; din figura.Valoarea variabilei i este testata pentru a controla bucla
do.Aceasta variabila a fost initializata la linia 11.Daca instructiunea i++; este omisa,bucla va rula la
infinit.Pentru a controla oprirea unei bucle conditia trebuie modificata in fals.Intr-o bucla
do,programatorul trebuie sa se asigure ca rezultatul conditiei va fi fals la un moment dat.Schimbarea
valorii i cu operatorul de incrementare va cauza valoarea lui i sa creasca.Atunci cand aceasta valoare
este zece,bucla nu va mai afisa propozitia "Are you finished yet?" si va afisa propozitia "Done".
Atunci cand sunt folosite bucle do,asigurati-va ca variabila de control a buclei este
initializata,actualizata in corpul buclei,si testata.

4.5.9 Instructiunea while


Sintaxa pentru structura while este ilustrata in figura.
Asigurati-va ca variabila de control a buclei este initializata inainte de inceperea rularii corpului
buclei.De-asemenea asigurati-va ca si conditia buclei incepe ca adevarata daca bucla trebuie sa fie
parcursa cel putin o singura data.Variabila de control trebuie sa fie actualizata pentru a preveni o bucla
infinita.

4.5.10 Instructiunea for


Sintaxa pentru structura de bucle for este ilustrata in figura.
In acest exemplu,int i este declarat si definit in cadrul blocului for.
Variabila i poate fi accesata numai in cadrul acestui bloc for.Java permite separatorul virgula din
sintaxa de bucle for(). Ultimul exemplu ilustrat in figura este legal.Acesta initializeaza atat i cat si j la
zero.Dupa ce se ruleaza corpul buclei,incrementeaza i si decrementeaza j.

4.5.11 Folosirea break, continue si a etichetelor


132

Capitol 4: Operatorii si structurile de control ale limbajului Java


Folositi urmatoarele instructiuni pentru a controla instructiunile de bucla:

- break [eticheta];
- continue [eticheta];
- [eticheta:] instructiunea ;
Folositi instructiunea break pentru a iesi din instructiunile switch,instructiunile de bucla si blocurile cu
etichete.Folositi instructiunea continue pentru a sari la sfarsitul corpului buclei si apoi pentru a returna
controlul instructiunii de control al buclei.
Instructiunea eticheta identifica orice instructiune valida la care trebuie sa fie transferat controlul.Intr-o
instructiune break cu eticheta,eticheta poate identifica orice instructiune.Intr-o instructiune continue cu
eticheta,eticheta trebuie sa identifice o constructie bucla.
Folositi instructiunea break asa cum este ilustrat in Figura . Atunci cand conditia if este
adevarata,instructiunea break este rulata si fluxul de executie ar ajunge la urmatoarea instructiune dupa
structura de bucla,care este instructiunea 3.Codul din instructiunea 2 nu este executat.
Folosirea instructiunii continue este ilustrata in Figura . Atunci cand conditia if este adevarata in
interiorul structurii do,fluxul de control ajunge la ultima conditie while a celei mai exterioare structuri
do.
Figura ilustreaza instructiunea break cu o eticheta denumita extern.Atunci cand conditia if este
adevarata in cea mai interioara structura do,instructiunea break este rulata si controlul paraseste blocul
etichetat,care este cea mai exterioara structura do.
Figura ilustreaza instructiunea continue cu o eticheta denumita test.Atunci cand conditia if este
adevarata,fluxul de control ajunge la conditia while.
Folositi activitatile din Figurile

si

pentru a depista fluxul structurilor de control al buclei.

4.6.1 Clasa java.lang.System


Exista multe moduri in Java care sunt folosite pentru a obtine input de la utilizatori si pentru a printa
output.Actiunile complexe precum input-ul acceptat pe ecranele GUI sau output-ul trimis
imprimantelor,necesita folosirea claselor Java in API-ul Swing si Abstract Window Toolkit (AWT).
Pentru a vizualiza rezultatele metodelor clasei sau datele de intrare si pentru a testa comportamentele
obiectelor de test,clasele trebuie sa fie folosite pentru a accepta sau pentru a citi de la echipamente de
intrare simpla si pentru a trimite informatii echipamentelor precum consola sau ecranul.
In Java,datele de intrare si de iesire dintr-un program sunt denumite flux.Java ofera clasa System
pentru a accesa proprietatile echipamentelor SO-ului pentru a trimite datele de intrare si iesire unui
133

Capitol 4: Operatorii si structurile de control ale limbajului Java


program.Clasa System contine referinte la trei obiecte utile.Acestea sunt obiectele statice in,out si
err.Ele sunt ilustrate in Figura . Orice metoda sau atribut care este declarat ca si static este partajat de
catre toate obiectele clasei.Static inseamna ca valoarea se bazeaza pe clasa si niciun obiect al clasei nu
trebuie sa fie creat pentru a folosi acest membru.Obiectele de tipul System nu trebuie sa fie create
pentru a accesa obiectele membru in,out sau err.Aceste obiecte pot trimite si primi datele de la
echipamentele implicite de intrare si iesire.In majoritatea cazurilor,echipamentul implicit de intrare
este tastatura si echipamentul implicit de iesire este ecranul.
Obiectul out al clasei PrintStream va printa fie cu metoda print fie cu metoda println.Codul expus in
Figura ar putea fi folosit in clasa Teacher pentru a produce o linie de output.
Obiectul input al clasei InputStream va accepta un caracter de la tastatura.Caracterul este stocat ca si
int.De obicei este mult mai util ca unui program sa i se furnizeze valori in timpul rularii.Un program
care accepta valori in timpul rularii este interactiv deoarece acesta comunica cu utilizatorul.Pentru a
suporta aceasta interactiune,trebuie sa existe o modalitate de a obtine datele de la tastatura.Obiectul
System.in are metode ce fac acest lucru.Exemplul de cod ce foloseste obiectul in este ilustrat in
Figura .

4.6.2 Utilizarea clasei System pentru introducerea si afisarea datelor


Clasa System este o clasa fundamentala Java,care este parte a pachetului limbajului Java.Majoritatea
claselor explorate aici sunt disponibile si incarcate atunci cand sunt apelate din interiorul codului.Alte
cateva clase sunt stocate in directoare impachetate.Programatorii Java vor trebui sa-si organizeze
propriile fisiere si sa importe fisierele create de catre altii.Utilizarea instructiunii import este introdusa
in cod.
Documentatia pentru clasa System ii descrie atributele,constructorul,si metodele.Acestea sunt ilustrate
in Figurile si . Clasa System este folosita pentru multe operatii ce necesita date despre setarile SOului si necesita o modificare a setarilor SO-ului si acces la date.Clasa System mai are o metoda pentru
a cere garbage collection cu metoda statica gc(). Garbage collection este folosit pentru a sterge obiecte
din memorie.
Datele de intrare ale unui program pot fi din mai multe surse precum fisiere,baze de date,si utilizatori
care interactioneaza cu GUI-urile sau folosesc tastaturile.Acest lucru este ilustrat in Figura . Intrarea
de la tastatura se mai numeste intrare standard (stdin). Atunci cand sunt folosite GUIuri,programatorul Java nu trebuie sa scrie cod pentru a citi intrarea de la tastatura sau sa afiseze iesirea
in consola.Acestea sunt administrate de catre clasele ce formeaza setul de pachete GUI.Acestea se
numesc Java Foundation Classes.
Exista doua tipuri de informatii pe care un program le afiseaza pe un monitor.O aplicatie afiseaza
informatii codate pentru consola.Locatia tinta pentru aceste informatii se numeste iesire standard
(stdout). Un program va mai afisa informatii sau mesaje despre statusul sau,erori,si completari.Locatia
tinta pentru aceste informatii se numeste eroare standard (stderr). Inainte ca programatorii sa fie
134

Capitol 4: Operatorii si structurile de control ale limbajului Java


pregatiti sa lucreze cu clase complexe ce manevreaza GUI-urile,acestea necesita o metoda de a citi
datele de la tastatura si de a afisa pe ecran.Informatiile sunt ilustrate in fereastra consolei.O clasa care
foloseste obiectul System.out si metodele sale println sau print va afisa datele in orice fereastra de
consola care a fost deschisa.Obiectul out din clasa System este codat pentru a accesa tehnologia ce
trimite informatii ferestrei de consola.
In Java,datele sunt introduse ca si flux de octeti.Un flux de octeti poate fi privit ca un flux de
informatii printr-o teava.Atunci cand bitii ajung la celalalt capat al tevii,ei sunt reuniti pentru a forma o
piesa semnificativa de date.Cateva clase din procesul Java API proceseaza fluxurile de date de intrare
si de iesire din program.Acest modul se va concentra pe trei obiecte de flux pe care toate obiectele
Java le pot folosi.Aceste obiecte sunt membri ale clasei System.Ele sunt apelate prin campurile in,out
si err ale clasei System.Aceste obiecte sunt proiectate pentru conectarea la echipamentele stdin,stdout
si stderr.Aceste lucruri sunt ilustrate in Figura .

4.6.3 Introducerea datelor folosind System.in


Citirea intrarii de la tastatura in limbajul Java este dificila.In limbajul Java,intrarea si iesirea sunt
oferite prin intermediul unei console pe baza de text.Limbajul Java foloseste clasele fundamentale ale
limbajului.Platforma
Java
include
limbajul
Java,clasele
fundamentale,si
bibliotecile
suplimentare.Aceasta ofera solutii GUI care sunt folosite pentru a citi input-ul de la utilizatori.
Ganditi-va la o sarcina comuna precum citirea unui numar real pe care il introduce un utilizator de la
tastatura.Aceasta necesita multe instructiuni complexe.Considerati numarul -14.26.Un caracter trebuie
sa fie citit la un moment dat,stocat in memorie,si apoi concatenat cu urmatorul caracter pana cand apar
toate datele de intrare.Sirul de caractere trebuie sa fie apoi convertit la numarul real -14.26 inainte sa
fie procesat.
Analizati clasa OneCharInput din Figura . Aceasta clasa citeste si proceseaza un caracter la un
moment dat.Clasa System.in poate fi folosita pentru a citi un caracter la un moment dat.Obiectul in are
mai multe metode pentru a citi datele.Datele returnate de metoda read() sunt de tip int.Obiectul in
trebuie sa fie convertit la un char.Daca utilizatorul a introdus un numar,valoarea int este Unicode
pentru simbolul numarului.Nu este valoarea numarului.De exemplu,daca este introdus numarul
7,obiectul int va fi Unicode al caracterului 7,care este 55.Faceti referire la apendix pentru o tabela de
valori de caractere Unicode si ASCII.
Clasa OneCharInput testeaza valoarea intrarii de la tastatura a utilizatorului.Intrarea poate fi A,B,C,sau
Q.Daca este Q,programul se termina.Metoda System.in.read() este apelata de doua ori pentru a obtine
input de la utilizator.Atunci cand un utilizator introduce un caracter si apasa Enter,fiecare apasare de
tasta reprezinta o intrare de caracter.Pentru a accepta input-ul de la utilizator,programul trebuie sa
citeasca acel caracter care a fost introdus si sa citeasca caracterul enter.Instructiunea System.in.read()
nu este atribuita unei variabile.

135

Capitol 4: Operatorii si structurile de control ale limbajului Java


Atunci cand este folosita metoda System.in.read(), convertiti valoarea citita la un caracter.Iesirea din
Figura reflecta aceasta schimbare.
Poate fi dificil de lucrat cu intrarile in limbajul Java.Pentru a stoca mai multe seturi de caractere de
tastatura ca o valoare intr-o variabila,includeti repetitia instructiunii System.in.read() pana cand
utilizatorul a introdus toate datele si a apasat tasta Enter.Acestea sunt ilustrate in Figurile si .

4.6.4 Afisarea datelor folosind System.out


Studentii au folosit obiectul System.out in majoritatea claselor lor.Aceasta sectiune acopera mai multe
trasaturi ale acestui obiect.
Obiectul out este un obiect al clasei PrintStream.Aceasta clasa a supraincarcat metodele print si
println.Acestea sunt utile pentru output-ul la consola.Diferenta principala intre acestea este ca println
adauga un separator de linie pentru a produce o linie completa de output.Metoda print nu adauga
separatorul de linie astfel incat o linie de iesire poate fi construita cu mai multe apeluri ale metodei
print.
Metodele print si println sunt incarcate pentru a crea versiuni diferite pentru tipurile primitive,char[] si
clasa String.Alte tipuri referinta implementeaza metoda toString() mostenita de la clasa Object in
definitia clasei lor.Pentru a printa continutul unui obiect,implementati metoda toString in clasa.
Clasa Teacher implementeaza metoda toString si printeaza datele unui obiect.In metoda main a acestei
clase ultimele doua linii de cod folosesc metodele System.out.println.Datele furnizate de metoda sunt
referinta la obiectele unu si doi.Din moment ce acestea sunt obiecte Teacher,metoda println va apela
metoda toString.Metoda toString a clasei Teacher returneaza un sir de date despre fiecare obiect.

4.6.5 Clasa console


It was hard to get input from the keyboard without any GUI classes.Since the goal of the Java
language is to encourage reuse,a Console class will be created and used to collect input from the
console.Save this class in the C:\jdk#.#\jre\lib\ext directory.This is the place where the JDK is
installed.If version 1.3 of the JDK is downloaded,the directory will be jdk1.3 . The methods of the
Console class are static.This makes the class very easy to use.The methods of the Console class are
shown in Figure .
The Console class can be used to display any prompt to the user and collect input from the user.The
code for the Console class is shown in Figure .
The code shown in Figure

for the Investment class also shows how the Console class is used.

4.7.1 Analiza unui exemplu


136

Capitol 4: Operatorii si structurile de control ale limbajului Java


Aceasta sectiune va exploata cateva exemple de cod pentru a explica folosirea operatorilor si a
structurilor de control:
1.Miscati mouse-ul deasupra codului pentru a vedea o explicare a structurilor de selectie
logica.Acestea sunt ilustrate in Figura .
2.Dati click pe butoanele For Loop,While Loop si Do While Loop pentru a vedea exemple de structuri
bucla.Acestea sunt ilustrate in Figura . Dati click pe butonul View Output pentru a vedea codul rulat.
3.Folositi bucle si logica de control pentru a obtine intrarea de la tastatura,pentru a testa valoarea
introdusa,si pentru a efectua o actiune pe baza datelor introduse.Acestea sunt ilustrate in Figura .
4.Stocati fiecare caracter de intrare care este obtinut de la tastatura intr-un obiect StringBuffer pana
cand toate caracterele au fost introduse.Codul din Figura ilustreaza utilizarea clasei StringBuffer.

Rezumat
Acest modul introduce cativa operatori Java si structuri de control.Studentii invata ca exista operatori
aritmetici,unari,boolean,de comparatie,logici,si de atribuire.Prioritatea ofera precedenta unor operatori
inaintea altora astfel incat evaluarea unei instructiuni sa fie previzibila si consistenta.Operatorii mai au
proprietati asociative.Cateva instructiuni sunt evaluate de la stanga la dreapta.Altele sunt evaluate de la
dreapta la stanga.
Acest modul a mai avut de-a face cu trei structuri de control.Acestea sunt secventa,selectia si
repetitia.Constructiile de selectie sunt instructiunile if si switch.Constructiile repetitiei sunt buclele
do,while si for.
Java ofera clasa System pentru a accesa proprietatile echipamentelor SO-ului pentru fluxurile de date
de intrare si de iesire din program.Clasa System contine referinte la trei obiecte statice.Acestea sunt
in,out si err.Aceste obiecte pot trimite si primi date de la echipamentele implicite de intrare si iesire.

137

Capitol 5: Fundamentele definirii si utilizarii claselor

Capitol 5: Fundamentele definirii si utilizarii claselor


Prezentare generala
Acest modul va trata elementele care definesc clasele si metodele.Vor fi explorate in detaliu sintaxa si
practicile recomandate pentru gestionarea atributelor si metodelor unei clase.In cadrul acestui modul
sunt descrise mai multe clase pentru explicarea procesului de definire si utilizare a obiectelor si a
metodelor aferente.Studentii vor invata de asemenea ca un programator administreaza atributele unei
clase cu ajutorul variabilelor.Variabilele sau identificatorii indica locatii din memorie unde pot fi
stocate datele.Datele obiectelor se pastreaza in aceste locatii de memorie.
Acest modul introduce de asemenea si conceptele de domeniu de vizibilitate,existenta si incapsulare a
datelor si obiectelor.Domeniul de vizibilitate al datelor stocate intr-o variabila este influentat de
momentul crearii.Existenta unei variabile reprezinta durata pentru care aceasta ramane in memorie iar
domeniul de vizibilitate determina care componente ale programului pot utiliza variabila
respectiva.Domeniul de vizibilitate si durata de existenta a unui obiect pot influenta proiectarea
programului si pot determina locul si momentul crearii obiectului.Accesibilitatea datelor va determina
incapsularea unui obiect.Cuvintele-cheie public si private pot fi folosite pentru a seta nivelul de acces
la datele si metodele unui obiect.
Obiectele care nu mai sunt necesare pot fi distruse.Obiectele sunt eliminate din memorie de catre
garbage collector,acesta este un program special al JVM.Un programator poate solicita aplicarea de
garbage collection pe un obiect si poate defini sarcini care sa fie efectuate inainte de stergerea
obiectului din memorie.
Cuvinte cheie

- Definitia clasei
- Incapsulare
- Atribute
- Date private
- Date ale obiectului
- Date ale clasei
- Modificatorii de acces private,public,default si protected
- Calificatorii static si final
- Imutabilitate
- New
- Instanta
- Constructorii impliciti si cei definiti
- Variabila this
- Initializarea datelor
- Domeniul de vizibilitate si durata de viata
- Sintaxa metodei
138

Capitol 5: Fundamentele definirii si utilizarii claselor

- Metodele main,metodele de instanta si metodele statice


- Supraincarcarea
- Distrugerea unui obiect
- Finalizator
5.1.1 O recapitulare a conceptelor de clasa si obiect
Studentii pot folosi o clasa chiar daca nu cunosc implementarea acesteia.Tot ce trebuie sa stie este
sintaxa metodelor.Prima clasa predefinita utilizata de catre studenti a aparut in instructiunea
System.out.println.In aceasta instructiune sunt accesate clasa System si un obiect din clasa
PrintStream.Obiectul out este un atribut al clasei System;acestea fac parte din API-ul limbajului
Java.Studentii au folosit de asemenea clasa String pentru a crea si a stoca date de tip text in obiecte
String.Acest modul va explora sintaxa si regulile utilizate pentru implementarea pricipiilor programarii
orientate pe obiect in clasele Java.
Conceptele referitoare la clase si obiectele unei clase sunt expuse in Figura
Pentru a recapitula,folositi activitatea din Figura
explicatiile lor.

si potriviti termenii cheie cu definitiile sau

5.2.1 Proiectarea claselor


Cei patru pasi utilizati in crearea obiectelor sunt ilustrati in Figura

Programatorii care sunt la primul contact cu limbajele orientate pe obiecte incep adesea cu foarte
putine clase care efectueaza prea multe sarcini complexe.Pentru o buna definire a obiectelor,este
esential sa evitam clase care fac prea mult si sa mentinem numarul de clase in limite rezonabile.Daca
definitia unei clase este prea extinsa,este mai greu sa gestionam modificarile si erorile;este mai bine sa
avem multe clase robuste decat clase putine care se defecteaza la fiecare modificare.
O aplicatie este un program care rezolva o problema de afaceri.Cum procedeaza programatorii pentru
a descoperi obiectele necesare in crearea unei aplicatii?Un mod de a incepe este sa folositi activitatea
din Figura pentru a identifica toate substantivele din descrierea problemei.
Dupa descoperirea obiectelor necesare,urmatorul pas pentru programator este proiectarea schemei,sau
a clasei,pentru fiecare obiect.Substantivele si adjectivele pot indica programatorului posibile date sau
atribute ale obiectului.Verbele pot ajuta programatorul la selectarea metodelor si a
comportamentelor.In cadrul activitatii din Figura , folositi descrierea pentru a identifica atributele si
comportamentele unui abonat.

5.2.2 Definirea claselor


Java este un limbaj ; aceasta inseamna ca are niste reguli specifice referitoare la modurile de stocare a
datelor.Printre altele,sunt definite cantitatea de memorie necesara stocarii unui anumit tip de date si
139

Capitol 5: Fundamentele definirii si utilizarii claselor


locul in care sunt stocate datele.Compilatorul de Java impune aceste reguli.Studentii vor invata cateva
principii care ajuta la reducerea erorilor de codare:

-Obiectele sunt create pe baza definitiei unei clase.Un fisier sursa Java poate contine o singura
definitie a unei clase publice.Numele clasei publice trebuie sa coincida cu numele fisierului.Acest
lucru este ilustrat in Figura .

-Un fisier sursa Java poate contine mai multe definitii de clase.Fisierul PayCalculator.java contine
doua clase.Prima clasa este Pay,iar accesul implicit la aceasta clasa este restrictionat la obiecte ale
claselor din acelasi pachet sau director.Clasa PayCalculator este declarata ca fiind
publica.Compilatorul va crea fisiere .class pentru clasele Pay si PayCalculator.Fisierul
PayCalculator.class contine metoda main;aceasta clasa va fi executata prima si reprezinta punctul de
intrare in program.Clasa PayCalculator creeaza obiecte din clasa Pay;acest lucru este aratat in
Figura .
Definitia unei clase include cateva structuri:

- Declaratii ale atributelor sau campurilor - Variabilele,sau datele obiectului,care identifica


informatiile stocate in obiect sunt declarate fie la inceputul fie la sfarsitul definitiei clasei.Ele pot fi
tipuri primitive sau referinte la alte obiecte.

- Definitiile constructorilor - Definitiile de clase pot include metode constructor.Scopul unei metode
constructor este sa specifice detaliile procesului de creare a obiectelor.O clasa poate fi definita fara
niciun constructor.In Figura , clasa Pay nu defineste niciun constructor.In cadrul clasei
PayCalculator,obiectul Pay este creat cu instructiunea new Pay(). Compilatorul adauga un constructor
implicit fara parametri,Pay(), daca nu exista nici un alt constructor definit.Constructorii poseda
urmatoarele proprietati:

-O metoda constructor trebuie sa aiba acelasi numele cu cel al clasei


-Programatorii pot alege sa defineasca constructorii pentru o clasa
-Constructorii nu intorc nicio valoare
-Constructorii sunt executati o singura data,la crearea unui obiect.Constructorul este folosit ca operand
pentru operatorul new.Operatorul new creeaza obiectul iar constructorul incheie procesul.

- Definitiile metodelor standard - Cand trebuie sa ascundem datele dintr-un obiect la definirea unei
clase,accesul se restrictioneaza prin cuvantul-cheie private.Singura modalitate de acces la aceste date
este prin metode.Un programator poate defini metode care sa citeasca sau sa modifice datele.Metodele
folosite pentru citirea datelor dintr-un obiect sunt numite accesori;metodele folosite pentru modificarea
datelor dintr-un obiect sunt numite mutatori.Alti termeni care descriu aceste tipuri de metode sunt

140

Capitol 5: Fundamentele definirii si utilizarii claselor


getter-i si setter-i.Acestia reflecta numele metodelor precum getVideoId() si setVideoPrice(double
amount). Aceste lucruri sunt ilustrate in Figurile si .

- Definitiile metodelor speciale - Metodele care implementeaza regulile de afacere pentru care este
proiectata o aplicatie fac parte din definitia clasei.Cateva exemple sunt metoda numita
displayVideoTitleandLocation() pentru obiectul VideoItem sau calcInterest pentru un obiect de tip
CreditCardAccount.Acestea sunt expuse in Figura .

5.2.3 Crearea de obiecte


Obiectele sunt create prin folosirea operatorului new.Exista foarte putine restrictii referitoare la
momentul de creare al unui obiect.Un obiect poate fi creat in metode ale altor clase,in definitia unui
atribut al altei clase,in definitia clasei obiectului si ca parametru pasat unei metode la apelarea
acesteia.Aceste posibilitati sunt ilustrate in Figura . Crearea unui obiect mai poarta numele de
instantiere - se obtine practic o instanta a clasei.
In Figura este expusa crearea unui obiect prin doua instructiuni.Prima instructiune declara o
variabila care sa stocheze referinta la obiect iar cea de-a doua foloseste operatorul new pentru a crea
obiectul.Referinta este declarata in definitia clasei,in timp ce obiectul este creat in cadrul unei
metode.Clasa care creeaza obiectul este Teacher,iar obiectul creat este de tip Student.
Variabila care pastreaza referinta la obiect poate fi declarata si in cadrul unei metode;acest lucru este
aratat in Figura . Decizia de a crea un obiect ca atribut al clasei sau intr-o metoda este influentata de
nivelul de accesibilitate necesar in cadrul clasei pentru obiectul respectiv.
Declaratia variabilei care pastreaza referinta poate fi combinata cu creareaa obiectului intr-o singura
instructiune,dupa cum vedeti in Figura .In acest exemplu,obiectul Student exista imediat dupa
instantierea obiectului Teacher.Urmatorul exemplu ilustreaza folosirea unei singure instructiuni in
cadrul unei metode - vezi Figura . Obiectul Student exista in momentul apelului acestei metode si
dispare dupa incheierea acesteia.
Obiectele dintr-o clasa pot fi create si in metoda main a clasei respective;cand o clasa precum Teacher
poseda o metoda main,aceasta din urma actioneaza ca punctul de pornire al aplicatiei.Daca folosim
clasa Teacher pentru a crea mai multe obiecte Teacher cu date individuale,aceste obiecte trebuie create
in metoda main.La inceperea programului,obiectele Teacher pot fi create.Un exemplu de cod care
ilustreaza acest concept se gaseste in Figura . In acest exemplu,clasa Teacher contine date si o
metoda main.In metoda main a clasei Teacher sunt create obiecte Teacher;operatorul new foloseste
constructorul clasei Teacher pentru crearea acestor obiecte.

5.2.4 Folosirea obiectelor


Obiectele sunt create pentru ca prin intermediul interactiunii cu alte obiecte sa poata indeplini anumite
sarcini.Aceasta interactiune apare atunci cand un obiect foloseste metodele publice ale altui obiect
141

Capitol 5: Fundamentele definirii si utilizarii claselor


pentru a obtine sau modifica informatiile de care are nevoie.Pentru a putea accesa aceste metode se
foloseste operatorul punct(.). Este important sa intelegem ca datele unui obiect,ale unei instante se
acceseaza prin variabila de referinta pentru acel obiect in timp ce datele unei clase se acceseaza prin
folosirea numelui clasei.Datele clasei sunt marcate prin utilizarea cuvantului-cheie static.In Figura
este ilustrata sintaxa pentru folosirea operatorului punct pentru accesarea datelor unei instante.Sintaxa
folosirii operatorului punct pentru accesarea informatiilor clasei este aratata in Figura .
Doar datele si metodele care nu sunt private sunt accesibile altor obiecte.
Exemplul de cod pentru clasele CiscoStudent si Teacher din Figura demonstreaza utilizarea metodelor
si a datelor non-private ale unui obiect.
In Figura , clasa Teacher creeaza si utilizeaza obiecte CiscoStudent.Variabila classroom a obiectului
CiscoStudent este publica si poate fi accesata de clasa Teacher.Clasa Teacher schimba valoarea
acestor variabile.
Cea de-a doua clasa din Figura ,nu necesita parametri pentru metoda getName.Aceasta metoda este
apelata pentru fiecare obiect de tip Teacher;ea returneaza un obiect String care contine numele
profesorului si care este apoi atribuit obiectului String teachername.Acesta din urma este un atribut al
obiectului CiscoStudent.In acest exemplu,variabila teachername din clasa CiscoStudent referentiaza un
nume.
In Figura , metoda sl.getName() este folosita pentru a obtine date private ale obiectului
CiscoStudent.Metoda println utilizeaza datele returnate de metoda getName() a clasei CiscoStudent.

5.3.1 Prezentare generala


Sintaxa folosita pentru declararea unui atribut este ilustrata in Figura . Un atribut reprezinta date
specifice care sunt stocate intr-un obiect.Atributele,denumite si campuri,folosesc variabile pentru
identificarea locului de stocare al datelor pentru un obiect.Identificatorul unei variabile este numele
sau.In Figura sunt prezentate standardele pentru identificatori.
Declaratia unei variabile incepe cu tipul sau de date,care reprezinta tipul datelor stocate in
variabila.Datele
pot
avea
unul
dintre
cele
opt
tipuri
primitive,care
sunt
boolean,char,byte,short,int,long,float si double.Datele pot fi de asemenea si o referinta la un alt
obiect.Figura prezinta declaratii de atribute pe liniile 8 si 9,in clasa LabelText.Atributul
MAX_TEXT este de tipul primitiv int si este o constanta;aceasta inseamna ca valoarea atribuita nu se
schimba.Definirea unei constante se face prin cuvantul-cheie final.Campurile unui obiect care sunt
constante sunt denumite cu litere mari.Atributul label referentiaza un obiect de tip String.Variabila
label este o variabila de tip referinta.
Definitiile atributelor pot fi plasate la inceputul sau la sfarsitul claselor;pozitia nu afecteaza modul de
compilare si executie al codului.Pentru programatorii incepatori este bine ca atributele sa fie definite la
inceputul clasei astfel incat sa poata fi referentiate cu usurinta in codul care urmeaza.Clasele
142

Capitol 5: Fundamentele definirii si utilizarii claselor


PublicData si PrivateData demonstreaza pozitionarea codului pentru definitiile atributelor.Ele sunt
expuse in Figura . In clasa PublicData,toate atributele publice si private sunt plasate la inceputul
definitiei clasei.In clasa PrivateData,campurile publice sunt plasate la inceput iar campurile private la
sfarsit.
Figura ilustreaza relatia intre proiectarea,definirea si utilizarea clasei CreditCardAccount.Codul
clasei este similar cu definitia UML.Atributele sunt plasate la inceputul clasei.

5.3.2 Tipuri de variabile


Studentii isi vor aminti poate ca datele stocate in memorie sunt accesate printr-un identificator sau o
eticheta.Aceasta este cunoscuta si ca variabila.Cele cinci aspecte ale unei variabile sunt tipul de
date,identificatorul,domeniul de vizibilitate,adresa si valoarea.Ele sunt ilustrate in Figura .
Definitia unei clase poate include trei categorii de variabile.Exista variabile de obiect sau de
instanta,variabile de clasa sau statice si variabile locale,dintr-o metoda.Iata descrierile fiecarei
categorii:

- Datele specifice obiectelor,cunoscute si ca date de instanta,campuri de obiect sau variabile de


instanta,sunt stocate in fiecare obiect dintr-o clasa.

-Datele specifice clasei sau variabilele statice sunt stocate in clasa si sunt disponibile tuturor obiectelor
clasei si obiectelor din alte clase daca accesul la ele este permis.Acestea sunt date partajate.Datele
statice nu sunt neaparat constante - ele pot fi declarate de tip final,ceea ce le face constante.De
fapt,cuvantul-cheie static se refera la accesibilitatea globala a datelor - se stocheaza numai o singura
copie a valorii datelor statice care este partajata de toate obiectele.Atat variabilele statice cat si
variabilele de instanta sunt initializate automat cu valori specifice tipului lor de date.

-Datele locale sau variabilele de metoda sunt date folosite in interiorul unei metode.Aceste date sunt
temporare si inceteaza sa existe dupa terminarea executiei metodei.Accesul la variabilele locale este in
mod implicit privat;modificatorii de acces public,private si protected nu pot fi aplicati variabilelor
locale.
Exemplul de cod din Figurile si arata variabile de instanta,statice si locale.Dati click pe
simbolurile numerotate pentru a citi o explicatie a fiecarui tip de variabila folosit in acest cod.
Stocarea datelor
Programatorii Java folosesc trei zone de stocare pentru datele locale,ale obiectelor si ale clasei:

- Toate obiectele sunt create in RAM.Ele sunt stocate in heap,care este prevazut si cu un garbage
collector.Variabilele care apartin unui obiect sunt initializate pe baza tipului de date.Figura
valorile initiale pentru diverse tipuri de date.
143

indica

Capitol 5: Fundamentele definirii si utilizarii claselor

- Toate datele unei metode sunt de asemenea create in RAM.Zona de stocare pentru acestea poarta
numele de stiva(stack).
- Variabilelor declarate intr-o metoda nu li se asociaza valori implicite.Programatorii trebuie sa se
asigure ca aceste variabile au asignate valori inainte de folosirea lor.Variabilele dintr-o metoda sunt
create pe stiva.Variabilele definite ca parametri ai metodei sunt initializate cu valorile pasate metodei
in cadrul unui apel.

- Toate datele clasei sunt de asemenea create in RAM.Zona de stocare folosita se numeste zona de
stocare statica.Variabilele statice sunt de asemenea initializate in functie de tipul de date.
Figura ilustreaza impactul utilizarii claselor CreditCardUser si CreditCardAccount asupra stivei si a
heap-ului.

5.3.3 Variabile de instanta


Variabilele de instanta identifica datele stocate in fiecare obiect al unei clase.Ele sunt numite si
campuri de instanta,date de instanta sau date membri.Termenul de "camp"este folosit adesea cand ne
referim la variabile de instanta.Pentru a referentia o variabila de instanta in interiorul definitiei
clasei,folositi numele variabilei.Pentru a referentia o variabila de instanta cu un alt obiect,folositi
notatia cu punct.
Exemplul de cod din Figurile si pentru clasele CreditCardAccount si CreditCardUser arata modul
de accesare al variabilelor din interiorul clasei si din afara clasei prin intermediul unui alt obiect.
O clasa reprezinta proiectul pentru un obiect.Cand obiectele unei clase sunt create in memorie,fiecare
obiect poseda o copie a variabilelor de instanta si stocheaza valorile proprii pentru acele variabile.De
exemplu,daca se creeaza doua obiecte de tip Student,fiecare dintre ele pastreaza datele pentru un
singur student.Este posibil ca doi studenti sa aiba acelasi nume sau aceeasi nota.Chiar si in aceasta
situatie,fiecare obiect reprezinta numai un singur student,si fiecare student poseda o copie a aceleiasi
valori.
Un obiect este o instanta a unei clase.Fiecare variabila din obiect este detinuta de acea
instanta.Valorile stocate in variabilele de instanta diferentiaza obiectul de altele din aceeasi clasa acest lucru ofera fiecarui obiect individualitate.Chiar daca doua obiecte au aceleasi
valori,identificatorii lor vor fi diferiti.La schimbarea unei valori dintr-un obiect,valorile din alte
obiecte ale aceleiasi clase nu sunt afectate.
Datele stocate intr-un obiect pot fi tipuri primitive sau referinte la alte obiecte.
Cand un obiect stocheaza o referinta la un alt obiect,este descris ca posedand o referinta.Aceasta
situatie este cunoscuta si ca o relatie de tip "contine"("has a") intre obiecte.Practic,intre cele doua
obiecte exista o asociere prin intermediul datelor referentiate.Clasa LabelText stocheaza un int si o
referinta la un obiect de tip String.
144

Capitol 5: Fundamentele definirii si utilizarii claselor

5.3.4 Variabile de clasa


Pentru definirea unui variabile de clasa este folosit drept calificator cuvantul-cheie static.Variabilele
asociate unei clase si partajate de toate obiectele clasei sunt cunoscute si ca variabile de clasa sau
variabile statice.O clasa detine o copie a fiecarei variabile statice.Variabilele de clasa sunt create
atunci cand clasa este referentiata pentru prima data,chiar daca nu au fost instantiate inca obiecte ale
clasei respective.Daca valoarea unei variabile de clasa se schimba,noua valoare este disponibila tuturor
obiectelor;se observa diferenta fata de variabilele de instanta,unde schimbarea unei valori pentru un
obiect nu afecteaza valorile din celelalte obiecte.Exemplul de cod din Figura pentru clasele
CreditCardUser si CreditCardAccount ilustreaza folosirea cuvantului-cheie static si impactul datelor
partajate asupra datelor obiectelor.

5.3.5 Sursele datelor


Exista patru surse de date care pot fi folosite pentru a scrie cod intr-o metoda:

- Campurile de date,care includ variabile de instanta si variabile de clasa,sunt declarate in definitia


clasei.

- Variabilele locale sunt declarate in corpul unei metode.


- Valorile care sunt returnate de alte metode apelate din interiorul metodei curente.
- Valorile literale care sunt codate in metoda.
In declaratiile de metode,variabilele definite ca argumente reprezinta parametri formali.La apelul
metodei,valorile trimise reprezinta parametri actuali.Acestea sunt continute intre paranteze.Parametrii
formali ai unei metode sunt initializati automat cu valorile pasate metodei la apel.Aceste argumente
reprezinta surse de date ce pot fi manipulate in codul metodei.
Exemplul de cod din Figura pentru clasa TelNumber ilustreaza utilizarea diferitelor surse de date intro metoda.

5.4.1 Conceptul de incapsulare


O definitie simpla a incapsularii este ca reprezinta un proces de includere.In Java,acest termen se
refera la procesul de ascundere a comportamentului si a datelor.Una dintre cele mai importante
asteptari ale utilizatorilor este ca obiectele sa furnizeze informatii consistente,robuste si
predictibile.Daca datele unui obiect pot fi schimbate direct de catre un alt obiect,ele pot deveni
nesigure.Ideea este sa mentinem campurile de date incapsulate pentru a preveni modificarea lor de
catre alte obiecte.Incapsularea este implementata prin cuvinte-cheie de modificare a accesului.Acest
lucru este ilustrat in Figura .

5.4.2 Modificatori de acces


145

Capitol 5: Fundamentele definirii si utilizarii claselor


Exista patru modificatori de acces definiti pentru specificarea accesului la informatii ale claselor si
obiectelor.Cuvintele public,private si protected sunt cuvinte-cheie care sunt folosite pentru a defini trei
tipuri de acces.Cand niciunul dintre aceste cuvinte-cheie nu este specificat se considera tipul de acces
implicit.Tabelul din Figura arata influenta modificatorilor de acces
Sagetile din Figura

arata acordarea si interzicerea accesului la date.

In general,datele sau atributele unei clase trebuie sa fie private,in timp ce metodele apelate din exterior
trebuie sa fie publice.Cand este necesar accesul la valorile variabilelor din afara clasei,o simpla
metoda publica de tip accesor sau getter poate intoarce rezultatele dorite.Cateva exceptii care trebuie
considerate sunt:

- Metodele care vor fi folosite intern de alte metode din aceeasi clasa pot fi declarate ca private.
- Metodele sau membrii asociati clasei,sau statici,sunt folositi in general din exterior si pot fi declarati
ca publici.
Modificatorii de acces se aplica in aceeasi maniera atat variabilelor de instanta cat si variabilelor de
clasa.Imaginati-va ca clasa CreditCardAccount din Figura are nevoie de acces la o rata a
dobanzii,insa obiectele de tip CreditCardAccount nu trebuie sa poata schimba ratele in mod direct.In
aceasta situatie,interestRate trebuie sa fie stocata ca variabila statica.De asemenea,trebuie sa fie
ascunsa fata de celelalte obiecte prin declararea tipului de acces privat.Variabila interestRate poate fi
accesata direct numai de catre alte metode din clasa CreditCardAccount.Aceste metode acceseaza
variabila cu numele ei,care este interestRate.
Clasa CreditCardAccount stocheaza un numar de cont pentru fiecare instanta a sa.Aceste numere ar
putea fi chiar secventiale;fiecare instanta a clasei va obtine unul dintre ele.Pentru a asigura faptul ca nu
exista duplicate printre numerele asignate,variabila nextAccountNumber este pastrata ca atribut static
al clasei.Toate obiectele clasei CreditCardAccount vor partaja acest atribut.
Pentru a face nextAccountNumber accesibil celorlalte clase,accesul este declarat ca public.In acest
exemplu,variabila are acces implicit,prin urmare alte clase din acelasi pachet sau director o pot accesa.
O clasa care utilizeaza sintaxa numele_clasei.membru poate accesa variabila nextAccountNumber.Prin
urmare,toate obiectele clasei si obiectele din acelasi pachet sau director vor fi capabile sa acceseze si
sa modifice aceasta variabila.
Modificatorul private static pentru variabila interestRate este mai restrictiv.Astfel,variabila
interestOnly este accesibila numai din interiorul clasei CreditCardAccount.
Influenta modificatorilor de acces se aplica in acelasi mod atat pentru variabilele de instanta cat si
pentru variabilele statice.

5.4.3 Implementarea incapsularii folosind metode


146

Capitol 5: Fundamentele definirii si utilizarii claselor


Incapsularea in cazul metodelor se petrece in mod natural.Utilizatorul unei metode ii cunoaste
semnatura,insa nu stie cum functioneaza.In plus,accesul la metoda poate fi restrictionat prin folosirea
modificatorilor de acces private,protected sau cel implicit,aplicat fara vreun cuvant-cheie.Incapsularea
este utilizata adesea pentru a ascunde informatii ale obiectului.Cele mai multe variabile de instanta
trebuie declarate ca private si cele mai multe metode trebuie declarate ca publice.Poate fi uneori
nevoie ca variabilele de instanta ascunse ale unui obiect sa fie accesate sau schimbate.Acest lucru
poate fi efectuat prin metode accesor(getter-i)sau metode mutator(settter-i).
Pentru variabilele private ale unui obiect pot fi creati getter-i si setter-i.De asemenea,modificarea si
citirea datelor pot fi combinate.Cand studentii combina aceste functii,se poate pierde din
flexibilitate.In general,setter-ii ar trebui pusi la dispozitie numai pentru atributele care necesita
schimbari.De exemplu,odata ce un obiect Student este creat,numele studentului nu se modifica.Acesta
ar trebui declarat final,iar valoarea sa setata in metoda constructor.Cum studentName este final si
private,nu avem nevoie de o metoda setter pentru el.Totusi,poate fi necesara o metoda getter.
Exemplul de cod pentru clasa Student demonstreaza incapsularea si utilizarea metodelor setter si
getter.

5.5.1 Crearea obiectelor


Crearea obiectelor incepe odata cu folosirea operatorului new.Activitatile care se petrec sunt ilustrate
in Figura .
Un concept foarte important in Java in reprezinta valorile implicite ale variabilelor.O valoare implicita
pentru un atribut este o valoare stocata in memorie obtinuta pe baza unor reguli predefinite;aceasta
valoare poate fi schimbata.La instantierea unui obiect in Java,el este creat in memoria heap.Fiecare
valoare implicita a unei variabile este determinata pe baza tipului de date referentiat de variabila
respectiva.Figura arata valorile implicite pentru tipuri de date primitive si referinte.
Examinati exemplul de cod pentru clasa VideoItem din Figura

Variabilelor declarate intr-o metoda nu li se aloca valori implicite.Programatorul este responsabil sa se


asigure ca toate variabilele dintr-o metoda au asignate valori inainte de a fi utilizate.Acest lucru este
expus in Figura . Variabilele dintr-o metoda sunt create pe stiva.Variabilele definite ca paramatri ai
unei metode sunt initializate cu valorile pasate metodei in momentul apelului.

5.5.2 Constructorul implicit


Studentii au observat exemple de cod in care nu este definit niciun constructor.Fara definirea unui
constructor,cum se creeaza obiectul?Compilatorul Java introduce un constructor in definitia
clasei.Acest constructor va avea acelasi nume ca si clasa si nu va avea niciun parametru;mai mult,nu
are niciun fel de instructiune speciala.Tipul acesta de constructor este denumit si constructorul nul - nu
executa nimic.
147

Capitol 5: Fundamentele definirii si utilizarii claselor


Un obiect creat prin folosirea constructorului nul va avea toate campurile de date initializate cu
valorile lor implicite sau cu valorile de initializare asignate explicit in sectiunea de declaratii a clasei
sau in blocul de initializare.Blocul de initializare va fi discutat ulterior in acest modul.

5.5.3 Definirea unui constructor


Cand o definitie de clasa include un constructor explicit,compilatorul va folosi acest constructor.In
acest caz,compilatorul nu va insera un constructor nul in definitia clasei.Un programator poate alege sa
includa un constructor fara parametri,asemanator constructorului nul.In Figura , codul include un
constructor fara parametri definit explicit.Spre deosebire de constructorul nul,in cazul caruia nu este
implementat niciun fel de cod,in acest exemplu programatorul a scris instructiuni explicite in interiorul
constructorului.
Un programator poate include unul sau mai multi constructori intr-o clasa.Toti constructorii vor avea
acelasi nume ca si clasa.Pentru a avea mai mult de un constructor,programatorul trebuie sa urmeze
regulile de supraincarcare;aceste reguli si introducerea mai multor definitii de constructori intr-o clasa
vor fi discutate mai tarziu.Figura prezinta un exemplu de constructori multipli.Observati faptul ca a
fost definit explicit un constructor nul - acesta nu a fost introdus de catre compilator,ci adaugat de
catre programator.

5.6.1 Sintaxa metodelor


Metoda expusa in Figura

poate fi descompusa in trei parti:

- elementele de identificare ale metodei,care includ modificatori,calificatori,tipul rezultatului intors si


numele
- parametrii metodei definiti in interiorul parantezelor,care includ tipurile de date primite de metoda
- corpul metodei definit in interiorul acoladelor
Cand obiectele trimit mesaje altor obiecte spunem ca apeleaza metode ale acestora din urma.Obiectul
apelant va identifica referinta obiectului destinatar,numele metodei si va furniza datele cerute de
metoda.Cand sunt create mai multe obiecte ale unei clase,fiecare detine o copie proprie a variabilelor
de instanta.Totusi,o singura copie a metodelor clasei este incarcata in memorie si partajata de toate
obiectele.
Una dintre tehnicile pe care le puteti folosi pentru a intelege mai bine sintaxa metodelor si
recunoasterea elementelor unei metode este sa cititi documentele API-ul pentru clasele fundamentale
din Java.Cateva exemple de definitii ale claselor fundamentale din Java sunt expuse in Figura
Pentru a trimite un mesaj unui obiect sau a apela metoda unei clase,clasa apelanta trebuie sa cunoasca
semnatura metodei.Sintaxa unei metode descrie semnatura acesteia.Este important sa retinem faptul ca
148

Capitol 5: Fundamentele definirii si utilizarii claselor


majoritatea cazurilor de utilizare ale unei clase si ale obiectelor dintr-o clasa au loc prin intermediul
metodelor sale.O intelegere buna a sintaxei unei metode este esentiala pentru programatorii Java.

-Sintaxa unei metode are cateva elemente obligatorii.Acestea includ tipul rezultatului returnat si
numele metodei.Sintaxa metodei include si alte elemente optionale;acestea sunt descrise in interiorul
simbolurilor <> - vezi Figura . Caracteristicile sunt urmatoarele:

-Modificatorii pot fi omisi.Ei definesc accesibilitatea metodei;neincluderea lor va face ca metoda sa


aiba nivelul de acces implicit.Clasele din acelasi director isi pot accesa reciproc metodele.

-Calificatorii pot fi omisi.Calificatorii definesc limitari speciale sau capabilitati ale metodei.Cuvintelecheie folosite in acest caz includ:

-static - Nu este necesara existenta unui obiect din aceasta clasa,metoda putand fi apelata prin referinta
numele-clasei.metoda(). Folosirea lui static in contextul unei metode este identica cu situatia unui
atribut static.

-final - Definitia metodei nu poate fi schimbata.Acest calificator este folosit in special pentru
implementarea mostenirii sau a subclaselor.

-native - Metoda apeleaza proceduri sau programe scrise in alt limbaj.Aceasta este o optiune avansata
a Java care nu este acoperita in acest curs.

-synchronized - Acest calificatorul este folosit in contextul programarii concurente.


- Parametrii unei metode definesc tipurile de date care trebuie furnizate de apelant.La utilizarea unei
metode,apelantul trebuie sa cunoasca tipurile de date cerute si nu numele variabilelor formale care vor
stoca datele.De exemplu,pentru o semnatura de forma methodX(String s), apelantul trebuie sa stie
doar ca metoda necesita o referinta la un obiect de tip String.Apelul metodei poate avea forma
methodX("hello").

5.6.2 Corpul unei metode


Metodele unei clase definesc procedurile si sarcinile ce pot fi efectuate de un obiect sau o clasa.Corpul
metodei contine procedurile;el este inconjurat de acolade de deschidere si de inchidere.Metodele vor
include mai multe constructii ale limbajului Java precum crearea de obiecte,folosirea operatorilor
Java,folosirea constructiilor de selectie sau a constructiilor logice,folosirea iteratiilor prin cicluri do,for
si while.Toate acestea pot fi incluse intr-o metoda.Din exterior,utilizatorul clasei trebuie sa cunoasca
doar elementele din semnatura metodei - acestea sunt identificatorul sau numele ei si parametrii
metodei.

5.6.3 Numele unei metode


149

Capitol 5: Fundamentele definirii si utilizarii claselor


Numele unei metode poate fi orice identificator unic;el este un element obligatoriu al semnaturii
metodei.
Regulile pentru identificatorii Java specifica ca primul caracter trebuie sa fie o litera sau un semn de
punctuatie a setului de caractere Unicode.Conventiile de codare variaza printre programatorii
Java.Unele organizatii stabilesc standarde pe care programatorii care lucreaza intr-o echipa trebuie sa
le urmeze.De exemplu,clasele fundamentale Java au un set de standarde pentru identificatori - vezi
Figura . Standardele ii ajuta pe programatori sa comunice capabilitatile unei metode prin numele
sau.Acest curs respecta adesea standardele de codare Java.Studentii trebuie sa devina familiari cu
aceste standarde;ei le vor observa implementate in Java Development Kit,care include toate pachetele
si clasele fundamentale Java,si in cele mai multe IDE-uri.

5.6.4 Valoarea returnata


Valoarea returnata este un element necesar in sintaxa metodei.Ea specifica ce tip de date,referinta sau
primitiv,va fi returnat de metoda apelantului.Daca metoda nu intoarce date,ca in cazul multor metode
de tip setter sau mutator,trebuie folosit cuvantul-cheie void.Daca metoda returneaza un tip specific de
date,acesta trebuie definit cu cuvantul-cheie return in corpul metodei.
Cuvantul-cheie return este folosit in doua formate diferite:

- return value;
- return;
In primul format,tipul returnat identifica datele care vor fi intoarse,cum ar fi x,care poate fi o referinta
la un tip primitiv sau la un alt obiect,sau this,care referentiaza obiectul curent al metodei apelate.
Compilatorul furnizeaza automat cel de-al doilea format la sfarsitul blocului unei metode al carei tip
returnat este void.Exista cazuri in care programatorii vor folosi cel de-al doilea format - acesta va fi
folosit ulterior in curs pentru a parasi abrupt o metoda si a iesi inainte de executia tuturor
instructiunilor.Aceasta situatie poate aparea daca o anumita conditie impiedica continuarea executiei
codului.
Tipurile specifice Java sunt cele primitive si clasele Java.O greseala uzuala facuta in scrierea unei
metode este descrierea tipului returnat ca variabila de referinta la un obiect sau tip primitiv.Daca o
metoda intoarce o referinta la un obiect,sintaxa metodei declara doar clasa obiectului si nu referinta
acestuia.La fel,daca o metoda intoarce un tip primitiv,sintaxa ei declara doar tipul si nu numele
variabilei.
O metoda poate intoarce o singura valoare.O instructiune return poate intoarce o valoare referentiata
de o variabila sau rezultatul unei expresii.In toate cazurile,tipul de date al valorilor intoarse trebuie sa
fie compatibil cu tipul returnat declarat in definitia metodei.

150

Capitol 5: Fundamentele definirii si utilizarii claselor


Exemplul de cod expus pentru clasa LabelText prezinta tipul returnat void - vezi Figura . Cand
metoda print() din clasa LabelText este apelata in metoda main,este afisat obiectul de tip String
referentiat de variabila label.Cum tipul returnat pentru aceasta metoda este void,ea nu intoarce nici o
valoare atunci cand este folosita.Observati ca nu exista nicio instructiune de return in metoda print().
O metoda poate intoarce o valoare primitiva sau o referinta la un obiect dintr-o clasa Java.Exemplul de
cod expus pentru clasa MyStock ilustreaza tipul returnat primitiv - vezi Figura . Studentii au codat
multe metode care intorc ca valori tipuri primitive de date.In acest exemplu,metodele
getStockNumber() si getPrice() intorc un int,respectiv un double.
Exemplul de cod expus pentru clasa modificata Customer prezinta ca tip returnat o clasa Java - vezi
Figura . In acest cod,metoda intoarce o referinta la un obiect Accountant.Instructiunea de return face
referire la variabila acct iar definitia clasei identifica tipul Account.
Pe langa declararea tipului returnat,corpul metodei trebuie sa includa instructiunea return in
cod.Exemplul de cod din Figura demonstreaza amplasarea corecta si incorecta a instructiunii
return.Cand se folosesc cicluri si structuri de decizie,creati o variabila locala de tipul returnat,atribuiti-i
acestei variabile valoarea returnata si scrieti o singura instructiune de return la sfarsitul
metodei.Figura arata un exemplu de codare a instructiunii return in cazul folosirii instructiunilor if
sau loop in cod.

5.6.5 Argumentele unei metode


Argumentele(parametrii)unei metode pot fi omise prin declararea unei metode fara argumente cu
sintaxa ( ). Metodele care returneaza date fara sa primeasca,cum ar fi metodele getter,nu necesita
argumente.O utilizare frecventa a acestui tip de declaratie apare in cazul metodelor de tip getXXX.
Metodele pot avea unul sau mai multe argumente definite in semnatura.La definirea
argumentelor,sintaxa pentru fiecare include tipul de date Java si numele variabilei care va stoca
datele.O virgula delimiteaza fiecare argument.Metodele pot include argumente cu acelasi tip de
date.Daca o metoda necesita mai mult de un argument,sintaxa este necesara pentru fiecare dintre ele
chiar daca tipurile lor coincid.De exemplu,o metoda care necesita doua valori int nu poate fi scrisa ca
"public void method(int x,y)" - ea va trebui codata ca "public void method(int x,int y)".
In sfarsit,numele fiecarei variabile argument trebuie sa fie diferit pentru fiecare argument.Exemplul de
cod din Figura ilustreaza sintaxa corecta si cea incorecta pentru argumente.
Argumentele din definitia metodei sunt referite ca parametrii formali in timp ce valorile de date
furnizate la apelul metodei sunt valori sau parametri actuali.Valorile actuale trimise de catre apelant
sunt stocate in variabilele definite de parametrii formali.Exemplul de cod din Figura ilustreaza
folosirea argumentelor unei metode.

5.6.6 Conceptul de transfer prin valoare


151

Capitol 5: Fundamentele definirii si utilizarii claselor


Un apel de metoda poate include date literale,o valoare primitiva sau o referinta la un obiect.Cand
apelul foloseste o variabila,JVM-ul face o copie a valorii stocate in memorie si o asigneaza variabilei
din metoda.Acest proces este cunoscut ca pasarea valorii sau apel prin valoare(pass-by-value,call-byvalue). Variabila originala nu este schimbata;Java actioneaza asupra datelor primite folosind regula de
apel prin valoare si nu cea de apel prin referinta.In cazul apelului prin referinta,metoda poate schimba
datele din locatia originala.
Figura arata cum functioneaza apelul prin valoare pentru tipurile primitive.Observati ca valoarea
variabilei din ClassA nu s-a modificat.Figura arata functionarea apelului prin valoare pentru
referinte la obiecte.Acest concept este putin mai complicat.ClassB este capabil sa schimbe obiectul
care a fost creat de ClassA.Totusi,este important sa observam ca in ambele exemple,ClassB nu poate si
nu modifica valoarea reala a variabilei locale din ClassA.Daca consideram 30 ca valoarea variabilei
din Figura , atunci obiectul Account trebuie sa fie considerat ca valoarea variabilei locale din
ClassB.Exemplul de cod pentru clasele MyDate si PassTest ilustreaza conceptul de apel prin valoare vezi Figura .
Cand datele trimise sunt un tip primitiv din Java,se actioneaza numai asupra copiei valorii.Cand datele
sunt o referinta la un obiect,sau adresa unui obiect,metoda are acces la datele non-private ale
obiectului prin referinta.Prin urmare,poate schimba valorile datelor obiectului.Cu toate
acestea,referinta originala sau adresa obiectului nu pot fi schimbate.Valoarea pasata metodei este o
copie a referintei sau adresei obiectulu
Sa presupunem ca un student trebuie sa predea o copie electronica a unei lucrari de test
profesorului.Profesorul poate modifica copia,insa studentul poseda in continuare originalul.Aceasta
este o analogie cu procesul apelului prin valoare.Totusi,daca unui prieten i se divulga locatia lucrarii
de test pe calculatorul studentului si ii este acordat acces la calculator,atunci orice schimbari va efectua
vor fi salvate,deoarece studentul a furnizat referinta.Studentul detine de asemenea o copie si acces la
aceeasi lucrare de test;el ar putea sa schimbe continutul lucrarii.In functie de cine a accesat ultimul
documentul,continutul lucrarii va reflecta schimbarile facute.Cu toate ca atat studentul cat si prietenul
lui sunt capabili sa acceseze lucrarea,informatia furnizata de student prietenului nu este o copie a
lucrarii,ci o copie a locatiei.Aceasta este o referinta la lucrarea de test.
Adesea,acest proces este confundat cu cel de apel prin referinta.De fapt,unei metode ii este transmisa o
copie a adresei obiectului.Asadar,chiar si in cazul variabilelor de tip referinta,actiunea este considerata
tot drept un apel prin valoare.

5.6.7 Metoda main


Studentii au folosit metoda main de multe ori in cadrul acestui curs.Vor fi explicate acum unele dintre
optiunile de plasare acestei metode.Definitia metodei main este specificata de regulile limbajului
Java.Toate celelalte metode sunt considerate metode definite de utilizator.Definitia metodei main este
speciala,deoarece JVM-ul este programat sa o caute.Orice clasa care defineste o metoda main este
considerata drept un punct de intrare intr-o aplicatie care poate consta din mai multe clase.
152

Capitol 5: Fundamentele definirii si utilizarii claselor


Definitia metodei main include modificatorul de acces public,calificatorul static,tipul returnat void si
un singur argument care descrie tipul de date(vector de String)si o variabila care sa stocheze aceste
date.Un vector este o referinta la mai multe obiecte de acelasi tip din Java.In cadrul acestei
discutii,String[] declara tipul de date ca fiind unul sau mai multe String-uri.Fiecare este un obiect
separat care poate fi accesat prin indecsii vectorului.Uneori,vectorul de String-uri este definit prin
formatul String args[]. Simbolul de vector este atasat numelui variabilei si nu tipului de date.Acest
lucru nu schimba semnificatia argumentului;el este in continuare o referinta la un vector de obiecte
String.
Conventia de codare este sa folosim eticheta args pentru variabila din argumentul
metodei.Totusi,argumente precum (String [ ] s), ( String s[ ] ), (String dataFromConsole[ ]), sau
(String [ ] dataFromConsole)vor functiona.In fiecare dintre aceste exemple,eticheta variabilei este
diferita dar tipul de date ramane neschimbat.Folosirea etichetei args este recomandata insa in cele mai
multe cazuri.
De multe ori,pentru testarea unei clase programatorul include o metoda main in cadrul ei.Cu toate ca
testarea devine astfel mai usoara,acest procedeu introduce confuzie in organizarea claselor si in
identificarea unui punct de intrare pentru aplicatie.Pentru a controla exact care clasa este incarcata mai
intai in memorie,evitati definirea unei metode main in mai mult de o singura clasa.Daca s-a introdus o
metoda main in scopul testarii,asigurati-va ca ati comentat metoda respectiva odata ce clasa
functioneaza.Exemplul de cod pentru clasa Student ilustreaza utilizarea metodei main pentru testarea
clasei.

5.6.8 Metode de instanta


Metodele care pot fi accesate numai prin intermediul unui obiect dintr-o clasa se numesc metode de
instanta.In cazul in care calificatorul static nu este declarat in definitia metodei,aceasta este considerata
ca fiind o metoda de instanta.Clasa Student ilustreaza definirea si utilizarea metodelor de
instanta.Metodele de instanta pot accesa orice campuri de date ale clasei folosind doar numele
corespunzator.Fiecare obiect al unei clase va partaja metodele de instanta si va avea propria copie a
campurilor de date.Metodele de instanta pot accesa alte metode ale aceleiasi clase,inclusiv metode
statice;de asemenea,ele pot accesa metode si variabile non-private ale altor clase.Pana acum,aproape
toate metodele folosite in acest curs au fost metode de instanta.

5.6.9 Metode de clasa


Metodele de clasa nu necesita crearea de obiecte dintr-o clasa pentru a putea fi utilizate.Variabilele de
instanta si metodele non-statice nu pot fi accesate direct de catre metode statice din aceeasi
clasa;acesta este un concept foarte important si poate cauza confuzia in cazul folosirii metodei
main.Aminititi-va ca metoda main este o metoda statica;ea nu poate accesa variabile de instanta,dar
poate accesa date statice.Acest lucru se intampla din cauza faptului ca in momentul executiei metodei
main este posibil ca nici un obiect al clasei sa nu fi fost creat si astfel variabilele de instanta sa nu
existe.Metodele statice pot accesa metode de instanta sau variabile de instanta numai dupa crearea
153

Capitol 5: Fundamentele definirii si utilizarii claselor


unui obiect sau instanta a clasei.Exemplul de cod pentru clasa Commission ilustreaza definirea si
folosirea metodelor de clasa.

5.7.1 Folosirea variabilei this in constructori si metode


Cand sunt create mai multe obiecte ale unei clase,fiecare obiect detine propria copie a variabilelor de
instanta.Totusi,in memorie este incarcata o singura copie a metodelor clasei care este partajata de catre
toate obiectele.Cum recunoaste o metoda identitatea obiectului care o utilizeaza?Fiecare metoda de
instanta detine o variabila cu numele de this,care se refera la obiectul curent pentru care se aplica
metoda.De fiecare data cand este apelata o metoda de instanta,variabila this este setata sa referentieze
obiectul clasei.
Variabila this este prefixata de catre compilator pentru fiecare variabila de instanta dintr-o clasa.Unii
programatori adauga manual referinta this de fiecare data cand folosesc variabile de instanta.Nu este
necesar ca studentii sa efectueze acest lucru;ei vor folosi insa aceasta referinta in multe situatii.Daca
numele variabilei de instanta este identic cu numele unui argument al metodei,folosirea variabilei this
clarifica asupra carei variabile va actiona metoda.O utilizare frecventa a acestei referinte este in
constructori;daca studentii gasesc aceste lucruri confuze,pot crea nume diferite pentru variabilele
argument.Exemplul de cod expus pentru clasa MyStock din Figura ilustreaza folosirea cuvantului
this pentru a distinge intre variabila metodei si variabila obiectului.
O alta utilizare a lui this este intoarcerea unei referinte a obiectului.De exemplu,daca o metoda trebuie
sa intoarca o referinta a obiectului care detine metoda respectiva,va returna variabila this.Referinta this
este folosita de asemenea la implementarea claselor GUI,a claselor imbricate si interioare.Aceste
subiecte sunt acoperite in modulele urmatoare.
Exemplul extins de cod pentru clasa MyStock din Figura ilustreaza folosirea instructiunii return
this;pentru a intoarce valoarea dintr-o metoda.Observati ca in cadrul metodei setStockNumber,aceasta
returneaza o referinta la obiectul curent de tip MyStock.Cum in momentul compilarii,referinta exacta
nu este cunoscuta,variabila this ia locul acestei necunoscute si ii permite programatorului sa acceseze
obiectul de la runtime care ruleaza metoda.

5.8.1 Supraincarcarea metodelor


Este posibil sa definim doua sau mai multe metode in aceeasi clasa care sa aiba nume identice;acest
proces poarta numele de supraincarcarea metodelor.Atat metodele cat si constructorii pot fi
supraincarcati.Metodele sunt de obicei supraincarcate deoarece utilizatorul doreste sa aiba versiuni
diferite care sa accepte diverse date de intrare,dar sa aiba acelasi nume deoarece au functii similare.
Regulile de supraincarcare a metodelor sau constructorilor sunt:

- Numele trebuie sa fie identice.

154

Capitol 5: Fundamentele definirii si utilizarii claselor

- Numarul de argumente trebuie sa fie diferit,sau daca numarul de argumente este acelasi,cel putin un
argument trebuie sa aiba tipuri de date diferite.

- Nu putem supraincarca o metoda doar prin schimbarea tipului returnat daca numele ei,numarul si
tipul argumentelor raman la fel.
Dupa cum a fost mentionat anterior,motivul supraincarcarii este obtinerea unor date de intrare
diferite;diferentele trebuie sa apara la apelarea metodei.Este posibil sa supraincarcarea sa fie folosita
pentru a schimba ordinea operatorilor,insa aceasta procedura nu este recomandata - mentenanta
codului pentru toate ordinile posibile ale unei liste lungi de argumente este dificila si
neplacuta.Exemplul de cod pentru clasa Commission din Figura ilustreaza utilizarea metodelor
supraincarcate.
Cum decide JVM-ul ce metoda sau constructor sa foloseasca?Compilatorul utilizeaza un proces de
manipulare,de "decorare"a numelor pentru a genera identificatori interni distincti ai
metodelor.Procesul de decorare a numelor implica adaugarea de caractere pentru a reprezenta tipurile
argumentelor.
In Figura

sunt expuse metode supraincarcate ale clasei StringBuffer,din documentele API-ului.

5.8.2 Supraincarcarea constructorilor


Exemplul de cod pentru clasa Student din Figura

ilustreaza utilizarea constructorilor supraincarcati.

Exemplul de cod pentru clasa Employee din Figura


care se apeleaza reciproc folosind variabila this.

arata utilizarea constructorilor supraincarcati

5.9.1 Initializarea datelor


Datele de instanta ale obiectelor sunt initializate dupa crearea lor.Un obiect este creat prin operatorul
new.In fiecare etapa a crearii unui obiect,variabilelor li se atribuie valori.Variabilele statice ale unei
clase sunt initializate inainte de crearea oricarui obiect.Procesul de construire asigura faptul ca toate
campurile de date ale clasei au valori cunoscute;daca programatorul nu specifica nicio valoare
initiala,sunt atribuite valori implicite.Tipurile primitive byte,short,int,long sunt setate la 0,double si
float sunt setate la 0,boolean este setat la false,char este setat la \u0000 iar referintele sunt setate la
null.
Anumite lucruri nu pot fi initializate cu o singura instructiune.Daca este necesar sa initializam un
numar mare de variabile cu o valoare calculata sau sa efectuam initializarea pe baza testarii unei
conditii,atunci este necesara crearea unui bloc de cod.Acest bloc de cod nu are nume,nu este o metoda
si este executat inainte de crearea unui obiect;el este cunoscut si ca blocul de initializare.
Cele doua tipuri de blocuri de initializare sunt cele statice si cele non-statice.Un bloc static este folosit
pentru initializarea variabilelor statice ale unei clase.Acest bloc este executat o singura data cand clasa
155

Capitol 5: Fundamentele definirii si utilizarii claselor


este incarcata la rulare.Blocul static se defineste cu ajutorul cuvantului cheie static.Acest bloc poate
initializa doar variabile statice ale clasei.Exemplul de cod pentru clasa ConstantThing2 din Figura
ilustreaza utilizarea unui bloc de initializare static.
Un bloc de initializare non-static este executat pentru fiecare obiect care este creat si poate initializa
variabilele de instanta ale unei clase.Campurile de date ale unui obiect sunt intotdeauna initializate la
crearea acestuia.Exemplul de cod din Figura demonstreaza utilizarea unui bloc de initializare nonstatic.
Datele dintr-o metoda trebuie initializate in codul metodei;ele pot proveni din patru
surse:argumente,variabile locale ale metodei,valori returnate de alte metode sau date ale unui
obiect.Argumentele dintr-o metoda referentiaza variabile cunoscute si sub numele de
parametri;variabilele parametri sunt initializate la apelul metodei.Programatorul nu trebuie sa
initializeze explicit variabilele argument ale unei metode.El trebuie insa sa initializeze variabilele
locale folosite in cadrul metodei;variabilele locale nu pot fi utilizate inainte de a fi
initializate.Compilatorul impune acest lucru si semnaleaza o conditie de eroare daca nu este
indeplinit.Exemplul de cod pentru metoda doComputation din Figura ilustreaza importanta
initializarii datelor dintr-o metoda.

5.9.2 Domeniul de vizibilitate al variabilelor


Variabilele care definesc campurile de date sunt disponibile atat timp cat obiectul care detine datele
este referentiat sau folosit.Variabilele de clasa sunt disponibile cat timp clasa este incarcata in
memorie.Pentru detalii,consultati Figura . Variabilele dintr-o metoda au o existenta temporara;ele
sunt automate,temporare si locale.
Variabilele definite in interiorul unei metode sunt create pe stiva.O declaratie a unei variabile in corpul
metodei sau in argumentele ei creeaza automat spatiu de stocare pentru variabila pe stiva.Daca
variabila este un argument,valoarea ei este initializata la apelul metodei.Daca variabila este definita in
corpul metodei,valoarea sa initiala este necunoscuta pana la o definire explicita in cod.
Variabilele dintr-o metoda sunt locale;aceasta inseamna ca sunt disponibile numai in interiorul
metodei,neputand fi accesate din afara.Variabila corespunzatoare unui argument poate fi accesata pe
intreaga intindere a unei metode.Alte variabile locale pot fi accesate numai in blocul de cod in care au
fost definite.
Variabilele dintr-o metoda care apartin unui bloc de cod exista doar in interiorul acelui bloc.Cand
executia blocului se incheie,se spune ca variabilele sunt in afara domeniului de vizibilitate.In
general,domeniul de vizibilitate al unei variabile de instanta sau de metoda coincide cu blocul de cod
in care a fost definita.Folositi exemplul de cod pentru clasele ScopeExample si TestScoping din
Figura pentru a urmari domeniul de vizibilitate al fiecarei variabile de metoda.

5.9.3 Durata de viata a unui obiect


156

Capitol 5: Fundamentele definirii si utilizarii claselor


O variabila de instanta care referentiaza un obiect in definitia unei clase leaga durata de viata a
obiectului referentiat de durata de viata a unui obiect al clasei definite.Daca variabila care referentiaza
un obiect face parte dintr-o metoda,atunci referinta la obiect moare odata cu incheierea executiei
blocului de cod din interiorul metodei.Cat timp exista o referinta la un obiect,acel obiect exista si
datele sale sunt accesibile prin acea referinta.Exemplul de cod din Figurile de la la ilustreaza
durata de viata a unui obiect.

5.9.4 Mutabilitatea unui obiect


Obiectele sunt proiectate ca fiind imutabile si clasele pot fi definite ca imutabile.Cand o clasa este
definita ca imutabila folosind cuvantul cheie final,clasa nu poate fi mostenita sau extinsa de o alta
clasa copil.Prin declararea clasei ca final,programatorul ii restrictioneaza utilizarea in contextul
mostenirii.Datele din interiorul obiectelor unei clase pot fi si ele definite ca imutabile prin declararea
tuturor atributelor clasei ca final.Cand se creeaza un obiect dintr-o clasa cu toate atributele declarate ca
final,datele din obiect sunt imutabile.Daca toate atributele unui obiect sunt declarate imutabile,datele
obiectelor instantiate nu pot fi schimbate.Clasa String ofera un exemplu de utilizare a imutabilitatii in
contextul mostenirii si instantierii.Ea este declarata ca final;programatorii nu pot o pot mosteni sau
extinde.Atributele clasei String,sau caracterele care formeaza sirul,sunt de asemenea declarate ca
imutabile prin folosirea cuvantului-cheie final in definitia clasei.Aceasta inseamna ca odata ce un
obiect String este creat,datele sale nu pot fi modificate.Obiectele de tip String sunt considerate
imutabile,dupa cum se specifica in documentele din API.
Studentii pot defini de asemenea variabile de instanta ale unui obiect ca imutabile.In acest caz doar
variabilele specificate cu cuvantul-cheie final raman neschimbate.La instantierea obiectului,valoarea
asignata in timpul procesului de creare este finala si nu poate fi schimbata.Adesea,final este folosit
impreuna cu cuvantul-cheie static.Initializarea unei variabile statice care este constanta poate fi
efectuata intr-un bloc de initializare.La declararea unei variabile de instanta ca final,programatorul
trebuie sa-i initializeze valoarea intr-un constructor sau sa utilizeze un bloc de initializare non-static.

5.9.5 Colectarea datelor nefolosite


Obiectele sunt create in memoria heap.Memoria unui calculator este finita,exista doar o anumita
cantitate disponibila intr-un moment dat.Cand sunt rulate aplicatii cu multe obiecte,nu este posibil si
nici nu este nevoie ca toate obiectele sa fie prezente in memoria heap.JVM-ul ruleaza un program
numit garbage collector,care nu poate fi controlat de catre programator.Garbage collector-ul foloseste
un algoritm pentru a elibera memoria.Obiectele care nu mai sunt folosite si pentru care nu mai exista
referinte sunt marcate pentru distrugere.Cand JVM-ul are nevoie de memorie pentru obiecte
noi,garbage collector-ul va sterge obiectele marcate si le va scoate din memorie.
Programatorul nu poate controla programul garbage collector-ului;ceea ce poate face este sa asigneze
valoarea null unei variabile referinta.Acest lucru va identifica obiectul referentiat anterior ca disponibil
pentru garbage collector.Programatorul poate de asemenea sa apeleze o metoda gc din clasa
System.Aceasta este o metoda statica,iar apelul ei are forma System.gc().
157

Capitol 5: Fundamentele definirii si utilizarii claselor


Exemplul din Figura ilustreaza utilizarea metodei gc in metoda main a clasei Student.
Retineti ca introducerea lui System.gc() va cauza ca rularea garbage collection-ul cand sistemul de
operare ramane fara memorie.Cand programatorul include apelul System.gc() intr-un program,aceasta
nu inseamna ca garbage collector-ul va rula imediat.Comanda informeaza doar sistemul de operare ca
obiectul este gata de garbage collection.Sistemul de operare programeaza apoi garbage collection-ul
dupa cum crede de cuviinta,de obicei cand nivelul memoriei disponibile este atat de scazut incat
incepe sa influenteze performanta computationala.

5.9.6 Distrugerea unui obiect


Valoarea unei variabile referinta poate fi resetata la null - dupa aceasta operatie variabila nu mai
referentiaza vreun obiect.Obiectul referentiat initial va fi distrus daca nu mai exista alte referinte la
el.Cu toate ca obiectul a fost sters,variabila referinta continue sa existe in blocul de cod care se
executa;aceasta variabila poate fi utilizata pentru a referentia un alt obiect.Durata de viata a unui
obiect este determinata de existenta altor variabile din program care o referentiaza.Exemplul de cod
pentru clasa TooManyStrings din Figura ilustreaza crearea unui obiect String,utilizarea lui null si
reasignarea unei variabile referinta.
Stergerea obiectelor din memorie poarta numele de garbage collection;acest proces are loc automat in
Java.Un program de tip garbage collector verifica periodic lista de obiecte si recupereaza resurse
detinute de obiectele nereferentiate.Fiecare obiect este asociat cu un contor de referinte catre el.Cand
acest contor ajunge la 0,obiectul este eligibil pentru garbage collection.Cand atinge acest numar
valoarea 0?Cand obiectul dispare din domeniul de vizibilitate sau cand toate referintele catre obiect
sunt nule.Aceasta nu inseamna ca obiectul dispare imediat din memorie - utilizatorii nu se pot baza pe
faptul ca memoria ocupata de obiect devine disponibila instantaneu.
Cand se petrece de fapt procesul de garbage collection?JVM-ul decide daca este nevoie sa ruleze
programul de garbage collection.Daca programul utilizatorului nu are cereri prea mari de memorie,este
posibil ca garbage collector-ul sa nu ruleze niciodata.
Studentii nu se pot baza pe garbage collection sau pe metoda gc() din clasa System pentru distrugerea
obiectelor si eliberarea memoriei,si nici nu trebuie sa scrie cod care sa depinda de momentele de rulare
ale garbage collector-ului.Un apel al metodei gc() sugereaza JVM-ului sa ruleze programul de garbage
collection in curand,insa JVM-ul poate ignora aceasta notificare.Cum decizia de rulare a garbage
collector-ului este luata de JVM,chiar daca metoda gc() nu este apelata acest lucru nu impiedica
executarea procesului de garbage collection.Exemplul de cod pentru clasa FinalizerClass din Figura
ilustreaza folosirea metodei gc() din clasa System.
Cand valoarea unei variabile referinta este setata la null,JVM-ul este notificat de faptul ca utilizatorul a
incheiat lucrul cu un obiect.Orice referinta la un obiect poate fi testata pentru a vedea daca valoarea ei
este egala cu null.Codul din Figura verifica daca referinta la obiect este diferita de null inainte de a
afla lungimea String-ului.
158

Capitol 5: Fundamentele definirii si utilizarii claselor

5.9.7 Finalizatori
Finalizatorii sunt metode care efectueaza orice actiuni sunt necesare inainte de distrugerea obiectelor
de catre programul de garbage collection al JVM-ului.Cum metoda finalize este apelata de catre JVM
chiar inainte de rularea garbage collector-ului,programatorii nu pot estima cand va avea loc executia
ei.Cu toate ca putem folosi metoda statica runFinalization din clasa System (System.runFinalization())
pentru rularea metodelor de finalize ale obiectelor care au fost scoase din uz dar ale caror metode de
finalize nu au fost apelate,aceasta operatie este efectuata de JVM fara a oferi garantii.
Cum JVM-ul elibereaza memoria odata ce obiectele sunt distruse,de multe ori nu este nevoie de
finalizatori.In general,finalizatorii sunt folositi pentru sarcini de curatare diferite de realocarea
memoriei si trebuie utilizati cu grija.
Principalul motiv este ca programatorii nu au niciun control asupra intervalului de rulare al garbage
collector-ului.De exemplu,daca un obiect Java este folosit pentru a stabili o conexiune de retea si
instructiunile de inchidere a conexiunii se gasesc in metoda finalize a obiectului,este posibil ca
conexiunea sa nu fie inchisa niciodata daca garbage collector-ul nu este necesar programului.Aceasta
ar cauza persistenta unor conexiuni deschise catre un cont bancar sau date bancare intr-o aplicatie
financiara.Cu toate ca asemenea lucruri nu se intampla aproape niciodata in productie,acestea
reprezinta un exemplu al consecintelor ce ar putea rezulta in cazul in care programatorul se bazeaza pe
metoda finalize().
O alternativa la metoda finalize() si la eforturile aproximative ale metodei runFinalization() este
definirea unei metode de inchidere sau curatare.Cand aceasta este apelata de programator,va executa
instructiunile necesare.Clasele folosite pentru crearea obiectelor de tip GUI utilizeaza asemenea
metode pentru a se asigura ca imaginile si resursele alocate obiectelor GUI sunt eliberate si sterse de
pe ecran.
Fiecare clasa mosteneste superclasa Object.Conceptul de mostenire este explorat in mai multe detalii
in modulul 8.Mostenirea este un concept simplu cu posibilitati de implementare complexe.O clasa
poate deriva multe dintre metodele si atributele sale de la o alta clasa.Acest lucru ii permite
programatorului sa organizeze clasele astfel incat odata ce o clasa este definita,testata si functioneaza
corect,poate fi creata o clasa asemanatoare cu metode sau atribute suplimentare.Se considera ca cea
de-a doua clasa deriveaza sau mosteneste proprietatile primei clase.Toate clasele din limbajul Java
mostenesc superclasa Object.Clasa Object include cateva metode care fac parte automat din definitia
oricarei clase - printre ele,metoda finalize(). Codul acestei metode poate fi inlocuit cu un cod scris de
programator.Totusi,programatorii trebuie sa utilizeze semnatura exacta a metodei.Documentele din
API ofera informatii mai multe despre clasa Object.
Exemplul de cod pentru clasa FinalizerClass demosntreaza definirea si utilizarea metodei finalize() din
clasa Object.

5.9.8 Imutabilitate
159

Capitol 5: Fundamentele definirii si utilizarii claselor


Sa consideram o situatie in care datele unui obiect sau ale unei clase nu trebuie sa se schimbe.Aceasta
caracteristica reprezinta mutabilitatea sau modificabilitatea datelor si metodelor unui obiect sau ale
unei clase.In limbajul Java,cuvantul cheie final este folosit pentru a specifica un atribut sau o metoda
dintr-o clasa ca imutabila sau de neschimbat.Datele care sunt fixe sau finale sunt de asemenea referite
ca date constante sau constante.Conventia de codare din Java este ca asemenea date sa fie numite cu
identificatori cu litere mari.Folosirea cuvantului-cheie final informeaza JVM-ul sa asigneze o valoare
constanta variabilei.
Atributele unui obiect care au fost declarate ca final nu pot fi schimbate dupa instantierea unui obiect
din clasa respectiva.Pentru atributele de instanta,fiecare obiect al clasei va detine propria copie a
atributului.Valoarea constantei poate fi diferita pentru fiecare obiect.Pentru a realiza acest
lucru,valoarea trebuie initializata in metoda constructor a clasei.
Exemplul de cod pentru clasa ObjectNoChange demonstreaza utilizarea lui final pentru
instante,specificandu-le
drept
constante.In
Figura ,
variabilele
objectNumber
si
objectSecondNumber sunt variabile de instanta care au fost declarate ca final.Acestea sunt
constante.La crearea obiectelor referentiate de ob1 si ob2,sunt fixate valorile pentru variabilele
objectNumber si objectSecondNumber si nu pot fi modificate ulterior.Cu toate ca
objectSecondNumber este public,orice incercare de a-i schimba valoarea va cauza o eroare de
compilare.
Fiecare obiect referentiat de ob1 si ob2 stocheaza o copie proprie a constantelor.Cand constanta
trebuie partajata intre toate obiectele clasei,atributul este specificat atat ca final cat si ca static.
Exemplul de cod pentru clasele CreditCardUser si CreditCardAccount ilustreaza utilizarea
constantelor de tip final static.In Figura , constanta MAX_TEST este statica.Toate obiectele de tip
LabelText vor utiliza aceasta constanta.Valoarea constantei nu poate fi schimbata.Obiectele din alte
clase vor accesa constanta prin sintaxa LabelText.MAX_TEXT.

Rezumat
Acest modul a introdus conceptele de baza pentru definirea si utilizarea claselor.Exista patru pasi in
procesul de definire al unei clase:
1.Declararea atributelor
2.Definirea constructorilor
3.Definirea metodelor standard
4.Definirea metodelor speciale
Odata ce clasa a fost definita,studentii trebuie sa-si aminteasca sa initializeze intotdeauna datele,sa
mentina datele private pentru a nu viola principiul incapsularii si sa foloseasca nume care reflecta
sarcinile clasei.Fiecare clasa si fiecare obiect vor avea un modificator de acces (sau pe cel implicit)si
160

Capitol 5: Fundamentele definirii si utilizarii claselor


un calificator.Studentii au invatat si ca este mai bine sa avem mai multe clase mici care efectueaza
putine sarcini decat mai putine clase mari care indeplinesc functii complexe.
Au fost discutate si definitiile metodelor si variabilelor.Printre lucrurile invatate de studenti se numara
faptul ca metodele trebuie sa declare o valoare returnata si pot avea zero,unul sau mai multe
argumente.De asemenea,metodele pot fi supraincarcate,caz in care pot exista mai multe versiuni
pentru date diferite de intrare.Variabilele pot fi de instanta,de clasa sau locale.Variabilele de instanta si
cele de clasa sunt initializate cu valori implicite,iar variabilele locale trebuie initializate
explicit.Variabilele de instanta sunt create in portiunea de heap a memoriei iar varibilele locale sunt
create pe stiva.In continuare,o variabila speciala numita this este disponibila pentru toate
metodele.Variabila this contine o referinta la obiectul curent care foloseste metoda.
In sfarsit,a fost discutat mecanismul de garbage collection.Studentii au invatat ca programatorul nu
controleaza acest proces.Garbage collection-ul poate fi programat prin apelarea metodei gc(). Pentru a
elibera resursele folosite de un obiect se poate defini metoda finalize() pentru o clasa.

161

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare

Capitol 6: Clasele System, String, StringBuilder, Math si de


impachetare
Prezentare generala
In acest modul,studentii vor invata cum sa utilizeze documentatia API si cum sa creeze clase care
utilizeaza obiecte de tip String,StringBuffer,Math si clase de impachetare.Studentii vor utiliza
metodele si atributele fiecarei clase.Clasele Date,DateFormat si Calendar sunt de asemenea
prezentate.Scopul acestui modul este familiarizarea studentilor cu documentatia Java API pentru a
demonstra valoarea ei.Studentii vor descoperi ca documentatia Java API este o unealta valoroasa pe
care o vor folosi in acest curs si in majoritatea proiectelor de programare Java.
Pachetele sunt entitati care ajuta la administrarea claselor grupandu-le.Limbajul Java utilizeaza
pachete pentru a organiza grupuri de clase care au o functionalitate comuna.Clasele din fisierele care
fac parte dintr-un pachet necesita stabilirea corecta a variabilei de sistem CLASSPATH.Pentru a
accesa API-ul Java al bibliotecilor pentru clasele fundamentale (core)si pentru clasele extinse
(extended), variabila CLASSPATH trebuie sa fie indice spre directorul in care pachetele Java sunt
stocate.
Clasele din pachete pot mosteni de la clase din aceleasi pachete sau de la alte clase din alte
pachete.Modificatorul protected influenteaza accesul la o clasa pentru clasele din alte
pachete.Pachetele pot fi comprimate si stocate ca un fisier arhivat utilizand utilitarul jar.Acest fisier jar
este accesat cu usurinta de platforma Java.Impachetarea claselor intr-o aplicatie si crearea unui fisier
jar asigura usurinta in instalarea unei aplicatii.
Cuvinte cheie
- String
- StringBuilder
- Clase de impachetare
- Clasa Math
- Pachetele matematice BigInteger si BigDecimal
- Clasele Date,Calendar si DateFormat
- Metode statice
- Conversia de tip
- Concatenarea
- Metoda toString
- Pachete
- Director
- Incarcarea claselor
- Variabila PATH
- Variabila CLASSPATH
- Declararea explicita a pachetului
- Domeniile unice
- Utilitarul jar
162

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


- Unitate de compilare
- Directorul curent de lucru
- Directorul implicit
- Clase standard

6.1.1 Crearea de obiecte de tip String


String-urile sunt secvente de caractere,cum ar fi sirul "hello". Java nu are un tip de date primitiv
pentru siruri.In schimb,clasa String serveste pentru crearea si pastrarea secventeleor de caractere intrun obiect String.Fiecare dintre sirurile afisate intre ghilimele in figura este o instanta a clasei String.
Obiectele String pot fi create utilizand una dintre cele doua reguli de sintaxa afisate in figura . In
primul exemplu o valoare literala a unui string inclusa intre ghilimele este atribuita variabilei de
referinta String.Aceasta instructiune de atribuire creeaza in mod implicit un nou String.In al doilea
exemplu programatorul utilizeaza operatorul new pentru a crea in mod explicit un obiect de tip
String.Obiectele String pot fi de asemenea create fara o referinta precum in valoarea intoarsa de
metodele toString ale clasei Teacher.Obiectele String pot fi create si cu metoda println.
Obiectele String sunt considerate imutabile.Atunci cand valoarea unui String a fost setata,aceasta nu
mai poate fi schimbata.De exemplu in urma executiei String s = "Hello"este asignat un obiect String
cu valorile char 'H' 'e' 'l' 'l' 'o'.Aceasta valoare nu poate fi schimbata la un alt set de
caractere.Caracterele individuale ale clasei String nu pot fi schimbate.Asa cum numarul 9 este mereu
numarul 9,sirul "Yes"va contine mereu caracterele "Y", "e"si "s".
Exista mai multe moduri prin care obiectele pot fi definite ca imutabile.Unul este de a declara fiecare
camp de date accesibil public al obiectului ca fiind final.O alta optiune este de a incapsula obiectul
declarand campurile de date ale obiectului ca private si neimplementand nicio metoda de modificare a
valorilor obiectului.In clasa String,caracterele care alcatuiesc sirul sunt stocate intr-o colectie,sau
vector de valori char.Nicio metoda setter nu este furnizata pentru a accesa aceste valori si a le
schimba,ceea ce face obiectul String imutabil.
Clasa String este definita ca final.Aceasta declaratie nu trebuie confundata cu imutabilitatea obiectului
String.Cand o clasa este declarata imutabila,acest lucru inseamna ca aceasta nu poate fi
schimbata.Conceptul schimbarii proprietatilor unei clase,sau a metodelor si valorilor,face parte din
discutia despre mostenire.Impactul declararii unei clase ca final nu inseamna neaparat ca obiectul creat
din aceasta clasa este imutabil,desi majoritatea exemplelor din acest curs implementeaza ambele forme
de imutabilitate,la nivel de obiect si la nivel de clasa.
Cand vorbim despre tipuri primitive,daca unei variabile i se atribuie o valoare si valoarea acesteia se
schimba,variabila este tot o primitiva si locatia sa in memorie nu se modifica.Continutul ei se va
modifica.De exemplu int x = 20;va asigna valoarea 20 variabilei x.Daca o instructiune ulterioara x =
30;este executata,valoarea lui x se modifica.Cu toate acestea,locatia variabilei x nu se modifica.La fel
ca orice tip de variabile referentiate,in cazul String-urilor cand valoarea variabilei se modifica,referinta
variabilei furnizeaza accesul catre un alt obiect.Locatia variabilei nu se modifica.Atunci cand se
163

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


creeaza o variabila care referentiaza un obiect String,un alt obiect String poate fi asignat variabilei
referinta.In primul exemplu din figura 1,string-ul "Polly"este referentiat de numele variabilei.In a doua
instructiune string-ul "David"este referentiat de numele variabilei.String-ul "Polly"nu mai are nici o
referinta catre sine.Studentul trebuie sa retina ca atunci cand un obiect nu mai are nici o referinta spre
el,este pregatit pentru garbage collection si va fi eliminat de catre JVM.Locatiile de memorie utilizate
de obiect vor fi lasate libere pentru a fi utilizate de catre program in crearea altor obiecte.
Deoarece valoarea unui obiect String nu poate fi modificata,cand valoarea curenta a obiectului String
este concatenata cu un alta valoare String,cateva obiecte String intermediare sunt create.Obiectul
concatenat este dupa aceea asignat unei variabile.In figura 2,numele variabilei referentiaza un obiect
String "Polly". Pe urmatoarea linie,operatia cauzeaza crearea literala a String-ului "Pocket".
Concatenarea de pe aceasta linie creeaza un al treilea String "Polly Pocket". Acesta operatie simpla a
cauzat crearea catorva obiecte String.Desi acest lucru poate parea foarte ineficient,in contextul
programarii concurente,aceasta functionalitate a obiectelor String joaca un rol important in asigurarea
partajarii lor,fara pericolul schimbarii valorii unui obiect de catre doua sau mai multe programe.Cum
toate obiectele sunt stocate in memoria heap,obiectele String sunt create tot acolo in doua locuri
diferite.Cand un String este creat folosind o asignare literala,String-ul este stocat in spatiul de memorie
care poate fi partajat de catre toate obiectele.Acesta este deseori referit ca pool-ul String.Cand
obiectele String sunt create utilizand operatorul new,obiectul este creat in acelasi spatiu de adresa ca
orice alt obiect creat pe heap.
Comparati utilizarea unei referinte la un obiect String cu o referinta la un tip primitiv.In figura ,
intregului x i se atribuie o valoare de 10.Operatorul += adauga 20 la 10 si x ia valoarea 30.Doar o
copie a lui x a fost utilizata aici.Deoarece "Polly"si "Pocket"sunt obiecte partajate String,ele pot fi
refolosite si referite de catre variabilele name2 si name3.Acest lucru nu este garantat.In general,cat
timp exista memorie si activitatea de garbage collection nu a avut loc,asignarea unui String unei
referinte de obiect String cauzeaza o cautare in String pool pentru o potrivire si reutilizarea String-ului
din pool.
Considerati ce se intampla daca operatorul new este utilizat pentru a crea un sir.Aici numele variabilei
referentiaza un obiect String care va fi creat in memoria heap,nu in pool-ul String.Cand lui name este
reasignata o referinta catre String-ul "Video", "Video"este stocat in zona partajata,in pool-ul
String.Cand lui name2 ii este asignata o referinta catre String-ul "Movie"el referentiaza un obiect
String din pool-ul String,nu obiectul String creat pe heap si asignat initial lui name.
In general,clasa String ar trebui utilizata rar.Utilizati String pentru a stoca date care vor fi partajate de
multe obiecte si care nu se vor modifica.Alternativa utilizarii obiectelor String este utilizarea
obiectelor StringBuilder.

6.1.2 Metode

164

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Exista multe operatii care pot fi efectuate pe date de tip String.Acestea includ
concatenarea,compararea,identificarea unor caractere specifice,extragerea unor portiuni din String si
convertirea unui String din majuscule in minuscule sau invers.
Pe obiectele String se poate opera direct utilizand operatorul + pentru concatenarea String-urilor.La
concatenarea String-urilor,tipurile primitive sunt automat convertite in String-uri.De exemplu "The
value is" + 26,va rezulta in conversia lui '26' intr-un String si apoi acesta va fi concatenat cu String-ul
care il precede.
Atunci cand se compara String-uri,operatorii == nu examineaza continutul lor.Ei compara locatia
String-urilor in memoria heap.Cand doua variabile sunt comparate,se examineaza valorile lor.Atunci
cand se lucreaza cu variabile referinta,valorile variabilelor sunt referinte catre un obiect,si nu obiectul
in sine.In figura , primul rezultat va fi false pentru ca ambele variabile referentiaza obiecte diferite.A
doua linie va afisa true deoarece amandoua variabilele referentiaza acelasi obiect din zona partajata
numita String pool.A treia linie va afisa false deoarece "Polly"nu este acelasi obiect ca "polly"din
cauza diferentei intre literele care formeaza fiecare String.
Utilizarea operatorului egal cu (==) in comparatia obiectelor este considerata o comparatie
superficiala.Se va arata daca valorile de referentiere sunt egale.Pentru a efectua o comparatie
amanuntita a datelor din aceste obiecte String,utilizati metode ale clasei String,cum ar fi compareTo(),
equal() si equalsIgnoreCase().
Exista cateva metode in clasa String care trebuie cunoscute si utilizate.Tabelul din figura descrie
semnatura metodei si cateva sugestii de utilizare.Retineti ca obiectele String sunt imutabile.Orice
metoda din acest tabel care descrie o schimbare a String-ului creeaza de fapt o copie a acestuia cu
modificarile respective.Acest lucru poate duce la crearea multor obiecte String pentru a face o
modificare.Din acest motiv este sugerata utilizarea clasei StringBuffer pentru date care trebuie
schimbate frecvent.
Fiecare caracter dintr-un String ocupa o pozitie numerotata.Locatia fiecarui caracter este de asemenea
referentiata de un index.De exemplu in String-ul "Hello", caracterul 'H' ocupa prima pozitie iar
valoarea indexului sau este 0.Caracterul 'e' este al doilea si valoarea indexului sau este 1.Retineti ca
valoarea indexului primului caracter dintr-un String este 0 si nu 1.Unele din metode utilizeaza acesta
valoare index.De exemplu,metoda charAt() necesita o valoare index,si va returna caracterul de la acea
valoarea index.In cazul executiei unui apel la metoda charAt(3)a unui String continand valoarea
"Hello", metoda ar returna caracterul 'l'.Metoda substring necesita ca argumente un index de inceput si
unul de sfarsit si utilizeaza aceste valori pentru a extrage si returna portiuni dintr-un String.Website-ul
afisat mai jos detaliaza motivele pentru care este recomandata utilizarea in acest mod.
Examinati fiecare dintre metodele din figura

. Consultati documentatia din API a fiecarei metode.

6.2.1 Metode
165

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Clasele String si StringBuilder sunt clase independente cu multe metode diferite.Utilizati clasa
StringBuilder ca spatiu de lucru pentru manipularea caracterelor si clasa String pentru stocarea
rezultatului final.
Fiecare obiect StringBuilder are o capacitate sau marime maxima.Cu toate acestea,daca sunt adaugate
caractere aditionale la un StringBuilder astfel incat acesta isi depaseste capacitatea maxima,Java va
asigura o capacitate mai mare.Operatii simple cum ar fi concatenarea utilizand operatorul + nu pot fi
efectuate pe obiecte StringBuilder.Cu toatea acestea,clasa furnizeaza metodele append() si insert()
pentru adaugarea de caractere la String-ul continut de obiectul StringBuilder.
Exista cateva metode in clasa StringBuilder care trebuie cunoscute si utilizate.Tabelul din figura
descrie semnatura metodei si cateva sugestii de utilizare.
Metoda equals() din clasa StringBuilder nu suprascrie metoda equals() din clasa Java Object.Ca
rezultat,StringBuilder.equals() va verifica doar identitatea obiectului referit.Consultati exemplele din
figurile si care utilizeaza clasele String si StringBuilder.
Metoda equals() a clasei StringBuilder furnizeaza rezultate diferite,asa cum este aratat in Figura

Pentru a face o comparatie intre obiecte StringBuilder,convertiti-le in obiecte String si apoi utilizati
metoda String.equals(), asa cum este indicat in Figura .
Site-ul afisat mai jos explica de ce clasa StringBuilder este mai eficienta decat clasa String.

6.3.1 Introducere in clase de impachetare


Datele numerice,cele de tip boolean si caracterele sunt tratate in forma primitiva din motive de
eficienta.Limbajul de programare Java nu priveste tipurile primitive de date ca obiecte.Exista
numeroase cazuri cand valori primitive necesita manipulari complexe.Un exemplu este conversia intre
tipuri diferite de date,din tip boolean in caracter sau din caracter in double.Limbajul de programare
Java asigura un set de clase cunoscute sub numele de clase de impachetare(wrapper)pentru a manipula
valori de date primitive ca obiecte.Aceste valori sunt "impachetate" (wrapped)intr-un obiect.Fiecare
tip de date primitiv din Java corespunde unei clase de impachetare in API-ul Java.Aceste clase sunt
parte a bibliotecii claselor de baza(core)cum sunt si clasele String si System.
Fiecare obiect impachetat incapsuleaza o singura valoare primitiva.Acest lucru este aratat in Figura .
Construirea unui obiect dintr-o clasa de impachetare se face pasand valoarea ce trebuie impachetata
("wrapped") constructorului conform figurii . La fel ca si la String-uri,unde un sir poate fi creat
utilizand o asignare literala sau prin utilizarea operatorului new,obiectele din clasele de impachetare
pot fi create utilizand operatorul new,sau utilizand functionalitatea generica introdusa in noile versiuni
ale limbajului.Urmatoarea sectiune prezinta mai multe informatii despre acest tip de functionalitate.
Aceste clase de impachetare implementeaza imutabilitatea intr-un mod similar clasei String.Valoarea
primitiva stocata intr-un obiect dintr-o clasa de impachetare este incapsulata si nu se furnizeaza
166

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


metode prin care sa poata fi schimbata.Clasa este declarata final,deci nicio modificare nu mai poate fi
adusa proprietatilor sale.Dupa ce valoarea primitiva este initializata in obiectul de impachetare,nu
exista metode care sa o schimbe.Clasele de impachetare sunt folositoare cand se doreste convertirea
tipurilor primitive de date datorita multitudinii de metode pe care le poseda.Exista si cazuri in care
trebuie folosit un tip primitiv si o clasa de impachetare nu este potrivita.De exemplu,clasele de
impachetare nu pot fi folosite impreuna cu operatori aritmetici sau conditionali.Exemplele de cod
aratate in Figura ar genera erori de compilare.Pentru a putea fi folosite in instantele ilustrate,valorile
primitive trebuie mai intai extrase folosind metode din clasele de impachetare.

6.3.2 Clasele si metodele asociate lor


Iata metodele pentru cateva din cele mai comune clase de impachetare:

- Integer - Metodele pentru clasa Integer sunt descrise in tabelul din Figura .
- Double - Metodele pentru clasa Double sunt descrise in tabelul din Figura .
- Character - Metodele pentru clasa Character sunt descrise in tabelul din Figura .
- Boolean - Metodele pentru clasa Boolean sunt descrise in tabelul din Figura .
Anumite situatii necesita utilizarea valorilor double cu punctuatie utilizand virgula,cum ar fi datele
introduse printr-o GUI.Metodele parseDouble(String val)sau Double(String val).doubleValue() din
clasa wrapper Double nu pot manipula punctuatia cu virgula cum ar fi 1,234.50 si vor arunca o
exceptie de tipNumberFormatException.O exceptie este situatie de eroare care cauzeaza oprirea
programului din executie.
In plus fata de clasele wrapper,sunt furnizate clase care formateaza date.O alternativa este utilizarea
clasei DecimalFormat,parte a pachetului java.text,apeland metoda parse(String val)asa cum este aratat
in Figura .
Utilizati metoda trim() pentru a elimina orice spatii anterioare si succesive.Metoda parse() a clasei
DecimalFormat nu accepta spatii.Includeti mereu optiunea trim().

6.4.1 Metode statice


Clasa Math este foarte utila pentru multe operatii matematice.Acest lucru este aratat in Figura . Ea
contine multe metode,toate fiind statice.Crearea unei instante a acestei clase nu este necesara pentru
utilizarea metodelor ei.Utilizati clasa Math pentru operatiile indicate in Figura si alte operatii.

6.4.2 Formatarea numerelor


In dezvoltarea programelor care utilizeaza numere zecimale,programatorii au deseori nevoie sa
controleze formatarea acestor numere pentru afisare sau au nevoie sa prezinte valorile numerice in
167

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


diferite formate pentru diferite locatii si sa indice valori numerice in format financiar.API-ul Java
furnizeaza o serie de clase care formateaza valorile numerice.Unele din clasele frecvent utilizate
pentru formatarea valorilor sunt stocate in pachetul java.text.Java utilizeaza pachete pentru a manipula
clase stocate sau organizate in directoare ale sistemului de operare.Acest concept este explorat in
sectiuni ulterioare ale acestui modul.Pentru a include API-ul pentru clase,navigati pana la pachet asa
cum este indicat in Figura .
Iata un exemplu care utilizeaza clase pentru a elimina problema mentionata in paragraful
anterior.Localele reprezinta o limba sau o reprezentatie specifica unei tari a unei modalitati de a face
un lucru.Acestea sunt de obicei folosite fie pentru mesaje text,fie pentru formatul numerelor.De
exemplu,in Statele Unite oamenii utilizeaza cuvantul "color"si in Marea Britanie acesta este "colour".
Clasa java.util.Locale este folosita pentru a reprezenta diferitele locale.De exemplu,instructiunea
System.out.println(34.56); este dependenta de local.Punctul din numarul 34.56 este utilizat ca
separatie intre zecimale in Statele Unite dar nu neaparat in orice alt loc.In unele locale,acest numar ar
fi afisat ca 34,56.Cand API-ul este utilizat pentru formatarea numerelor,programatorul poate controla
modul in care numerele sunt printate.Figura arata cod pentru formatarea numerelor pentru doua
locale diferite.Observati utilizarea a doua tipuri noi de instructiuni in partea de sus a codului.Acestea
sunt instructiuni import.Ele sunt utilizate pentru a informa compilatorul si JVM despre locatia claselor
care nu sunt parte a setului de baza (core)de clase care formeaza Java API.Amintiti-va sa scrieti aceste
instructiuni de import asa cum este indicat pentru ca programul sa compileze si sa ruleze cu
succes.Cand acest cod este rulat utilizand US_locale,el va produce output-ul care este aratat.Locale
diferite folosesc formatari diferite.Codul ar fi putut formata valoarea folosind o instructiune cum ar fi
myString = NumberFormat.getInstance().format(1234.56). Retineti ca operatorul punct permite
programatorului sa inlantuiasca o serie de metode.Cu toate acestea,daca formatul este salvat ca in
exemplul acesta,ar putea fi reutilizat de mai multe ori pentru valori diferite dintr-un program.
In plus fata de formatele internationale,este deseori important sa existe posibilitatea unui control fin al
formatarii.
De exemplu,numarul de spatii zecimale care pot fi specificate asa cum este indicat in Figura . In
acest exemplu,un format specific de numar este setat,utilizand o notatie de forma "####.000". Acest
model inseamna "patru spatii inainte de punctul zecimal,care sunt goale daca numarul este prea mic,si
trei spatii dupa punctul zecimal,care sunt 0 daca numarul are prea putine zecimale". Output-ul acestui
program si simbolurile folosite pentru a formata modelele sunt aratate in Figura .
Figura demonstreaza ca este de asemenea posibil sa se controleze formatarea exponentului si lucrul
cu procente.
Figura demonstreaza modul de utilizare al formatarii pentru diferite valute.Din
nefericire,simbolurile pentru valute returnate pentru simboluri precum euro si lire nu sunt symboluri
adevarate.Ele sunt coduri de valuta din trei cifre din ISO 4217.Cand getCurrencyInstance() este
utilizata,simbolul este afisat ca in rezultatul pentru codul din Figura .
168

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare

6.5.1 Stocarea datelor de tip numeric in obiecte


Precizia unui intreg sau a tipurilor in virgula mobila nu este suficienta in unele aplicatii.Cand
operatiile pe numere trebuiesc sa pastreze un nivel ridicat de precizie,o parte fractionala extinsa a unui
numar sau un numar foarte mare,programatorul poate sa foloseasca clasele BigDecimal si
BigInteger.Aceste clase sunt concepute pentru manipularea numerelor cu un numar oricat de mare de
cifre.Documentatia pentru aceste clase poate fi gasita in sectiunea despre pachetul java.math din
documentatia Java API.Aceasta este aratata in Figura .
Clasele BigInteger si BigDecimal sunt folositoare pentru aplicatii cum ar fi cheile de securitate,care
sunt coduri de securitate pentru un program,o cladire,sau un cont,valori monetare foarte mari si calcule
stiintifice cu numere foarte mari.Exista un pret ce trebuie platit pentru aceasta precizie.Calculele
utilizand clasele BigInteger si BigDecimal sunt mai incete decat cele care folosesc primitive.
Clasa BigDecimal implementeaza aritmetica de precizie arbitrara in virgula mobila.BigDecimal poate
efectua calcule care pot avea ca rezultat numere mai mari decat o unitate de stocare de 64 de biti cum
ar fi double.BigDecimal mentine numere zecimale cu semn care sunt calculate precis pana la un numar
arbitrar de zecimale si care sunt folositoare pentru operatii valutare.Aceasta clasa ofera
programatorilor control peste comportamentul de rotunjire si scalare si asigura metode pentru
efectuarea operatiilor de baza.
Pentru a crea un obiect BigDecimal,utilizati constructorul si furnizati un String de numere.Operatorii
matematici familiari nu pot fi utilizati;trebuie apelate metodele clasei.Acestea sunt aratate in Figura .
Clasa BigDecimal are niste capabilitati remarcabile.Programatorii Java folosesc in mod tipic tipul
double pentru a efectua aporape orice fel de calcule matematice.Utilizand tipurile Java double pentru
calcule numerice la scara mare poate duce la probleme si confuzie prin neintelegerea limitarilor
tipurilor primitive numerice Java.Scala de precizie pentru valorile de tip double este fixata la 15
cifre.Dupa aceastea numarul va reprezenta o aproximatie in notatie stiintifica.Figura arata doua
abordari pentru calculul rezultatului urmatoarelor doua numere in virgula mobila:
9876543256789098765678.45673009876
8876543897654328967.9876098432645
Precizia si scara pentru BigDecimal sunt amandoua valori intregi cu semn pe 32 de biti.Acest lucru se
traduce prin 1,147,483,647 cifre.
Clasa BigInteger este foarte asemanatoare cu clasa BigDecimal si asigura aceeasi caracteristica de
precizie arbitrara.
Clasa BigDecimal are numeroase capabilitati pentru rotunjire,bazata pe scara de precizie
dorita.Consultati clasa BigDecimal din API-ul Java pentru mai multe detalii.Figura este un exemplu
simplu care utilizeaza un numar cu si fara factor de rotunjire si scara aplicate.
169

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Clasa BigDecimal are patru semanturi de constructor,aratate in Figura

De o importanta sporita sunt ultimele doua,care sunt BigDecimal(double val)si BigDecimal(String


val). Rezultatul constructorului BigDecimal(double val)poate fi oarecum imprevizibil,asa cum este
aratat in Figura .
Clasa BigInteger implementeaza precizia arbitrara in calculul aritmetic.Acest lucru inseamna ca
precizia nu este previzibila.Luati in calcul faptul ca limbajul Java este un limbaj cu verificare stricta a
tipurilor;rezolutia de stocare pentru fiecare tip de date este cunoscuta.BigInteger poate efectua calcule
care pot rezulta in numere mai mari de 64 de biti.
Pentru a crea un BigInteger,utilizati constructorul si furnizati un String de numere.Operatorii
matematici familiari nu pot fi utilizati,trebuie apelate metodele clasei.Pentru a efectua operatii
matematice pe obiecte BigInteger folositi metodele obiectelor.
Codul aratat pentru clasa BigIntegerTest demonstreaza utilizarea clasei BigInteger.Clasa Console este
utilizata pentru a accepta date de intrare de la utilizator.Daca un programator ar furniza 60 de numere
dintr-o multime de 400,acest program ar afirma ca sansele de aparitie a unui numar de 30 de cifre sunt
de 1 la un numar foarte mare.

6.6.1 Crearea unei date calendaristice


Datele pot fi de asemenea folosite in multe aplicatii.Datele sunt utilizate pentru a documenta
identitatea indivizilor stocand informatii precum data de nastere,data angajarii,data pornirii cursului si
data terminarii cursului.Datele mai pot fi de asemenea folosite pentru a identifica evenimente
semnificative cum ar fi data unei nunti,a unei petreceri sau termenul limita al unei teme.Companiile
utilizeaza datele pentru a identifica evenimente semnificative precum momentul in care un client a
facut o comanda,a deschis un cont,a primit niste bunuri sau servicii sau a platit o factura.
Exista trei clase in documentatia Java API care se ocupa de date.Clasa Date creeaza un obiect
Date.Clasa Calendar seteaza sau schimba data pentru un obiect Date.Clasa DateFormat afiseaza data in
diferite formate.Clasele Date si Calendar sunt localizate in pachetul java.util.Clasa DateFormat face
parte din pachetul java.text.Atunci cand utilizati aceste clase,specificati locatia acestora utilizand
urmatoarele linii inainte de antetul clasei.
import java.util.*
import java.text.*;
Examinati constructorul si metodele claselor Date,Calendar,GregorianCalendar si DateFormat din
documentatia Java API.
Exista trei modalitati de creare a unui obiect Date pentru stocarea si efectuarea operatiilor cu
date.Acestea sunt utilizarea clasei Date,utilizarea claselor Calendar sau GregorianCalendar si utilizarea
lu DateFormat,pentru a valida o reprezentare string a unei date.
170

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Clasa Date este utilizata pentru a crea obiecte care stocheaza date.Data stocata este o instanta specifica
in timp cu o acuratete de milisecunda.Constructorul fara argumente Date() creeaza un obiect pe baza
timpului actual al ceasului calculatorul cu o acuratete de milisecunda.Consultati documentatia Java
API pentru mai multe informatii despre clasa Date.API-ul pentru clasa Date descrie majoritatea
constructorilor ca fiind depreciati.Acest lucru sugereaza ca metoda a fost inlocuita cu o metoda
alternativa sau o modalitate diferita de a crea sau a efectua aceasi operatie.
Exista doua clase care sunt disponibile pentru crearea obiectelor Calendar.Acestea sunt Calendar si
GregorianCalendar.Revedeti documentatia Java API pentru mai multe informatii despre aceste
clase.Cand utilizati un obiect Calendar,poate fi obtinuta instanta curenta a calendarului si pot fi
definite datele specifice care vor fi stocate ca o data intr-un obiect Calendar.Pentru a crea o data cu
valori specifice pentru date,utilizati obiectul Calendar.Pentru a obtine un obiect Calendar,utilizati
metoda Calendar.getInstance(). Utilizati metoda Calendar.getTime() pentru a obtine data ca un obiect
Date.Modalitatea recomandata de creare a unui obiect Date este utilizarea clasei
GregorianCalendar,care furnizeaza calendarul standard folosit de majoritatea tarilor.Sintaxa pentru
crearea datelor utilizand clasele Date,Calendar si GregorianCalendar este indicata in Figura .
Studentii au descoperit ca reprezentarile String ale numerelor pot fi parcurse pentru a extrage numarul
respectiv.Intr-o maniera similara,un obiect Date poate fi obtinut dintr-o reprezentare String a unei date
utilizand clasa DateFormat.Metoda parse() a clasei DateFormat poate fi utilizata pentru a interpreta o
data reprezentata printr-un String ca un obiect Date.Revedeti documentatia Java API pentru mai multe
informatii depsre metoda parse() a clasei DateFormat.Aceasta metoda necesita declararea unei
execeptii de tip throw.Reamintiti-va ca aceasta fraza era inclusa la utilizarea metodei System.in.read()
pentru citirea datelor de intrare de la consola.Execeptiile vor fi explicate mai amanuntit in modulul 11.
Clasa DateFormat formateaza valorile datelor si ale timpului intr-o maniera independenta de
limba.Clasa SimpleDateFormat permite formatarea,parcurgerea si normalizarea.Revedeti
documentatia Java API pentru mai multe informatii despre clasa SimpleDateFormat.Sintaxa pentru
utilizarea claselor DateFormat si SimpleDate este indicata in Figura .
Asa cum este indicat in Figurile si , clasa Calendar este o clasa abstracta.De aceea,o instanta
directa a clasei Calendar nu poate fi creata.GregorianCalendar este o subclasa concreta si directa a
clasei Calendar si implementeaza multe functionalitati folositoare.Aceasta ar trebui sa fie aleasa de
programatori.

6.6.2 Modificarea datelor calendaristice


Amintiti-va ca aproape toate metodele clasei Date care ar putea ajuta la schimbarea datei su fost
marcate ca fiind depreciate in documentatia API.Acest lucru inseamna ca aceastea sunt invechite si nu
sunt atat de sigure precum metodele din alte clase care indeplinesc aceeasi functie.Pentru a seta data
unui obiect Date,utilizati metodele din clasa Calendar,care utilizeaza calendarul Gregorian.Pentru a

171

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


schimba data unui obiect Date,creati un obiect Calendar si utilizati metoda getTime() pentru a obtine
cele mai noi valori pentru obiectul Date.

6.6.3 Formatarea datelor calendaristice


Obiectul DateFormat poate stoca date specifice despre stilul de formatare al unei date.Pentru a formata
un obiect Date,porniti cu aceasi pasi care au fost utilizati pentru a converti un String intr-un obiect
Date utilizand metoda parse(). Figura arata modul in care metoda format() a clasei DateFormat
converteste obiectul Date someDate in obiectul String formatDate,care poate fi apoi printat.
Figura

arata cum se poate obtine data de astazi.

Figura

arata o metoda diferita si ajusteaza valoarea lunii.

SimpleDateFormat este o clasa concreta pentru formatarea si parcurgerea datelor intr-o maniera
sensibila la locatie.Acasta permite formatarea unei date in text si parcurgerea textului pentru crearea
unei date.SimpleDateFormat permite alegerea oricarui tipar definit de utilizator pentru formatarea
datei si a timpului.
Micul exemplu din Figura primeste o data in formatul "yyyy-mm-dd"si o va reformata in formatul
"mm/dd/yyyy". In acest exemplu,data introdusa ar fi putut veni de la un camp de date dintr-un
GUI,furnizata de un utilizator.Acest exemplu utilizeaza clasa SimpleDateFormat.
Tiparele de editare ale clasei SimpleDateFormat sunt extrem de robuste si flexibile.Consultati API-ul
Java pentru mai multe informatii.O mentiune speciala trebuie facuta pentru sirurile de formatare
caracter "MM"fata de "MMM". Consultati tiparele de formatare "yyyy-MM-dd"si "MM/dd/yyyy".
Utilizand "MM", formatarea va produce/astepta o valoare numerica pentru luna cum ar fi 04 pentru
Aprilie.Utilizand "MMM", formatarea va produce/astepta reprezentarea standard text de trei caractere
pentur reprezentarea lunii,cum ar fi Apr pentru Aprilie.In ultimul rand,utilizarea unui tipar cu mai mult
de trei caractere de tip "MMM"va atrage producerea/asteptarea unui sir intreg pentru specificarea
lunii,cum ar fi Aprilie pentru Aprilie si Septembrie pentru Septembrie.
Testati acest comportament prin schimbarea tiparului de formatare in Figura :
SimpleDateFormat sdfOutput = new
SimpleDateFormat ( "MM/dd/yyyy" );
Schimbati "MM"in "MMM"sau "MMMM"pentru a obtine diferite formate de output.
Site-ul de mai jos furnizeaza informatii suplimentare pentru adaugarea sau scaderea de timp de la o
data.

6.6.4 Numere generate aleatoriu


172

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Numerele aleatoare sunt utilizate in aplicatii multiple pentru operatii ca generarea ID-urilor unice
pentru studenti sau clienti sau pentru amestecarea unui pachet de carti.Fiecare dintre aceste cazuri
utilizeaza metoda random() a clasei Math sau obiecte din clasa Random.Generatoarele de numere
aleatoare iau un numar ca parametru initial si produc o secventa de numere aleatoare.Numarul aleator
poate fi de tip int,long,float sau double.Acelasi numar initial va genera acelasi set de valori
aleatoare.Secventa de numere generata va fi distribuita uniform pe un interval definit de tipul
variabilei.Cele mai comune evenimente au de obicei o distributie numita normala avand o curba sub
forma de clopot.Valorile in virgula mobila sunt distribuite intre 0.0 si 1.0.
Initializarea algoritmului de generare al numerelor aleatoare cu acelasi numar produce aceasi secventa.
Limbajul Java furnizeaza doua clase pentru generarea numerelor aleatoare.Clasa Math furnizeaza
metoda statica random(). Metoda Math.random() returneaza o valoare de tip double cu un modul care
este mai mare sau egal cu 0.0 si mai mic decat 1.0.Valorile returnate sunt alese pseudo-aleator cu o
distributie aproximativ uniforma in acest interval.
Pachetul java.util include clasa Random cu diferiti algoritmi pentru generarea numerelor
aleatoare.Clasa Random are doi constructori.Un constructor utilizeaza timpul de la ceasul
calculatorului ca parametru initial si altul accepta un argument de tip long ca parametru initial pentru a
genera numerele aleatoare.
Daca constructorul fara argumente este utilizat,secventa de numere va fi diferita de fiecare data.Cu
toate acestea,daca un obiect Random este generat in interiorul aceluiasi program,este posibil ca
secventa sa fie aceasi.Diferenta intre timpul calculatorului poate fi in milisecunde ceea ce nu este
suficient pentru generarea a doua secvente diferite de numere.Atunci cand constructorul este utilizat cu
argumentul long,doua obiecte Random cu acelasi parametru initial vor genera aceasi secventa.
Cand un obiect Random a fost creat,metodele obiectului pot fi utilizate pentru a genera urmatorul
numar.Tabelul din Figura descrie metodele clasei Random
Exemplul de cod din Figura simuleaza aruncarea zarurilor in interiorul buclei for.Pentru fiecare
aruncare,este necesar un numar aleator intre unu si sase pentru fiecare zar.Puteti obtine acest lucru prin
considerarea numarului aleator modulo sase si adaugarea valorii 1.Deoarece numarul aleator generat
cu metoda nextInt() va fi un intreg pozitiv sau negativ , metoda abs() din clasa Math este utilizata
pentru a asigura un numar pozitiv pentru aruncarea zarurilor.Acest lucru este aratat in Figura .

6.7.1 Colectii de clase


Un pachet este o colectie de clase.Crearea de pachete Java este modul de administrare al claselor ca un
grup.Pentru ca clasele din fisiere sa fie incarcate corespunzator,fiecare clasa trebuie sa includa o
instructiune package in definirea sa si o instructiune import pentru clasele din afara pachetului sau.
Exista doua motive principale pentru crearea pachetelor Java.Principalul motiv este modalitatea de
localizare si incarcare a claselor folosita de interpretorul Java care se foloseste de spatii de
173

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


nume.Namespace-urile sun identificatori ai unei clase si ai metodelor sale.De exemplu,presupuneti ca
doua clase,Bank si CreditCard,sunt utilizate.Daca amandoua includ o metoda numita getMoney(),
interpretorul Java asociaza metoda cu doua spatii de nume diferite.In acest caz,fiecare metoda unica
getMoney() este asociata cu numele clasei in care este definita.
Este important ca studentii sa aibe control asupra spatiilor de nume in Java.Este posibil ca o aplicatie
Java descarcata de pe Internet sa utilizeze clase care au aceleasi nume ca unele clase de pe
calculator.Sau este posibila situtatia formarii de biblioteci si programe care vor fi utilizate de alte
clase.In oricare din cazuri,studentii trebuie sa previna utilizarea numelor identice.
O clasa numita Printer este creata,de exemplu,dar o alta clasa cu numele Printer exista deja in API-ul
Java.Cum pot fi prevenite conflictele intre clasa Printer si clasa Printer din API?Este posibil ca doua
sau mai multe clase intre care nu exista nici un fel de relatie sa aibe aceleasi nume de clasa si
metode?Acest lucru se poate intampla daca fisierele clasei sunt stocate in directoare
diferite.Majoritatea sistemelor de operare nu permit ca doua fisiere din acelasi director sa aibe acelasi
nume.Clasa Printer ar putea fi in alt director fata de clasele API.Pentru a putea utiliza ambele
clase,fiecare clasa trebuie sa poata fi identificata printr-un nume unic.Pentru a permite incarcarea
ambelor clase in spatii de nume diferite si pentru a evita conflictele in apelurile metodelor,limbajul
Java furnizeaza optiunea de constructie a pachetelor.
Un al doilea motiv pentru a lua in considerare organizarea claselor in pachete este administrarea
programului ca o colectie de clase.Amintiti-va conceptul de a lucra la un program Java.In aplicatia
bancara JBANK,programul care este lansat de catre studenti este programul Teller.Acest program
utilizeaza un numar de clase cum ar fi Customer,Bank,Account,String si Date.O aplicatie pentru o
scoala utilizeaza o serie de clase cum ar fi Teacher si Student.Aceste programe pot fi privite ca o
colectie de clase.Acest lucru asigura ca clasele care se folosesc una de cealalta sunt identificate ca
fiind co-localizate (una langa cealalta). Structura directoarelor pentru sistemul de operare asigura
aceasta capabilitate.Organizarea claselor in directoare si subdirectoare este de aceea primul pas care
trebuie efectuat.Totusi,acest lucru nu asigura ca interpretorul stie unde sa caute clasele.
Cuvantul cheie package din limbajul Java permite identificarea unor grupuri de clase ca o
colectie.Cuvantul cheie import asigura ca interpretorul va sti unde sunt localizate clasele referentiate.O
instructiune package utilizand cuvantul cheie package defineste in mod explicit o declaratie de
pachet.Aceasta este utilizata pentru a declara un spatiu de nume unic pentru clase.
O clasa nu va avea acces la clase dintr-un pachet daca acesta nu este inclus utilizand instructiunea
import.

6.7.2 Incarcarea claselor si cum functioneaza aceasta


Clasele create pana acum in laboratoare au fost plasate intr-un director.Instructiunile de laborator
specifica un director in care trebuie lucrat.Acest director este numit directorul implicit.Fisierele sursa
si fisierele class ce sunt create sunt stocate in acelasi director.Studentii lucreaza in pachetul implicit.
174

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Atunci cand creati un fisier sursa,acesta este numit in mod comun o unitate de compilare.Numele de
fisier pentru fiecare fisier de cod sursa sau unitate de compilare trebuie sa se termine in .java.In
interiorul acestei unitati de compilare poate exista doar o singura definitie de clasa publica.Pot exista
una sau mai multe definiti de clase non-publice.Cand fisierul sursa este compilat,rezultatul este un
fisier .class pentru fiecare clasa definita in interiorul fisierului sursa.Compilatorul si interpretorul Java
sunt responsabile pentru gasirea,incarcarea si stabilirea interdependentelor acestor fisiere.
Pentru a intelege conceptul de localizare a claselor,cateva detalii importante legate PATH si
CLASSPATH trebuie discutate.Toate sistemele de operare utilizeaza variabile pentru a stoca numele
directoarelor in care trebuie cautat atunci cand un utilizator incearca sa lanseze sau sa incarce
programe.Pentru mediul de rulare Java,cele doua variabile care afecteaza accesul la fisierele class si la
programe JDK sunt variabilele PATH si CLASSPATH.
Termenul de cale (path)este folosit pentru a identifica lista specifica de directoare in care un program
va cauta locatia unui fisier.De exemplu,pe sistemul de operare Windows,compilatorul Java si
interpretorul Java sunt programele javac.exe si java.exe.Aceste doua fisiere sunt in general stocate
intr-o ierarhie de directoare indentificata de c:\jdk#.#\bin\javac.exe si c:\jdk#.#\bin\java.exe.Figura
arata ierarhia de directoare pentru fisierele java.exe si javac.exe.
Pe anumite platforme,variabila PATH este o variabila de sistem care va contine caile catre directoarele
in care se gasesc multe dintre fisierele ce pot fi executate.Sistemul de operare de pe o masina
utilizeaza aceste cai pentru a localiza fisierele executabile ce trebuie rulate.De exemeplu,pentru a
asigura ca sistemul de operare poate localiza fisierele javac.exe si java.exe,numele directorului in care
aceste fisiere pot fi gasite,care este c:\jdk#.#\bin,trebuie sa fie adaugat variabilei PATH.Figura arata
modul de utilizare a unei console de comanda pentru a localiza informatii despre variabila
PATH.Informatii depsre aceasta variabila pot de asemenea fi obtinute in fereastra de proprietati a
calculatoarelor ce ruleaza Windows.
Compilatorul si interpretorul Java utilizeaza variabila CLASSPATH pentru a localiza clasele si
pachetele.Variabila CLASSPATH poate contine cai catre mai multe directoare ce contin
pachete.Structura de directoare JDK contine cateva subdirectoare care sunt automat folosite pentru a
cauta clase.Aceste directoare sunt cunoscute drept directoarele standard.Aceste directoare nu trebuie
definite in variabila CLASSPATH.Este posibila stocarea fisierelor class in unul dintre aceste
directoare,desi nu este recomandata.Fisierele class ar trebui administrate printr-o structura de
directoare creata de programator.Figura identifica directoarele standard si locatiile claselor de baza
(core)API.
Deoarece directoare separate vor fi create aproape de fiecare data pentru stocarea fisierelor class,caile
catre aceste directoare trebuiesc incluse in variabila CLASSPATH.Un exemplu al variabilei
CLASSPATH este aratat in Figura .

175

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Cum gaseste,incarca si interpreteaza interpretorul clase care sunt necesare programelor asa cum este
aratat in Figura ? Atunci cand incarcarea claselor are loc,doua locatii la care se cauta sunt locatia
implicita si locatia explicit specificata a pachetului.Interpretorul efectueaza urmatoarea procedura:
1.Cauta fisiere in directoarele standard
2.Cauta toate fisierele in directorul curent de lucru.In majoritatea sistemeleor de operare simbolul "."
referentiaza directorul curent de lucru.
3.Utilizeaza caile explicite definite in variabila CLASSPATH pentru a gasi fisierele.Un programator
trebuie sa specifice explicit cai catre directoare in variabila CLASSPATH pentru a fi cautate.
4.Cauta fisiere in pachetele declarate in instructiunea package a clasei.Cauta aceste pachete doar daca
sunt in directoarele identificate de variabila CLASSPATH.
Clasele care formeaza pachetul Java.lang sunt automat accesate si nu au nevoie de identificarea
specifica a pachetului java.lang.Clasele System,String si StringBuffer sunt toate parte a pachetului
java.lang.
Presupuneti ca fisierul sursa Teacher.java nu contine referinte catre nici un pachet.Aceasta clasa
utilizeaza clasa Student.Clasa Teacher face parte din pachetul implicit.Directorul curent in care clasa
este localizata este considerat pachetul implicit.Fisierul Teacher.java este unitatea de compilare.Clasa
Teacher acceseaza clasa Student.Compilatorul cauta mai intai toate fisierele din pachetul implicit.
Daca clasa Student nu este localizata in acelasi director ca si fisierul class Teacher,un mesaj de eroare
este generat.Acesta este aratat in Figurile si .

6.7.3 Localizarea claselor ce fac parte dintr-un pachet


In cazul in care clasele necesare unui program sunt localizate intr-un director specific si au fost
identificate ca parte a unui pachet,atunci locatia acestor clase poate fi identificata utilizand doua
moduri.Primul si cel mai simplu este utilizarea instructiunii import.A doua este specificarea numelui
pachetului in fiecare utilizare a clasei in program.Clasa Student referentiaza clasa Date.Codul din
Figura arata accesul la clasa Date.Clasa Date este localizata in pachetul java.util.Pachetele de clase
sunt de obicei localizate in directoarele jdk#.#/jre/lib .
Pachetele si clasele pot fi explicit referentiate ca in Figura

Nota: Variabila CLASSPATH poate fi suprascrisa cu optiunea classpath la compilare si cu optiunea cp


la interpretare.
Considerati un exemplu in care clasele Student si Console sunt localizate in acelasi director.Classpathul pentru aceasta masina nu include o referinta la directorul implicit,care este directorul curent,indicat
de punct (.). De aceea,compilatorul va genera mesaje de eroare.Acest exemplu este indicat in Figura

.
176

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Apelul catre compilator utilizand optiunea -classpath asigura o referinta la calea catre directorul
implicit.Notati utilizarea punctului (.) dupa -classpath.Acesta suprascrie variabila CLASSPATH
pentru aceasta compilare a clasei.Acest lucru este indicat in Figura

Optiunea -cp poate de asemenea fi folosita pentru a declara o cale specifica (classpath)pentru
interpretor.In exemplul din Figura , clasa Console este in acelasi director ca si clasele Student si
Teacher,ca in cazul anterior.Pentru a utiliza programul Teacher,classpath-ul trebuie setat la directorul
curent.

6.7.4 Trei efecte ale folosirii pachetelor asupra proiectarii aplicatiilor


Pachetele au trei efecte diferite asupra proiectarii orientate pe obiect:

-Permit definirea controlului mai strict al accesului.Utilizarea cuvantului cheie protected pentru acces
din interiorul unei clase sau metode asigura accesul exclusiv al subclaselor din ierarhia de mostenire la
respectiva metoda,atribut sau clasa.Cand nu sunt folositi modificatori de acces clasa,metoda sau
atributul este considerat cu acces implicit.Clasele din acealsi pachet pot prin urmare sa aceseze aceasta
clasa.

-Usureaza reutilizarea numelor comune.De exemplu,o clasa Printer poate exista in clasele API,in
pachetul Bank si in interiorul pachetului Theacher.Numele comun Printer este reutilizat pentru a defini
functionalitati specifice de imprimare disponibile in fiecare colectie sau pachet de clase.

-Colecteaza clasele pentru ca acestea sa poata fi partajate mai usor intre aplicatii.De exemplu,clasa
Date este asamblata (face parte din acelasi pachet)cu alte clase utilitare.Clasa Date serveste multor
programe ce opereaza cu date.Aceasta clasa poate fi impartita si utilizata de alte clase.Ea este utilizata
in clasele Student,Customer si Bank.Aplicatia Bank este independenta de aplicatia Teacher dar
aceastea pot partaja si utiliza pachetul utility.
Cum sunt alese nume unice pentru pachete?Acest lucru este relativ simplu daca toate clasele cu care se
va lucra vreodata sunt create de catre o singura persoana;din pacate,se intampla destul de rar.De cele
mai multe ori,programele vor fi accesate prin Internet.Aceste programe pot folosi nume de clase si
pachete care intra in conflict cu cele deja selectate.Daca programele sunt transferate catre o alta
masina,ar putea exista un conflict in numele directoarelor sau al pachetelor.Pentru a evita acest lucru
este cel mai bine sa utilizati un nume de domeniu unic.
Figura arata o modalitate de a crea pachete in structuri de directoare.In acest exemplu,identificatorul
pachetului este de forma:
edu.state.district.studentname.banking
Clasele care sunt asamblate (packaged)se gasesc in directorul Banking.Pentru a mentine unicitatea
acestui pachet fata de oricare alt pachet Banking,numele directoarelor parinte sunt incluse ca parte a
numelui pachetului.
177

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare

6.7.5 Impachetarea claselor


Urmatorii pasi descriu procesul asamblarii claselor in pachete:
1.Includeti instructiunea package ca prima instructiune a fisierului sursa pentru a asambla clase si
pentru a identifica fiecare clasa ca un membru al pachetului.Aceasta instructiune ii spune
compilatorului sa insereze referinta catre pachet in codul binar al clasei.Acest lucru este aratat in
Figurile si .
2.Creati directoare in care clasele vor fi salvate.Exemplul din Figura
pachetul Banking.

identifica directorul pentru

3.Plasati codul sursa intr-un director separat.


4.Utilizati optiunea -d in comanda javac pentru a crea fisiere class si pentru a le plasa intr-un director
al unui pachet.Calea spre directorul pachetului este definita de catre argumentul de dupa optiunea d,care este prescurtarea de la "destination". Acesta nu ar trebui sa includa referinte la directoare din
interiorul instructiunii package din cod.
5.Setati variabila CLASSPATH astfel incat ea sa indice catre radacina identificatorului pachetului.
Un exemplu de organizare a claselor este aratat in Figura

Toate fisierele dintr-un pachet pot de asemenea fi combinate intr-un singur fisier folosind utilitarul
jar.Acest utilitar va prelua toate fisierele class din directoare si subdirectoare si le va asambla intr-un
singur fisier.Fisierul respectiv este cunoscut ca un fisier arhiva.Jar este acronimul pentru Java
Archive.Acest procedeu poate imbunatati foarte mult procesul de administrare si livrare al
claselor.Utilitarul jar a fost dezvoltat pentru Applet-uri.Applet-urile contin cod si elemente grafice
comprimate pentru descarcare mai rapida.Compilatorul si interpretorul Java poate accesa clasele
arhivate intr-un fisier jar in mod direct.
Tabelul din Figura

identifica sintaxa si optiunile pentru comanda jar .

Acesti pasi subliniaza procesul de creare a unui fisier jar folosind optiunile utilitarului jar:
1.Setati directorul curent de lucru.Fisierele din directorul Banking vor forma pachetul Banking.
2.Utilizati comanda jar asa cum este indicat in Figura

3.Utilizati comanda jar pentru a afisa continutul fisierului jar asa cum este indicat in Figura

Urmatoarele linii descriu un ghid pentru crearea fisierelor jar:


1.Creati toate fisierele class in structura pachetului care a fost aleasa cu pasii descrisi anterior.

178

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


2.Folositi utilitarul jar pentru a arhiva toate fisierele din pachet.Asigurati-va ca lucrati in directorul
superior directorului pachetului.
3.Verificati continutul fisierului jar.
4.Modificati CLASSPATH pentru a indica catre directorul in care fisierul jar este localizat.
5.Utilizati instructiuni import care specifica clasele din fisierul jar.

6.7.6 Accesarea pachetelor


Exista doi pasi importanti folositi pentru a accesa pachetele.Primul este verificarea valorii variabilei
CLASSPATH pentru a asigura referentierea directorului potrivit pentru locatia pachetului.A doua este
includerea instructiunii import in definitia clasei.Instructiunea import trebuie sa fie introdusa dupa
orice instructiune package din clasa.Acest lucru este aratat in Figura . Instructiunile import trebuie sa
furnizeze numele pachetelor.Acestea nu trebuie sa identifice directoare sau locatii ale fisierelor.Acest
lucru este indicat in Figura .
Cand o instructiune import este inclusa intr-o definitie de clasa,compilatorul si interpretorul vor cauta
directoarele si fisierele jar din CLASSPATH pentru clase ce apartin pachetelor importate ca unul
dintre primii pasi.

6.7.7 Vizualizarea pachetelor din API


Multe pachete API vor fi folosite pe parcursul acestui curs si in marea parte a programelor care vor fi
create.Intelegerea structurii pachetelor si a claselor din pachete va ajuta studentii in localizarea rapida
a claselor de care au nevoie.
Clasele sunt asamblate pe baza utilizarii comune.Mostenirea nu afecteaza abilitatea de asamblare a
claselor cu parinti diferiti in acelasi pachet.
In figurile si , selectarea unui pachet specific limiteaza afisarea claselor doar la cele incluse in
pachetul selectat.
Definitia clasei indica atat locatia pachetului cat si superclasele sale.Amintiti-va ca in acest exemplu
mostenirea se face de la o clasa din acelasi pachet.Clasa Button este o subclasa a clasei
Component.Clasa Button si clasa Component sunt in acelasi pachet,care este java.awt.Acest lucru este
indicat in Figura .
Definitia acestei clase arata ca ea mosteneste de la o clasa dintr-un pachet diferit.AWTException este
o subclasa a clasei Exception care este localizata in pachetul java.lang.Clasa Applet este in pachetul
java.applet si mosteneste de la,sau este subclasa,a clasei Panel din pachetul java.awt.In fiecare dintre
aceste pachete,clasele au fost grupate in functie de utilizarea comuna si pot fi mostenite de clase din
alte pachete.Acest lucru este aratat in Figurile si .
179

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Cuvantul cheie protected permite accesul subclaselor la membrii respectivi ai clasei parinte.
Modificatorii de acces pot avea un impact semnificativ cand clasele sunt colectate in pachete.Acest
lucru este indicat in Figura .
Clasele care apartin aceluiasi pachet vor mosteni toate atributele implicite,protejate si publice ale
clasei parinte.Subclasele care sunt in pachete diferite vor mosteni doar atribute publice ale clasei
parinte.Atributele clasei parinte care sunt declarate ca private nu sunt mostenite de nicio subclasa.
Accesul la atributele unei clase este de asemenea influentat de pachete.Clasele pot accesa atribute
publice si implicite ale altor clase din acelasi pachet.

Rezumat
Acest modul se concentreaza asupra bibliotecii de clase Java.Modulul pune accent pe utilizarea APIului Java,a documentatiei si a claselor de baza (core)ale limbajului Java.Clasele String si StringBuffer
au fost comparate explorand modurile de utilizare si metodele lor.Studentii au invatat ca clasele de
impachetare implementeaza tehnologia obiect pentru fiecare tip primitiv de date,si au vazut modul in
care clasele generice sunt folosite pentru a mari functionalitatea de asignare a acestor
clase.Programarea necesita adesea utilizarea functiilor si formulelor matematice complexe.Acestea
sunt furnizate prin intermediul clasei Math,iar aplicatiile care necesita utilizarea preciziei arbitrare
pentru numere foarte mari pot folosi clasele BigDecimal si BigInteger din pachetul Math.Valorile
datelor pot fi create,manipulate si formatate folosind clasele Date,Calendar si DateFormat.
Studentii au explorat utilizarea asamblarii in Java API.Conceptele si principiile care formeaza tehnicile
de asamblare au fost explorate.Acest modul a acoperit optiunile din limbajul Java care ajuta utilizatorii
sa-si organizeze clasele.
Pachetul este entitatea care este folosita pentru a colecta sau grupa clase.Selectia claselor care fac parte
dintr-un pachet este bazata pe utilizarea lor comuna si nu neaparat pe relatia lor de mostenire.Clasele
care sunt in pachete pot fi arhivate si comprimate intr-un singur fisier utilizand utilitarul jar.
Instructiunea package trebuie sa fie prima instructiune intr-o definitie a unei clase.Fisierul sursa care
contine definitia clasei se numeste unitate de compilare.O unitate de compilare poate avea doar o clasa
declarata ca public
Compilatorul incarca clasele cautand mai intai in directorul implicit,care este directorul curent de
lucru,apoi cauta in directoarele identificate in varibila CLASSPATH si in cele din urma in directoarele
identificate de instructiuniile package.Clasele standard sunt incarcate in mod automat si nu sunt
afectate de setarile classpath.
Classpath-ul poate fi redefinit la momentul compilarii utilizand optiunea -classpath,sau la momentul
rularii folosind optiunea -cp.Cand se utilizeaza fisiere jar,classpath-ul trebuie sa pointeze spre locatia
exacta a fisierului jar.
180

Capitol 6: Clasele System, String, StringBuilder, Math si de impachetare


Instructiunea import este utilizata pentru a identifica numele pachetelor pentru clase care nu sunt in
directorul implicit sau parte a pachetelor standard.Instructiunea import trebuie sa fie inserata dupa
instructiunea package si inainte de orice definitie a unei clase.

181

Capitol 7: Vectori

Capitol 7: Vectori
Prezentare generala
Acest modul se concentreaza pe vectori.Vectorii sunt mecanisme logice,organizate pentru stocarea
obiectelor care sunt de acelasi tip.Limbajul Java ofera de asemenea suport pentru vectori
multidimensionali,un vector de vectori
Vectorii asigura flexibilitate sporita in programare.Datele din vectori pot fi accesate,procesate si
sortate repede si eficient folosind bucle.Utilizarea buclelor si a vectorilor reduce numarul de
instructiuni pe care un programator trebuie sa le codeze si numarul de instructiuni pe care compilatorul
trebuie sa le compileze.
Studentii vor invata cum sa creeze,initializeze si sa utilizeze vectorii in acest modul.
Cuvinte cheie

- Vectori de primitve
- Vectori de obiecte
- Initializare
- Marime fixa
- Subscripts
- Index
- Indexare cu baza 0
- Lungimea vectorului
- Bloc de initializare nonstatica
- Analiza paralela
- Sortare
- Bubble sort
- Vectori multidimensionali
- IndexOutOfBoundsException
- NegativeArraySizeException
- NullPointerException
7.1.1 Introducere in vectori
Java furnizeaza o serie de constructii diferite pentru a manipula mai mult de o instanta a unei clase,sau
mai multe valori ale aceluiasi tip de date primitiv.Atunci cand se lucreaza cu instante multiple ale unei
clase sau cu valori multiple pentru un tip de date primitv,variabile separate pot fi create,una pentru
fiecare valoare sa referinta la obiect.Cand se proceseaza fiecare dintre aceste variabile,chiar daca
aceleasi operatii trebuiesc efectuate,instructiuni separate trebuiesc utilizate.In cateva dintre
laboratoarele de pana acum,studentii au creat mai mult decat o singura instanta a clasei Employees si

182

Capitol 7: Vectori
Department.Cand metodele pentru fiecare obiect au trebuit sa fie apelate,studentii au codat instructiuni
separate pentru a accesa metodele fiecarui obiect.
Java permite programatorilor sa trateze grupuri de obiecte din aceasi clasa si grupuri de date de tipuri
similare ca si colectii,lucru ce permite utilizarea buclelor pentru a accesa fiecare membru al grupului si
pentru a opera pe obiectele sau valorile respective.Acest lucru este asigurat prin utilizarea obiectelor
collection.Vectorul este un obiect collection,care este disponibil ca parte a tipurilor de date de baza
(core)ale limbajului.Aditional,biblioteca API asigura clase speciale care sunt cunoscute precum clase
collection sau container.Aceste vor fi examinate in modulul 12, "Clase Utilitar". Acest modul se
concentreaza pe utilizarea obiectului array (vector)pentru a manipula colectia de primitive de variabile
referentiate.Un obiect array creeaza si stocheaza date intr-un set secvential de locatii de stocare.
De ce utilizeaza programatorii vectori?Considerati catalogul unui profesor.Un numar de obiecte este
necesar pentru a mentine informatii despre fiecare student din clasa.Programatorii trebuie sa creeze
variabile separate cu un nume unic pentru fiecare student.Pentru a afisa datele unui student,instructiuni
separate trebuiesc scrise pentru fiecare obiect Student.De fiecare data cand un nou student este inscris
in clasa,codul trebuie modificat.Acum considerati ca exista mai mult de 20 de studenti intr-o clasa si
codul trebuie scris pentru a manipula toate aceste obiecte Student.Acest cod va fi compus din multe
linii de cod care vor repeta acelasi set de instructiuni pentru fiecare obiect.
Codul pentru clasa Teacher este aratat in figura . Acest lucru demonstreaza ca pana si cu trei obiecte
Student,exista o crestere semnificativa in numarul de linii de cod care trebuiesc repetate.Aceste este
doar procesul crearii fiecarui obiect Student,setarii datelor,si printarii acestora.Considerati procesul
pentru actiuni mai complicate,cum ar fi calculul notelor si a mediilor sau stocarea datelor pentru multe
obiecte Student in memorie sau intr-un fisier.Acest numar mare de linii de cod introduce potential
pentru erorile de omisiune,unde programatorul uita sa seteze datele unuia sau altui obiect Student.
Programatorilor li se cere sa creeze programe care sunt eficiente si ruleaza rapid.De asemenea acestia
trebuie sa scrie cod rapid si eficient.Programatorilor li se cere deseori sa creeze solutii rapid.Folosind
Java,ei pot realiza acest lucru utlilizand tipuri de date existente (pre-built)cum ar fi tipul de date vector
(array)pentru a construi un obiect vector (array)pentru a stoca un numar mare de obiecte si folosind un
numar mic de linii de cod pentru a manipula aceste obiecte.
Un vector este cel mai eficient mod de a stoca si accesa aleator o secventa de obiecte.In Figura ,
referintele la obiectele Student sunt stocate intr-un vector.Un programator trebuie sa acceseze
referintele prin vector.Acesti vectori pot fi folositi in bucle pentru a efectua acelasi actiuni asupra
fiecarui obiect.
Lungimea unui vector este stabilita la creearea acestuia,in executie.Dupa creare,un vector este o
structura cu lungime fixa.Un element al unu vector este reprezentat de una din valorile din vector si
este accesata prin pozitia sa in interiorul vectorului,asa cum este indicat in Figura .

7.1.2 Variabilele din vectori


183

Capitol 7: Vectori
Variabilele sunt utilizate pentru a referentia date.O variabila referentiaza un singur tip de date primitiv
sau o singura referinta la un obiect.Un vector este un obiect care referentiaza multe valori primitive
sau obiecte ca o colectie.Vectorul insusi ete referentiat prin o singura variabila.Un vector permite
programatorilor sa manipuleze seturi de vairabile de acelasi tip cu un singur nume./font>
Fiecare primitiva sau obiect poate fi accesata printr-o variabila.In toate programele aratate pana acum
in acest curs,fiecare variabila a avut un nume unic.Un obiect de tip vector(array)stocheaza referintele
la valorile aceluiasi tip de date.Unii programatori Java considera acest set de obiecte ca partajand
acelasi nume,managerul grupului fiind obiectul vector (array).
Indiferent de tipul de vector (array)pe care programatorul il utilizeaza,variabila vector (array)este
referentiata de un obiect care este creat in heap.Accesul la date se va realiza prin acest obiect vector
(array). Obiectul vector (array)are un indentificator unic de variabila.Accesul la primitive si obiecte se
va face prin variabila vector (array). Obiectul vector (array)poate referentia unul sau mai multe
obiecte si primitive de acelasi tip de date ca o secventa de obiecte.De exemplu,un vector (array)de
intregi este o secventa de date de tipul primitiv int stocate una langa cealalta.Toate tipurile de date
primitive pot fi stocate intr-un vector.Referintele la obiecte pot fi de asemenea stocate intr-un vector
(array). O definitie simpla a unui vector este aratata in figura.
Un vector de caractere este o secventa de primitive char.Unele clase se specializeaza in stocarea
secventelor de primitive char.Clasele String si StringBuffer,de exemplu,stocheaza text ca un vector de
primitive char.

7.1.3 Indici
Obiectul vector este un obiect preconstruit(implicit). Acest lucru inseamna ca dezvoltatorii limbajului
au definit atribute pentru obiectul vector.Deoarece Java este un obiect puternic axat pe tastare,toate
obiectele referentiate de un obiect vector ar trebui sa fie de acelasi tip de date pentru a simplitate si
eficienta.Nu trebuie sa existe operatii suplimentare pentru a descoperi care este urmatoarea locatie de
stocare.Pentru a mentine aceasta operatie ca fiind una eficienta,obiectul vector trebuie sa cunoasca
exact numarul de obiecte sau primitive pe care le referentiaza.Numarul fix de obiecte sau primitive
determina marimea unui vector sau numarul de locatii de stocare pe care vectorul le va
referentia.Aceste informatii sunt stocate intr-o variabila finala int a obiectului vector,etichetata
lungime.Aceasta variabila ofera doar drepturi de citire sau este de tip final.Odata ce obiectul vector
este creat,lungimea sa este fixata si aceasta nu se mai poate modifica.
Desi obiectele vector creeaza referinte catre alte obiecte sau asigura stocare continua pentru
primitive,se pot accesa datele in orice ordine.De unde se cunoaste ce obiecte sau primitive trebuiesc
accesate?Se foloseste un index.Intr-un vector,fiecarei primitive sau referinte ii este astribuita o valoare
int in secventa in care a fost creata.Primul obiect adaugat vectorului ii este atribuita valoarea index
0.In Java,toate indexarile incep de la 0 in loc de 1.Valoarea index pentru un element este indicata in
Figura .
184

Capitol 7: Vectori
Atunci cand se creeaza un vector de primitive sau obiecte,datele sunt accesate prin indexul elementului
in vector.Primului element din vector ii este mereu atribuit indexul 0 si urmatorului indexul
1.Lungimea vectorului va determina numarul total de elemente create.Ultimul element din vector va
avea un index egal cu lungimea vectorului minus unu.Daca vectorul continte 15 elemente,ultimul
element are indexul 14,care este 15 minus 1.Este important sa observati ca indexul incepe de la
0.Acest lucru este indicat in Figura .
Indicele unui vector nu pot fi de tip long.Doar intregi pozitivi pot fi folositi ca indici.
Acest lucru limiteaza numarul de elemente dinr-un vector la 2,147,483,648 sau 231 cu indecsi de la 0
la 231 minus 1.

7.1.4 Vectori de primitive


Vectorii pot reprezenta un set de variabile care stocheaza date primitive.In codul si graficul indicat
pentru clasa PrimitiveArrays din Figurile si , un vector de primitive int si un vector de primitive
char sunt create.Vectori de tipul primitiv long,double,boolean,byte,sau short pot fi de asemenea creati.
Sintaxa pentru crearea unui vector de primitive utilizeaza simbolul vectorial []. Instructiunea int[]
intArray = new int[5]; declara obiectul vector ca fiind de tipul int[]. Simbolul [] poate fi plasat dupa
tipul de date sau dupa variabila care referentiaza obiectul vector,int intArray[] = new int[5]; Este cel
mai bine sa se utilizeze simbolul [] dupa tipul de date,deoarece aceasta utilizare identifica in mod clar
tipul vectorului care este definit.Simbolul [] este rezervat pentru declararea si crearea obiectelor
vector.
Vectorii care stocheaza date primitive,memoreaza valorile pentru fiecare element din obiectul
vector.Deoarece un obiect vector este mereu creat in memoria heap,elemente vectorului vor fi
initializate la valori implicite pentru tipul de date.

7.1.5 Vectori de obiecte


Un vector de obiecte este mai complex.In acest caz,variabila vector referentiaza un vector de variabile
de referinta.Exista doua concepte ce trebuiesc intelese.Un vector este un obiect si este creat in
heap.Acest obiect vector poate avea o variabila care este folosita pentru a-l referentia.In
figura,variabilele duedates si students sunt referentiaza obiectul vector.Obiectul vector in sine poate
stoca o colectie de variabile de referinta.Acestea sunt elementele vectorului.Fiecare element din vector
este o referinta catre un obiect creat de asemenea in heap.In obiectul vector referentiat de variabila
duedates,fiecare element al vectorului este referentiat de valorile index 0 - n.De
exmeplu,duedates[0]referentiaza un obiect Date specific creat in heap.
Figura arata doua exemple.Unul este un vector de obiecte Student.Celalalt este un vector de obiecte
Date,care sunt referinte la obiecte din clasa Date.Clasa Date este parte a pachetului.Asa cum a fost
185

Capitol 7: Vectori
dicutat in modulele anterioare,un pachet este termenul din limbajul Java folosit pentru a descrie si
identifica accesul la o organizare de clase dintr-un director.
Urmatoarele sectiuni ale modulului vor adresa crearea si utilizarea obiectelor vector.

7.2.1 Declararea vectorilor


Crearea vectorilor implica doi pasi.Primule este declararea variabilei si apoi initializarea obiectului
vector.
Primul pas este declararea variabilei care va referentia obiectul vector.Exista doua forme pentru
declararea variabilei,asa cum este indicat in Figura . Prima modalitate este de a indica tipul de date
ca un vector prin adaugarea parantezelor patrate dupa tipul de date.In exemplele aratate,primitivele
sunt identificate de cuvintele cheie int,double,si char.Pentru non-primitive,clasele de care apartin,care
sunt String si Date,identifica obiectele vector.Cand se citeste acest format,tipul obiectelor pe care le
referentiaza obiectul vector este clar.Vaiabilele care referentiaza obiectele vector sunt
quantity,amount,choices,duedates,si names.Aceste instructiuni creaza variabila sin nu obiectul vector.
A doua forma adauga parantezele patrate dipa numele variabilei.Aceasta este de asemenea sintaxa
acceptata pentru declararea vectorilor.Prima modalitate evidentiaza tipul de date referentiat de obiectul
vector.A doua forma este similara modului in care vectorul va fi referentiat pentru
utilizare.Programatorii pot alege sa utilizeze oricare dintre cele doua forme dar in general prima ajuta
la pastrarea accentului pe tipul de date al obiectului vector.
De exemplu considerati declaratiile de vector int[] variable si int variable[]. Prima afirma ca variabila
este de tipul int[]. Urmatoarea afirma ca variabila este un vector si ca acesta este de tipul int.Forma
int[] var1,var2;va declara doua variabile care sunt vector int,in timp ce int var1[], var2[]; va declara
un vector int si inca o variabila de tipul int.
Al doilea pas este initializarea obiectului vector ca in Figura . Operatorul new este utilizat pentru a
crea un obiect vector.In crearea vectorilor,numarul de elemente,sau lungimea vectorului,trebuie sa fie
definita.In exemplele aratate,elementele vectorului sunt definite in interiorul parantezelor
patrate.Operatorul new creaza spatiu de stocare pentru fiecare obiect.De exemplu,amount = new
double[7]creeaza spatiu de stocare pentru sapte primitive de tip double.Fiecare primitiva va stoca o
valoare implicita.Valorile implicite sunt 0 pentru intregi,0.0 pentru virgula mobila, \u0000 pentru
char,si false pentru boolean.Vectorul amount va stoca cele doua valori implicite 0.0.Acest lucru este
indicat in Figura . Figura arata vectorii dupa ce o valoare a fost atribuita fiecarui element al
vectorului.
Atunci cand se creeaza un vector de referinte la obiecte,procedura include niste pasi
suplimentari.Obiectul vector este creat mai intai si apoi,fiecare obiect pe care il referentiaza vectorul
este creat.Raspundeti la intrebarile din Figura in functie de codul care ilustreaza crearea obiectului
vector si exmaniarea datelor despre obiect.
186

Capitol 7: Vectori
Instructiunile Java pentru crearea unui obiect vector care referentiaza alte obiecte sunt aceleasi ca si
cele folosite la crearea unui vector de primitive.Variabila vector si numarul de elemente trebuiesc
definite.Valoare implicita pentru tipul de date referentiat este null.Ca rezultat,fiecare din elementele
din vector contin valoarea null.Este important sa intelegeti ca niciun obiect referentiat de vector nu a
fost creat.
Declararea unui vector ca variabila de tip final insemana ca variabila vector va referentia mereu acelasi
vector.Nu inseamna ca elementele vectorului nu pot fi schimbate.

7.2.2 Folosirea de indici pentru accesarea elementelor din vector


Fiecarui element al unui vector ii este atribuit un valoare index care este de tipul int.Accesul la aceasta
valoare poate fi facut prin utilizarea unei valori int sau a unei expresii care are ca rezultat o valoare
int.Figura arata cum un element al unui vector este accesat folosind o valoare.Valoarea index este
indicata in interiorul simbolului vectorial.Numele variabilei vector si indexul asigura o referinta la un
element individual al vectorului.Valoarea index poate fi o expresie care are ca rezultat un int.
Nota: Crearea
unui
vector
cu
lungime
negativa
NegativeArraySizeException.Vectori cu lungime 0 sunt permisi.

va

genera

exceptia

Este important sa observati diferenta intre "al n-lea element din vector"si "elementul n din vector".
Deoarece indicii incep de la 0 "al n-lea element al vectorului"are indicele n-1,in timp ce "elementul n
din vector"are indicele n,si este defapt elementul n+1 al vectorului.Intr-un vector de 10 elemente,al
saptelea element al unui vector are un indice de 6,si elementul 8 are un indice de 8.Aceasta confuzie
este deseori sursa erorilor "off-by-one".
Exemplul indicat in Figura demonstreaza utilizarea expresiilor pentru a accesa un element al unui
vector.Principala metoda creeza un obiect vector de int-uri si un obiect vector de double-uri.Fiecarui
element din vectorul de tip int ii este asignata valoarea implicita 0 si fiecarui element al vectorului de
tip double ii este asignata valoarea implicita 0.0.O variabila int indexElement este creata ca o variabila
locala in blocul de cod al buclei for.Aceasta bucla ruleaza de cateva ori si afiseaza valoarea
elementului vectorului referentiat de valoarea variabilei indexElement.

7.3.1 Vectori de primitive


WAtunci cand se creeaza un obiect vector pentru a referentia primitive,valorile primitive sunt stocate
in obiectul vector si sunt initializate la valori implicite pentru tipul primitiv respectiv.Valorile unui
vector de primitive pot fi initializate in mule moduri diferite.Valorile pentru un vector pot fi atribuite
explicit ca parte a declaratiei unui vector.In exemplul indicat in Figura , valorile efective ale
primitivelor sunt furnizate in blocul de cod,care este identificat de acolade.Lungimea vectorului este
fixata la numarul de obiecte separate prin virgula care sunt descrise in interiorul blocului de
cod.Vectorul quantity va avea o lungime de 5.O eroare de compilare este generata daca tipul unei
expresii dintr-o initializare a unui vector nu este compatibila cu tipul componentelor
187

Capitol 7: Vectori
vectorului.Initializarea explicita a unui vector este permisa doar in timpul declararii unui vector.De
exemplu,urmatoarele nu sunt permise:
int[] xArray;
xArray = { 1,2,3,4,5};
Valorile pot fi de asemenea schimbate de la valoarea implicita la o alta valoare dupa ce obiectul vector
a fost creat.Codul din exemplul indicat in Figura foloseste trei bucle for pentru a stoca date.Prima
bucla for stocheaza date in fiecare element al obiectului vector de caractere.Acesta obtine input de la
utilizator folosind clasa deja exsistenta Console.Clasa Console a fost discutata in modulul 4.A doua
bucla for utilizeaza valoarea elementului index intr-o expresie pentru a calcula si stoca date in fiecare
element al vectorului de tip int.Aceasta tehnica este deseori utilizata pentru a stoca valori de
identificare intr-un vector.A treia bucla for utilizeaza rezultatul elementului cantitate inmultit cu
2.50.Aceasta tehnica este deseori utilizata pentru a crea valori paralele.O valoare cantitate corespunde
unei valori.Amandoua sunt stocate in acelasi elemente ale unor vector paraleli.Acest lucru inseamna ca
valoarea elementului 0 reprezinta o valoare cu insemnatate a cantitatii din elementul 0.Un exemplu al
acestei utilizari ar fi pretul si cantitatea unui produs dintr-un obiect care stocheaza o lista de preturi si
cantitati.
Bucla for creeaza o variabila i de tip int.Prima valoare a variabilei este 0.Valoarea este marita cand
++i este executat.Bucla este controlata comparand valoarea variabilei i cu valoarea variabilei length
pentru vector.
Cand se proceseaza vectori,utilizati mereu variabila length a unui vector pentru a asigura faptul ca nu
se incearca accesarea unui element peste marimea vectorului.Daca se referentiaza un element al unui
vector pentru care nu exista index,o eroare se va produce si programul se va termina.Acest tip de
eroare
nu
va
fi
sesizata
decat
in
momentul
rularii.Eroarea
se
numeste
IndexOutOfBoundsException.Capitolul 11 va discuta modul de administrare al acestui tip de eroare.
Orice tip de bucla poate fi folosita pentru a stoca date intr-un vector.Procesul stocarii valorilor intr-un
vector este de asemenea referit ca popularea vectorului.In acelasi cod exemplu din Figura , buclele
do si while sunt de asemenea folosite pentru a popula fiecare dintre elementele vectorului.Luati aminte
ca valoarea lui x este incrementata utilizand incrementare postfixa prin operatorul ++. Vlaoarea lui x
este folosita ca valoare index si este incrementata in pregatirea pentru urmatoarea repetitie a buclei.

7.3.2 Vectori de obiecte


La popularea unui vector pentru a referentia obiecte,cativa pasi in plus sunt necesari.In primul rand
obiectul vector si lungimea sa sunt determinate.La acest punct,fiecare element al vectorului este o
variabila de referinta cu valoarea null.Apoi fiecare obiect referentiat de vector trebuie sa fie creat,si
referinta sa trebuie stocata ca valoarea unui element din vector.

188

Capitol 7: Vectori
Codul exemplu din Figura pentru clasele Teacher demonstreaza acest proces.Clasa Teacher creeaza
variabila studentsInTheClass pentru a stoca referinta catre obiectul vector.Lungimea vectorului este
trei.Acest obiect vector va stoca referinte pentru trei obiecte Student.
Un obiect Student este apoi creat,si o referinta catre acest obiect este stocata in primul element al
vectorului.Acest lucru este repetat pentru restul obiectelor Student.Referinta catre aceste obiecte este
stocata in al doilea si al treilea element al vectorului.Pentru a accesa date despre un student
specific,metodele din clasa Student sunt accesatae utilizand elementul vectorului studentsInTheClass
care stocheaza referinta catre obiectul specific Student.Acest lucru este indicat in Figura .

7.3.3 Folosirea blocurilor de initializare


Datele din membrii si din clase pot fi initializate ca o parte a declararii clasei prin utilizarea metodei
constructor.Daca programatorul nu specifica o valoare initiala,valorile implicite sunt utilizate.
Exista unele lucruri care nu pot fi initializate printr-o singura instructiune.Daca un numar mare de
variabile trebuiesc initializate cu o valoare calculata care necesita o atribuire bazata pe testarea unei
conditii,un bloc de cod trebuie creat.
Pana acum singurul bloc de cod pe care l-a intalnit studentul a fost in definitiile metodelor.Limbajul
Java permite crearea blocurilor de cod fara nume,care sunt cunoscute si ca blocuri de initializare
nonstatica si blocuri de cod statice.Blocul de cod fara nume nu este o metoda si este executat inainte
de crearea unui obiect sau ca parte a procesului de creare a obiectului.Acesta este de asemenea
cunoscut sub numele de bloc de initializare non-statica.
Cele doua tipuri de blocuri de initializare sunt statica si non-statica.Un bloc de initializare statica este
folositor pentru initializarea vectorilor statici de obiecte sau primtive.Acesta poate initializa doar
variabile statice.De aceea,variabila de referentiere a obiectului vector trebuie sa fie declarata ca statica
pentru a utiliza blocuri de initializare statica.Acest bloc este executat o singura data cand clasa este
incarcata la rulare.Blocul static este definit utilizand cuvantul cheie static.Acest lucru este folositor in
special pentru initializarea unui vector de date statice.Datele statice dintr-o clasa sunt create si sunt
disponibile inaintea crearii unui obiect al clasei.Daca o clasa contine date statice intr-un vector si o
bucla este utilizata pentru a initializa aceste date,aceasta trebuie inclusa intr-un bloc static.Acest bloc
este executat si datele pe care le creeaza sunt disponibile inainte de crearea unui obiect din clasa
respectiva.
In Figura , numarul de teste completate de catre studenti in clasa JavaStudent sunt introduse prin
intermediul clasei Console.Punctele pentru fiecare test se bazeaza pe un numar maxim de puncte
pentru test.Obiectele JavaStudent stocheaza puncte pentru fiecare test separat.Obiectele JavaStudent
stocheaza de asemenea scorul testelor in procentaje.Pentru a calcula procentajul,un vector de scoruri
maxime trebuie sa fie disponibil pentru fiecare obiect JavaStudent.Punctajul maxim pentru fiecare test
este acealasi pentru toti studentii si acesta trebuie partajat de fiecare obiect JavaStudent.

189

Capitol 7: Vectori
Clasa JavaStudent poate fi definita ca in exemplu.Exista trei vectori statici declarati in aceasta
definitie.Vectorul testDate stocheaza date asupra datei fiecarei test.Vectorul testName referentiaza
obiecte String care stocheaza date ce reprezinta un titlu pentru fiecare test,si vectorul maxPoints
stocheaza maximum de puncte ce pot fi obtinute pentru fiecare test.
Un bloc non-static de initializare poate fi utilizat pentru a initializa date nonstatice si pentru a modifica
date statice.In cazul clasei JavaStudent,elementele vectorului testScore si vectorul de procentaje nu
trebuiesc initializate.Date primtive stocate in heap sunt automat initializate cu valori implicite.Vectorul
de String-uri testComments poate sau poate nu fi initializat.Codul exemplu din Figura ilustreaza
modul de utilizare al unui bloc de initializare nonstatica pentru initializarea vectorului
testComments.In acest exemplu,variabila statica numOfTests este utilizata pentru a seta lungimea
vectorului.Variabilele statice sunt create inainte de crearea unui obiect,numOftests este disponibil
pentru utilizare in acest bloc de cod.
Urmatoarea sectiune a modulului va demonstra modul de utilizare al clasei JavaStudent si impactul
blocurilor de initializare asupra obiectelor JavaStudent.

7.4.1 Accesarea elementelor unui vector


Pentru a accesa un element al unui vector,sintaxa necesita utilizarea variabilei vector si a unei valori
care reprezinta indexul elementului.Valoarea poate fi stocata intr-o variabila de tip int,byte sau
short,sau poate fi rezultatul unei expresii.Expresia trebuie sa aibe ca rezultat un intreg.Amintiti-va ca
utilizand cast-ul implicit,o expresie care utilizeaza un short sau un byte va avea ca rezultat tot un
intreg.
In codul exemplu din Figura , un element al unui vector este accesat direct.Codul exemplu pentru
clasa JavaStudent din FIgura demonstreaza accesarea elementelor unui vector direct si schimbarea
datelor dintr-un obiect utilizand date din clasa.
Un vector poate de asemenea folosit pentru a intializa un alt vector.In acest caz,amandoua variabilele
vector vor referentia acelasi obiect vector.Codul exemplu din Figura demonstreaza aceasta
initializare.Notati ca vectorul este accesat prin variabila int a unei bucle.
Vectorii au o lungime fixa.Pentru a crea grupuri de referinte care pot avea o marime variabila,explorati
clasele din biblioteca collections.
Incercarea accesarii elementelor inainte de inceperea sau dupa terminarea unui vector va rezulta in
generarea exceptiei ArrayIndexOutOfBounds.Ca o subclasa a IndexOutOfBoundsException,exceptia
ArrayIndexOutOfBounds este o exceptie ce se genereaza la rulare.
Clasa System,furnizeaza o metoda de copiere a vectorilor.Aceasta metoda permite copierea
elementelor unui vector intr-un vector nou.Acest lucru este indicat in Figura . Sintaxa pentru metoda
arraycopy este indicata in Figura . Aceasta este o metoda statica si poate fi accesata referentiind
190

Capitol 7: Vectori
numele clasei cum ar fi System.arraycopy();. Codul exemplu din Figura 6 ilustreaza utilizarea metodei
arraycopy.
O utilizare pentru meotda System.arraycopy este adaugarea si stergerea elementelor din mijlocul unui
vector,asa cum este aratat in Figura .

7.4.2 Trimiterea unui vector catre o metoda


Un element al unui vector poate fi trimis catre o metoda care cere o singura valoare.O metoda care
converteste un procentaj intr-o nota corespunzatoare este un exemplu.In exemplul aratat in Figura ,
metoda de notare cu litere face parte din clasa Teacher2.Aceasta metoda converteste procentajul intr-o
nota literala.Exista doua metode definite in acest exemplu.Una este letterGradeInt si alta este
letterGradePerc.Amandoua metodele accepta o singura valoare si returneaza un element de tip
char.Aceste doua metode pot fi accesate utilizand sintaxa indicata.O copie a valorii dintr-un vector
este pasata metodelor.
Clasa Teacher2 poate de asemenea include o metoda pentru calculul procentajului mediu al unui
student pe parcursul tuturor testelor sau procentajul mediu al tuturor testelor pentru toti studentii din
clasa.Aceasta este indicata in Figura . Pentru a efectua primul calcul,metodei ii este trimisa o copie a
referintei catre un obiect Student.Pentru a calcula procentajul mediu al tuturor studentilor la un test in
particular,metodei ii este trimisa o valoare pentru numarul testului si o referinta catre obiectul vector
JavaStudent care stocheaza referintele catre toti studentii.
Cateva principii de design sunt prezentate aici.Primul este faptul ca datele instantiate pentru obiectul
JavaStudent sunt private.Pentru a accesa un camp specific,o metoda get sau set trebuie sa fie
utilizata.Referintele vectorului sunt utilizate pentru a trimite mesaje catre metodele obiectelor.Clasa
Teacher2 este punctul de intrare pentru o aplicatie care utilizeaza date Teacher2 si JavaStudent.Clasa
Teacher2 defineste metodele ca statice.Acest lucru permite utilizarea clasei Teacher2 fara nici un
obiect Teacher2.In plus,metoda main este o metoda statica.Metodele statice acceseaza metodele statice
din aceasi clasa direct,dar au nevoie de o instanta a clasei pentru a accesa metode non-statice.De
exemplu,metodele averageStudentPerc() si averageClassPercentage() sunt delcarate ca statice in clasa
Teacher2 si pot fi accesate direct in metoda main a clasei Teacher2.
O modalitate de a construi un vector si de a-l trimite unei metode care asteapta un parametru vector
este de a initializa un vector anonim dupa cum urmeaza:
new int[] {3,6,8,1};

7.4.3 Vectori paraleli


In calsa JavaStudent,fiecare dintre vectori poate fi considerat ca un vector paralel.Acest lucru
inseamna ca o valoare dintr-un element are o corespondenta pentru valoarea aceluiasi element din alt
vector.
191

Capitol 7: Vectori
Iata doua exemple:

- testDate[0], testName[0] , maxPoints[0] stocheaza informatii despre primul test.


- testScore[0]si percentage[0] contin punctajele si procentajele unui student pentru primul test .
Relatia de paralelism dintre vectori poate fi folosita pentru a procesa sau manipula acesti vectori in
aceasi constructie de bucla,aceasi instructiune if,sau orice alta metoda sau instructiune.Codul exemplu
din Figura demonstreaza acest concept.

7.4.4 Cautarea si sortarea unui vector


Sortarea este procesul de aranjare a unei serii de obiecte intr-o ordine logica.Cand obiectele sunt
asezate intr-o ordine care incepe cu cea mai mica valoare si se termina cu cea mai mare valoare,ele
sunt sortate ascendent.Sortarea datelor de tip caracter poate fi influentata de tipul caracterelor
(Majuscule/Minuscule). Cand obiectele sun asezata intr-o ordine care incepe cu cea mai mare valoare
si se termina cu cea mai mica valoare,ele sunt sortate decendent.
Utilizati Figura

pentru a indentifica ordinea ascendenta si descendenta a numerelor si caracterelor.

In exemplele utilizate pana acum in acest modul,elementele vectorului au fost manipulate in secventa
in care au fost create.De exemplu,obiectul Student a fost afisat incepand cu primul student.Pentru a
afisa studentii in ordine alfabetica sau in ordinea scorurilor sau a procentajelor,vectorul trebuie mai
intai sa fie sortat in ordine ascendenta sau descendenta.
Exemplele de cod din Figurile si ilustreaza o tehnica de programare comun folosita numita
sortare prin interschimbare (bubble sort). Aceasta tehnica particulara se bazeaza pe posibilitatea
compararii unor perechi de valori,presupunand ca exista o ordine in care elementele pot fi
organizate.In aceasta tehnica,doua valori sunt comaparate.Daca valorile nu sunt in ordine,atunci ele
sunt interschimbate.Cele trei variabile x,y si z,care contin valori intregi,sunt afisate in ordine
ascendenta si apoi descendenta.O variabila temporara este necesara pentru a interschimba valorile din
x,y si z.
Sortarea a doua sau trei valori este destul de simpla.Sortarea unui numar mare de valori fara utilizarea
vectorilor poate fi o sarcina dificila.Tehnica simpla de interschimbare ar putea fi folosita de cateva ori
pentru a procesa un vector pana cand valorile sunt in ordinea necesara.Tehnica pentru efectuarea
acestei operatii se numeste sortare prin interschimbare (bubble sort). In aceasta tehnica,vectorul este
procesat pana cand cel mai mare sau cel mai mic numar este atribuit primului element.Fiecare
procesare a vectorului include comparatii ale perechilor de valori si interschimbarea lor daca este
necesar.
Codul exemplu din Figura demonstreaza o sortare prin interschimbare (bubble sort)folosind un
vector simplu de intergi.Vectorul referentiaza zece numere.Vectorul este procesat prin compararea a
doua numere unul cu celalat.Se porneste de la primele doua elemente ale vectorului,si apoi al doilea si
192

Capitol 7: Vectori
al treilea element,si asa mai departe.Valorile sunt interschimbate atunci cand este necesar.Vectorul
este procesat pana cand nu mai exista interchimbari de facut.Acest exemplu sorteaza vectorul in ordine
ascendenta,de la cel mai mic la cel mai mare.
Sortarea obiectelor nu este cu mult mai diferita de sortarea primitivelor.Obiectele sun in general
sortate in functe de valoarea unor date din obiect.De exemplu,daca un profesor vrea sa sorteze
studentii dintr-o clasa in functie de ID,vectorul JavaStudent ar fi procesat comparand ID-urile pentru
fiecare student.Singura diferenta ar fi ca variabila temp va fi de tipul JavaStudent si comparatia pentru
interschimbare utilizeaza metoda getId() pentru a compara ID-urile pentru fiecare student.

7.4.5 Refolosirea vectorilor


Variabila vector este separata de vectorul in sine.Este similar modului in care o variabila obisnuita
poate accesa diferite valori la diferite momente in timp.Variabilele vector sunt utilizate pentru a accesa
diferiti vectori la diferite momente din program.De exemplu,un profesor ar putea avea cateva cursuri
pentru care datele sunt stocate.Codul pentru metoda main al clasei TeacherExample din Figura
reutilizeaza variabila vector care este o referinta catre un obiect vector de tip referinte la obiecte
JavaStudent.
In acest exemplu,se presupune ca clasa TeacherExample salveaza vectorii JavaStudent intr-un
fisier.Nu este presupus ca un profesor trebuie sa creeze informatii despre studenti in mod
repetat.Modulul 13 va demonstra modul prin care se poat lua date despre obiecte din memorie si se pot
salva intr-un fisier.Acest lucru asigura persistenta datelor dupa terminarea programului.

7.5.1 Initializarea obiectelor de tip vector multidimensional


Limbajul Java suporta vectori multidimensionali.De exemplu,un profesor are un numar de studenti
care participa la un curs si fiecare primeste alt scor la un test.Obiectul Teacher poate stoca notele unui
test intr-un vector bidimensional.Un vector de studenti poate stoca referintele pentru adresele
vectorilor de teste,si fiecare vector de teste stocheaza scorul pentru fiecare student.Acest lucru este
indicat in Figurile si .
Un vector multidimensional este de asemenea cunoscut ca un vector de vectori.Sintaxa pentru un
vector bidimensional contine doua seturi de paranteze patrate asa cum este indicat in Figura .
Primul set de paranteze mentine referintele index ale primului element al vectorului.Al doilea set de
paranteze mentine referintele index catre elementele celei de-a doua dimensiune.
Tabelul aratat in Figura prezinta date pentru trei studenti.Fiecare obiect ar fi putut fi stocat ca un
element separat intr-un vector.Acest lucru ar face dificila identificarea scorului testului care este
asociat cu fiecare student.Un vector bidimensional ar permite referentierea numarului testului ca o
dimensiune si a studentului ca o alta dimensiune.Fiecare rezultat ar putea fi identificat in mod unic ca
o asociere intre student si test bazandu-ne pe valorile index ale celor doua dimensiuni.Acest lucru este
193

Capitol 7: Vectori
aratat in Figura . De exemplu,o referinta [2][3]ar identifica al patrulea rezultat pentru a treilea
student,sau Polly Pockets,Test4,scor 83.
Crearea si initializarea vectorilor multidimensionali nencesita crearea fiecarei dimensiuni exterioare
inainte de initializarea valorilor pentru urmatoarea dimensiune interioara.Codul exemplu din Figura
ilustreaza acest proces de initializare.Unele obiecte JavaStudent ar putea apoi fi create si relationate cu
vectorul multidimensional de scor.
Vectorii multidimensionali pot avea vectori de diferite lungimi in fiecare dimensiune.Exemplul din
Figura arata ca prima dimensiune a vectorului poate avea lungimea de trei si ca fiecare dintre
dimensiunile ulterioare ale vectorilor pot avea diferite dimensiuni.Cand se proceseaza vectori de
lungimi diferite,utilizati lungimea vectorului pentru a-l procesa.Codul exemplu ilustreaza un alt mod
de a initializa vectori de dimensiuni inegale.
Deoarece fiecare element din cel mai exterior vector al unui vector multidimensional este o referinta la
un obiect,nu este necesar ca vectorii bidimensionali sa fie rectangulari,sau cei tridimensionali sa fie
cubici.Fiecare vector interior poate avea marimea proprie.

7.5.2 Parcurgerea unui vector multidimensional


Pentru a referentia un singur element al unui vector multidimensional,referentiati valoarea index
pentru fiecare dimensiune.De exemplu,pentru a obtine informatii pentru scorul lui Mary Post la un
test,scorul ar putea fi referentiat in maniera [0][3]. Acest lucru este aratat in Figura .
Pentru a accesa mai mult decat un element al unui vector multidimensional,bucle imbricate for pot fi
utilizate.Fiecare bucla proceseaza elementele unei dimensiuni.In codul exemplu aratat in Figura ,
prima bucla proceseaza un element al primei dimensiuni,care este apoi referentiat la un obiect
JavaStudent in dimensiunea JavaStudent.Bucla interioara proceseaza toate scorurile pentru acel obiect
JavaStudent.Cand bucla interioara se termina,bucla exterioara proceseaza urmatorul element al
dimensiunii JavaStudent.
Figura

arata un exemplu de cod pentru o clasa si un program de test pentru jocul de x si 0.

Rezumat
Acest modul a explicat conceptul de vectori.Vectorii sunt obiecte speciale Java,deja existente,care
furnizeaza un mod de administrare a unui grup de obiecte de acelasi tip.Vectorii pot fi unidimensionali
si pot stoca doar un tip de date sau pot fi multidimensionali si pot stoca mai multe tipuri de informatii
pentru fiecare obiect.
Este important ca studentii sa inteleaga cum este numerotat fiecare element si cum sa
acceseze,proceseze si sa sorteze elementele unui vector.Primul element al unui vector este indexat la
valoarea 0 si ultimul element este indexat la valoarea lungimea vectorului minus unu.Elementele
vectorului sunt deseori accesate sau procesate utilizand constructii de bucla.Bucle care proceseaza
194

Capitol 7: Vectori
vectori trebuie sa asigure ca blocul de cod nu incearca sa acceseze un valoare index mai mare decat
lungime vectorului sau mai mica decat 0.
Daca un vector este accesat dupa ultimul element sau cu un index negativ,JVM va opri programul si
va
produce
un
mesaj
de
eroare
IndexOutOfBoundsExeception
sau
NegativeArraySizeException.Vectorii pot fi sortati utilizand o metodologie de interschimbare sau
bubble sort.

195

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