Sunteți pe pagina 1din 22

Curs 7

Transferul de parametri ctre metode


Metode care ntorc o referin la un obiect
construit n corpul lor
Conceptul de tablou
TABLOU UNIDIMENSIONAL
TABLOU BIDIMENSIONAL
TABLOURI CU MAI MULI INDICI
TABLOURI ETEROGENE
Metode care au ca argumente i/sau ca valori
ntoarse referine la tablouri

Transferul de parametri ctre


metode

La invocarea unei metode, este necesar s se transmit de la metoda care


invoc la metoda invocat parametrii (argumentele) acesteia. De exemplu, la
executarea invocrii Math.sin(a), este necesar s se transmit ctre
metoda sin argumentul acesteia, a.

n teoria i practica programrii se cunosc diferite moduri n car se


poate face transmiterea argumentelor ctre o funcie sau procedur:
- transmitere prin valoare: de la programul apelant ctre funcie
(procedur) se transmit valorile argumentelor;
- transmitere prin adresa: de la programul apelant ctre funcie
(procedur) se transmit adresele la care se gsesc n memorie valorile
argumentelor;
- transmitere prin nume: de la programul apelant ctre funcie
(procedur) se transmit numele argumentelor;
- transmitere prin referin: de la programul apelant la funcie
(procedur) se transmit referine ctre argumente.

n limbajul Java, transmiterea parametrilor (argumentelor)


metodelor se face prin valoare. Aceasta nseamn c:
- dac argumentul aparine unui tip de date primitiv, se
transmite chiar valoarea primitiv a argumentului respectiv;
- dac argumentul aparine unui tip-referin (este instan a
unei clase), se transmite - de fapt - o referin ctre un obiect din
clasa respectiva sau dintr-o clasa derivat din aceasta.
Exemplu
S considerm metoda
int indexOf(String str, int fromIndex) din clasa String.
Primul argument al acestei metode este o referin la un obiect din clasa
String, iar al doilea argument este o valoare primitiv de tip int. n
limbajul Java, cei doi parametri str si fromIndex sunt considerai variabile
locale ale metodei indexOf, iar transmiterea parametrilor este echivalent
cu operaia de atribuire.
n consecin, dac se invoc aceast metod sub forma indexOf("abc", 3),
variabilei-referin str i se atribuie ca valoare referina la sirul "abc" (i
nu insui irul "abc", care rmne la locul lui n memoria dinamic), n timp
ce variabilei fromIndex de tip int i se atribuie valoarea primitiv 3.

In teoria programrii, argumentele (parametrii) care apar n declaraia


unei metode (funcii, proceduri) se numesc parametri formali, iar valorile
prin care se substituie aceti parametri formali la invocarea metodei
respective se numesc parametri efectivi.
str, fromIndex sunt parametri formali ai metodei indexOf,
"abc", 3 sunt parametri efectivi.

Consecina faptului c parametrii metodelor se transmit


prin valoare este urmtoarea:
chiar dac n corpul unei metode se atribuie unui argument
formal al acesteia o nou valoare, aceast atribuire nu
modific valoarea argumentului efectiv corespunztor din
programul apelant.
Daca ns, n cazul unui argument-referin, nu se modifica
referina nsi, ci valorile cmpurilor obiectului indicat de
ctre aceasta, modificarea respectiv se va transmite i
la programul apelant, constituind efectul lateral al
metodei respective.

Metode care ntorc o referin


la un obiect construit n corpul
lor
n limbajul Java este posibil ca o metod s ntoarc o referin la un
obiect construit n interiorul ei.

TestRef

Se observ c metoda1 a ntors corect referina ctre


irul "un sir" care a fost creat n interiorul ei.
n schimb, metoda2 nu a avut ca efect lateral
transmiterea catre variabila-referin sir2 din main a
referinei ctre obiectul "alt sir" creat n aceast
metod deoarece, dup cum s-a artat anterior,
transmiterea parametrilor se face prin valoare i deci
modificarea n corpul metodei a valorii parametrului
formal s nu afecteaz valoarea parametrului efectiv
str2 prin care acesta a fost substituit la invocarea
metodei respective.

Conceptul de tablou
Tabloul (n englez Array) este o structur de date
de acelasi tip, numite componente ale tabloului,
care sunt specificate prin indici.
n programare, tabloul poate fi privit ca o colecie
indexat de variabile de acelai tip.
In limbajul Java, tablourile (engl.: Arrays) sunt
considerate obiecte care aparin unor clase
descendente din clasa Object.

TABLOU UNIDIMENSIONAL
De exemplu x=[x0, x1, ... , xn-1] este un vector cu n
componente( x[n] ).
Componentele au acelai "nume" cu vectorul, dar se
disting prin indici, care specific poziia componentei
respective n cadrul tabloului.
n limbajul Java, la fel ca n limbajele C/C++, indicii sunt
cuprinsi in intervalul [0,length-1],unde length reprezinta
lungimea tabloului(nr de componente).
La nivel conceptual, se consider c tabloul ocup o zon
compact de memorie, n care componentele sale sunt
aezate n ordinea cresctoare a indicilor, din care
cauz mai este numit i masiv.

Declararea i iniializarea
tablourilor cu un singur indice

int a, b, c[], d, e[];


String s1, ts1[], s2;

n aceste declaraii, a, b, i d sunt variabile simple de tip double, deci


ele pot primi valori simple de acest tip, iar s1 i s2 sunt variabile
referin la obiecte din clasa String (la iruri de caractere). n
schimb, c[] i e[] sunt variabile referin la tablouri de tip int
(tablouri la care toate componentele sunt de tip int), iar ts1[] este o
variabil referin la un tablou cu componente din clasa String.

int[] i, j;
long [] k, m;
float []u, v;
String[] ww;

Variabilele i, j, k, m, u, v, ww sunt referine la tablouri cu componente


de tipuri corespunztoare fiecarei declaraii. Remarcm c nu are
importan dac parantezele sunt puse imediat dup numele tipului sau
clasei (far spaiu liber) sau ntre acestea exist unul sau mai multe
spaii.
-

Iniializarea tablourilor unidimensionale se poate face, de asemenea, n


dou moduri:

int a=27, b=-15, c[]={-3,72,-21},d=-5,e[]={231,-98};


String s1="un sir", ts1[]={"sirul 0", "sirul 1",
"sirul 2"}, s2="alt sir";
float[] u={-1.24076f, 0.03254f, 27.16f},
v={2.7698E12f, -3.876e7f};
Remarcm c n ultima declaraie nu s-au mai pus paranteze dup
numele variabilelor, deoarece ele apar dup numele tipului.

double aa[]=new double[3];


String str[]=new String[2];
n primul caz, se aloc n memorie spaiu pentru un tablou cu 3
componente de tip double, iar variabilei aa i se d ca valoare referina
la acest tablou. n al doilea caz, se aloc n memorie un tablou de
variabile referin la obiecte din clasa String, iar variabilei str i se d
ca valoare referina la acest tablou.

TABLOU BIDIMENSIONAL
Exemplu : Matricea.
Componentele matricei sunt ordonate pe dou direcii n
spaiu, iar poziia fiecrei componente este indicat
prin doi indici: primul specific linia, iar al doilea coloana
n care se gsete componenta respectiv.
Iat un exemplu de matrice cu 4 linii i 5 coloane: a[4]
[5]

a00

a01

a02

a03

a04

a10

a11

a12

a13

a14

a20

a21

a22

a23

a24

a30

a31

a32

a33

a34

Declararea i iniializarea
tablourilor cu doi indici

double u, v[], w[][];


int[] a, b[];
char[][] h1, h2;
String ts[][];

Conform acestor declaraii:


- u este o variabil simpl de tip double;
- v este un tablou unidimensional, iar w un tablou
bidimensional, ambele cu componente de tip double;
- a este un tablou unidimensional, iar b un tablou
bidimensional, ambele cu componente de tip int;
- h1 i h2 sunt tablouri bidimensionale cu componente
de tip char;
- ts este un tablou bidimensional, avnd drept
componente referine la String

Iniializarea

double u=5.3127, v[]={1,25, -3.12, 2,6},


w[][]={{2.31,-4.15},{0.35,-12.6,-573.2},{10.9}};
int[] a={3,2,7}, b[]={{43,28,92,-6},{},{-1,17,29}};
char[][] h1={{'a','*'},{'+','$'}}, h2=new char[2][3],
h3=new char[4][];
String ts[][]={{"abc","defg"},{"AB","CD","EF","GH"}};

Remarcam ca, la forma de iniializare cu acolade, tabloul bidimensional


este tratat ca un tablou (acoladele exterioare) care are drept
componente alte tablouri (acoladele interioare). Acestea din urm
reprezint "liniile" tabloului bidimensional i pot avea lungimi diferite,
unele din ele putnd avea chiar lungimea zero (n acest caz acoladele
respective nu conin nimic), ca n cazul liniei a doua a tabloului b.
La folosirea operatorului new exist urmatoarele posibiliti de
iniializare:

a/ se indic att numrul de linii, ct i numrul de coloane, de


ex. new int[7][4]; n acest caz, se iniializeaz o matrice, n care
toate liniile au acelai numr de componente. n exemplul nostru,
matricea are 7 linii i 4 coloane, toate cele 7x4=28 componente fiind
iniializate cu valorile implicite ale tipului respectiv (n cazul de fa
zero);

b/ se indic numai numrul de linii, de exemplu: new int[7][]. n


acest caz se iniializeaza, de fapt, numai "vectorul coloan" care
contine referine (deocamdata nule) ctre linii care, deocamdat, nu
exist, urmnd sa fie atribuite ulterior.

Operaii cu tablouri
bidimensionale
Numrul de componente

tim c fiecrui tablou unidimensional i este asociat o variabil


length, care are ca valoare "lungimea" tabloului, adic numrul de
componente ale acestuia.
Ce reprezint variabila length n cazul unui tablou bidimensional? Sa
privim figura .
ntrucat w.length este numrul de componente din tabloul
unidimensional referit de variabila w, nseamn c el este egal cu
numrul de linii al tabloului bidimensional.
n schimb, numrul de componente din linia referit de componenta
w[i] a tabloului w este dat de variabila w[i].length. De exemplu,
numrul de componente din linia de indice 0 este w[0].length.

Referirea la componentele tabloului


Pentru a indica o anumit component a unui tablou bidimensional, se
folosete variabila referin la tablou, nsoit de indicii componentei
respective.
De exemplu: w[i][j] este componenta situata n linia i i coloana j a
tabloului referit de variabila w.
Indicii pot fi literali ntregi, variabile sau expresii de tip ntreg, de
exemplu w[2*k-1][j-3].
Componentele de tablou astfel referite pot fi folosite n orice expresii
din program, la fel ca variabilele simple.
t=2*w[1][0]*Math.cos(3.5*w[1][1]-0.23);
w[j][k+1]=2*w[j-1][k]-w[j][k-1];

OBSERVATIE!!!
Trebuie avut grij ca indicii s nu ias din
domeniile admise pentru fiecare din ei deoarece, n caz
contrar, vor apare excepii la executarea programului.

TABLOURI CU MAI MULI INDICI


Pot exista i tablouri cu mai mult de dou
dimensiuni. Astfel, un tablou tridimensional poate
fi imaginat ca un volum (o carte), avnd mai multe
pagini, fiecare pagin fiind un tablou bidimensional
(o matrice). n acest caz, primul indice specific
linia, al doilea - coloana, iar al treilea - pagina n
care se gsete componenta respectiv. n mod
similar, un tablou cu patru dimensiuni poate fi
privit ca o serie de volume; fiecare component, n
acest caz, are patru indici, cel de al patrulea fiind
numrul volumului n cadrul seriei. Putem, desigur,
continua raionamentul i pentru tablouri cu mai
muli indici.

TABLOURI ETEROGENE
Prin definiie, componentele unui tablou trebuie s fie toate de acelai
tip. n programarea orientat pe obiecte, aceast restricie a fost
"relaxat", n sensul c un tablou poate avea drept componente i
obiecte aparinnd claselor descendente din clasa de baz. Faptul c
clasa Object este superclas a oricrei alte clase din limbajul Java,
inclusiv a claselor de tablouri, permite s se creeze tablouri eterogene,
adic tablouri cu componente care aparin unor clase foarte diferite.
Acestea pot fi structuri complicate de date, realizate pornind de la
structura de "tablou de obiecte". S consideram, de exemplu,
structura de date din figura.

Metode care au ca argumente


i/sau ca valori ntoarse
referine la tablouri
n limbajul Java, tablourile sunt obiecte. n
consecin, dac parametrii formali ai unei metode
sunt tablouri, numele lor sunt, de fapt, variabilereferin. De exemplu, n signatura metodei main
main(String args[])

parametrul formal args[] este o referin la un tablou,


ale crui elemente aparin clasei String (sunt iruri de
caractere). n consecin, tot ce s-a prezentat n
seciunea anterioar cu privire la folosirea ca
parametri formali a variabilelor- referin este valabil
i pentru tablouri.

Urmrind executarea programului, constatm c:


- dei parametrului formal a i s-a atribuit n interiorul metodei alpha
o referin la alt tablou, nou construit, aceasta nu a afectat tabloul
referit n metoda main prin parametrul efectiv corespunztor p;
- ntruct n metoda alpha s-au modificat valorile elementelor
tabloului referit prin parametrul formal b, aceste modificri apar i
n metoda main n tabloul referit de parametrul efectiv
corespunzatorw (deoarece b i w sunt, de fapt, referine la acelai
tablou);
- referina la tabloul c, creat n corpul metodei alpha, a fost
intoars de aceast metod i a fost atribuit n metoda main
variabilei referin q; n consecin, c i q sunt referine la acelai
tablou.
Remarcm c, la ieirea din metoda alpha, variabila local c este
eliminat de pe stiva sistemului. Cu toate acestea, tabloul creat n
metoda alpha i referit de aceast variabil local nu este eliminat
din memorie, deoarece ctre el indic n continuare variabilareferin q din metoda main.

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