Sunteți pe pagina 1din 12

Lect ia 3

Transmiterea mesajelor
C and apel am o operat ie pus a la dispozit ie de un obiect prin intermediul interfet ei sale spunem c a transmitem obiectului un mesaj. Obiectul care prime ste mesajul se nume ste obiect apelat sau receptor. Aceast a lect ie prezint a c ateva aspecte legate de transmiterea mesajelor.

3.1

Supra nc arcarea metodelor

In Java o metod a poate declarat a doar n interiorul unei clase. Ea este alc atuit a din dou a componente numite prototipul metodei, respectiv corpul metodei. Prototipul unei metode este alc atuit din specicatori, tip returnat, nume, lista parametrilor formali si clauza opt ional a throws despre care vom vorbi mai t arziu. Corpul unei metode este format dintr-un bloc de instruct iuni iar n anumite condit ii, dup a cum vom vedea mai t arziu, acesta poate lipsi. Fiecare metod a are o semn atur a. Denit ie 5 Semn atura unei metode este alc atuit a din numele metodei mpreun a cu num arul si tipurile parametrilor formali din prototipul metodei. Atunci c and ntr-o clas a denim dou a sau mai multe metode cu acela si nume spunem c a le supra nc arc am. Pentru a face posibil a distinct ia la nivelul compilatorului ntre metodele supra nc arcate trebuie ca semn aturile respectivelor metode s a difere e prin num arul de parametri formali ai metodei e prin tipurile acestora. Atunci c and cineva spune c a tip are ste ceva, putem trage concluzia c a o anumit a informat ie va tip arit a pe un suport zic. Suportul zic pe care va tip arit a informat ia, dac a acesta prezint a interes, poate dedus din contextul n care se a a persoana care realizeaz a tip arirea: un programator va tip ari pe ecran, un ziarist va tip ari ntr-un ziar, etc. A sa stau lucrurile si

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

42

LECT IA 3. TRANSMITEREA MESAJELOR

cu o metod a supra nc arcat a. Spre exemplu, e sucient s a stim c a metoda static a System.out.println(...) tip are ste pe ecran informat ia pe care o transmitem acesteia prin intermediul parametrilor. Dintr-un apel concret al acesteia putem aa exact si ce tip de informat ie se va tip ari (un ntreg, un boolean). Metodele de mai jos sunt supra nc arcate, de si la prima vedere au aceea si list a de parametri. In acest caz distinct ia dinte ele se face n funct ie de ordinea tipurilor parametrilor actuali din cadrul apelului metodei.
void tipareste(String sir, boolean b) { if(b) System.out.println("String: " + sir); } void tipareste(boolean b, String sir) { if(b) System.out.println("String: " + sir); }

In literatur a supra nc arcarea metodelor este cunoscut a sub numele de overloading.

3.1.1

Supra nc arcarea constructorilor

Constructorii sunt n cele din urm a un fel de metode si, prin urmare, pot supra nc arcat i. Supra nc arcarea constructorilor permite instant ierea unui obiect n mai multe moduri, pentru ecare mod exist and c ate un constructor. Spre exemplu, clasa Valoare de mai jos are doi constructori si aceast fapt permite instant ierea obiectelor de acest tip n dou a moduri.
class Valoare { private int valoare; public Valoare() { valoare = 0; } public Valoare(int v) { valoare = v; } public void seteazaValoare(int v) { valoare = v; }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

3.1. SUPRA INCARCAREA METODELOR

43

public void tipareste() { System.out.println("Valoarea mea: " + valoare); } }

Metoda seteazaValoare din interiorul clasei Valoare se nume ste metod a accesor pentru c a singurul ei scop e setarea unei valori.

Datorit a existent ei celor doi constructori, ambele moduri de instant iere a obiectelor de mai jos sunt corecte.
Valoare o1 = new Valoare(); Valoare o2 = new Valoare(2);

3.1.2

Supra nc arcarea si tipurile de date primitive

O variabil a de tip primitiv poate automat convertit a spre un tip primitiv mai larg. Aceast a conversie poate produce confuzii atunci c and e vorba despre identicarea exact a a unei metode supra nc arcate care se apeleaz a.
class ParametriPrimitivi { public static void care(float f) { System.out.println("FLOAT " + f); } public static void care(double f) { System.out.println("DOUBLE " + f); } public static void main(String[] args) { care(3.14); care(5); } }

Spre exemplu, rezultatele produse de execut ia funct iilor de mai sus vor
DOUBLE 3.14 //3.14 este implicit un double iar pentru a fi tratat //ca un float el trebuie succedat de sufixul f FLOAT 5.0

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

44

LECT IA 3. TRANSMITEREA MESAJELOR

Dac a exist a o metod a supra nc arcat a al c arei parametru formal are exact acela si tip ca si parametrul actual, se apeleaz a acea metod a. Dac a, n schimb, nu exist a nici o metod a cu proprietatea de mai sus, atunci se va ncerca o conversie automat a de l argire a tipului primitiv si se va apela metoda av and parametrul formal cel mai apropiat ca tip, dar mai mare dec at cel al parametrului actual. Av and n vedere c a un int poate convertit automat la oricare din tipurile de mai jos int - long, oat sau double si c a avem dou a metode care, una cu un parametru formal de tip oat, alta cu un parametru formal de tip double si c a tipul oat e cel mai apropiat de tipul int, se va apela metoda care cu parametrul formal de tip oat. Tipul cel mai apropiat de tipul char este tipul int. O variabil a de tip primitiv NU poate automat convertit a spre un tip primitiv mai mic, conversia spre un tip primitiv mai mic ind posibil a doar prin intermediul conversiilor explicite.

3.2

Transmiterea parametrilor

Atunci c and denim o metod a ce are parametri, parametrii acesteia pot v azut i ca ni ste variabile locale ce vor primi valori concrete doar atunci c and se apeleaz a metoda. Parametrii din cadrul prototipului unei metode se numesc parametri formali. Parametrii ce se pun n punctul de apel al unei metode se numesc parametri actuali. Exist a dou a moduri de transmitere a parametrilor: prin valoare parametii formali vor nlocuit i cu valorile parametrilor actuali; dup a execut ia metodei valorile parametrilor actuali nu vor schimbate. prin referint a(adres a) parametii formali vor referi exact aceea si zon a de memorie ca si cei actuali; dup a execut ia metodei valorile parametrilor actuali pot schimbate. In Java parametrii se transmit prin valoare!!! In metoda main a clasei TipPrimitiv de mai jos se ilustreaz a efectul transmiterii prin valoare a unei variabile de tip primitiv. Evident, valoarea parametrului actual va 15 si dup a execut ia metodei apelate.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

3.2. TRANSMITEREA PARAMETRILOR

45

class TipPrimitiv { public static void trimitValoarePrimitiva(int p) { p = 10; } public static void main(String[] arg) { int v = 15; trimitValoarePrimitiva(v); System.out.println("Valoarea lui v: " + v); //v va fi 15 } }

Dac a efectul transmiterii unui parametru de tip primitiv este evident, efectul transmiterii unui parametru de tip referint a poate s a nu e a sa de evident. In acest caz, la apel, metoda va primi referint a unui obiect, ceea ce se transmite prin valoare ind o referint a si nu obiectul indicat de referint a!!! Aceasta nseamn a c a modic arile aduse asupra obiectului referit de parametrul o din exemplul de mai sus vor vizibile si n metoda main. Pe de alt a parte, modicarea referint ei din cadrul metodei trimitValoareReferinta2 nu este vizibil a n metoda main datorit a trimiterii prin valoare a referint ei.
class TipReferinta { public static void trimitValoareReferinta1(Valoare o) { o.seteazaValoare(10); } public static void trimitValoareReferinta2(Valoare q) { q = new Valoare(50); } public static void main(String[] arg) { Valoare v = new Valoare(5); v.tiparire(); //Va afisa Valoarea mea: 5 trimitValoareReferinta1(v); v.tiparire(); //Va afisa Valoarea mea: 10 deoarece //obiectul indicat de s si-a modificat continutul trimitValoareReferinta2(v); v.tiparire(); //Va afisa Valoarea mea: 10 //din cauza transmiterii referintei prin valoare } }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

46

LECT IA 3. TRANSMITEREA MESAJELOR

Dac a dorim ca unui parametru de tip primitiv din cadrul prototipului unei metode s a nu i se poat a atribui n interiorul metodei o alt a valoare dec at cea primit a la apel, n cadrul prototipului acesteia trebuie s a apar a corespunz ator modicatorul nal. Dac a parametrul este o referint a, chiar dac a este specicat ca ind nal, prin intermediul s au se pot aduce modic ari obiectului referit dar nu si referint ei ns a si.

3.3

Cuv antul cheie this

Cuv antul cheie this este o referint a spre obiectul receptor al unui mesaj. this poate s a apar a doar n interiorul metodelor nestatice ale unei clase precum si n interiorul constructorilor.
public void seteazaValoare(int v) { valoare = v; //echivalent cu //this.valoare = v; }

Exist a mai multe situat ii care impun folosirea lui this. In continuare se vor exemplica c ateva dintre ele. Conicte de nume cu ajutorul lui this se poate face distinct ie ntre un atribut aferent obiectului receptor al unui mesaj si un parametru formal al mesajului, atunci c and atributul, respectiv parametrul formal au acela si nume.
public void seteazaValoare(int valoare) { this.valoare = valoare; }

O metod a trebuie s a returneze ca rezultat o referint a la obiectul ei receptor. Referint a la obiectul receptor trebuie transmis a ca parametru la apelul unei metode. Apelul unui constructor din alt constructor n clasa Valoare vrem s a adaug am un constructor care prime ste ca parametru o referint a la un obiect de tip Valoare si vrem ca obiectul instant iat n acest mod s a aib a atributul s au valoare egal cu cel al obiectului referit de v.
public Valoare(Valoare v) { this(v.valoare); //se apeleaza constructorul Valoare(int v) }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

3.4. METODELE CLASEI OBJECT

47

Apelul unui constructor din interiorul altui constructor trebuie s a e prima instruct iune din cadrul constructorului apelant, n caz contrar compilatorul va semnala o eroare. Apelul unui constructor din interiorul altui constructor nu nseamn a crearea unui alt obiect ci doar apelarea codului celuilalt constructor (pentru init ializ ari). Un constructor nu poate apelat cu ajutorul lui this din interiorul altor metode, ci doar din interiorul unui constructor. Referint a this nu poate folosit a n interiorul unei metode statice deoarece metoda static a apart ine unei clase si, de obicei, aceasta nu se execut a pentru un obiect. Referint a this la obiectul receptor al unui mesaj nu poate modicat a, adic a acesteia nu i se poate atribui o alt a valoare. Deci obiectul receptor al unui mesaj nu poate modicat pe parcursul trat arii mesajului.

3.4

Metodele clasei Object

In Java orice clas a pe care o denim se a a ntr-o relat ie special a cu o clas a numit a Object. Ca urmare a acestei relat ii, orice clas a denit a are si ea toate metodele clasei Object. In Tabelul 3.1 sunt prezentate c ateva metode ale clasei Object. Prototipul Object clone() boolean equals(Object obj) void nalize() int hashCode() String toString() Descriere Creaz a si returneaz a o referint a la o clon a a obiectului receptor Testeaz a dac a obiectul referit de obj este egal cu cel receptor Se apeleaz a la distrugerea obiectului de c atre Colectorul de reziduuri (Garbage Collector) Returneaz a codul hash al obiectului receptor Returneaz a o reprezentare sub form a de String a obiectului receptor

teva metode ale clasei Object. Tabelul 3.1: Ca

3.4.1

Compararea obiectelor

Dup a cum am vazut n Tabelul 1.4, atunci c and compar am valorile a dou a variabile de tip primitiv, folosim operatorul relat ional ==.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

48

LECT IA 3. TRANSMITEREA MESAJELOR

class TestareIdentitate { public static void main(String[] arg) { Valoare v1 = new Valoare(10); Valoare v2 = new Valoare(10); if(v1 == v2) System.out.println("Obiectele sunt egale"); else System.out.println("Obiectele NU sunt egale"); } }

In Java operatorul relat ional == poate aplicat si variabilelor de tip referint a, ca n exemplul anterior. Poate surprinz ator, rezultatul comparat iei de mai sus este fals si n consecint a pe ecran se va a sa:
Obiectele NU sunt egale

De fapt, atunci c and aplic am operatorul == la dou a referint e ceea ce compar am este identitatea zic a a obiectelor referite, adic a se veric a dac a cele dou a referint e indic a acela si obiect. Dac a dorim s a test am echivalent a dintre dou a obiecte, adic a dac a dou a obiecte au cont inut identic, este bine s a folosim metoda equals pe care orice clas a o are datorit a relat iei speciale dintre ea si clasa Object. Dar aceast a metod a equals trebuie modicat a pentru ecare clas a n parte astfel nc at apelul acesteia s a compare dou a obiecte din punct de vedere al echivalent ei (vom vedea mai t arziu, de fapt, cum se nume ste aceast a modicare). Far a modicarea de mai sus, metoda equals va testa identitatea zic a dintre obiectul receptor al metodei si cel referit de parametrul metodei si nu echivalent a din punct de vedere al cont inutului acestora.
class Valoare { ... public boolean equals(Object o) { if(o instanceof Valoare) return (((Valoare)o).valoare == valoare); else return false; } }

In interiorul metodei equals din cadrul clasei Valoare a trebuit s a test am dac a ntr-

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

3.4. METODELE CLASEI OBJECT

49

adev ar s-a trimis o instant a a clasei Valoare folosind operatorul instanceof. Dac a acest lucru s-a nt amplat, atunci rezultatul test arii echivalent ei dintre cele dou a obiecte este dat de aplicarea operatorului == celor dou a atribute primitive. Majoritatea claselor predenite din Java ofer a o implementare adecvat a a metodei equals astfel nc at aceasta s a compare obiectele implicate din punt de vedere al echivalent ei si nu al identitat ii. Trebuie ns a s a consultat i paginile de manual pentru a vedea ce nseamn a echivalent a pentru acele clase. Testarea echivalent ei dintre obiectele referite de v1 si v2 se face n felul urm ator:
if(v1.equals(v2)) { System.out.println("Obiectele sunt egale dpdv al echivalentei"); } else { System.out.println("Obiectele NU sunt egale dpdv al echivalentei"); }

Se poate testa echivalent a dintre dou a obiecte si prin intermediul unei metode care nu se nume ste equals dar existent a unei alte metode pentru efectuarea comparat iei va reduce drastic nt elegerea programelor si va duce la pierderea unor facilitat i oferite de Java, facilit ati despre care vom vorbi mai t arziu.

3.4.2

Metoda toString

Metoda toString a clasei Object, ca si celelalte metode ale acestei clase, este si ea existent a n ecare clas a pe care o denim. In consecint a, ecare obiect creat de noi are o metod a toString pe care o putem oric and apela n program.
//1 se apeleaza metoda supraincarcata println cu un parametru de tip String System.out.println(v1.toString()); //2 se apeleaza metoda supraincarcata println cu un parametru de tip Object System.out.println(v1);

Dup a cum prezint a Tabelul 3.1, metoda returneaz a o reprezentare sub form a de String a obiectului receptor. Concret, efectul execut iei primului apel de mai sus poate a sarea pe ecran a textului
Valoare@fd13b5 //pentru o alta executie, codul hash fd13b5 al obiectului v1 va fi altul

Reprezentarea implicit a sub form a de sir de caractere este format a din numele clasei pe care o instant iaz a obiectul receptor al metodei toString urmat de @ si de codul hash

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

50

LECT IA 3. TRANSMITEREA MESAJELOR

al obiectului. In continuare vom vedea care este rostul acestei metode. Dac a ne uit am n documentat ia Java disponibil a la adresa http://java.sun.com/j2se/1.5.0/docs/api/java/io/PrintStream.html vom vedea c a metoda println este supra nc arcat a, exist and printre prototipurile ei urm atoarele:
public void println(String x) public void println(Object x)

Faptul c a exist a o metod a println av and un parametru de tip String va produce apelarea acesteia n primul caz. In al doilea caz, se va apela cea care are parametrul de tip Object datorit a faptului c a orice obiect instant iat este ntr-o o relat ie special a cu clasa Object. Ceea ce face a doua metod a println nu este altceva dec at a sarea pe ecran a sirului de caractere returnat de apelul metodei x.toString() si, deci, se va tip ari acela si sir de caractere ca si n cazul primului apel. Reprezentarea sub form a de String pe care o ofer a implicit clasa Object nu este satisf ac atoare. De exemplu, pentru o instant a a clasei Valoare reprezentarea sub form a de String ar putea
Valoarea mea este 10

Pentru ca reprezentarea sub form a de String a unei instant e a clasei Valoare s a e cea de mai sus, metoda toString mo stenit a de la clasa Object trebuie modicat a ca mai jos.
class Valoare { ... public String toString() { return "Valoarea mea este " + valoare; } }

Dar oare care va efectul execut iei codului de mai jos?


System.out.println("***" + v1);

In Java operatorul + este folosit si pentru concaten ari de siruri de caractere. Pentru cazul de mai sus al doilea operand nu este altcineva dec at reprezentarea sub form a de String a lui v1 iar, n consecint a, pe ecran se va a sa
*** Valoarea mea este 10

Nu este bine s a avem n clasa Valoare o metod a de genul:

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

3.4. METODELE CLASEI OBJECT

51

public void afiseaza() { System.out.println("Valoarea mea este " + valoare); }

3.4.3

Eliberarea memoriei ocupate de obiecte

P an a acum am v azut cum se creaz a dinamic un obiect dar nu am spus nimic despre eliberarea memoriei ocupate de c atre acesta. In Java, programatorul nu trebuie s a elibereze explicit zone de memorie ocupate de obiectele instant iate, acest lucru ind realizat automat de c atre suportul de execut ie. Unul din cazurile n care un obiect devine automat candidat la stergere (prin stergere nt eleg andu-se eliberarea zonei de memorie alocate pentru el la crearea sa) este atunci c and nu mai exist a nici o referint a spre el. In exemplul de mai jos, primul obiect instant iat va deveni candidat la stergere deoarece v refer a dup a a doua instruct iune un alt obiect si nu exist a o alt a referint a spre primul obiect creat. Este sarcina colectorului de reziduuri (garbage collector - GC) s a elibereze memoria ocupat a de primul obiect.
Valoare v; v = new Valoare(5); v = new Valoare(10);

Nu este obligatoriu ca un obiect s a e sters din memorie imediat ce dispare ultima referint a la el. Cert este c a el devine candidat la stergere iar momentul n care se nt ampl a stergerea depinde de gradul de ocupare al memoriei heap. Putem fort a stergerea din memorie a tuturor obiectelor candidate pentru aceast a operat ie invoc and explicit colectorul de reziduuri System.gc(). Atunci c and colectorul de reziduuri elibereaz a zona de memorie ocupat a de un obiect, el invoc a metoda nalize:
protected void finalize() throws Throwable

Evident, aceast a metod a trebuie modicat a atunci c and e nevoie s a se efectueze anumite operat ii speciale la stergerea unui obiect din memorie. E posibil ca un obiect s a nu e colectat de c atre GC pe ntreg parcursul execut iei unui program, caz n care metoda nalize nu va deloc apelat a.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

52

LECT IA 3. TRANSMITEREA MESAJELOR

3.5

Exercit ii

1. Metodele de mai jos sunt supra nc arcate?


public void faCeva(int x) {...} public int faCeva(int x) {...}

2. O carte este caracterizat a printr-un num ar de pagini. Spunem c a dou a c art i sunt identice dac a acestea au acela si num ar de pagini. Creat i clasa Carte si ata sat i-i o metod a potrivit a pentru compararea a dou a c art i. Apelat i metoda care realizeaz a compararea a dou a c art i ntr-o metod a main. 3. Un p atrat este caracterizat de latura sa. Scriet i o clas a Patrat ce are doi constructori, un constructor f ar a nici un parametru care seteaz a latura p atratului ca ind 10 iar altul care seteaz a latura cu o valoare egal a cu cea a unui parametru transmis constructorului. Ata sat i clasei o metod a potrivit a pentru tip arirea unui p atrat sub forma Patrat l Aria a, unde l este valoarea laturii iar a este valoarea ariei p atratului. Creat i ntr-o metod a main diferite obiecte de tip Patrat si tip arit i-le. 4. Creat i o clas a Piramida ce are un atribut ntreg n. Ata sat i clasei o metod a potrivit a pentru tip arirea unei piramide ca mai jos:
1 2 3 4 1 1 1 2 2 3 --> n

Creat i ntr-o metod a main diferite obiecte de tip Piramida si tip arit i-le. 5. Denit i o clas a Suma cu metodele statice de mai jos:
// returneaza suma dintre a si b a) public static int suma(int a, int //returneaza suma dintre a, b si c b) public static int suma(int a, int // returneaza suma dintre a, b, c si c) public static int suma(int a, int b) ... b, int c) ... d b, int c, int d) ...

Implementat i metodele astfel nc at ecare metod a s a efectueze o singur a adunare. Apelat i-le dintr-o metod a main.

Bibliograe
1. Bruce Eckel. Thinking in Java.(3rd Edition). http://www.mindview.net/Books/TIJ, Capitolul 4, Initialization & Cleanup. 2. Java Language Specication. http://java.sun.com/docs/books/jls/, Capitolul 8.4, Method Declarations.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

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