Você está na página 1de 132

1

Introducere n Java

Ce este Java?
! ! ! Proiectat de Sun pentru programarea aparaturii electronice Limbaj orientat pe obiect cu biblioteci de clase Foloseste o masina virtuala pentru rularea - programelor

Proiectat de Sun Java este un limbaj de programare orientat pe obiect dezvoltat la Sun Microsystems, Inc. A fost creat de James Gosling pentru a fi utilizat la programarea aparaturii electronice. Ca urmare a robustet ii si a - independent ei de platforma, Java a trecut de bariera industriei aparaturii electronice la aplicat iile de Web, apoi la aplica ii locale i client-server Biblioteci de clase Java cont ine o mult ime de clase predefinite si metode care pot trata majoritatea cerint elor fundamentale ale unei aplicat ii. Kitul Dezvoltatorului Java (JDK - Java Developers Kit) include clase pentru gestionarea de ferestre, intrare/iesire si comunicat ie n ret ea. - Java mai cont ine un numa de utilitare care ajuta la dezvoltarea aplicat iilor. Aceste utilitare trateaza r operat ii cum snt: depanarea, descarcarea s instalarea, documentarea. -i Foloseste Mas -ina Virtuala Java Unul dintre punctele forte ale lui Java este independent a de platforma (masina + sistem de operare). O - aplicat ie Java scrisa pe o platforma poate fi dusa si rulata pe orice alta platforma. Facilitatea este deseori referita ca write once, run anywhere (WORA). Ea este data de folosirea Masinii Virtuale Java - Java Virtual Machine (JVM). Aceasta ruleaza pe o masina locala si interpreteaza codul de bit i (byte code) - convertindu-l ntr-un cod masina specific platformei. -

Echipa lui Gosling a pornit de la C++, dar programele nu erau sigure, parte a complexit - ii limbajului, dar s i datorit unor facilit - i distructive at a at cum sunt poantorii. Pentru evitarea problemelor echipa lui Gosling a inventat un limbaj nou orientat pe obiect numit Oak (n memoria unui stejar impuntor vizibil din biroul lui Gosling). Pentru cres terea robustet ii au eliminat construct iile de limbaj problematice, iar pentru a face aplicat iile neutre arhitectural, au specificat complet semantica limbajului s i au creat o mas in virtual pentru rularea programelor. Des i Oak a fost - a a proiectat s semene cu C++ pentru a reduce timpul de nv - are, el a fost reproiectat intern pentru a elimina pericolele s i elementele redundante a at ale lui C++. Oak nu a reus it s se impun n domeniul pentru care a fost creat, dar, dup aparit ia WWW-ului s i-a g un nou drum pe care s - a a a asit a evolueze. Oak a fost redenumit n Java (exista deja un limbaj cu numele Oak). Robust, compact, independent de platform s i flexibil a devenit ideal apentru crearea de aplicat ii Web. Fiind interpretat este mai lent ca C++, dar sc aderea vitezei este neimportant atunci cnd domeniul de utilizare a este cel de interact iune cu utilizatorul. -

Avantaje Java
! ! ! ! ! Orientat pe obiect Interpretat si independent de platforma Dinamic si distribuit Cu fire de executie multiple Robust si sigur -

Orientat pe obiect Obiectul este o entitate caracterizata prin atribute si un set de funct ii folosite la manipularea obiectului. Java este puternic tipizat, aproape totul fiind, la nivel de limbaj, un obiect. Principalele except ii snt tipurile primitive (ntregii s caracterele). -i Interpretat si independent de platforma Programele Java snt interpretate n setul de instruct iuni ale masinii native n timpul rularii. Deoarece Java se ruleaza sub controlul JVM, programele Java pot rula sub orice sistem de operare care dispune de JVM. Dinamic si distribuit Clasele Java pot fi descarcate dinamic prin ret ea atunci cnd este cazul. n plus, Java asigura un suport extins pentru programarea client-server si distribuita . Cu fire multiple de execu ie (Multithreaded) Programele Java pot cont ine mai multe fire n vederea execut ie concurente a mai multor sarcini. Multithreadingul este o facilitate interna lui Java si a aflat sub controlul JVM care este dependent de platforma. Robust s sigur -i Java are facilita -i interne de prevenire a coruperii memoriei. Java gestioneaza automat procesul de t alocare a memoriei si verificarea limitelor tablourilor. Interzice aritmetica poantorilor si restrict ioneaza obiectele la zone impuse de memorie.

Termenul de multithreading (fire de execut ie multiple) este specific calculului paralel s i apare n contextul medii de execut ie care pot intercala execu ia unor instruct iuni din mai multe surse independente de execut ie. Diferent a fat de multitasking const ntr-o partajare mai profund - -a a a a mediului de execut ie la nivel de thread-uri n compara ie cu multitasking-ul. Thread-urile pot fi identificate numai prin registrul num ator ar de prorame (PC) s i registrul poantor la stiv (SP) atunci cnd partajeaz un singur spat iu de adrese s i o singur mult ime de variabile globale. Acesta a a a este motivul pentru care comutarea ntre-thread-uri se face foarte repede deoarece informat ia de stare de salvat s i de ref este scurt acut a.

Independenta de platforma 7
! ! ! Codul Java este stocat n fisiere .java Programul .java este compilat n fisiere .class Codul de biti este interpretat la rulare -

Problema limbajelor compilate La compliarea unei aplicat ii ntr-un limbaj tradit ional, cum ar fi C, codul scris de programator este convertit n limbajul masina al platformei pe care are loc compilarea. Programul compilat poate fi rulat - numai pe masini care au acelasi procesor (Intel, SPARC, Alpha) cu cea pe care s-a facut compilarea. Java este un limbaj independent de platform Programele sursa Java snt stocate n fisiere cu extensia .java. De exemplu, o aplicat ie Java care gestioneaza student ii unei sect ii ar putea cont ine fiserele studenti.java, materii.java s -i note.java. Fiecare fisier .java este compilat ntr-un fisier .class cu acelasi nume. De exemplu, studenti.java se va compila n studenti.class. Fisierele .class cont in cod executabil Java numit cod de bit i (bytecode) care are instruct iuni mas independente de platforma. -ina Masina Virtuala Java (JVM - Java Virtual Machine) Masina Virtuala Java asigura mediul de execut ie pentru programele Java. JVM interpreteaza codul de bit i n instruct iuni mas native ale masinii pe care programul este n curs de rulare. -ina Aceleasi fisiere .class pot fi rulate fara modificare pe orice platforma pentru care exista o JVM. Din - acest motiv JVM este uneori numita si procesor virtual. Se numete compilator un program care convertete un alt program, dintr-un limbaj numit surs n limbaj main (unicul limbaj n eles de direct de ctre calculator). Dup realizarea complet a conversiei, programul n limbajul main va rula foarte rapid pe calculator. Procesul de compilare se realizeaz n mai multe faze: analiza lexical (colecteaz caracterele programului surs sub forma atomilor lexicali), analiza sintactic (preia atomii lexicali i construiete o reprezentare a sintactic a programului n memorie), analiza semantic (verific existen a erorilor de tip), generare de cod (aici se va ob ine prima form a limbajului main). Dei limbajul main generat de compilator ar putea fi rulat direct pe calculator deseori el trebuie rulat mpreun cu alte programe dependente de sistemul de operare pe care urmeaz s fie rulat aplica ia final. De

exemplu, n cazul opera iilor de intrare/ieire, compilatorul va genera apeluri catre func iile de intrare/ieire ale sistemului de operare (n Java acesul la sistemul de opeare se face pe baza unor biblioteci numite pachete standard). Pentru ca aplica ie s func ioneze n contextul respectivului sistem de operare, compilatorul va trebui s lege respectivele por iuni ale sistemului de operare la programul tradus. Opera ia de legare conecteaz programele scrise de utilizatori la programele sistemului de operare prin plasarea adreselor punctelor de intrare n sistemul de opeare n programul scris de utilizator. Se numte interpretor un program care ruleaz alte programe. Interpretorul este un simulator al unei unit i centrale care extrage i execut instruc iuni ale unui limbaj de nivel nalt (i nu limbaj main). Din punctul de vedere al conversiei n limbajul main, Java a implemetat un compromis ntre compilatoarele i interpretoarele pure. Aici, limbajul surs este compilat la o form intermediar (ntre limbajul Java i limbajul main) foarte uor de interpretat (deoarece a fost deja decodificat o dat) numit cod de bi i cu ajutorul lui javac apoi, acest cod intermediar este rulat pe interpretorul codului de bi i, java (se zice c acest limbaj main este pentru o main virtual - Maina Virtuala Java - care este implementat nu la nivel hardware ci la nivelui interpretorului codului de bi i). Deci, n Java programul sur trece prin analiza lexical, sintactic generarea de cod intermediar, apoi interpretare pentru a ob ine relutate.

Securitatea mediului Java


Limbaj si compilator ncarcatorul de clase (Class Loader) Verificatorul codului de bit i (Bytecode verifier) Interfat a local restrictiva -

Nivele de securitate n Java Limbaj s compilator -i Limbajul este sigur prin proiectare. Construct iile care permit manipularea directa a poantorilor au fost eliminate pentru evitarea erorilor n execut ie si a fragmentarii memoriei. - ncarcatorul de clase ncarcatorul de clase garanteaza separarea stocarii claselor ce provin de la surse locale de cele de ret ea. n timpul execut iei, motorul masinii cauta mai nti referint ele la clasele locale si numai apoi clasele referite din interiorul acestora. Din acest motiv, clasele locale nu vor fi suprascrise de cele ncarcate din ret ea. Astfel, se previne modificarea comportamentului deja cunoscut al claselor locale ca urmare a unei intervent ii externe (prin ret ea). Verificatorul codului de bit i n timpul rularii unui program Java, JVM poate importa cod de oriunde. Java trebuie sa fie sigur de codul importat respectiv ca el este dintr-o sursa de ncredere. Pentru realizarea acestei sarcini, motorul va realiza o serie de teste denumite verificarea codului de bit i. Interfat a local restrictiva - Accesul la sistemul de fisiere local si la resursele de ret ea este controlat prin clase locale s i metode. Clasele sunt prin definit ie restrictive. Daca un cod importat ncearca sa acceseze sistemul de fisiere local, sistemul de securitate lanseaza un dialog cu utilizatorul.

Miniaplicatii Java (Applets) ! ! ! ! Cele mai vechi tipuri de aplicatii Folosite n pagini HTML Pot include continut activ (formulare, imagini, sunet, filme) Vizualizate n navigator si pot comunica cu un server -

Miniaplicatii Java O mare parte din popularitatea lui Java porneste de la posibilitatea dezvolta unor aplicat ii mici rii (applets, n engleza) care pot fi nglobate n pagini HTML si descarcate prin ret ea atunci cnd pagina este vizualizata ntr-un navigator de Web. Exista doua tipuri de miniaplicat ii Java: cu si fara ncredere (trusted si untrusted, n engleza ). Miniaplicat iile fara ncredere snt restrict ionate din punctul de vedere al accesului local, cele de ncredere au permisiunea accesarii resuselor locale. Caracteristicile miniaplicatiilor Miniaplicat iile snt de natura grafica, tinznd sa cont ina controale cum snt butoanele, cutiile de text, - listele de select ie. Totus miniaplicat iile pot sa faca mult mai mult dect simpla afisare a unor controale -i, (obiecte de interfat a grafice). Iata o lista cu cteva dintre posibilitat ile miniaplicat iilor: - ! vizualizarea de animat ii, imagini si redare de sunete; ! conectarea la baza de date aflata pe serverul de Web de pe care s-a descarcat miniaplicat ia; ! comunicat ia cu un server de Web prin socluri (soket, n engleza ); ! comunicat ia cu o aplicat ia Java rulata pe sereverul de Web; ! pot utiliza CORBA (Common Object Request Broket Architecture) pentru a comunica cu Java sau cu aplicat ii ne-Java de pe server-ul de Web. -

OMG (Object Management Group) este un consort iu creat n scopul dezvolt de standare n programarea orientat pe obiect. CORBA arii a specific condit iile n care un obiect respect specificat iile OMG, n principiu, specificat iile descriu standardul de interfat pentru aceste a a -a obiecte.

Aplicatii Java ! Crearea de aplicatii de sine stttoare: G JVM ruleaza aplicatii independente G nu se ncarca clase prin retea Crearea de aplicatii client-server: G deserveste mai multi clienti dintr-o singura sursa G se ncadreaza n modelul multi-nivel pentru calcule pe Internet.

Aplicatii Java de sine stttoare Desi, Java si-a cstigat popularitatea datorita miniaplicat iilor, e posibila si crearea unor aplicat ii de sine sta toare (nu este nevoie de un navigator pentru rularea lor). Acestea sunt oarecum echivalentul ta programelor executabile din C i C++. Aplicatii client Miniaplicat iile Java pot fi rulate pe un sistem de operare local sub forma unor aplicat ii de sine sta toare. Acest mod de lucru este specific dezvolta de aplicat ii client (aplica ia este descarct de ta rii pe un server dar rulat n navigator, care este clientul serverului de Web) si este, uzual, fara restrict iile de securitate specifice miniaplicat iilor. De exemplu, aplicat iile Java pot accesa sistemul local de fisiere sau sa stabileasca conexiuni cu alte masini prin ret ea. Miniaplicat iile pot beneficia de aceste facilita-i t doar daca au fost nregistrare ca snt de ncredere; restrict ia previne coruperea sistemului local de fisiere de catre miniaplicat ii malit ioase. Caracteristici adit ionale ale miniaplicat iilor de ncredere snt: ! accesul la sistemul de fisiere local; ! accesul la o masina distincta de server-ul de pe care s-a descarca miniaplicat ia; - ! lansarea n execut ie a unor programe noi sau ncarcarea de biblioteci locale. Aplicatii sever Aplicat iile Java pot fi, de asemenea, rulate pe o masina server daca JVM este disponibila pe platforma - respectiva Rularea pe server asigura dezvoltarea de aplicat ii dupa modelul celor 3 nivel specifice . calculului pe Internet. Aplica ia server ruleaz n mod continuu pe server i trimite un rspuns unui client ca urmare a unei cerei efectuate de acesta.

Rularea aplicatiilor Java Sistem de operare JVM Aplicatie Navigator JVM Miniaplicatie -

Rularea aplicatiilor Java Toate aplicat iile Java, inclusiv miniaplicat iile, se ruleaza la nivelul JVM. JVV este pornita diferit, dupa cu programul este o aplicat ie Java sau o miniaplicat ie. Rularea aplicat iilor Aplicat iile se ruleaza prin unei JVM locale direct din sistemul de operare. JVM interpreteaza programul Java si l converteste n instruct iuni masina specifice platformei. Rularea programului se face plecnd - de la metoda statica numita main() pentru o aplicat ie de sine sta toare sau printr-o referint a la o clasa ta - de miniaplicat ie dintr-un fisier HTML atunci cnd un program este ncarcat din navigator. Rularea miniaplicat iilor O miniaplicat ie Java este un tip special de program folost n paginile Web. Atunci cnd navigatorul de Web citeste o pagina HTML cu marcajul de miniaplicat ie (<applet>) ve descarca miniaplicat ia prin ret ea pe sistemul local si va porni miniaplicat ia n JVM care vine inclusa n navigator.

Functionarea JVM ! ! ! nca torul de clase al JVM ncarca clasele necesare rca fuctiona aplicatiei - rii Verificatorul JVM verifica secventele ilegale de cod de biti Gestionarul de memorie al JVM elibereaza memoria dupa terminarea aplicatiei -

nca torul de clase al JVM rca Rularea unui fisier cu extensia .class poate necesita si alte clase pentru ndeplinirea scopului propus. Aceste clase snt ncarcate automat de ncarcatorul (class loader) de clase n JVM. Clasele pot sa fie stocate pe discul local sau pe un alt sistem, caz n care accesul se face prin ret ea. JVM foloseste variabila de sistem CLASSPATH pentru determinarea pozit iei fisierelor locale .class. Clasele ncarcate prin ret ea sunt pastrate ntr-un spat iu de nume separate de cel al claselor locale. Astfel se previn conflictele de nume si nlocuirea sau suprascrierea unor clase standard prin clase malit ioasa. Verificatorul JVM Sarcina verificatorului este sa determine daca codul de bit i interpretat nu violeaza regulile de baza ale limbajului Java s ca acesta este dintr-o sursa de ncredere. Validarea asigura inexistent a viola -i rii accesului la memorie sau execut ia unor act iuni ilegale. Gestionarea memoriei JVM urmareste toate instant ele (variabilele obiect) utilizate. Daca o instant a nu mai este folosita JVM - are obligat ia sa elibereze memoria folosita de obiect. Eliberarea memoriei se face dupa ce obiectul nu - mai este necesar nu neaparat imediat dupa aceea. Procesul prin care JVM gestioneaza obiectele care nu mai snt referite se numeste colectare de gunoi (garbage collection). -

10

Compilatoare JIT (Just-in-Time)


! ! ! Cresc performantele Utile daca acelasi cod de biti se executa repetat Optimizeaza codul repetitiv (ciclurile)

Compilatoare JIT JVM traduce codul de bit i Java n instruct iuni native al masinii pe care se ruleaza Ce se petrece daca . acelasi cod trebuie executate din nou ceva mai trziu n program? n lipsa unui compilator JIT codul interpretat de la fiecare reluare a lui, chiar daca a fost deja interpretata o data ceva mai devreme deja. Avantajele compilatoarelor JIT Majoritatea JVM suporta deja compilare JIT. Compilatoarele JIT traduc codul de bit i numai la prima lui apartit ie; daca acelasi cod va fi executat mai trziu, va fi automat asociat codului corespondent n limbaj mas . -ina Compilatoatele JIT fac ca Java sa funct ioneze mai repede n momentele n care se pune problema traducerii n mod repetat a unui cod de bit i n instruct iuni masina native. Efectul este spectaculos n - cazul ciclurilor sau a funct iilor recursive. Unele compilatoare JIT snt suficient de inteligenta ca sa optimizeze traducerea unor secvent e de cod de bit i n instruct iuni native ale masinii pe care se ruleaza aplicat ia. -

11

Java s calculul pe Internet -i


! Calculul pe Internet are loc pe 3 nivele:

Java poate fi utilizat pentru oricare dintre aceste nivele

Java s calculul pe Internet -i Produsele firmelor serioase pentru calcule pe Internet trebuie sa suporte construct ia de componente Java pentru trei nivele de aplicat ie, precum si instrumete pentru esent iale pentru dezvoltare si gestiune a alicat iilor. Suportul se implementeaza sub forma de instrumente, aplicat ii, baze de date, servere de aplicat ii s interfet e pentru progrmarea aplicat iilor. - -i Nivelul client Atunci cnd Java trebuie sa fie rulat pe o masina client este tipic implementat ntr-o miniaplicat ie - executata din navigator care poate comunica cu server-ul de pe care afost descarcat. Nivelul serverului de aplicat ii Java poate fi utilizate pe server-ul de aplicat ii pentru implementarea unor componente partajate si reutilizabile ce t in de logica aplicat iei. Java mai poate fi utilizat la acest nivel de miloc pentru a furniza interfet ede control pentru aplicat ii generate sub forma unor pagini Web. Nivelul serverului de date Acest server stocheaza date, dar mai poate stoca s executa cod Java, n particular acest cod -i manipuleaza intensiv date sau fort eaza reguli de validare specifice datelor. -

Termenul de client-server apare n contextul sistemelor distribuite. Aplicat ia distribui este o colect ie de aplicat ii a c distribut ie este a aror transparent la nivelul utilizatorului astfel nct la aplicat ia pare s fie stocat pe o singur mas in local ntr-o ret ea de calculatoare a a a a - a a. utilizatorii simt c lucreaz pe o mas in particular iar pozit ia lor n ret ea, stocarea datelor nc a a - a a, arcarea s i funct ionalitatea mas inii lor nu este transparent Sistemele distribite folosesc, uzual, o anumit form de organizare cliet-server. a. a a Clientul este o aplicat ie sau un proces care solicit un serviciu de la un alt calculator sau proces, denumit server. Server-ul este o aplicat ie care a furnizeaz un anumit serviciu altor programe, numite client. Conexiunea ntre client s i server se face la nivel de mesaje transmise prin ret ea s i a - foloses te un protocol pentru codificareea cererilor clientului s i al rapsunsurilor server-ului. Server-ul poate s ruleze continuu n as teptarea cererilor a sau s fie pornit de o aplicat ie care controleaz un grup de server-e. Acest model permite plasarea clent ilor s i a serevr-elor independent, n nodurile a a - ret elei, posibil pe hardware-uri s i pe sisteme de operare diferite pentru a-s i ndeplini funct iile (server rapid/client lent). -

12

Ce este JDK?
Mediul de dezvoltare JDK Sun contine: ! Compilator ! Componenta de vizualizare a miniaplicatiilor ! Interpretor al codului de biti ! Generator de documentatie -

Componentele Sun JDK sunt: ! compilatorul java javac, el compileaza codul sursa Java n codul de bit i (bytecode) Java; ! appletviewer este componenta pentru vizualizarea miniaplicatiilor, aceasta citeste un document HTML, descarca miniaplicat iile referite n document si le afiseaza - ntr-o fereastra proprie. Se foloseste ca o alternativa la navigatorul de Web pentru testarea miniaplicat iilor Java; ! interpretorul codului de bit i Java, java, care este motorul ce ruleaza aplicat iile Java; ! generatorul de documentatie n format HTML pe baza codului sursa Java este javadoc. Alte scule JDK ! depanatorul de clase Java este jdb (asema tor cu depanatoarele dbx sau gdb din na UNIX); ! javakey pentru generarea cheilor de certificare si a codului Java de ncredere (trusted); ! jar pentru generarea de arhive de calse i de resurse; ! dezasamblorul codului de bit i Java ntr-un format inteligibil pentru oameni, javap; ! aplicat ia de versionare a claselor, serialver. -

13

Pachete Java
! ! echivalentul bibliotecilor C pachetele standard sunt pentru lucrul cu: T Limbajul T Ferestre T Miniaplica ii T Intrare/Ieire T Comunica ie n re ea

Pachete Java Pachetele asigura bazele pentru funct ionarea lui Java si sunt implementate sub forma unor serii de clase cu metode grupate dupa funct ionalitate. Pachetele Java sunt echivalentul bibliotecilor din C. De exemplu, exista un grup de clase care ajuta la crearea si utilizarea conexiunilor de ret ea, acestea sunt toate cont inute n pachetul java.net. Pachetul de baza al limbajului Java este classes.zip. Pachete Java standard Aceste pachete cont in clasele fundamentale pentru toate aplicat iile si miniaplicat iile Java, cteva mai importante sunt: Pachet Java java.lang Rol Colec ia claselor de baz din Java. Con ine rdcina ierarhiei de clase Java, Object, defini iile tuturor tipurilor primitive etc. Clase incluse Object, String, Thread, Runtime System

javax.swing java.applet java.io java.net Clase pentru suportul scrierii miniaplica iilor. Colec ia de clase de intrare/ieire (inclusiv pentru accesul la fiiere)

Window, Button, Menu, Graphics Applet, AudioClip File, InputStream, OutputStream Socket, DatagramPacket, URL, InetAddress

14

mpachetari, platforme i 7 versiuni Java


mpachetari:
! ! ! ! ! J2SE - Java 2 Platform, Standard Edition J2EE - Java 2 Platform, Enteprise Edition J2ME - Java 2 Micro Edition Solaris, Windows ... + SPARC, Intel ... Java release 1.0, 1.1; Java release 2, versiunea 1.2, 1.3, 1.4, 1.5, 1.6

Platforme (SO + UCP): Versiuni:

mpachetari Java Tehnologia Java bazata pe JVM este strucurata pe trei tipuri de produse proiectate n func ie de cerin ele particulare ale pie ei de software: ! J2SE - Java 2 Platform, Standard Edition: se folosete pentru applet i aplica ii care ruleaz pentru un singur calculator; ! J2EE - Java 2 Platform, Enteprise Edition: pentru aplica ii client/server distribuite; ! J2ME - Java 2 Micro Edition: pentru crearea de aplica ii care ruleaz pe un dispozitiv consumator (PDA, telefon celular etc.). Fiecare pachet de tehnologii Java are o edi ie SDK (Software Development Kit) prin care se pot crea, compila, executa programele n tehnologie Java pentru o platform particular. Platforme Java Familia de produse a tehnologiilor Java este strns legat de J2SE SDK deoarece majoritatea programatorilor i ncep cariera pe PC-uri prin scrierea de applet-uri. Sun a dezvoltat Java 2 Platform, Standard Edition SDK pentru urmtoarele platforme: Sistem de operare Solaris OE Microsoft Windows Solaris OE Procesor chip SPARC pe 32 bi i chip Intel pe 32 de bi i chip SPARC pe 64 de bi i

15

Sistem de operare Linux Intel

Procesor

Versiuni Java Prima versiune a lui Java a fost 1.0. Acesta a aprut pe pia sub denumirea de JDK 1.0, n anul 1996 i con inea maina virtual Java, bibliotecile de clase i instrumentele specifice pentru dezvoltare (compilator etc.) aplica iilor. Evolu ia versiunilor de limbaj este prezentat n tabelul urmtor: Versiune JDK 1.0 JDK 1.1 JDK 1.2 (cunoscut i sub denumirea de Java 2) JDK 1.3 JDK 1.4 JDK 1.5 (cunoscut i sub denumirea de Java 5) JDK 1.6 (Java 6) An 1996 1997 1998 2000 2002 2004 2006

ncepnd cu JDK 1.2 toate versiunile au fost numite, pe scurt, Java 2. n timpul evolu iei lui Java, modificrile aduse limbajului ini ial au fost pu ine, schimbri majore au avut ns loc la nivelul bibliotecilor acestuia i al integrrii limbajului n contextul unor tehnologoo software strns legate de Java. Numerotarea de 2 (din Java 2) arat c limbajul a progresat, intrnd oficial n perioda lui modern, ns din dorin a de a pstra continuitatea numerotrii versiunilor de bibliotec s-a acceptat c ntregul limbaj s fie versionat pe baza acestora. Dincolo de modificrile i adugirile de limbaj, n Java 2, apare pentru prima oar conectarea lui la un mediu de dezvoltare al aplica iilor. n afar de JDK, mai nou, Sun furnizeaz, i separat componentele (JVM i bibliotecile) necesare rulrii de aplica ii Java (fr posibilitatea dezvoltrii de aplica ii) sub denumirea de JRE (Java Runtime Environement).

16

2
Instalarea, configurarea JDK J2SE i rularea unei aplicatii Java

17

Instalrea i configurarea JDK J2SE


1. 2. 3. 4. 5. Descrcare J2SE de la http://java.sun.com/j2se: jdk-6-windows-i586.exe Instalare JDK n C:\Program Files\Java\jdk1.6.0 Despachetare surse (src.zip) i documenta ie (jdk-6-doc.zip de la http://java.sun.com/docs ) Configurare SO: Control Panel > System > Advanced > Environment Variables $ PATH Verificarea configurrii: Start > Run > cmd cu path i java- version

Instalarea JDK Ultima versiune de JDK se descarc de pe site-ul Sun-ului (http://java.sun.com/j2se), pentru Windows, mpachetarea J2SE fiind sub forma fiierului executabil jdk-6-windows-i586.exe. Acesta con ine i JVM-ul care se va instala automat mpreun cu JDK-ul. Dup instalare calea jdk/bin trebuie adugat n lista fiierelor executabile pentru ca sistemul de opearare s gseasc automat pe javac, java etc. Pentru aceasta, n Windows XP, mergem la Control Panel > System > Advanced > Environment Variables.

18

Aici, cutm prin User Variables pn gsim pe PATH, unde vom scrie pe C:\Program Files\java\jdk1.6.0\bin, apoi apsam butonul OK. Deschide i o consol windows nou (din Start > Run > ... >cmd) n directorul n care se afl stocat fiierul surs Java (mai jos acest director este D:\My Documents\Cursuri\Curs Java\cod), apoi verifica i dac instalarea i configurarea este corect prin path i java -version. Path ne arat c am introdus corect calea, iar java -version c JVM-ul s-a instala corect.

Instalarea surselor de biblioteci i documenta iei Java Fiierele care con ine sursele bibliotecilor din JDK se instaleaz ntr-o form comprimat n fiierul src.zip. Este recomandat decomprimarea i instalarea lui pentru accesul la codul surs n directorul src. Documenta ia este con inut ntr-un fiier separat de JDK ce trebuie descrcat de pe http://java.sun.com/docs , pentru J2SE, versiunea 6 acesta este jdk-6-doc.zip. Acest fiier se va decomprima n directorul docs i aeste n format HTML. Va putea fi vizualizate cu orice navigator de Internet ncepnd cu index.html. Cel mai simplu este s se pun un bookmark n navigator ctre acest fiier.

19

Structur de directori ai JDK-ului va fi n final: jdk (numele versiunii actuale este jdk1.6.0, se modific func ie de versiune) *) bin (compilator java i alte instrumente de dezvoltare) *) demo (exemple de aplica ii Java) *) docs (documenta ia bibliotecile n HTML, dup decomprimarea lui jdk-6-doc.zip) *) include (fiiere pentru compilarea metodelor native) *) jre (fiierele mediului de execu ie Java) *) lib (fiierele de bibliotec) *) src (fiierele surs de bibliotec, dup decompimarea lui src.zip)

20

Etapele generarii unei aplicatii 7 Java


Etapa:
1 2 3 Editarea: Salut1 $ salvare pe disc cu extensia .java Compilarea: javac Salut1.java $ Salut1.class Rularea: java Salut1
A. B. C. ncrctorul de clase copiaz con inutul lui Salut1.class de pe disc n RAM Verificatorul codului de bi i se asigur c sistemul de securitate Java nu este violat Interpretorul citete din RAM i traduce codul de bi i n limbaj main i l execut.

Etapele necesare rulrii unei aplica ii Java Stocarea textul surs. Toate programele Java sunt formate din obiecte. Exist dou tipuri de obiecte: tipurile de date fundamentale (numite unori, primitive sau de baz) i tipurile de date definite de utilizator, numite clase. Tipurile primitive sunt definite la nivelul limbajului Java, iar clasele sunt definite de ctre programator sau de ctre al i dezvoltatori. n continuare se prezint o aplica ia Java, format dintr-o clasa numit Salut1, care va afia pe ecran textul Salut!.
Extensia fiierului surs trebuie sa fie .java, iar numele acestuia Salut1. Numele clasei i cel al fiierului surs trebuie s fie acelai.

Con inutul fiierului surs Java Salut1.java este: // Salut1.java public class Salut1 { // executia unei aplicatii Java incepe cu metoda main. public static void main( String args[] ) { System.out.println("Salut !" ); } // terminare metoda main } // terminare clasa Salut1 Explicarea liniilor codului surs Java Linia // Salut1.java reprezint un comentariu care se ntinde pe o singur linie (ncepnd cu primul carater de dup // i pn la trecerea la linia nou) din textul surs. Comentariile ajut la n elegerea codului Java explicnd rolul unor secven e de cod. Ele nu apar n programul executabil, liniile n cauz fiind ignorate de ctre compilator. Atunci cnd este nevoie de comentarii mai lungi, ce 21

trebuie s se ntind pe mai multe linii, se va folosi perechea de delimitatori /*, */.
Limbajul Java este case sensitive adic face diferen a ntre scrierea cu litere mari i mici. Dac n loc de main se va scrie Main aplica ia nu se va rula.

public se numete modificator de acces , acesta permite definirea controlul accesului altor por iuni de program la aceast por iune de cod. class reprezint nceputul unei declara ii de clas i este urmat de numele clasei (mai sus, Salut1). Orice aplica ie Java trebuie con in cel pu in o singur declara ie de clas. Clasa reprezint un ablon pentru descrierea strii i a comportamentului asociat unui obiect din acea clas. Procesul de creare a unei obiect pe baza unei clase se numete instan iere. Starea unui obiect este stocat n variabilele membri, iar comportamentul ei se implementeaz prin metode. { - acolada deschis marcheaz nceputul corpului declara iei de clas i va avea ntotdeauna corespondent o acolad nchis - } ce marcheaz terminarea declara ie de clas. Por iunea de cod surs delimitat de aceste acolade poart denumire de bloc. Linia este locul de pornire a programului public static void main( String args[] ). Numele main este urmat de o parantez rotund (, un parametru i o parantez rotund nchis ). Prezen a parantezei spune compilatorului Java c main este o metod i nu o alt construc ie de limbaj. Atunci cnd dorim s rulm o clas pe JVM trebuie s-i specific doar numele, interpretorul Java apelnd automat metoda main a clasei. Metoda main este precedat de trei modificatori: public - care permite ca orice alt clas s poat apela metoda main; static - spune c metoda main nu opereaz cu obiecte (deoarece n momentul pornirii aplica iei nc nu avem obiecte), tehnic vorbind aceasta nu-l are pe this (vezi referint a this). n general, metoda main este cea care construiete obiectele necesare programului. Daca nsa dorim sa apelam numai metode ale clasei nu mai este necesara construct ia (aceasta se face cu operatorul new) lui; construct ia este obligatorie daca se dorete accesarea de metode sau de variabile de instant a (vezi conceptul de clasa); - void - indic faptul c metoda main nu ntoarce o valoare. Linia {System.out.println("Salut !");} este echivalent cu liniile (n sensul c din punctul de vedere al compilatorului Java efectul compilrii este acelai - rezult acelai cod de bi i - dar pentru o citire i n elegre mai uoar se prefer cea de a dou scriere - cu spa ii i pe mai multe linii): { System.out.println( } Aici acoladele marcheaz nceputului i terminarea corpului metodei main. Metoda are o singur instruc iune care folosete un pachet de intrare/ieire pentru afiarea n fereastra din care s-a rulat aplica ia a textului Salut !. Textul de afiat se scrie ntre ghilimele i poart denumirea de ir de caractere sau mai pe scurt, ir. Metodele n Java pot avea parametri, metoda System.out.println face afiarea parametrului ir. Caracterul ; se numete terminator i face ca metoda s fie considerat o instruc iune Java. Clasa System este din pachetul java.lang i con ine, printre altele, metode pentru interac iune ntre JMV i mediul extern (recunoate carecteristicile platformei pe care ruleaz). Prin System se pot accesa fiierele standard de intrare (in), ieire (out) i de erorare (err). 22 "Salut !" );

Este o eroare de sintax dac un ir nu este cuprins n ghilimele la nivelul programului surs sau dac se omite un caracter terminator de instruc ie ;.

Compilarea programului surs Java Pentru compilarea programului Java stocat n fiierul Salut1.java se va folosi compilatorul javac astfel: javac Salut1.java. Compilatorul Java va crea fiierul Salut1.class ce con ine codul de bi i al aplica iei. Rularea aplica iei Java Deoarece codul de bi i este o reprezentare intermediar programului Java el nu poate fi rulat direct de sub sistemul de operare. Rularea necesit JVM care se pornete cu java Salut1. JVM trebuie s primeasc numele clasei de rulat, n exemplul prezentat acesta este Salut1. Dac numele clasei este acelai cu cel al fiierului n care acesta este stocat, cutarea clasei se va face automat pe baza numelui de fiier care are extensia .class.

Erori n scrierea unei aplicatii Java


1. Eroarea de sintax : apare atunci cnd compilatorul nu recunoate o linie de cod, reprezentnd o violare a regulilor de scriere din limbaj. Compilatorul afieaz un mesaj de eroare pentru ca programatorul s o poat identifica i corecta. 2. Eroare de nerespectare a unor conven ii de limbaj: ! O clas public trebuie s aib numele fiierului n care se stocheaz identic cu cel a numelui clasei ! Extensia fiierului trebuie s fie obligatorui .java pentru fiierul care con ine declara iile de clas.

Erorile de sintax se mai numesc i erori de compilare deoarece compilatorul le detecteaz n faza de compilare. Aplica ia nu va putea fi rulat dect dup corectarea tuturor erorilor de sintax.

23

Variabile
! ! ! ! Variabila = nume dat unui grup de loca ii de memorie ce la un moment dat, stocheaz o singur valoare Orice variabil trebuie declarat Caraterizat prin: nume, valoare, tip, persisten i vizibilitate. Variabilele pot fi ini ializate n momentul declarrii
Tip N ume V aloare

int i = 5;
La nivel conceptual, variabila este o abstactizare a componentei electrice numite memorie intern. La nivel de limbaj variabila reprezint un nume simbolic, numit i identificator, prin intermediul cruia vom putea accesa i stoca valori n RAM-ul calculatorului. n Java orice variabil trebuie declarat explicit, adic pentru fiecare nume de variabil din program este obligatoriu s avem o line de forma Tip Nume = [Valoare ini ial]; ce se citete, variabila cu numele Nume se declar de tipul Tip. Declara ia leag (asociaz) de numele variabilei un grup de caracteristici. Variabila poate fi declarat n orice loca ie din bloc, dar este preferabil s fie scris la nceputul acestuia. Se pot declara mai multe variabile ntr-o singur linie.n Java variabilele sunt de dou feluri: locale (declarate ntr-o metod) i cmp (declarate ntr-o clas). Caractersticile legate de numele variabilei prin declara ie sunt: Numele variabilei este formula prin care variabila este identificat n textul aplica iei Java. Valoarea variabilei este con inutul loca iilor de memorie alocate n RAM. Modul de interpretare al loca iilor este determinat de tipul variabilei. Tipul asociat unei variabile prin declara ie determin mul imea valorilor i a operatorilor ce pot ac iona asupra variabilei. Java este un limbaj puternic tipizat, adic tipul oricrei expresii, n particular a unei variabile, trebuie s poat fi determinat n momentul compilrii. Persisten a definete intervalul de timp din execu ia aplica iei Java n care se zice ca variabila exist (n sensul c i se aloc o anumit regiune de RAM). Variabilele locale exist att timp ct metoda n care s-au declarat este activ n sensul c aceasta se ruleaz. Variabilele cmp exist att timp ct obiectul al crui membru sunt exist. Dac variabila cmp este i static cmpul va exista ct timp clasa respectic rmne ncrcat n JVM Vizibilitatea definete por iunea de cod din care un nume de variabil este recunoscut de compilator. n afara acestei por iuni de cod utilizarea respectivului nume va genera o eroare de sintax. Pentru variabilele declarate n interiorul unui bloc, vizibilitatea ncepe din locul declara iei i se termin la acolada de nchidere a blocului. Este posibil ntr-un bloc intern acelai numele de variabil s fie redeclarat, situa ie n care vizibilitatea numelui extern nu o include pe cea a numelui intern. Ini ializarea variabilelor se poate face explicit, adic ele primesc o valoarea explicit n momentul delcarrii. Dac aceast valoare implicit nu este dat, variabilele de tipul ntreg primesc valorea 0. 24

Nume de variabile
! ! ! ! ! Numele unei variabile trebuie s nceap cu o liter din alfabet sau underscore ( _ ) sau $ Urmtoarele caractere pot con ine i cifre, dar nu spa ii sau operatori (+, -, *, / etc.) Nu se poate folosi un cuvnt rezervat al limbajului Java pe post de nume de variabil Lungimea numelui este nelimitat Este semnificativ scrierea cu litere mari sau mici
OK - U a x1 masa x2 masa$ideala masa_ideala Greit - Y masa#ideala a-1 x*1 for if 1x

Variabile locale Variabilele locale sunt declarate ntr-o metod sau un bloc de cod Java. Din acest motiv vizibilitatea i persisten a lor este restrns la respectiva por iune de cod. Acestea vor putea fi acceste (sunt vizibile) numai n interiorul respectivului bloc (variabilele declarate n afara metodelor pot fi accestate din orice metod) i vor avea alocat un spa iu propriu n RAM att timp ct blocul de cod respectiv se ruleaz. O variabil local trebuie s primeasc valoare nainte de a fi utilizat ntr-o expresie, altfel compilatorul va da un mesaj de eroare. Fie declara ia: int i = 5; Aceasta declar o variabil cu numele i de tipul int i care are valoarea ini ial 5. Variabila, ca rezultat al unui proces de abstractizare, const dintr-un grup de caracteristici (o denumire alternativ este cea de atribute). Procesul de asociere a unei valori unei caracteristici de variabil poart denumirea de legare (binding). Unele dintre carateristicile variabilei sunt cunoscute la momentul compilrii, de exemplu numele i tipul acesteia. Se zice c aceste caracteristici sunt legate static (static binding). Alte caracteristici, de exemplu valoarea - cu excep ia cazului cnd aceasta este ini ializat explicit, se leag n timpul rulrii aplica iei. Se zice c ele sunt legate dinamic (dinamic binding).

25

Cuvinte cheie rezervate


Tipuri primitive Modificatori Instructiuni Tipuri definite de utilizator class extends implements interface throws

boolean byte char double float int long short void

abstract final native private protected public static synchronized transient volatile

false null true

break case catch continue default do else finally for if return switch throw try while

import package

instanceof new super this

Se numete gramatic o mul ime de defini ii formale ce alctuiest structura sintactic (numit, pe scurt i sintax) a unui limbaj. Gramatica este definit n termenii unor reguli de generare ce descriu ordinea constituen ilor dintr-o propozi ie. Fiecare regul are o parte stng, numit categorie sintactic i o parte dreapt format dintr-o secven de simboluri. Simbolurile pot fi terminale sau neterminale. Un simbol terminal corespunde unui constituent de limbaj care nu mai are structur sintactic intern (este un element minimal de limbaj). Cuvintele cheie reprezint o mul ime de simboluri terminale care fac parte din sintaxa limbajului Java. Restric ia de baz referitoare la acesta este cea conform creia nu se pot da nume de variabile (sau alte elemente de limbaj definite de programator) care sa aib aceeai scriere cu acestea. Pe lng cuvintele cheie de mai sus, numele const i goto sunt i ele rezervate i nu pot fi folosite ca nume de variabile.

26

Tipuri de date n Java


! Tipuri de date primitive: L 6 tipuri de date numerice: - ntregi: byte, short, int, long - reali: float, double L 1 tip de dat pentru caractere: char L 1 tip de dat bolean: boolean Tipuri de date definite de utilizator: L clasele: class L intefe ele: interface L tablourile

Tipuri de date primitive Tipurile de date primitive sunt implementate la nivelul JVM. Tipic pentru Java este c numele lor ncepe cu liter mic. Astfel, float este un tip de data primitiv, n timp ce Float este un obiect. Tipuri ntregi Tipurile ntregi se folosesc pentru manipularea numerelor ce nu au parte zecimal. Valorile numerice ntregi pot fi att negative ct i pozitive, se mai spune c pot fi cu semn. Tipurile ntregi din Java sunt: Tip byte short int long Spa iu alocat 1 octet 2 octe i 4 octe i 8 octe i -128 la 127 -32,768 la 32,767 -2,147,483,648 la 2,147,483,647 -9,223,372,036,854,775,808 la -9,223,372,036,854,775,807 Domeniu de valori

Exemple de valori ntregi: n baza 10: 1, 2, 6700000000000000000L n baza 8 (numrul este prefixat cu 0): 07 n baza 16 (numrul este prefizt cu 0x): 0xaa Tipuri reale Tipurile reale se folosesc pentru manipularea numerelor ce au pare zecimal. Ele se repezint n virgul flotant conform standardului IEEE 745. Tipurile reale din Java sunt:

27

Tip float double

Spa iu alocat 4 octe i 8 octe i

Domeniu de valori aproximativ 3.40282347E+38F aproximativ 1.7.9769313486231570E+308

Precizie 7 zecimale 15 zecimale

La tipul double precizia este dubl fa de tipul float. Exemple de valori reale: float: 1.34F; double: .337, 4.345345E108, 3.0, 3.46D\ Tipul caracter Tipul char se folosete pentru stocarea caracterelor individuale, spre deosebire de tipul obiect String ce se folosete pentru stocarea irurilor de caractere. Codificarea caractereleor n Java respect standardul Unicode pentru reprezentarea caracterelor n orice limb pe 16 bi i (2 octe i). Primele 256 de caractere corespund cu mul imea de caractere ISO Latin 1 din a crei parte este i codificarea ASCIII. Exemple de valori caracter: A - litera A din alfabet \u03C0 - valoare definit prin codificare Unicode n hexazecimal a lui \n - caracter special - line feed Majoritatea valorilor de tipul caracter se afieaz pe ecran, exist totui un grup de caractere neafiabile acesta fiind rezevate pentru comanda dispozitivelor de afiare. Tipic, ele ncep cu backslash \ urmate de un alt caracter Tipul bolean Tipul boolean are dou valori distincte, false i true. Se folosete pentru evaluarea unor condi ii locice. Nu se poate converti la o valoare ntreag Tipuri de date definite de utilizator Clasele, intefe ele, tablourile sunt tipuri de date definite de utilizator. Dup definirea acestora de vor putea declara variabile de acel tip dup modalitatea utilizat la tipurile primitive.

28

Literali
Literalii reprezint valori care nu sunt stocate n variabile. ! numerici: - ntregi: 0 18 -23232 (int n baza 10) 02 077 0123 (int n baza 8) (Implicit int)
0x0 1L 0xff 0X1FF 022L 0x1FFFL (int n baza 16) (long)

- reali: (Implicit double) ! nenumerici: - booleeni: - caracter: - ir:

1.0 4.2 0.47 1.23e12 4.12E-9 6.3f 5.62F 4.12E9F

(double) (double) (float)

true false

a \n \077 \u005F

Salut/n

Literalii ir se formeaz prin cuprinderea ntre ghilimele a unui grup de caractere. Pentru manipularea acestra se va folosi un tip obiect numit String, implementet la nivel de bibliotec n Java i nu tipul primitiv char ce poate stoca numai o singur valoare. Erori la declararea de variabile Fie urmtoarele declara ii de variabile: 1 byte b = 130; 2 short s1 = 123, s2 3 int i = b*b*b*b; 4 long l = i+i+i; 5 double new=73.8; 6 boolean mergeinvacanta = true; 29

7 boolean max = s1>b; 8 char sal=Salutare !; 9 char amic = a; Linia 1: b este o variabil de tipul byte, deci poate stoca valori n domeniul -128 , 127. Compilatorul va da un mesaj de eroare deoarece valoarea de ini ializare este n afara domeniului admis. Linia 2: Este omis terminatorul de instruc iune (;) de la sfritul declara iei. Linia 5: Declara ia este incorect deoarece new este cuvnt rezervat n Java; Linia 8: Variabilele de tipul char pot stoca o singur valoare. Dac se folosete String n loc de char e Ok. Iat dou aplica ii ce folosesc declara ii de variabile locale i pachete Java diferite pentru a calcula masa ideala n func ie de vrsta i nal inea unei persoane: Varianta 1:
import java.util.Scanner; public class MasaIdealaV1 { public static void main(String[] args) { //declaratii de variabile locale double masa, varsta, inaltimea; Scanner intrare; intrare = new Scanner(System.in);

//afisarea pe ecran a textului Ce varsta ai: System.out.print("Ce varsta ai: "); //citirea unui numar real de la tastatura varsta = intrare.nextFloat(); System.out.print("Ce inaltime ai: "); inaltimea = intrare.nextFloat(); //formula de calcul a masei ideale masa = 50 + 0.75 * (inaltimea-150) + 0.25 * (varsta - 20); System.out.println("Masa ideala (barbat) = " + masa + " kg"); System.out.println("Masa ideala (femeie) = " + 0.9*masa + " kg"); } }

Varianta 2:
import javax.swing.JOptionPane; public class MasaIdealaV2 { public static void main(String[] args) { //declaratii de variabile locale float masa, inaltimea;

30

int varsta; //afisarea pe ecran a ferestrei de dialog Ce varsta ai: String intrare = JOptionPane.showInputDialog("Ce varsta ai: "); //citirea unui numar real de la tastatura varsta = Integer.parseInt(intrare); intrare = JOptionPane.showInputDialog("Ce inaltime ai (in cm): "); inaltimea = Float.parseFloat(intrare); masa = 50F + 0.75F * (inaltimea-150F) + 0.25F * (varsta - 20F); String masaideala = "Barbat = " + masa + " kg\n"; masaideala = masaideala + "Femeie = " + 0.9*masa + " kg"; JOptionPane.showMessageDialog(null, ideala",JOptionPane.INFORMATION_MESSAGE); } } masaideala,"Masa

31

Constante Java
n Java cuvntul cheie final definete o constant. Se declar la fel ca i o variabil ns poate primi valoare o singur dat. Prin conven ie, numele constantelor se scriu cu majuscule. final double PI = 3.1415926535;

Dac constanta este declarat ntr-o metod, ea va fi vizibil numai n interiorul acesteia. n situa ia n care se dorete ca o constant s fie vizibil la nivel de clas se zice c declarm o constant de clas i tebuie s folosim cuvintele cheie static final . Declara ia ei se scrie n afara metodelor clasei i va fi de forma: public static final double PI = 3.1415926535;

32

Comcepte de programare orientata pe obiect 7


Abstractizare L Clas L Trecerea de la realitate la un model (o simplificare a realit ii) Tip de dat definit de utilizator ce realizeaz ncapsulare a datelor (cmpuri) i a opera iilor (metodele) ce se pot face cu datele procesul de creare a unei variabile de tipul clas prin folosirea lui new denumire dat unei variabile de tip clas

Instan iere L Obiect L

Solu ionarea unei probleme implic izolarea ei de realitate. Se numete abstractizare procesul prin care se elimin detaliile realit ii fiind pstrate numai acele aspecte ce se consider a fi relevante pentru solu ionarea problemei. Prin procesul de abstractizare se ob ine un model al realit ii. Activitatea de trecere de la acest model la universul sistemului de calcul folosit pentru n scopul ob inerii rezultatelor poart denumirea paradigm sau metodologie (tehnologie) de programare. n paradigma programrii orientate pe obiect, modelarea realit ii de face prin conceptul de obiect. Obiectul este o abstractizare unei realit i. Realitatea poate s fie palpabil (ceva fizic) sau o idee (un concept) a crei stare trebuie reprezentat. Obiectul este o unificare ntre datele i mul imea opera iilor ce pot fi efectuate cu acestea. Utilizatorul unui obiect nu trebuie s cunoasc tipurile de date reprezentate n obiect ci doar opera iile prin care acestea se pot modifica, se zice c reprezentarea intern a datelor este ncapsulat (ascuns) de exterior, dar poate fi manipulat prin opera ii specifice. Clasa descrie un model sau un ablon de stare i de comportament pentru obiecte. Defini ia unei clase const n date (cmpuri) i metode (proceduri de calcul). Clasa este un tip de dat definit de utilizator pe baza creia se vor crea noi obiecte din respectiva clas. Defini ia unei clase const n: ! modificatori de acces: definesc vizibilitatea clasei n raport cu alte clase (public); ! class: cuvnt cheie care anun Java ca urmeaz un bloc pentru definirea unei clase; ! cmpuri: variabile sau constante care sunt folosite de obiectele clasei (x i y); ! constructori: metode care controleaz starea ini ial a oricrui obiect din clas(Punct() i Punct(double abscisa, double ordonata)); ! metode: func ii care controleaz valorile stocate n cmpuri (setX(), setY() ...). Exemplul urmtor definete o clas cu numele Punct.
//Definitia unei clase public class Punct {

33

//Campuri private double x; private double y; //Constructori Punct() { setX(0); setY(0); } Punct(double abscisa, double ordonata) { setX(abscisa); setY(ordonata); } // Metode public void setX(double abscisa) { x = abscisa; } public void setY(double ordonata) { y = ordonata; } public double x() { return x; } public double y() { return y; } public double distantaOrigine() { return Math.sqrt(x*x+y*y); } public String toString() { return "<" + x + "," + y + ">"; } } public class Grafica { public static void main(String[] args) { Punct p1; //declararea var. obiect p1 de tipul clasa Punct Punct p2 = new Punct(-1,7); //decl. + creare + initializare p1 = new Punct(); //creare + initializare obiecte p1

System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); p1.setX(12); p2.setY(13.345); System.out.println("p1 = " + p1.toString()); System.out.println("p2 = " + p2); } }

Rezultate:
p1 = <0.0,0.0> p2 = <-1.0,7.0>

34

p1 = <12.0,0.0> p2 = <-1.0,13.345>

35

3
Operatorii limbajului Java

36

Tipuri de operatori
n Java avem 5 tipuri de operatori. ! atribuirea ! aritmetici ! pe bi i ! rela ionali ! booleeni

Variabilele i constantele se folosesc pentru stocarea datelor la nivelul aplica iei. Operatorii sunt caractere speciale prin care Java este anun at despre opera ia ce trebuie s o fac cu operanzii asupra crora ac ioneaz. Operatorii au un efect i ntorc un rezultat. Ei combin datele n expresii pentru a produce valori noi. Operatorul de atribuire Operatorul de atribuire d unei variabile o valoarea a unui literal sau o valoarea ce se ob ine ca urmare a evalurii unei expresii. Operatorii aritmetici Operatorii aritmetici realizeaz opera iile aritmetice de baz (adunare, scdere, nmul ire i mpr ire) cu operanzii. Pot fi utiliza i pentru toate tipurile numerice. Operatorii pe bi i Operatorii pe bi i permit interac iunea cu reprezentarea intern pe bi i ale tipurilor numerice ntregi permi nd ac iunea la nivel de bit. Dac operatorii aritmetici trateaz o valoare numeric unitar, cei pe bi i permit modificarea individual a fiecrui bit din valoarea ntreag. Operatorii rela ionali Operatorii rela ionali permit compararea a dou valori. Rezultatul compara iei este bolean i poate fi utilizat pentru setarea unor valori sau pentru controlul execu iei programului. Operatori booleeni (logici) Operatori booleeni pot fi utiliza i numai cu valori boleene sau ca rezultat ntotdeauna o valoare bolean.

37

Atribuirea
Form: nume = expresie expresie din stnga lui = se evalueaz apoi valoarea ei se copiaz n nume int i, i1=0, i2 = 1; i1=10; i2=15; i1=i2=7; i=(i1=(i2=7));

n limbajul Java orice expresie produce un rezultat, iar tipul rezultatului este determinat de operatorul folosit i de ctre tipul operanzilor. Dac analizm expresia a + b, atunci a i b se numesc operanzi, iar + operator; efectul operatorului este acela de adunare, iar rezultatul lui este suma valorilor numerice stocate n variabilele a i b. Atribuirea, care are simbolul =, este un operator, asemenea lui + astfel, cnd undeva n program se scrie a = b el va avea un efect i un rezultat. Efectul este cel de evaluare a expresisei din drepta lui =, la noi aceasta este valoarea stocat n b i de copiere a valorii expresiei evaluate n a, iar rezultaul este valoarea copiat, adic valoarea lui b. Deseori, acest rezultat nu este folosit mai departe, dei utilizarea lui ar fi corect. Majoritatea operatorilor Java produc un rezultat fr a modifica valorile operanzilor. Exist ns operatori, asemenea celui de atriburie, care modific valoarea unui operand. Aceast ac iune poart denumirea de efect secundar, n englez side effect. n cazul operatorului = , denumirea este for at deoarece aici efectul de modificare este cel primar. Java are ns o clas ntreag de operatori care produc efecte secundare ce vor fi discuta i n continuare (atribuirea compus). Atribuirea poate fi i multipl, situa ie n care asociativitatea operatorului de atribuire este de la dreapta la stnga.

38

Operatorii aritmetici
Realizeaz oper iile aritmetice de baz; Operanzii pot fi numerici (literali sau variabile) int a = b = c = d = e = a,b,c,d,e; 1 + 2; // + 1 - 2; // a * 2; // * c / b; // / a % 2; // % pentru pentru pentru pentru pentru ADUNARE SCDERE NMUL IRE MPR IRE RESTUL MPR IRII

Operanzii unei opera ii aritmetice trebuie s fie numerici, iar rezultatul va fi i el numeric. Cteva dintre problemele arimeticii simple n Java sunt: ! n expresiile n care particip operatorii aritmetici, ordinea evalurii lor este dat de prioritatea i asociativitatea lor. *, / i % au prioritatea mai mare dect + i -, motiv pentru care aceste opera ii vor fi evaluate nainte de adunare i scdere; ! parantezele rotunde modific prioritatea evalurilor aritmetice, aceasta ncepnd de la parantezele cele mai interioare; ! mpr irea ntre ntregi ntoare rezultat ntreg (eventuala parte zecimal este ignorat); ! mpr irea ntreag cu 0 genereaz o excep ie; ! mpr irea real cu 0. ntoarce infinit (Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY) sau rezultat nenumerice (Not A Number Double.NaN).

Aritmetica numerelor ntregi


Toate opera iile aritmetice se fac cu tipurile int sau long, valorile byte, char sau short fiind automat promovate la int nainte de efectuarea opera iilor, rezultatul fiind i el un int. Similar, dac un operand este de tipul long, iar cellat nu, acesta va fi automat promovat la long, iar rezultatul va fi long. Dac ns se ncerc atribuirea unui rezultat cu reprezentare mai lung unei variabile ce are un tip cu reprezentare (n octe i) mai scurt se primete o eroare la compilare. Terminologia folosit n situa ia n care se dorete stocarea unei valori de un tip ntr-o variabil de un alt tip se numete for are de tip (type casting). For area de tip poate produce rezultate ciudate, fie codul: byte b1 = 1, b2 = 2, b3; b3 = b1+b2; // eroare, rezultatul este de tip int b3 = (byte) (b1+b2) // aici avem for are de tip - asa merge, dar pot // aprea ciud enii dac, b1 i b2 iau valoarea 120 fiecare, rezultaul va fi incorect. For area de tip face ca reprezentarea pe bi i a valorii s fie copiat din surs n destina ie. Dac rezultatul nu ncape n destina ie se pierd date.

39

Promovarea s fortarea de tip -i Conversie: Trecerea de la o reprezentare intern a unui tip de date la o alta. Promovare: conversie ctre un tip cu domeniu mai larg For are: convesrie ctre un tip cu domeniu mai ngust
Ficare tip de dat are o reprezentare specific n limbajul Java (de exemplu, numerele reale n virgul flotant sunt reprezentate prin M - mantisa, E - exponent i B - baz, valoarea numrului fiind calculat prin expresia M*BE ). Conversia unei variabile sau expresii de la un tip la altul poate conduce la nepotriviri legate de modul de efectuare a calculelor cu respectivele tipuri de date i de probleme legate spa iul alocat pentru stocarea rezultatului. Cel mai des compilatorul va recunoate pierderea preciziei i nu va permite compilarea programului, exist ns i cazuri cnd rezultatul ob inut va fi incorect. Pentru rezolvarea acestei probleme tipurile asociate variabilelor trebuie s fie promovate ctre tipuri cu un domeniu mai larg sau convertite for at la tipuri cu domeniu mai mic. Fie atriburile:
int n1 = 102; int n2 = 13; byte n3; n3 = (n1 + n2); //4 octeti pentru stocarea valorii //4 octeti pentru stocarea valorii //1 octet pentru stocarea valorii // <--- aici compilatorul va da eroare

Practic, codul de mai sus ar trebui s func ioneze deoarece un byte, care este un int mai mic, este n stare s stocheze valoarea 115. Totui, compilatorul nu va face atribuirea, ci da va o eroarea "possible loss of precision" pentru c o valoarea byte este mai mic dect una int. Rezolvarea problemei se face fie convertind tipul expresiei din dreapta operatorului de atribuire (=) aa nct s se potriveasc cu tipul variabilei din snga, fie variabila din stnga (n3) se declar ca fiind de un tip de mai larg. Solu ia problemei, prin schimbarea tipului lui n3, este:
int n1 = 102; int n2 = 13; int n3; n3 = (n1 + n2);

Promovarea de tip Exist situa ii n care compilatorul modific tipul unei variabile la un tip care suport un domeniul de valori mai larg. Aceast ac iune de conversie poart denumirea de promovare. Unele promovri se fac automat de ctre compilator pentru evitarea pierderii preciziei rezultatelor. Situa iile acestea apar atunci cnd: ! se atribuie un tip mai mic unui tip mai mare; 40

! Fie declara ia:

se atribuie un tip ntreg unui tip real (deoarece nu exist zecimale care s se piard).

long varsta = 37;

Valoarea ntreag (int) 37 este atribuit unei variabilei varsta de tipul long. Promovarea valorii ntregi se va face automat nainte de atribuire ei variabilei de tipul long deoarece aceast conversie nu pune probleme. nainte de a fi atribuit variabilei, rezultatul unei expresii este plasat ntr-o loca ie de memorie temporar. Dimensiunea loca iei va fi ntotdeauna egal cu cea a unui int sau, n general, cu dimensiunea celui mai mare tip de dat folosit n expresie. De exemplu, dac expresia nmul ete dou tipuri int, loca ia va avea dimensiunea unui tip int, adic 32 de bi i (4 octe i). Dac cele dou valori care se nmul esc dau o valoarea care este dincolo de domeniul tipului int (de exemplu 77777*777778 = 6,049,339,506 nu poate fi stocat ntr-un int), valoarea va trebui trunchiat pentru ca s ncap n loca ia de memorie temporar. Acest fel de calcul va conduce, n final, la rezultat incorect pentru c variabila care va stoca rezultatul va con ine valoarea trunchiat (indiferent de tipul folosit pentru variabila ce va stoca rezultatul). Pentru rezolvarea acestei probleme, cel pu in una dintre tipurile participante n expresie trebuie s fie long pentru a asigura cel mai larg domeniu posibil al variabilei temporare. Promovrile atutomate sunt prezentate n continuare: char \ --> int --> long --> float --> double byte --> short / Observa i c nu se fac promvri automate ntre tipul boolean i orice alt tip de dat. For area de tip For area de tip este o conversie ce scade domeniul n care poate lua valori variabila prin modificarea tipului variabilei. Situa ia apare atunci cnd, de exemplu, o valoarea long este convertit la una int. Ac iunea se face pentru ca unele metode accept numai argumente de un anumit tip sau pentru atribuirea de valori unor variabile cu tip mai mic sau pentru economie de memorie. Sintaxa de for are a conversiei de tip este:
nume = (tip_destinatie) valoare;

unde: ! ! ! nume este numele variabilei la care i se atribuie valoarea; valoare este valoarea care se atribuie lui nume; (tip_destinatie) este tipul la care se va converti valoare. Obesrva i c utilizarea parantezelor rotunde este obligatorie.

O solu ie pentru exemplul prezentat prin for area conversiei de tip este: int n1 = 102; int n2 = 13; byte n3; n3 = (byte)(n1 + n2); //32 de biti pentru stocarea valorii //32 de biti pentru stocarea valorii //8 biti de memorie rezervata // nu exista pierdere de date 41

For area conversiei de tip trebuie utilizat cu grij. De exemplu, dac n1 i n2 ar fi con inut valori mai mari, for area conversiei de tip ar fi trunchiat o parte din date rezultnt o valoarea incorect. Iat o situa ie de evitat:
int i; long l = 123456789012L; i = (int) (l); //valoarea numarului este trunchiata

La for area conversiei de la tipul float sau double, care au parte frac ionar, la unul ntreg, de exemplu, int, toate zecimalele se pierd. Totui, aceast metod este util atunci cnd dorin ca dintr-un numr real s facem unul ntreg. Un dintre situa iile necesare n practic este realizarea mpr irii reale ntre numere ntregi. Codul care urmeaz exemplific utilizarea for rii de tip n acest scop:
public class fortareConversii { public static void main(String args[]) { char c = 'a'; int n = 1111; float f = 3.7F, rez; c = (char) n; //fortare de conversie 'barbara' rez = f + (float)n / 2; //impartirea este reala System.out.println("a, rez: " + c + ", " + rez); } }

Rezultate:
a, rez: ?, 559.2

Promovarea la ntregi Dac expresia con ine tipuri ntregi i operatori aritmetici (*, /, -, +, %) valorile sunt automat promovate la tipul int (sau mai mare dac este cazul) i numai dup aceea se rezolv operatorii. Aceast conversie poate conduce la depire sau pierderea preciziei. n exemplul urmtor primii doi operanzi dintre cei trei cu numele de a, b i c sunt automat promova i de la tipul short la tipul int nainte de adunare: short a, b, c; a=1; b=2; c=a+b; n ultima linie, valorile lui a i b sunt convertite la tipul int, apoi se adun i dau un rezultat de tip int. Operatorul = ncearc s apoi s atribuie rezultatul int unei variabile short (c). Aceast atribuire este ns ilegal i genereaz o eroare de compilare. Codul va lucra corect n condi iile n care: ! c se declar de tipul (int c); ! se for eaz conversia valorii expresiei a+b la short n linia de atribuire prin: c=(short)(a+b); Promovarea la reali Asemenea tipurilor ntregi care sunt implicit int, n unele circumstan e, valorile atribuite tipurilor reale 42

sunt implicit de tipul double, cu excep ia cazului n care este explicit specificat tipul float. Linia urmtoare va cauza eroare la compilare deoarece se presupune c literalul 23.5 este de tip double, iar aceasta nu poate fi "nghesuit" ntr-o variabil de tipul float. float f1 = 23.5; Pentru ca linia s fie considerat corect se pot folosi urmtoarele variante: ! se adaug un F dup 23.5 pentru a spune compilatorului c valoarea este float: float f1 = 23.5F; ! se for eaz conversia lui 23.5 la tipul float prin: float f1 = (float)23.5;

43

Incrementarea s decrementarea -i
operatorul ++ crete cu 1 valoarea operandului operatorul -- scade cu 1 valoarea operandului exist dou forme de scriere: int i = 1, j; j = ++i; // prefixat: i se incrementeaz // apoi de atribuie valoarea lui i j = i++; // postfixat: se atribuie // valoarea lui i, apoi se // incrementeaz i

Una dintre necesit ile curente la nivelul aplica iilor este aceea de adunare sau de scdere a lui 1 din valoarea unei variabile. Rezultatul poate fi ob inut sprin folosirea operatorilor + i - dup cum urmeaz:
varsta = varsta + 1; zileconcediu = zileconcediu - 1;

Totui, incrementarea sau decrementarea sunt opera ii att de comune nct exist opratori unari (au un singur operand) specifici n acest scop: incrementarea (++) i decrementarea (--). Ei pot fi scrii n fa a (pre-increment, pre-decrement) sau dup (post-increment, post-decrement) o variabil. n forma prefixat opera ia (incrementarea sau decrementarea) este realizat nainte de orice alte calcule sau atribuiri. n forma prefixat, opera ia este realizat dup toate calculele sau eventualele atribuiri, astfel nct valoarea original este cea folosit n calcule i nu cea actualizat. Urmtorul tabel prezint operatorii de incrementare i decrementare: Operator ++ Rol pre-increment (++variabila) post-increment (variabila++) Exemplu int i = 5; int j = ++i; int i = 5; int j = i++; Comentarii i este 5 i j este 6. i este 5 i j este 5. Valoarea lui i este atribuit lui j nainte de incrementarea lui i. Dim acest motiv valoarea atribuit lui j este 5. i este 5 i j este 4.

--

pre-decrement (--variabila)

int i = 5; int j = --i;

44

Operator

Rol post-decrement (variabila--)

Exemplu int i = 5; int j = i--;

Comentarii i este 5 i j este 5. Valoarea lui i este atribuit lui j nainte de decrementarea lui i. Din acest motiv valoarea atribuit lui j este 5.

Iat n comtinuare cteva exemple clasice de utilzare a celor doi operatori:


int contor = 10; int a, b, c, d; a = contor++; b = contor; c = ++contor; d = contor; System.out.println(a + " " + b + " " + c +" " + d);

Rezultate:
10 11 12 12

Fie codul:
int a, b; a = 1; b = ++a * 7;

Exis ns o diferen subtil ntre forma prefixat i postfixat. Presupunnd c facem o incrementare (++), n forma prefixat (++a) incrementarea se face prima oar, apoi rezultaul expresiei este chiar operand mai departe n expresie. n cazul liniei de forma:
b = a++ * 7;

operatorul de incrementare are forma postfixat (a++). Aici, valoarea curent a lui a este valoarea expresiei, aceasta va mai fi stocat ntr-o loca ie temporar, ns aceast valoare nu va fi folosit n continuarea evalurii expresiei. Dup evaluarea ntregii expresii valoarea din loca ia temporar este crescut cu 1 i atribuit lui a. n concluzie, incrementarea i decrementarea sunt operatori unari (ac ioneaz asupra unui singur operand), au efecte secundare, iar rezultaul lor poate fi folosit n continuare n expresii. Rezlultatul poate fi valoarea operandului nainte (la formele post-fixate) sau dup (la formele pre-fixate) ce incrementarea sau decremantarea a avut loc.

45

Operatori relationali (de comparare)


ntorc rezultate de tipul boolean > >= < <= != == mai mare mai mare sau egal mai mic mai mic sau egal diferit egal

int i = 1, j=4; boolean rez; rez = (i == j); // rez ia valoarea false rez = (i < j); // rez ia valoarea true

Operatorii rela ionali, unori numi i i de comparare a expresiilor, se folosesc la testarea unor condi ii ntre dou expresii i ntorc un rezultat de tipul boolean. Sintaxa general a unei compara ii este: rezultat = expresie1 operatorrelational expresie2 Operator rela ional < <= > >= Denumire Mai mic Mai mic sau egal Mai mare Mai mare sau egal true dac expresie1 < expresie2 expresie1 <= expresie2 expresie1 > expresie2 expresie1 >= expresie2 false dac expresie1 >= expresie2 expresie1 > expresie2 expresie1 <= expresie2 expresie1 < expresie2

46

Operator rela ional == != Egal

Denumire

true dac expresie1 == expresie2 expresie1 != expresie2

false dac expresie1 != expresie2 expresie1 == expresie2

Inegal (Diferit)

Deseori, operatorii rela ionali se folosesc mpreun cu cei logici pentru a forma expresii logice complexe. n exemplul urmtor se testeaz dac valoarea stocat n variabila y este n domeniul [x, z] definit prin variabilele x i z.
public class OpRelationali { public static void main(String args[]) { double x = 11., y = 12., z = 13.; boolean indomeniu; indomeniu = x <= y && x <= z; System.out.println("este " + y + " in domeniul [ " + x +"," + " + indomeniu); } }

z + " ]?:

Rezultatul:
este 12.0 in domeniul [ 11.0,13.0 ]?: true

Una dintre aplica iile specifice ale operatorului == este evitarea erorii de mpr ire cu zero. Pentru aceasta expresia cu care urmeaz s se mpart este testat dac are valoarea 0, dac este 0 mpr irea este evitat, altfel mpr irea se poate realiza. Una dintre erorile cele mai comune la testarea valorii unei expresii cu constanta 0 este folosirea lui = n locul lui ==.

47

Operatori logici (booleeni)


Permit formarea de expresii logice pe baza rezultatelor operatorilor rela ionali cu && || ^ ! | fr scurtcircuitare & I SAU INCLUSIV SAU EXCLUSIV NU nume

int i=1, j=2, k=3; boolean rez=true; rez = (i<j) & (i==1); // false rez = !rez; // true

Operatorii logici, uneori numi i i booleeni, trebuie s aib operanzi booleeni (adic de tipul boolean) i genereaz rezultate booleene. Denumirea lor a fost dat n cinstea matematicianului britanic George Boole (1815-1864). El a pus la punct un sistem matematic ce opereaz valorile de adevr: true (adevrat), flase (fals) i func iile logice: AND (I), OR (SAU) i NOT (NU). Func iile logice au fost implementate, n Java, sub forma operatorilor logici care au scrierea && pentru AND , || pentru OR i ! pentru NOT. Operatorii logici se definesc prin tabele de adevr. Acestea reprezint toate combina iile posibile ale operanzilor mpreun cu rezultatele corespondente operatorului logic. Expresiile care con in operatori logici se evalueaz cu scurtcircuitare. Evaluarea se face de la stnga la dreapta (aceast ordine de evaluare este garantat numai pentru operatorii logici) i imediat ce valoarea expresiei logice devine cunoscut evaluarea celorla i operanzi se termin. && i || permit utilizarea evalurii cu scurtcircuitare, dac expresia din stnga operatorului a a determinat deja valoarea ntregii expresii logice, expresia din dreapta lui nu se mai evalueaz. Dac n e1 && e2, e1 ia valoarea false, e2 nu se mai evalueaz deoarece oricum rezultatul va fi false. Dac n e1 || e2, e1 ia valoarea true, e2 nu se mai evalueaz deoarece rezultatul este oricum true. Exist i operatori logici care se evalueaz fr scurtcircuitare. Ei au o scriere diferit, astfel pentru I se scrie & iar pentru SAU se scrie |. Utilizarea lor se face n situa ii n care scurtcircuitarea poate produce rezultate ciudate, de exemplu fie expresia func1() && func2(), dac func ia func1() va ntoarce rezultatul false func ia func2() nu va mai fi apelat. Vor exista, deci, cazuri n care 48

func2() nu va fi apelat, iar dac aceasta face ceva semnificativ n cod lipsa apelului va duce la rezultate eronare. Tabel de adevr pentru
&& false true false false fals SI true false true

Tabel de adev|r pentru


|| false true false false true

SA U true true true

Tabel de adev|r pentru SA U


^ false true false false true

EXCLUSIV

true true false

49

Operatori pe biti
Operanzii pot fi de orice tip de ntreg i au ca rezultat o valoarea ntreag Opereaz cu decompunerea binar a operanzilor Operator ~ & | ^ >> >>> << I pe bi i SAU (INCLUSIV) pe bi i SAU EXCLUSIV pe bi i deplasarea la dreapta deplasarea la dreapta cu completare cu 0 deplasare la stnga Denumire NU unar pe bi i

n calculatoare, se numete bit (binary digit), cea mai mic unitate de informa ie a crei valoare se poate stoca. Operatorii pe bi i (bitwise) trateaz operanzii sub forma unui ir de bi i i nu sub forma unui singure valori n baza 10. irurile se ob ine prin transcrierea numerelor din baza 10 n baza 2. Operatorii pe bit i ac ioneaz asupra celui de al N-elea bit al operanzilor folosind o func ie boolean pentru a genera un rezultat la nivelul aceluiai bit N. De exemplu dac dorim s facem & (I) pe bi i ntre valoarea 14 i 7 trebuie s transformm operanzii n iruri binare, astfel 14 n baza 10, adic 1@101 +4@100 , devine 1110 n baza 2, adic 1@23+1@22+1@21+0@20, iar 7 n baza 10 devine 0111 n baza 2, apoi ntre bi ii corespunztori aceleiai pozi ii se face & pe bi i dup cum se vede n tabelul urmtor. Valoarea n baza 10 Valorile bitului N (baza 2)
Bit "3" Bit "2" Bit "1" Bit "0"

23 14(10) 7(10) 1 0 1 1

22 1 1

21

20 0(2) 1(2)

50

Valoarea n baza 10

Valorile bitului N (baza 2)


Bit "3" Bit "2" Bit "1" Bit "0"

23 14(10) & 7(10) 0 1

22 1

21

20 0(2)

14(10) & 7(10) d, n final, valoarea 6(10). Asemenea operatorilor logici i cei pe bi i se definesc cu ajutorul tabelelor de adevr. Tabelele de adevr pentru operatorii & , | , ^ i ~: a 0 0 1 1 b 0 1 0 1 a&b 0 0 0 1 a|b 0 1 1 1 a^b 0 1 1 0 ~a 1 1 0 0

I pe bi i, adic operatorul &, produce 1 numai dac ambii operanzi sunt 1. SAU pe bi i, adic operatorul |, produce 0 doar dac ambii bi i sunt 0. SAU EXCLUSIV pe bi i, adic operatorul ^, produce 1 dac exact unul dintre operanzi este 1. NU pe bi i, adic operatorul ~, inverseaz to ii bi ii operandului. Imversarea nsemn c orice bit 1 trece n 0 i invers. Deplasarea la stnga, adic operatorul <<, are forma valoare << numar i deplaseaz la stnga to i bi ii lui valoare cu un numr de pozi ii (puteri ale lui 2) specificat n numar. Pentru fiecare pozi ie deplasat bitul cel mai semnificativ se pierde, iar bitul cel mai pu in semnificativ se completeaz cu valoarea 0. Deplasarea la stnga cu o pozi ie corespunde nmul irii cu 2 a lui valoare. Deplasarea la dreapta, adic operatorul >>, are forma valoare >> numar i deplaseaz la dreapta to i bi ii lui valoare cu un numr de pozi ii (puteri ale lui 2) specificat n numar. La fiecare deplasarea la dreapta cu o pozi ie bi ul cel mai pu in semnificativ se pierde, iar noua valoarea care se ob ine mpr irea la 2 a valorii ini iale (restul se pierde). Bitul cel mai semnificativ, care stocheaz semnul numrului, n urma deplasrii la dreapta trece i el la dreapta, iar pozi ia pe care a fost se va completa cu valoarea naintea de deplasare, adic semnul numrului se pstreaz. Deplasarea la dreapta fr semn, adic operatorul >>>, are forma valoare >>> numar i deplaseaz la dreapta to i bi ii lui valoare cu un numr de pozi ii (puteri ale lui 2) specificat n numar fr a pstra ns semnul valorii. n locul valorii se semn care corespunde celui mai semnificativ bit se pune valoarea 0. n Java toate tipurile ntregi, cu excep ia lui char, sunt cu semn. Aceasta nseamn c ele pot reprezenta att valori negative ct i pozitive. Codificarea numerelor ntregi cu semn se face prin 51

complement fa de 2, adic numerele negative se reprezint prin inversarea valorilor bi ilor (adic 0 trece n 1 i 1 trece n 0), dup care se adun 1 la rezultat. Presupunnd c se lucreaz cu valori de tipul byte (adic pe 8 bi i), valoarea -14(10) se codific prin 11110010(2). Se pleac de la 14 n baza 10, care n binar este 00001110, apoi se inverseaz bi ii i se ob ine 11110001, la aceast valoare se adun 1 i rezult 11110010. Pentru a decodifica un numr negativ se vor inversa bi ii lui, apoi la valoarea ob inut se adun 1. Pentru -14(10), care n binar este 11110010, trebuie s re inem semnul "-", apoi, dup inversarea bi ilor se ob ine 00001101, adic +13(10), dup adunarea lui 1 vom avea 00001110, adic valoarea numeric de +14. Motivul pentru care Java folosete aceast codificare este problema reprezentrii lui 0. Valoarea 0, reprezentat prin 0000000, n urma aplicrii procedurii de complementare d 11111111. Aceasta este o valoare negativ a lui 0 care n aritmetica numerelor ntregi creeaz probleme. Pentru evitarea acestora se adun 1 la valoarea ob inut, caz n care se ob ine 100000000. Bitul de 1 ob inut ns nu mai poate stocat ntr-un byte deoarece el are spa iu numai pentru 8 bi i, iar rezultatul are 9 bi i, rezultatul final fiind primii 8 bi i, adic 00000000. Deoarece Java folosete complementul fa de 2 pentru reprezentarea numerelor negative unii operatori pe bi i produc rezultate ciudate. Cel mai semnificativ bit al reprezentrii (bitul corespunztori puterii celei mai mari ale lui 2) este numit i bit de semn deoarece el definete semnul valorii numerice (pentru 0 - numrul este pozitiv, iar pentr 1 numrul este negativ). Opera iile pe bi i care l modific sunt cele generatoare de probleme.
public class opBiti { public static void main(String args[]) { int a = 14, b = 4; int c; c = a & b; System.out.println(a + " & " + b + " = " + c); System.out.println(binar(a,32) + " & "); System.out.println(binar(b,32)); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n"); c = a | b; System.out.println(a + " | " + b + " = " + c); System.out.println(binar(a,32) + " | "); System.out.println(binar(b,32)); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n"); c = a ^ b; System.out.println(a + " ^ " + b + " = " + c); System.out.println(binar(a,32) + " ^ "); System.out.println(binar(b,32)); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n");

c = ~a; System.out.println("~" + a + " = " + c); System.out.println( binar(a,32) + " ~ "); System.out.println("--------------------------------"); System.out.println( binar(c,32) + "\n"); c = a << 2; System.out.println( a + " << 2 = " + c); System.out.println( binar(a,32) + " << 2 "); System.out.println("--------------------------------"); System.out.println( binar(c,32) + "\n"); c = a >> 2;

52

System.out.println( a + " >> 2 = " + c); System.out.println( binar(a,32) + " >> 2 "); System.out.println("--------------------------------"); System.out.println( binar(c,32) + "\n");

c = a >>> 2; System.out.println( a + " >>> 2 = " + c); System.out.println( binar(a,32) + " >>> 2"); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n"); a = -14; c = a >> 2; System.out.println( a + " >> 2 = " + c); System.out.println( binar(a,32) + " >> 2"); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n"); c = a >>> 2; System.out.println( a + " >>> 2 = " + c); System.out.println( binar(a,32) + " >>> 2"); System.out.println("--------------------------------"); System.out.println(binar(c,32) + "\n"); } public static String binar(int x, int n) { int c = 0; StringBuffer BufBinar = new StringBuffer(""); while (x != 0 && c < n) { BufBinar.append(((x % 2 == 0) ? "0" : "1")); x >>>= 1; ++c; } while (c++ < n) BufBinar.append("0"); BufBinar.reverse(); return BufBinar.toString(); } }

Rezultate:
14 & 4 = 4 00000000000000000000000000001110 & 00000000000000000000000000000100 -------------------------------00000000000000000000000000000100 14 | 4 = 14 00000000000000000000000000001110 | 00000000000000000000000000000100 -------------------------------00000000000000000000000000001110 14 ^ 4 = 10 00000000000000000000000000001110 ^

53

00000000000000000000000000000100 -------------------------------00000000000000000000000000001010 ~14 = -15 00000000000000000000000000001110 ~ -------------------------------11111111111111111111111111110001 14 << 2 = 56 00000000000000000000000000001110 << 2 -------------------------------00000000000000000000000000111000 14 >> 2 = 3 00000000000000000000000000001110 >> 2 -------------------------------00000000000000000000000000000011 14 >>> 2 = 3 00000000000000000000000000001110 >>> 2 -------------------------------00000000000000000000000000000011 -14 >> 2 = -4 11111111111111111111111111110010 >> 2 -------------------------------11111111111111111111111111111100 -14 >>> 2 = 1073741820 11111111111111111111111111110010 >>> 2 -------------------------------00111111111111111111111111111100

54

Atribuirea compusa 7
Operatorul de atribuire poate fi combinat cu orice operator aritmetic binar astfel nct n loc de:
(expresie1) = (expresie1) op (expresie2)

se poate scrie :
expresie1 op = expresie2

double total = 0., suma =1., procent=0.5; total = total + suma; //1. total+=suma; //2. total*=procent+1.5; //4.

Java dispune de o familie ntreag de operatori ce permit scrierea scurtat a unor forme de expresii. Ini ial, aceti operatori facilitau compilarea mai eficient a codului. Fie secven a de cod:
int a = int b = b = b + b += a; 1; 2; a; //adunare traditionala //adunare compusa

n varianta "tradi ional" operatorul de atribuire va face evaluarea expresiei din dreapta lui, rezultatul va fi stocat ntr-o zon de memorie temporar, apoi va fi copiat n loca ia stnga egalului. Prin scrierea lui += n locul lui = compilatorul va putea evita faza de manipulare prin zona temporar, rezultatul fiind depus direct n b. Azi, majoritatea compilatoarelor optimizeaz deja aceast procedur ineficient din Java adic, dei noi scriem b = b + a, compilatorul va genera codul pentru b += a. Scrierea poate fi utilizat cu to i operatorii binari. Toat aceast familie de operatori de atribuire va produce i efecte secundare deoarece genereaz un rezultat dar i modific valoarea opreandului din stnga. Conform celor spuse se pot scrie urmtoatele expresii:
b b b b b += -= *= /= %= a; a; a; a; a; //b //b //b //b //b = = = = = b b b b b + * / % a a a a a

55

Prioritatea operatorilor Java


Prioritatea determin ordinea de rezolvare a operatorilor Dac ntr-o expresie avem mai mul i operatori consecutivi de aceeai prioritate, atunci se aplic regula asociativita ii Utilizarea parantezelor rotunde redefinete priorit ile
Prioritate Simbol ++ + - ~ ! (tip) */% +-+ << >> >>> < > <= >=instanceof == != & ^ | && || ?: = op=
operatori unari

Asociativitate de la dreapta la stnga (DS) de la stnga la dreapta (SD) SD SD SD SD SD SD SD SD SD DS DS

1 2 3 4 5 6 7 8 9 10 11 12

nmul ire mpr ire rest

adunare scdere concatenare deplasri (>>> completare cu 0) rela ionali

Egalitate I logic / pe bi i SAU EXCLUSIV logic / pe bi i SAU logic / pe bi i I logic SAU logic Operatorul condi ional operatorii de atribuire

13

n Java orice expresie are un tip (primitiv sau referin-a) determinat n faza de compilare. n cazul unor t expresii complexe ntr-o singura linie de program, Java folosete un grup de reguli numite "de 56

preceden " pentru a determina ordinea de rezolvare a operatorilor. Aceste reguli asigur consisten a opera iilor aritmetice n cadrul programelor Java. La nivel principial, prelucrarea sau rezolvarea operatorilor se face n urmtoarea ordine: ! ( ): operatorii din interiorul unor perechi de paranteze; dac perechi de paranteze sunt cuprinse n alte perechi de paranteze, evaluarea pleac de la perechea cea mai interioar; ! ++, : operatorii de incrementare i decrementare; ! *, /: operatorii de multiplicare (nmul ire) i diviziune (mpr ire), evalua i de la stnga la dreapta; ! +, -: operatorii de adunare i scdere, evalua i de la stnga la dreapta. n tabelul anterior, preceden a cea mai mare este notat cu 1, iar cea mai sczut cu 13. n cazul n care expresiile con in operatori aritmetici, care apar altura i i au aceeai preceden , evaluarea lor se face conform regulilor de asociativitate, respectiv de la stnga la dreapta. Fie expresia: c = 23 - 6 * 4 / 3 + 12 - 31; Valoarea atribuit lui c depinde de ordinea n care vom prelucra operatorii expresiei. De exemplu, dac prelucrarea se face strict de la snga la dreapta, fr a ine cont de preceden a operatorilor, expresia va avea valoarea 3.6(6). Valorea real ns a expresiei n Java este de -4. Pentru a indica modul de aplicare al regulilor de preceden n cazul acestei expresii aceasta se va rescrie expresia folosind parantezele: c = 23 - ((6 * 4) / 3) + 12 - 31; Orice expresie este evaluat automat pe baza regulilor de preceden . Dac acestea nu corespund ordinii de evaluare pe care o dorim este obligatorie folosirea prantezelor rotunde. Iat un exemplu n continuare: c = (((23 - 6) * 4) / 3) + 12 - 31; se va evalua astfel: c c c c c = = = = = ((17 * 4) / 3) + 12 - 31; (68 / 3) + 12 - 31; 22.6(6) + 12 - 31; 34.6(6) - 31; 3.6(6); //3.6(6), unde (6) este perioada

Regulile de preceden se aplic nu numai n cazul operatorilor aritmetici, ci pentru to i operatorii Java. Dac o expresie are mai mul i operatori consecutivi de aceeai preceden se va aplica regula asociativit ii pentru determinarea ordinii de evaluare.
public class Operatori { public static void main(String args[]) { int a, b, c, d, e, f, g; double da, db, dc, dd, de; boolean ba, bb, bc, bd; System.out.println("Aritmetica cu int");

57

a=1+1; b=a*3; c=b/4; d=c-a; e=-d; System.out.println("a System.out.println("b System.out.println("c System.out.println("d System.out.println("e

= = = = =

" " " " "

+ + + + +

a); b); c); d); e);

System.out.println("\nAritmetica cu double"); da=1+1; db=da*3; dc=db/4; dd=dc-da; de=-dd; System.out.println("da = " + da); System.out.println("db = " + db); System.out.println("dc = " + dc); System.out.println("dd = " + dd); System.out.println("de = " + de); System.out.println("\nAritmetica cu modulo"); a=42; da=42.65; System.out.println(a + "%10 = " + a%10); System.out.println(da + "%10 = " + da%10); System.out.println("\nConversii"); System.out.println("(int)"+ da + " = "+ (int)da); //fortarea conversiei de la doubela la int System.out.println("\nOperatori logici"); ba = false; bb = true; bc = da > db; //? 42.5 > 6 = true bd = ba && bc || bc; System.out.println(ba + " && " + bb + " || " +bc + " = " + bd); /* bd = ba & 1/(e+d) < 3; //NU se face scurtcircuitare pt operandul 2 * aplicatia va crapa */ bd = ba && 1/(e+d) < 3; //se face scurtcircuitare pt operandul 2 System.out.println(ba + " && 1/(" + e + d + ") < 3 = " + bd);

System.out.println("\nOperatori pe biti"); a = 3; // 0011 in binar b = 6; // 0110 in binar c = a | b; d = a & b; e = a ^ b; f = (~a & b) | (a & ~b); g = ~a & 0x0f; System.out.println("a = " +Integer.toBinaryString(a)); //11 System.out.println("b = " +Integer.toBinaryString(b)); //110 System.out.println("c = " +Integer.toBinaryString(c)); //111 System.out.println("d = " +Integer.toBinaryString(d)); //10 System.out.println("e = " +Integer.toBinaryString(e)); //101 System.out.println("f = " +Integer.toBinaryString(f)); //101 System.out.println("g = " +Integer.toBinaryString(g)); //1100 System.out.println(Integer.toBinaryString(a)+" << Integer.toBinaryString(a << 2)); System.out.println("\nFunctii matematice si constante");

="

58

System.out.println("sqrt(" + a + ") = " + Math.sqrt(a)); //radical de ordinul 2 System.out.println("sin(" + a + ") = " + Math.sin(a)); //sinus System.out.println("cos(" + a + ") = " + Math.cos(a)); //cosinus System.out.println("tan(" + a + ") = " + Math.tan(a)); //tangenta System.out.println("atan(" + a + ") = " + Math.atan(a)); //arctangenta System.out.println("exp(" + a + ") = " + Math.exp(a)); //e la a System.out.println("log(" + a + ") = " + Math.log(a)); //log natural System.out.println("pow(" + a + ",3) = " + Math.pow(a,3)); //a la 3 System.out.println("PI = " + Math.PI); //PI System.out.println("E = " + Math.E); //E } }

Rezultate:
Aritmetica cu int a = 2 b = 6 c = 1 d = -1 e = 1 Aritmetica cu double da = 2.0 db = 6.0 dc = 1.5 dd = -0.5 de = 0.5 Aritmetica cu modulo 42%10 = 2 42.65%10 = 2.6499999999999986 Conversii (int)42.65 = 42 Operatori logici false && true || true = true false && 1/(1-1) < 3 = false Operatori pe biti a = 11 b = 110 c = 111 d = 10 e = 101 f = 101 g = 1100 11 << 2 =1100 Functii matematice si constante sqrt(3) = 1.7320508075688772 sin(3) = 0.1411200080598672 cos(3) = -0.9899924966004454 tan(3) = -0.1425465430742778

59

atan(3) = 1.2490457723982544 exp(3) = 20.085536923187668 log(3) = 1.0986122886681096 pow(3,3) = 27.0 PI = 3.141592653589793 E = 2.718281828459045

60

Siruri de caractere n Java ir de caractere = o secven a de caractere de lungime arbitrar Java NU are implementat un tip primitiv ir de caractere String clas Java predefinit n pachetul java.lang.String pentru manipularea irurilor de caractere

String s; //declaratia unei variabile ir String sal = Salut; //decl. cu ini ial. Operatori: atribuirea (=) concatenarea (+) atribuirea compus (+=).

public class Siruri { public static void main(String[] args) { String s1, s2; String s3 = "Vasile"; //Vasile este un literal s2 ="Ion"; //Ion este un literal //concatenare s1 = s2 + s2; //lungimea unui sir de caractere System.out.println("Lungimea sirului: " +s1 +" este de " +s1.length()+" caractere"); //subsir System.out.println("Un subsir: " + s1.substring(0,3)); //editarea sirurilor s1 = s1.substring(0,3) + "-" + s1.substring(3,s1.length()); System.out.println("Editarea: " + s1); //testarea egalitatii sirurilor System.out.println("s1: " + s1+"\ns2: "+s2); System.out.println("Egalitatea lui s1 cu s2: " + s1.equals(s2)); System.out.println("Egalitatea lui Ion cu s2: " + "Ion".equals(s2)); /* comparatia sirurilor

61

* intoarce < 0 daca s1 vine inainte de s2 in dictionar * intoarce 0 daca s1 si s2 sunt egale * intoarce > 0 daca s1 este dupa s2 in dictionar */ System.out.println("Compararea lui s1 cu s2: " + s1.compareTo(s2)); } }

Rezultate:
Lungimea sirului: IonIon este de 6 caractere Un subsir: Ion Editarea: Ion-Ion s1: Ion-Ion s2: Ion Egalitatea lui s1 cu s2: false Egalitatea lui Ion cu s2: true Compararea lui s1 cu s2: 4

Clasa String are mai bine de 50 de metode. Inspectarea acestora se face cel mai simplu utiliznd documenta ia JDK.

Compilatorul Java aloca spa iu pentru literalii ir n memorie iar operatorul de atribuire va stoca adresa respectiv n variabila ir. Din acest motiv, testarea egalit ii a dou iruri nu se poate face cu operatorul 62

==, deoarece el va compara adresele la ca sunt stocate cele dou iruri n RAM i nu con inutul respectivelor loca ii. Clasa String nu are o metod pentru modificarea unui caracter al irului, se zice c obiectele clasei ir sunt imuabile (immutable) - stabile, de neschimbat. Pentru modficarea con inutului unei variabile ir trebuie s crem un ir nou.

63

4
Instructiunile limbajului Java -

64

Rularea programelor
Programele sunt alctuite din instruc iuni. Implicit, instruc iunile se ruleaz secven ial. Exist situa ii n care se fac devieri de la rularea secven ial: ! Decizia sau ramificarea: if, switch ! Ciclul: do, for, while ! Saltul sau transferul: break, continue, apel de metod
O aplica ie Java este format din instruc iuni. Procesul prin care JVM ndeplinete o instruc iune se numete rulare sau execu ie. n Java terminarea rulrii unei instruc iuni se poate face cu succes, cu excep ie sau cu eroare. O instruc iune este format din una sau mai multe expresii care se ruleaz ca o singur ac iune. De exemplu x = 5 este expresie, n timp ce x = 5; este deja o instruc iune. O expresie terminat n caraterul ; se numete instruc iune, iar caracterul ; se numete terminator de instruc iune. Tot i ns truc iuni sunt: x = 5.3*(4.1/Math.cos(0.2*y)); res pect i v System.out.println(x);. Instruc iuni sunt inclusiv declara iile simple sau multiple, cu sau fr ini ializare. Instruc iunile vor fi plasate n clase pentru alctuirea aplica iei func ionale. Implicit, aplica ia Java ncepe din metoda main, iar instruc iunile se ruleaz secven ial, adic de sus n jos, n ordinea scrierii lor n aplica ie pna la terminarrea rularii tutror instruc iunilor. n situa ia unei aplica ii complexe rularea poate devia de la prelucrarea secven ial astfel, exist posibilitatea ramificrii la nivelul rulrii unor por iuni de cod pe baza unor condi ii (if, switch), repetarea unui grup de instruc iuni atnt timp ct o expresie de control este adevrat (while, do while, for), saltul de la o instruc ine la o alta n program (break, continue).

65

SECVENTA Secven a este alctuit din: ! instrunc iuni simple ! blocuri numite i instruc iuni compuse Instruc iune simpl: expresie; Blocul grup de instrunc iuni cuprinse ntre acolade { }

Instrunc iunea simpl Instruc iune simpl este orice exprsie terminat n caracterul ;, iat cteva exemple: int x = 1, y = 2 , z; z = x+ y; x=y++; z++; Instruc iunea vid Instruc-iunea vida consta ntr-un ;. Ea nu are efect la nivelul execu-iei instruc-iunilor aplica- iei. De t t t t exemplu, daca consideram instruc-iunea simpl expresie;iar partea de expresie lipses se t -te, ob-ine o instruc-iune vida. n practica, se foloseste pentru a da posibilitatea ca aplica-ia sa poata fie t t t completata, de exemplu, cu instruc-iuni n locuri nu eram siguri ca va fi nevoie de acestea. Un alt t avantaj este cel de evitare al unor erori datorate scrierii "mecanice" a lui ;, fie secven-a de cod: t if (x < 0) { x = -x; }; Caracterul ; de dupa } este legal, nsa compilatorul l considera o instruc-iune vida Un alt motiv al t . instruc-iunii vide este situa-ia n care dorim sa reprezenta n aplica-ie, starea de "fa mimic". t t m, t Instrunc iunea compus sau blocul Mai multe instruc iuni pot fi grupate cu ajutorul acoladelor ntr-o instruc iune compus, numit i bloc. { int x = 1; System.our.println(x = + x); ++x; } Instruc iunea compus este este sintactic echivalent cu instruc iunea simpl. Nu se scrie ; dup acolada de nchidere. Orice variabil declarat ntr-un bloc are presisten a limitat la interiorul blocului n care s-a declarat. n afara blocului variabil respectiv nceteaz s mai existe.

66

DECIZIA - if
! if se folosete pentru programarea unei decizii i are forma general: if (expr_boleana) instructiune1 [else instructiune2] ! ! expr_boleana trebuie s fie scris ntre paranteze rotunde i s aib un rezultat boolean dac este nevoie de mai multe instruc iuni trebuie folosit instruc iunea compus n locul celei simple

Instruc iunea if Permite ramificarea rulrii n aplica ie pe baza valorii luate de expr_boleana. Expresia bolean determin care dintre ramuri este rulat dup cu urmeaz: ! dac valoarea expresiei boleene este true se ruleaz instruc iune simpl instructiune1 ! dac valoarea expresiei boleene este false se ruleaz instruc iunea simpl instructiune2 Por iune cu else este op ional, dac este omis atunci nu se va rula nimic n situa ia n care expr_boleana ia valoarea false Dac se dorete ca instruc unea if s aib efect asupra unui grup de instruc iuni acestea trebuie puse nt-un bloc. Blocul ne permite ca n locul unei instruc iuni simple Java s avem voie s scriem un grup de instruc iuni Java. Exemplu:
if (i>0) System.out.println(i -= + i); if (i>0) { System.out.println(i -= + i); i=i%2; }

67

if-uri imbricate
! apar atunci cnd una dintre instruc iunile simple din if este la rndul ei un if if (expr_boleana1) if (expr_bolenan2) instructiune1 [else instructiune2] [else instructiune3]
Dac este cazul instruc iunile if pot fi imbricate (cuprinse una n alta). Deoarece partea de else este op ional se poate ajunge la situa ia n care pune problema apartene ei lui else .

if (expr_boleana1) if (expr_bolenan2) instructiune1 else instructiune3


Regula este aceea c else se asociaz cu cel mai apropiat if . Dac acest asociere implicit nu este convenabil atunci se pot folosi acoladele pentru a o modifica. Cnd trebuie s luam o singur decizie dintre mai multe avem de a face cu o multidecizie. Aceasta se poate programa cu o secven de if-uri dup cum urmeaz. Dac expr_boleanai este true atunci se ruleaz instructiunei (i = 1, 2, 3), altfel se ajunge la instructiune4.

secventa A if (expr_boleana1) instructiune1 else if (expr_boleana2) instructiune2 else if (expr_boleana3) instructiune3 else instructiune4 secventa B
68

Operatorul conditional ? : ! ! este o alternativ la if else este ternar (are 3 operanzi) avnd forma: expr_boleana ? expr1 : expr2 ! dac expr_boleana este true ia valoarea lui expr1, altfel pe a lui expr2

Cei trei operanzi formeaz o expresie condi ional. Primul operand (expr_boleana) trebuie s fie o expresie bolean (de exemplu o condi ie), al doilea operand (expr1) este valoarea pe care expresia condi ional o ntoarce dac expresia bolean ia valoarea true. Al treilea operand (expr2) este valoarea expresiei condi ionale dac expresia bolean ia valoarea false. Fie linia de cod: System.out.println(nota >=5 ? Admis. : Respins.); Dac valoarea din variabila nota este mai mare sau egal cu 5, atunci expresia condi ional ia valoarea Admis. , atfle ia valoarea Respins.. O aplica ie este determinarea minimului dintre dou valori: int a = 5, b =3; int minim; minim = (a > b) ? b : a; System.out.println(Minimul este: + minim);

69

Erori specifice lui if


int a = 3, b = 2; if (a > 0) if (b < a) System.out.println(b < a); else System.out.println(a < 0); int a = 3; if (a = 5) System.out.println(a este 5); int a = 3; if (a%2 == 1) ; System.out.println(a este impar);
Eroarea Asocierea dintre if-uri i else este greit, secven a de cod fiind echivalent cu:

adic else-ul ine de al doilea if. Pentru ca acesta s in de primul trebuie s folosim acoladele astfel:
if (a > 0) { if (b < a) System.out.println(b < a); } else System.out.println(a < 0);

if (a > 0) { if (b < a) System.out.println(b < a); else System.out.println(a < 0); }

Eroarea Aici n locul opreratorului de testare a egalit ii (= =) s-a folosit cel de atribuire (=). Java va da eroare la compilare deoarece expresia de testat trebuie s fie bolean. Eroarea S-a pus caracterul ; dup testul din if. Compilatorul nu d eroare deoarece trateaz if-ul avnd drept corp o instruc iune vid.

70

DECIZIA - switch
! switch se folosete pentru programarea unei multidecizii, are forma general: switch (expr_intreaga) { case expr_const1: instructiune1 break; case expr_const2: instructiune2 break; [default:] instructiune3 break;] }
Instruc iunea de decizie switch se utilizeaz atunci cnd avem de rulat o secven dintre mai multe posibile. Valoarea expresiei de test (expr_intreaga) trebuie s fie de tipurile: byte, char, short sau int. Tipurile long, float, double sau alte tipuri de obiecte (String etc.) sunt interzise. Valoarea expresiei de test se compar, secven ial, cu expresiile constante (expr_consti) care eticheteaz instruc iunile instructiunei. Dac s-a gsit egalitate rularea ncepe de la instruc iunea urmtoare (cea care vine imediat dup cele : ale lui case) i ine pn la ntlnirea unui break, moment n care rularea se con inu cu secventa B. Dac nu se gsete nici o egalitate rularea va continua cu instruc iunile urmtoare etichetei default. Eticheta default este op ional, dac aceasta lipsete switch-ul nu va face nimic n lipsa gsirii unei egalit i. Etichetele trebuie s fie expresii constante (au valori cunoscute n momentul compilrii). n acest scop se pot folosi literali sau variabile final.

71

import java.util.*; public class Switch { public static void main(String[] args) { Scanner intrare = new Scanner(System.in); System.out.print("Selecteaza optiunea (1,2,...,7): "); int optiune = intrare.nextInt(); switch (optiune) { case 1: case 2: case 3: case 4: case 5: System.out.println("La munca cu tine"); break; case 6: System.out.println("La chef cu tine"); break; case 7: System.out.println("Relaxeaza-te sau revino-ti!"); break; default: System.out.println("Aici, pe Terra, avem numai 7 zile!"); break; } //terminare switch } //terminare main } // terminare clasa Switch

Rezultate:
Selecteaza optiunea (1,2,...,7): 5 La munca cu tine

72

CICLAREA n Java
! 3 instruc iuni de ciclare: while do while for toate ciclurile au 4 por iuni: # ini ializarea # test de continuare # corpul # itera ia

Denumirea de ciclare sau itera ie se folosete pentru a descrie rularea repetat a unui grup (bloc) de instruc iuni pn cnd o anumit condi ie ajunge s fie ndeplinit. Ciclarea este caracterizat printr-o mul ime de condi ii ini iale, o condi e de terminare i un pas de iterare. Ini ializarea Const n atribuirea de valori ini iale unor variabile ce sunt modificate prin iterare i testate pentru continuarea corpului ciclului. Teste de continuarea Este o valoarea de tipul boolean ce determin reluarea rulrii instruc inilor din corpul ciclului. Dac expresia de terminare se evalueaz la valoarea true corpul se reia, dac este false reluarea se termin i se continu cu secven a urmtoare ciclului. Corpul Este o singur instruc iune simpl sau una compus care va fi reluat pn la ndeplinirea condi iilor de terminare respectiv atunci cnd expresia de test ia valoarea false. Iterarea Reprezint codul ce se ruleaz dup rularea corpului dar nainte de realizarea testuui de realuare a ciclului. Se folosete pentru controlul rulrii instruc iunii de ciclare. Trebuie s realizeze avansul ctre condi ia de terminare a ciclului.

73

CICLUL while
! cel mai simplu ciclul Java, are forma:
while (conditie) instructiune ! conditie se scrie ntre paranteze corpul este format dintr-o instructiune simpl sau un

bloc
int i = 5; //initializare while (i >= 0) //test System.out.println("i: " + i--); while (i < 5) { System.out.println("i: " + i); ++i; }
i:5 i:4 i:3 i:2 i:1 i:0 i:-1 i:0 i:1 i:2 i:3 i:4

Ciclul while reia rularea lui instructiune att timp ct conditie are valorea true. Corpul lui while nu se va rula dac conditie este false. Dac conditie are valoarea false de la nceput, corpul ciclului nu se va rula.

74

Aplicatia 1 - while Cunoscndu-se valoarea depunerii ini iale i rata anual se cere s se determine numrul de luni necesar pentru a cumula n cont o sum impus de bani. Dobnda se calculeaz lunar i se cumuleaz (se adun) cu valoarea din luna anterioar din cont. Spa iul datelor Estre mul imea variabilelor foloite pentru reprezentarea i solu ionarea cerin ei impuse. Numele variabilei depunere dobandaan scop cont luni Semnifica ie valoarea depunerii ini iale valoarea dobnazii anuale valoarea ce se dorete a fi atins valoarea curent n cont rezultat: numrul de luni necesar atingeriui scopului Tipul double double double double int Valoarea ini ial dat de intrare data de intrare dat de intrare depunere 0

Spa iul transformrilor Este dat de mul imea opera iunilor efectuate asupra spa iunlui de date pentru gsirea solu iei. Datele de intrare se modific ca urmare a citirii valorilor corepunztoare de la tastatur. Calculul dobnzii pe lun: dobnda pe lun = dobandaan / 100 / 12 Se mparte cu 100 deoarece dobnda pe an se d n procente i cu 12 deoarece anul are 12 luni. Dac suma existen n cont se nmul ete cu aceast valoare se ob ine ctigul lunar pe suma total din cont. Cumularea lunar a dobnzii: cont = cont + cont * dobnda pe lun Valoarea nou a contului va fi cea veche la care se mai adaug ctigul ca urmre a dobnzii lunare. Actualizarea lunii luni = luni + 1 Variabila se actualizreaz prin cretere cu o unitate pn cnd scopul nu s-a atins. Atingerea scopului duce la afiarea valorii acestei variabile i la terminarea aplica iei Descrierea n cuvinte a solu iei: Citete scop Citete depunere 75

Citete dobandaan in % // ini ializri cont = depunere; luni = 0; // actualizarea contului pe luna // pana cand scopul este atins Repet ct timp (cont <= scop) { dobandalunara = cont * dobandaan / 100 / 12; //calcul dobanda lunara cont = cont + dobandalunara; //cumulare dabanda lunara luni = luni + 1 //crestere luna } //afisare rezultat(e) Afisare luni Codul java:
import java.util.*; public class Dobanda { public static void main(String[] args) { // citirea datelor de intrare Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); double scop = in.nextDouble(); System.out.print("Care e suma initiala? "); double depunere = in.nextDouble(); System.out.print("Dobanda anuala %: "); double dobandaan = in.nextDouble(); // initializare double cont = depunere; int luni = 0; // actualizarea contului pe luna // pana cand scopul este atins while (cont <= scop) { // dobanda pe luna se calculeaza din cont double dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; } // afisarea rezultatului System.out.println("Ajungi la suma dorita in " + luni + " luni."); } }

Rezultate:
De ce suma ai nevoie? 10000 Care e suma initiala? 7800 Dobanda anuala %: 5 Ajungi la suma dorita in 60 luni.

76

Aplicatia 2 - while S se calculeze i s se afieze media aritmetic a unei clase formate din 5 elevi. Media fiecrui elev este un numr ntreg care se citete de la tastatur. Spa iul datelor Numele variabilei
notaElev

Semnifica ie media unui elev numr elevii pentru care s-au citi mediile suma mediilor elevilor citite de la tastatur rezultat: media aritmetic a clasei nota introdus de la tastatur sub form unui ir de caractere

Tipul
int

Valoarea ini ial data de intrare ob inut prin conversie 1 0

contorElev total mediaClasa sirNota

int int double String

data de intrare

Spa iul transformrilor Totalizarea mediilor individuale total = total + notaElev Suma mediilor individuale presupune o adunare repetat ce se termin atunci cnd s-au prelucrat toti elevii. Aceast sum se realizeaz pe msur ce se citete cte o medie de elev. Valoarea nou a totalului este cea anterioar (veche) la care se adun ultima medie citit. Descrierea n cuvinte a solu iei:
//initializari total = 0; contorElev = 1; //totalul mediilor individuale Repet ct timp (contorElev <= 5) { Citeste notaElev total = total + notaElev //insumeaza media individuala citita contorElev = contorElev +1 //creste contor elev } //calcul medie clasa mediaClasa = total / 5. //afisare rezultat Afisare mediaClasa)

Codul Java:

77

import javax.swing.JOptionPane; public class Media { public static void main(String[] args) { int total; int contorElev; int notaElev; double mediaClasa; String sirNota; //initializari total = 0; contorElev = 1; //totalul mediilor individuale while (contorElev <= 5) { sirNota = JOptionPane.showInputDialog("Nota pentru elev " + contorElev); notaElev = Integer.parseInt(sirNota); // sunt scrieri alternative ale instructiunilor total = total + notaElev; //total+=notaElev; contorElev= contorElev +1; //++contorElev; } //calcul medie clasa mediaClasa = total / 5.; //afisare rezultat JOptionPane.showMessageDialog(null, "Media clasei este: " + mediaClasa); } }

Rezultate:

78

CICLUL do while
! are plasat condi ia de realuare a ciclului la capt:
do instructiune while (conditie); !

conditie se scrie ntre paranteze corpul este format dintr-o instructiune simpl sau un

bloc
int i = 5; do { System.out.println("i = " + i); i--; } while (i > 0);
i=5 i=4 i=3 i=2 i=1

Ciclul do while lucreaz dup acelai pricipiu cu ciclul while cu excep ia c expresia de reluare a ciclului conditie se evalueaz dup ce corpul a fost rulat o dat. Instruc iunea se utilizeaz atunci cnd corpul ciclului trebuie rulat cel pu in o singur dat.

79

Aplicatia 1 - do while Acesta este o implementare folosind ciclul do while a aplica ie 1 de la ciclul while.
import java.util.Scanner; public class DobandaV1 { public static void main(String[] args) { // citirea datelor de intrare double scop, depunere, cont, dobandaan, dobandalunara; int luni; String raspuns; Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); scop = in.nextDouble(); System.out.print("Care e suma initiala? "); depunere = in.nextDouble(); System.out.print("Dobanda anuala %: "); dobandaan = in.nextDouble(); // initializarei cont = depunere; luni = 0; // actualizarea contului pe luna // pana cand scopul este atins do { // dobanda pe luna se calculeaza din cont dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; System.out.println("Dupa " + luni + " luni ai acumulat " + cont + " RON"); System.out.print("Iti ajunge suma acumulata? (D/N): "); raspuns = in.next(); } while (raspuns.equals("D")) ; } }

Rezultate:
De ce suma ai nevoie? 1000 Care e suma initiala? 970 Dobanda anuala %: 12 Dupa 1 luni ai acumulat 979.7 RON Iti ajunge suma acumulata? (D/N): D Dupa 2 luni ai acumulat 989.4970000000001 RON Iti ajunge suma acumulata? (D/N): D Dupa 3 luni ai acumulat 999.39197 RON Iti ajunge suma acumulata? (D/N): D Dupa 4 luni ai acumulat 1009.3858897 RON Iti ajunge suma acumulata? (D/N): N Process exited with exit code 0.

80

CICLUL for
! realizeaz gruparea celor 4 por iuni tipice ale unui ciclu:
for(initializare;conditie;iteratie) instructiune

for (int i = 0; i < 5; ++i) System.out.println(i);

i=0 i=1 i=2 i=3 i=4

Semantica lui for poate fi cuprinsa n urmatorii pasi: se evalueaza ini- ializare, aceasta se face t o singura data la intrarea n ciclu (nu si la reluarea acestuia); se trece, apoi, la evaluatea lui conditie, aceasta condi-ie de reluarea a ciclului este indentica cu cea de la while, ea se evalueaza la fiecare t reluare, inclusiv dupa ini-alizarea lui; daca conditie la evaluare da true se trece la rularea lui t instructiune dupa terminarea execu- iei corpului se trece la evaluarea lui iteratie din acest t moment reluarea se face de la evaluarea lui conditie dupa scenariul deja descris. Partea de ini-ializare poate con-ine s declara-ii, din acest punct de vedere urmatoarele cicluri sunt echivalente t t -i t ca si rezultate: int i; for (i = 0; i < 5; ++i) System.out.println(i); for (int i = 0; i < 5; ++i) System.out.println(i);

Vizibilitatea variabilelor declarate n ini-ializare se termina odata cu terminarea ciclului for. t Componentele ini-ializare , conditie si iteratie sunt op-ionale, dar caracterele ; care t t le separa sunt obligatorii. ini-ializare si iteratie pot sa con-ina o lista de expresii separate t t prin virgula care se evalueaza de la stnga la dreapta. Valorile acestor expresii se pierd daca nu sunt stocate n variabile. conditie trebuie sa fie de tipul logic, iar daca este absenta se considera ca are valoarea true. n baza celor scrise, cteva forma valide for sunt: // - aceasta secventa de cod // realizeaza calculul factorialului de la 1 la 7 int i, j; for (i=1, j=i; i < 8; ++i, j*=i) System.out.println(i + "! = " + j); // - afiseaza cifrele de la 0 la 4 int i = 0; 81

for ( ; i < 5; ++i) System.out.println(i); // - acelasi efect cu secventa de cod int i = 0; for ( ; i < 5;) System.out.println(i++); // - ciclu for infinit for ( ; ;) { . . . } n primul exemplu () ini-ializarea con-ine doua expresii prin care i ia valoarea 1 si j valoarea lui i, t t iar itera ia (avansul) consta n incrementarea lui i si modificarea lui j la produsul dintre valoarea lui curenta s ce a lui i. -i n exemplul al doilea () expresia de ini-ializare a fost omisa si mutata nainte de nceperea ciclului t for. Observa-i ca prezen-a lui ; este obligatorie. t t n cel de al treilea () exemplu este omisa si expresia de itera ie, dar ea a fost inclusa n corpul for ului. Observa-i ca, si n acest caz, prezen-a lui ; este obligatorie. t t n cel de al patrulea () exemplu toate cele trei expresii au fost omise. Lipsa lui conditie fiind interpretata ca s true rezultatul este un ciclu infinit. Crearea unor astfel de cicluri ar fi absurda daca -i nu ar exista o posibilitate de a le parasi (instruc-iunea break este cea care permite iesirea for-a-a unui t t t ciclu si va fi prezentata n continuare).

82

Erori specifice ciclurlor


int i = 3; while (i < 7); System.out.println(i--); System.out.println(gata.); int i = 3; while (i < 7) System.out.println(i); -i; int suma = 0; for( ;i<10; suma+=i++); System.out.println(i);

Eroarea Ciclul while are un ; n plus dup condi ia de testat pentru reluarea ciclului fiind echivelant cu:
. . . while (i <7) ; . . .

Java nu d eroare la compilare considernd c are de a face cu o instruc iune vid. Eroarea while nu are, asemenea lui for, intera ia (expresia de avans ctre terminarea ciclului) inclus n corpul ciclului. Expresia -i nu face pare din corpul while-ului deoarece nu s-au folosit acolade, respectiv valoarea lui i rmne neschimbat. Se ob ine un ciclu while infinit deorece valoarea expresiei ce ar trebuie s asigure prsirea ciclului rmne pe veci neschimbat. Eroarea Aici valorea lui i nu s-a ini ializat. Itera ia este continuat ct timp i este mai mic ca 10. Caracterul ; face ca instruc iunea vid s fie corpul ciclului for. Expresia de iterare adun pe i la suma i apoi incrementeaz pe i.

83

Saltul cu break
! ! ! realizeaz prsirea unui switch sau ciclu prsirea se face transferndu-se rularea la prima instruc iune urmtoare; permite ieire prematur, deci i for at din cicluri

while (true) { System.out.println(i); if (i >= 20) //iesire pt. i>=20 break; ++i; } . . .
Instruc-iunile de ciclare prezentate (while, do while, for) realizau testul pentru reluare sau t terminare la nceputul sau la sfrsitul ciclurilor. Uneori, prin natura problemei de rezolvat, acest test trebuie realizat undeva prin mijlocul corpului ciclului sau trebuie realizat n mai multe puncte ale corpului ciclului. Java furnizeaza o metoda generala de parasire a unui ciclu prin instruc-iunea break. t Sintaxa instruc-iunii este: t break; Pa sirea ciclului, prin combinarea lui if cu break, se va putea face atunci cnd o anumita condi-ie ra t este ndeplinita Controlul va fi predat imediat instruc-iunii care care urmeaza, secven-ial, ciclului. . t t Exista grupuri de programatori care evita folosirea lui break deoarece instruc-iunea nu este stric t necesara la scrierea aplica-iilor. Aplica-ia anterioara ar putea fi modificata asttfel: t t while (i <= 20) { . . . } pentru evitarea scrierii lui break. O instruc-iune break termina instruc- iunea de ciclare n corpul careia este scrisa. Exista nsa t t posibilitatea realizarii unor cicluri imbricate (un ciclu este n corpul altui ciclu). Utilizarea unui break n aceasta situa-ie va duce la terminarea unui singur ciclu, si anume, a celui din corpul caruia face parte t break-ul. Pentru parasirea mai multor cicluri se poate folosi instrc-iunea break etichetata care va t fi prezentata imediat. 84

Saltul cu continue
! ! se poate utiliza numai n cicluri abandoneaz intera ia curent i transfer controlul la sfritul corpului ciclului

for(int an = 1990; an <= 2020; ++an) { if ((an % 100 == 0) && (an % 400 != 0)) continue; //saltul se face la ++an if (an % 4 == 0) System.out.println(an); }
n cadrul ciclurilor, atunci cnd corpul acestora are mai multe instruc-iuni, exista situa-ii n care un grup t t de instruc-iuni se doreste a fi sa fara nsa a parasi ciclurile. n acest scop Java pune la dispozi-ia t rit, t programatorului instruc-iunea continue. Aceasta poate fi folosita numai n cicluri si are ca efect t continuarea execu-iei unui ciclu ncepnd cu etapa urmatoare execu-iei complete a corpului acestuia t t (expresia de test pentru reluare corpului la while si do while sau intera ie la for). Itera-ia t curenta este abandonata si se trece la intera-ia urmatoare. Secven a de cod prezentat permite t determinarea anilor bisec-i. Itera-ia n cazul n care anul este divizibil cu 100 dar nu este cu 400 este t t sa folosind continue dupa cu se vede mai sus. rita

85

break si continue etichetate ! ! ! se utilizeaz n cazul ciclurilor imbricate permit saltul n afara ciclului curent eticheta este un nume dat instruc iunii n care se va realiza saltul

afara1: for (j=0; j<=3; ++j) { afara2: for (k=0; k<=3; ++k) { if (j+k <= 1) { System.out.println(j + " " + k + " > break"); break afara2; } if (j+k >= 5) { System.out.println(j + " " + k +" > continue"); continue afara1; } if (k == 0) continue afara2; System.out.println(j + " / " + k + " = " + (double)(j/k)); } //for(k= ... }//for(j=...

Posibilitatea scrierii unor cicluri imbricate pune problema iesirii definitive dintr-o astfel de situa-ie sau t de continuare a ciclului n care ciclul curent este imbricat. break si continue pot fi utilizate cu etichete. Acestea pot marca punctele de parasire sau de reluare la nivelul ciclurilor. n cazul lui break saltul se va face la prima instruc-iune urmatoare etichetei. Pentru continue saltul se face la t urmatoarea itera-ie a ciclului marcat prin eticheta. t Rezultate:
0 0 > break 1 0 > break 2 / 1 = 2.0 2 / 2 = 1.0 2 3 > continue 3 / 1 = 3.0 3 2 > continue

Linia break afara2; produce saltul la instruc-iunea marcata cu afara2:. Acesta este ciclul for t (k=0; k<=3; ++k) .... Pentru acest break valoarea lui k pleaca ntotdeauna de la 0. Linia continue afara1; faca ca linia de afisare a mpar-irii sa fie omisa iar continuarea se face cu un t , j actualizat. Desi break si continue sunt utile n cazul ciclurilor imbricate, folosirea lor este de evitat prin regndirea logicii ciclurilor n care participa Folosirea intensiva a acestora va conduce la un . cod neclar si greu de depanat. 86

Aplicatia 1 - for S se scrie o aplica ie pentru calcului lui n! = 1*2*3* ... *n, cu 1! = 1.
import java.util.*; public class factorial { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("n: "); int n = in.nextInt(); long fact = 1; for(int i = 1; i<=n ; ++i) fact=fact*i; //sau fact*=i; System.out.println(n+"! = "+fact); } }

Rezultate:
n: 5 5! = 120 n: 555 555! = 0

Observa i c valoarea lui 555! nu se mai poate reprezenta folosind tipul long. Dac precizia sau domeniul de valori a tipurilor ntregi sau reale nu sunt suficiente n Java se pot folosi clasele BigInteger sau BigDecimal din pachetul java.math. Aceste sunt create pentru manipularea unor valori numerice arbitrar de mari. Aplica ia anterioar a fost rescris folosind n locul lui long pe BigInteger. Aici, crearea unei valori de tipul BigInteg e r se face cu BigInteger.valueOf(valoare) . Operatorii matematici sunt nlocui i cu metode, pentru * se va folosi multiply .
import java.math.BigInteger; import java.util.*; public class factorialB { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("n: "); int n = in.nextInt(); BigInteger fact = BigInteger.valueOf(1); for(int i=1; i<=n ; ++i) fact = fact.multiply(BigInteger.valueOf(i)); //fact = fact * i; System.out.println(n + "! = " + fact); } }

Rezultate:
n: 555 555! = 66140856092779467090983316712427699021235319456107896663061009150806651839846293 87085701659314538187743468066779374876229412967164099011221807911833816151991801 33649323135568584492485536333258769584469786383591661922104266566863913614070698

87

13888154553080852234615605505311576226261267947625648132268820356717111103825491 62857689488683906833874275617940623468544916896330732153487737103632180161575111 81863057926134577070731221701301152592821760868454925199903505386017787199554004 69530073671454816298664788601977137914407564217261944935588590631149093156201859 98321730061506989100813577111773696863103629393244250245849993115399046437308001 89147272918915911770251276375152459026027462464002063813902395684537655374791000 27069982319137060763165525786963451550659008901397431426938167831988871389240730 59060536938650791542851017477232993820261825123659145274388477831568316746298697 33219475045947728356608604070725171727115599864469722301348700056888092787342824 68911323601467977092970083491347570972680751172611060765887478571182355289677008 88379534633760485028152799559579229246893025384153371622056374710987652817622316 17571867644711936978426265600000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000

Aplicatia 2 - for Aplica ia const ntr-un applet ( o aplica ie ce se ruleaz n navigator). Codul Java al aplica iei.
import java.awt.Graphics; import javax.swing.JApplet; public class for_v1 extends JApplet { public void paint( Graphics g ) { // apel metoda paint mostenita din JApplet super.paint( g ); for ( int c = 1; cr <= 10; c++ ) g.drawLine( 10, 10, 250, c * 10 ); } // terminare paint } // terminare clasa for_v1

Codul HTML al aplica iei ce va fi stocat n fiierul text for.html:


<HEAD> <APPLET CODE="for_v1.class" WIDTH=500 HEIGHT=120> </APPLET> </HEAD>

R u l a r e a ap l i ca i e i s e poate cu aplica ia appletviewer.exe s a u d i n navigatorul de Internet. Pentru rularea din appletviewer dechidem o consol i s c r i e m : appletviewe r for.html Acelai fiier for.html va putea fi deschis 88

n IE sau Mozilla Firefox dup cum se vede n continuare.

89

5
Concepte de programare orientata pe obiect n Java 7

90

Ce este programarea orientata 7 pe obiect (POO)


! ! ! ! este o metodologie (paradigm) de proiectare a programelor este inspirat din realitate i se bazeaz pe conceptul de modelare pe obiect trecerea de la realitate la model se face prin abstractizare cteva caracteristici:
G G asigur reutilizarea i adaptarea simpl a codului; conduce la un cod mai pu in vulnerabil la manipulri eronate.

Programarea orientat pe obiect (object oriented programming, n englez) este o metodologie de scriere a programelor. n programare, modul de abordare a scrierii aplica iei, adic metoda, mai poart i denumirea de paradigm (vine din grecescul paradeigma care nseamna a demonstra). Fiecare paradigm a fost pus la punct cu un scop precis, cteva dintre caracteristicile celei obiectuale sunt: # reutilizarea codului; # ntre inere uoar; # adaptarea codului ct mai simpla la situa ii noi; # minimizarea vulnerabilt ii codului la utilizarea greit din partea programatorilor care n refolosesc. ntr-o descriere foarte generala, n programarea orientata pe obiect, aplicat ia de realizat este privita n termenii manipula rii unor entita-i numite obiecte si nu prin prisma act iunilor care trebuiesc t implementate (cum se face n programarea structurat). POO are drept surs lumea nconjurtoare. Omul, n via a de toate zilele, i propune s fie ct mai concret n descrierea lumii care l nconjoar. El, d nume scurte obiectelor nconjurtoare pentru ca s le poat identifica ct mai exact. De exemplu, spunem LOGAN, n loc de automobilul produs la Uzina de Automobile din Piteti, n colaborare cu Renault. Toate aceste nume particulare ascund ns n spatele lor denumiri mai generale cum sunt: automobile, atomi, stele, oceane, oameni etc. Deseori, un obiect are la baz altele. Trim, astfel, ntr-o lume orientat pe obiect. O descriere a termenului de obiect este dat de Booch prin "Un obiect are stare, comportament i identitate; structura i comportamentul similar al obiectelor este definit prin clasele lor comune; termenii de instan i obiect sunt echivalen i". Mai general, un obiect este ceva cruia i se poate aplica un concept. Conceptul este o idee sau o nota ie comun, mai multor obiecte nconjurtoare. Obiectul, din via a de toate zilele, n programarea orientat pe obiect este implementat ca o structur de dat (abstract) ncapsulat cu un grup de subrutine denumite metode, care ac ioneaz asupra datelor. Structura obiectului rezult ca urmare a abstractizrii. Abstractizarea implic o generalizare, prin 91

ignorarea sau ascunderea detaliilor, n vederea separrii unor propriet i sau caracteristici ale unei entit i de obiectul fizic sau de conceptul pe care l descrie. Ca urmare, n programarea orientat pe obiect, cutarea i definirea propriet ilor obiectelor din lumea real definesc specificul acestei paradigme. Proiectarea orientata pe obiect conduce la o aplicat ie formata din colect ii de obiecte care coopereaza. ntre obiectele aplica iei se stabilesc rela ii de legatur, iar cooperarea ntre obiecte se face prin mesaje transmise ntre acestea. Etapele tipice acestei paradigme de proiectare sunt: identificarea claselor si a obiectelor, identificarea semanticii acestora, identificarea relat iilor si descrierea interfet elor si a implementarilor de clase s de -i obiecte. Cteva nume care au avut contribu ii importante n crearea i dervoltarea POO sunt: ! Grady Booch, de la Rational, care a dezvoltat renumitul instrument de modelare numit "Rose"; ! Kirsten Nygaard i Ole-Johan Dahl, inventatorii limbajului Simula, primul limbaj de programare orientat pe obiect i inventatorii proiectrii orientate pe obiect; ! Adelle Goldberg, Kay Alan i Dan Ingallas fondatorii limbajului obiectual Smalltalk i coautori ai lui "Smalltalk-80"; ! Brax Cox, creatorul limbajului Objective-C, care implementeaz n limbajul C facilit ile legate de identificarea obiectelor i mecanismul de mesaje din Smalltalk; ! Meyer Bertrand creatorul limbajului Eiffel; ! Bjarne Stroustrup, inventatorul limbajului C++, o extensie a limbajului C, probabil, unul dintre cele mai populare limbaje de programare orientate pe obiect.

92

Conceptul de obiect - definitii ! depinde de contextul n care se lucreaz:


G G G filozofic: o entitate ce se poate recunoate ca fiind distinct de altele - are identitae proprie proiectarea oo: o abstractizare a unui obiect din lumea real teoria tipurilor: o structur de date mpreun cu func iile de prelucrare a lor

! !

se definete prin atribute i opera ii atributele definesc starea, opera iile permit modificarea strii.

Din punctul de vedere al aplica ie din care face parte obiectul el trebuie s asigur o parte din func iile necesare func ionrii ntregii aplica ii. Termenul de modelare a obiectelor se foloseste pentru a descrie procedura de cautare a obiectelor prin care sa descriem problema de rezolvat. Obiectele sunt descrise prin atribute si operatii. Atributele sunt caracteristici care se modifica, iar operatiile sunt act iuni pe care obiectul le poate face. De exemplu, pisica are culoare, rasa si masa (greutate), acestea ar fi cteva dintre atribute ei, ea pot prinde soareci, mnca, dormi sau mieuna, acestea ar fi cteva dintre act iunile specifice pisicii. ntr-un model de obiecte toate datele sunt stocate sub forma de atribute ale obiectelor. Atributele unui obiect vor putea fi manipulate prin act iuni sau operat ii. Singura modalitate de modificare a atributelor este prin utilizarea operat iilor. Atributele pot fi uneori obiecte. Funct ionarea la nivelul unui model de obiecte este definita prin operat ii. Un obiect poate accesa i utiliza opera iile unui al obiect. Opera iile sunt cele ce modific starea obiectului. Modelarea orientat pe obiect este despre gsirea obiectelor i a dependen elor ntre acestea. Dependen ele ntre obiecte reprezint modul n care ele se aranjeaz, n sensul legturilor - a rela iilor, a asocieriilor - care se formeaz, pentru a ne solu iona problema. De regul, indentificarea obiectelor unui model de obiecte se face pe baz de substantive i verbe. Sunbstativele vor fi obiecte, iar verbele opera ii. Rela ii ntre obiecte Agregarea, cunoscut n literatura de specialitate sub prescurtarea de rela ie has-a, apare atunci cnd un obiect este compus din mai multe sub-obiecte. Comportamentul obiectului complex este definit prin comportamentul pr ilor componente, distincte i aflate n interac iune. n procesul de descompunere al unui obiect n obiecte mai simple, acestea, deseori, vor putea fi reutilizate n alte aplica ii. Agregarea ne permite deci, reutilizarea componentelor unei aplica ii ntr-o alt aplica ie. Delegarea, cunoscut n literatura de specialitate sub prescurtarea de rela ie uses-a, apare atunci cnd un obiect, format total sau par ial din alte obiecte, las obiectele componente s i defineasc comportamentul. Obiectul nu are un comportament implicit, la nivel de interac iune cu alte obiecte, acesta fiind motenit de la sub-obiectele lui. 93

Conceptul de clasa 7
! ! clasa este o generalizare a unei mul imi de obiecte defini ia unei clase se face prin specificarea:
G G G variabilelelor care i definesc starea - variabile de instant a; - metodele prin care se modific starea - metode de instant a; - rela iile cu alte clase.

class nume_clasa extends nume_parinte { //STARE - ATRIBUTE tip v_1; . . . tip v_n; //METODE - OPERATII tip metoda_1(lista parametri) { corp_1 } . . . tip metoda_k(lista parametri) { corp_k } } //TERMINARE definitie de clasa

Clasa reprezint un termen general asociat procesului de clasificare. Scopul clasificrii este cel de ncadrare a unui obiect ntr-o colec ie de obiecte similare ce poart denumirea de clas. Toate obiectele clasei au aceleai atribute i fac aceleai opera ii, dar starea lor difer i au o identitate proprie. Un obiect particulat poart denumirea de instant. Din punctul de vedere al programatorului clasa reprezint un nou tip de date. Clasa este o defini ie static, prin care descriem un grup de obiecte. Clasa este un ablon (un tip), un concept, n timp de obiectele exist n realitate (n timpul rulrii programului). De exemplu, String reprezint o clas, iar variabilele de tipul String reprezint obiecte ale aplica iei. Clasa String este una singur, n timp ce numrul obiectelor de tipul String nu este limitat. n procesul de proiectare a claselor apare situa ia n care mai multe clase distincte au pr i comune. Pr ile comune pot fi cuprinse ntr-o singur clas i motenite la nivelul unor clase ulterioare. Motenirea, cunoscut n literatura de specialitate sub prescurtarea de rela ie is-a, apare atunci cnd o clas are ca printe o alt clas. Prin motenire, noua clas preia toate caracteristicile clasei motenite, la care mai poate aduga unele noi. Astfel, noua clas o extinde pe cea motenit, fiind o specializare a acesteia. Motenirea crete claritatea proiectului i productivitatea, deoarece noi clase pot fi create pe baza unora existente. 94

Defini ia unei clase presupune descrierea precis a formei i a naturii acesteia. Pentru aceasta trebuie specificate datele (atributele) pe care le con ine i codul (opera iile) care va opera cu respectivele date. Datele, se vor stoca n variabile ce poart denumirea de variabile de instan , iar opera iile se implementeaz n metode. Variabilele i metodele unei clase poart denumirea comun de membri. Variabilele de instan au aceast denumire deoarece sunt proprii fiecrei insta ieri de clas, adic fiecrui obiect din clasa respectiv. Datele unui obiect sunt distincte, separate de datele unui alt obiect din aceeai clas. Exemplul alturat definete n clasa Punct: ! dou variabile de instan :
private double x; private double y;

public class Punct { /*Atributele clasei, permit stocarea STARII */ private double x; private double y; /*Constructorii clasei, permit initializarea obiectelor din clasa Punct */ Punct() { setX(0); setY(0); } Punct(double abscisa, double ordonata) { setX(abscisa); setY(ordonata); } /*Metodele clasei, permit accesul si modificarea starii obiectelor din clasa Punct */ public void setX(double abscisa) { x = abscisa; } public void setY(double ordonata) { y = ordonata; } public double x() { return x; } public double y() { return y; } public double distantaOrigine() { return Math.sqrt(x*x+y*y); } public String toString() { return "<" + x + "," + y + ">"; } } public class Grafica { public static void main(String[] args){ Punct p1; Punct p2 = new Punct(-1.,7.); p1 = new Punct(); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); p1.setX(12); p2.setY(13.345); System.out.println("p1 = " + p1.toString()); System.out.println("p2 = " + p2); } }

! !

doi constructori:
Punct() Punct(double abscisa ...)

ase metode:
public public public public public public void setX(double abscisa) void setY(double ordonata) double x() double y() double distantaOrigine() String toString()

Clasa Grafica, are metoda main(), este punctul de plecare al aplica iei i definete dou obiecte, P1 i P2, din clasa Punct. Aici se prezint: ! modul n care se declar obiectele unei clase:
Punct p1;

modul n care se aloc spa iu unui obiect, prin folosirea operatorului new:
p1 = new Punct();

modul n care se refer o metod public dintr-un obiect:


p1.setX(12);

95

Crearea obiectelor
! obiectele se creeaza cu operatorul new 7 refObiect = new nume_clasa(); ! new realizeaza urmatoarele actiuni: 7 7 G G G aloca memorie pentru nou obiect; 7 apeleaza o metoda speciala de initializare 7 7 7 numita constructor; 7 ntoarce o referinta la noul obiect. -7

n Java obiectele se creeaza cu operatorul new. n aplicat ia anterioara se creaza doua instant e ale clasei Punct prin liniile de cod: Punct p2 = new Punct(-1,7); p1 = new Punct(); Prima linie declara i creeaza variabila obiect p2, iar cea de a doua creeaza variabila p1, ea fiind deja declarata anterior. Operatorul new are ca efect alocarea de spat iu n RAM pentru obiect i are ca rezultat o referint a catre - obiectul creat. Respectiva referint a se va stoca n variabila obiect, mai sus p1 - i p2, prin care vom putea accesa tot i membrii obiectului n cauza . Reprezentarea grafica a clasei Punct se poate da sub forma alaturata. Pe baza acestei clase vor crea doua variabile obiect sau instant e, p1 i p2. Spat iul de date pentru instant a p1 va fi reprezentat grafic pentru a descrie etapele parcurse la crearea unui obiect. n momentul declararii obiectului p1 prin linia Punct p1; n RAM se aloca spat iu n RAM pentru o referint a cate un obiect. Spat iul - de date alocat n RAM consta ntr-o locat ie cu numele p1 n care este stocata o valoarea speciala null. Aceasta valoarea speciala arata faptul ca obiectului nca nu i s-a alocat spat iu. n etapa urmatoare, operatorul new aloca spat iu pentru obiect pe baza definit iei de clasa, apeleaza constructorul clasei pentru a init ializa variabilele de instanta x i y cu valorile 0 i 0, apoi ntoarce o referint a (o adresa de RAM ce se reprezinta grafic ca o sa - geata cu vrful de la instant a - catre spat iul alocat obiectului) catre nou obiect ce va fi stocata n variabila obiect p1. 96

Conceptul de referinta -7
! ! prin referinta se ntelege adresa unei locatii -7 de RAM membrii unui obiect se acceseaza printr-o 7 referinta la obiect stocata n variabila obiect: -7 7
p1.setX(12);

la declarare, variabilele obiect sunt initializate automat cu null: Punct p1; este Punct p1 = null;

valoarea null poate fi comparata cu alte 7 referinte: if (p1 == null) p1 = new Punct();

distrugerea unui obiect se face prin setarea referintei lui la null: p1 = null;

RAM-ul este organizat sub forma unui tablou liniar de elemente numite locat ii. Fiecare locat ie este indentificata unic printr-un numar ntreg numit adresa i poate stoca o valoare. n reprezenta rile grafice utilizate pentru descrierea sta spat iului de date dreptunghiul reprezinta o locat ie (sau un grup de rii locat ii consecutive), numele variabilei se scrie n stnga dreptunghiului fiind echivalentul adresei locat iei. n interiorul dreptunghiului se va scrie valorea stocata n respectiva locat ie. Valorile numerice stocate n locat ii sunt dependente de tipul de date folosit la declararea variabilei. Pentru tipurile primitive locat iile cont in reprezentarea binara a valorilor atribuite respectivelor variabile. n cazul variabilelor obiect, locat iile stoceaza adresa de nceput n RAM a grupului de locat ii alocat de new pentru stocarea instant ei. O variabila ce stocheaza o adresa poarta denumirea de referint a (denumiri - altenative sunt pointer - din engleza sau poantor - din franceza ). Atribuirea n situatia referintelor are ca efect obt inerea a doua variabile ce refera acelai obiect. Prin atribuire ajungem sa avem mai multe variabile obiecte distincte care refera nsa un singur obiect.

97

ncapsularea (encapsulation) si vizibilitatea membrilor


! vizibilitatea membrilor este controlata prin 7 specificatorii de acces: G public G private G protected ncapsularea asigura: 7
G G protectia datelor prin accesul la acestea numai prin intermediul unei intefete publice (public) izolarea partilor vizibile prin interfata de 7 -7 implementarea interna (private) 7

avantajele ncapsularii: 7 G nu pot fi realizate modificari ilegale ale 7


G datelor, deoarece accesul direct la ele este restrictionat gruparea datelor i a operatiilor ce se pot realiza cu ele permit depistarea uoara a 7 eventualelor probleme modificarile interne ale clasei nu se reflecta i 7 7 n afara ei (daca se pastreaza aceeai 7 7 7 interfata), ca urmare restul programului nu -7 trebuie modificat

Membrii public vor fi vizibili pentru orice port iune de cod din aplicat ie. Membrii private vor fi vizibili numai pentru membrii clasei din care face parte. Membrii protected sunt vizibili numai prin motenire. Condit iile de implementare corecta a ncapsularii: ! toate variabilele de instant a sunt declarate cu private; - ! numai metodele public ale obiectului vor putea fi utilizate pentru accesul la datele private ale acestuia; n continuare se prezinta o astfel de implementare a clasei Punct:

98

n aceasta implementare x , y i distanta sunt toate declarate private , deci invizibile pentru un utilizator al clasei. Modificarea valorilor acestor variabile de insstant a se face numai sub controlul - metodelor: ! automat la crearea instant ierea obiectelor prin act iunea automata a constructorilor: Punct(),
Punct(double x, double y)

public class Punct { //Campuri private double x; private double y; private double distanta; //Constructori Punct() { setX(0); setY(0); distanta = 0; } Punct(double x, double y) { setX(x); setY(y); actualizareDistanta(); } // Metode public void setX(double x) { this.x = x; actualizareDistanta(); } public void setY(double y) { this.y = y; actualizareDistanta(); } public double x() { return x; } public double y() { return y; } public double distantaOrigine() { return distanta; } private void actualizareDistanta() { distanta = Math.sqrt(x*x+y*y); } public String toString() { return "<" + x + "," + y + ">"; } }

prin apelul metodelor: x) , setY(double y)

setX(double

Vizualizarea valorilor stocate n variabilele provate se face cu metodele: x() , y() i distantaOrigine() .

99

Metode
! ! metoda implementeaza o operatie cu datele 7 obiectului metodele se implementeaza sub forma unor 7 proceduri sau functii (ntorc valori cu return) ce realizeaza anumite operatii 7 metodele pot fi definite numai ntr-o deninitie de clasa, astfel: 7

vizibilitate tip nume_met([lista parametri]) { corp_1 }


tip - definete tipul de date ntors de metoda 7 nume_met - definete numele metodei [lista parametri] - o secventa optionala de -7 7 perechi tip nume separate prin virgule
Operat iile unei clase se definesc cu ajutorul metodelor. Metodele din Java sunt echivalentul procedurilor i funct iilor din alte limbaje de programare, cu except ia ca ele trebuie scrie obligatoriu n interiorul definit ie de clasa (nu exista conceptul de metoda globala n Java). Vizibilitatea controleaza cine anume va putea apela metoda. Pentru public acesta va fi apelabila din toata aplicat ia, pentru private numai de alte metode din clasa n care s-a definit. Daca metoda ntoarce o valoare, adica este o funct ie, ea va avea specificat unul dintre tipurile deja discutate i o instruct iune de salt necondit ionat return expresie ca va genera ntoarcerea n codul apelant cu valoarea lui expresie. Daca metoda nu ntoarce valoare, adica este o procedura, tipul ei va fi obligatoriu void i nu va cont ine instruct iune return. Pentru ca operat ia implementata la nivelul unei metode sa aiba loc aceasta trebuie apelata. Prin apel, va se realiza rularea instruct iunilor cuprinse n corpul metodei. Terminarea metodei se face la rularea unei instruct iuni return, din corpul ei sau, n lipsa lui return, la atingerea acoladei de inchidera a corpului ciclului. La terminarea rularii unei metode rularea aplicat iei va continua cu instruct iunea imediat urmatoare celei de apel a metodei. Port iune de cod din care se face apelul metodei se numete cod apelant, iar port iune de cod corespunza toare metodei apelate se numete cod apelat. Metoda poate avea zero sau mai mult i parametri. Parametrii sunt valori transferate metodei n momentul apelului acesteia. Aceste valori, daca exista vor putea fi prelucrate n corpul metodei pentru , a produce rezultatele ntoarse cu return.

100

Apelul metodelor i metodele de transfer al parametrilor


! ! sintaxa generala pentru apelul unei metode 7 este: refObiect.nume_met(argumente) parametrii sunt variabile ce primesc valori n momentul apelului i se numesc argumente valorile parametrilor ce sunt tipuri de date primitive se transfera prin valoare 7 la transferul prin valoare, metodei, i se transfera o copie 7 a valorilor parametrilor din programul apelant

! !

Aplelul de metoda Apelul unei metode se face se face cu ajutorul operatorului punct. Forma generala a unui apel de metoda este refObiect.nume_met(argumente), n situat ia exemplului de mai sus apelul de metoda este p1.setX(12). Parametrii i argumente Metodele nu au nevoie de parametri. Folosirea parametrilor perminte nsa o generalizare a meteodei n sensul ca aceasta va putea opera cu mai multe date de intrare i/sau n mai multe situat ii uor distincte. Termenul de parametru se folosete pentru o variabila definita la nivelul metodei care primeste o valoare n momentul apelarii metodei. Persistent a i vizibilitatea parametrilor este limitata la corpul metodei. Termenul de argument se folosete pentru o valoarea care se transfera metodei atunci cnd aceasta este apelata. Astfel, n exemplul prezentat abscisa este parametru, iar 12 este argument. Apel prin valoarea Exita doua tipuri de parametri n Java: tipuri primitive i referint e la obiecte. n cazul ambelor categorii de parametri apelul se face ntotdeauna prin valoare. Respectiv metoda primete o copie a argumentelor prin stiva i nu va putea sa modifice cont inutul init ial al argumentelor ce se transfera n parametrii din 101

interiorul metodei. n cazul parametrilor de tipul referint a la obiect se poate modifica starea obiectului - utiliznd metodele puse la dispozit ie n acest scop, dar nu se pot modifica referint ele originale ale argumentelor de tipul referint a la obiect n corpul metodei. Iata un exeplu: - Este imposibila modificarea unui argument de tip primitiv prin parametrii metodei. Pentru aceasta s-a scris metoda dubleazaX() ce ar t r e b u i s a dubl ez e val orea argumentului x cu valoarea init iala 5. - Observat i n rezultate ca dei n corpul metodei dublarea se face, la terminarea metodei i revenirea din aceasta, valoarea dublata se pierde. Iata cum lucreaza Java: 1. parametrul a este init ializat cu o copie a valorii stocate n argumetul x, adica cu o copie a lui 5; 2. a este dublat, adica devine 10, dar x ramne 5; 3. metoda se termina, iar parametrul i nceteaza persistent a, deci variabila a nu mai exista . n siuat ia n care parametrul (vezi metoda schimbaX()) este o referint a la un obiect, Java lucreaza - astfel: 1. parametrul x primete o copie a referint ei catre obiectul p1; 2. metoda setX() este aplicata asupra referint ei la obiect, obiectul PunctOK fiind referit n acest moment de x i p1; 3. metoda se termina i parametrul x nceteaza sa mai existe. Metoda poate modifica starea unui parametru obiect deoarece primete copie o referint ei la obiectul init ial. Att copia ct i argumentul refera nsa acelai obiect.
public class GraficaOK { public static void main(String[] args) { double x = 5; PunctOK p1 = new PunctOK(); PunctOK p2 = new PunctOK(-1.,7.); System.out.println("in afara lui dubleazaX x este: " + x); dubleazaX(x); System.out.println("in afara lui dubleazaX x este: " + x); System.out.println("p1 System.out.println("p2 interschimba(p1, p2); System.out.println("p1 System.out.println("p2 = " + p1); = " + p2); = " + p1); = " + p2);

schimbaX(p1); System.out.println("p1 = " + p1); } //modificarea valorii argumentului //NU se reflecta in codul apelant public static void dubleazaX(double a) { a = 2. * a; System.out.println("in dubleazaX x este: " + a); } //metoda de interschimbare NU lucreaza //ca urmare a transferului prin valoare public static void interschimba(PunctOK x, PunctOK y) { PunctOK aux = x; x = y; y = aux; } //lucreaza corect public static void schimbaX(PunctOK x) { x.setX(100); } }

Rezultate:
in in in p1 p2 p1 p2 p1 afara lui dubleazaX x este: 5.0 dubleazaX x este: 10.0 afara lui dubleazaX x este: 5.0 = <0.0,0.0> = <-1.0,7.0> = <0.0,0.0> = <-1.0,7.0> = <100.0,0.0>

102

Constructori
! ! ! ! definete starea initiala a obiectelor 7 are acelai nume cu clasa este apelat automat dupa crearea obiectului, 7 nainte ca operatorul new sa se termine; 7 nu ntorc o valoarea de un anumit tip (nici macar void) 7 public nume_clasa(){ ... }; ! sintactic sunt identice cu metodele (pot avea parametri)
public class PunctOK { //Campuri ... //Constructori PunctOK() { setX(0); setY(0); distanta = 0; } PunctOK(double x, double y) { setX(x); setY(y); actualizareDistanta(); } ... }

Constructorii clasei PunctOK sunt prezentat i n secvent a de cod alaturata. Observat i ca exista doi - contructori ce poarta numele clasei, diferent a ntre ei fiind parametrii. n ma sura n care este uitata definirea lor, Java utilizeaza un constructor implicit (default constructor), fara argumente i fara nici un fel de cod, ce permite, ma crearea obiectelor din car clasa respectiva i init ializarea la valori implicite a variabilelor de instant a. Constructorul implicit - poate fi scris i explicit daca init ializa rile implicite (toate datele numerice iau valoarea 0, Boolean false iar obiectele null) nu sunt cele dorite. Constructorul implicit PunctOK() va fi apelat automat la creare unui obiect prin linia ce cod PunctOK p1 = new PunctOK();, iar constructorul PunctOK(double x, double y) va fi apelat automat la crearea unui obiect cu linia de cod PunctOK p2 = new PunctOK(-1.,7.);. Java identific a constructorul ce trebuie sa apeleze pe baza -l numa rului i tipurilor parametrilor i a argumentelor.

103

104

Suprancarcarea (overloading) 7
! ! permite folosirea aceleiai sintaxe pentru obiecte de tip diferit la nivel de metode de clasa, apare atunci cnd 7 avem mai multe metode cu acelai nume, dar cu declaratii de parametrii dinsticte suprancarcarea este o forma polimorfism 7 7 Java se folosete de tipul i/sau de numarul 7 parametrilor din apel pentru a determina care dintre metodele suprancarcate sa le 7 7 apeleze

! !

n exemplul prezentat clasa PunctOK are mai mult i constructori. Dei constructorii au acelai nume, au numa i/sau tipuri de parametrii distinct i. Compilatorul determina care dintre constructori urmeaza r sa fie apelat prin compararea numa rului i a tipurilor de parametri din definit ia constructorului cu numa rul i tipurile valorilor argumentelor folosite n apelul contructorului. Daca o astfel de corespondent a nu se poate stabili sau se pot stabili, simultan, mai mult de o singura corespondent a - - biunivoca va genera o eroare legata de rezolvarea suprancarcatrii (overloading resolution). Suprancarcarea n Java este posibila att la nivel de constructori ct i la nivel de metode. Descrierea completa a unei metode se realizeaza pe baza numelui metodei mpreuna cu tipurile parametrilor acesteia. Aceste informat ii poarte denumire de semnatura metodei (method signature). Tipul ntors de metoda nu face parte din semnatura metodei, atfel nu putem avea doua metode cu acelat i nume i parametri, dar cu tip ntors diferit.

105

Referinta this ! ! ! this este argument implicit al oricarei 7 metode this este o referinta la obiectul curent -7 this poate fi folosit n corpul oricarei 7 metode ale obiectului curent
public void setX(double x) { this.x = x; actualizareDistanta(); }

Obiectul curent poate fi referit n Java prin folosirea cuvntului cheie this. Toate metodele unei instant e primesc ca argument implicit pe this. Obiectul curent este obiectul al carei metode a fost apleata. Exemplul alaturat prezinta modul de utilizare n cod a lui this. Dintre situat iile n care se dorete folosirea explicita a lui this amintesc: ! numele unei variabile de instant a este - identic cu cel al unui parametru de metoda (vezi exemplul alaturat), n aceasta situat ie accesul la variabila instan t - a se face prin this.nume_var_instanta; ! este necesara transferarea unei referint e la obiectul curent ca argument, unei alte metode; ! un constructor al unei clase apeleaz un alt constructor al aceleiai clase (permite evitarea relurii unor secven e de ini ializare).

public class Punct { //Campuri private double x; private double y; private double distanta; ... // Metode public void setX(double x) { this.x = x; actualizareDistanta(); } public void setY(double y) { this.y = y; actualizareDistanta(); } ... }

106

Motenirea
! ! motenirea permite crearea unor ierarhii de clasificare extends se folosete n Java pentru a descrie motenire ntre clase
class nume_subclasa extends nume_superclasa { adaugarea de noi variabile i metode 7 }

reprezentarea grafica a 7 motenirii se face printr-o sageata (care se citete 7 7 motenete de la) clasa care exista se numete 7 superclasa, clasa de baza sau clasa parinte, 7 7 7 7 7 noua clasa se numete sublclasa, clasa 7 7 7 derivata sau clasa copil 7 7

Motenirea permite crearea de noi clase pe baza unora existente. Noua clasa se numete subclasa i se defniete prin extinderea unei clase deja exisntente numita superclasa. La definirea subclasei se vor specifica numai diferent ele fat a de superclasa. Cele mai generale variabile i metode sunt plasate n - superclasa iar cele mai specializate n subclasa. n situat ia n care unele metode ale superclasei nu sunt corerspunza toare subclasei acestea pot i suprascrise. Aplicat ia ce urmeaza i propune sa creeze o biblioteca grafica. Comceptul de baza aici este cel de cooronate pe care se va baza acela de punct. Clasa de baza va fi deci Coordonate iar cea derivata din aceasta este Punct. Noua clasa are adaugate variabila de instant a nume , metoda setNume() i suprascrisa metoda toString(). Dei exista - doua metode cu acelai nume toString() n superclasa i nsubclasa, Java va tii sa apeleze metoda dorita corect. Constructorii noi clase sunt Punct(), Punct(double x, double y) i public Punct(double x, double y, String nume). Fiecare subclasa poate accesa constructorul superclasei iar codul comun poate fi scris n superclasa i apelat n subclasa prin folosirea lui super. Noua clasa nsa nu motenete constructorii clasei de baza ea beneficiind n mod direct numai de constructorul implicit. Dei subclasa include tot i membrii superclasei, aceasta nu va putea membrii care au fost declarat i cu private. -

107

public class Coordonate { private double x; private double y; Coordonate(){ setX(0); setY(0); } Coordonate(double x, double y){ setX(x); setY(y); } public void setX(double x) { this.x = x; } public double getX() { return x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public String toString() { return "(" + x + "," + y + ")"; } }

public String toString() { return nume +"(" + getX() + "," + getY() + ")"; } } public class Mostenire { public static void main(String[] args) { Coordonate c1 = new Coordonate(); Coordonate c2 = new Coordonate(1,2); Punct Punct Punct Punct p1 p2 p3 p4 = = = = new new new new Punct(); Punct(1,1); Punct(1,2,"P3"); Punct(c1);

System.out.println(c1); System.out.println(c2); System.out.println(p1); System.out.println(p2); System.out.println(p3); System.out.println(p4); c1 = p1; System.out.println(c1); c1 = c2; System.out.println(c1); } }

Rezultate:
(0.0,0.0) (1.0,2.0) P(0.0,0.0) P(1.0,1.0) P3(1.0,2.0) P(0.0,0.0) P(0.0,0.0) (1.0,2.0)

public class Punct extends Coordonate { private String nume; public Punct() { super(); setNume("P"); } public Punct(double x, double y) { super(x,y); setNume("P"); } public Punct(double x, double y, String nume) { this(x,y); setNume(nume); } public Punct(Coordonate c) { this(c.getX(),c.getY()); setNume(nume); } public void setNume(String nume){ this.nume = nume; }

108

Referinta super ! ! ! ! ! super este o referinta la clasa de baza -7 7 se utilizeaza la apelul constructorilor din 7 clasa de baza 7 trebuie sa fie fie prima linie n constructorul 7 clasei derivate se poate apela constructorul oricarei clase de 7 baza 7 se poate referi oricare membru al superclasei

Apelul unui constructor al superclasei: super(lista parametri) Referirea unui membrul al superclasei: super.membru

Aplicat ia anterioara prezinta modul de utilizare a lui super. Asemenea lui this, ce avea doua semnificat ii: ! o referint a de tip argument implicit la metodele obiectului; - ! o referint a la obiectul n cauza prin care se pot apela alt i construcori ai aceleiai clase; - i cuvntul cheie super are doua semnificat ii asigurnd: ! apelul unei metode din superclasa ; ! apelul constructorilor superclasei. De exemplu, n codul urmator, metoda toString() a clasei derivate Punct poate fi rescrisa utiliznd pe super pentru apelul toString() din clasa de baza Coordonate astfel: public String toString() { return nume + super.toString(); //return nume +"(" + getX() + "," + getY() + ")"; }

109

Polimorfism
! ! polimorfismul definete abilitatea de a avea mai multe forme n OOP apare atunci cnd o variabila, n 7 timpul rularii, este ataata unor obiecte de 7 7 tipuri distincte motenirea genereaza subclase ntre care 7 avem o dependenta de tipul is-a -7 is-a reprezinta un principiu de substitutie 7 - conform lui se poate folosi o subclasa n 7 locul unei superclase variabilele Java sunt polimorfice

! !

Din exemplul prezentat vom analiza liniile de cod: Coordonate c1 = new Coordonate(); Coordonate c2 = new Coordonate(1,2); Punct p1 = new Punct(); c1 = p1; //atribuire polimorfica System.out.println(c1); c1 = c2; System.out.println(c1);
P(0.0,0.0) //c este un p (1.0,2.0) // c este un c

Observat i ca c1 i c2 sunt obiecte declarate din clasa Coordonate, iar p1 este din clasa Punct. n - aceste condit ii variabila c1 ajunge sa refere doua tipuri distincte de obiecte. La utilizarea lui System.out.println(c1) este aplelata automat metoda toString() a obiectului n cauza (linia este echivalenta cu System.out.println(c1.toString())). Atunci cnd c1 refera obiectul p1 se va apela metoda toString() a clasei Punct, iar atunci cnd c1 refera pe c2 se va apela toString() a clasei Coordonate. JVM va ti tipul actual al obiectului la care c1 se refera, motiv pentru care va apela corect metoda dorita. Faptul ca variabila obiect c1 poate referi, n timpul rularii aplicat iei, tipuri multiple poarta denumirea de polimorfism. Selectarea automata a metodei de apelat, n timpul rularii aplicat iei, poarta denumirea de legare dinamica (dynamic binding). Procedura de aplicare a legarii dinamice este, principial, urma toarea: 1. Compilatorul cauta pentru obiectul n cauza tipul i numele metodei. Pot exista mai multe metode cu acelai nume ntr-o clasa i n superclase. Compilatorul va determina toate metodele candidate la apel din clasa i superclase; 110

2.

3.

4.

Compilatorul determina tipul argumentelor din apelul de metoda. Daca ntre metodele cu acelai nume exista una care are parametrii ce se potrivesc cel mai bine cu argumentele apelului atunci metoda n cauza va fi selectata pentru apel. n acest moment compilatorul tie numele metodei i tipul parametrilor metodei ce urmeaza sa fie apelata. Daca metoda este private, static, final sau constructor compilatorul va ti precis care metoda urmeaza sa fie apelata Acesta situat ie poarta denumirea de legare statica (static binding). . Altfel, determinarea metodei de apelat depinde de tipul actual al argumentelor i legarea dinamica trebuie sa fie utilizata. n timpul rularii aplicat ie JVM trebuie sa apeleze metoda pe baza tipului actual de obiect la care variabila obiect se refera. Daca tipul actual este subclasa Punct atunci se apleleaza respectiva metoda daca nu este gasita se va trece la superclasa etc. Deoarece aceasta cautarea este mare , consumatoare de timp i ar trebui derulata pentru fiecare apel de metoda, JVM, determina n avans pentru fiecare clasa o tabela a metodelor (method table) care cont ie lista tuturor semnaturilor de metode mpreuna cu argumentele cu care acestea sunt apelate. La apelul efectiv al unei metode JVM realizeaza o cautare numai n aceasta tabela.

Linia de cod c1 = p1; poarta denumirea de atribuire polimorfica. ntr-o astfel de atribuire tipul sursei (p1) este diferit de tipul destinat iei (c1). Atribuirea n sensul opus este nsa imposibila adica , nu se va putea scrie p1 = c1; deoarece nu orice coordonata este i un punct (nu se poate aplica principiul substitut iei). Totui, aa cum n cazul tipurilor simple putem face conversii cu fort are de tip, adica putem face dintr-un double un int prin codul: double x = 12.345; int i = (int) x; i n cazul obiectelor este posibila conversia unei referint e la obiect de la o clasa la o alta. O astfel de conversie este nsa corecta numai contextul unei ierarhii i se scrie astfel: p1 = (Punct) c1; Compilatorul verifica daca valoarea stocata ntr-o variabila de un anumit tip nu produce probleme (este de alt tip sau n afara domeniului permis). n cazul obiectelor, atunci cnd se atribuie referint ei de subclasa o superclasa, trecerea este oarecum echivalenta cu cea de la un domeniu mai ngust la unui mai larg, deoarece superclasa este mai generala dect subclasa. Atribuirea inversa este nsa problematica deoare se ncerca o trecere de la put in la mai mult. Din acest motiv compilatorul trebuie anunt at explicit ca urmeaza o conversie cu ajutorul operatorului de fort are de tip. -

111

6
Exceptii, tablouri n Java -

112

Exceptii ! ! Surse de erori: date de intrare, probleme cu dispozitive fizice, cod Java neglijent; Exceptia este o conditie de eroare ce modifica 7 rularea normala a programului: se face o 7 mpartire cu zero, se introduc date de intrare 7 greit etc. JAVA are un mecanism de tratare a acestor situatii cu instructiunile try catch; n Java eroarea se definete ca o situatie anormala de functionare din care nu se mai 7 poate reveni: JVM are o problema interna de 7 7 functionare sau ramne fara RAM. 7 7 7

Exist situa ii n care apar probleme n timpul execu iei instruc iunilor unui program ca urmare a unor erori. Cteva dintre aceste erori tipice sunt: Introducerea eronat a datelor: de exemplu, se atept introducerea de la tastatur a unui numr ntreg - 173 - iar utilizatorul introduce un ir de caractere - 17w3 - deoarece atinge dou taste simultan la introducerea ntregului (pe w i pe 3); un alt exemplu ar fi scrierea incorect a unui URL atunci cnd aplica ia cere introducerea acestuia de la tastatur (n loc de http://www.utcluj.ro se scrie http;//www.utcluj.ro, adic pe locul lui : se scrie ;) situa ia n care pachetul de re ea din Java v-a semnala eroarea fr mil; Erori datorate unor dispozitive hardware: de exemplu, n timpul tipririi imprimata rmne fr hrtie, server-ul de web ale crui pagini le vizualizm cade sau n timpul scrierii pe disc acesta rmne fr spa iu; Erori de programare: de exemplu o secven de instruc iuni nu i face treaba corect, se face o mp ire cu zero, se ncearc referirea unui element de tablou inexistent etc. n limbaje de nivel nalt tradi ionale erorile sunt tratate prin utilizarea unor coduri de eroare ce trebuie testate nainte de a continua execu ia programului. La nivel de pseudocod o astfel de aplica ie are forma: Tratarea erorilor n limbaje tradi ionale (C, Pascal)
cod_de_eroare1=0 grup de instruc iuni1 dac (cod_de_eroare1 0) atunci { instruc iuni pentru tratarea erorii 1 } cod_de_eroare2=0 grup de instruc iuni2 dac (cod_de_eroare2 0 atunci { instruc iuni pentru tratarea erorii 2
}

Tratarea erorilor n Java


try { grup de instruc iuni1 grup de instruc iuni2 } catch(cod de eroare1) { instruc iuni pentru tratarea erorii 1 } catch(cod de eroare2) { instruc iuni pentru tratarea erorii 2 }

113

Acest mod de programare a problemei erorilor intercaleaz instruc iunile de program cu cele de tratare a erorilor. Problemele ce apar din aceast cauz sunt: ! programul nu este lizibil (se citete greu), se modific greu, iar depanarea lui este dificil; ! viteza aplica iei scade deoarece dup fiecare grup de instruc iuni care ar putea genera erori intervine testul prin care se decide ntre continuarea rulrii aplica iei sau tratare a erorii. n Java termenul de excep ie (exception) arat c, datorit unei probleme, o instruc iune nu s-a putut executa n condi ii normale de ctre JVM. JVM detecteaz automat aceste situa ii oprind i terminnd imediat execu ia programului. Numele de excp ie vine de la faptul c dei a aprut o problem situa ia nu este frecvent (adic regula, este execu ia normal, iar eroare este situa ia excep ional). Limbajul Java separ detaliile de tratare a erorilor (instruc iuni pentru tratarea erorii ) de secven a de instruc iuni care le-ar putea genera (grup de instruc iuni1) codul devenid n acest lizibil. try (ncearc) nsemn c la nivel de cod se ncerc ceva ce ar putea genera o excep ie, iar catch (prinde) nsemn c excep ia respectiv este tratat printr-un grup de instruc iuni specifice. Fie urmtoare aplica ie Java:
public class ExMat { public static void main(String[] args) { int a, b, c; for (int i = 0 ; i < 7 ; ++i ) { a = (int) ( Math.random() * 10 ); b = (int) ( Math.random() * 4 ); System.out.print( i + ") " + a + "/" + b ); c = a / b; // linia 8 - aici apare exceptia System.out.println( "=" + c ); } } }

Rezultatele afiate de aceasta la o rulare ar putea fi:


0) 7/2=3 1) 6/1=6 2) 9/3=3 3) 7/1=7 4) 5/2=2 Exception in thread "main" java.lang.ArithmeticException: / by zero at ExMat.main(ExMat.java:8) 5) 8/0Process exited with exit code 1.

Corpul ciclului for se reia de cel mult 7 ori (i = 0, 1, 2, ..., 6), totui pentru i = 5 (la cea de a 6-a reluare) aplica ia crap la execu ia liniei 8 (c = a / b) cu mesajul de eroare java.lang.ArithmeticException: / by zero . n limbajele tradi ionale, ntoarcerea unui cod de eroare nu implic i obligativitatea testrii acestuia. Fie schema urmtoare: Prinderea erorilor n limbaje tradi ionale (C, Pascal)
metoda1 7 Eroarea se prinde aici Cod de eroare metoda2 Cod de eroare metoda3 W Eroarea apare aici metoda3 W metoda2 Cod de eroare Excep ia apare aici

Prinderea erorilor n Java


metoda1 7 Ex. se prinde direct Cod de eroare

114

Aici avem metoda1 care apeleaz metoda2 i care apeleaz metoda3. ntr-un limbaj tradi ional, dac eroarea apare n metoda3 aceasta v-a fi luat n considerare numai dup ce se revine din metoda2 n metoda1. Aici apar dou probleme: ! prima const n faptul c eroarea nu este tratat atunci cnd apare ci atunci cnd exist posibilitatea ca aceasta fie tratat deci, eroare i codul de tratare a acesteia, sunt desincronizate; ! a doua problem const n volutariatul tratrii acesteia, adic tratarea ei este lasata la latitudinea programatorului, aceasta nefiind obligatorie. n Java, prin mecanismul de interceptare a excep iilor, aceste probleme nu mai apar astfel: ! atunci cnd apare o excep ie, JVM transfer controlul direct pro iunii de cod care trateaz excep ia; ! dac o metod a generat o excep ie (thrown an exception), aceasta nu se poate ignora, ea trebuie prins i tratat undeva, altfel compilatorul semnaleaza eroarea (except ie fac erorile din timpul execut ie aplicat iei). -

115

Clasificarea exceptiilor n Java -

! !

Orice exceptie este un obiect creat folosind o subclasa a clasei de baza 7 7 java.lang.Throwable; subclasa Error include erorile din care nu se mai poate reveni - programul se termina; 7 subclasa Exception include erorile din care se poate reveni - corectarea situatie execptionale se face n rutina de tratare a erorii (exception handler)

n Java, excep ia este un obiect care se instan iaz pe baza unei subclase a clasei java.lang.Throwable. Ierarhia de clas are dou subclase mari: Error i Exception. Subclasa Error corespunde unor situa ii de erori deosebit de grave, mediul rmne fr memorie sau are o eroare intern. Programatorul nu poate face mare lucru n aceste situa ii, cel mult poate for a terminarea aplica iei ntr-o manier elegant, n locul celei abrupte. Clasa Exception este cea pe care programatorul o utilizeaz uzual n situa ia n care programul nu se poate rula n condi ii normale. Aceasta are la rndul ei mai multe subclase dintre ele, RuntimeException, este utilizat des. O RuntimeException apare din cauza unei erori de programare, orice alt excep ie apare ca urmare a unor cauze externe care opresc programul din execu ie (de exemplu, datele de intrere nu sunt introduse corect). Excep iile din subclasa RuntimeException sunt tratate diferit de celelalte de ctre compilator. Orice alte erori se prind i se trateaz dup cum urmeaz. 116

Tratarea erorilor n Java


! secventa de try { //cod care poate genera erori instructiuni ce } pot genera erori catch(tipexceptie1 ob) { //rutin pentru tratarea excep iei 1 se cuprind } catch(tipexceptie2 ob) { ntr-un bloc //rutin pentru tratarea excep iei 2 } try; pentru fiecare . . . exceptie se finally { //cod de executat nainte de terminarea folosete un // blocului try } bloc catch pentru tratarea ei; daca este cazul, orice prelucari finale se fac 7 7 n blocul finally

Instruc iunile unei metode care urmez s fie monitorizate pentru excep ii trebuie cuprinse n blocul format dintre acoladele instruc iunii try. Instruc iunea try con ine un grup de instruc iuni, numite i bloc, ce urmeaz s fie executate. Dac o problem apare ntre instruc iuni atunci se genereaz o excep ie (generarea are ca efect ntreruperea execu iei codului i saltul la codul de tratare a excep iei). Prinderea excep iei generate se face folosind clauza catch, iar tratarea ei prin codul cuprins ntre acoladele respectivului catch. Prin tipexceptie se n elege tipul excep ie care a generat eroarea. O instruc iune try poate avea orice numr de clauze catch. Programatorul are posibilitatea ca o excep ie de un anumit tip s o prind i s o trateze prin rearucarea ei ca i o nou excep ie. O alt posibilitate ar fi ca excep ia s nu fie tratat la nivelul metodei n care aceasta a aprut. n aceast situa ie excep ia este pasat metodei apelante (metoda din care s-a apelat metoda n care a aprut excep ia). n general, dac o excep ie nu este tratat n metoda apelat aceasta este pasat metodei apelante. Aceast procedur de propagare a excep iei se repet pn cnd se ajunge la metoda main. Dac nici aici excep ia nu este tratat atunci aplica ia se termin brusc i anormal. Excep iile sunt obiecte generate automat de JVM n situa ii de eroare.

catch
Clauza catch se declar cu parametru, acesta specificnd tipul de execp ie care va fi tratat. Tipul parametrului trebuie s fie obligatoriu Throwable sau o subclas a lui. Cnd apare o excep ie toate clauzele catch asociate acestuia sunt parcurse, dac se gsete un parametru de catch de aceli tip cu cel al obiectului excep ie generat n try se vor executa instruc iunile corespunztoare acelui bloc 117

catch.

throw
Utilizatorul poate genera manual excep ii prin folosirea instruc iunii throw (ea se folosete pentru regenerarea unei excep ii n exemplu urmtor). Forma general a instruc iunii este throw obiectThrowable. Existe dou metode pentru crearea unui obiect Throwable, prin folosirea unui parametru n catch sau prin folosirea operatorului new ( de exemplu, throw new InputMismatchException("*** Prea ... 1 numar real. ***");). La atingerea acestei instruc iuni codul se oprete din execu ie, orice instruc iuni urmtoare ne mai fiind executate, execu ia fiind transferat celui mai apropiat try. Aici se verific dac exist un catch ce are aceai tip cu cel al excep iei, dac nu se trece la umtorul try etc.

throws
Dac o metod ar putea genera o excep ie pe care nu o trateaz trebuie s specifice acest comportament ctre metoda apelant. Pentru aceasta n declara ia metodei se se folosete clauza throws urmat de o list a tipurilor posibile de excep ii. Procedura este obligatorie pentru toate tipurile de excep ii mai pu in Error i RuntimeException. Forma general a declara ie de metod ce include clauza throws este: tip nume_metod(list_de_parametri) throws list_de_excep ii { //corp metod }

finally
La generarea unei excep ii execu ia secven ial a programului se ntrerupe continundu-se cu un grup de salturi. n func ie de anumite condi ii, este posibil s revenim prematur dintr-o metod, aceast situa ie poate genera probleme uneori. Pentru pstratea continuit ii execu ie codului a fost creat instruc iunea finally. Ea definete un bloc de instruc iuni care se execut ntotdeauna, indiferent dac excep ia a fost sau nu prins, dup un try - catch. Instruc iunea este utilizat, tipic, pentru a face cur enie dup try ( nchiderea unor fiiere i eliberarea unor resurse alocate nainte de revenirea din metodele generatoare de excep ii).
Este obligatoriu ca o instruc iune try s aib asociat o instruc iune catch sau una finally .

Aplicatia 1 - try, catch, throw, throws


Aplica ia ce urmeaz este format din dou fiiere Functie.java i TestExceptii.java. Ea trebuie s evalueze valoarea unei func ii F(x) definit n metoda F din clasa Functie.

118

Aceast metod genereaz excep ie de tipul ArithmeticException . Excep iile sunt generate deoarece pentru x = -2 expresia x/(x+2) nu se poate calcula, iar pentru x 0 (4.5, 5] radicalul are argumentul negativ. Metoda citeste_real() se folosete pentru a citi o valoare numeric real (sau ntreag) de la tastatur. Reluarea citirii se face de cel mult 3 ori, dup care aplica ia se oprete deoarece se genereaz o eroare ca nu este prins n aplica ie. n aceast situa ie aplica ie afieaz starea stivei pentru a putea determina precis linia i codul n care a aprut eroarea. Clasa Functie.java:
import java.util.*; public class Functie { public double F(double x) throws ArithmeticException{ if (x < 1.) { if (x == -2.) throw new ArithmeticException("Impartire cu 0"); return x/(x+2); } else if (x <= 5.) { if (x > 4.5) throw new ArithmeticException("Argument radical negativ."); return Math.sqrt(4.5-x); } else return Math.sin(x)/x; } public double citeste_real() throws InputMismatchException { Scanner in = null; int contorErr = 0; //contor erori, pt. 3 aplicatia se opreste. double x; while(true) { in = new Scanner(System.in); try { x = in.nextDouble(); break; //daca nu sunt erori se iese din ciclu } catch (InputMismatchException e) { ++contorErr; System.out.printf("Eroare(%d) la citire, trebuie sa introduci o valoarea reala.\n", contorErr); if ( contorErr == 3 ) throw new InputMismatchException("*** Prea prost ca sa bage 1 numar real. ***"); } } return x; } }

Clasa TestExceptii.java:
public class TestExceptii { public static void main(String[] args) {

119

Functie F1 = new Functie(); double x1, x2; System.out.print("x1="); x1 = F1.citeste_real(); System.out.print("x2="); x2 = F1.citeste_real(); for(double x=x1;x<=x2;++x) { try { System.out.printf("%6.3f %10.7f\n",x, F1.F(x)); } catch (ArithmeticException e) { System.out.printf("%6.3f %s\n",x, e); } } } }

Rezultate posibile:
x1=-7 x2=7 -7.000 1.4000000 -6.000 1.5000000 -5.000 1.6666667 -4.000 2.0000000 -3.000 3.0000000 -2.000 java.lang.ArithmeticException: Impartire cu 0 -1.000 -1.0000000 0.000 0.0000000 1.000 1.8708287 2.000 1.5811388 3.000 1.2247449 4.000 0.7071068 5.000 java.lang.ArithmeticException: Argument radical negativ. 6.000 -0.0465692 7.000 0.0938552 Process exited with exit code 0. sau: x1=werw Eroare(1) la citire, trebuie sa introduci o valoarea reala. werw Eroare(2) la citire, trebuie sa introduci o valoarea reala. wrwe Eroare(3) la citire, trebuie sa introduci o valoarea reala. Exception in thread "main" java.util.InputMismatchException: *** Prea prost ca sa bage 1 numar real. *** at Functie.citeste_real(Functie.java:36) at TestExceptii.main(TestExceptii.java:8) Process exited with exit code 1.

Se poate observa cum aplica ia, dei ntlnete situa ii excep ionale, nu se termin brusc i abrupt, ci ca urmare a tratrii acestora, ajunge s se termine normal.

120

Propagare exceptiei codului apelant


! se folosete public double F(double x) throws ArithmeticException { throws n . . . throw new ArithmeticException("/ cu 0"); declaratia . . . metodei; } nu avem public static void main(String[] args) { . . . un bloc for(double x=x1;x<=x2;++x) { catch try { System.out.printf("%6.3f %10.7f\n",x, F1.F(x)); pentru } catch (ArithmeticException e) { exceptie; System.out.printf("%6.3f %s\n", x, e); } este un } catch n metoda apelanta care prinde exceptia. 7 -

n aplica ia 1 se prezint modul n care o excep ie aprut la nivelul metodei F este propagat n metoda main, de unde se realizeaz apelul lui F prin linia F1.F(x) . Metoda main poart denumirea de cod apelant, iar metoda F de cod apelat. Deoarece metoda apelat nu prinde excep ia ci o las s se propage declara ia acesteia con ie pe throws ArithmeticException . n general, dac am dori ca i metoda apelant s realizeze propagarea excep ie mai departe i declara ia ei ar trebui s con in pe throws ArithmeticException . Conceptual, propagarea erorii n codul apelant se face atunci cnd la nivel local, n codul apelat, nu putem da o interpretare clar a problemei aprute.

121

Generarea manuala a unei 7 exceptii ! exceptia se public double F(double x) throws ArithmeticException { genereaza 7 . . . throw new ArithmeticException("/ cu manual cu . . . throw new } obExceptie() ; n declaratia metodei se folosete throws. -

0");

Generarea manual a unei excep ii predefinite n ierahia de excep ii Java sau a unei definite de utilizator se face cu instruc iune throw. Orice excep ie generat n acest fel trebuie pus i n clauza throws a metodei. Dac se vor genera mai multe excep ii dintr-o metod, toate numele respectivelor excep ii trebuie scrise n list, separate prin virgul. Exist ns i excep ii care nu trebuie puse n list i anume Error, RuntimeException. Motivul pentru care aceste nu trebuie scrise explicit const n numrul mare de situa ii (JVM rmne fra memorie, mpr ire cu zero, indice de tablou ilegal etc.) n care ele pot s apar n diferite por iuni de cod. Aceasta ar implica scrierea lor n fiecare declara ie de metod pentru fiecare por iune de cod. Conform celor spuse n loc de public double F(double x) throws ArithmeticException se poate scrie mai scurt doar public double F(double x) deoarece ArithmeticException este o subclas a lui RuntimeException. Generarea manual a unei excep ii permite ca la prinderea unei excep ii s se genereze n locul acesteia o alta. Un cod tipic este: catch (exceptie1 e) { throw new exceptie2( ... ); } Aici s-a prins excep ia excep ie1, ns n codul de tratare a excep iei se genereaz o alta, i anume excep ie2.

122

Crearea unei exceptii noi ! o exceptie noua se 7 creaza prin 7 extinderea clasei Exception.
public class ExceptiiAritmetice extends Exception{ private String mesaj; public ExceptiiAritmetice(String m) { super(m); mesaj = m; } public String toString() { return "\nExceptie: " + mesaj; }

Programatorul poate s-i creeze propriile excep ii prin extinderea clasei Exception. La crearea unei subclase a lui Exception programatorul are deja o nou clas func ional n care nu trebuie s implementeze nimic. Exception nu definete metode noi, ns le motenete de la Throwable. Nu este cazul extinderii clasei RuntimeException deoarece ea este creat pentru a lucra cu erori comune ce nu trebuie tratate explicit mai mult dect sunt deja. Extinderea excep iilor are rost n situa ia unor particularit i specifice ale aplica iei.

Aplicatia 2 - extindere Exception Aplica ia care urmeaz perint modul n care se extinde clas Exception la clasa ExceptiiAritmetice .
public class ExceptiiAritmetice extends Exception{ private String mesaj; public ExceptiiAritmetice(String m) { super(m); mesaj = m; } public String toString() { return "\nExceptie: " + mesaj; } } public class TestEx2 { public static int cat(int a, int b) throws ExceptiiAritmetice { if (b == 0) throw new ExceptiiAritmetice("Imparire cu zero!"); return a / b; } public static void main(String[] args) { int a, b, c; a=1; b=0; System.out.print(a + "/" + b ); try { c = (int)cat(a,b); System.out.println( "=" + c ); } catch (ExceptiiAritmetice e) { System.out.println(e); } } }

123

Tablouri (arrays)
! ! ! tabloul este o colectie de elemente de acelai tip; un element poate stoca o singura valoare; 7 elementele se identifica unic 7 printr-un numar ntreg numit 7 indice; tipul elementelor poate fi simplu sau obiect; numarul de elemente de 7 tablou se fixeaza n momentul 7 crearii acestuia. 7

! !

Tabloul este o colect ie de date, numite i elemente ale tabloului, identice ca tip - tipul se mai numete i tip de baz - ce pot fi identificate unic prin indice. Numrul de dimensiuni ale tabloului depinde de limbaj, dar n general, nu este limitat. Se zice c un tablou este multidimensuional dac foloset mai mul i indici pentru accesarea unui element de tablou. Mai sus se prezint modul de reprezentate a dou tablouri, unul de ntregi (tipul de baz este int) i unul de obiecte (tipul de baz este Coordonate). O variabil de tip primitiv - un scalar - poate fi privit ca un tablou cu dimensiunea zero. Un tablou cu o singur dimensiune este cunoscut sub numele de "vector", iar unul cu dou dimensiuni sub denumirea de "matrice". n majoritatea limbajelor imperative, o referin la un element de tablou se scrie sub forma a[i,j] unde, a este numele tabloului, iar i i j sunt indexuri. Elementele tabloului sunt de obicei stocate n loca ii de memorie consecutive. Limbajele difer de obicei prin metoda de stocare a datelor pe rnduri continue sau pe coloane continue. Tablourile sunt folosite pentru stocarea unui grup de valori care priimesc un singur nume i care se vor accesa ntr-o ordine imprevizibil (de exemplu, o structur de dat numit list se preteaz mult mai bine pentru stocarea unor valori care se acceseaz secven ial).

124

Etapele lucrului cu tablouri


! declararea tabloului: int []a; crearea unui obiect tablou: a = new int[4]; initializarea tabloului: int[] a = {1, 7, 23, 1}; indicele 0 [0, nr_elem-1] > altfel apare exceptia array index out of bounds accesul la un element: a[indice]

Pentru a putea utiliza un tablou cu tipul de baz dintre cele primitive trebuie s: ! declarm o variabil de tipul tablou avnd nume_tablou, ce v-a stoca o referin ctre tablou prin: tip [] nume_tablou; sau tip nume_tablou []; n acest moment nume_tablou se init ializeaza cu valoarea speciala null; aceasta valoare se modifica la adresa tabloului dupa utilizarea operatorului new; ! crea tabloul folosind operatorul new specificnd lungimea acestuia (numarul maxim de m elemente pe care l poate stoca); lungimea trebuie sa fie o valoare ntreag de tipul int (constant sau expresie care se calculeaz n momentul rulrii aplica iei) ! init ializa tabloul cu valori diferite de cele cu care acesta se init ializaeza implicit de catre Java. m Valorile de ini ializare implicit pentru tablouri: char \u0000 - Unicode 0000 (Java folosete codificarea Unicode) boolean false byte, short, int, long 0 float, double 0.0

Dei un tabloul este un obiect, nu exist o clas de tipul tablou. Java creeaz automat o clas pentru fiecare tablou de tipuri primitive sau de clase. Pentru a afla numrul de elemente dintr-un tablou folosim nota ia nume_tablou . length .

125

Aplicatia 1 - tablou de tipul int, citire i afiare


Aplica ia urmtoare exemplific modul de citire i de afiare a elemtelor unui taboul. Tabloul are numele a i numrul maxim de elemente fixat la 5. Valorile sunt citite de la tastatur iar afiarea se face prin dou metode.
import java.util.Scanner; import javax.swing.*; public class TablouPrimitive { public static void main(String[] args) { final int NRELEM = 5; //lungimea tabloului int [] a; //declararea tabloului Scanner intrare; String iesire = "Indice\tValoarea element\n"; intrare = new Scanner(System.in); a = new int[NRELEM]; //crearea tabloului; //citire elemente tablou for(int i = 0; i < a.length;++i) { System.out.print("a[" + i +"] = "); a[i]= intrare.nextInt(); //pt. cea de a 2-a metoda de afisare iesire+= i +"\t"+ a[i] + "\n"; } //metoda 1: afisare simpla de elemente tablou for(int i = 0; i < a.length;++i) System.out.println(a[i]); //metoda 2: afisare cu fereastra de dialog JTextArea fereastraiesire = new JTextArea(); fereastraiesire.setText(iesire); JOptionPane.showMessageDialog(null,fereastraiesire,"indice tablou", JOptionPane.INFORMATION_MESSAGE); } }

valoare

Rezultate:
a[0] a[1] a[2] a[3] a[4] 12 45 33 21 108 = = = = = 12 45 33 21 108

126

Etapele lucrului cu tablouri de obiecte


! declararea tabloului: PunctOK puncte[]; //sau PunctOK[] puncte;

crearea unui obiect tablou: puncte = new PunctOK[3];

initializarea obiectelor din tablou: puncte[i] = new PunctOK(i,2*i);

n situa ia lucrului cu tablouri de obiecte, etapele sunt indentice cu cele descrise la tablourile de primitive, cu excec ia c aici ini ializarea elementelor de tablou este obligatorie i nu op ional.

Aplicatia 2 - tablou de obiecte, initializare i afiare Aplica ia are la baz clasa PuncteOK. Se creeaz un tablou de obiecte PuncteOK cu numele puncte. Ini ializarea obiectelor din tablou se face n ciclul for cu linia puncte[i] = new PunctOK(i,2*i);. Rezultatele afiate se ob in prin ini ializarea fiecrui obiect PuncteOK cu x = i i y =2*i.
public class TablouObiecte { public static void main(String[] args) { //declarare tablou PunctOK puncte[];

127

//creare tablou de obiecte puncte = new PunctOK[3]; for(int i = 0; i < puncte.length;++i) { //initializarea obiectelor din tablou puncte[i] = new PunctOK(i,2*i); } //afisarea elementelor de tablou for(int i = 0; i < puncte.length;++i) System.out.println(puncte[i]); } }

Rezultate:
<0.0,0.0> <1.0,2.0> <2.0,4.0>

Aplicatia 3 - sortarea crescatoare a 7 elementelor unui tablou


// Sortarea crescatoare a unui tablou de intregi import javax.swing.*; public class sortTab { int a []; //tabloul int asort[]; //clona int n; //numarul de elemete de tablou sortTab(int n) { this.n = n; //tabloul initial a = new int[n]; //tabloul sortat asort = new int [n]; //generam aleator n numere de la 0 la 100 //de tipul int si le stocam in a for(int i=0; i<n ; ++i) a[i] = (int)(100*Math.random()); //copiem tabloul a in asort try { System.arraycopy(a,0,asort,0,n); } catch(ArrayStoreException e) { System.out.println(e); } } //sortarea public void bubbleSort( ) { boolean esteinterschimbare = true; while (esteinterschimbare) { esteinterschimbare = false;

128

for ( int i = 0; i < asort.length-1; ++i ) { if ( asort[i] > asort[i+1] ) { swap(asort,i,i+1); esteinterschimbare = true; } } } } //interschimbarea a 2 elemente de tablou private void swap( int tablou[], int i, int j ) { int aux; aux = tablou[i]; tablou[i] = tablou[j]; tablou[j] = aux; } //afisare tablou initial public String afisare(String txt) { String rez; rez = txt; for (int i=0; i<a.length; ++i ) rez += " " + a[ i ]; return rez; } //afisarea tablou sortat public String afisaresort(String txt) { String rez; rez = txt; for (int i=0; i<asort.length; ++i ) rez += " " + asort[ i ]; return rez; }

public static void main(String args[]) { sortTab st; String rez; st = new sortTab(17); rez = st.afisare("a Tablou initial:\n"); st.bubbleSort(); // sortare tablou rez += st.afisaresort("\n\nasort - Tabloul cu elementele sortate:\n");

JTextArea ferRez = new JTextArea(); ferRez .setText( rez ); JOptionPane.showMessageDialog(null, crescatoare",JOptionPane.INFORMATION_MESSAGE); } }

rez,

"Sortare

129

Exceptii ntlnite la tablouri ! utilizarea unei indice n afara domeniului permis genereaza exceptia 7 ArrayIndexOutOfBoundsException: int [] a = new int[7]; System.out.println(a[13]); (n exemplul anterior indicele poate fi n domeniu 0 - 6 = 7-1) ! accesarea unor membri unui element obiect care nca nu a fost initializat genereaza 7 7 exceptia NullPointerException: puncte = new PunctOK[3]; System.out.println(puncte[0].x()); (n exemplul anterior 0 0 [0, 2], dar nu s-a folosit new punct[0] pentru crearea unui obiect PunctOK)

130

Tablouri multidimensionale
! ! ! un tablou multidimensional este un tablou de tablouri; pentru accesarea elementelor de folosesc mai multi indici; declararea i crearea unui tablou cu 2 dimensiuni (matrice): tip [][] numetablou = new tip[nl][nc]; int [][] a = new int[4][2]; a[0][0] = 1; a[0][1]=3; ! intializare: int[][] a = { {1,3}, {0,0}, {0,0}, {0,0} }; declarare i initializare fara specuficarea 7 7 numarului de coloane: 7 tip [][] numetablou = new tip[nl][]; numetablou[il] = new tip[nc];

131

Aplicatia 1 - crearea unui tablou cu numar variabil de coloane 7


n aplicat ia care urmeaza lungimea liniilor din matrice este diferita adica variaza de la linie la linie. ,
public class TabMulti { public static void main(String[] args) { int tab2d [][] = new int [4][]; tab2d[0] = new int[5]; tab2d[1] = new int[2]; tab2d[2] = new int[4]; tab2d[3] = new int[7]; int k = 0; for(int i=0; i < tab2d.length; ++i) for(int j=0; j < tab2d[i].length; ++j) tab2d[i][j] = k++;

for(int i=0; i < tab2d.length; ++i) { for(int j=0; j < tab2d[i].length; ++j) System.out.print(tab2d[i][j]+" "); System.out.println(); } } }

Rezultate:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

132

Você também pode gostar