Documente Academic
Documente Profesional
Documente Cultură
Ivanov
2.1.
Variabile locale/instan/clas
Limbajul Java prevede trei categorii de variabile: Variabile locale sunt declarate n interiorul unei metode, constructor sau bloc. La momentul introducerii unei metode, o zon asociat metodei se plaseaz n stiva de apeluri. Aceast zon conine cte o nregistrare pentru fiecare variabil local i fiecare parametru. Cnd este
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
apelat metoda, fiecare nregistrare parametru este iniializat cu valorile parametrului respectiv. La momentul terminrii metodei zona este eliminat din stiv i memoria devine disponibil pentru urmtoarea metod apelat. Parametrii sunt variabile locale eseniale care sunt iniializate cu valorile parametrilor actuali. Variabilele locale nu sunt vizibile n afara metodei. Variabile instan sunt declarate ntr-o clas, dar n afara unei metode. Ele mai sunt numite i variabile membru sau variabile cmp . Cnd un obiect este alocat n zona heap, se creeaz cte o nregistrare pentru fiecare valoare a variabilelor instan. Astfel o variabil instan este creat/distrus odat cu obiectul cruia i aparine. Variabila instan este vizibil n toate metodele i n toi constructorii care aparin clasei care o definesc. n general trebuie declarat privat, dar i se poate conferi i o vizibilitate sporit. Variabile clas/statice sunt declarate preciznd cuvntul cheie static n interiorul unei clase, dar n afara unei metode. Exist o singur copie per clas, indiferent cte obiecte au fost create din ea. Ele sunt memorate n zona de memorie static. n majoritatea cazurilor, variabilele statice se introduc n declaraii final i se utilizeaz pe post de constante publice sau private. Caracteristica Variabile locale Variabile instan Variabile clas Unde se declar metod, constructor, ntr-o clas, dar n ntr-o clas, dar n sau bloc. afara unei metode. De afara unei metode. Trebuie declarate obicei private. static. De obicei au i atributul final. Utilizare Variabilele locale Variabilele instan Variabilele clas sunt pstreaz valori utilizate pstreaz valori ce utilizate n general n calcule ntr-o metod. trebuie referite n mai pentru constante, mult de o metod. (d.e. variabile care nu i componente ce modific niciodat pstreaz valori de valorile lor iniiale. genul iruri de caractere, variabile pentru realizarea desenelor, etc.), sau care sunt pri eseniale ale strii unui obiect ce trebuie s existe ntre invocarea a dou metode diferite. Durata de via Sunt create la Sunt create la momentul Sunt create la pornirea introducerea metodei crerii unei instane prin programului. sau a constructorului. Sunt distruse la new. Sunt distruse la ieire. terminarea programului. Sunt distruse cnd nu mai exist nici o referire la obiectul care le conine (ele sunt preluate de colectorul de reziduuri garbage collector ). Domeniu/Vizibilitate Variabilele locale Variabilele instan La fel ca i variabilele (inclusiv parametrii (field) sunt vizibile de instan, dar deseori formali ) sunt vizibili ctre toate metodele sunt declarate public numai n metoda, unei clase. Numrul pentru a oferi constructorul sau blocul claselor pentru care mai utilizatorilor clasei unde au fost declarate. sunt vizibile este valorile constantelor. Modificatorii de acces determinat de atributul (private, public, ...) lor de acces. Alegerea implicit n declararea nu pot fi utilizai pentru lor ar trebui sa fie variabile locale. Toate private . Nici o alt variabilele locale sunt
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
efectiv private pentru blocul n care au fost declarate. Ele nu sunt vizibile din nici o alt parte a programului, cu excepia metodei/blocului unde au fost declarate. Un caz special l constituie o variabil local declarat n partea de iniializare a unei instruciuni for ; aceasta are drept domeniu domeniul instruciunii respective.
Declarare
Valori iniiale
Declaraia trebuie plasat ntr-o metod sau bloc oriunde nainte de utilizare . Niciuna. Trebuie s i se atribuie o valoare nainte de prima utilizare.
clas nu poate vedea variabilele instan private . Aceasta ar fi cea mai bun alegere. Pentru a pstra flexibilitatea reprezentrii interne, i pentru a ntri consisten datelor se recomand a defini metode pentru citirea respectiv iniializarea variabilei dac valorile trebuie aduse din afara clasei. Implicit (convenie numit i vizibilitatea pachetului) o variabil poate fi vzut din orice clas a aceluiai pachet. Cu toate acestea private este de preferat . public. Poate fi vzut din orice clas. In general este o idee greit. protected variabilele sunt vizibile numai din orice clas de descendeni. Este o alegere ieit din comun i probabil o alegere greit. Oriunde la nivelul clas (nainte sau dup utilizare). Zero pentru numere, false pentru variabile booleene, null pentru referine la un obiect. Valorile pot fi atribuite ntr-o declaraie sau ntrun constructor. Variabilele instan trebuie declarate private pentru a asigura ascunderea informaiei, astfel ele nu mai pot fi accesate din afara clasei. Totui exist situaii mai rar ntlnite n care ele trebuie accesate din afara clasei; n aceste cazuri variabilele vor fi calificate de un obiect
Oriunde la nivelul clas mpreun cu atributul static. La fel ca i variabilele instan, dar n plus li se pot atribui valori ntr-un bloc special de iniializare static.
Variabilele clas sunt calificate de numele clasei (d.e., Color.BLUE). Ele pot fi calificate i de ctre un obiect dar este un stil amgitor (poate crea confuzie) .
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
Sintaxa numelor
Reguli standard
(d.e. myPoint.x). Reguli standard, dar deseori sunt prefixate pentru a face vizibil diferena fa de variabilele locale, d.e. my, m, sau m_ (pentru variabile membru) myLength, sau this ca i n numele this.length.
Variabilele (constantele) static public final se scriu toate cu majuscule, altfel ele se conformeaz conveniilor obinuite de numire. Pentru nume de clase se recomand prefixul "c_" (sau ceva similar).
2. Expresii
Expresiile constituie principalul mijloc pentru a crea valori. Expresiile sunt create prin combinarea literalilor (constantelor), a variabilelor, invocrilor de metode i utiliznd operatori. Pentru a obine ordinea de evaluare corect se vor folosi paranteze. 2.3.1. Tipuri. Fiecare variabil are asociat un tip. Sunt prevzute dou categorii de tipuri: Tipuri primitive : byte, short, char, int, long, float, double, boolean. Tipuri obiect : Tipurile string i tablou sunt tipuri predefinite, dar fiecare clas care este definit creeaz un nou tip de obiect. 2.3.2. Constante literale Ofer un mod de a scrie valori aparinnd diferitelor tipuri (3, 3.0, true, 'a', "abc"). 2.3.3. Variabile Fiecare variabil trebuie declarat ca i aparinnd unui tip. Variabilele se pot ncadra n trei categorii de baz diferite: Variabile locale declarate n metode . Variabile instan (deseori numite cmpuri) declarate n obiecte. Variabile clas (static) declarate n clase.
2.2.
Operatori
Operatorii sunt utilizai pentru a exprima diferite formule elementare de calcul sau prelucrare a informaiei i sunt folosii alturi de literali, variabile, apeluri de metode i alte expresii. Operatorii se pot clasifica n urmtoarele categorii. Operatori aritmetici(+, -, *, /, %, ++, --) Operatori relaionali (<, <=, ==, >=, >, !=) Operatori booleeni (&&, ||, !, &, !, ^, |, &) Operatori la nivel de bit (&, |, ^, ~, <<, >>, >>>) Operatorul de concatenare a String-urilor (+) Operatori speciali (instanceof, ?:) Operatori de atribuire (=, +=, -=, *=, ...)
2.3.
Ordinea de evaluare
In general, ordinea de evaluare a expresiilor este de la stnga la dreapta; excepie de la aceast regul o fac operatorii de atribuire. Ordinea de evaluare poate fi schimbat utiliznd paranteze. A se vedea tabelul de preceden al operatorilor.
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
2.3.4. Operatori relaionali Toi operatorii standard funcioneaz pentru valori de tip primitiv (int, double, char, ...). Operatorii == ( test de egalitate) i != ( test de inegalitate) pot fi utilizai pentru a compara referine la un obiect. A se vedea seciunea Compararea Obiectelor pentru a nelege cum funcioneaz comparaia valorilor obiect. 2.3.5. Operatori Rezultatul oricrei comparaii este o valoare de tip boolean (true sau false). operator Semnificaie < mai mic <= mai mic sau egal == Egalitate >= mai mare sau egal > mai mare != Inegalitate (diferit de) 2.3.6. Erori comune 0 < x < 100 Operatorii de comparare nu pot exprima inegaliti duble. Dei matematic formula este corect, sintaxa Java nu permite scrierea ei. Exprimarea corect n limbajul Java este scrierea a dou comparaii: 0<x && x<100 = n loc de == Utilizarea operatorului de atribuire n loc de test de egalitate va genera o eroare de compilare uor de corectat. == pentru valori reprezentate n virgul flotant Deoarece numerele n virgul mobil nu ofer totdeauna reprezentarea exact a valorilor va trebui s utilizai >= sau <= n loc de ==. Spre exemplu, deoarece numrul zecimal 0.1 nu poate fi reprezentat exact n binar, expresia (0.1 + 0.1 + 0.1) nu va fi egal cu 0.3! Recomandri pentru programatorii C/C++ Operatorii de comparare ai limbajului Java sunt la prima vedere identici cu cei din C/C++. Diferena const n faptul c tipul rezultatului operaiei de comparare este boolean. Astfel, eroarea frecvent n limbajul C: utilizarea operatorului = n loc de == este aproape complet eliminat. Limbajul Java nu permite suprancrcarea operatorului, aspect ce poate fi ignorat de unii programatori obinuii cu filozofia C++. 2.3.7. ==, .equals(), i compareTo() Testul de egalitate : o variant Comparaie Primitive Valori a == b, a != b egale a.equals(b) Nu se aplic pentru tipuri primitive, patru variante pentru obiecte Obiecte Referin spre acelai obiect Compar valorile, dac sunt definite pentru aceast clas, dac sunt definite pentru clasele respective, se comport ca i pentru clasele predefinite Java. Dac nu este definit pentru o clas (utilizator) se comport ca i operatorul ==. Compar valori. Clasa trebuie s aib implementat interfaa Comparable<T> . Toate clasele Java avnd relaia de ordine natural au implementat aceast interfa (String, Double, BigInteger, ...) Face excepie clasa BigDecimal care poate produce rezultate imprevizibile. Obiectele Comparable pot fi utilizate de metodele Collections sort() i de structurile de date sortate implicit (d.e. TreeSet, TreeMap). Compar valori. Este disponibil numai dac este implementat interfaa Comparator<T> care nu este specific pentru clasele
a.compareTo(b)
Nu se aplic
compareTo(a, b)
Nu se aplic
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
Java. De obicei se folosete pentru a defini un obiect de comparare care va fi transmis metodelor Collections sort() sau structurilor de date ordonate. Compararea referinelor la obiecte folosind operatorii == i != Cei doi operatori de comparare pentru referine la obiecte sunt testul de egalitate (==) i testul de neegalitate (!=). Aceti operatori compar dou valori pentru a vedea dac ele refer acelai obiect. Cu toate c este o operaiune foarte rapid nu ntotdeauna produce ceea ce ateptai. De obicei vrei s aflai dac obiectele au aceeai valoare, i nu dac dou obiecte constituie o referin spre acelai obiect. Spre exemplu, if (name == "Mickey Mouse") // Aproape sigur o eroare Aici, rezultatul este adevrat(true) dac name este o referin ctre acelai obiect spre care face referin i "Mickey Mouse". In schimb, rezultatul va fi probabil false dac String-ul din variabila name a fost citit din fiierul de intrare sau calculat (prin concatenare sau extragere subir), chiar dac name are ntr-adevr exact aceleai caractere memorate n locaia asociat. Mai multe clase (d.e., String) definesc metoda equals() pentru a compara valori ale obiectelor. Compararea valorilor obiectelor utiliznd metoda equals() Se va folosi metoda equals() pentru a compara valori ale obiectelor. Metoda equals() furnizeaz o valoare de tip boolean. Exemplul de mai sus poate fi corectat scriind:
if (name.equals("Mickey Mouse")) // Compara valori, nu referine.
Alte comparaii Interfaa Comparable<T> Metoda equals precum i operatorii == i != sunt prevzui pentru testul de egalitate/inegalitate, dar nu ofer o metod de a testa valori nrudite. Unele clase (d.e. String i alte clase avnd relaia de ordine natural) au implementat interfaa Comparable<T> , care definete metoda compareTo . Va trebui s implementai Comparable<T> n clasele proprii dac avei nevoie s le utilizai n metodele Collections.sort() sau Arrays.sort(). Clasa String ofer i metode de comparaie care nu fac diferen ntre literele mari i mici. Erori frecvente n utilizarea operatorului == n loc de equals() pentru obiecte Dac dorii s comparai obiecte, trebuie s tii c operatorul == se folosete pentru a afla dac ele sunt acelai obiect, iar metoda equals() pentru a testa dac ele sunt obiecte diferite, dar au aceeai valoare. O eroare produs de aceast eventual confuzie este greu de depistat. 2.3.8. Operatori la nivel de bit Operatorii pe bii acioneaz asupra biilor valorilor ntregi (int i long). Dac un operand este mai scurt dect un ntreg, el este convertit la int nainte de a efectua operaiunea. Este necesar a ti cum se reprezint valorile ntregi n sistemul binar. Spre exemplu numrul zecimal 3 este reprezentat 11 n baza 2 iar reprezentarea binar a lui 5 este 101. Numerele ntregi negative sunt reprezentate utiliznd codul complementului fa de 2. Spre exemplu, -4 este reprezentat prin urmtoarea secven de cifre binare : 1111 1111 1111 1111 1111 1111 1111 1100. Operatorii la nivel de bit Operator a & b a | b a ^ b Nume i sau sau exclusiv Exemplu 3&5 3|5 3^5 Rezultat 1 7 6 Descriere 1 dac ambii bii au valoarea 1. 1 dac cel puin un bit are valoarea 1. 1 dac biii au valori diferite.
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
~a n << p
n >> p
complement Deplasare stnga fr semn Deplasare dreapta cu semn Deplasare dreapta fr semn
~3 3 <<2
-4 12
5 >> 2
n >>> p
-4 >>> 28
15
Inverseaz valoarea biilor. Deplaseaz biii lui n la stnga cu p poziii. Bii avnd valoarea zero sunt introdui n poziiile de rang nesemnificativ. Deplaseaz biii lui n la dreapta cu p poziii. Dac n este un numr cu semn reprezentat n forma complement fa de 2 , semnul este propagat n poziiile de rang semnificativ. Deplaseaz biii lui n la dreapta cu p poziii. Bii avnd valoarea zero se introduc n poziiile de rang semnificativ.
Utilizarea mpachetrii / despachetrii O utilizare frecvent a operatorilor la nivel de bit (deplasri combinate cu i pentru extragere de valori i deplasri combinate cu or pentru adugare valori) este aceea de a codifica mai multe valori ntr-o singur valoare de tip int. Procedeul se numete mpachetare, iar extragerea rezultatului despachetare. Cmpurile de bii ofer o alt metod de a face acelai lucru. Spre exemplu, s presupunem c avem de a face cu urmtoarele variabile ntregi : virsta (domeniu 0-127), sex (domeniu 0-1), inaltime (domeniu 0-255). Acestea pot fi mpachetate/despachetate ntr-o singur variabil short (ntreg reprezentat pe doi octei) dup cum urmeaz (sau n variante similare).
int virsta, sex, inaltime; short info_impachetata; . . . // mpachetare info_impachetata = (short)((((virsta << 1) | sex) << 7) | inaltime); . . . // despachetare inaltime = info_impachetata & 0xff; sex = (info_impachetata >>> 7) & 1; virsta = (info_impachetata >>> 8);
Utilizarea biilor fanion (flag) Anumite funcii de bibliotec interpreteaz valoarea unui ntreg ca i un ir de bii n care fiecare reprezint o valoare boolean (true/false) . Aceast presupunere are avantajul c economisete spaiu de memorare i n acelai timp poate s fie procesat rapid. Utilizarea deplasrilor: deplasarea la stnga nmulire cu 2; deplasarea la dreapta mprire cu 2 Pe unele calculatoare mai vechi operaiunile de deplasare sunt mai rapide dect nmulirile respectiv mpririle.
y = x << 3; y = (x << 2) + x; // Atribuie lui y valoarea 8*x // Atribuie lui y valoarea 5*x
Utilizarea operatorului sau-exclusiv pentru a comuta pe unu/zero Uneori se folosete operatorul sau-exclusiv pentru a comuta valorile 1 i 0.
x = x ^ 1; // sau n stil criptic x ^= 1;
Aceast instruciune plasat ntr-o bucl va schimba alternativ 0 cu 1. Utilizare ndoielnic : Schimbare de valori folosind operatorul sau-exclusiv Iat o secven de cod ciudat. Se folosete operatorul sau-exclusiv pentru a schimba ntre ele dou valori (x i y). Aceasta este traducerea n Java a unei secvene dintr-un limbaj de asamblare, unde nu se dispunea de spaiu de memorare pentru o variabil temporar. Nu se recomand s utilizai o schem de acest gen, ea trebuie privit ca i o curiozitate dintr-un muzeu al codurilor bizare.
x = x ^ y; y = x ^ y; x = x ^ y;
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
Nu confundai operatorii && i & Nu confundai operatorul &&, care produce operaia i logic, cu operatorul &, care este o transformare de bii, numit i pe bii. Acesta din urm este mai puin obinuit . Cu toate c operaia i pe bii poate fi folosit mpreun cu operanzi de tip boolean, acest lucru este extrem de rar i aproape ntotdeauna genereaz o eroare de programare.
2.4.
Parantezele () au trei utilizri: 1. Gruparea pentru a controla ordinea de evaluare sau pentru claritate. Exemplu: (a + b) * (c - d) 2. Dup o metod pentru a cuprinde parametrii. Exemplu: x = suma(a, b); 3. n jurul unui tip pentru a forma determina o conversie explicit (cast). Exemplu: i = (int)x; Ordinea de evaluare Operatorii cu precedena mai mare se aplic naintea celor cu preceden mai mic. La preceden egal, evaluarea este de la stnga la dreapta, cu excepia operatorilor unari, a atribuirii i operatorului condiional. Abrevieri folosite i, j valori ntregi (int, long, short, byte, char). m, n valori numerice (ntregi, double, sau float). b, c - boolean; x, y orice tip sau obiect. s, t - String; a - tablou; o - obiect; co - clas sau obiect Precedena Operatorilor . [] (argumente) post ++ -! ~ op.unari + - pre ++ -(tip) new * / % + << >> >>> < <= > >= instanceof == != & ^ | && || ?: = += -= etc. Operatori aritmetici
comparaii
&& || = asignri Folosii () pentru toate celelalte
Rezultatul operaiilor aritmetice este double dac oricare dintre operanzi este double, altfel float dac oricare dintre operanzi este float, altfel long dac oricare dintre operanzi este long, altfel int. ++i Adun 1 la i nainte de a folosi valoarea n expresia curent i Ca mai sus, dar scade i++ Adun 1 la i dup ce s-a folosit valoarea n expresia curent i Ca mai sus, dar scade n+m Adunare. D.e. 7+5 este 12, 3 + 0.14 este 3.14 n-m Scdere n*m nmulire n/m mprire. D.e. 3.0 / 2 este 1.5 , 3 / 2 este 1 n%m Restul (Mod) dup mprirea lui n prin m. D.e. 7 % 3 este 1
Compararea valorilor primitive
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
Operanzii trebuie s fie booleeni. Rezultatul este boolean. b && c Condiionalul "i". Este true daca amndoi operanzii sunt true, altfel false. Evaluarea se face cu scurtcircuitare. D.e. (false && orice) este false. b || c Condiionalul "sau". Este true dac oricare dintre operanzi este true, altfel false. Evaluarea se face cu scurtcircuitare. D.e. (true || orice) este true. !b true dac b este false, false dac b este true. b&c "i" care evalueaz ntotdeauna ambii operanzi (nu scurtcircuit). b|c "Sau"care evalueaz ntotdeauna ambii operanzi (nu scurtcircuit). b^c "Sau-exclusiv" La fel ca b != c
Operatorul condiional b?x:y dac b este true, valoarea este x, altfel y. x i y trebuie s fie de acelai tip.
Operatori de asignare (atribuire) = Partea stng trebuie s fie o lvaloare (vezi C). += -= *= ... Toi operatorii binari, cu excepia lui && i || pot fi combinai cu o asignare.
D.e.
a += 1 este la fel ca a = a + 1 Operatori pe bii
Folosii conversii explicite atunci cnd "ngustai gama unei valori. De la cea mai restrns la cea mai larg, ordonarea tipurilor primitive este: byte, short, char, int, long, float, double. Obiectele se pot atribui fr precizare explicit a tipului n sus pe ierarhia de motenire. Este nevoie de precizarea explicit a tipului pentru a merge n jos pe ierarhia de motenire (downcasting).
(t)x Face din x o variabil convertit la tipul t (nu modific pe x)
Operatori asupra obiectelor co.f Membru. Cmpul f sau metoda unui obiect sa a clasei co. x instanceof co true dac obiectul x este o instan a clasei co, sau o instana de clasa lui co. a[i] Acces la elementele unui tablou. s+t Concatenare de obiecte ir dac unul sau ambii operanzi sunt String. x == y True dac x i y se refer la acelai obiect, altfel fals (chiar dac valorile obiectelor sunt identice). x != y Ca mai sus pentru inegalitate. comparaii Compar valori de obiecte cu .equals() sau .compareTo() x=y Asignarea copiaz referina, nu obiectul.
U.T. Cluj-Napoca
M. Joldo, A. Ivanov
3. Mersul lucrrii
Scriei scurte programe n Java pentru: 3.1. 3.2. 3.3. A calcula ansele de ctig la loterie (6 din 49, 5 din 40). A simula extragerea numerelor (pentru generarea numerelor aleatoare folosii Math.random) Afiai n ordine cresctoare/descresctoare numerele extrase fr a face sortri sau a folosi tablouri. (Sugestie: folosii mpachetarea/despachetarea/extragerea de bii stocai ntr-un long) A codifica o fraz dat sub forma unui String, n care nu exist dect litere ale alfabetului Latin, spaii, virgule i puncte (sub 64 simboluri diferite) sub forma unui ntreg n precizie arbitrar. Codificarea este n ordinea codurilor Unicode (de exemplu, spaiu se codific prin 0, virgula prin 1, punctul prin 2, A mare prin 3 etc. vezi tabela din lucrarea anterioar). Afiai ntregul rezultat. Problema invers celei anterioare, folosind aceeai codificare. Orice numr natural par mai mare dect 2 se poate scrie ca sum a dou numere prime conjectura lui Goldbach. Scriei un program Java care s verifice aceast conjectura pentru numere situate ntre m i n. Parametrii vor fi argumente pentru o aplicaie de sine stttoare (argumente ale metodei main).
3.4.
3.5. 3.6.
U.T. Cluj-Napoca
10