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. |
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ță.