Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Variabile JAVA
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 
q6h14hq
5.1.1 Declaratii de variabile

5.1.1.1 Tipul unei variabile
5.1.1.2 Numele variabilelor
5.1.1.3 Initializarea variabilelor

5.1.2 Tipuri primitive

5.1.2.1 Tipul boolean
5.1.2.2 Tipul caracter
5.1.2.3 Tipuri intregi

5.1.2.3.1 Tipul octet
5.1.2.3.2 Tipul intreg scurt
5.1.2.3.3 Tipul intreg
5.1.2.3.4 Tipul intreg lung

5.1.2.4 Tipuri flotante

5.1.2.4.1 Tipul flotant
5.1.2.4.2 Tipul flotant dublu
5.1.2.4.3 Reali speciali definiti de IEEE

5.1.3 Tipuri referinta

5.1.3.1 Tipul referinta catre o clasa
5.1.3.2 Tipul referinta catre o interfata
5.1.3.3 Tipul referinta catre un tablou

5.1.4 Clasa de memorare

5.1.4.1 Variabile locale
5.1.4.2 Variabile statice
5.1.4.3 Variabile dinamice

5.1.5 Tablouri de variabile

5.1.5.1 Declaratia variabilelor de tip tablou
5.1.5.2 Initializarea tablourilor.
5.1.5.3 Lungimea tablourilor
5.1.5.4 Referirea elementelor din tablou
5.1.5.5 Alocarea si eliberarea tablourilor

5.1.6 Conversii

5.1.6.1 Conversii de extindere a valorii
5.1.6.2 Conversii de trunchiere a valorii
5.1.6.3 Conversii pe tipuri referinta
5.1.6.4 Conversii la operatia de atribuire
5.1.6.5 Conversii explicite
5.1.6.6 Conversii de promovare aritmetica

5.1.1 Declaratii de variabile
O variabila in limbajul Java este o locatie de memorie care poate pastra o valoare de un anumit tip. In ciuda denumirii, exista variabile care isi pot modifica valoarea si variabile care nu si-o pot modifica, numite in Java variabile finale. Orice variabila trebuie sa fie declarata pentru a putea fi folosita. Aceasta declaratie trebuie sa contina un tip de valori care pot fi memorate in locatia rezervata variabilei si un nume pentru variabila declarata. In functie de locul in sursa programului in care a fost declarata




variabila, aceasta primeste o clasa de memorare locala sau statica. Aceasta clasa de memorare defineste intervalul de existenta al variabilei in timpul executiei.

In forma cea mai simpla, declaratia unei variabile arata in felul urmator:

Tip NumeVariabila a, NumeVariabilai*;
5.1.1.1 Tipul unei variabile
Tipul unei variabile poate fi fie unul dintre tipurile primitive definite de limbajul Java fie o referinta. Creatorii limbajului Java au avut grija sa

defineasca foarte exact care sunt caracteristicile fiecarui tip primitiv in parte si care este setul de valori care se poate memora in variabilele care au tipuri primitive. In plus, a fost exact definita si modalitatea de reprezentare a acestor tipuri primitive in memorie. In acest fel, variabilele Java devin independente de platforma hardware si software pe care lucreaza.

In acelasi spirit, Java defineste o valoare implicita pentru fiecare tip de data, in cazul in care aceasta nu a primit nici o valoare de la utilizator. In acest fel, stim intotdeauna care este valoarea cu care o variabila intra in calcul. Este o practica buna insa aceea ca programele sa nu depinda niciodata de aceste initializari implicite.

5.1.1.2 Numele variabilelor
Numele variabilei poate fi orice identificator Java. Conventia nescrisa de formare a numelor variabilelor este aceea ca orice variabila care nu este finala are un nume care incepe cu litera minuscula in timp ce

variabilele finale au nume care contin numai majuscule. Daca numele unei variabile care nu este finala contine mai multe cuvinte, cuvintele incepand cu cel de-al doilea se scriu cu litere minuscule dar cu prima litera majuscula. Exemple de nume de variabile care nu sunt finale ar putea fi:

culoarea numarulDePasi urmatorulElement
Variabilele finale ar putea avea nume precum:

PORTOCALIUVERDEALBASTRUDESCHIS
5.1.1.3 Initializarea variabilelor
Limbajul Java permite initializarea valorilor variabilelor chiar in momentul declararii acestora. Sintaxa este urmatoarea:

Tip NumeVariabila = ValoareInitiala;
Desigur, valoarea initiala trebuie sa fie de acelasi tip cu tipul variabilei sau sa poata fi convertita intr-o valoare de acest tip.

Desi limbajul Java ne asigura ca toate variabilele au o valoare initiala bine precizata, este preferabil sa executam aceasta initializare in mod explicit pentru fiecare declaratie. In acest fel marim claritatea propriului cod.

Regula ar fi deci urmatoarea: nici o declaratie fara initializare.

5.1.2 Tipuri primitive
5.1.2.1 Tipul boolean
Tipul boolean este folosit pentru memorarea unei valori de adevar. Pentru acest scop, sunt suficiente doar doua valori: adevarat si fals. In Java aceste doua valori le vom nota prin literalii true si respectiv false.

Aceste valori pot fi reprezentate in memorie folosindu-ne de o singura cifra binara, adica pe un bit.

Valorile booleene sunt foarte importante in limbajul Java pentru ca ele sunt valorile care se folosesc in conditiile care controleaza instructiunile repetitive sau cele conditionale. Pentru a exprima o conditie este suficient sa scriem o expresie al carui rezultat este o valoare booleana, adevarat sau fals.

Valorile de tip boolean nu se pot transforma in valori de alt tip in mod nativ. La fel, nu exista transformare nativa dinspre celelalte valori inspre tipul boolean. Cu alte cuvinte, avand o variabila de tip boolean nu putem memora in interiorul acesteia o valoare intreaga pentru ca limbajul Java nu face pentru noi nici un fel de presupunere legata de ce inseamna o anumita valoare intreaga din punctul de vedere al valorii de adevar. La fel, daca avem o variabila intreaga, nu ii putem atribui o valoare de tip boolean.

Orice variabila booleana nou creata primeste automat valoarea implicita false. Putem modifica aceasta comportare specificand in mod explicit o valoare initiala true dupa modelul pe care il vom descrie mai tarziu.

Pentru a declara o variabila de tip boolean, in Java vom folosi cuvantul rezervat boolean ca in exemplele de mai jos:

boolean terminat; boolean areDreptate;
Randurile de mai sus reprezinta declaratia a doua variabile de tip boolean numite terminatrespectiv areDreptate. Cele doua variabile au, dupa declaratie, valoarea false. Adica nu e terminat dar nici n-are dreptate.

5.1.2.2 Tipul caracter
Orice limbaj de programare ne ofera intr-un fel sau altul posibilitatea de a lucra cu caractere grafice care sa reprezinte litere, cifre, semne de punctuatie, etc. In cazul limbajului Java acest lucru se poate face folosind tipul primitiv numit tip caracter.

O variabila de tip caracter poate avea ca valoare coduri Unicode reprezentate pe 16 biti, adica doi octeti. Codurile reprezentabile astfel sunt foarte multe, putand acoperi caracterele de baza din toate limbile scrise existente.

In Java putem combina mai multe caractere pentru a forma cuvinte sau siruri de caractere mai lungi. Totusi, trebuie sa precizam ca aceste siruri de caractere nu trebuiesc confundate cu tablourile de caractere pentru ca ele contin in plus informatii legate de lungimea sirului.

Codul nu este altceva decat o corespondenta intre numere si caractere fapt care permite conversii intre variabile intregi si caractere in ambele sensuri. O parte din aceste transformari pot sa altereze valoarea originala din cauza dimensiunilor diferite ale zonelor in care sunt memorate cele doua tipuri de valori. Convertirea caracterelor in numere si invers poate sa fie utila la prelucrarea in bloc a caracterelor, cum ar fi trecerea tuturor literelor minuscule in majuscule si invers.

Atunci cand declaram un caracter fara sa specificam o valoare initiala, el va primi automat ca valoare implicita caracterul nullal codului Unicode, \u0000?.

Pentru a declara o variabila de tip caracter folosim cuvantul rezervat char ca in exemplele urmatoare:

char primaLitera; char prima, ultima;
In cele doua linii de cod am declarat trei variabile de tip caracter care au fost automat initializate cu caracterul null. In continuare, vom folosi interschimbabil denumirea de tip caracter cu denumirea de tip char, care are avantajul ca este mai aproape de declaratiile Java.

5.1.2.3 Tipuri intregi
5.1.2.3.1 Tipul octet
Intre tipurile intregi, acest tip ocupa un singur octet de memorie, adica opt cifre binare. Intr-o variabila de tip octet sunt reprezentate intotdeauna valori cu semn, ca de altfel in toate variabilele de tip intreg definite in limbajul Java. Aceasta conventie simplifica schema de tipuri primitive care, in cazul altor limbaje include separat tipuri intregi cu semn si fara.

Fiind vorba de numere cu semn, este nevoie de o conventie de reprezentare a semnului. Conventia folosita de Java este reprezentarea in complement fata de doi. Aceasta reprezentare este de altfel folosita de majoritatea limbajelor actuale si permite memorarea, pe 8 biti a 256 de numere incepand de la -128 pana la 127. Daca aveti nevoie de numere mai mari in valoare absoluta, apelati la alte tipuri intregi.

Valoarea implicita pentru o variabila neinitializata de tip octet este valoarea 0 reprezentata pe un octet.

Iata si cateva exemple de declaratii care folosesc cuvantul Java rezervat byte:

byte octet; byte eleviPeClasa;
In continuare vom folosi interschimbabil denumirea de tip octet cu cea de tip byte.

5.1.2.3.2 Tipul intreg scurt
Tipul intreg scurt este similar cu tipul octet dar valorile sunt reprezentate pe doi octeti, adica 16 biti. La fel ca si la tipul octet, valorile

sunt intotdeauna cu semn si se foloseste reprezentarea in complement fata de doi. Valorile de intregi scurti reprezentabile sunt de la -32768 la 32767 iar valoarea implicita este 0 reprezentat pe doi octeti.

Pentru declararea variabilelor de tip intreg scurt in Java se foloseste cuvantul rezervat short, ca in exemplele urmatoare:

short i, j; short valoareNuPreaMare;
In continuare vom folosi interschimbabil denumirea de tip intreg scurt si cea de tip short.

5.1.2.3.3 Tipul intreg
Singura diferenta dintre tipul intreg si tipurile precedente este faptul ca valorile sunt reprezentate pe patru octeti adica 32 biti. Valorile reprezentabile sunt de la -2147483648 la 2147483647 valoarea implicita fiind 0. Cuvantul rezervat este int ca in:

int salariu;
In continuare vom folosi interschimbabil denumirea de tip intreg si cea de tip int.

5.1.2.3.4 Tipul intreg lung
In fine, pentru cei care vor sa reprezinte numerele intregi cu semn pe 8 octeti, 64 de biti, exista tipul intreg lung. Valorile reprezentabile sunt de la -9223372036854775808 la 9223372036854775807 iar valoarea implicita este 0L.

Pentru cei care nu au calculatoare care lucreaza pe 64 de biti este bine de precizat faptul ca folosirea acestui tip duce la operatii lente pentru ca nu exista operatii native ale procesorului care sa lucreze cu numere asa de mari.

Declaratia se face cu cuvantul rezervat long. In continuare vom folosi interschimbabil denumirea de tip intreg lung cu cea de tip long.

5.1.2.4 Tipuri flotante
Acest tip este folosit pentru reprezentarea numerelor reale sub forma de exponent si cifre semnificative. Reprezentarea se face pe patru octeti, 32 biti, asa cum specifica standardul IEEE 754.

5.1.2.4.1 Tipul flotant
Valorile finite reprezentabile intr-o variabila de tip flotant sunt de forma:

sm2e unde s este semnul +1 sau -1, m este partea care specifica cifrele reprezentative ale numarului, numita si mantisa, un intreg pozitiv mai mic decat 224 iar e este un exponent intreg intre -149 si 104.

Valoarea implicita pentru variabilele flotante este 0.0f. Pentru declararea unui numar flotant, Java defineste cuvantul rezervat float. Declaratiile se fac ca in exemplele urmatoare:

float procent; float noi, ei;
In continuare vom folosi interschimbabil denumirea de tip flotant si cea de tip float.

5.1.2.4.2 Tipul flotant dublu
Daca valorile reprezentabile in variabile flotante nu sunt destul de precise sau destul de mari, puteti folosi tipul flotant dublu care foloseste opt octeti pentru reprezentare, urmand acelasi standard IEEE 754

Valorile finite reprezentabile cu flotanti dubli sunt de forma:

sm2e unde s este semnul +1 sau -1, m este mantisa, un intreg pozitiv mai mic decat 253 iar e este un exponent intreg intre -1045 si 1000. Valoarea implicita in acest caz este 0.0d.

Pentru a declara flotanti dubli, Java defineste cuvantul rezervat double ca in:

double distantaPanaLaLuna;

In continuare vom folosi interschimbabil denumirea de tip flotant dublu si cea de tip double.

In afara de valorile definite pana acum, standardul IEEE defineste cateva valori speciale reprezentabile pe un flotant sau un flotant dublu.

5.1.2.4.3 Reali speciali definiti de IEEE
Prima dintre acestea este NaN (Not a Number), valoare care se obtine atunci cand efectuam o operatie a carei rezultat nu este definit, de exemplu 0.0 / 0.0.

In plus, standardul IEEE defineste doua valori pe care le putem folosi pe post de infinit pozitiv si negativ. Si aceste valori pot rezulta in urma unor calcule.

Aceste valori sunt definite sub forma de constante si in ierarhia standard Java, mai precis in clasa java.lang.Float si respectiv in java.lang.Double. Numele constantelor este POSITIVE_INFINITY, NEGATIVE_INFINITY, NaN.

In plus, pentru tipurile intregi si intregi lungi si pentru tipurile flotante exista definite clase in ierarhia standard Java care se numesc respectiv java.lang.Integer, java.lang.Long, java.lang.Float si java.lang.Double. In fiecare dintre aceste clase numerice sunt definite doua constante care reprezinta valorile minime si maxime care se pot reprezenta in tipurile respective. Aceste doua constante se numesc in mod uniform MIN_VALUE si MAX_VALUE.

5.1.3 Tipuri referinta
Tipurile referinta sunt folosite pentru a referi un obiect din interiorul unui alt obiect. In acest mod putem inlantui informatiile aflate in memorie.

Tipurile referinta au, la fel ca si toate celelalte tipuri o valoare implicita care este atribuita automat oricarei variabile de tip referinta care nu a fost initializata. Aceasta valoare implicita este definita de catre limbajul Java prin cuvantul rezervat null.

Puteti intelege semnificatia referintei nule ca o referinta care nu trimite nicaieri, a carei destinatie nu a fost inca fixata.

Simpla declaratie a unei referinte nu duce automat la rezervarea spatiului de memorie pentru obiectul referit. Singura rezervare care se face este aceea a spatiului necesar memorarii referintei in sine. Rezervarea obiectului trebuie facuta explicit in program printr-o expresie de alocare care foloseste cuvantul rezervat new.

O variabila de tip referinta nu trebuie sa trimita pe tot timpul existentei sale catre acelasi obiect in memorie. Cu alte cuvinte, variabila isi poate schimba locatia referita in timpul executiei.

5.1.3.1 Tipul referinta catre o clasa
Tipul referinta catre o clasa este un tip referinta care trimite catre o instanta a unei clasei de obiecte. Clasa instantei referite poate fi oricare clasa valida definita de limbaj sau de utilizator.

Clasa de obiecte care pot fi referite de o anumita variabila de tip referinta la clasa trebuie declarata explicit. De exemplu, pentru a declara o referinta catre o instanta a clasei Minge, trebuie sa folosim urmatoarea sintaxa:

Minge mingeaMea;
Din acest moment, variabila referinta de clasa numita mingeaMea va putea pastra doar referinte catre obiecte de tip Minge sau catre obiecte apartinand unor clase derivate din clasa Minge. De exemplu, daca avem o alta clasa, derivata din Minge, numita MingeDeBaschet, putem memora in referinta mingeaMea si o trimitere catre o instanta a clasei MingeDeBaschet.

In mod general insa, nu se pot pastra in variabila mingeaMea referinte catre alte clase de obiecte. Daca se incerca acest lucru, eroarea va fi semnalata chiar in momentul compilarii, atunci cand sursa programului este examinata pentru a fi transformata in instructiuni ale masinii virtuale Java.

Sa mai observam ca o referinta catre clasa de obiecte Object, radacina ierarhiei de clase Java, poate pastra si o referinta catre un tablou. Mai multe lamuriri asupra acestei afirmatii mai tarziu.

5.1.3.2 Tipul referinta catre o interfata
Tipul referinta catre o interfata permite pastrarea unor referinte catre obiecte care respecta o anumita interfata. Clasa obiectelor referite poate fi oricare, atata timp cat clasa respectiva implementeaza interfata ceruta.

Declaratia se face cu urmatoarea sintaxa:

ObiectSpatioTemporal mingeaLuiVasile;
in care tipul este chiar numele interfetei cerute. Daca clasa de obiecte Minge declara ca implementeaza aceasta interfata, atunci variabila referinta mingeaLuiVasile poate lua ca valoare referinta catre o instanta a clasei Minge sau a clasei MingeDeBaschet.

Prin intermediul unei variabile referinta catre o interfata nu se poate apela decat la functionalitatea ceruta in interfata respectiva, chiar daca obiectele reale ofera si alte facilitati, ele apartinand unor clase mai bogate in metode.

5.1.3.3 Tipul referinta catre un tablou
Tipul referinta catre un tablou este un tip referinta care poate pastra o trimitere catre locatia din memorie a unui tablou de elemente. Prin intermediul acestei referinte putem accesa elementele tabloului furnizand indexul elementului dorit.

Tablourile de elemente nu exista in general ci ele sunt tablouri formate din elemente de un tip bine precizat. Din aceasta cauza, atunci cand declaram o referinta catre un tablou, trebuie sa precizam si de ce tip sunt elementele din tabloul respectiv.

La declaratia referintei catre tablou nu trebuie sa precizam si numarul de elemente din tablou.

Iata cum se declara o referinta catre un tablou de intregi lungi:

long numereai;
Numele variabilei este numere. Un alt exemplu de declaratie de referinta catre un tablou:

Minge echipamentai;
Declaratia de mai sus construieste o referinta catre un tablou care pastreaza elemente de tip referinta catre o instanta a clasei Minge. Numele variabilei referinta este echipament. Parantezele drepte de dupa numele variabilei specifica faptul ca este vorba despre un tablou.

Mai multe despre tablouri intr-un paragraf urmator.

5.1.4 Clasa de memorare
Fiecare variabila trebuie sa aiba o anumita clasa de memorare. Aceasta clasa ne permite sa aflam care este intervalul de existenta si vizibilitatea unei variabile in contextul executiei unui program.

Este important sa intelegem exact aceasta notiune pentru ca altfel vom incerca sa referim variabile inainte ca acestea sa fi fost create sau dupa ce au fost distruse sau sa referim variabile care nu sunt vizibile din zona de program in care le apelam. Solutia simpla de existenta a tuturor variabilelor pe tot timpul executiei este desigur afara din discutie atat din punct de vedere al eficientei cat si a elegantei si stabilitatii codului.

5.1.4.1 Variabile locale
Aceste variabile nu au importanta prea mare in contextul intregii aplicatii, ele servind la rezolvarea unor probleme locale. Variabilele locale sunt declarate, rezervate in memorie si utilizate doar in interiorul unor blocuri de instructiuni, fiind distruse automat la iesirea din aceste blocuri. Aceste variabile sunt vizibile doar in interiorul blocului in care au fost create si in subblocurile acestuia.

5.1.4.2 Variabile statice
Variabilele statice sunt in general legate de functionalitatea anumitor clase de obiecte ale caror instante folosesc in comun aceste variabile. Variabilele statice sunt create atunci cand codul specific clasei in care au fost declarate este incarcat in memorie si nu sunt distruse decat atunci cand acest cod este eliminat din memorie.

Valorile memorate in variabile statice au importanta mult mai mare in aplicatie decat cele locale, ele pastrand informatii care nu trebuie sa se piarda la disparitia unei instante a clasei. De exemplu, variabila in care este memorat numarul de picioare al obiectelor din clasa Om nu trebuie sa fie distrusa la disparitia unei instante din aceasta clasa. Aceasta din cauza ca si celelalte instante ale clasei folosesc aceeasi valoare. Si chiar daca la un moment dat nu mai exista nici o instanta a acestei clase, numarul de picioare ale unui Om trebuie sa fie accesibil in continuare pentru interogare de catre celelalte clase.

Variabilele statice nu se pot declara decat ca variabile ale unor clase si contin in declaratie cuvantul rezervat static. Din cauza faptului ca ele apartin clasei si nu unei anumite instante a clasei, variabilele statice se mai numesc uneori si variabile de clasa.

5.1.4.3 Variabile dinamice
Un alt tip de variabile sunt variabilele a caror perioada de existenta este stabilita de catre programator. Aceste variabile pot fi alocate la cerere, dinamic, in orice moment al executiei programului. Ele vor fi distruse doar atunci cand nu mai sunt referite de nicaieri.

La alocarea unei variabile dinamice, este obligatoriu sa pastram o referinta catre ea intr-o variabila de tip referinta. Altfel, nu vom putea accesa in viitor variabila dinamica. In momentul in care nici o referinta nu mai trimite catre variabila dinamica, de exemplu pentru ca referinta a fost o variabila locala si blocul in care a fost declarata si-a terminat executia, variabila dinamica este distrusa automat de catre sistem printr-un mecanism numit colector de gunoaie.

Colectorul de gunoaie poate porni din initiativa sistemului sau din initiativa programatorului la momente bine precizate ale executiei.

Pentru a rezerva spatiu pentru o variabila dinamica este nevoie sa apelam la o expresie de alocare care foloseste cuvantul rezervat new. Aceasta expresie aloca spatiul necesar pentru un anumit tip de valoare. De exemplu, pentru a rezerva spatiul necesar unui obiect de tip Minge, putem apela la sintaxa:

Minge mingeaMea = new Minge(); iar pentru a rezerva spatiul necesar unui tablou de referinte catre obiecte de tip Minge putem folosi declaratia:

Minge echipamentai = new Mingea5i;
Am alocat astfel spatiu pentru un tablou care contine 5 referinte catre obiecte de tip Minge. Pentru alocarea tablourilor continand tipuri primitive se foloseste aceeasi sintaxa. De exemplu, urmatoarea linie de program aloca spatiul necesar unui tablou cu 10 intregi, creand in acelasi timp si o variabila referinta spre acest tablou, numita numere:

int numereai = new inta10i;
5.1.5 Tablouri de variabile
Tablourile servesc, dupa cum spuneam, la memorarea secventelor de elemente de acelasi tip. Tablourile unidimensionale au semnificatia vectorilor de elemente. Se poate intampla sa lucram si cu tablouri de referinte catre tablouri, in acest caz modelul fiind acela al unei matrici bidimensionale. In fine, putem extinde definitia si pentru mai mult de doua dimensiuni.

5.1.5.1 Declaratia variabilelor de tip tablou

Pentru a declara variabile de tip tablou, trebuie sa specificam tipul elementelor care vor umple tabloul si un nume pentru variabila referinta care va pastra trimiterea catre zona de memorie in care sunt memorate elementele tabloului.

Desi putem declara variabile referinta catre tablou si separat, de obicei declaratia este facuta in acelasi timp cu alocarea spatiului ca in exemplele din paragraful anterior.

Sintaxa Java permite plasarea parantezelor drepte care specifica tipul tablou inainte sau dupa numele variabilei. Astfel, urmatoarele doua declaratii sunt echivalente:

intai numere; int numereai;
Daca doriti sa folositi tablouri cu doua dimensiuni ca matricile, puteti sa declarati un tablou de referinte catre tablouri cu una dintre urmatoarele trei sintaxe echivalente:

floataiai matrice; floatai matriceai; float matriceaiai;
De precizat ca si in cazul dimensiunilor multiple, declaratiile de mai sus nu fac nimic altceva decat sa rezerve loc pentru o referinta si sa precizeze numarul de dimensiuni. Alocarea spatiului pentru elementele tabloului trebuie facuta explicit.

Despre rezervarea spatiului pentru tablourile cu o singura dimensiune am vorbit deja. Pentru tablourile cu mai multe dimensiuni, rezervarea spatiului se poate face cu urmatoarea sintaxa:

byte aiaiocteti = new bytea23ia5i;
In expresia de alocare sunt specificate in clar numarul elementelor pentru fiecare dimensiune a tabloului.

5.1.5.2 Initializarea tablourilor.
Limbajul Java permite si o sintaxa pentru initializarea elementelor unui tablou. Intr-un astfel de caz este rezervat automat si spatiul de memorie necesar memorarii valorilor initiale. Sintaxa folosita in astfel de cazuri este urmatoarea:

char aicaractere = A a, b, c, d S;
Acest prim exemplu aloca spatiu pentru patru elemente de tip caracter si initializeaza aceste elemente cu valorile dintre acolade. Dupa aceea, creeaza variabila de tip referinta numita caractere si o initializeaza cu referinta la zona de memorie care pastreaza cele patru valori.

Initializarea functioneaza si la tablouri cu mai multe dimensiuni ca in exemplele urmatoare:

int aiainumere = A
A 1, 3, 4, 5 S,
A 2, 4, 5 S,
A 1, 2, 3, 4, 5 S
S; double aiaiaireali = A
A A 0.0, -1.0 S, A 4.5 S S,
A A 2.5, 3.0 S S
S;
Dupa cum observati numarul initializatorilor nu trebuie sa fie acelasi pentru fiecare element.

5.1.5.3 Lungimea tablourilor
Tablourile Java sunt alocate dinamic, ceea ce inseamna ca ele isi pot schimba dimensiunile pe parcursul executiei. Pentru a afla numarul de elemente dintr-un tablou, putem apela la urmatoarea sintaxa:

float aitablou = new floata25i; int dimensiune = tablou.length;
// dimensiune primeste valoarea 25 sau

float aiaimultiTablou = new floata3ia4i; int dimensiune1 = multiTabloua2i.length;
// dimensiune1 primeste valoarea 4 int dimensiune2 = multiTablou.length;
// dimensiune2 primeste valoarea 3 ^
5.1.5.4 Referirea elementelor din tablou
Elementele unui tablou se pot referi prin numele referintei tabloului si indexul elementului pe care dorim sa-l referim. In Java, primul element din tablou este elementul cu numarul 0, al doilea este elementul numarul 1 si asa mai departe.

Sintaxa de referire foloseste parantezele patrate a si i. Intre ele trebuie specificat indexul elementului pe care dorim sa-l referim. Indexul nu trebuie sa fie constant, el putand fi o expresie de complexitate oarecare.

Iata cateva exemple:

int aitablou = new inta10i; tabloua3i = 1;
// al patrulea element primeste valoarea 1 float aiaireali = new floata3ia4i; realia2ia3i = 1.0f;
// al patrulea element din al treilea tablou
// primeste valoarea 1
In cazul tablourilor cu mai multe dimensiuni, avem in realitate tablouri de referinte la tablouri. Asta inseamna ca daca consideram urmatoarea declaratie:

char aiaicaractere = new char a5iai;

Figura 5.1 Elementele tabloului sunt de tip referinta, initializate implicit la valoarea null.
Variabila referinta numita caractere contine deocamdata un tablou de 5 referinte la tablouri de caractere. Cele cinci referinte sunt initializate cu null. Putem initializa aceste tablouri prin atribuiri de expresii de alocare:

caracterea0i = new char a3i; caracterea4i = new char a5i;

Figura 5.2 Noile tablouri sunt referite din interiorul tabloului original. Elementele noilor tablouri sunt caractere.
La fel, putem scrie:

char aitablouDeCaractere = caracterea0i;

Figura 5.3 Variabilele de tip referinta caracterea0i si tablouDeCaractere trimit spre acelasi tablou rezervat in memorie.
Variabila tablouDeCaractere trimite catre acelasi tablou de caractere ca si cel referit de primul element al tabloului referit de variabila caractere.

Sa mai precizam ca referirea unui element de tablou printr-un index mai mare sau egal cu lungimea tabloului duce la oprirea executiei programului cu un mesaj de eroare de executie corespunzator.

5.1.5.5 Alocarea si eliberarea tablourilor
Despre alocarea tablourilor am spus deja destul de multe. In cazul in care nu avem initializatori, variabilele sunt initializate cu valorile implicite definite de limbaj pentru tipul corespunzator. Aceasta inseamna ca, pentru tablourile cu mai multe dimensiuni, referintele sunt initializate cu null.

Pentru eliberarea memoriei ocupate de un tablou, este suficient sa taiem toate referintele catre tablou. Sistemul va sesiza automat ca tabloul nu mai este referit si mecanismul colector de gunoaie va elibera zona. Pentru a taia o referinta catre un tablou dam o alta valoare variabilei care refera tabloul. Valoarea poate fi null sau o referinta catre un alt tablou.

De exemplu:

float aireali = new floata10i;
? reali = null; // eliberarea tabloului sau reali = new floata15i; // eliberarea in alt fel sau
A float aireali = new floata10i;
?
S// eliberare automata, variabila reali a fost
// distrusa la iesirea din blocul in care a
// fost declarata, iar tabloul de 10 flotanti
// nu mai este referit ^
5.1.6 Conversii
Operatiile definite in limbajul Java au un tip bine precizat de argumente. Din pacate, exista situatii in care nu putem transmite la apelul acestora exact tipul pe care compilatorul Java il asteapta. In asemenea situatii, compilatorul are doua alternative: fie respinge orice operatie cu argumente gresite, fie incearca sa converteasca argumentele catre tipurile necesare. Desigur, in cazul in care conversia nu este posibila, singura alternativa ramane prima.

In multe situatii insa, conversia este posibila. Sa luam de exemplu tipurile intregi. Putem sa convertim intotdeauna un intreg scurt la un intreg. Valoarea rezultata va fi exact aceeasi. Conversia inversa insa, poate pune probleme daca valoarea memorata in intreg depaseste capacitatea de memorare a unui intreg scurt.

In afara de conversiile implicite, pe care compilatorul le hotaraste de unul singur, exista si conversii explicite, pe care programatorul le poate forta la nevoie. Aceste conversii efectueaza de obicei operatii in care exista pericolul sa se piarda o parte din informatii. Compilatorul nu poate hotari de unul singur in aceste situatii.

Conversiile implicite pot fi un pericol pentru stabilitatea aplicatiei daca pot sa duca la pierderi de informatii fara avertizarea programatorului. Aceste erori sunt de obicei extrem de greu de depistat.

In fiecare limbaj care lucreaza cu tipuri fixe pentru datele sale exista conversii imposibile, conversii periculoase si conversii sigure. Conversiile imposibile sunt conversiile pe care limbajul nu le permite pentru ca nu stie cum sa le execute sau pentru ca operatia este prea periculoasa. De exemplu, Java refuza sa converteasca un tip primitiv catre un tip referinta. Desi s-ar putea imagina o astfel de conversie bazata pe faptul ca o adresa este in cele din urma un numar natural, acest tip de conversii

sunt extrem de periculoase, chiar si atunci cand programatorul cere explicit aceasta conversie.

5.1.6.1 Conversii de extindere a valorii

In aceste conversii valoarea se reprezinta intr-o zona mai mare fara sa se piarda nici un fel de informatii. Iata conversiile de extindere pe tipuri primitive:

byte la short, int, long, float sau double short la int, long, float sau double char la int, long, float sau double int la long, float sau double long la float sau double float la double
Sa mai precizam totusi ca, intr-o parte din aceste cazuri, putem pierde din precizie. Aceasta situatie apare de exemplu la conversia unui long intr-un float, caz in care se pierd o parte din cifrele semnificative pastrandu-se insa ordinul de marime. De altfel aceasta observatie este evidenta daca tinem cont de faptul ca un long este reprezentat pe 64 de biti in timp ce un float este reprezentat doar pe 32 de biti.

Precizia se pierde chiar si in cazul conversiei long la double sau int la float pentru ca, desi dimensiunea zonei alocata pentru cele doua tipuri este aceeasi, numerele flotante au nevoie de o parte din aceasta zona pentru a reprezenta exponentul.

In aceste situatii, se va produce o rotunjire a numerelor reprezentate.

5.1.6.2 Conversii de trunchiere a valorii
Conventiile de trunchiere a valorii pot produce pierderi de informatie pentru ca ele convertesc tipuri mai bogate in informatii catre tipuri mai sarace. Conversiile de trunchiere pe tipurile elementare sunt urmatoarele:

byte la char short la byte sau char char la byte sau short int la byte, short sau char long la byte, short char, sau int float la byte, short, char, int sau long double la byte, short, char, int, long sau float.
In cazul conversiilor de trunchiere la numerele cu semn, este posibil sa se schimbe semnul pentru ca, in timpul conversiei, se indeparteaza pur si simplu octetii care nu mai incap si poate ramane primul bit diferit de vechiul prim bit. Copierea se face incepand cu octetii mai putin semnificativi iar trunchierea se face la octetii cei mai semnificativi.

Prin octetii cei mai semnificativi ne referim la octetii in care sunt reprezentate cifrele cele mai semnificative. Cifrele cele mai semnificative sunt cifrele care dau ordinul de marime al numarului. De exemplu, la numarul 123456, cifrele cele mai semnificative sunt primele, adica: 1, 2, etc. La acelasi numar, cifrele cele mai putin semnificative sunt ultimele, adica: 6, 5, etc.

5.1.6.3 Conversii pe tipuri referinta

Conversiile tipurilor referinta nu pun probleme pentru modul in care trebuie executata operatia din cauza ca, referinta fiind o adresa, in timpul conversiei nu trebuie afectata in nici un fel aceasta adresa. In schimb, se pun probleme legate de corectitudinea logica a conversiei. De exemplu, daca avem o referinta la un obiect care nu este tablou, este absurd sa incercam sa convertim aceasta referinta la o referinta de tablou.

Limbajul Java defineste extrem de strict conversiile posibile in cazul tipurilor referinta pentru a salva programatorul de eventualele necazuri care pot apare in timpul executiei. Iata conversiile posibile:

O referinta catre un obiect apartinand unei clase C poate fi convertit la o referinta catre un obiect apartinand clasei S doar in cazul in care C este chiar S sau C este derivata direct sau indirect din S.
O referinta catre un obiect apartinand unei clase C poate fi convertit catre o referinta de interfata I numai daca clasa C implementeaza interfata I.
O referinta catre un tablou poate fi convertita la o referinta catre o clasa numai daca clasa respectiva este clasa Object.
O referinta catre un tablou de elemente ale carui elemente sunt de tipul T1 poate fi convertita la o referinta catre un tablou de elemente de tip T2 numai daca T1 si T2 reprezinta acelasi tip primitiv sau T2 este un tip referinta si T1 poate fi convertit catre T2.
5.1.6.4 Conversii la operatia de atribuire
Conversiile pe care limbajul Java le executa implicit la atribuire sunt foarte putine. Mai exact, sunt executate doar acele conversii care nu necesita validare in timpul executiei si care nu pot pierde informatii in cazul tipurilor primitive.

In cazul valorilor apartinand tipurilor primitive, urmatorul tabel arata conversiile posibile. Pe coloane avem tipul de valoare care se atribuie iar pe linii avem tipurile de variabile la care se atribuie:

boolean char byte short int long float double boolean
Da
Nu
Nu
Nu
Nu
Nu
Nu
Nu char
Nu
Da
Da
Da
Nu
Nu
Nu
Nu byte
Nu
Da
Da
Nu
Nu
Nu
Nu
Nu short
Nu
Da
Da
Da
Nu
Nu
Nu
Nu int
Nu
Da
Da
Da
Da
Nu
Nu
Nu long
Nu
Da
Da
Da
Da
Da
Nu
Nu float
Nu
Da
Da
Da
Da
Da
Da
Nu double
Nu
Da
Da
Da
Da
Da
Da
Da

Tabloul 5.1 Conversiile posibile intr-o operatie de atribuire cu tipuri primitive. Coloanele reprezinta tipurile care se atribuie iar liniile reprezinta tipul de variabila catre care se face atribuirea.
Dupa cum observati, tipul boolean nu poate fi atribuit la o variabila de alt tip.

Valorile de tip primitiv nu pot fi atribuite variabilelor de tip referinta. La fel, valorile de tip referinta nu pot fi memorate in variabile de tip primitiv. In ceea ce priveste tipurile referinta intre ele, urmatorul tabel defineste situatiile in care conversiile sunt posibile la atribuirea unei valori de tipul T la o variabila de tipul S:

T este o clasa care nu este finala
T este o clasa care este finala
T este o interfata
T = Bai este un tablou cu elemente de tipul B

S este o clasa care nu este finala
T trebuie sa fie subclasa a lui S
T trebuie sa fie o subclasa a lui S eroare la compilare
S trebuie sa fie Object

S este o clasa care este finala
T trebuie sa fie aceeasi clasa ca si S
T trebuie sa fie aceeasi clasa ca si S eroare la compilare eroare la compilare

S este o interfata
T trebuie sa implementeze interfata S
T trebuie sa implementeze interfata S
T trebuie sa fie o subinterfata a lui S eroare la compilare

S = Aai este un tablou cu elemente de tipul A eroare la compilare eroare la compilare eroare la compilare
A sau B sunt acelasi tip primitiv sau A este un tip referinta si B poate fi atribuit lui A

Tabloul 5.2 Conversiile posibile la atribuirea unei valori de tipul T la o variabila de tipul S.
5.1.6.5 Conversii explicite
Conversiile de tip cast, sau casturile, sunt apelate de catre programator in mod explicit. Sintaxa pentru constructia unui cast este scrierea tipului catre care dorim sa convertim in paranteze in fata valorii pe care dorim sa o convertim. Forma generala este:

( Tip ) Valoare

Conversiile posibile in acest caz sunt mai multe decat conversiile implicite la atribuire pentru ca in acest caz programatorul este prevenit de eventuale pierderi de date el trebuind sa apeleze conversia explicit.

Dar, continua sa existe conversii care nu se pot apela nici macar in mod explicit, dupa cum am explicat inainte.

In cazul conversiilor de tip cast, orice valoare numerica poate fi convertita la orice valoare numerica.

In continuare, valorile de tip boolean nu pot fi convertite la nici un alt tip.

Nu exista conversii intre valorile de tip referinta si valorile de tip primitiv.

In cazul conversiilor dintr-un tip referinta intr-altul putem separa doua cazuri. Daca compilatorul poate decide in timpul compilarii daca conversia este corecta sau nu, o va decide. In cazul in care compilatorul nu poate decide pe loc, se va efectua o verificare a conversiei in timpul executiei. Daca conversia se dovedeste gresita, va apare o eroare de executie si programul va fi intrerupt.

Iata un exemplu de situatie in care compilatorul nu poate decide daca conversia este posibila sau nu:

Minge mingeaMea;
?
MingeDeBaschet mingeaMeaDeBaschet;
// MingeDeBaschet este o clasa
// derivata din clasa Minge mingeaMeaDeBaschet=(MingeDeBaschet)mingeaMea;
In acest caz, compilatorul nu poate fi sigur daca referinta memorata in variabila mingeaMea este de tip MingeDeBaschet sau nu pentru ca variabilei de tip Minge i se pot atribui si referinte catre instante de tip Minge in general, care nu respecta intru totul definitia clasei MingeDeBaschet sau chiar referinta catre alte tipuri de minge derivate din clasa Minge, de exemplu MingeDePolo care implementeaza proprietati si operatii diferite fata de clasa MingeDeBaschet.

Iata si un exemplu de conversie care poate fi decisa in timpul compilarii:

Minge mingeaMea;
MingeDeBaschet mingeaMeaDeBaschet;
? mingeaMea = ( Minge ) mingeaMeaDeBaschet;
In urmatorul exemplu insa, se poate decide in timpul compilarii imposibilitatea conversiei:

MingeDeBaschet mingeaMeaDeBaschet;
MingeDePolo mingeaMeaDePolo;
? mingeaMeaDePolo = ( MingeDePolo ) mingeaMeaDeBaschet;
In fine, tabelul urmator arata conversiile de tip cast a caror corectitudine poate fi stabilita in timpul compilarii. Conversia incearca sa transforme printr-un cast o referinta de tip T intr-o referinta de tip S.

T este o clasa care nu este finala
T este o clasa care este finala
T este o interfata
T = Bai este un tablou cu elemente de tipul B

S este o clasa care nu este finala
T trebuie sa fie subclasa a lui S
T trebuie sa fie o subclasa a lui S
Totdeauna corecta la compilare
S trebuie sa fie Object

S este o clasa care este finala
S trebuie sa fie subclasa a lui T
T trebuie sa fie aceeasi clasa ca si S
S trebuie sa implementeze interfata T eroare la compilare

S este o interfata
Totdeauna corecta la compilare
T trebuie sa implementeze interfata S
Totdeauna corecta la compilare eroare la compilare

S = Aai este un tablou cu elemente de tipul A
T trebuie sa fie Object eroare la compilare eroare la compilare
A sau B sunt acelasi tip primitiv sau A este un tip referinta si B poate fi convertit cu un cast la A

Tabloul 5.3 Cazurile posibile la convertirea unei referinte de tip T intr-o referinta de tip S.
5.1.6.6 Conversii de promovare aritmetica
Promovarea aritmetica se aplica in cazul unor formule in care operanzii pe care se aplica un operator sunt de tipuri diferite. In aceste cazuri,

compilatorul incearca sa promoveze unul sau chiar amandoi operanzii la acelasi tip pentru a putea fi executata operatia.

Exista doua tipuri de promovare, promovare aritmetica unara si binara.

In cazul promovarii aritmetice unare, exista un singur operand care in cazul ca este byte sau short este transformat la int altfel ramane nemodificat.

La promovarea aritmetica binara se aplica urmatorul algoritm:

Daca un operand este double, celalalt este convertit la double.
Altfel, daca un operand este de tip float, celalalt operand este convertit la float.
Altfel, daca un operand este de tip long, celalalt este convertit la long
Altfel, amandoi operanzii sunt convertiti la int.
De exemplu, in urmatoarea operatie amandoi operanzii vor fi convertiti la float prin promovare aritmetica binara:

float f; double i = f + 3;
Dupa efectuarea operatiei, valoarea obtinuta va fi convertita implicit la double.

In urmatorul exemplu, se produce o promovare unara la int de la short.

short s, r;
? int min = ( r < -s ) ? r : s;
In expresia conditionala, operandul -s se traduce de fapt prin aplicarea operatorului unar - la variabila s care este de tip short. In acest caz, se va produce automat promovarea aritmetica unara de la short la int, apoi se va continua evaluarea expresiei.


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta