Tipul referință

În limbajul Java există două categorii de tipuri de date: tipuri primitive și clase.

Tipurile primitive sunt predefinite în limbaj, în sensul că numele, mulțimea de date, mulțimea de operații și reprezentarea datelor în memoria internă a mașinii virtuale Java pentru fiecare tip sunt definite în insăși specificația limbajului Java și nu mai pot fi modificate de programatori. În program, datele de tipuri primitive apar sub forma de variabile.
 
Fiecare variabilă are un nume, un tip și o valoare și este plasată într-o anumita locație de memorie. În locația de memorie respectivă se găsește chiar valoarea variabilei. Pe programator nu il interesează insă adresa de memorie la care se găsește variabila, ci doar numele, tipul și valoarea acesteia.

Clasele sunt tipuri de date structurate specifice programării orientate pe obiecte. Clasele se definesc de programatori și se grupează în pachete de clase. La crearea unui program nou, programatorul poate utiliza clasele din pachetele deja existente, sau poate creea propriile sale clase. În program, fiecare clasă poate avea mai multe instanțe, numite obiecte.
 
Comparând clasele cu tipurile primitive, constatăm că clasa este o extensie a conceptului de tip, iar obiectul este o extensie a conceptului de variabila. Deosebirea este că o variabilă simplă este o locație de memorie care conține o valoare primitivă, în timp ce obiectul este tot o zonă de memorie, care conține însă o structură de date. 

În memoria mașinii virtuale Java, obiectele sunt plasate într-o zonă de memorie specială, numită memorie dinamică (în engleză: heap, adică "gramadă"). Localizarea în memorie a obiectelor se face cu ajutorul unor variabile speciale, numite variabile referință. Valoarea unei variabile referință nu este obiectul însuși, ci o referință la acest obiect. Din această cauză, se consideră că variabilele referintă aparțin unui tip de date numit tip referință. Mulțimea de valori a acestui tip este mulțimea referințelor, adică mulțimea locațiilor (adreselor) din memoria dinamică. Operațiile permise asupra datelor de tip referința sunt cele date de operatorii de atribuire (=),egalitate (==) și inegalitate (!=) care au aceleași semnificații și mod de utilizare ca pentru toate celelalte tipuri de date.
 
Referințele din Java sunt similare pointerilor din unele limbaje de programare tradiționale, cum sunt Pascal și C. Există, totuși, deosebiri importante:
  - valorile variabilelor-pointer sunt adrese din memorie care pot fi cunoscute de programator (de exemplu pot fi afișate) De asemenea, unei variabile-pointer i se poate atribui ca valoare o adresa dată explicit. În schimb, adresele la care se găsesc în memorie obiectele indicate de referințele din Java nu pot fi cunoscute de utilizator;
  - în limbajele tradiționale, pointerii pot indica nu numai adresele în memorie ale unor structuri de date, ci și pe cele ale unor variabile simple. În java, referințele pot fi folosite numai pentru obiecte;
  - în limbajele traditionale (de exemplu în C/C++) se pot face asupra pointerilor operatii aritmetice, ceeace nu este permis asupra referințelor în Java.

Declararea variabilelor referință

Declararea variabilelor referință se poate face la fel cu declararea variabilelor de tipuri primitive. Singura deosebire constă în faptul că, în locul tipului primitiv, se folosește un nume de clasa. De exemplu, declarația
    String s1, s2, s3;
arată că s1, s2 si s3 sunt variabile referință către obiecte din clasa String, adică din clasa șirurilor de caractere.
 
Atentie: s1, s2 si s3 nu sunt șiruri de caractere (adică obiecte din clasa String) ci sunt doar referințe către șiruri de caractere. Aceasta înseamnă că valoarea fiecăreia deintre ele nu este un obiect, ci o referință la obiect. Obiectul propriu-zis nu se găsește în memorie în același loc cu variabila, ci undeva în memoria dinamică. 
Prin contrast, în cazul declararii unor variabile primitive, de exemplu
    int i1,i2,i3;
variabilele i1, i2 si i3 sunt numere de tip int, adică au ca valori astfel de numere.

Vom arăta ulterior și modul în care pot fi inițializate variabilele referință.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați