teorie java

Upload: irish-alicarte

Post on 13-Oct-2015

131 views

Category:

Documents


10 download

DESCRIPTION

Teorie java

TRANSCRIPT

Cursuri Java

1.Ce este Java

un limbaj de programare, ale crui caliti i-au permis rspndirea rapid, fiind n prezent unul din limbajele cele mai larg folosite. un mediu de execuie pentru aplicaiile Java, numit n prezent n englez "Java 2 Runtime Environment", care conine maina virtual Java i un nucleu al bibliotecilor de clase Java;

o platform pentru dezvoltarea de aplicaii n care se folosete limbajul Java, care se numete n prezent n englez "Java 2 Platform" i conine:

compilatorul Java (Java Compiler);

maina virtual Java (Java Virtual Machine);

bibliotecile de clase Java (Java Class Libraries);

vizualizatorul de appleturi Java (Java AppletViewer);

depanatorul Java (Java Debbuger) i alte instrumente de dezvoltare;

documentaia;

o tehnologie software puternic i modern, care corespunde cerinelor lucrului n reele de calculatoare

2.Caracteristici ale limbajului Java

Java este un limbaj de programare de utilizare larg, care are urmtoarele proprieti:

este simplu: dei sintaxa se aseamn cu cea a limbajelor C/C++, au fost eliminate acele aspecte care constituiau surse de erori sau produceau confuzii;

este orientat pe obiecte: n limbajul Java nu este posibil s se scrie aplicaii care nu respect normele programrii orientate pe obiecte;

este robust: programele scrise n Java sunt foarte fiabile, deoarece sunt prevzute numeroase verificri att la compilare, ct i n timpul executrii;

este sigur: fiind destinat lucrului n reele de calculatoare, la realizarea sistemului Java s-a avut n vedere necesitatea ca programele s nu poat aduce daune calculatoarelor pe care ruleaz, cum ar fi accesul neautorizat la informaie sau chiar distrugerea acesteia;

este portabil, adic programul poate fi mutat de pe un calculator pe altul, de alt tip hardware i/sau cu alt sistem de operare;

este compilat i interpretat: programul surs, scris n limbajul Java, este translatat de ctre compilatorul Java ntr-un program intermediar sub form de cod de octei (engleza: bytecode). n timpul execuiei, acest cod de octei este interpretat de ctre maina virtual Java, care conine un interpretor;

este neutru fa de arhitectur: codul de octei generat de compilatorul Java nu depinde de arhitectura echipamentului pe care acesta va fi executat, deoarece el nu este executat direct de ctre procesorul hardware al acestui echipament, ci este interpretat de ctre maina virtual Java;

permite programarea concurent: n limbajul Java se pot scrie programe cu mai multe fire de execuie (engleza: multithreading), care pot fi executate simultan i sincronizate;

este dinamic, deoarece legarea ntre ele a claselor i obiectelor nu se face static (la compilare), ci dinamic (n momentul execuiei);

este distribuit, adic permite realizarea de programe utilizabile n reele heterogene (care conin calculatoare de tipuri diferite); 3. Maina virtual Java -este, n general, implementat software sub forma unui produs program adecvat calculatorului pe care acesta se instaleaz.

Ideea de baz a limbajului i tehnologiei Java, este ca - pe baza acestora - s se poat creea produse software neutre fa de arhitectura sistemului de calcul, deci care s poat fi executate pe orice echipament, de la produse de uz casnic comandate numeric (televizoare, telefoane, maini de splat, frigidere, etc) pan la supercalculatoare. Ea se exprim prin sloganul "Write Once, Run Anywhere" (scrie o singur dat i ruleaz oriunde), care arat c un program, dup ce a fost scris i compilat, poate fi executat (rulat) pe orice calculator.

Pentru realizarea acestui obiectiv, s-a decis ca n tehnologia Java portabilitatea programelor sa se realizeze la nivel de cod de octei (bytecode), adic sub forma de cod binar destinat unui calculator abstract, numit maina virtual Java4. Implementarea mainii virtuale Java

De regul, arhitectura i setul de instruciuni al calculatorului, pe care se execut un program Java, difer de cele ale mainii virtuale Java. n consecin, codul de octei generat de compilatorul Java nu poate fi executat nemijlocit de procesorul (procesoarele) calculatorului pe care acesta se execut.

Dac este realizat software (aa cum se ntampl n majoritatea cazurilor), maina virtual Java este ea nsi un produs program, care este scris i compilat special pentru tipul de calculator pe care se instaleaz, deci folosete setul de instruciuni nativ al acestuia. Acest produs program trebuie s respecte specificaia mainii virtuale Java, dar realizarea concret depinde de tipul de calculator pe care se instaleaz. Mai mult, pentru acelai calculator pot fi realizate mai multe maini virtuale Java, care toate respecta specificaia, dar difer ntre ele prin modul de realizare.

n principiu, componenta principal a mainii virtuale Java este un interpretor, adic un program care parcurge instruciunile coninute n codul de octei Java din memoria mainii virtuale Java i le convertete n instruciuni native, care pot fi executate de procesorul calculatorului gazd. Aceast conversie necesit un anumit timp, din care cauz durata de execuie a unui program interpretat este intotdeauna mai mare dect a unuia compilat direct n codul nativ. Din aceast cauz, principala deficien care se semnala la primele implementri ale mainii virtuale Java era c durata de execuie a programelor era sensibil mai mare dect a celor scrise in limbaje "tradiionale" compilate, cum ar fi C, C++, Pascal, Fortran etc.

Implementrile moderne ale mainii virtuale Java se caracterizeaz prin mrirea sensibil a vitezei de executie, care se apropie deja de cea a programelor compilate. Aceasta se realizeaz, n special, prin introducerea unei compilri "just in time": codul de octei este compilat, n momentul execuiei, in cod nativ pentru calculatorul gazd i abia apoi este executat.

Desigur c cea mai eficient reducere a duratei de execuie se produce atunci cnd maina virtual Java este implementata hardware, astfel nct codul de octeti Java (bztecode) este cod nativ al acestei maini. n acest caz, durata de execuie a programului este aceeai cu cea a unui program compilat tradiional.

5. Tipuri de produse software scrise n Java

Limbajul Java este folosit cel mai frecvent pentru a scrie urmatoarele trei tipuri de programe:

aplicaie - este un produs software care se instaleaz pe un anumit calculator i funcioneaz direct sub controlul sistemului de operare, avnd acces la toate resursele calculatorului respectiv. Una din clasele aplicaiei trebuie sa conin metoda principal, cu care ncepe execuia aplicatiei. Aceast metod se numete main i are forma:

public static void main(String args[]) { // corpul metodei }

applet (miniaplicaie) - este un program care se transmite sub form de cod de octei (bytecode) prin reeaua de calculatoare i este executat n cadrul unui navigator (browser) de Web, fr a avea acces la fiierele sau sistemul de intrare/ieire al calculatorului pe care se execut; servlet - un program care se execut pe un server dein reea.

6. Introducere n programarea orientat pe obiecte

Programarea orientat pe obiecte (POO) este o form de programare, n care programatorii definesc clase de obiecte, iar programul conine un ansamblu de clase i obiecte, care comunic ntre ele prin mesaje.

Clasa este o extensie a conceptului de tip de date i conine o structur de date, mpreun cu metodele (functiile) care se aplica acestor date.

Obiectul este o instantiere (o instanta) a clasei. In acelasi program se pot folosi mai multe obiecte apartinand aceleeasi clase, sau unor clase diferite. Fiecare obiect se caracterizeaza prin stare si comportament. Starea obiectului depinde de datele pe care acesta le contine, in timp ce comportamentul este dat de metodele clasei respective.

In general, comunicarea prin mesaje consta in invocarea de metode. Daca obiectul a invoca o metoda a obiectului b, aceasta poate avea ca efect modificarea starii obiectului b (adica modificarea unor date continute in structura de date a lui b) si/sau poate primi o valoare intoarsa de metoda respectiva. Se considera ca, prin invocarea metodei, obiectul a a transmis un mesaj obiectului b, ceeace a provocat din partea acestuia un anumit raspuns (deci b a manifestat o anumita comportare).

Atat variabilele, cat si metodele pot fi statice sau nestatice. Variabilele statice (ale clasei) apartin clasei, adica au aceeasi valoare pentru toate obiectele clasei respective. Variabilele de instanta (nestatice) apartin obiectului (instantei), deci au valori diferite de la un obiect la altul.

Metodele statice (ale clasei) pot folosi numai variabilele statice ale clasei respective, in timp ce metodele nestatice pot folosi atat variabilele statice, cat si pe cele ale instantei.

Din punct de vedere al modului de acces, datele si metodele unei clase pot fi publice sau private. Cele publice sunt accesibile din orice alta clasa, in timp ce cele private sunt accesibile numai din clasa careia ii apartin.

7. Sablon de aplicaie simpl n limbajul Java

n prima parte a acestui curs, n aplicaiile fcute la curs i la laborator vom utiliza urmtorul ablon:

class { public static void main(String args[]) { // corpul metodei main } }

Prile scrise cu negru (inclusiv parantezele i acoladele) le vom considera obligatorii, iar cele scrise cursiv cu rou sunt la latitudinea programatorului.

- este numele clasei, fiind ales de ctre programator cu respectarea urmtoarelor condiii: - numele clasei trebuie s nceap cu o liter i este format numai din litere, cifre i - eventual - liniua de subliniere; - prin convenie (dei aceasta nu este o regul de sintax), numele de clas ncepe ntotdeauna cu o majuscul; - n cazul numelor compuse din mai multe cuvinte, fiecare cuvnt ncepe cu majuscul; - lungimea numelui nu este limitat, dar nu este recomandabil sa fie prea mare.

// corpul metodei main - este o succesiune de instruciuni i comentarii care respect sintaxa limbajului Java

8. Editarea fisierului surs

Pentru nceput, vom considera c aplicaia este constituit dintr-o singur clas, care respect ablonul indicat anterior. Programul surs pentru aceast clas va fi editat sub forma unui fiier separat, care are acelai nume cu clasa i are extensia .java.

Pentru crearea fiierului se va folosi un editor de text simplu, care genereaz numai text neformatat, de exemplu "Notepad" daca lucrai sub Windows sau sub Linux cu WinLinux99, respectiv "Text Editor" sau "Advanced Editor", daca lucrai sub Linux cu KDE.

9. Compilarea i eliminarea erorilor semnalate de compilator

Translatarea programului surs n program sub forma de cod de octei (bytecode) se face cu ajutorul compilatorului Java, numit javac. n acest scop, va deplasai n subdirectorul n care se gsete programul surs pe care dorii s-l compilai i dai comanda javac

Dup ce ai dat aceast comand, vei obine unul din urmtoarele rezultate:

1. Pe ecran apare din nou promptul sistemului de operare, fr a se afia un mesaj de eroare. n acest caz, compilarea a decurs normal, iar dac dai comanda dir vei constata ca n subdirectorul curent a aprut un nou fiier, care poart numele clasei i extensia class. Acesta este fiierul care conine bytecode-ul clasei compilate.

2. Obinei un mesaj de eroare, care indic fie c exist erori n program, care au fost sesizate de compilator, fie c exist erori n linia de comand prin care ai cerut compilarea. n ambele cazuri, este necesar s eliminai erorile i s reluai compilarea

10. Executarea aplicaiei

Dac n directorul curent exist fiierul .class, executarea acestei aplicaii se solicit prin comanda java Remarcm c se d ca parametru numai numele clasei, fr extensia class. Efectul acestei comenzi este, fie executarea aplicatiei, fie aparitia unui mesaj de eroare de execuie. Prin comanda java se pune n execuie interpretorul mainii virtuale Java. Acest interpretor verific dac n directorul curent exist fiierul .class. Daca acesta exist, ncarc n memorie codul de octei pe care l conine i pune n execuie metoda public static void main(). Dac fiierul nu exist, sau dac el nu conine o astfel de metod, se semnaleaz printr-un mesaj de eroare.

11. ERORI LA COMPILARE SI INTERPRETARE

Exemplul 1 de eroare Considerm c, dup ce ai creat fiierul surs PrimaAplicatie.java, dai comanda jamac PrimaAplicatie.java n care numele compilatorului este introdus greit (jamac n loc de javac). Ca efect, vei obtine un mesaj prin care se arat c cuvantul jamac nu este o comand corect (nu este numele unei comenzi interne a sistemului de operare sau numele unui program executabil), de exemplu: jamac: command not found

Exemplul 2 de eroare S considerm acum c numele fiierului surs este introdus greit, de exemplu: javac PimaAplicatie.java n acest caz, mesajul de eroare este can't read: PimaAplicatie.java adic "nu pot citi: PimaAplicatie.java", ceeace nseamn c un astfel de fiier nu exist n directorul curent.

Exemplul 3 de eroare S urmrim ce se ntmpl dac introducem comanda javac PrimaAplicatie n care numele fiierului este corect, dar lipeste extensia. n acest caz, obtinei urmtorul mesaj: PrimaAplicatie is an invalid option or argument. usage: javac urmat de o lista de opiuni. Aceasta nseamn c nu s-a respectat sintaxa comenzii, care cere ca comanda javac s fie urmat (eventual) de una sau mai multe opiuni din lista dat, dup care trebuie s apar numele fiierului (fiierelor) surs care trebuie compilate. Aceste nume de fiiere trebuie sa conin obligatoriu extensia java12. iruri

irul se reprezint n program printr-o succesiune de caractere cuprins ntre ghilimele. Iat cteva exemple de iruri: "sir de caractere" "ABCDefgh" "1A23bc7" "*+_/?" "" Ultimul exemplu este un ir vid (care nu conine nici un caracter).

13.Operatii asupra sirurilor de caractere

Concatenarea irurilor

Asupra irurilor se poate aplica operaia de concatenare, reprezentata prin operatorul +. Expresia ir1+ir2, n care operatorul + este plasat ntre dou iruri, are ca rezultat un nou ir, care conine cele dou iruri-operanzi puse unul dup altul. De exemplu, expresia "abcde"+"fgh" d ca rezultat irul "abcdefgh". Operaia de concatenare este asociativ, dar nu este comutativ.

De exemplu, expresiile urmtoare sunt echivalente, ca urmare a asociativitii: "ABC"+"DEF"+"GH" ("ABC"+"DEF")+"GH" "ABC"+("DEF"+"GH") "ABCDEFGH"

n schimb, expresia "uvw"+"ab" este echivalent cu "uvwab", n timp ce expresia "ab"+"uvw" este echivalent cu "abuvw", deci concatenarea nu este comutativ

14.Metode pentru afiarea pe ecran a irurilor

n capitolul precedent, am folosit deja pentru afiarea irurilor de caractere metoda System.out.println() la care vom aduga acum i metoda System.out.print() n ambele metode, argumentul este un ir de caractere, care se afieaza pe ecran. Deosebirea dintre ele const n faptul c, dup afiarea irului, metoda println transmite i comanda de trecere la linie nou, n timp ce metoda print nu transmite o astfel de comand. n consecin, n cazul afirii cu println, urmtoarea afiare se va face de la nceput de linie nou, iar la afiarea cu print afiarea urmtoare se va face n continuare, pe aceeai linie. Numele metodei println provine de la print line, care se traduce prin "tiprete o linie". Metodele println si print aparin obiectului out din clasa System. n limbajul Java, clasa System conine metodele prin care se comunic cu sistemul de operare al calculatorului, iar obiectul out al acestei clase reprezint dispozitivul de ieire standard al sistemului, care este de obicei unitatea de afiare de la consol (ecranul).

Metoda println actioneaz la fel ca metoda print, cu deosebirea c adaug la sfritul irului afiat caracterul de control \n care constituie comanda de trecere la linie nou (New Line).

15. Unitile lexicale ale limbajului Java

Unitile lexicale, numite i lexeme (engl. token, lexeme) sunt construciile elementare ale limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumit semnificaie n limbaj. Dup rolul ndeplinit, unitile lexicale sunt: identificatori, cuvinte cheie, cuvinte rezervate, literali, separatori,operatori, comentarii i spaii.

16.Identificatori

Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc identificatori. Identificatorii se aleg de ctre programator, respectnd anumite reguli.

n limbajul Java, identificatorii sunt iruri formate din litere, cifre i caractere de subliniere ('_'), care ncep cu o liter. Lungimea identificatorului nu prezint importan, ns acesta nu poate conine spaii libere sau alte caractere, dect cele menionate aici.

17. Cuvinte cheie

n orice limbaj de programare, exist un set de cuvinte, numite cuvinte cheie, care sunt considerate simboluri sintactice i nu pot fi folosite n program ca identificatori. n limbajul Java, exist urmtoarele cuvinte cheie:

abstractdoubleintstrictfp

booleanelseinterfacesuper

breakextendslongswitch

bytefinalnativesynchronized

casefinallynewthis

catchfloatpackagethrow

charforprivatethrows

classgotoprotectedtransient

constifpublictry

continueimplementsreturnvoid

defaultimportshortvolatile

doinstanceofstaticwhile

Dintre acestea, const i goto nu sunt folosite n prezent, dar ele au fost introduse n tabela cuvintelor cheie n vederea unei eventuale utilizri viitoare.

Observm acum c toate exemplele de cuvinte cheie date la nceputul acestei seciuni (class, public, static, void) sunt prezente n tabela de mai sus.

18. Cuvinte rezervate

Se consider cuvinte rezervate acele cuvinte, care nu pot fi folosite ca identificatori, avnd semnificaii speciale. Cuvintele cheie sunt i ele considerate n majoritatea limbajelor, inclusiv Java, drept cuvinte rezervate. n afar de acestea, n limbajul Java exist urmatoarele cuvinte rezervate: true, false, null. Primele dou sunt valorile logice adevrat i fals, iar al treilea are semnificaia de referin nul. De fapt, aceste cuvinte rezervate sunt forme speciale de literali.

19. Literali

Literalii sunt reprezentrile n fiierele surs ale valorilor constante. Exemple de literali: - caractere: 'a', 'A', '+', '$', '5'; - iruri de caractere: "sir de caractere", "abc$79.28#^z"; - numere ntregi: 14726, -25413; - numere reale: 12.7389, -0.05673, 2.3075E12, -1.4237E-5; - valori logice: true, false; - referina nul: null.

20. Separatori

Separatorul este un caracter care delimiteaz formele sintactice sau le separ ntre ele. n limbajul Java se folosesc urmtorii separatori: { } ( ) [ ] ; , . Spaiul liber i operatorii indeplinesc, de asemenea, rolul de separatori.

Aproape toi aceti separatori au fost deja folosii n exemplele date n acest capitol.

21. Operatori

Operatorii sunt simboluri ale unor operaii. Am folosit deja simbolul + ca operator de concatenare (deci simbol al operaiei de concatenare). Operatorul poate fi format din unul sau mai multe caractere. Entitatea asupra creia se aplic operatorul se numete operand. Dup numrul de operanzi, operatorii pot fi unari, binari sau ternari.

Din punct de vedere matematic, operatorii sunt funcii cu unul, dou sau trei argumente (argumentele fiind operanzii). De exemplu, expresia a+b, n care + este un operator binar, iar a i b sunt operanzi, este o funcie de argumente a si b, care are ca valoare suma valorilor celor dou argumente.

Dup efectul operatorului asupra operanzilor, operatorii pot fi fr efect lateral, care lasa valorile operanzilor nemodificate, i cu efect lateral, care modific valorile operanzilor. Astfel, operatorul + din exemplul anterior, este un operator fr efect lateral. n schimb, n expresia ++a operatorul de incrementare ++ are efect lateral deoarece, n urma efectuarii operaiei, valoarea operandului a crete cu o unitate.

22. Comentarii in fisierul sursaDup cum s-a aratat deja, n fiierele surs pot fi introduse comentarii, care au rolul de a da omului, care citete programul respectiv, anumite explicaii necesare pentru o mai buna nelegere a acestuia. Din punct de vedere sintactic, ntregul comentariu este privit ca o singur unitate lexical, care este ignorat de ctre compilator, deci nu are efect asupra codului de octei generat de acesta.

23. Spaii

ntre unitile lexicale ale programului pot fi introduse orict de multe spaii libere, fr ca acestea s aib influen asupra sintaxei sau semanticii programului. Mai multe spaii libere succesive sunt tratate de compilator ca i cnd ar fi un singur spaiu.

24. Variabile

In matematic, variabila este un simbol dat unei valori, care aparine unei mulimi de valori ce constituie domeniul de definiie al variabilei respective.

n programare, variabila este un nume cruia i se asociaz o valoare. Numele variabilei este un identificator, iar valoarea variabilei trebuie s aparin unui anumit tip de date. Asupra valorilor variabilelor pot fi efectuate prin program anumite operaii.

25. Declararea i iniializarea variabilelor

n limbajul Java, orice variabil trebuie declarat nainte de a fi utilizat. Prin declararea variabilei se nelege precizarea, pentru compilator, a tipului i numelui acesteia. Iniializarea variabilei se face atunci, cnd acesteia i se d pentru prima dat o valoare i deci i se aloc spaiu n memorie. Dac, la declararea variabilei, aceasta nu este i iniializat n mod explicit, atunci ea este iniializata cu o valoare implicit, care va fi specificat la descrierea fiecrui tip

26. Variabile finale

n limbajul Java, se numesc variabile finale acele "variabile", ale cror valori nu pot fi modificate prin program. Acestea sunt deci, de fapt, nite constante cu nume. Ele se aseamn cu variabilele propriu-zise prin faptul c sunt tot perechi nume - valoare, numai c valoarea lor se d o singur dat, sub forma de iniializare n declaraia de tip sau sub forma de atribuire, dup care nu mai poate fi modificat. Se obinuiete ca numele de variabile finale s fie scrise n ntregime cu majuscule.

Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final, care este un cuvnt cheie 27. Tipul de date -este unul din conceptele fundamentale ale programrii calculatoarelor. Tipul de date este o mulime de valori, asociat cu o mulime de operaii care se pot face asupra valorilor respective.

n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.

n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.

28. Tipurile de date primitive sunt predefinite n limbaj. Aceasta nseamn c numele, mulimea de valori, mulimea de operaii i tipul rezultatului operaiilor pentu fiecare tip primitiv sunt impuse prin limbaj i, deci, nu trebuie definite i nu pot fi modificate de programator.

Tipurile de date primitive n limbajul Java se clasific astfel:

tipul boolean;

tipurile numerice

tipuri intregi: byte, short, int, long;

tipuri reale: float si double;

tipul char

Pentru fiecare tip de date vom arta reprezentarea extern, reprezentarea intern, operaiile i operatorii corespunztori.

Prin reprezentare extern, nelegem regulile dup care se scriu valorile datelor respective n programe, n documente sau pe ecranul calculatorului. Reprezentarea extern a valorii ntr-un program se numete literal.

Prin reprezentare intern, nelegem forma sub care datele respective apar n memoria mainii virtuale Java. O proprietate foarte important a reprezentrii interne a datelor este c aceasta, fiind destinat mainii virtuale Java, nu depinde de calculatorul concret pe care se va executa programul.

29. Operaia de atribuire

Prin operaia de atribuire se d (se atribuie) unei variabile o nou valoare, care o nlocuiete pe cea deja existent. Operatorul de atribuire este = (semnul egal, care ns aici se citete "se atribuie") este un operator binar cu efect lateral. Expresia a=b, n care a este o variabila, iar b este un operand care poate fi un literal, o variabil sau o expresie, are semnificaia "se atribuie variabilei a valoarea operandului b". Atribuirea este posibil numai daca valoarea operandului b este de acelasi tip cu variabila a, sau dac se poate converti implicit la acest tip. Atribuirea este o operaie cu efect lateral, deoarece produce modificarea valorii operandului situat n partea stnga a operatorului de atribuire.

30. Operaiile aritmetice

Operaiile aritmetice sunt cele care se aplic unor operanzi numerici, avnd ca rezultate tot numere. Dup numrul de operanzi, ele pot fi unare sau binare. Unele operaii aritmetice unare au i efect lateral.

Tipul rezultatului operaiilor aritmetice depinde de tipul operanzilor i va fi discutat la fiecare din tipurile numerice n parte. 31. Operaii de atribuire compus

Urmnd tradiia limbajului C, n limbajul Java exist i operatori de atribuire compus, n care operaia de atribuire este combinat cu una din operaiile aritmetice.

Operatorii de atribuire compus sunt urmtorii: +=, -=, *=, /=, %=, &=, |=, ^=, =, >>>=. Se observ c fiecare din aceti operatori are forma op= n care op este un operator aritmetic binar. Expresia variabila op= operand n care op este un operator aritmetic binar, este echivalent cu expresia variabila = variabila op operand i se evalueaz astfel: - se calculeaz mai nti valoarea expresiei (variabila op operand)n care variabila intr cu valoarea sa anterioar; - valoarea astfel calculat se atribuie ca noua valoare a variabilei din partea stnga. Aceasta noua valoare este, totodat, i valoare a expresiei.

32. Operatori binari

Operatorii binari nu au efect lateral - deci nu modific valorile operanzilor - i sunt dai n tabela de mai jos.

OperatorExpresieOperatieValoarea expresiei

+a+badunaresuma valorilor operanzilor

-a-bscaderediferenta valorilor operanzilor

*a*binmultireprodusul valorilor operanzilor

/a/bimpartirecatul (rezultatul impartirii) primului operand la al doilea

%a%bmodulorestul impartirii intregi a primului operand la al doilea

Prin mprire ntreag nelegem mprirea fcut astfel, nct ctul sa fie un numr ntreg (fr extragerea prii fracionare (situate dupa virgul).

33. Operaii de deplasare binar

Urmnd "tradiia" limbajului C, limbajul Java conine i operatori de deplasare binar. Acetia sunt operatori binari (cu doi operanzi) fr efect lateral. Tipul rezultatului operaiei se stabilete la fel ca n cazul operaiilor aritmetice cu numere ntregi. Valoarea rezultat se stabilete astfel: se ia reprezentarea intern a primului operand i se deplaseaz la stnga sau la dreapta cu un numar de poziii binare egal cu cel de al doilea operand.

Operatorii de deplasare i efectele lor sunt prezentate n tabela de mai jos, n care a i s sunt operanzi care aparin unor tipuri ntregi.

OperatorExpresieEfect

sdeplasare la dreapta cu s poziii binare, cu conservarea semnului

>>>a>>>sdeplasare la dreapta fr semn, cu s poziii binare

Deplasarea la stnga cu s poziii este echivalenta cu nmulirea numrului cu 2s. Dac s este suficient de mare, poate avea loc o depire binar, la fel ca n cazul nmulirii aritmetice (cu operatorul *).

Deplasarea la dreapta cu s poziii cu operatorul >> este echivalenta cu mprirea ntreag la 2s.

Deplasarea biilor la dreapta cu s pozitii cu operatorul >>> are asupra numerelor pozitive acelai efect ca cel al operatorului >>. n schimb, n cazul operanzilor negativi, n cazul operatorului >>> nu se mai conserv semnul, iar modulul numrului se modific. Aceasta se ntmpl, ntruct pe poziiile eliberate din partea stng se nsereaz bitul 0.

34. Operatia de comparareComparaiile sunt operaii binare fr efect lateral, n care se compar dou numere, obinndu-se ca rezultat o valoare de tip boolean. Operatorii prin care se efectueaz comparaia a dou numere se numesc operatori relaionali i sunt dai n tabela de mai jos.

OperatorSemnificatie

=mai mare dect sau egal cu

==este egal cu

!=este diferit de

35. Operaii logice pe bii

Tot urmnd "tradiia" limbajelor C/C++, n limbajul Java se pot utiliza pentru tipurile de date ntregi i operatorii logici pe bii ~, &, | si ^. Acetia sunt operatori fr efect lateral. Operaiile logice se fac la nivel de bit, adic ntre fiecare bit al operandului din stnga i bitul corespunztor al operandului din dreapta, considerndu-se ca 0 este echivalent cu false, iar 1 este echivalent cu true.

Operatorul unar ~ exprim negaia logic, deci nlocuirea lui 0 cu 1 i invers. Operatorii binari &, | si ^ acioneaz la fel ca n cazul tipului boolean, numai c se aplic la nivel de bit.

Aciunea operatorilor este dat n tabela de mai jos, n care a i b sunt cei doi operanzi, iar ai si bisunt biii de pe pozitia i a acestor operanzi. n tabel se d efectul fiecrei operaii asupra bitului i al rezultatului.

aibi~aa&ba|ba^b

001000

011011

100011

110110

36. Conversia de tip

Dac este necesar, datele pot fi convertite dintr-un tip n altul. Dup caz, conversia se poate face implicit, sau poate fi cerut explicit prin program.

37. Conversia de tip implicit se face atunci cnd prin conversie nu se pierde informaie. De exemplu, dac n expresia a=b variabila a este de tip int, iar b este de tip short sau byte, valoarea variabilei b va fi automat convertit la tipul int nainte de atribuire. n tabela de mai jos sunt indicate cu X toate conversiile de tip care se pot realiza inplicit. n coloana din stnga este tipul datei care este supusa conversiei, iar n capul tabelei (pe prima linie) tipul ctre care se face conversia.

byteshortintlongfloatdouble

byteXXXXX

shortXXXX

charXXXX

intXXX

longXX

floatX

De exemplu, tipul int se poate converti implicit n oricare din tipurile long, float sau double, dar nu i n tipurile byte sau short.38. Conversia de tip explicit se face prin operatorul unar numit cast, care are forma (tip), adic este format din numele tipului ctre care se face conversia, cuprins ntre paranteze. Acesta este un operator fr efect lateral, deci care nu modific valoarea operandului. De exemplu, expresia (byte)a se va folosi pentru a converti valoarea operandului a la tipul byte. Aceasta nseamn c valoarea variabilei a rmne neschimbat, ns valoarea expresiei (byte)a se obine din cea a lui a prin convertirea ei la tipul byte.

Utilizarea operatorului cast se justific atunci cnd, n situaia respectiv, conversia implicit nu este posibil. Nu este ns greit dac folosim acest operator chiar i cnd conversia respectiv se poate face i implicit. 39. Tipuri numerice

Sub aspect conceptual, datele care aparin acestor tipuri sunt numere, asupra crora pot fi aplicate operaiile aritmetice (adunare, scdere, nmulire, mprire) i operaiile de comparaie aritmetic (mai mic, mai mare, egal, diferit de).

Din punct de vedere matematic, aceste date pot fi numere ntregi sau reale. Existena mai multor tipuri n cadrul fiecreia din aceste dou categorii se datorete particularitilor de reprezentare a datelor n memorie.

Tipurile de date numerice n Java sunt urmtoarele:

tipuri ntregi: byte, short, int, long;

tipuri reale (n virgul mobil): float i double;

tipul char

40. Tipuri de date ntregi

Tipurile de date ntregi sunt byte, short, int, long i char. Conceptual, datele care aparin tipurilor byte, short, int i long sunt numere ntregi, n timp ce tipul char conine caractere (litere, cifre, semne de punctuaie etc).

ntruct caracterele se codific n memoria calculatorului prin numere ntregi fr semn, n limbajul Java asupra lor se pot aplica toate operaiile pentru numere ntregi. Totusi, datorit particularitilor pe care le prezint, noi vom trata tipul char separat. 41. Tipul BooleanMulimea de valori a acestui tip este {true, false}. Ea conine cele dou valori admise de logica boolean: true nseamn adevrat, iar false nseamn fals. Asupra datelor din acest tip pot fi aplicate operaiile de atribuire, de comparaie (== si !=) i operaiile algebrei booleene (operaiile logice).

Operatorii booleeni

Operatorul de negaie este un operator unar fr efect lateral i se reprezint prin simbolul ! (semnul exclamrii). Expresia !a, n care a este un operand boolean, se citete non-a i se interpreteaz ca negaia lui a: daca a are valoarea true, atunci !a are valoarea false i invers.

Operatorii logici binari sunt operatori fr efect lateral, prin care se realizeaz operaiile logice I, SAU i SAU-EXCLUSIV. - Operatorii & si && realizeaza operatia logica I. Expresiile a&b i a&&b ,n care a i b sunt operanzi de tip boolean, are valoarea true (adevrat) dac i numai dac att a ct i b au valoarea true. n celelalte cazuri expresia are valoarea false. - Operatorii | si || realizeaz operaia logic SAU. Expresiile a|b i a||b , n care a i b sunt operanzi de tip boolean, are valoarea false dac i numai dac ambii operanzi au valoarea false. n celelalte cazuri expresia are valoarea true. - Operatorul ^ realizeaz operatia logic SAU-EXCLUSIV. Expresia a^b , n care a i b sunt operanzi de tip boolean, are valoarea true dac i numai dac cei doi operanzi au valori diferite (unul este adevrat, iar cellalt fals). Dac cei doi operanzi au valori identice, valoarea expresiei este false.

42. Operaii i operatori pentru date de tip ntreg

Asupra datelor de tip ntreg se pot aplica operaii de atribuire, de conversie de tip, operaii aritmetice, de comparaie, operaii de deplasare binar, operaii logice pe bii i operaii de atribuire compus. Primele trei au fost discutate anterior i vom indica aici numai unele particulariti ale aplicrii lor n cazul datelor de tipuri ntregi.

Conversia de tip i atribuireaDiferitele tipuri de date ntregi difer ntre ele prin lungimea reprezentrii lor interne. La convertirea unui tip mai scurt n unul mai lung (de exemplu a unui byte sau short n int) valoarea numrului rmne neschimbat. Din aceast cauz, aceast conversie se poate face implicit. n schimb, la conversia de la o lungime mai mare la una mai mic, se rein numai octeii situai n partea dreapt a numrului, eliminndu-se octeii din stnga care depesc noua lungime. Prin aceasta este posibil s se modifice valoarea numrului i chiar semnul lui. Din aceast cauz, la efectuarea unor astfel de conversii, programatorul trebuie s-i asume raspunderea folosind operatorul cast.

43. Tipuri de date n virgul mobil

Mulimile de valori pentru tipurile de date n virgul mobil

Conceptual, datele care aparin acestor tipuri sunt numere reale. n limbajul Java exist dou tipuri de date reale (numite i tipuri de date flotante sau n virgul mobil):

TipulLungimeaIntervalul de valori

float4 octeti (32 biti)[-3.402347e+38f, ... 3.402347e38f]

double8 octeti (64 biti)[-1.7976931348623157e+308, ... 1.7976931348623157e308]

Reprezentarea extern a numerelor n virgul mobil se poate face n urmtoarele moduri: a/ ca numere reale fr exponent, n care partea ntreag este separat de cea fracionara prin punct; b/ ca numere reale cu exponent, n care un numr ntreg sau unul real fr exponent, numit mantisa sau coeficient, este urmat de un exponent zecimal, format din litera e sau E urmata de un numar intreg. Semnificaia este c mantisa se nmultete cu 10 ridicat la o putere egal cu exponentul.

O caracteristic important a numerelor n virgul mobil este precizia. Se numete precizie numrul maxim de cifre semnificative pe care l poate avea mantisa pentru tipul de date respectiv. Aceasta depinde de numrul de bii alocai mantisei n reprezentarea intern. n cazul limbajului Java, datele de tip float pot avea cel mult 7 cifre semnificative, iar cele de tip double cel mult 16 cifre semnificative. n reprezentarea extern a numrului se pot folosi i mai multe cifre, dar cele care depesc lungimea admis nu vor fi luate n consideraie la conversia din forma extern n cea intern.

44. Tipul charTipul de date charDatele de tip char sunt caractere, adic simboluri tipografice elementare: litere, cifre, semne de punctuaie, simboluri matematice, etc.

n limbajul Java, reprezentarea intern a caracterelor se face pe 2 octei (16 bii), n sistemul Unicode. In acest sistem, caracterele sunt codificate n memoria intern prin numere ntregi pozitive n intervalul [0, 65535]. n fluxurile de date de intrare/ieire i n fiiere, caracterele pot fi reprezentate i n alte coduri. Codul cel mai frecvent folosit n aceste scopuri este ASCII, n care reprezentarea caracterelor se face pe un singur octet, deci prin numere ntregi fr semn n intervalul [0, 255].

Remarcm ca datele de tip char sunt singurul tip de date ntregi fr semn din limbajul Java, mulimea de valori a acestui tip de date fiind intervalul de numere naturale [0, 65535].

Reprezentarea extern a caracterelor se face n una din urmtoarele forme: a/ punnd caracterul respectiv ntre apostrofuri: 'a', 'B', '+', '(', '3', etc; b/ folosind o secven escape, n care apare codul numeric hexazecimal al caracterului respectiv, n Unicode, de ex: '\u006c' sau '\uffff'; ntr-o astfel de secven, codul numeric al caracterului (format din patru cifre hexazecimale) este precedat de \u; c/ folosind o secventa escape pentru caracterele speciale din urmatorul tabel:

CaracterulReprezentarea in UnicodeSemnificatia

'\b''\u0008'deplasare la stnga cu o poziie (backspace)

'\t''\u0009'tabulare orizontal (horizontal tab)

'\n''\u000a'trecere la linie nou (line feed, NL)

'\f''\u000c'salt la pagina nou (form feed)

'\r''\u000d'ntoarcerea carului (carriage return, CR)

'\"''\u0022'ghilimele (double quote)

'\'''\u0027'apostrof (single quote)

'\\''\u005c'bar invers (backslash)

Datele de tip char pot fi folosite n operaii numerice, n care caz ele sunt interpretate drept numere intregi fr semn, conform cu reprezentarea lor intern prin numere binare. Din acest motiv, n limbajul Java datele de tip char sunt incluse n categoria celor de tipuri ntregi.

45. Expresii cu date primitive

n programare, expresia este o combinaie permis ("legal", corect) de simboluri, care reprezint o valoare. Tipul expresiei este acelai cu tipul valorii ei. Putem avea, deci, expresii de tip boolean, int, long, float, double etc. Fiecare limbaj de programare are regulile sale, prin care se stabilete ce expresii sunt permise sau nepermise.

n limbajul Java, expresia poate conine literali, variabile, operatori, operanzi, funcii i paranteze i trebuie s poat fi evaluat (calculat), astfel nct s se obin o valoare.

46. Precedena operatorilor

La evaluarea unei expresii, prezinta o importan deosebit ordinea n care se aplic operatorii pe care i conine, deoarece de aceast ordine poate s depind valoarea expresiei. n toate limbajele de programare, n care se folosesc expresii, se stabilesc i anumite reguli de preceden i de asociativitate, pe baza crora se stabilete ordinea de evaluare.

Fiecrui operator i se asociaz o preceden, adic un nivel de prioritate n aplicarea operatorului respectiv. De exemplu, n expresia a+b*c operatorul * se va aplica naintea operatorului +, deoarece are precedena superioar. n consecin, aceasta expresie se va calcula ca i cnd ar fi scris sub forma a+(b*c).

n limbajul Java, la stabilirea ordinii operaiilor se aplica urmtoarele reguli:

- operatorii unari se aplic naintea celor binari; - expresiile din interiorul parantezelor se evalueaz naintea celor din exterior; - dac, ntr-o expresie, toi operatorii au acelai nivel de preceden, ei se aplic de la stnga la dreapta; - operanzii unui operator se evalueaza nainte de a se aplica operatorul respectiv (deci operatorul se aplic ntotdeauna asupra valorilor operanzilor si); dac operaia este binar, operandul din partea stng se evalueaz naintea celui din partea dreapt; - nivelul de preceden al operatorilor se stabilete conform cu tabela de mai jos, n care:

toi operatorii din aceeai celul a tabelei au acelai nivel de preceden;

operatorii de pe un nivel superior se aplic naintea celor de pe nivelurile inferioare.

47. Expresia condiional

Urmnd "tradiia" limbajului C, n limbajul Java exist operatorul ternar (cu trei operanzi) ?: numit operatorul condiional, care este utilizat n cadrul urmtoarei expresii condiionale: operand1 ? operand2 : operand3 unde: operand1 - expresie boolean; operand2 i operand3 - expresii de tipuri compatibile: fie ambii operanzi de tip boolean, fie ambii de tipuri numerice, fie ambii de tipuri referin.

Evaluarea expresiei decurge astfel: - se evalueaz operand1 obinndu-se o valoare boolean; - dac operand1 are valoarea true, atunci valoarea expresiei condiionale este cea care se obine evalund operand2; altfel, este cea care se obine evalund operand3.

48. Instruciuni

n limbajul Java, procesul de calcul este controlat de instruciuni (enunuri). Fiecare instruciune indic una sau mai multe aciuni pe care trebuie s le execute calculatorul. Corpul oricrei metode este constituit dintr-o succesiune de instruciuni. Executarea metodei const n executarea acestor instruciuni ntr-o ordine determinat. Instruciunile pot fi grupate n blocuri.

Dup structura lor, instruciunile pot fi simple sau structurate.

Instruciunile simple nu conin n interiorul lor alte instruciuni. Exist trei categorii principale de instruciuni (enunuri) simple: declaraiile de variabile locale, instruciunile-expresie i instruciunea vid. La scrierea lor se respect urmtoarele reguli:

toate instruciunile simple se termin cu caracterul ';' (punct i virgul). Instruciunea vid este format numai din acest caracter;

declaraiile de variabile locale servesc pentru a specifica tipul, numele i (opional) valoarea iniial a variabilelor. Forma sintactic i utilizarea declaraiilor au fost prezentate anterior;

instruciunile-expresie sunt formate dintr-o expresie de atribuire, de incrementare/decrementare sau de invocare de metod, urmat de caracterul ';'.

49. Principiile programrii structurate

Programarea structurat este o orientare n conceperea i alctuirea programelor, avnd ca obiectiv o mai bun gestionare a complexitii acestora, innd cont de particularitile gndirii umane.

Conform metodei programrii structurate, la conceperea unui program, este recomandabil s se respecte urmtoarele principii:

1. Teorema de structur: orice program poate fi ntocmit folosind numai trei structuri de control fundamentale: structura secvenial, structura alternativ i structura repetitiv. 2. La conceperea programelor se recomand s se aplice tehnica de elaborare descendent (n englez Top-Down), numit i tehnica rafinrilor succesive. 3. Domeniile de valabilitate (de vizibilitate) ale variabilelor i structurilor de date trebuie s fie limitate.

50. Structura secvenial

n mod "natural", se consider c instruciunile se execut n ordinea n care acestea figureaz n program. nlnuirea instruciunilor (transmiterea "controlului" de la o instruciune la alta) se face, n acest caz, conform schemei logice din figura 1.

n pseudocod, aceeai secven de program se scrie astfel:

....

Exist, deci, un numr oarecare (n) de instruciuni, care se execut una dupa alta, n ordinea n care sunt scrise n program.

51. Structura alternativ (condiional, de decizie)

Un fragment de program are structura alternativ (numit i structur condiional sau de decizie), atunci cnd se alege una din dou ci posibile, n funcie de modul n care este satisfcut sau nu o anumit condiie. Se observ c exist o asemnare ntre instruciunea alternativ i expresia condiional. n ambele cazuri se verific dac este satisfacut o condiie i - n funcie de rezultatul obtinut - se alege una din dou variante posibile. Deosebirea este urmtoarea: - n cazul expresiei condiionale se alege una din cele dou expresii coninute n aceasta, iar rezultatul obinut este valoarea expresiei astfel alese; - n cazul structurii de control alternative se alege una din cele doua instruciuni coninute n aceast structur; instruciunea astfel aleas este executat, iar rezultatul obinut este efectul (lateral) produs de executarea acestei instruciuni.

52. Instruciunea if

Instruciunea if servete pentru realizarea structurii alternative din programarea structurat. Sub forma ei cea mai simpl, aceast instruciune se scrie astfel: if(expresie_boolean) instruciune unde instruciune poate fi orice instruciune valabil n limbajul Java: instruciune simpl sau structurat, inclusiv un bloc sau un alt if. Remarcm c n forma general de mai sus nu am pus la sfrit caracterul ';' (punct i virgul). Dac instruciune este o instruciune simpl, ea include i acest simbol.

Semnificaia instruciunii if este urmtoarea: dac valoarea expresiei booleene din parantez este true, atunci se execut instruciune, iar altfel nu se execut nimic, continundu-se programul.

53. Instruciunea if .. else

Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma

if(expresie_boolean) instruciune_1 else instruciune_2

n care instruciune_1 i instruciune_2 pot fi instruciuni simple sau structurate.

Interpretarea acestui if..else este urmtoarea: dac expresie_logic are valoarea true, atunci se execut instruciune_1, iar altfel se execut instruciune_2. 54. Structura repetitiv (ciclu, bucl)

n cazul structurii de control repetitive, o instruciune sau o secven de instruciuni se repet ct timp este satisfacut o anumit condiie. Structura repetitiv fundamental, acceptat n teoria programrii structurate, este cea de ciclu cu test iniial. Schema logic a acestei structuri de control este dat n figura 3.

Executarea acestei structuri are loc astfel: 1. se evalueaz expresia boolean care reprezint Condiia; 2. dac valoarea acestei expresii este true, deci condiia este satisfacut, se merge pe ramura DA i se executa instruciunea din corpul ciclului, dup care se trece la punctul 1; 3. altfel (deci dac condiia nu este satisfacut) se merge pe ramura NU i se iese din ciclu.

Se observ, deci, c se va executa instruciunea n mod repetat, ct timp este satisfcut condiia. n pseudocod, aceast structur de control se programeaz astfel:

ct_timp execut sfrit_ciclu

n unele versiuni de pseudocod, n loc de o singur se poate pune o secven de instruciuni.

Dei, din punct de vedere al teoriei programrii structurate, ciclul cu test iniial este suficient ca structur repetitiv, n multe limbaje de programare (inclusiv Java), din motive de comoditate a programrii se admite i o a doua form de astfel de structur, numit ciclu cu test final. Schema logic a acestui ciclu este dat n figura 4.

55. Instruciunea switch

Dei n teoria programrii structurate se demonstreaz c, pentru a realiza programe cu structur ramificat, este suficient s se foloseasc structura de control alternativ, realizat n limbajul Java prin instruciunea if..else, n practica programrii se admit i structuri de comutare sau de selecie, care sunt prezente in diferite limbaje de programare. Aceste structuri permit s se aleag una din mai multe ramuri paralele,alegerea depinznd de valoarea unei expresii numit comutator sau selector. n acelai timp, ele respect principiul de baz al programrii structurate, conform cruia fiecare structur de control trebuie s aib un singur punct de intrare i un singur punct de ieire, astfel c se ncadreaz n aceast metod de elaborare a programelor. n limbajul Java, structura de comutare se realizeaz prin instruciunea switch, care are urmtoarea form general:

switch (expresie) { case valoare_1: secven_1 [break;] case valoare_2: secven_2 [break;] .......................... case valoare_N: secven_N [default: secven ] }

n care: - switch, case si default sunt cuvinte cheie ale limbajului Java; - expresie este o expresie de tip byte, short, int sau char; - valoare este fie un literal de tip byte, short, int sau char, fie o expresie constant de tip int, adic o expresie care conine numai literali sau variabile finale din tipurile menionate; - secvena este o secven de instruciuni simple sau structurate; - parantezele drepte roii []nu apar n program, ci indic faptul c coninutul lor este opional (poate sa lipseasc).

56. Instruciunea while (ciclul cu test iniial)

Aceast instruciune are forma general

while (condiie) instruciune

n care condiie - este o expresie de tip boolean; instruciune - poate fi orice instruciune (simpl sau structurat) a limbajului Java, inclusiv alt instruciune while.

Executarea acestei instruciuni se face astfel: se evalueaz expresia boolean condiie i - dac valoarea acesteia este true, deci condiia este satisfacut - se execut instruciune,dup care se revine la evaluarea condiiei. acest ciclu se repet ct timp este satisfacut condiia.

57. Instruciunea for (ciclul cu contor generalizat)

n unele limbaje de programare, pentru realizarea ciclurilor la care numrul de pai este dinainte cunoscut, se folosete o instruciune de control special, numit "ciclu cu contor". n pseudocod, aceast instruciune poate fi scris n modul urmtor:

pentru variabila de_la val_init la val_fin [cu_pasul pas] execut sfrit_ciclu

n care, de regul, variabila este o variabil (de regul de tip ntreg), numit i contorul ciclului, val_init i val_fin sunt respectiv valorile iniial i final ale acestei variabile, iar pas este pasul de variaie la fiecare parcurgere a ciclului. Pasul implicit este 1.

n limbajul Java, urmnd tradiia limbajului C de la care acesta a preluat o bun parte a regulilor de sintax, se folosete o instructiune generalizat, prin care se realizeaz att ciclul cu contor, ct i ciclul cu test iniial. Aceast instruciune are forma:

for ([iniializare] ; [condiie] ; [trecere_la_pasul_urmtor] ) []

n care:

iniializare ::= instructiune[,instructiune]*- este format din una sau mai multe instruciuni, separate prin virgule, care se execut nainte de intrarea n ciclu, astfel c sunt folosite, de regul, pentru iniializarea acestuia; condiie - este o expresie de tip boolean folosit drept condiie de continuare a ciclului cu test iniial (condiia este testata nainte de a se executa corpul ciclului; trecere_la_pasul_urmtor := instruciune[,instruciune]* - una sau mai multe instruciuni, separate prin virgule, care se execut dup ce a fost executat corpul ciclului. astfel c sunt, n general, folosite pentru pregtirea trecerii la urmtoarea parcurgere a ciclului; - o instruciune (simpla sau structurat) care constituie corpul ciclului.

58. Instruciunea do..while (ciclul cu test final)

Forma general a instruciunii de control, prin care se realizeaz n limbajul Java ciclul cu test final este urmtoarea:

do instruciune while (condiie);

unde, la fel ca n cazul instruciunii while, condiie este o expresie de tip boolean, iar instruciune este orice instruciune (simpl sau structurat) din limbajul Java. Remarcm c la sfritul acestei instruciuni (dup condiie) se pune obligatoriu ';' (punct i virgul).

Principala deosebire fa de instruciunea while pentru ciclul cu test iniial este c testarea condiiei se face dup ce a fost executat instruciunea din corpul ciclului. n consecin, corpul ciclului va fi executat cel puin o dat.

59. Variabile locale i domenii de vizibilitate

Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate.

60. Tratarea excepiilor

n timpul executrii programului, pot apare anumite situaii care altereaza desfurarea normal a acestuia. Cnd apare o astfel de situaie, de regul, se genereaz o excepie sau o eroare prin care se semnaleaz incidentul care a avut loc. Excepiile i erorile pot fi generate att de echipamente (excepii sau erori hardware), ct i de programe (excepii software). Exemple de excepii hardware pot fi ntreruperile, excepia de mprire la zero, unele incidente din subsistemele de intrare/ieire etc. Excepiile software sunt mult mai diverse, depinznd de specificul programelor care le genereaz. Deosebirea dintre excepii i erori este c excepiile sunt considerate c pot fi tratate prin program, n timp ce erorile sunt considerate mai curnd nerecuperabile.

n limbajul Java, exist posibilitatea de a se trata prin program diferitele excepii care apar n timpul execuiei. n acest fel, programatorul poate s prevad ci alternative de continuare a executrii programului, fr a mai fi necesar oprirea executrii lui. n mediul de lucru Java, la apariia unei excepii se genereaz un obiect special numit excepie, care conine informaia despre excepia respectiv. Acest obiect poate fi captat prin program, iar informaia coninut n el poate fi utilizat pentru a decide calea pe care se va merge n continuare n derularea programului. Toate obiectele de excepie care se refer la acela i tip de incident formeaz o clas de excepii.

Tratarea prin program a excepiilor se face, n limbajul Java, folosind instruciunea try urmat de una sau mai multe clauze catch i, opional, de o clauz finally sub forma urmatoare: try { secventa } catch (ClasaExceptie1variabila1) { secventa1 } catch (ClasaExceptie2 variabila2) { secventa2 } ............... catch (ClasaExceptieN variabilaN) { secventaN } [finally { secventa_finalizatoare }]

61. Variabile locale i domenii de vizibilitate

Variabilele declarate ntr-un bloc sunt variabile locale ale blocului respectiv. Domeniul de vizibilitate al unei variabile locale ncepe n locul din program n care aceasta a fost declarat i se ncheie la sfritul blocului care conine declaraia respectiv. Variabila este deci "vizibil" (poate fi utilizat) n propriul su bloc i n toate blocurile interioare acestuia, n domeniul de vizibilitate.

62. Instruciuni etichetate

n principiu, orice instruciune n limbajul Java poate purta o etichet. Instruciunile etichetate au forma etichet : instruciune unde etichet este un identificator; instruciune este o instruciune simpl sau structurat.

Exemplu alpha: x=2*a+b;

Se permite s se foloseasc drept etichete chiar i identificatori care mai sunt folosii n acelasi program ca nume de variabile, clase, metode etc., far a se crea prin aceasta confuzii, deoarece compilatorul face distincie ntre etichete i nume n funcie de contextul n care acestea sunt utilizate.

63. Folosirea instruciunilor break i continue

Instructiunile break i continue au forma general urmtoare:

break [etichet]; continue [etichet];

unde etichet este eticheta unei instruciuni i este un identificator. Eticheta este opional (de aceea a fost scris de noi ntre paranteze drepte).

Instructiunea break se poate folosi n corpul unei instruciuni switch, while, do..while sau for i are ca efect ieirea forat (abrupt) din structura de control n care se gsete instruciunea respectiv.

Instruciunea continue se poate folosi numai n corpul ciclurilor (while, do..while, for). Dac instruciunea continue nu are etichet, efectul este c se trece peste restul instruciunilor din corpul ciclului, ncepnd din punctul n care se gsete instruciunea continue pn la sfritul acestuia, dar se continu executarea ciclului, adic se reia executarea corpului acestuia ct timp este satisfacut condiia de continuare.

64. Tipul referin

n limbajul Java exist dou categorii de tipuri de date: tipuri primitive i clase.

Tipurile primitive sunt predefinite n limbaj, n sensul c numele, mulimea de date, mulimea de operaii i reprezentarea datelor n memoria intern a mainii virtuale Java pentru fiecare tip sunt definite n insi specificaia limbajului Java i nu mai pot fi modificate de programatori. n program, datele de tipuri primitive apar sub forma de variabile. Fiecare variabil are un nume, un tip i o valoare i este plasat ntr-o anumita locaie de memorie. n locaia de memorie respectiv se gsete chiar valoarea variabilei. Pe programator nu il intereseaz ins adresa de memorie la care se gsete variabila, ci doar numele, tipul i valoarea acesteia.Clasele sunt tipuri de date structurate specifice programrii orientate pe obiecte. Clasele se definesc de programatori i se grupeaz n pachete de clase. La crearea unui program nou, programatorul poate utiliza clasele din pachetele deja existente, sau poate creea propriile sale clase. n program, fiecare clas poate avea mai multe instane, numite obiecte.

65. Clase, cmpuri, metode

Clasa este o structur de date, asociat cu o colecie de proceduri sau funcii, metode, care utilizeaz datele din aceast structur.

Datele unei clase se numesc cmpuri, sau variabile membre. Cmpurile pot fi statice (ale clasei) sau nestatice (ale instanei). Cnd clasa este instaniat, n memoria mainii virtuale Java se construiete un obiect (o instan a clasei respective). Obiectul conine numai cmpuri nestatice. Cmpurile statice se pstreaza n memorie ntr-un singur loc, care este rezervat clasei respective.

Metoda este o funcie, care ntoarce o valoare i poate avea, de asemenea, efect lateral. Ca i cmpurile, metodele pot fi statice (ale clasei) i nestatice (ale instanei). Metodele statice pot invoc numai cmpurile statice ale clasei respective, n timp ce metodele nestatice pot invoca att cmpurile statice, ct i pe cele nestatice (ale unei instane a clasei respective). Dac valoarea ntoars de metod este void, metoda respectiv este o procedur i trebuie s aib obligatoriu efect lateral. Invocarea unei metode statice (a clasei) se face printr-o expresie de forma nume_clasa.nume_metoda(parametri_efectivi) a crei valoare este valoarea ntoars de funcia respectiv. O astfel de invocare de funcie poate fi deci folosit ca o component ntr-o alt expresie. De exemplu, expresia Math.sqrt(a) serveste pentru a calcula rdcina patrat a lui a, n care scop este invocat funcia sqrt, care este o metod static a clasei Math (clasa funciilor matematice uzuale). Putem folosi aceast invocare de metod ntr-o expresie mai complicat, de exemplu x=2*Math.sin(a)+3; Invocarea unei metode nestatice (a instanei) se face sub forma referina_la_obiect.nume_metod(parametri_efectivi) deci numele metodei nu mai este calificat prin (nsoit de) numele clasei, ci prin cel al variabilei referin la obiectul respectiv, sau prin o expresie care are ca valoare o astfel de referin. De exemplu, daca r1 este o variabil referin care indic un anumit obiect din memorie, iar met(a)este o metod nestatic a clasei creia i aparine acest obiect, atunci r1.met(a) are ca efect invocarea metodei met pentru obiectul indicat de r1. n acest fel, metoda met(a) va folosi att cmpurile (nestatice ale) obiectului indicat de referina r1, ct i cmpurile (statice ale) clasei creia i aparine acest obiect.

Dac o metoda are efect lateral, ea poate fi invocat i sub forma de instruciune. Aceast instruciune const numai din expresia de invocare a metodei, urmat de punct_i_virgul. n acest caz, valoarea ntoars de metod (valoarea expresiei) este ignorat, folosindu-se numai efectul lateral al metodei respective. Un exemplu cunoscut deja este instruciunea System.out.println(sir);

Este evident c metodele care ntorc void (procedurile) pot fi invocate numai sub form de instruciuni, fiind folosite pentru efectul lor lateral.

66. Motenirea i polimorfismul

Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte. Ea const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i superclas, iar clasele derivate se numesc i subclase.

Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate cmpurile i metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm pot exista, de asemenea, cmpuri i/sau metode suplimentare.

Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o metod a superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai nume i aceeasi lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un comportament diferit.

67. Constructori

Constructorul este o procedur special, prin care se construiesc obiecte dintr-o anumit clas. Constructorul are ntotdeauna acelai nume cu clasa. n schimb, o clas poate avea mai muli constructori, care pot s difere ntre ei prin numrul i/sau tipul argumentelor. Constructorul aloc n memoria dinamic spaiul necesar pentru un obiect din clasa creia i aparine i iniializeaz cmpurile acestui obiect cu valori care depind de argumentele sale.

68. Ierarhia de clase Java

n general, n programarea orientat pe obiecte este permis motenirea multipl, adic o clas poate avea mai multe superclase. n limbajul Java este permis numai motenirea simpl, deci fiecare clas poate avea numai o singur superclas. Aceast ierarhie de clase este unic, adic orice clas are obligatoriu o superclas i numai una. Singura excepie o constituie clasa Object, care este rdcina ierarhiei de clase Java i nu are superclas.

Vom arata ulterior c lipsa motenirii multiple este compensat n Java prin faptul c fiecare clasa poate avea mai multe interfee.

69. Pachetele de clase din Java API

Clasele sunt grupate n pachete (englez: package). Pachetul este o colecie de clase reutilizabile destinate unui anumit domeniu de utilizare, care sunt puse la dispoziia programatorului sub form compilat (bytecode). Ar putea fi numit i "bibliotec de clase", dar autorii platformei Java au preferat denumirea de pachet.

Pachetul poate avea subpachete. Daca pachetul p are subpachetul q, atunci p.q este numele complet (numele calificat) al subpachetului q. Acest subpachet poate avea, la rndul sau, alte subpachete.

Java API (Application Programming Interface - interfaa de programare de aplicaii) este descrierea unui set standard de pachete necesare programrii n Java. Pentru pachetele coninute n Platforma Java 2 Standard Edition (J2SE) aceast documentaie poate fi gasit pe Internet la urmatoarea adres: java.sun.com/products/j2se/1.3/docs/api/index.html - la firma Sun Microsystems;

Principalele pachete de clase sunt: java.lang - conine clasele de baz necesare programrii n limbajul Java; java.io - conine clasele necesare pentru programarea operaiilor de intrare/ieire; java.util - conine clase pentru anumite structuri de date tipice (list, stiv etc) i alte clase utile; java.awt si javax.swing - conin clase necesare pentru realizarea interfeelor grafice; java.applet - pentru programarea appleturilor. Exist ns i multe alte pachete, necesare n diferite domenii de aplicaie.

70. Declaraia importPentru a putea utiliza ntr-un fiier-sursa Java un anumit pachet (subpachet) de clase, la nceputul fiierului respectiv trebuie pus declaraia import nume_pachet.*; n care nume_pachet este numele calificat al pachetului respectiv. De exemplu, pentru a utiliza orice clase din pachetul java.io se pune declaraia import java.io.*;

Pentru clasele din pachetul java.lang nu este necesar o declaraie de import, acestea fiind importate implicit.

Pentru a importa numai o anumita clas dintr-un pachet, se foloseste declaraia import nume_pachet.NumeClasa; De exemplu, pentru a importa clasa File din pachetul java.io se folosete declaraia import java.io.File; 71. Utilizarea claselor din pachetul java.lang

Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet nu este necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din pachetul java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet. Noi vom prezenta aici cteva clase mai frecvent utilizate.

72. Clasa ObjectClasa Object este rdcina ierarhiei de clase a platformei Java. Este singura clas care nu are o superclas. Orice alt clasa este derivat direct sau indirect din clasa Object.

Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori referine la orice fel de obiecte, indiferent de clasa creia i aparin.

n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua aciuni specifice acestor clase.

73. Clase de excepii

n pachetul java.lang exist i numeroase clase de excepii. Instanele acestor clase sunt creeate de ctre maina virtual Java atunci cnd se produce o excepie, adic o situaie anormal n procesul de calcul. Toate aceste clase sunt descrise n documentatia Java API. Vom meniona aici numai dou dintre ele, celelalte urmnd s fie indicate la descrierea claselor care conin metode care pot genera excepii. n limbajul Java se face distincie ntre excepie i eroare. Se consider ca excepiile sunt incidente care pot fi captate prin mecanismul try .. catch i pot fi deci tratate prin program, n timp ce erorile sunt incidente grave, care - de regul - nu pot fi tratate prin program ci produc oprirea executrii acestuia74. Clasa Exception

Aceast clas este rdcina ierarhiei claselor de excepii. n consecin, atunci cnd dorim ca in clauza catch sa fie captat orice fel de excepie, scriem aceast clauz sub forma

catch(Exception e) { instructiuni_de_tratare_a_exceptiei e }

unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori:

public Exception() creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj.

public Exception(String s) creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se indic, de regul, ce incident a condus la generarea excepiei respective.

75. Clasa Class

O caracteristic important a limbajului i platformei Java este c clasele i interfeele utilizate n program sunt prezente n memoria mainii virtuale Java n timpul executrii programului, sub forma de instane ale clasei Class. n consecin, se pot obine n timpul executrii unui program informaii despre clasele crora le aparin obiectele din memorie. Clasa Class nu are un constructor public. n schimb, putem obine un obiect din aceast clas folosind metoda getClass() a clasei Object. Exist i instane ale clasei Class pentru tipurile de date primitive. Acestea sunt coninute sub forma de cmpuri statice n clasele acoperitoare ale tipurilor primitive respective.

Iat cteva dintre metodele clasei Class:

public String getName() - ntoarce numele calificat al unei entiti (clase, interfee, tip primitiv) reprezentat de un obiect din clasa Class; public boolean isAssignableFrom(Class cls) - ntoarce true dac clasa creia i se aplic metoda este o superclas a clasei cls, primit ca argument; public boolean isInterface() - ntoarce true dac metoda este aplicat unei instane a clasei Class care reprezint o interfa; public boolean isPrimitive() - ntoarce true dac metoda este aplicat unui obiect din clasa Class care reprezint un tip de date primitiv; public Class getSuperclass() - ntoarce o instan a clasei Class care reprezint superclasa obiectului cruia i se aplic aceast metod.

n fiierul TestClass.java este dat un program de testare a obinerii obiectelor Class i a aplicrii unora dintre metodele acestora.

Descrierea complet a clasei Class este dat n documentaia Java API.

76. Clasa SystemClasa System conine cmpuri i metode utile pentru realizarea legturii dintre aplicaie i sistemul de execuie Java (cel care implementeaz maina virtual Java). Aceast clas nu poate fi instaniat.

77. TablouriTabloul (n englez Array) este o structur de date de acelasi tip, numite componente ale tabloului, care sunt specificate prin indici. n programare, tabloul poate fi privit ca o colecie indexat de variabile de acelai tip.

78. Tablouri cu un singur indice

Aceste tablouri corespund conceptului matematic de vector. Nu le vom numi totui astfel, pentru a nu face confuzie cu obiectele clasei Vector din pachetul java.util.

Tabloul unidimensional este constituit dintr-un ansamblu de componente indexate (cu un singur indice), cruia i se asociaz i o variabila de tip int numita length, care reprezint lungimea tabloului (numrul de componente). Indicii elementelor de tablou sunt cuprini n intervalul [0, length-1]. Utilizarea unui indice situat n afara acestui interval genereaz o excepie.

ntruct tablourile sunt obiecte, pentru indicarea lor n program se folosesc variabile referin.

Declararea i iniializarea tablourilor cu un singur indice

Variabilele referin la tablouri cu un singur indice pot fi declarate n dou moduri: a/ ntr-o declaraie de variabile se pune simbolul [] (o pereche de paranteze drepte) dup numele variabilei referin la tablou. Ca exemplu, s considerm declaraiile urmtoare: int a, b, c[], d, e[]; String s1, ts1[], s2; n aceste declaraii, a, b, i d sunt variabile simple de tip double, deci ele pot primi valori simple de acest tip, iar s1 i s2 sunt variabile referin la obiecte din clasa String (la iruri de caractere). n schimb, c[] i e[] sunt variabile referin la tablouri de tip int (tablouri la care toate componentele sunt de tip int), iar ts1[] este o variabil referin la un tablou cu componente din clasa String. b/ Parantezele se pun dup numele tipului de date sau al clasei, n care caz toate variabilele din declaraia respectiva sunt considerate drept referine la tablouri. De exemplu, n declaraiile int[] i, j; long [] k, m; float []u, v; String[] ww; variabilele i, j, k, m, u, v, ww sunt referine la tablouri cu componente de tipuri corespunztoare fiecarei declaraii. Remarcm c nu are importan dac parantezele sunt puse imediat dup numele tipului sau clasei (far spaiu liber) sau ntre acestea exist unul sau mai multe spaii.

79.Tablouri cu doi sau mai muli indici

Tabloul cu N indici este considerat n limbajul Java drept un tablou de referine la tablouri cu N-1 indici. Vom exemplifica aceasta pentru cazul tabloului cu doi indici (bidimensional) i vom extinde apoi conceptul la tablouri cu mai mult de dou dimensiuni. Tablouri cu doi indici

80. Tablouri cu mai muli indici

Modul de tratare al tablourilor cu doi indici poate fi extins i la tablouri cu mai muli indici (tablouri multidimensionale). Se are n vedere ca tabloul cu N indici conine referine la tablouri cu N-1 indici. De exemplu un tablou cu trei indici (tridimensional) poate fi considerat c conine mai multe "pagini", iar fiecare "pagin" este un tablou cu doi indici (bidimensional). n acest caz, primii doi indici specifica linia i, respeectiv, coloana, iar al treilea indice specifica "pagina" n care se gsete o anumit component. Un tablou cu patru indici poate fi asemnat cu un set de "volume", n care fiecare "volum" este un tablou cu trei indici, iar cel de al patrulea indice specifica numarul "volumului" din acest set. Putem sa ne imaginam astfel si semnificaii ale unor tablouri cu mai mult de patru indici. Totui, n practic, cele mai frecvent folosite tablouri au cel mult trei indici.

81. Tablouri eterogene

Prin definiie, componentele unui tablou trebuie s fie toate de acelai tip. n programarea orientat pe obiecte, aceast restricie a fost "relaxat", n sensul c un tablou poate avea drept componente i obiecte aparinnd claselor descendente din clasa de baz. Faptul c clasa Object este superclas a oricrei alte clase din limbajul Java, inclusiv a claselor de tablouri, permite s se creeze tablouri eterogene, adic tablouri cu componente care aparin unor clase foarte diferite. Acestea pot fi structuri complicate de date, realizate pornind de la structura de "tablou de obiecte". 82. Utilizarea parametrilor din linia de comand

A venit timpul s ne ocupm de argumentul args[] al metodei public static main(String args[]) Remarcm ca argumentul formal args[] al acestei metode este un tablou unidimensional, ale crui componente sunt din clasa String, deci sunt iruri de caractere. La lansarea n execuie a aplicaiei, acest argument preia drept componente de tablou parametrii din linia de comand prin care s-a fcut lansarea. Aceti parametri pot fi, astfel, folosii n program dup necesiti.

83. Declararea claselor

Pn n prezent, s-a artat modul n care putem utiliza n programul nostru clase existente n biblioteci (n pachetele de clase). Vom studia n continuare cum putem crea propriile noastre clase.

Cea mai simpl form a unei declaraii de clas este urmtoarea:

class NumeClasa { declaratii_de_membri }

Observm c declaraia ncepe cu cuvntul-cheie class, urmat de numele clasei i de corpul clasei, cuprins ntre acolade.

Numele clasei este un identificator. Se obisnuiete ca numele clasei sa nceap cu liter majuscul. Dac numele este compus din mai multe cuvinte, fiecare din acestea ncepe cu majuscul.

Corpul clasei cuprinde declaraii de membri ai clasei respective. Acestea pot fi: - declaraii de cmpuri; - declaraii de constructori; - declaraii de metode. Nu este obligatoriu ca ntr-o clas s existe toate aceste categorii de declaraii. Pot exista, de exemplu, clase n care apar numai declaraii de metode. n principiu, pot exista i clase care conin numai cmpuri i nu conin metode, dei astfel de situaii apar foarte rar n practic.

84. Declararea cmpurilor

Declaraiile de cmpuri servesc pentru a descrie structura de date specific clasei respective. Cmpurile se mai numesc i variabile membre i pot fi ale clasei sau ale instanei (ale obiectului). Se prefer denumirea de cmpuri, pentru a le deosebi de variabilele locale ale metodelor.

Cmpurile instanei se declar la fel ca variabilele locale ale metodelor, numai c declaraia respectiv nu apare n blocul unei metode, ci n corpul clasei. De exemplu: int m=172, n=2*m-4, r; Aceste cmpuri pot avea valori diferite pentru fiecare instan a clasei respective. n consecin, cmpurile instanei sunt plasate n zona de memorie rezervat instanei respective, astfel c ele sunt distincte pentru fiecare instan.

Cmpurile clasei se numesc i cmpuri statice. Declararea unor astfel de cmpuri se face asemntor cu cea a cmpurilor de instan, dar declaraia are n fa, n acest caz, modificatorul static. De exemplu: static double u=3.65, v=2.87*u-3.1, x; La iniializarea cmpurilor de instan se pot folosi att valori ale cmpurilor statice, ct i ale altor cmpuri de instan. n schimb, la iniializarea cmpurilor statice se pot folosi numai valori ale altor cmpuri statice. Cmpurile statice (ale clasei) sunt plasate n memorie n zona rezervat clasei creia i aparin i nu n cea rezervata instanelor. n consecin, cmpurile clasei exist n memorie ntr-un singur exemplar, care este accesibil fiecrei instane.

Valorile iniiale implicite ale cmpurilor: dac nu sunt iniializate explicit, cmpurile statice i cele nestatice primesc valori implicite astfel: - cmpurile booleene primesc valoarea false; - cmpurile numerice primesc valoarea 0 (chiar i cele de tip char, care este tot tip numeric!); - cmpurile referina primesc valoarea null.

Remarcm, deci, c exist o deosebire ntre crearea cmpurilor (variabilelor membre) i crearea variabilelor locale. La crearea cmpurilor, acestora li se atribuie implicit o valoare iniial, n timp ce la crearea variabilelor locale acestora trebuie sa li se atribuie valori n mod explicit. Dac o variabil local apare ntr-o expresie fr s aib o valoare atribuit anterior, compilatorul Java semnaleaza aceast situaie ca o eroare de programare.85. Declararea metodelor

n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i metodele prin care se trateaz aceste cmpuri.

Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv.

Cea mai simpl form sintactic a declaraiei de metod este urmtoarea: tip_valoare_intoarsa nume_metoda(declaratii_de_argumente) { corpul_metodei } n care: tip_valoare_intoarsa - este tipul valorii primitive sau clasa valorii-referin ntoars de aceasta metod; nume_metoda- este un identificator care, n mod uzual, ncepe cu liter mic i constituie numele metodei; declaratii_de argumente - este o list de declaraii de argument separate prin virgul, deci ea poate avea forma: declaratie_argument1, declaratie_argument2, ... declaratie_argumentN dar poate fi i vid. Lista declaraiilor de argument este cuprins ntre paranteze rotunde. Fiecare declaraie de argument are forma tip_argument nume_argument n care tip_argument - este tipul sau clasa argumentului respectiv; nume_argument- este un identificator care, n mod uzual, ncepe cu liter mic. Dup aceast list de argumente se deschide acolada unui bloc, care conine corpul metodei, adic secvena de instruciuni prin care se calculeaz valoarea funciei respective i/sau - dac este cazul - se efectueaz aciunile care constituie efectele laterale ale acesteia.

86. Instruciunea return

Dac funcia ntoarce o valoare (diferit de void), aceasta se indic prin instruciunea return expresie; Efectul acestei instruciuni este urmtorul: se evalueaza expresia expresie i se ncheie executarea funciei respective, ntorcnd valoarea astfel obinut. n consecin, chiar dac dup instruciunea return mai apar n corpul funciei respective i alte instruciuni, acestea nu vor mai fi executate. Dac metoda nu ntoarce o valoare (ntoarce void), folosirea instruciunii return nu este absolut necesar, ncheierea execuiei fcndu-se cnd se ajunge la acolada prin care se sfrsete blocul funciei. Totui, dac este necesar s se ncheie n mod abrupt executarea corpului funciei, se poate folosi instruciunea return fr expresie.

87. Metode statice

La declararea metodelor statice, n faa tipului valorii ntoarse se pune modificatorul static. Metodele care conin n declaraie acest modificator se numesc statice sau ale clasei, spre deosebire de metodele obinuite care sunt ale instanei. n corpul metodelor statice se pot folosi numai cmpurile statice ale clasei respective i se pot invoca numai alte metode statice ale acestei clase.

88. Metode cu acelai nume. Signatura metodei

n aceeai clas pot exista mai multe metode cu acelai nume, cu condiia ca ele s difere prin numrul i/sau tipul argumentelor. Pentru a deosebi ntre ele astfel de metode, s-a introdus conceptul de signatur.

Signatura metodei const din numele acesteia, nsoit de lista de argumente. n consecin, dou metode pot avea acelai nume, dac difer ntre ele prin signatur. Putem da exemple din clasele existente n pachetele deja studiate.

89. Transferul de parametri ctre metode

La invocarea unei metode, este necesar s se transmit de la metoda care invoc la metoda invocat parametrii (argumentele) acesteia. De exemplu, la executarea invocrii Math.sin(a), este necesar s se transmit ctre metoda sin argumentul acesteia, a. n teoria i practica programrii se cunosc diferite moduri n car se poate face transmiterea argumentelor ctre o funcie sau procedur: - transmitere prin valoare: de la programul apelant ctre funcie (procedur) se transmit valorile argumentelor; - transmitere prin adresa: de la programul apelant ctre funcie (procedur) se transmit adresele la care se gsesc n memorie valorile argumentelor; - transmitere prin nume: de la programul apelant ctre funcie (procedur) se transmit numele argumentelor; - transmitere prin referin: de la programul apelant la funcie (procedur) se transmit referine ctre argumente.n limbajul Java, transmiterea parametrilor (argumentelor) metodelor se face prin valoare. Aceasta nseamn c: - dac argumentul aparine unui tip de date primitiv, se transmite chiar valoarea primitiv a argumentului respectiv; - dac argumentul aparine unui tip-referin (este instan a unei clase), se transmite - de fapt - o referin ctre un obiect din clasa respectiva sau dintr-o clasa derivat din aceasta. 90. Metode recursive. Comparaie ntre iteraie i recursie

O metod (funcie sau procedur) care se invoc pe sine nsi se numete metod recursiv. Dou sau mai multe metode care se invoc una pe alta (metoda A invoc metoda B i reciproc) se numesc mutual recursive. Limbajul Java permite utilizarea metodelor recursive i mutual recursive. Vom ilustra aceasta prin exemple. Vom arta, de asemenea c, de regul, aceleai funcii pot fi calculate att recursiv, ct i iterativ (folosind cicluri). n general, n limbajele funcionale se utilizeaz predominant funciile recursive, n timp ce n limbajele procedurale se prefera iteraia, dei n unele dintre ele (cum este i limbajul Java) se pot folosi att iteraia, ct i recursia.

Remarcam c, la fel ca n cazul ciclurilor iterative, n metodele recursive trebuie s existe o condiie de oprire a repetrii. n caz contrar recursia ar continua pn la depirea spaiului de memorie alocat pentru memorarea datelor intermediare (numit stiv).

Comparnd metodele recursive cu cele iterative se constat c: - metodele recursive sunt "mai elegante", fiind i mai uor de ineles de ctre om dect cele iterative; - din punct de vedere computaional, metodele iterative sunt mai eficiente, deoarece solicit mai puin memorie i sunt mai rapide dect cele recursive. Deosebirea este cu att mai mare, cu ct numrul de invocari succesive, respectiv de repetri, este mai mare.

91. Instruciunea throwCunoatem deja c, la apariia anumitor anomalii n executarea programului, maina virtual Java genereaz excepii. Excepiile sunt obiecte din clasa Exception s-au dintr-o subclas a acesteia. Este posibil ca programatorul s prevad, n anumite puncte ale programului, generarea unor excepii, folosind n acest scop instruciunea throw, care are forma urmtoare:

throw new ConstructorExceptie(lista_argumente);

n limba englez, throw este imperativul de la "a arunca". n aceast instruciune, se folosete operatorul new pentru a genera un obiect al clasei de excepii creia i aparine constructorul invocat, dup care acest obiect este "aruncat", fie pentru a fi "prins" (captat) printr-o structura try .. catch i tratat prin program, fie pentru a fi preluat de maina virtual Java care, n acest caz, oprete execuia programului.

92. Clauza throwsn mod normal, excepiile generate ntr-o metod sunt tratate prin structuri try .. catch. chiar n metoda n care au fost generate. Este ns posibil ca metoda respectiv s "arunce" mai departe excepiile generate n corpul ei. Pentru a indica aceast proprietate, la declararea metodei, dup paranteza care conine lista declaraiilor argumentelor formale se pune clauza throws ClasaDeExceptii, n care se indic numele clasei excepiei care este "aruncat" ctre metoda invocatoare (Cuvantul throws este persoana a treia singular a verbului to throw, "a arunca").

93. Clase publice

Clasele publice sunt clase care pot fi utilizate i n alte pachete, dect cel din care fac parte.

Fiecare clas public se declar ntr-un fiier separat, care are obligatoriu acelai nume cu cel al clasei i extensia java. n declaraia de clas, n faa numelui clasei se pune modificatorul public. Dm n continuare ca exemplu clasa Complex. 94. Colectorul de reziduuriDac un obiect nu mai este necesar, el poate fi distrus, adic eliminat din memorie. n maina virtual Java, exist un colector de reziduuri de memorie (englez: garbage collector) care elibereaz automat spaiul de memorie ocupat de obiectele ctre care nu mai exist nici o referin. n consecin, programatorul nu mai este pus n situaia s prevad explicit n program distrugerea obiectelor i, deci clasele nu mai conin destructori, ca n alte limbaje de POO.

95. Metoda finalizen clasa Object exista metoda

protected void finalize() throws Throwable

Aceasta metod este invocat de colectorul de reziduuri, atunci cnd acesta determin c nu mai exist referine ctre obiectul respectiv. n clasa Object, aceast metod nu efectueaz nimic.

Metoda finalize poate fi redefinit n orice alt clas, pentru a elibera resurse sau a efectua orice alte aciuni necesare nainte de distrugerea obiectului respectiv. De exemplu, dac obiectul respectiv a deschis anumite fiiere sau conexiuni externe, n metoda finalize se poate efectua nchiderea lor.

Metoda finalize nu este apelat explicit n programul de aplicaie. Apelarea metodei finalize se face numai de ctre colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rmas fr referin, ci abia atinci cnd acest obiect a "intrat n atenia" colectorului. Este posibil ca executarea aplicaiei s se incheie nainte ca "finalizarea" unor obiecte s aib loc.

96. Caracteristicile obiectelor i claselor

n majoritatea surselor bibliografice asupra POO, se consider drept principale caracteristici ale obiectelor ncapsularea, motenirea i polimorfismul. La acestea se mai pot adaug i alte caracteristici importante, cum sunt identitatea, agregarea i clasificarea.

Identitatea (englez: Identity) se refer la faptul c datele sunt grupate n entiti discrete, numite obiecte. Fiecare obiect din POO modeleaz starea i comportamentul unui anumit obiect din lumea real, care poate fi un obiect fizic (de exemplu automobil, calculator, furnal, om, animal etc.) sau unul conceptual (de exemplu figur geometric, orar etc.). Fiecare obiect are propria lui identitate, astfel c dou obiecte sunt considerate distincte, chiar daca atributele lor (cum ar fi numele, culoarea etc.), sunt identice. Pentru a face aceasta distincie, obiectul este indicat printr-o referin unic. Modul n care este reprezentata aceast referin poate sa difere n diverse limbaje de programare (de ex. adres de memorie, nume etc.), important ns este c fiecare obiect are o singur referin i nu exist dou obiecte distincte cu aceeai referin.

ncapsularea (englez: encapsulation) este proprietatea obiectelor de a-i ascunde o parte din date i metode. Din exteriorul obiectului sunt accesibile ("vizibile") numai datele i metodele publice. Putem deci sa ne imaginm obiectul ca fiind format din dou straturi, ca n Figura 1.

Agregarea (englez: aggregation) este proprietatea obiectelor de a putea ncorpora alte obiecte. Aa dar, "datele" coninute ntr-un obiect pot fi nu numai date primitive, ci i obiecte. Se pot astfel crea obiecte cu structuri din ce n ce mai complexe.

Clasificarea (englez: classification) este proprietatea obiectelor care au aceeai structur de date i acelai comportament (aceleai metode) de a putea fi grupate ntr-o clas. Clasa este o abstractizare, care conine acele proprieti ale obiectelor, care sunt importante ntr-o aplicaie sau ntr-o categorie de aplicaii, i le ignor pe celelalte. De exemplu, n aplicaii privind situaia profesional a studenilor, clasa Student conine astfel de atribute ca numele i prenumele studentului, facultatea, anul de studii, examenele promovate i notele obinute, dar ignor atribute ca nlimea, culoarea ochilor sau a prului, greutatea etc., care nu sunt necesare n aplicaia respectiv. Spre deosebire de agregare, care este o relaie ntre obiecte, clasificarea este o relaie ntre concepte reprezentate prin clase.

Motenirea (englez: inheritance) este proprietatea unei clase de a conine toate atributele (cmpurile) i metodele superclasei sale. n consecin, trecerea de la clas la subclas se face prin adugarea de atribute i/sau de metode. De exemplu, clasa Barbat i clasa Femeie au ambele toate atributele clasei Om, dar fiecare din acestea are i atribute specifice.

n general, n programarea orientat pe obiecte, motentirea poate fi simpl sau multipl. n cazul motenirii simple fiecare clas are cel mult o superclas,

Polimorfismul (englez: polymorphism) permite ca aceeai operaie s se realizeze n mod diferit n clase diferite. S considerm, de exemplu, c n clasa Figura_geometrica exist metoda arie(), care calculeaza aria figurii respective. Clasele Cerc, Triunghi, Patrat sunt subclase ale clasei Figura_geometrica si vor moteni, deci, de la aceasta metoda arie(). Este ns evident c aria cercului se calculeaz n alt mod dect aria patratului sau cea a triunghiului. Pentru fiecare din instanele acestor clase, la calcularea ariei se va aplica metoda specific clasei respective.

98. Modificatori de acces pentru cmpuri i metode

n limbajul Java exist trei modificatori de acces pentru cmpuri i metode: - private - pentru a specifica cmpuri sau metode private; - public - pentru a specifica cmpuri sau metode publice; - protected - pentru a specifica cmpuri sau metode protejate (care vor fi prezentate n seciunea despre motenire). Membrii privati ai claselor (cmpuri sau metode) sunt accesibili numai din clasa respectiv. Membrii publici sunt accesibili din orice clas. Membrii protejati sunt accesibili numai din clasa n care se afl sau din subclasele acesteia. Dac la declararea cmpurilor sau metodelor nu se folosesc modificatori de acces, acestea sunt considerate vizibile numai din clasele care sunt situate n acelai pachet cu clasa creia i aparin. n particular, pentru clasele declarate de ctre noi, aceste cmpuri i metode sunt vizibile numai din clasele situate pe disc n acelai director. Se spune, n astfel de cazuri, c modul de acces este prietenos (englez: friendly) sau de pachet (englez: package).

99. Referinele this i supern orice clas pot fi utilizate dou referine predefinite: this - este o referin la "aceast"