Simbolul this Am vazut pana acum ca obiectele unei clase pot fi accesate de clientii lor prin intermediul referintelor

. Se pune problema cum putem obtine o referinta la un ob iect din INTERIORUL lui insusi, mai precis din interiorul functiilor membru ale obiectului. Pentru aceasta exista simbolulthis. Simbolul this este o referinta care poate fi utilizata doar in cadrul functiilor membru non-statice ale unei clase. this este de fapt, din punctul de vedere al unei functii membru, referinta spre obiectul receptor, "posesor" al acelei funct ii. Se poate spune ca this reprezinta intr-un fel "constiinta de sine" a unui ob iect, in sensul ca obiectul isi cunoaste adresa la care este localizat in memori e. Practic orice referire a unui membru non-static v in interiorul unei metode apar tinand aceleiasi clase ca si v poate fi considerata ca echivalenta cu this.v. De exemplu, metoda move din clasa Punct definita in lucrarea precedenta poate fi s crisa sub forma: class Punct } In realitate toate referirile la membrii non-statici ai unui obiect, din interio rul unei metode non-statice sunt considerate de catre compilatorul de Java ca si cum ar fi prefixate de this. Cand FOLOSIM explicit referinta this? Ea este necesara in primul rand acolo unde ar putea exista conflicte de nume cu datele membru ale unui obiect. De exemplu: class Punct } • O alta categorie de situatii in care este necesara referinta this apare atunci c and: A. O metoda trebuie sa returneze ca rezultat o referinta la obiectul ei receptor : class Rational public Rational aduna(int n) } // exemplu de utilizare a clasei class ClientRational } In exemplul de mai sus apelul in lant al metodei adauga se desfasoara astfel: ma i intai se executa primul apel, avand ca obiect receptor obiectul indicat de ref erinta a; rezultatul obtinut este returnarea unei referinte spre un obiect al cl asei Rational; acest obiect va fi in continuare obiectul receptor pentru al doil ea apel al 17217t1924r metodei adauga. B. Referinta la obiectul receptor trebuie transmisa ca parametru la apelul unei alte metode: class Context public int Calcul() public int getX() } class Algoritm } /* exemplu de utilizare a claselor */ class Client } In exemplul de mai sus se observa ca acelasi obiect Algoritm deserveste 2 obiect e Context. De aceea, fiecare dintre obiectele c1 si c2 se va pasa pe sine ca par ametru la apelul metodei Calcul din Algoritm. In fine, simbolul this reprezinta mijlocul prin care poate fi apelat un construc tor al unei clase din interiorul altui constructor al aceleiasi clase: class Punct

In Java programatorul este scutit de sarcina de a face curat in memoria dinamica . In felul acesta se asigura indeplini rea conditiei ca pentru un obiect initializarea datelor prin constructor sa se e xecute O SINGURA data. De asemenea. practic GC-ul nici nu intervine. putem considera c a. la un moment dat mai trebuie sa si elibereze ceea ce a alocat. d ar programatorul are obligativitatea de a gestiona singur aceasta memorie. Colectorul de reziduuri (Garbage Collector) In legatura cu obiectele claselor stim acum ca ele se creaza dinamic. sa nu trebuiasca sa se colecteze reziduurile. Este posibil ca obiectul sa ramana alocat pana cand. folosind o peratorul new. . o atribuire ca cea din exemp lu seamana cu isprava baronului Munchausen care se lauda ca odata s-a salvat din tr-o mlastina tragandu-se singur in sus de propriile urechi (chestie care contra vine legii conservarii impulsului :-)). Referinta this nu poate sa apara in afara corpului de instructiuni al metodelor non-statice ale unei clase sau in afara blocurilor de initializareasociate cu va riabilele membru ale unei clase. conform codului constructorului apelat. Intuitiv. Si in limbajele Pascal si C exista posibilitatea alocarii dinamice a memoriei. Singurul efect care ar put . privind din interiorul unei clase. numele constructorilor ei sunt this(lista_ parametri). In exemplul de mai jos sunt ilustrate situatiile in care un anumit obiect ar put ea ajunge sa fie candidat la stergere: public void oMetoda( ) public void altaMetoda() Pentru utilizator actiunea GC-ului este transparenta. Referinta this NU poate fi utilizata in interio rul unei functii-membru statice. De acest lucru se ocupa o componenta a masinii virtuale (interpreterului) numi ta Garbage Collector (GC). efectul va fi atribuirea de valori in campurile obiect ului. Cum NU TREBUIE SA FOLOSIM referinta this? Referinta this nu poate fi modificata (nu poate aparea ca membru stang intr-o at ribuire: class OClasa //. Principiul de lucru al GC-ului este urmatorul: Daca spre un anumit obiect nu mai exista nici o referinta externa. • Un constructor nu poate fi apelat cu ajutorul simbolului this DECAT din interior ul altui constructor si nu al altor metode. DE CE oare ? Putem comenta in Conferinta Softwa re Consulting. . acel obiect ramane "orfan" si devine candidat la eliminare din memo ria heap. In ca zul programelor didactice. in care numarul total al obiectelor create nu depases te cateva zeci. ci pur si simplu. pentru obiectul receptor cure nt se va executa codul constructorului apelat. in decur sul executiei programului. } Ceea ce vrea exemplul de mai sus sa scoata in evidenta este faptul ca un obiect nu-si poate muta singur locul in memorie.public Punct(Punct p) } Atentie: • Apelul unui constructor din interiorul altui constructor al clasei in cauza NU i nseamna crearea unui nou obiect. Cu alte cuvinte. in nici o fun ctie activa. la fel ca in cazul apelarii unei functii-membru obisnuite. se ajunge in situatia ca spatiul liber din heap sa nu mai fie suficient. in se nsul ca. Nu este obligatoriu ca un obiect sa fie sters imediat dupa ce dispare si ultima referinta spre el. Nu am spus insa nimic referitor la eliberarea memoriei ocupate de obiecte. este posibil ca un program sa nu aiba nevoie de memorie multa si ca urmare.

implementabile într-un limbaj de program are. Se pune problema cum vom vedea noi ca intr-adevar GC-ul elimina obiec te ? Aici ne bazam pe faptul ca GC nu actioneaza "fara preaviz". urmatoarea operatie de creare de obiect nu se va mai putea face d ecat dupa ce intervine GC sa faca curatenie. inainte de a elimina un obiect din memorie. ad ica o unitate care separa implementarea de interfa?a. Astfel unita?ile care alca tuiesc un program se apropie mai mult de modul nostru de a gândi decât modul de lucr u al calculatorului. In secventa de mai jos este propus un program in care sa surprin dem interventiile GC-ului: import java. Pentru a vizualiza insa activitatea GC-ului.io. System. precum si clauza throws Throwable. Daca p revedem si in constructor afisarea unui mesaj. pentru ca despre ele v om invata la capitolul cu mostenirea.*. vom incerca sa simulam o situatie d e umplere a memoriei heap cu obiecte orfane. atunci vom constata aparitia pe ecr an a mesajului tiparit de metoda finalize */ oMetoda(). astfel încât subrutinele sa "?tie" în p ermanen?a ce date prelucreaza ?i. class OClasa protected void finalize() throws Throwable } class ClientOClasa public static void main(String[] arg) /* in bucla for de mai sus am "inundat" memoria heap cu obiecte orfane. se recomanda ca in comanda de lansare in executie sa se faca o redirect are a iesirii spre un fisier care apoi va putea fi vizualizat cu un editor oarec are. /* deci am pierdut referinta la obi ectul local de acolo */ System. Atunci cand vom vedea pe ecran mesajul respectiv vom st i ca in momentul acela un obiect a fost eliminat de catre GC din memorie. ceea ce implica posibilita . ceea ce facea foarte dificila extinderea ? i între?inerea unui program. respectiv cu tratarea exceptiilor). ele sa formeze un modul. Altfe l spus o problema preluata din natura trebuia fragmentata în repetate rânduri astfel încât sa se identifice elementele distincte. Aceasta metoda are antetul urmator: protected void finalize() throws Throwable. Astfel s-a pus problema ca aceste doua entita?i(date ?i subrutine) sa fie grupate într-un anumit mod. comanda de executie se va da astfel: java ClientOClasa > fis. mai mult decat atât. Pascal) sau în limbaje car e nici macar nu ofereau o modalitate de grupare a instruc?iunilor în unita?i logic e (func?ii. si ea va fi executata chiar inainte ca obiectul sa dispara (incercati sa ignorat i cuvantul protected . proceduri) cum este cazul limbajului de asamblare (assembler). Ea a aparut din necesitatea expr imarii problemei într-un mod mai natural fiin?ei umane.println("acum ies din main"). Pentru aceasta.out. cand mem oria se umple. Pâna la apari?ia programarii orientate pe obiect programele e rau implementate în limbaje de programare procedurale (C. ci.out. O mare problema a programarii procedurale era separarea datelor de unita?il e care prelucrau datele(subrutinele). Am putea de exemplu sa definim metoda finalize astfel incat aceasta sa afiseze p e ecran un anumit mesaj. putem urmari practic traseul viet ii unui obiect. el incearca sa apeleze o anumita metoda special a detinuta de obiectul respectiv.ea fi sesizat in unele programe ar fi o anumita incetinire a lor. } } Pentru a putea analiza in liniste mesajele afisate prin executia programului de mai sus.txt Clase ?i obiecte Programarea orientata pe obiect (Programare Orientata Obiectual) este unul din c ei mai importan?i pa?i facu?i în evolu?ia limbajelor de programare spre o mai pute rnica abstractizare în implementarea programelor.println("am revenit din metoda"). astfel incat sa-l fortam sa intre i n actiune.

Vo m instan?ia (particulariza) clasa "Raft" atribuind atributelor "numar" valoarea "1" ?i "con?inut" valoarea "fructe". precum clasele ci se lucreaza cu obiecte. Daca vom considera ca "f ruct_exotic" care desemneaza clasa tuturor fructelor exotice con?ine proprietate a "culoare" atunci atribuind acesteia valoarea "galben" noi vom crea o noua mul? ime( clasa fructelor exotice care au culoarea galbena ) care este o subclasa a c lasei "fruct_exotic". iar clasa "Raft" se n ume?te clasa compusa (engl. Clasa realizeaza. d aca vom adauga noi ?i noi atribute vom individualiza clasa astfel încât sa ajungem l a un caz concret. mai precis ce înseamna efectiv procesul de instan?iere?". programe. pe lânga faptul ca abstractizeaza foarte mult analiza/sinteza problem ei. Acest nou raft ( sa-l numim raft frigorific) este în esen?a tot un raft doar ca are în plus proprieta tea de racire. în implementarea efectiva a programului nu se lucreaza cu entita?i abst racte. deci realizam astfel o particularizare. cum se vede în diagrama de mai jos: ************************ ******************** **** * * * * * * 1 n * * * RAFT <>==================> FRUCT * * * * * * * * * ************************ ******************** **** Un raft con?ine mai multe fructe(n) Sa consideram în continuare ca în magazin avem ?i fructe care trebuie pastrate la te mperaturi joase. Bineîn?eles. Extinzând exemplul de mai sus. etc. în spe?a. "portocala".tea refolosirii codului. el nu va prelucra entitatea "fruct" ci va lucra cu entita?i concrete ale clasei "fruct". are proprietatea de generalitate.. Altfel spus. în cazul nostru "Fruct". o r ela?ie fundamentala în POO (Programare Orientata Obiectual). etc. astfel încât aceasta sa indice un obiect anume. unindu-le astfel într-o entitate mult mai naturala. daca se construie?te un pro gram care sa lucreze cu fructe. Aces te legaturi reflecta rela?iile care se stabilesc între clasele/obiectele problemei pe care am preluat-o din natura. fiindca în componen?a ei intra alte clase. Bineîn?eles ca acest raft va fi în rela?ie cu clasa "Fruct" pe care am exemplificat-o mai devreme. Aceasta înseamna ca am creat un obiect al cla sei "Raft" care: "este primul din magazin ?i con?ine fructe". care se diferen?iaza de toate celelalte obiecte din clasa printr-o serie de atribute. care va avea urmatoarele proprieta?i: "numar" si "con?inut". ceea ce am vazut mai înainte: grupeaza datele ?i unita?ile de prelucrare a acestora într-un modul. De?i teh nica se nume?te "Programare Orientata Obiectual". Instan?ierea (trecerea de la clasa la obiect) înseamna atribuirea unor proprieta?i specifice cl asei. Agregate). Apare însa urmatoarea problema: "cum se trece de la o structura generala la una pa rticulara. adica "mar". "para". ele vor fi g rupate în module. Acest lucru ne duce cu gândul la faptul ca putem reutiliza codul sc . care sunt "instan?ieri" ale cla selor. [modificare]Obiectele pot comunica între ele O data identificate entita?ile (în spe?a clasele) ele nu ramân izolate. Ast fel. vom adauga o noua clasa: "Raft" . care vor stabili legaturi între ele. Rela?ia pe care am enun?at-o mai sus se mai nume?te ?i rela?ie de compunere. precum clasa "Fruct" desemneaza toate obiectele pe care noi le identificam ca fiind fructe. el con?ine obiecte de tip "Fruct". pachete. Pentru ele vom avea nevoie de un raft special. Mai mult decât atât. conceptul de baza al ei este C lasa. ea desemnând o mul?ime de obiecte care împart o serie de proprieta?i. care este Obiectul. De exemplu: Clasa "floare" desemneaza toate plantele care au flori. plecând de la exemplul de mai sus. Clasa. A aparut astfel conceptul de clasa.

El asigura faptul ca fiecare clasa se comporta diferit (polimorfic) la un anumit mesaj trimis catre obiect (în cazul nostru. Asta înseamna ca "manânca-ma!" trebuie sa se particularizeze pentru fiecare clasa în parte .ris pentru "Raft" pentru a implementa o clasa numita "Raft Frigorific". Altfel spus. de asemeni. Dar sa consideram urmatoa rea situa?ie: "Fruct" poate implementa o subrutina pe care o vom numi "manânca-ma! ". apelul subrutinei "manânca-ma!"). D -> "pruna". Facând o analogie cu exemplul anterior. Altfel s pus. care o diferen?ia za". Se observa ca polimorfismul exista în strânsa legatura cu mo?tenirea. în mod intuitiv. În acest caz putem face afirma?ia: "B. mai multe cl ase care mo?tenesc o clasa. clasa derivata va con?ine (prin intermediul mo?tenirii) toate atribu tele (date ?i subrutine sau "metode") ale clasei de baza. Urmatoarea diagrama ilustreaza mo?tenirea: ************************** * * * RAFT <|-+ * * | ************************** | | | ************************** | * * | * RAFT FRIGORIFIC ---+ * * ************************** Clasa Raft Frigorific mo?tene?te clasa Raft Mo?tenirea este de asemeni o rela?ie fundamentala în POO (Programare Orientata Obi ectual). B -> "mar". Fie clasa "A" ?i clasele "B". Clasa care mo?tene?te atributele altei clase se nume ?te "clasa derivata" iar clasa care are mo?tenitori se nume?te "clasa de baza". daca încercam sa "mu?cam" cu pofta dintr-o nuca. "C". prin mo?tenire.. care se observa direct. daca A -> "Fruct". Putem avea. afirma?ia de mai sus ar suna în felul urmator: "marul. [modificare]Clasele se comporta diferit în func?ie de tipul lor Am vazut mai sus ca o clasa poate mo?teni o alta clasa. lucru care este în mod evident adevarat. ci va implementa numai metodele ei specifice . deci ?i subrutina "manânca-ma!" înseamna ca un mar se manânca la fel ca o pruna! Bineîn?eles. care este recunoscuta ca fiind un principiu de baza. fara de care nu ar exista. mai mult. "D" mo?tenesc pe "A". Terminologia este ?i în acest caz intuitiva. ceea ce înseamna ca o enti tate preia toate atributele altei entita?i. Acest lucru. Acest lucru mai es te numit ?i polimorfism. este numit mo?tenire. El este al treilea ?i cel mai important principiu al Programarii Orientate Obiec tual. Deoarece. C -> "nuca" . clasele "Mar". sa presupu nem ca "B". C ?i D sunt de tip A". "C" ?i "D". dorim ca noua noastra clasa sa fie o subclasa a clasei "Raft" deoarece ea " are toate proprieta?ile clasei "Raft" plus altele particulare. Unul din avantajele mo?tenirii. El aduce însa o nuan?a mo?tenirii: " Preiau din clasa de baza doar a cele proprieta?i care sunt comune ?i reflecta un comportament adecvat structurii mele". Astfel spus ?i clasa " Raft Frigorific" va avea atributele "numar" si "con?inut". reflectând un comportament adecvat cu proprieta?ile acesteia. ?i Polimorfism. Mo?tenirea este o rela?ie statica (definita în momentul programarii) care pune în legatura o clasa cu alta (s au mai multe) astfel încât clasa rezultata sa "preia" toate atributele clasei/clasel or pe care o/le mo?tene?te. "Para" ?i "Nuca" preiau toate atribu tele clasei "Fruct". prin polimorfism pot face o mo?tenire selectiva. este acela al reutilizarii codului: clasa derivata nu va mai implementa metodele clasei de baza.. C ?i D mo?tenesc toate caracteristicile clasei A deci pot fi identificate cu o clasa de tip A. alaturi de Încapsula re. Aceasta înseamna ca B. para ?i nuc a sunt fructe". [modificare]Principii de baza .

Exemplu o2 = new Exemplu().Pentru variabilele de clasa (statice) sistemul aloca o singu ra zona de memorie la care au acces toate instantele clasei respective. acestea pot redefini metoda a rie. Esen?a mo?tenirii consta în posibilitatea refolosirii lucrurilor care func?ioneaza. Polimorfismul – Este abilitatea de a procesa obiectele în mod diferit.x = 200. permi?ând defin irea ?i crearea unor clase specializate plecând de la clase (generale) deja defini te . Aceasta se face de obicei prin gruparea obiectelor în clase ?i prin de finirea de clase ca extinderi ale unor clase existente.out. Aceasta este adevarata mai ales în cazul proiectelor software complexe ?i de dimensiuni mari. Variabile de instanta si de clasa Cand declaram o variabila membr a fara modificatorul static.Abstractizarea – Este posibilitatea ca un program sa ignore unele aspecte ale info rma?iei pe care o manipuleaza. Conceptul de mo?tenire p ermite construirea unor clase noi. de la una sau mai multe clase definite anter ior.1. este abilitatea de a redefini metode pentru cl asele derivate. Fiecare tip de obiect expune o interfa?a pentru celelalte obiecte care specifica modul cum acele obiecte pot interac?iona cu el. în func?ie de t ipul sau de clasa lor. care pastreaza caracteristicile ?i comportare a. Se utilizeaza ideea: ”Anumite obiecte sunt similare. fiecare obiect nou creat va putea memora valori diferite pentru variabil elesale de instanta. î?i poate modifica ?i comunica starea ?i poate comunica cu alte obiecte din sistem fara a dezvalui cum au fost implementate acele facilita?i. // Afiseaza 100System. care poate executa ac?iuni. Mai exact.x). Dac a Cerc. clasa este o unitate care încapsuleaza datele ce descriu elemente similare ?i cod ul care opereaza asupra lor 2. care se ge stioneaza facând apel la ingineria programarii. Dreptunghi. astfel încât programele realizate prin tehnica POO sunt mai u?or de în? eles. Procesele. Mo?tenirea – Organizeaza ?i faciliteaza polimorfismul ?i încapsularea. func?iile sau metodele pot fi de asemenea abstracte. ?i în acest caz sunt necesar e o varietate de tehnici pentru a extinde abstractizarea: Încapsularea – numita ?i ascunderea de informa?ii: Asigura faptul ca obiectele nu po t schimba starea interna a altor obiecte în mod direct (ci doar prin metode puse l a dispozi?ie de obiectul respectiv).acestea pot împarta?i (?i extinde) comportamentul lor.println(o1. // Afiseaza 200 Asadar.out.println(o2. Exemplu o1 = new Exemplu(). fara a fi nevoie de al redefini. O clasa mo?tenitoare a uneia sau mai multor clase de baza se nume?te clasa derivata. doar metodele proprii ale obiectului pot ac cesa starea acestuia. cum ar fi x in exemplul de mai jos: class Exemplu {int x . etc. vor extinde clasa Figura. ceea ce inseamna ca la fiecare creare a unuiobiect al clasei Exemplu sistemul aloca o zona de memorie separata pentru memorareavalorii lui x.o2.5.8. adica posibilitatea de a se concentra asupra esen ?ialului.o1. deci datele ?i func?iile membru. în loc de simple liste de instruc?iuni sau de apeluri de proceduri (vezi ?i progra mare procedurala).x). ceea ce inseamna ca . De exemplu pentru o clasa Figura putem defini o metoda arie. fiind posibila redefinirea sau adaugarea unor date ?i func?ii noi. de depanat ?i de extins decât programele procedurale. Obiectele POO sunt de obicei reprezentari ale obiectelor din via?a reala (domeni ul problemei). //variabila de instanta} se declara de fapt o variabila de instanta. unita?i individuale de cod care interac?ioneaza unele cu altele. Fiecare obiect în sistem are rolul unui “actor” abstract.x = 100. dar în acela?i ti mp diferite”. [modificare]Concluzii Ideea POO (Programare Orientata Obiectual) este de a crea programele ca o colec? ie de obiecte.Syst em. numite clase de baza.

// Corectx --.n. o2.out. // Corectx --.metodaStatica(). Metode de instanta si de clasa Similar ca la variabile.n = 200.daca un obiectmodifica valoarea unei variabile statice ea se va modifica si pent ru toate celelalte obiecte. // Variabila de instantasta tic long n. // Corect .static P oint p = new Point(0. • metodele de clasa opereaza doar pe variabilele statice ale clasei. apelul lor se poate face si sub forma: NumeClasa.0).println(o1.metodaStatica().n = 100.Syst em.14.Deoarece nu depind de o anumita instanta a unei clase . . variabilele statice pot fi referite sisub forma: NumeClasa.n si Exemplu. class Exemplu {int x .System. intruc at metodele de clasa nu depind de stareaobiectelor clasei respective. // Corect.println(o2.obj.n). si este realizata prin atribuiri obisnuite: class Exemplu {static final double PI = 3. metodele declarate fara modificatorul static sunt metod e deinstanta iar cele declarate cu static sunt metode de clasa (statice).n sunt referinte la aceeasi valoare Initializarea variabilelor de clasa se face o singur a data. echivalent cuExem plu obj = new Exemplu().n). // Eroare la compilare !}} Intocmai ca si la variabilele statice. // Variabila de cl asavoid metodaDeInstanta() {n ++.numeVariabilaStaticaclass Exemplu {int x .Exemplu o2 = n ew Exemplu(). obj. // Afiseaza 200System. // Afiseaza 200//o1.static long nrInstante = 0. de asemenea Metodele de instanta nu pot fi apelate decat pentru un obiect al clasei respecti ve: Exemplu. la incarcarea in memoriea clasei respective. // Corect.out.println(Exemplu.out.numeMetodaStaticaExemplu. // Afiseaza 100o2. // Eroare la compilare !Exemplu obj = new Exemplu().metodaDeInstanta().o1. // Variabila de instantastatic long n.Exemplu o1 = new Exemplu().n). . // Variabila de clasa}.metodaDeInstanta(). // Corect}static void metodaSta tica() {n ++. Diferenta intre cele doua tipuri de metode este urmatoarea: • metodele de instanta opereaza atat pe variabilele de instanta cat si pe cele statice aleclasei.

Sign up to vote on this title
UsefulNot useful