Documente Academic
Documente Profesional
Documente Cultură
expresiei este de acelaşi tip primitiv. Daca tipul expresiei este un tip referință, atunci instrucțiuni (sau expresii) ca parte a structurii lor. Instrucțiunile Java sunt: instruc¡iunea
clasa și valoarea obiectului referențiat nu se cunosc la momentul compilării, ci al vida, etichetele, expresiile, i f, s w i t ch , wh i l e, do, fo r, b re a k, con t i nu e, re t a ria,
execuției. Pentru a da definiția formală a expresiei, mai întâi definim noțiunea de t.h roz, synch r o n i z ed, rt y. Spre deoseb ire de alte lim6aje de pi‘ogranaare, în Java nu
cx presie primară. Expresii primare sunt literalii, accesul la campuri și tablouri, apeluri dc există instrucțiunea qot o. Cele 18 exeiiiple itle acestei secțiuni pun în evidență aceste
metode, expresii parantetizate. Un operator cu n argumente este o funcție cu ri argumente instrucțiuni.
care se mai numesc și operanzi. Utilizand o manieră recursivă de descriere, o ex presie
com pHSă (sau simplu, cx presie) poate fi expresie primară, o expresie care foloseşte
operatori unari, binari și ternari sau o expresie de conversie. Prin cele 31 de exemple, 2.11. Test grilă
secțiunea 5 prezintă expresiile și operatorii referitori la tipurile primitive de date, cele de
tip referință urmind a fi prezentare în Capitolul 3. Întrebarea 2.11.1. fie urmatoarea secven¡ă de cod Java:
Secțiunea 6 prezintă no¡iunea de variabilâ în Java. Aceasta este o locație de 1) f1oat a = 2;
memorie care are un tip asociat (tip verificat la compilare). O variabilă conține o valoare 2) float b = 1.3;
care este compatibila cu tipul variabilei. Valoarea unei variabile se poate schimba in Care afirmație este adevărată?
urma unei asignări sau a operatorilor ++ ți - -. Compatibilitatea valorilor implicite și a) Instrucțiunile 1 Ji 2 sunt corecte.
toate asignările unei variabile sunt verificate in timpul compilării, cu exceptia tablou b) Instrucțiunea 1 este corectă, instrucyiunea 2 este incorectă.
lui, cand verificarea se realizează în timpul execuției programului Java. Exemplul 2.6.3 c) Instrucțiunile l și 2 sunt incorecte.
pune in evidență o mare parte de tipuri de variabile, cele de tip instanță și de tip tablou
urmind a fi prezentate în Capitolul 3.
Sec¡iunea 7 se referă la decla rații și ini țializâri. Fiecare instrucțiune de declarare a
unei variabile locale este conținută intr-un bloc. Instrucțiunile de declarare a variabi-
lelor locale pot fi intercalate printre alte instrucțiuni ale blocului. O declarare de
variabilă locală poate apărea și într-o instrucțiune for, caz în care se execută la fel ca o
instrucțiune de declarare a unei variabile locale. O instrucțiune de declarare a unei
variabile locale este o instrucțiune executabilă. La execuție, declaratorii sunt procesați
de la stinga la dreapta. Dacă un declarator are o expresie de inițializare, atunci expresia
este evaluată și valoarea se asignează variabilei. Dacă declaratorul nu are o expresie de
inițializare, atunci compilatorulJava verifică dacă fiecare referință către variabilă este
precedată de execiiția unei asigniiri a variabilei. Dacă nu este așa, atunci se semnalează
o eroare la' compilare. Fiecare inițializare (cu exceptia primei) este executată dacă Intrebarea 2.11.2. Fie urmatoarea declarație Java:
precedenta expresie de inițializare se evaluează normal. Execuția unei declarații a unei public private int h;
variabile locale se termină normal dacă evaluarea ultimei expresii de inițializare se face
normal. Evident, dacă declarația unei variabile locale nu conține expresii de inițializare, Care afirmație este adevărată?
atunci execuția acesteia se termină întotdeauna normal. a) Variabila h va fi accesată în mod publ i c, deoarece se ia în considerare primul
Secțiunea 8 prezintă noțiunea de conversie. Aceasta are rolul de a modifica tipul unei modificator de acces.
expresii intr-un anume context. In fiecare context, sunt permise doar cateva conversii b) Variabila h va fi accesată în mod pr i va t e, deoarece se ia in considerare ultimul
specifice: conversii identice, conversii primitive implicite (,de la mic la mare", eng. modificator de acces.
midening conversions}, conversii primitive esplicite (,de la mare la mic”, eng. narroming c) Va fi eroare la compilare, deoarece o variabilă nu poate fi în acelaşi timp
conversions), conversii de {â implicite, conversii de referință accesată pub1 i c și pr i v at.e.
exp/icite, conx•ersii la 5 tr 1 nq. Cele 11 exemple prezentate În secțiunea 8 se referă la
conversiile identice, cele primitive (implicite și explicite) și conversii la S fi r i n g. In
Capitolul 4 vor fi prezentate conversiile de referin ță.
Secțiunea 9 prezintă noțiunea de sttucturi dc con/ro/ (in strucțiuni). Acestea au rolul
de a controla execuția unui program Java prin efectul lor și nu pentru faptul că întorc
valori (cum era cazul expresiilor, Secțiunea 2.5). Anumite instrucțiuni conțin alte
Intrebarea 2.11.3. Fie următorul subprogram Java: ‘
int x = 0; ,
if (Double.isInfinite(2 / x)) System.out.println("infinit");
else
System.out.print1n("2 / 0");
Ce puteți spune despre acesta?
a) Eroare la compilare din cauza împăryirii la zero.
b) Eroare la execuție din cauza Împărțirii la zero (se aruncă o excepție Ar i t hme t ie
Exception).
c) Programul este corect și va afișa: i n f i n i U.
d) Programul este corect și va afișa: N aN .
b) Eroare la compilare: metoda f ( ) nu întoarce o valoare de tip s ho rfi. System.out.println((int) (char)min + ” " + (int)(char)rax);
c) Programul se compilează și la execuție afișează 6.
Întrebarea 2.1t.12. Fie următorul subprogram Java: Ce se poate spune despre acesta?
byte b = -7 >>> 1; a) Eroare la compilare: conversii imposibile.
Exercițiul 2.12.2. Scrieți uri program Java care să împaclieteze o dată calendaristică
System.out.print(sumal;
într-o variabilă de tip i n t. Furnizați și o funcție de despachetare. De exemplu, 20
Ce se poate spune despre acesta? februarie 2002 se reprezintă ca un intreg astfel: primii 5 biți rezervați pentru zi,
a) Eroare la compilare: lipsesc părțile componente ale lui fo r. următorii 4 bi¡i pentru lună }i ultimii pentru an.
b) Subprogramul se compilează }i la execuție a(ișează 0.
c) Subprogramul se compilează și la execuție afișează 10. Exereițiul 2.12.3. Scrieți o clasă Java care generează numere pseudoaleatoare din
d) Subprogramul se compilează și la execuție afișează 1 5. domeniul 0. 6 5 535. Presupunand că avem o valoare inițială (sâmanță, eng. Jeed) z „
pentru generarea următorului număr aleator din domeniul 0. 6 5535 utilizăm formula
r„„ - ( ( r„„ * 2 517 3 ) + 13 8 4 9 ) 6 5536.
Exercițiul 2. t2.5. Folosind o buclă wh i 1e și fără a folosi tablouri, scrieyi uri program
ja“Ji Gare Ca!Cii!Oaza teî riieîiul al n-Îea Sin șirui i’oi Fikoniiacci. Șirui iui FiSonnacci este
Intrebarea 2.11.19. Fie următorul program Java: dat dc recurența liniară de ordin 2:
public class Program ( a, = a = l;
public static void main(String argsl]) (
int v() - (2, 4, -2, 8, -2}, i 0, suma = 0;
Generalizare la recurențe liniare de ordin k, k 4 1, cu coeficienyi ărbitrari.
for (i = 0; i < 10; ++L) (
if (vfil < 0) continue;
suma += v[il;
4.5
FUNDAMENTELE LIMB AJULUI JAVA 115
114 JA\'A DE LA 0 LA EXPE RT
Exercițiul 2.12.10. Fie func¡ia lui Co//otz: f(n) = n/2 dacă n este par, și f(n) - 3 " n Generalizare: Scrieți toate combinațiile posibile de adunat e a două numere priine
+ 1 dacă n este impar. S.a se scrie un program Java care determină k natural ininim astfel egale cu un număr dat.
incat f (f ( ... f(n)...)) - 1, unde parantezele (,) apar de k ori. De exemplu, pentru n = 6
Proiectul 2.13.3. tjocul „hârtie, pumn, foarfece") Presupunem că avem doi jucători care
avem: f(6) = 3, f(3) - 10, f(10) - 5, f(5) - 16, f(16) - 8, f(8) - 4, f(4) - 2, f(2)
folosesc mana dreaptă pentru reprezentarea a trei obiecte: hârtie înseamnă palma
= 1, deci k natural minim este 8.
întinsă, pumn înseamnă mana stransă sub formă de pumn }i %nr/ece "înseamnă două
Exercițiul 2.12.11. Scrieți un program Java care calculează suma divizorilor naturali ai unui degete depărtate (semnul victoriei). Ei își arată simultan mina dreaptă in una din aceste
număr natural n. Un numL este perfect, dacă este egal cu suma divizorilor proprii pozitivi configurații (de mai multe ori). Dacă ei arată acelaşi lucru, este remiză (nu ciștigă
(de exemplu: 28 = 1 + 2 + 4 + Z + 14). Să se genereze primele 4 numere perfecte. nimeni). Dacă nu, se aplică una dintre următoarele trei reguli:
- Hartia acoperă pumnul (deci palma întinsă caștigă față de pumn).
Exercițiul 2.12.12. Presupunem că depunem o sumă (depozit la termen) Într-o bancă - Pumnul sparge foadecele.
care oferă o dobindă de 25 % (de exemplu) pe an. Să se calculeze suma finală dupa uri Foarfecele taie hartia.
anumit număr de ani (se va face capitalizarea contului, adică se va ține cont de Să se simuleze acest joc, făcind un număr arbitrar de evenimente și precizand
,dobanda la dobandă”). scorul final. Se cere să se joace persoană-calculator și, varianta a doua, calculator-
-calculator.
Exercițiul 2.12.13. Folosind operatori pe biți, scrieți metode Java care:
a) testează dacă uri număr de tip s h or tai n t /l onq este divizibil cu 2, 4, 8. Proiectul 2.13.4. O ruletâ este o maşină care selectează la intimplare un număr între 0
Generalizare (divizibilitate cu 2“n); și 35. Jucatorul poate paria pe un număr par/impar sau poate paria pe un nunl ar oarecare.
b) testează dacă un număr este pozitiv sau negativ; Ci}tigul unui pariu par/impar se prerniază cu 2/1 euro respectiv, cu exceptia cazurilor
c) calculează pentru un n dat, multiplii de 2, 4, ... Generalizare; în care ruleta alege 0. Dacă jucătorul ghiceşte numărul selectat de ruleta, atunci este
d) calculează pentru un n dat, [n/ *1. [n/4], ... Generalizare. plătit cu 35/1 euro. Să se simuleze acest joc, ¡tiind că jucăm pariuri de 1 euro }i avand
o sumă ini¡ială de n euro.
Proiectul 2.13.2. (Conjectura lui Goldbach} Orice număr par mai mare decit 2 se poate
scrie ca sumă a două numere prime. Scrieți uri program Java care verifica această
conjecmră pentru numere situate intre și n. De exemplu, dacă m-7 0 0 și n=110 0, atunci
trebuie afișat:
700 = 17 + 683
702 = 11 + 691
704 = 3 + 701
1098 = 5 + 1093
11 0 0 = 3 + 1 0 97
3. Clase, interfe{e
çi tablouri
Fie clarsa Ce c:
class Cerc (
3.2. Clase // date member
In Java este obligatorie int rasa, x, y;
Clasa este entitatea de bază a unui limbaj orientul spre obiecte. // constructor fara parametri
unei instan¡e (unui
definirea a cel putin unei clase. Nu este însă obligatorie crearea Cerc()(
care se vor utiliza date i metode statice.
obiect) a acelei clase, caz în raza = l;
O declarație de clasă în limbajul Java are sintaxa generală:
x = 20;
> (extends <NumeClasa›]
y = 20;
[implemen ts
[<DeclaratiiCOEpClaSa>) // constructor cu parametri
Cerc(int r, int a, int b) {
raza = r;
unde: potG:public,abstract, fina1(celm ult o sngura x = a;
- <ModificatoriClasa› y = b;
apariție ¡i, de preferat, în această ordine)¡
- <Identificator> reprezintă numele clasei;
(denumită clasă de bază Satl SH erclasâ)i // metoda publica
- <N umeC1 as a> este numele unei alte clase public void setRaza(int r) ( raza = r
- <De c l a rad i iCo rpC t asa> este o listă de declara¡ii de forma: Aceasta confine trei date membre de tip i mt: ra za, x §i y, doi constructori, unul
randul ei poate fi < De c 1 arat ie
• <Decia ratiiMembr uCIasa> care Îa cu parametri Ji unul fàrà parametri ;i e rr.elora puii!ica se VRa za l l .
Atribut>Sau <Dec1aratieMetoda> ;
<InitîalîzatOrS tatrC>; 3.2.1. Domeniul de vizibilitate al numelui unei clase
•
<Declar atiiConstruc tor>.
• atunci numele complet
Daca o clasă este declarată într-un pachet numit Pa c he t, , Domeniul de vizibilitate al numelui unei clase este intreg pachetul din care aceasta
consulta Exemplul
(calificaJ) a1 clasei este Pa chet . ‹IdentifiCator> (se poae face pane.
2.2.1). In caz contrar› dacă definim clasa intr-uri pachet fără riurne, atunci numele
> (se pot consulta Exemplele 2.4.8, 2.4.9 etc.). Exemplul 3.2.L Programul de mai jos intitulat DV . j ava face parte din pachetul cu
elase este o metodă care are numele respectivei clase. numele Pa che L. Constructorul clasei DV va crea două obiecte din clasele C1, respectiv
nu au tip, nici măcaf voi d. Constructorii SUilt c 2. Spre deosebire de exemplele precedente, clasa C1 conține un obiect din clasa C 2 și
unui obiect din clasa respectivă șÎ suflt UtiliZați invers. Deoarece domeniul de vizibilitate a unei clase este pachetul in care se află, rezultă
apela¡i autOffiat 1f1 momentul creării
pentru irlițializarea datelor membre. că putem referi un obiect din clasa Cl in clasa C2 (și reciproc). Dacă nu ar fi
Dacă pentru o clasă nu declarăm nici un construCtOr, atunci la compilare se fost conținute in acelaşi pachet, am fi obtinut eroare la compilare.
c la ss C1 l
3.2.2. Modificatorii unei clase
/* date membre */ In definiția clasei, modificatorii unei clase, care sunt notați cu <Mo di f i cal or i Cia s a>,
int x;
pot fi: pub 1 i c, abs t ra c L, f in a1 (de preferat, în această ordine). Aceştia pot avea cel
C2 c2; mult o singură apariție, în caz contrar apare o eroare la compilare.
/* constructor */
Dacă o clasa este declarată pub 1 i c, atunci aceasta poate fi accesată de orice cod
c1(C2 c2) ( nava care poate accesa pacheml În care este definită această c(asă. Dacă o clasă nu este
this.x - c2.x; declarată pub l i c, atunci aceasta poate fi accesată doar din pachetul în care este declarată.
this.c2 = c2;
O clasă este absirocia dacă aceasta este incomplet definită (conține o metodă
neimplementată). Doar clasele abstracte pot avea metode abstracte (neimplementate).
/* definirea unei metode */
Dacă o clasă conține o metodă abstractă și nu este declarată ab s t£ act, atunci se
public String tOString() (
obține o eroare la compilare. O clasă C are metode abstracte în unul din cazurile:
return x = + x " c2 = " + c2;
1. Clasa C conține o declarație a unei metode abstracte;
2. Clasa C moștenește o metodă abstractă de la o altă clasă;
3. Cind există o interfață care implementează clasa C și care declară sau moște- ne¡te
o metodă (care este clar că este abstractă, deoarece o interfață nu are metodele
/* date membre*/ definite) și clasa C nu declară și nici nu mo}tenește o metodă care o
implementează.
int x;
C1 cl;
/* constructor */
Exemplul 3.2.2. In. con.tin.u*r.• prezentăm a-- Java care Sefine§te o cÎasă
C2(int x) (
derivată dintr-o clasă abstractă și o interfață.
this.cl = new Cl(thiS); // definirea unei clase abstracte
abstract class C1 (
/* definirea unei metode ’/ // declararea datelor membre
public String tostring() ( t