Programare Java Curs – 3
PROGRAMARE ORIENTATA OBIECT – Object Oriented Programming ( OOP ) Programarea orientata obiect este un concept remarcabil – chiar daca in realitate nu este foarte “modern” , el aparand ideatic inca din anii ‘70 ! Ideea centrala este destul de simpla si clara : organizati programele intr-un mod care sa oglindeasca modul cum sunt organizate obiectele din lumea reala . In mod normal prezentarea urmatoare ar trebui privita doar ca o recapitulare a principiilor OOP studiate deja in cadrul limbajului C++ . Un program este privit in general ca o lista de instructiuni care ii spun calculatorului ce are de facut . Un program este considerat de OOP drept un set de obiecte care lucreaza impreuna cu scopul de a indeplini o sarcina . Ca exemplu sa luam un model practic extrem de intalnit in aceste zile - construirea unui PC din diferite componente separate ( placa de baa , placa video , procesor , etc. ) . Intern , fiecare dintre aceste componente poate fi extrem de complicata si complexa dar cel ce asambleaza intregul nu are nevoie sa stie exact detaliile de functionare interna a fiecarei componente ci doar cateva date foarte concrete : -
se vor potrivi aceste componente la nivel fizic ? vor putea lucra impreuna din punct de vedere functional aceste componente ?
Odata cunoscute interactiunile dintre componente realizarea sistemului final va fi destul de simpla . Programarea orientata obiect se muleaza perfect pe exemplul anterior ; programul nostru fiunal se compune din mai multe componente – obiecte care trebuie sa interactioneze cu succes . Un obiect este un element independent al unui program , care reprezinta un set de caracteristici corelate si este proiectat pentru a realiza anumite sarcini . Obiectele mai sunt numite si instante . OBIECTE SI CLASE O clasa este un model ( sablon ) folosit pentru a crea mai multe obiecte cu aceeasi caracteristici . Clasele inglobeaza toate caracteristicile unui anumit set de obiecte . Atunci cand scriem un program intr-un limbaj OOP nu definim obiecte ci classe de obiecte . Clasele sunt folosite pentru a crea obiecte cu care vom lucra apoi direct in program .
Cand scriem un program in Java proiectam si construim un set de clase . Atunci cand programul ruleaza din aceste clase sunt create obiecte si apoi acestea sunt folosite . Sarcina programatorului Java este de a crea seturile corecte de clase pentru ca programul sa se comporte corespunzator . In practica nici macar nu trebuie pornit de la zero cu constructia claselor . Fiecare versiune de Java contine un grup de clase care implementeaza caracteristicile de baza de care au in general nevoie programatorii . Aceste grupe de clase se numesc biblioteci . O biblioteca de clase este un grup de clase proiectate pentru a fi folosite impreuna cu alte programe . Biblioteca de clase Java standard contine mai multe zeci de clase ( depinzand exact de versiunea limbajului ) . Biblioteca standard Java se ocupa de mai multe sarcini uzuale , cum ar fi functii matematice , lucru cu text , imagini , sunet interactiune cu utilizatorul si lucru in retea . In multe cazuri bibliotecile Java sunt de ajuns pentru un program de nivel scazut . In acest caz programatorul are ca sarcina doar crearea unei singure clase , folosite pentru a crea obiecte pronind de la clasele Java standard si pentru a administra interactiunile dintre acestea . Odata cu avansarea in programarea Java se poate crea un set complet nou de clase care sa aiba definite anumite interactiuni intre ele ; acestea pot fi folosite pentru a se alcatui eventual o biblioteca proprie de clase care poate fi reutilizata mai tarziu in alte programe . Aceasta capacitate de reutilizare este unul dintre avantajele majore ale programarii orientate obiect . ATRIBUTE SI COMPORTAMENT Atributele reprezinta parametrii individuali care diferentiaza o clasa de obiecte de o alta si care determina modul de prezentare , starea si alte calitati ale clasei . Intr-o clasa atributele sunt definite de variabile . Fiecare obiect poate avea valori diferite ale variabilelor sale ; acestea se numesc variabile de instanta . O vaziabila de instanta este un element de informatie care defineste atributul unui anumit obiect . Clasa obiectului defineste ce fel de atribut este si fiecare instanta isi pastreaza propria sa valoare pentru acel atribut . Variabilele de instanta mai sunt denumite si variabilele obiectului . Fiecarui atribut al unei clase ii corespunde o singura variabila ; putem schimba atributul unui obiect modificand aceasta variabila . Variabilele de instanta pot lua o valoare atunci cand se creeaza un obiect ce ramane neschimbat pe toata durata lui de existenta sau pot lua diferite valori pe masura ce obiectul este folosit . Un alt atribut este folosit pentru descrierea intregii clase de obiecte , nu numai a unui singur obiect al clasei . Aceste atribute sunt continute in variabile de clasa .
O variabila de clasa este un element de informatie care defineste atributul unei intregi clase . Variabila se aplica insasi clasei si tuturor instantelor ei , deci este stocata o singura valoare , indiferent cate obiecte ale clasei au fost create . COMPORTAMENTUL UNEI CLASE DE OBIECTE Comportamentul este modul in care clasele de obiecte pot face ceva cu ele insele sau cu alte obiecte . Comportamentul unei clase determina ce obiecte ale clasei isi modifica atributele , precum si ce fac ele atunci cand alte obiecte le cer sa faca ceva . Comportamentul unei clase de obiecte este determinat cu ajutorul metodelor . Metodele sunt grupuri de instructiuni dintr-o clasa de obiecte , care actioneaza asupra acesteia sau asupra altor clase sau obiecte . Ele sunt folosite pentru a realiza diferite sarcini , in acelasi fel in care in alte limbaje de programare se folosesc functiile . Obiectele comunica unele cu altele folosind metodele . O clasa sau un obiect poate apela metode dintr-o alta clasa sau obiect pentru mai multe motive : -
pentru a raporta o modificare unui alt obiect pentru a comunica altui obiect sa modifice ceva in legatura cu el pentru a cere unui obiect sa faca ceva
Asa cum exista variabile de instanta si de clasa , exista si metode de instanta si de clasa . Metodele de instanta , numite si simplu metode , actioneaza asupra unui obiect al clasei . Daca o metoda efectueaza schimbari doar asupra unui obiect individual ea trebuie sa fie o metoda de instanta . Metodele de clasa actioneaza asupra clasei insasi . CREAREA UNEI CLASE Primul pas este deschiderea editorului de text pe care il folosim pentru a crea programe java ( fisiere sursa cu extensia .java ) . Cea mai simpla declaratie de clasa este : Class ClasaMea {} In continuare sa urmarim exemplul crearii unei clase Jabberwock. class Jabberwock { String culoare; String sex; boolean flamand; } Au fost definite mai sus trei variabile de instanta . Prin adaugarea de metode clasei I se poate defini un comportament . Aceste metode sunt lucruri pe care le-ar putea face un Jabberwock – in exemplul nostru vor apare doar doua metode : una pentr a hrani animalul si alta pentru a-I verifica atributele . void hranescJabberwock() {
if (flamand==true) { System.out.println(“Bun – foame!”); Flamand=false; } else System.out.println(“Nu murci – am mancat!”); } In continuare prezentam listingul celei de a doua metode – pentru verificarea atributelor : void afisezAtribute() { System.out.println(“Acesta e un jabberwock “+sex+” “+culoare); if (flamand==true) System.out.printl(“Jabberwock-ul este flamand”); else System.out.println(“Jabberwock-ul e satul”); } In acest moment avem o clasa Jabberwock cu variabile si metode de instanta ce pot fi folosite pentru a afisa si modifica variabilele . Pentru a compila programul schimbam directorul curent in directorul care contine fisierul nostru sursa si folosim comanda : javac Jabberwock.java In cazul in care incercam sa rulam fisierul ( cu comanda : java Jabberwock ) vom obtine o eroare . Aceasta apare deoarece interpretorul Java presupune ca programul pe care incercam sa il executam din linia de comanda este o aplicatie . Atunci cand se executa o aplicatie punctul ei de lansare este metoda main() . Deoarece clasa noastra nu poseda o metoda main() avem probleme . Exista doua metode de a folosi clasa noastra : 1. Cream , separat , un applet sau o aplicatie java care sa foloseasca aceasta clasa 2. adaugam metoda main() in listingul nostru Pentru a adauga metoda main() se introduc urmatoarele : public static void main(String argumente[]){ … } Mai jos avem intregul listing al aplicatiei noastre : class Jabberwock { String culoare; String sex; boolean flamand; void hranescJabberwock() { if (flamand==true) { System.out.println("Bun - vrea mancare"); flamand=false; }
else System.out.println("Nu multumesc - am mancat deja"); } void afisezAtribute () { System.out.println("Acesta e un jabber " + sex + " " + culoare + " ."); if (flamand==true) System.out.println("Jabber este flamand"); else System.out.println("Jabber este satul"); } public static void main (String argumente[] ) { Jabberwock j=new Jabberwock(); j.culoare="portocaliu"; j.sex="mascul"; j.flamand=true; System.out.println("Apelez afisezAtribute ..."); j.afisezAtribute(); System.out.println("___"); System.out.println("Hranesc Jabber-ul ..."); j.hranescJabberwock(); System.out.println("___"); System.out.println("Apelez afisezAtribute ..."); j.afisezAtribute(); System.out.println("---"); System.out.println("Hranesc Jabber-ul ... "); j.hranescJabberwock(); } } ORGANIZAREA CLASELOR SI COMPORTAMENTUL ACESTORA MOSTENIREA Mostenirea reprezinta unul dintre cele mai importante concepte ale programarii OOP , avand un efect direct asupra modului de proiectare si scriere a claselor noastre Java . Mostenirea este un mecanism care permite unei clase sa mosteneasca comportamentul si stributele unei alte clase . Prin mostenire , o clasa dobandeste imediat tot comportamentul unei clase existente . Din acest motiv , noua clasa poate fi creata prin simpla specificare a diferentelor fata de clasa existenta . Prin mostenire toate clasele sunt aranjate intr-o ierarhie stricta – cele pe care le cream si cele provenite din biblioteca Java sau din alte biblioteci . O clasa care mosteneste alta clasa este denumita subclasa iar clasa care isi ofera mostenirea se numeste superclasa .
O clasa poate avea o singura superclasa , insa poate avea un numar nelimitat de subclase . Subclasele mostenesc toate atributele si comportamentul superclaselor lor . In varful ierarhiei de clase Java se afla clasa Object – toate clasele mostenesc aceasta unica superclasa . Object reprezinta cea mai generica clasa din ierarhie , care defineste comportamentul si atributele mostenite de toate clasele din biblioteca Java . Fiecare clasa aflata mai jos in ierarhie devine din ce in ce mai adaptata unui scop precis . O ierarhie de clase defineste conceptele abstracte la varful ierarhiei ; aceste concepte devin din ce in ce mai concrete odata cu coborarea spre subclase . In mod normal , cand cream o noua clasa Java dorim ca ea sa prezinte toate caracteristicile unei clase existente , cu unele modificari ; de exemplu putem dori o versiune a butonului CommandButton care sa produca un zgomot la folosirea sa . Pentru a mosteni toate caracteristicile clasei CommandButton fara effort vom defini noua noastra clasa ca o subclasa a clasei CommandButton . Clasa noastra va mosteni automat comportamentul si atributele superclasei . Tot ceea ce trebuie sa facem este sa introducem diferenta fata de superclasa . Subclasarea reprezinta crearea unei noi clase , care mosteneste o clasa existenta . Singurul lucru care trebuie facut in subclasa este definirea diferentelor in comportament si atribute fata de superclasa . Cand clasa noastra defineste un comportament complet nou si nu este o subclasa atunci ea mosteneste direct clasa Object . Acest lucru ii permite acesteia sa se integreze corect in ierarhia claselor Java ; in practica , daca definim o clasa care nu specifica o superclasa atunci Java presupune automat ca noua clasa mosteneste direct clasa Object Atunci cand cream un nou obiect Java pastreaza urma fiecarei variabile definite pentru acel obiect si a fiecarei variabile definite pentru fiecare clasa a obiectului . In acest fel , toate clasele se combina pentru a forma un model al obiectului curent , iar fiecare obiect isi completeaza informatiile corespunzatoare acestei situatii . Metodele se comporta in acelasi fel : noile obiecte au acces la toate metodele clasei si superclaselor de care apartin . Acest lucru este determinat dinamic , atunci cand o metoda este folosita intr-un program aflat in executie . Daca apelam o metoda a unui anumit obiect , interpretorul Java verifica mai intai clasa obiectului , pentru a gasi acea metoda . Daca metoda nu este gasita interpretorul o cauta in superclasa clasei si asa mai departe pana la gasirea definitiei metodei . Problema se complica atunci cand o subclasa defineste o metoda cu acelasi nume , tip de rezultat si argumente care sunt definite si intr-o superclasa . In acest caz se foloseste definitia metodei care este gasita prima ( incepand din partea de jos a ierarhiei si mergand in sus ) . Atfel intr-o subclasa putem crea o metoda cu acelasi nume , tip de rezultat si argumente ca ale metodei din superclasa ; aceasta procedura se numeste anulare prin suprascriere sau simplu suprascriere . MOSTENIREA SIMPLA SI MULTIPLA
Forma de mostenire folosita in Java este denumita mostenire simpla deoarece fiecare clasa Java poate avea o singura superclasa . In alte limbaje de programare – si in C++ - clasele pot avea mai multe superclase , mostenind variabile si metode combinate din toate aceste superclase . Aceasta forma de mostenire este denumita mostenire multipla si ofera mijloace de creare a unor clase care cuprind aproape orice comportament imaginabil . Totusi , acest lucru complica mult definitia clasei si a codului necesar pentru producerea acesteia . Java simplifica acest concept permitand doar mostenirea simpla . INTERFETE Mostenirea simpla face ca relatiile intre clase si comportamentul pe care aceste clase il implementeaza sa devina usor de inteles si de proiectat . Totusi ea poate fi restrictiva – mai ales atunci cand avem un comportament similar care trebuie duplicat pe diferite ramuri ale ierarhiei de clase . Java rezolva aceasta problema a comportamentului partajat prin folosirea interfetelor . O interfata este o colectie de metode care indica faptul ca o clasa are un anumit comportament suplimentar fata de ceea ce mosteneste de la superclasele sale . Tehnic vorbind , o interfata Java nu contine nimic altceva decat definitii de metode abstracte si constante – fara variabile de instanta sau implementari de metode ( cuvantul cheie folosit pentru a semnala folosirea unei interfete este implements ) . PACHETE Pachetele in Java reprezinta o modalitate de a grupa clasele si interfetele inrudite . Pachetele permit grupurilor de clase sa fie disponibile doar daca este nevoie de ele , eliminand potentialele conflicte intre numele claselor din diferite grupuri de clase . Bibliotecile de clase Java sunt continute intr-un pachet denumit java . Clasele din pachetul Java sunt disponibile garantat in orice implementare Java si sunt singurele disponibile in diferite implementari . Pachetul Java contine pachete mai mici care definesc seturi specifice ale caracteristicilor limbajului Java , cum ar fi caracteristicile standard , manipularea fisierelor , multimedia , etc . Clasele din alte pachete , ca sun sau netscape , pot fi disponibile doar in anumite implementari . In mod prestabilit clasele noastre Java au acces doar la clasele din java.lang ( caracteristicile de baza ale limbajului ) . Pentru a folosi clasele din alte pachete trebuie sa ne referim explicit la numele pachetului sau sa importam clasele in fisierul nostru sursa . Pentru a ne referi la o clasa din cadrul unui pachet trebuie sa introducem toate pachetele care contin clasa , urmate de numele clasei , elementele fiind separate prin puncte . De exemplu sa luam clasa Color . Ea este continuta in pachetul awt , care la randul lui este continut in pachetul java . Pentru a referi clasa Color in program trebuie folosita notatia java.awt.Color .
CREAREA UNEI SUBCLASE Cea mai uzuala folosire a subclasarii este la crearea de applet-uri . Crearea appleturilor este diferita de crearea aplicatiilor ; applet-urile Java ruleaza ca parte a unei pagini web , deci au reguli specifice privind comportamentul lor . Din cauza acestor reguli speciale aplicate applet-urilor , crearea unui applet simplu este mai complicata decat crearea unei aplicatii simple . Toate applet-urile reprezinta subclase ale clasei Applet ( care face parte din pachetul java.applet ) . Prin crearea unei subclase a clsei Applet vom mosteni automat comportamentul si atributele care permit unui program Java sa ruleze ca parte a unei pagini web . In continuare vom prezenta un exemplu simplu de applet Java . Mai intai vom construi definitia clasei : public class Palindrom extends java.applet.Applet { …. } Aceste instructiuni definesc o clasa Palindrom ; singurul lucru nou aparut este textul extends java.applet.Applet . Clauza extends reprezinta modul prin care se declara o clasa ca fiind o subclasa a alteia . Clasa Palindrom este o subclasa a clasei Applet , care face parte din pachetul java.applet. Pentru a indica in program faptul ca intre cele doua clase exista o relatie se foloseste clauza extends . Cuvantul cheie public indica faptul ca clasa noastra este accesibila altor clase care ar putea avea nevoie sa o foloseasca . In mod normal , singurul motiv pentru care am avea nevoie sa definim o clasa drept publica este atunci cand dorim ca ea sa fie accesata de catre alte clase din programul nostru . Totusi , in cazul applet-urilor trebuie sa folosim totdeauna declaratia public . Sa adaugam acum o noua instructiune in program : Font f=new Font(“TimesRoman”,Font.BOLD,36); Aceasta instructiune realizeaza doua lucruri : -
se creaza un obiect de tip Font , numit f . Font , componenta a pachetului java.awt , este folosit pentru a reprezenta un font pe ecran . Clasa este folosita pentru a afisa un font si un stil diferite de cele folosite implicit de un applet . obiectului Font I se atribuie o valoare de font de 36 de puncte , stil TimesRoman , cu litere aldine . Instructiunea new creaza un nou obiect de tip Font avand valorile specificate in paranteze si care este atribuit variabilei f .
Prin crearea unei variabile de instanta care sa-l contina , am facut obiectul Font disponibil tuturor metodelor din clasa noastra . Urmatorul pas in proiectul nostru este de a crea o metoda care sa-l foloseasca . Atunci cand scriem applet-uri , exista mai multe metode definite in superclasa Applet , care , de obicei , sunt anulate prin suprascriere . Printre acestea exista metode care configureaza applet-ul inainte de a fi lansat in executie , care lanseaza applet-ul , care raspund la evenimentele mouse-ului sau care elibereaza memoria cand applet-ul isi inceteaza executia . Una dintre aceste metode este paint() , care se ocupa de orice se intampla cand appletul este afisat pe pagina web . Metoda paint() mostenita de clasa Palindrom nu face nimic – este o metoda goala . Prin suprascrierea metodei paint() vom indica ce anume dorim sa fie desenat in fereastra applet-ului , ori de cate ori este nevoie sa se afiseze ceva , atunci cand programul ruleaza . Sa adaugam la clasa noastra urmatoarele instructiuni : public void paint(Graphics ecran) { ecran.setFont(f); ecran.setColor(Color.red); ecran.drawString(“Go hang a salami , I’m a lasagna hog”,5,40); } Metoda paint() este declarata public , ca si applet-ul ; acest lucru apare deoarece metoda pe care o suprascrie este si ea publica . O metoda publica apartinand unei superclase nu poate fi suprascrisa decat de o metoda publica , altfel apar erori la compilare . Metoda paint() preia un singur argument : o instanta a clasei Graphics , denumita ecran . Clasa Graphics se ocupa cu reprezentarea fonturilor , culorilor si desenarea liniilor si altor forme . In metoda paint() se realizeaza trei lucruri : -
am indicat obiectului Graphics faptul ca fontul pe care vrem sa-l folosim este cel continut in variabila de instanta f am indicat obiectului Graphics faptul ca culoarea pe care dorim sa o folosim pentru text si alte operatii de desenare este o instanta a clasei Color pentru culoarea rosu ( red ) . in final am scris pe ecran un text la coordonatele x,y egale cu 5 si 40 .
La acest moment applet-ul nostru arata astfel : public class Palindrom extends java.applet.Applet { Font f=new Font("TimesRoman",Font.BOLD,36); public void paint(Graphics monitor) { monitor.setFont(f); monitor.setColor(Color.red); monitor.drawString("Go hang a salami , I'm a lasagna hog",5,40); }
} In cazul in care incercam sa compilam acest fisier sursa vom obtine o serie de erori de genul : “Class not found” Aceste erori apar deoarece clasele Graphics , Font si Color apartin pachetului java.awt , care nu este disponibil implicit . Am referit clasa Applet din prima linie a sursei prin numele sau complet – incluzand si numele pachetului din care face parte . In restul programului am referit insa celelalte clase fara a folosi numele pachetului din care acestea fac parte . Exista doua metode pentru a rezolva problema : -
referim toate clasele externe prin numele lor complet , cum ar fi java.awt.Graphics folosim instructiunea import la inceputul programului pentru a face disponibile unul sau mai multe pachete si clase .
Pentru o scriere mai usoara si mai rapida a codului sursa se foloseste de obicei a doua varianta , fapt tradus in programul nostru prin inserarea liniilor : import java.awt.Graphics; import java.awt.Color; import java.awt.Font; Pentru o si mai mare usurinta putem folosi simbolul “*” in locul unui anumit nume de clasa . Putem astfel folosi instructiunea : import java.awt.*; Deoarece fisierul sursa contine o clasa publica , Palindrom , numele fisierului trebuie sa fie identic cu numele clasei publice – cu folosirea corecta a majusculelor si minusculelor . Pentru a putea vedea ce am realizat trebuie sa cream o pagina web care sa foloseasca applet-ul nostru . Vom crea o pagina web cu urmatorul continut :
-
atributul CODE indica numele clasei care contine applet-ul atributele WIDTH si HEIGHT determina cat de mare va fi fereastra appletului in cadrul paginii web , exprimat in pixeli .
In lipsa unui browser putem folosi pentru a vizualiza pagina noastra utilitarul appletviewer din pachetul JDK , cu sintaxa : appletviewer Palindrom.html
Acest utilitar , spre deosebire de un browser , va afisa doar applet-urile incluse in pagina web , neafisand nimic altceva continut eventual in pagina . OBIECTE CREAREA DE NOI OBIECTE Atunci cand scriem un program Java de fapt definim un set de clase ; clasele sunt modele dupa care se genereaza obiecte . In cele mai multe situatii vom folosi clasele pentru a crea instante si vom lucra cu aceste instante . In cursurile anterioare am intalnit o instanta a clasei String creata prin folosirea unui literal sir ( o serie de carctere incadrate intre ghilimele ) . Celelalte clase Java nu au aceasta posibilitate de creare a unui nou obiect . Crearea de noi instante ale acestora se face explicit cu operatorul new . Pentru a crea un nou obiect folosim operatorul new impreuna cu numele clasei dupa modelul careia dorim sa cream o instanta , urmata de paranteze : String numeEchipa=new String(); Jabberwock j=new Jabberwock(); Parantezele sunt foarte importante ; in cazul in care acestea sunt goale se creaza cel mai simplu obiect – in cazul in care exista argumente intre ele acestea determina valorile initiale ale variabilelor de instanta sau ale altor calitati initiale ale obiectului respectiv : Point pt=new Point(0,0); Numarul si tipul argumentelor pe care le folosim intre paranteze impreuna cu operatorul new sunt definite de clasa folosind o metoda speciala denumita constructor . Daca incercam sa cream o noua instanta a clasei folosind un numar gresit de argumente sau un tip eronat al acestora vom obtine erori la compilarea programului . La folosirea operatorului new se intampla mai multe lucruri : se creaza o noua instanta a clasei date , se aloca memorie pentru aceasta si se apeleaza o metoda speciala a clasei . Aceasta metoda speciala se numeste constructor . Constructorii reprezinta metode speciale pentru crearea si initializarea noilor instante ale claselor . Constructorii initializeaza noul obiect si variabilele sale , creaza orice alte obiecte de care are nevoie obiectul creat si realizeaza orice alte operatii de care obiectul are nevoie la initializarea sa . Intr-o clasa pot exista mai multe definitii de constructori , fiecare avand un numar diferit de argumente sau tipuri . Atunci cand folosim operatorul new putem specifica diferite argumente in lista de argumente si va fi apelat constructorul corespunzator pentru acele argumente . La crearea unei clase putem defini oricati constructori avem nevoie pentru implementarea comportamentului clasei .
GESTIONAREA MEMORIEI Gestionarea memoriei in Java se face dinamic si automat . Atunci cand cream un obiect nou Java aloca automat o zona de memorie de dimensiunea corespunzatoare obiectului . Nu trebuie sa alocam explicit memorie pentru obiecte . Deoarece gestionarea memoriei se face automat nu este nevoie sa dezalocam memoria ocupata de obiect atunci cand am terminat de lucrat cu acesta . Atunci cand am terminat lucrul cu obiectul acesta nu mai poseda nici o referinta activa catre el ( nu va mai fi atribuit nici unei variabile pe care o folosim sau nu va mai fi stocat in vreun tablou ) . Java poseda un “garbage collector” care cauta obiectele nefolosite si recupereaza memoria ocupata de acestea . Nu trebuie sa eliberam explicit acea zona de memorie . ACCESAREA SI STABILIREA VARIABILELOR DE CLASA SI DE INSTANTA Variabilele de clasa si de instanta se comporta in acelasi fel ca si variabilele locale . Trebuie doar sa ne referim la ele intr-o modalitate usor diferita . OBTINEREA VALORILOR Pentru a obtine valoarea unei variabile de instanta vom folosi notatia cu punct . In aceasta notatie variabila de instanta sau de clasa este formata din doua parti : obiectul , in partea stanga a punctului si variabila , in partea dreapta . De exemplu , daca avem un obiect atribuit variabilei clientulMeu si acel obiect poseda o variabila denumita totalFactura atunci ne vom referi la aceasta variabila astfel : clientulMeu.totalFactura; Aceasta forma de accesare a variabilelor este o expresie ( deoarece intoarce o valoare ) in care de ambele parti ale punctului se afla tot expresii . Acest lucru inseamna ca putem insera mai multe variabile de instanta . Daca variabila totalFactura refera ea insasi un obiect care poseda propria variabila de instanta numita rezervat , putem sa ne referim la aceasta astfel : clientulMeu.totalFactura.rezervat; Expresiile cu punct sunt evaluate de la stanga spre dreapta , asa incat se va incepe cu variabila din clientulMeu , totalFactura , care refera un alt obiect cu variabila rezervat . In final vom obtine valoarea variabilei rezervat . MODIFICAREA VALORILOR
Atribuirea unei valori acelei variabile se face pur si simplu prin utilizarea operatorului de atribuire : clientulMeu.totalFactura.rezervat=true; In continuare avem un exemplu simplu de accesare a variabilelor prin notatia cu punct : import java.awt.Point; class DefinirePuncte { public static void main(String argumente[]) { Point pozitie=new Point(4,13); System.out.println(“Pozitia de inceput:”); System.out.println(“X egal “+pozitie.x); System.out.println(“Y egal “+pozitie.y); System.out.println(“\nSe muta in (7,6)”); pozitie.x=7; pozitie.y=6; System.out.println(“Pozitia finala:”); System.out.println(“X egal “+pozitie.x); System.out.println(“Y egal “+pozitie.y); } } VARIABILE DE CLASA Dupa cum am vazut in cursurile anterioare o variabila de clasa este definita si memorata chiar in clasa respectiva . Valorile variabilelor de clasa se aplica clasei si tuturor instantelor sale . In cazul variabilelor de instanta fiecare noua instanta primea o copie a variabilelor de instanta definite in clasa . Fiecare instanta poate modifica apoi valorile acestor variabile fara a afecta alte instante . In cazul variabilelor de clasa exista o singura copie a acesteia . Modificarea valorii sale este vizibila in toate instantele clasei . Variabilele de clasa se definesc prin inserarea cuvantului cheie static inaintea numelui variabilei . De exemplu , sa luam urmatoarea definitie de clasa : class MembruFamilie { static String numeFamilie=”Popescu”; String prenume; int varsta; } Instantele clasei noastre poseda propriile valori pentru prenume si varsta insa variabila de clasa numeFamilie are o valoare comuna pentru toti membrii familiei . Daca se modifica valoarea acestei variabile toate instantele clasei MembruFamilie vor fi afectate .
Pentru accesarea acestor variabile de clasa se foloseste aceeasi notatie cu punct . Pentru a obtine sau modifica valoarea unei variabile de clasa in partea stanga a punctului putem folosi atat numele instantei cat si al clasei . Ambele linii urmatoare vor afisa aceeasi valoare : MembruFamilie tata=new MembruFamilie(); System.out.println(“Numele “ “+tata.numeFamilie); System.out.println(“Numele “ “+MembruFamilie.numeFamilie); In practica este recomandabil sa folosim numele de clasa in stanga punctului cand ne referim la o variabila de clasa . Astfel codul va fi mai usor de citit si depanat . APELAREA METODELOR Apelarea unei metode a unui obiect este asemanatoare referirii variabilelor de instanta : folosim notatia cu punct . Obiectul a carui metoda o apelam este in stanga punctului iar numele metodei si ale argumentelor sale in dreapta : clientulMeu.adaugInFactura(codProdus,pret); Mentionez din nou ca toate metodele sunt obligatoriu urmate de paranteze – cu sau fara argumente . Daca metoda apelata returneaza un obiect care poseda la randul lui metode putem imbrica metodele la fel ca la variabile . Urmatorul exemplu apeleaza metoda discutaCuDirectorul() , care este definita in obiectul returnat de metoda anuleazaToateComenzile() , care a fost definita in obiectul clientulMeu : clientulMeu.anuleazaToateComenzile().discutaCuDirectorul(); System.out.println() – metoda cea mai folosita pana acum este un exemplu de imbricare a variabilelor si metodelor . Clasa System , parte a pachetului java.lang , descrie comportamentul specific sistemului pe care ruleaza Java . System.out este o variabila de clasa care contine o instanta a clasei PrintStream . Acest obiect PrintStream reprezinta iesirea standard a sistemului , care in mod normal este ecranul . Obiectele PrintStream poseda o metoda println() care trimite un sir catre fluxul de iesire . In exemplul de mai jos vom putea vedea cele mai utilizate metode definite in clasa String : class VerificareSir { public static void main(String argumente[]) { String str=”In viata mea urmatoare , voi crede in reincarnare”; System.out.println(“Sirul este: ”+str); System.out.println(“Lungimea sirului este :”+str.length()); System.out.println(“Caracterul din pozitia 7 : “+str.charAt(7)); System.out.println(“Subsirul de la 9 la 11 : ”+str.substring(9,11));
System.out.println(“Indexul caracterului u: “+str.indexOf(‘u’)); System.out.println(“Indexul inceputului “+”subsirului \”voi\” : “+str.indexOf(“voi”)); System.out.println(“Sirul scris cu litere mari : “+str.toUpperCase()); } } METODE DE CLASA Metodele de clasa , ca si variabilele de clasa , se aplica unei clase in intregul sau si nu instantelor sale . Metodele de clasa sunt utilizate de obicei drept metode de uz general , care nu pot opera direct asupra unei instante a clasei , dar se potrivesc conceptual in cadrul clasei . De exemplu , clasa String contine o metoda numita valueOf() , care poate prelua mai multe tipuri de argumente ( intregi , booleeni , alte obiecte s.a.m.d. ) . Metoda valueOf() intoarce o noua instanta a clasei String , care contine valoarea argumentului sub forma de sir . Aceasta metoda nu opereaza direct asupra unei instante String insa obtinerea unui sir dintr-un alt tip de data este in mod clar o operatie apartinand clasei String si are deci sens sa fie definita in clasa String . Metodele de clase pot fi de asemenea folositoare pentru adunarea unor metode generale intr-un singur loc ( o clasa ) . De exemplu , clasa Math , definita in java.lang , contine un set larg de operatii matematice definite ca metode de clase – nu exista instante ale clasei Math si totusi putem folosi metodele sale impreuna cu argumente booleene sau numerice . De exemplu sa luam metoda de clasa Math.max : Int pretMaxim=Math.max(primulPret,alDoileaPret); Ca si in cazul variabilelor de clasa accesarea metodelor de clasa se poate face folosind in stanga punctului fie numele clasei fie numele de instanta . Exemplul de mai jos va produce acelasi rezultat in ultimele sale doua linii : String s,s2; s=”articol”; s2=s.valueOf(5); s2=String.valueOf(5);