Vous êtes sur la page 1sur 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. descrie sintaxa

101

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. arata utilizarea constructorilor supraincarcati

Exemplul de cod pentru clasa Employee din Figura care se apeleaza reciproc folosind variabila this.

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 Figura arata cum se poate obtine data de astazi. 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. 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 identifica directorul pentru

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