Sunteți pe pagina 1din 15

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 , Im 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 : <applet code=Palindrom.class width=600 height=100> </applet> 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);

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