Documente Academic
Documente Profesional
Documente Cultură
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.
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:
- 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.
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.
- 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.
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.
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.
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.
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.
12
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.
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? 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
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
Avantaje Java:
19
20
21
22
23
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.
- 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.
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
28
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
- 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.
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.
31
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().
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 (+).
- Cuvinte cheie Java sau nume de clase scrise gresit - Referinte inconsistente la identificatori - Acolade deschise ( {} ), paranteze patrate ( [] ), sau paranteze - Lipsa operatorului punct ( . )
34
- 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
- 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.
- 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:
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
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 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:
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
42
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 Obiectele unui calculator fac parte din trei categorii,dupa cum este ilustrat in Figura
- 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
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
46
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.
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:
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.
- 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
- 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
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.
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.
55
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
- 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.
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
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
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.
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
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
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
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
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 .
{ }
Cuvantul cheie public permite altor clase sa foloseasca aceasta clasa. Clasele publice trebuie sa fie definite in fisiere separate.
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.
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 .
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
- 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
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.
73
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
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:
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
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
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
83
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
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
86
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
- 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
88
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.
- 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
- 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
- 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.
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
-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.
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.
94
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
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.
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
100
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 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:
- Schelet-soparla
103
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 .
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
- 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.
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.
-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:
-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
Folositi activitatea din Figura pentru a identifica sintaxa pentru declaratiile de metode din clasa Student.Retineti sa includeti metoda principala in analiza.
110
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
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.
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.
114
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>, ...)
{
116
// 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
- 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.
- 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.
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 .
- 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.
-" 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
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.
-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
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.
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.
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.
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.
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.
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 .
- 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.
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.
Capitol 4: Operatorii si structurile de control ale limbajului Java Folositi urmatoarele instructiuni pentru a controla instructiunile de bucla:
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 .
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 .
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 .
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
- 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
- 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.
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.
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:
- 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 .
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.
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.
-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
- 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.
- 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.
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.
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.
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.
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.
- 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:
-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").
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.
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.
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.
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.
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.
154
- 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.
Exemplul de cod pentru clasa Employee din Figura care se apeleaza reciproc folosind variabila this.
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.
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.
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.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 - Unitate de compilare - Directorul curent de lucru - Directorul implicit - Clase standard
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
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.
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.
- 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().
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 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.
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.
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.
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.
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 .
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.
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 .
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.
-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
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.
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 .
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.
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.
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.
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.
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.
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 .
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.
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 .
- 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.
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.
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.
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