|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Variabile JAVA | ||||||
|
||||||
q6h14hq 5.1.1 Declaratii de variabile 5.1.1.1 Tipul unei variabile 5.1.2 Tipuri primitive 5.1.2.1 Tipul boolean 5.1.2.3.1 Tipul octet 5.1.2.4 Tipuri flotante 5.1.2.4.1 Tipul flotant 5.1.3 Tipuri referinta 5.1.3.1 Tipul referinta catre o clasa 5.1.4 Clasa de memorare 5.1.4.1 Variabile locale 5.1.5 Tablouri de variabile 5.1.5.1 Declaratia variabilelor de tip tablou 5.1.6 Conversii 5.1.6.1 Conversii de extindere a valorii 5.1.1 Declaratii de variabile 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*; 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 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 PORTOCALIUVERDEALBASTRUDESCHIS Tip NumeVariabila = ValoareInitiala; 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 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; 5.1.2.2 Tipul 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; 5.1.2.3 Tipuri intregi 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; 5.1.2.3.2 Tipul intreg scurt 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; 5.1.2.3.3 Tipul intreg int salariu; 5.1.2.3.4 Tipul intreg lung 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 5.1.2.4.1 Tipul flotant 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; 5.1.2.4.2 Tipul flotant dublu 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 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 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 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 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; 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 Declaratia se face cu urmatoarea sintaxa: ObiectSpatioTemporal mingeaLuiVasile; 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 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; Minge echipamentai; Mai multe despre tablouri intr-un paragraf urmator. 5.1.4 Clasa de memorare 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 5.1.4.2 Variabile statice 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 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; int numereai = new inta10i; 5.1.5.1 Declaratia variabilelor de tip tablou 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; floataiai matrice; floatai matriceai; float matriceaiai; 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; 5.1.5.2 Initializarea tablourilor. char aicaractere = A a, b, c, d S; Initializarea functioneaza si la tablouri cu mai multe dimensiuni ca in exemplele urmatoare: int aiainumere = A 5.1.5.3 Lungimea tablourilor float aitablou = new floata25i; int dimensiune = tablou.length; float aiaimultiTablou = new floata3ia4i; int dimensiune1 = multiTabloua2i.length; 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; 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 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; 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 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 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. 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 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.
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 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. 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 Tabloul 5.2 Conversiile posibile la atribuirea unei valori de tipul T la o
variabila de tipul S. ( 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; Iata si un exemplu de conversie care poate fi decisa in timpul compilarii: Minge mingeaMea; MingeDeBaschet mingeaMeaDeBaschet; T este o clasa care nu este finala Tabloul 5.3 Cazurile posibile la convertirea unei referinte de tip T intr-o
referinta de tip S. 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. float f; double i = f + 3; In urmatorul exemplu, se produce o promovare unara la int de la short. short s, r; |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|