Sunteți pe pagina 1din 132

1

Introducere n Java

Ce este Java?
!
!
!

Proiectat de Sun pentru programarea aparaturii


electronice
Limbaj orientat pe obiect cu biblioteci de clase
Foloses-te o mas-ina 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 s-i a
independent-ei de platforma, Java a trecut de bariera industriei aparaturii electronice la aplicat-iile de
Web, apoi la aplicaii locale i client-server
Biblioteci de clase
Java cont-ine o mult-ime de clase predefinite s-i 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/ies-ire s-i comunicat-ie n ret-ea.
Java mai cont-ine un numar de utilitare care ajuta la dezvoltarea aplicat-iilor. Aceste utilitare trateaza
operat-ii cum snt: depanarea, descarcarea s-i instalarea, documentarea.
Foloses-te Mas-ina Virtuala Java
Unul dintre punctele forte ale lui Java este independent-a de platforma (mas-ina + sistem de operare). O
aplicat-ie Java scrisa pe o platforma poate fi dusa s-i rulata pe orice alta platforma. Facilitatea este deseori
referita ca write once, run anywhere (WORA). Ea este data de folosirea Mas-inii Virtuale Java - Java
Virtual Machine (JVM). Aceasta ruleaza pe o mas-ina locala s-i interpreteaza codul de bit-i (byte code)
convertindu-l ntr-un cod mas-ina specific platformei.

Echipa lui Gosling a pornit de la C++, dar programele nu erau sigure, parte a complexitat- ii limbajului, dar s- i datorita unor facilitat- i distructive
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- ina virtuala pentru rularea programelor. Des- i Oak a fost
proiectat sa semene cu C++ pentru a reduce timpul de nvat- are, el a fost reproiectat intern pentru a elimina pericolele s- i elementele redundante
ale lui C++. Oak nu a reus- it sa se impuna n domeniul pentru care a fost creat, dar, dupa aparit- ia WWW-ului s- i-a gasit un nou drum pe care sa
evolueze. Oak a fost redenumit n Java (exista deja un limbaj cu numele Oak). Robust, compact, independent de platforma s- i flexibil a devenit ideal
pentru crearea de aplicat- ii Web. Fiind interpretat este mai lent ca C++, dar scaderea vitezei este neimportanta atunci cnd domeniul de utilizare
este cel de interact- iune cu utilizatorul.

Avantaje Java
!
!
!
!
!

Orientat pe obiect
Interpretat s-i independent de platforma
Dinamic s-i distribuit
Cu fire de execut-ie multiple
Robust s-i sigur

Orientat pe obiect
Obiectul este o entitate caracterizata prin atribute s-i 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-i caracterele).
Interpretat s-i independent de platforma
Programele Java snt interpretate n setul de instruct-iuni ale mas-inii 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 s-i 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 s-i distribuita.
Cu fire multiple de execuie (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 s-i a aflat sub controlul JVM care este dependent de
platforma.
Robust s-i sigur
Java are facilitat-i interne de prevenire a coruperii memoriei. Java gestioneaza automat procesul de
alocare a memoriei s-i verificarea limitelor tablourilor. Interzice aritmetica poantorilor s-i 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
execuia unor instruct- iuni din mai multe surse independente de execut- ie. Diferent- a fat- a de multitasking consta ntr-o partajare mai profunda
a mediului de execut- ie la nivel de thread-uri n comparaie cu multitasking-ul. Thread-urile pot fi identificate numai prin registrul numarator
de prorame (PC) s- i registrul poantor la stiva (SP) atunci cnd partajeaza un singur spat- iu de adrese s- i o singura mult- ime de variabile globale. Acesta
este motivul pentru care comutarea ntre-thread-uri se face foarte repede deoarece informat- ia de stare de salvat s- i de refacut este scurta.

Independent- a de platforma
7
!
!
!

Codul Java este stocat n fis-iere .java


Programul .java este compilat n fis-iere .class
Codul de bit-i 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 mas-ina al platformei pe care are loc compilarea. Programul compilat poate fi rulat
numai pe mas-ini care au acelas-i 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 fis-iere cu extensia .java. De exemplu, o aplicat-ie Java care
gestioneaza student-ii unei sect-ii ar putea cont-ine fis-erele studenti.java, materii.java s-i
note.java. Fiecare fis-ier .java este compilat ntr-un fis-ier .class cu acelas-i nume. De exemplu,
studenti.java se va compila n studenti.class. Fis-ierele .class cont-in cod executabil
Java numit cod de bit-i (bytecode) care are instruct-iuni mas-ina independente de platforma.
Mas-ina Virtuala Java (JVM - Java Virtual Machine)
Mas-ina Virtuala Java asigura mediul de execut-ie pentru programele Java. JVM interpreteaza codul de
bit-i n instruct-iuni mas-ina native ale mas-inii pe care programul este n curs de rulare.
Aceleas-i fis-iere .class pot fi rulate fara modificare pe orice platforma pentru care exista o JVM. Din
acest motiv JVM este uneori numita s-i procesor virtual.
Se numete compilator un program care convertete un alt program, dintr-un limbaj numit surs n limbaj main (unicul limbaj neles 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 existena erorilor
de tip), generare de cod (aici se va obine 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 aplicaia final. De

exemplu, n cazul operaiilor de intrare/ieire, compilatorul va genera apeluri catre funciile 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 aplicaie s funcioneze n contextul respectivului sistem
de operare, compilatorul va trebui s lege respectivele poriuni ale sistemului de operare la programul tradus. Operaia 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 uniti centrale care extrage
i execut instruciuni 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 bii cu ajutorul lui javac apoi, acest cod intermediar
este rulat pe interpretorul codului de bii, 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 bii). Deci, n Java programul sur trece prin analiza lexical, sintactic
generarea de cod intermediar, apoi interpretare pentru a obine relutate.

Securitatea mediului Java


Limbaj s-i compilator
nca rca torul de clase (Class Loader)
Verificatorul codului de bit-i (Bytecode verifier)
Interfat-a local restrictiva

Nivele de securitate n Java


Limbaj s-i compilator
Limbajul este sigur prin proiectare. Construct-iile care permit manipularea directa a poantorilor au fost
eliminate pentru evitarea erorilor n execut-ie s-i a fragmentarii memoriei.
nca rca torul 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 mas-inii cauta mai nti referint-ele la clasele locale s-i 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 fis-iere local s-i 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 fis-iere
local, sistemul de securitate lanseaza un dialog cu utilizatorul.

Miniaplicat- ii Java (Applets)


!
!
!
!

Cele mai vechi tipuri de aplicat-ii


Folosite n pagini HTML
Pot include cont-inut activ (formulare, imagini, sunet,
filme)
Vizualizate n navigator s-i pot comunica cu un server

Miniaplicat-ii Java
O mare parte din popularitatea lui Java pornes-te de la posibilitatea dezvoltarii unor aplicat-ii mici
(applets, n engleza) care pot fi nglobate n pagini HTML s-i descarcate prin ret-ea atunci cnd pagina
este vizualizata ntr-un navigator de Web.
Exista doua tipuri de miniaplicat-ii Java: cu s-i fara ncredere (trusted s-i 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 miniaplicat-iilor
Miniaplicat-iile snt de natura grafica, tinznd sa cont-ina controale cum snt butoanele, cutiile de text,
listele de select-ie. Totus-i, miniaplicat-iile pot sa faca mult mai mult dect simpla afis-are a unor controale
(obiecte de interfat-a grafice). Iata o lista cu cteva dintre posibilitat-ile miniaplicat-iilor:
!
vizualizarea de animat-ii, imagini s-i 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 dezvoltarii de standare n programarea orientata pe obiect. CORBA
specifica condit- iile n care un obiect respecta specificat- iile OMG, n principiu, specificat- iile descriu standardul de interfat- a pentru aceste
obiecte.

Aplicat- ii Java
!

Crearea de aplicat-ii de sine stttoare:


G JVM ruleaza aplicat-ii independente
G nu se ncarca clase prin ret-ea
Crearea de aplicat-ii client-server:
G deserves-te mai mult-i client-i dintr-o singura sursa
G se ncadreaza n modelul multi-nivel pentru
calcule pe Internet.

Aplicat-ii Java de sine stttoare


Des-i, Java s-i-a cs-tigat popularitatea datorita miniaplicat-iilor, e posibila s-i crearea unor aplicat-ii de sine
statatoare (nu este nevoie de un navigator pentru rularea lor). Acestea sunt oarecum echivalentul
programelor executabile din C i C++.
Aplicat-ii client
Miniaplicat-iile Java pot fi rulate pe un sistem de operare local sub forma unor aplicat-ii de sine
statatoare. Acest mod de lucru este specific dezvoltarii de aplicat-ii client (aplicaia este descarct de
pe un server dar rulat n navigator, care este clientul serverului de Web) s-i este, uzual, fara restrict-iile
de securitate specifice miniaplicat-iilor. De exemplu, aplicat-iile Java pot accesa sistemul local de fis-iere
sau sa stabileasca conexiuni cu alte mas-ini prin ret-ea. Miniaplicat-iile pot beneficia de aceste facilitat-i
doar daca au fost nregistrare ca snt de ncredere; restrict-ia previne coruperea sistemului local de fis-iere
de catre miniaplicat-ii malit-ioase. Caracteristici adit-ionale ale miniaplicat-iilor de ncredere snt:
!
accesul la sistemul de fis-iere local;
!
accesul la o mas-ina 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.
Aplicat-ii sever
Aplicat-iile Java pot fi, de asemenea, rulate pe o mas-ina 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. Aplicaia server ruleaz n mod continuu pe server i trimite un rspuns unui
client ca urmare a unei cerei efectuate de acesta.

Rularea aplicat- iilor Java


Sistem de operare

Navigator

JVM

JVM

Aplicat-ie

Miniaplicat-ie

Rularea aplicat-iilor 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 s-i l convertes-te n instruct-iuni mas-ina specifice platformei. Rularea programului se face plecnd
de la metoda statica numita main() pentru o aplicat-ie de sine statatoare sau printr-o referint-a la o clasa
de miniaplicat-ie dintr-un fis-ier 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 cites-te o pagina HTML cu marcajul de miniaplicat-ie (<applet>) ve descarca miniaplicat-ia prin
ret-ea pe sistemul local s-i va porni miniaplicat-ia n JVM care vine inclusa n navigator.

Funct- ionarea JVM


!
!
!

ncarcatorul de clase al JVM ncarca clasele necesare


fuct-ionarii aplicat-iei
Verificatorul JVM verifica secvent-ele ilegale de cod de
bit-i
Gestionarul de memorie al JVM elibereaza memoria
dupa terminarea aplicat-iei

ncarca torul de clase al JVM


Rularea unui fis-ier cu extensia .class poate necesita s-i 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 foloses-te
variabila de sistem CLASSPATH pentru determinarea pozit-iei fis-ierelor 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 s-i 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-i ca acesta este dintr-o sursa de ncredere. Validarea asigura inexistent-a violarii
accesului la memorie sau execut-ia unor act-iuni ilegale.
Gestionarea memoriei
JVM urmares-te 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 numes-te colectare de gunoi (garbage collection).

10

Compilatoare JIT (Just-in-Time)


!
!
!

Cresc performant-ele
Utile daca acelas-i cod de bit-i se executa repetat
Optimizeaza codul repetitiv (ciclurile)

Compilatoare JIT
JVM traduce codul de bit-i Java n instruct-iuni native al mas-inii pe care se ruleaza. Ce se petrece daca
acelas-i 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 acelas-i 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 mas-ina 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 mas-inii pe care se ruleaza
aplicat-ia.

11

Java s-i calculul pe Internet


!

Calculul pe Internet are loc pe 3 nivele:

Java poate fi utilizat pentru oricare dintre aceste nivele

Java s-i calculul pe Internet


Produsele firmelor serioase pentru calcule pe Internet trebuie sa suporte construct-ia de componente Java
pentru trei nivele de aplicat-ie, precum s-i instrumete pentru esent-iale pentru dezvoltare s-i gestiune a
alicat-iilor. Suportul se implementeaza sub forma de instrumente, aplicat-ii, baze de date, servere de
aplicat-ii s-i interfet-e pentru progrmarea aplicat-iilor.
Nivelul client
Atunci cnd Java trebuie sa fie rulat pe o mas-ina 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 s-i
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-i executa cod Java, n particular acest cod
manipuleaza intensiv date sau fort-eaza reguli de validare specifice datelor.

Termenul de client-server apare n contextul sistemelor distribuite. Aplicat- ia distribuia este o colect- ie de aplicat- ii a caror distribut- ie este
transparenta la nivelul utilizatorului astfel nct la aplicat- ia pare sa fie stocata pe o singura mas- ina locala. ntr-o ret- ea de calculatoare
utilizatorii simt ca lucreaza pe o mas- ina particulara, iar pozit- ia lor n ret- ea, stocarea datelor ncarcarea s- i funct- ionalitatea mas- inii lor nu
este transparenta. Sistemele distribite folosesc, uzual, o anumita forma de organizare cliet-server.
Clientul este o aplicat- ie sau un proces care solicita un serviciu de la un alt calculator sau proces, denumit server. Server-ul este o aplicat- ie care
furnizeaza 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
foloses- te un protocol pentru codificareea cererilor clientului s- i al rapsunsurilor server-ului. Server-ul poate sa ruleze continuu n as- teptarea cererilor
sau sa fie pornit de o aplicat- ie care controleaza un grup de server-e. Acest model permite plasarea clent- ilor s- i a serevr-elor independent, n nodurile
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 cont-ine:
! Compilator
! Componenta de vizualizare a miniaplicat-iilor
! Interpretor al codului de bit-i
! Generator de documentat-ie

Componentele Sun JDK sunt:


!
compilatorul java javac, el compileaza codul sursa Java n codul de bit-i (bytecode)
Java;
!
appletviewer este componenta pentru vizualizarea miniaplicat-iilor, aceasta
cites-te un document HTML, descarca miniaplicat-iile referite n document s-i le afis-eaza
ntr-o fereastra proprie. Se foloses-te 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 documentat-ie n format HTML pe baza codului sursa Java este
javadoc.
Alte scule JDK
!
depanatorul de clase Java este jdb (asemanator cu depanatoarele dbx sau gdb din
UNIX);
!
javakey pentru generarea cheilor de certificare s-i 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 Miniaplicaii
T Intrare/Ieire
T Comunicaie n reea

Pachete Java
Pachetele asigura bazele pentru funct-ionarea lui Java s-i 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 s-i 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 s-i miniaplicat-iile Java, cteva mai
importante sunt:
Pachet Java

Rol

Clase incluse

java.lang

Colecia claselor de baz din Java.


Conine rdcina ierarhiei de clase
Java, Object, definiiile tuturor
tipurilor primitive etc.

Object, String, Thread,


Runtime System

javax.swing

Window, Button, Menu,


Graphics

java.applet

Clase pentru suportul scrierii


miniaplicaiilor.

Applet, AudioClip

java.io

Colecia de clase de intrare/ieire


(inclusiv pentru accesul la fiiere)

File, InputStream,
OutputStream

java.net

Socket, DatagramPacket,
URL, InetAddress

14

mpacheta
7 ri, platforme i
versiuni Java
mpacheta ri:
!
!
!

J2SE - Java 2 Platform, Standard Edition


J2EE - Java 2 Platform, Enteprise Edition
J2ME - Java 2 Micro Edition

Platforme (SO + UCP):


!

Solaris, Windows ... + SPARC, Intel ...

Versiuni:
!

Java release 1.0, 1.1; Java release 2, versiunea 1.2, 1.3,


1.4, 1.5, 1.6

mpacheta ri Java
Tehnologia Java bazata pe JVM este strucurata pe trei tipuri de produse proiectate n funcie de cerinele
particulare ale pieei de software:
!
J2SE - Java 2 Platform, Standard Edition: se folosete pentru applet i aplicaii care
ruleaz pentru un singur calculator;
!
J2EE - Java 2 Platform, Enteprise Edition: pentru aplicaii client/server distribuite;
!
J2ME - Java 2 Micro Edition: pentru crearea de aplicaii care ruleaz pe un dispozitiv
consumator (PDA, telefon celular etc.).
Fiecare pachet de tehnologii Java are o ediie 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

Procesor

Solaris OE

chip SPARC pe 32 bii

Microsoft Windows

chip Intel pe 32 de bii

Solaris OE

chip SPARC pe 64 de bii

15

Sistem de operare
Linux

Procesor
Intel

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 coninea maina virtual Java, bibliotecile de clase i instrumentele specifice pentru dezvoltare
(compilator etc.) aplicaiilor. Evoluia versiunilor de limbaj este prezentat n tabelul urmtor:
Versiune

An

JDK 1.0

1996

JDK 1.1

1997

JDK 1.2 (cunoscut i sub denumirea de Java 2)

1998

JDK 1.3

2000

JDK 1.4

2002

JDK 1.5 (cunoscut i sub denumirea de Java 5)

2004

JDK 1.6 (Java 6)

2006

ncepnd cu JDK 1.2 toate versiunile au fost numite, pe scurt, Java 2. n timpul evoluiei lui Java,
modificrile aduse limbajului iniial au fost puine, 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 dorina 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 aplicaiilor. n afar de JDK,
mai nou, Sun furnizeaz, i separat componentele (JVM i bibliotecile) necesare rulrii de aplicaii Java
(fr posibilitatea dezvoltrii de aplicaii) sub denumirea de JRE (Java Runtime Environement).

16

2
Instalarea, configurarea JDK
J2SE i rularea unei aplicat- ii
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 documentaie
(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 conine 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. Deschidei 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 verificai 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 documentaiei Java


Fiierele care conine 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. Documentaia este coninut 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 funcie de versiune)
*) bin (compilator java i alte instrumente de dezvoltare)
*) demo (exemple de aplicaii Java)
*) docs (documentaia bibliotecile n HTML, dup decomprimarea lui jdk-6-doc.zip)
*) include (fiiere pentru compilarea metodelor native)
*) jre (fiierele mediului de execuie Java)
*) lib (fiierele de bibliotec)
*) src (fiierele surs de bibliotec, dup decompimarea lui src.zip)

20

Etapele genera
7 rii unei aplicat- ii
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 coninutul lui Salut1.class de pe disc n


RAM
Verificatorul codului de bii se asigur c sistemul de securitate Java
nu este violat
Interpretorul citete din RAM i traduce codul de bii n limbaj
main i l execut.

Etapele necesare rulrii unei aplicaii 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 ali dezvoltatori. n continuare se prezint o aplicaia 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.

Coninutul 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
nelegerea codului Java explicnd rolul unor secvene 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 diferena ntre scrierea cu litere mari i mici. Dac n loc de main se va scrie Main aplicaia
nu se va rula.

public se numete modificator de acces , acesta permite definirea controlul accesului altor poriuni
de program la aceast poriune de cod.
class reprezint nceputul unei declaraii de clas i este urmat de numele clasei (mai sus,
Salut1). Orice aplicaie Java trebuie conin cel puin o singur declaraie 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 instaniere. Starea unui obiect este stocat n
variabilele membri, iar comportamentul ei se implementeaz prin metode.
{ - acolada deschis marcheaz nceputul corpului declaraiei de clas i va avea ntotdeauna
corespondent o acolad nchis - } ce marcheaz terminarea declaraie de clas. Poriunea 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 ).
Prezena parantezei spune compilatorului Java c main este o metod i nu o alt construcie 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
aplicaiei 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 bii - dar
pentru o citire i nelegre mai uoar se prefer cea de a dou scriere - cu spaii i pe mai multe linii):
{
System.out.println(

"Salut !"

);

}
Aici acoladele marcheaz nceputului i terminarea corpului metodei main. Metoda are o singur
instruciune care folosete un pachet de intrare/ieire pentru afiarea n fereastra din care s-a rulat
aplicaia 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 instruciune Java. Clasa System este din pachetul java.lang i conine, printre altele, metode
pentru interaciune 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

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
instrucie ;.

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
conine codul de bii al aplicaiei.
Rularea aplicaiei Java
Deoarece codul de bii 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 aplicat- ii


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 convenii 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 conine declaraiile de clas.

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

23

Variabile
!
!
!
!

Variabila = nume dat unui grup de locaii 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 iniializate 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 iniial]; ce se citete, variabila cu numele Nume se declar de tipul
Tip. Declaraia leag (asociaz) de numele variabilei un grup de caracteristici. Variabila poate fi
declarat n orice locaie 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 declaraie sunt:
Numele variabilei este formula prin care variabila este identificat n textul aplicaiei Java.
Valoarea variabilei este coninutul locaiilor de memorie alocate n RAM. Modul de interpretare al
locaiilor este determinat de tipul variabilei.
Tipul asociat unei variabile prin declaraie determin mulimea valorilor i a operatorilor ce pot aciona
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.
Persistena definete intervalul de timp din execuia aplicaiei 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 poriunea de cod din care un nume de variabil este recunoscut de compilator.
n afara acestei poriuni de cod utilizarea respectivului nume va genera o eroare de sintax. Pentru
variabilele declarate n interiorul unui bloc, vizibilitatea ncepe din locul declaraiei i se termin la
acolada de nchidere a blocului. Este posibil ntr-un bloc intern acelai numele de variabil s fie
redeclarat, situaie n care vizibilitatea numelui extern nu o include pe cea a numelui intern.
Iniializarea 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 conine i cifre, dar nu
spaii 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

Greit - Y

a x1 masa x2 masa$ideala masa_ideala

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 persistena lor este restrns la respectiva poriune 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 spaiu 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 declaraia:
int i = 5;
Aceasta declar o variabil cu numele i de tipul int i care are valoarea iniial 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 excepia cazului cnd aceasta este iniializat
explicit, se leag n timpul rulrii aplicaiei. Se zice c ele sunt legate dinamic (dinamic binding).

25

Cuvinte cheie rezervate


Tipuri
primitive

boolean
byte
char
double
float
int
long
short
void

Modificatori

Instruct-iuni

abstract
final
native
private
protected
public
static
synchronized
transient
volatile

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

false
null
true

Tipuri
definite de
utilizator
class
extends
implements
interface
throws

import
package

instanceof
new
super
this

Se numete gramatic o mulime de definiii 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
constituenilor dintr-o propoziie. 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 mulime de simboluri terminale care fac parte
din sintaxa limbajului Java. Restricia 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 intefeele: 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

Spaiu alocat

Domeniu de valori

byte

1 octet

-128 la 127

short

2 octei

-32,768 la 32,767

int

4 octei

-2,147,483,648 la 2,147,483,647

long

8 octei

-9,223,372,036,854,775,808 la -9,223,372,036,854,775,807

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

Spaiu
alocat

Domeniu de valori

Precizie

float

4 octei

aproximativ 3.40282347E+38F

7 zecimale

double

8 octei

aproximativ 1.7.9769313486231570E+308

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 bii (2 octei).
Primele 256 de caractere corespund cu mulimea 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
condiii locice. Nu se poate converti la o valoare ntreag
Tipuri de date definite de utilizator
Clasele, intefeele, 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

- reali:
(Implicit
double)
!

0xff 0X1FF
022L 0x1FFFL

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

(int n baza 16)


(long)

(double)
(double)
(float)

nenumerici:
- booleeni:

true false

- caracter:

a \n \077 \u005F

- ir:

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 declaraii 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 iniializare este n afara domeniului admis.
Linia 2: Este omis terminatorul de instruciune (;) de la sfritul declaraiei.
Linia 5: Declaraia 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 aplicaii ce folosesc declaraii de variabile locale i pachete Java diferite pentru a calcula masa
ideala n funcie de vrsta i nalinea 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);
}
}

31

masaideala,"Masa

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 convenie, 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 situaia 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 . Declaraia ei se scrie n afara metodelor clasei
i va fi de forma:
public static final double PI = 3.1415926535;

32

Comcepte de programare
orientata
7 pe obiect
Abstractizare L
Clas L

Instaniere L
Obiect L

Trecerea de la realitate la un model (o


simplificare a realitii)
Tip de dat definit de utilizator ce
realizeaz ncapsulare a datelor
(cmpuri) i a operaiilor (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

Soluionarea unei probleme implic izolarea ei de realitate. Se numete abstractizare procesul prin care
se elimin detaliile realitii fiind pstrate numai acele aspecte ce se consider a fi relevante pentru
soluionarea problemei. Prin procesul de abstractizare se obine un model al realitii. Activitatea de
trecere de la acest model la universul sistemului de calcul folosit pentru n scopul obinerii rezultatelor
poart denumirea paradigm sau metodologie (tehnologie) de programare.
n paradigma programrii orientate pe obiect, modelarea realitii de face prin conceptul de obiect.
Obiectul este o abstractizare unei realiti. Realitatea poate s fie palpabil (ceva fizic) sau o idee (un
concept) a crei stare trebuie reprezentat. Obiectul este o unificare ntre datele i mulimea operaiilor
ce pot fi efectuate cu acestea. Utilizatorul unui obiect nu trebuie s cunoasc tipurile de date
reprezentate n obiect ci doar operaiile prin care acestea se pot modifica, se zice c reprezentarea
intern a datelor este ncapsulat (ascuns) de exterior, dar poate fi manipulat prin operaii specifice.
Clasa descrie un model sau un ablon de stare i de comportament pentru obiecte. Definiia 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. Definiia 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 iniial a oricrui obiect din
clas(Punct() i Punct(double abscisa, double ordonata));
!
metode: funcii 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 bii
! relaionali
! booleeni

Variabilele i constantele se folosesc pentru stocarea datelor la nivelul aplicaiei. Operatorii sunt
caractere speciale prin care Java este anunat despre operaia ce trebuie s o fac cu operanzii asupra
crora acioneaz. 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 obine ca urmare
a evalurii unei expresii.
Operatorii aritmetici
Operatorii aritmetici realizeaz operaiile aritmetice de baz (adunare, scdere, nmulire i mprire)
cu operanzii. Pot fi utilizai pentru toate tipurile numerice.
Operatorii pe bii
Operatorii pe bii permit interaciunea cu reprezentarea intern pe bii ale tipurilor numerice ntregi
permind aciunea la nivel de bit. Dac operatorii aritmetici trateaz o valoare numeric unitar, cei pe
bii permit modificarea individual a fiecrui bit din valoarea ntreag.
Operatorii relaionali
Operatorii relaionali permit compararea a dou valori. Rezultatul comparaiei este bolean i poate fi
utilizat pentru setarea unor valori sau pentru controlul execuiei programului.
Operatori booleeni (logici)
Operatori booleeni pot fi utilizai 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 aciune poart
denumirea de efect secundar, n englez side effect. n cazul operatorului = , denumirea este forat
deoarece aici efectul de modificare este cel primar. Java are ns o clas ntreag de operatori care
produc efecte secundare ce vor fi discutai n continuare (atribuirea compus).
Atribuirea poate fi i multipl, situaie n care asociativitatea operatorului de atribuire este de la dreapta
la stnga.

38

Operatorii aritmetici
Realizeaz operiile 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
NMULIRE
MPRIRE
RESTUL MPRIRII

Operanzii unei operaii 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 operaii vor fi evaluate nainte de adunare i scdere;
!
parantezele rotunde modific prioritatea evalurilor aritmetice, aceasta ncepnd de la
parantezele cele mai interioare;
!
mprirea ntre ntregi ntoare rezultat ntreg (eventuala parte zecimal este ignorat);
!
mprirea ntreag cu 0 genereaz o excepie;
!
mprirea real cu 0. ntoarce infinit (Double.POSITIVE_INFINITY,
Double.NEGATIVE_INFINITY) sau rezultat nenumerice (Not A Number
Double.NaN).

Aritmetica numerelor ntregi


Toate operaiile aritmetice se fac cu tipurile int sau long, valorile byte, char sau short fiind
automat promovate la int nainte de efectuarea operaiilor, 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 octei) mai scurt se primete o eroare la compilare. Terminologia folosit n
situaia n care se dorete stocarea unei valori de un tip ntr-o variabil de un alt tip se numete forare
de tip (type casting). Forarea 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 forare de tip - asa merge, dar pot
// aprea ciudenii
dac, b1 i b2 iau valoarea 120 fiecare, rezultaul va fi incorect. Forarea de tip face ca reprezentarea pe
bii a valorii s fie copiat din surs n destinaie. Dac rezultatul nu ncape n destinaie se pierd date.

39

Promovarea s-i fort- area de tip


Conversie: Trecerea de la o reprezentare intern a unui tip
de date la o alta.
Promovare: conversie ctre un tip cu domeniu mai larg
Forare: 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
spaiul alocat pentru stocarea rezultatului. Cel mai des compilatorul va recunoate pierderea preciziei
i nu va permite compilarea programului, exist ns i cazuri cnd rezultatul obinut va fi incorect.
Pentru rezolvarea acestei probleme tipurile asociate variabilelor trebuie s fie promovate ctre tipuri
cu un domeniu mai larg sau convertite forat 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 funcioneze 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.
Soluia problemei, prin schimbarea tipului lui n3, este:
int n1 = 102;
int n2 = 13;
int n3;
n3 = (n1 + n2);

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

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

Fie declaraia:
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 locaie de memorie temporar.
Dimensiunea locaiei 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 nmulete dou tipuri int, locaia
va avea dimensiunea unui tip int, adic 32 de bii (4 octei). Dac cele dou valori care se nmulesc
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 locaia de memorie
temporar. Acest fel de calcul va conduce, n final, la rezultat incorect pentru c variabila care va stoca
rezultatul va conine valoarea trunchiat (indiferent de tipul folosit pentru variabila ce va stoca
rezultatul). Pentru rezolvarea acestei probleme, cel puin 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 /
Observai c nu se fac promvri automate ntre tipul boolean i orice alt tip de dat.
Forarea de tip
Forarea de tip este o conversie ce scade domeniul n care poate lua valori variabila prin modificarea
tipului variabilei. Situaia apare atunci cnd, de exemplu, o valoarea long este convertit la una int.
Aciunea 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 forare
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. Obesrvai c utilizarea
parantezelor rotunde este obligatorie.

O soluie pentru exemplul prezentat prin forarea 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

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

La forarea conversiei de la tipul float sau double, care au parte fracionar, 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 situaiile necesare n practic este realizarea mpririi reale ntre numere ntregi. Codul care
urmeaz exemplific utilizarea forrii 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 conine 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 promovai 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 condiiile n care:
!
c se declar de tipul (int c);
!
se foreaz 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 circumstane, valorile atribuite tipurilor reale
42

sunt implicit de tipul double, cu excepia 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 foreaz conversia lui 23.5 la tipul float prin: float f1 = (float)23.5;

43

Incrementarea s-i decrementarea


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 necesitile curente la nivelul aplicaiilor este aceea de adunare sau de scdere a lui 1 din
valoarea unei variabile. Rezultatul poate fi obinut sprin folosirea operatorilor + i - dup cum urmeaz:
varsta = varsta + 1;
zileconcediu = zileconcediu - 1;

Totui, incrementarea sau decrementarea sunt operaii att de comune nct exist opratori unari (au un
singur operand) specifici n acest scop: incrementarea (++) i decrementarea (--). Ei pot fi scrii n faa
(pre-increment, pre-decrement) sau dup (post-increment, post-decrement) o variabil. n forma
prefixat operaia (incrementarea sau decrementarea) este realizat nainte de orice alte calcule sau
atribuiri. n forma prefixat, operaia 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

Exemplu

Comentarii

pre-increment (++variabila)

int i = 5;
int j = ++i;

i este 5 i j este 6.

post-increment (variabila++)

int i = 5;
int j = i++;

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.

pre-decrement (--variabila)

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

i este 5 i j este 4.

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 locaie temporar, ns aceast valoare nu va fi folosit n
continuarea evalurii expresiei. Dup evaluarea ntregii expresii valoarea din locaia temporar este
crescut cu 1 i atribuit lui a.
n concluzie, incrementarea i decrementarea sunt operatori unari (acioneaz 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 relat- ionali (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 relaionali, unori numii i de comparare a expresiilor, se folosesc la testarea unor condiii
ntre dou expresii i ntorc un rezultat de tipul boolean. Sintaxa general a unei comparaii este:
rezultat = expresie1 operatorrelational expresie2
Operator
relaional

Denumire

true dac

false dac

<

Mai mic

expresie1 < expresie2

expresie1 >= expresie2

<=

Mai mic sau egal

expresie1 <= expresie2

expresie1 > expresie2

>

Mai mare

expresie1 > expresie2

expresie1 <= expresie2

>=

Mai mare sau egal

expresie1 >= expresie2

expresie1 < expresie2

46

Operator
relaional
==
!=

Denumire

true dac

false dac

Egal

expresie1 == expresie2

expresie1 != expresie2

Inegal (Diferit)

expresie1 != expresie2

expresie1 == expresie2

Deseori, operatorii relaionali 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 aplicaiile specifice ale operatorului == este evitarea erorii de mprire cu zero. Pentru
aceasta expresia cu care urmeaz s se mpart este testat dac are valoarea 0, dac este 0 mprirea
este evitat, altfel mprirea 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 relaionali
cu

fr scurtcircuitare

nume

&&

&

||

SAU INCLUSIV

SAU EXCLUSIV

NU

int i=1, j=2, k=3;


boolean rez=true;
rez = (i<j) & (i==1); // false
rez = !rez; // true

Operatorii logici, uneori numii 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 funciile logice: AND (I), OR (SAU) i NOT (NU). Funciile 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
combinaiile posibile ale operanzilor mpreun cu rezultatele corespondente operatorului logic.
Expresiile care conin 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 celorlai 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 situaii n care scurtcircuitarea poate
produce rezultate ciudate, de exemplu fie expresia func1() && func2(), dac funcia func1()
va ntoarce rezultatul false funcia 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

Tabel de adev|r pentru

S- I

SA U

&&

false

true

||

false

true

false

false

false

false

false

true

true

fals

true

true

true

true

Tabel de adev|r pentru SA U

49

EXCLUSIV

false

true

false

false

true

true

true

false

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

Denumire

NU unar pe bii

&

I pe bii

SAU (INCLUSIV) pe bii

SAU EXCLUSIV pe bii

>>

deplasarea la dreapta

>>>

deplasarea la dreapta cu completare cu 0

<<

deplasare la stnga

n calculatoare, se numete bit (binary digit), cea mai mic unitate de informaie a crei valoare se
poate stoca. Operatorii pe bii (bitwise) trateaz operanzii sub forma unui ir de bii i nu sub forma
unui singure valori n baza 10. irurile se obine prin transcrierea numerelor din baza 10 n baza 2.
Operatorii pe bit-i acioneaz asupra celui de al N-elea bit al operanzilor folosind o funcie boolean
pentru a genera un rezultat la nivelul aceluiai bit N. De exemplu dac dorim s facem & (I) pe bii
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 biii corespunztori aceleiai poziii se face & pe bii 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

22

21

20

14(10)

0(2)

7(10)

1(2)

50

Valoarea n baza 10

14(10) & 7(10)

Valorile bitului N (baza 2)


Bit "3"

Bit "2"

Bit "1"

Bit "0"

23

22

21

20

0(2)

14(10) & 7(10) d, n final, valoarea 6(10).


Asemenea operatorilor logici i cei pe bii se definesc cu ajutorul tabelelor de adevr.
Tabelele de adevr pentru operatorii & , | , ^ i ~:
a

a&b

a|b

a^b

~a

I pe bii, adic operatorul &, produce 1 numai dac ambii operanzi sunt 1.
SAU pe bii, adic operatorul |, produce 0 doar dac ambii bii sunt 0.
SAU EXCLUSIV pe bii, adic operatorul ^, produce 1 dac exact unul dintre operanzi este 1.
NU pe bii, adic operatorul ~, inverseaz toii biii 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
toi biii lui valoare cu un numr de poziii (puteri ale lui 2) specificat n numar. Pentru fiecare
poziie deplasat bitul cel mai semnificativ se pierde, iar bitul cel mai puin semnificativ se completeaz
cu valoarea 0. Deplasarea la stnga cu o poziie corespunde nmulirii cu 2 a lui valoare.
Deplasarea la dreapta, adic operatorul >>, are forma valoare >> numar i deplaseaz la dreapta
toi biii lui valoare cu un numr de poziii (puteri ale lui 2) specificat n numar. La fiecare
deplasarea la dreapta cu o poziie biul cel mai puin semnificativ se pierde, iar noua valoarea care se
obine mprirea la 2 a valorii iniiale (restul se pierde). Bitul cel mai semnificativ, care stocheaz
semnul numrului, n urma deplasrii la dreapta trece i el la dreapta, iar poziia 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 toi biii lui valoare cu un numr de poziii (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 excepia 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 biilor (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 bii), valoarea -14(10) se codific prin 11110010(2). Se pleac de la 14 n baza 10, care
n binar este 00001110, apoi se inverseaz biii i se obine 11110001, la aceast valoare se adun 1 i
rezult 11110010. Pentru a decodifica un numr negativ se vor inversa biii lui, apoi la valoarea obinut
se adun 1. Pentru -14(10), care n binar este 11110010, trebuie s reinem semnul "-", apoi, dup
inversarea biilor se obine 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 obinut, caz n care se obine
100000000. Bitul de 1 obinut ns nu mai poate stocat ntr-un byte deoarece el are spaiu numai
pentru 8 bii, iar rezultatul are 9 bii, rezultatul final fiind primii 8 bii, adic 00000000. Deoarece Java
folosete complementul fa de 2 pentru reprezentarea numerelor negative unii operatori pe bii 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). Operaiile pe bii 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.
Iniial, aceti operatori facilitau compilarea mai eficient a codului. Fie secvena de cod:
int a =
int b =
b = b +
b += a;

1;
2;
a; //adunare traditionala
//adunare compusa

n varianta "tradiional" 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 locaia 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 toi 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 muli operatori consecutivi
de aceeai prioritate, atunci se aplic regula asociativitaii
Utilizarea parantezelor rotunde redefinete prioritile
Prioritate

Simbol

Asociativitate

++ + - ~ ! (tip)

operatori unari

de la dreapta la stnga
(DS)

*/%

nmulire mprire rest

de la stnga la dreapta
(SD)

+-+

adunare scdere concatenare

SD

<< >> >>>

deplasri (>>> completare cu 0)

SD

< > <=


>=instanceof

relaionali

SD

== !=

Egalitate

SD

&

I logic / pe bii

SD

SAU EXCLUSIV logic / pe bii

SD

SAU logic / pe bii

SD

10

&&

I logic

SD

11

||

SAU logic

SD

12

?:

Operatorul condiional

DS

13

= op=

operatorii de atribuire

DS

n Java orice expresie are un tip (primitiv sau referin-t a) determinat n faza de compilare. n cazul unor
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 consistena
operaiilor 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 (nmulire) i diviziune (mprire), evaluai de la stnga
la dreapta;
!
+, -: operatorii de adunare i scdere, evaluai de la stnga la dreapta.
n tabelul anterior, precedena cea mai mare este notat cu 1, iar cea mai sczut cu 13.
n cazul n care expresiile conin operatori aritmetici, care apar alturai 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 precedena 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 toi operatorii Java.
Dac o expresie are mai muli operatori consecutivi de aceeai preceden se va aplica regula
asociativitii 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

S- iruri de caractere n Java


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

String

String s; //declaratia unei variabile ir


String sal = Salut; //decl. cu iniial.
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
documentaia JDK.

Compilatorul Java aloca spaiu pentru literalii ir n memorie iar operatorul de atribuire va stoca adresa
respectiv n variabila ir. Din acest motiv, testarea egalitii 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 coninutul
respectivelor locaii.
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 coninutului unei variabile
ir trebuie s crem un ir nou.

63

4
Instruct- iunile limbajului Java

64

Rularea programelor
Programele sunt alctuite din instruciuni.
Implicit, instruciunile se ruleaz secvenial.
Exist situaii n care se fac devieri de la rularea secvenial:
! Decizia sau ramificarea: if, switch
! Ciclul: do, for, while
! Saltul sau transferul: break, continue, apel de metod
O aplicaie Java este format din instruciuni. Procesul prin care JVM ndeplinete o instruciune se
numete rulare sau execuie. n Java terminarea rulrii unei instruciuni se poate face cu succes, cu
excepie sau cu eroare.
O instruciune este format din una sau mai multe expresii care se ruleaz ca o singur aciune. De
exemplu x = 5 este expresie, n timp ce x = 5; este deja o instruciune. O expresie terminat n
caraterul ; se numete instruciune, iar caracterul ; se numete terminator de instruciune. Tot
i ns truciuni
sunt:
x
=
5.3*(4.1/Math.cos(0.2*y));
res pect i v
System.out.println(x);. Instruciuni sunt inclusiv declaraiile simple sau multiple, cu sau fr
iniializare. Instruciunile vor fi plasate n clase pentru alctuirea aplicaiei funcionale.
Implicit, aplicaia Java ncepe din metoda main, iar instruciunile se ruleaz secvenial, adic de sus
n jos, n ordinea scrierii lor n aplicaie pna la terminarrea rularii tutror instruciunilor. n situaia unei
aplicaii complexe rularea poate devia de la prelucrarea secvenial astfel, exist posibilitatea ramificrii
la nivelul rulrii unor poriuni de cod pe baza unor condiii (if, switch), repetarea unui grup de
instruciuni atnt timp ct o expresie de control este adevrat (while, do while, for), saltul de
la o instrucine la o alta n program (break, continue).

65

SECVENT- A
Secvena este alctuit din:
! instrunciuni simple
! blocuri numite i instruciuni compuse
Instruciune simpl: expresie;
Blocul

grup de instrunciuni cuprinse ntre acolade


{ }

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

Instruciunea if
Permite ramificarea rulrii n aplicaie 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 instruciune simpl instructiune1
!
dac valoarea expresiei boleene este false
se ruleaz instruciunea simpl
instructiune2
Poriune cu else este opional, dac este omis
atunci nu se va rula nimic n situaia n care
expr_boleana ia valoarea false
Dac se dorete ca instrucunea if s aib efect asupra unui grup de instruciuni acestea trebuie puse
nt-un bloc. Blocul ne permite ca n locul unei instruciuni simple Java s avem voie s scriem un grup
de instruciuni 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 instruciunile simple din if este


la rndul ei un if
if (expr_boleana1)
if (expr_bolenan2)
instructiune1
[else
instructiune2]
[else
instructiune3]

Dac este cazul instruciunile if pot fi imbricate (cuprinse una n alta). Deoarece partea de else este
opional se poate ajunge la situaia n care pune problema aparteneei 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 condit- ional ? :


!
!

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 condiional. Primul operand (expr_boleana) trebuie s fie
o expresie bolean (de exemplu o condiie), al doilea operand (expr1) este valoarea pe care expresia
condiional o ntoarce dac expresia bolean ia valoarea true. Al treilea operand (expr2) este
valoarea expresiei condiionale 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 condiional ia
valoarea Admis. , atfle ia valoarea Respins..
O aplicaie 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,
secvena 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 egalitii (= =) 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 instruciune 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;]
}

Instruciunea 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, secvenial, cu expresiile
constante (expr_consti) care eticheteaz
instruciunile instructiunei. Dac s-a gsit
egalitate rularea ncepe de la instruciunea
urmtoare (cea care vine imediat dup cele : ale
lui case) i ine pn la ntlnirea unui break,
moment n care rularea se coninu cu
secventa B. Dac nu se gsete nici o
egalitate rularea va continua cu instruciunile
urmtoare etichetei default. Eticheta
default este opional, dac aceasta lipsete
switch-ul nu va face nimic n lipsa gsirii unei
egaliti.
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 instruciuni de ciclare:
while
do while
for
toate ciclurile au 4 poriuni:
# iniializarea
# test de continuare
# corpul
# iteraia

Denumirea de ciclare sau iteraie se folosete pentru a descrie rularea repetat a unui grup (bloc) de
instruciuni pn cnd o anumit condiie ajunge s fie ndeplinit. Ciclarea este caracterizat printr-o
mulime de condiii iniiale, o condie de terminare i un pas de iterare.
Iniializarea
Const n atribuirea de valori iniiale 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
instrucinilor 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 secvena urmtoare ciclului.
Corpul
Este o singur instruciune simpl sau una compus care va fi
reluat pn la ndeplinirea condiiilor 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 instruciunii de ciclare. Trebuie s realizeze
avansul ctre condiia 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

Aplicat- ia 1 - while
Cunoscndu-se valoarea depunerii iniiale 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.
Spaiul datelor
Estre mulimea variabilelor foloite pentru reprezentarea i soluionarea cerinei impuse.
Numele
variabilei

Semnificaie

Tipul

Valoarea iniial

depunere

valoarea depunerii iniiale

double

dat de intrare

dobandaan

valoarea dobnazii anuale

double

data de intrare

scop

valoarea ce se dorete a fi atins

double

dat de intrare

cont

valoarea curent n cont

double

depunere

luni

rezultat: numrul de luni necesar atingeriui


scopului

int

Spaiul transformrilor
Este dat de mulimea operaiunilor efectuate asupra spaiunlui de date pentru gsirea soluiei.
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 nmulete cu aceast valoare se obine 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 aplicaiei
Descrierea n cuvinte a soluiei:
Citete scop
Citete depunere
75

Citete dobandaan in %
// iniializri
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

Aplicat- ia 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.
Spaiul datelor
Numele
variabilei

Semnificaie

Tipul

Valoarea iniial

notaElev

media unui elev

int

data de intrare obinut


prin conversie

contorElev

numr elevii pentru care s-au citi mediile

int

total

suma mediilor elevilor citite de la tastatur

int

mediaClasa

rezultat: media aritmetic a clasei

double

sirNota

nota introdus de la tastatur sub form


unui ir de caractere

String

data de intrare

Spaiul 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 soluiei:
//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 condiia 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 excepia c expresia de reluare
a ciclului conditie se evalueaz dup ce corpul a fost rulat o dat. Instruciunea se utilizeaz atunci
cnd corpul ciclului trebuie rulat cel puin o singur dat.

79

Aplicat- ia 1 - do while
Acesta este o implementare folosind ciclul do while a aplicaie 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 poriuni 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 pas-i: se evalueaza init ializare, aceasta se face
o singura data la intrarea n ciclu (nu s-i la reluarea acestuia); se trece, apoi, la evaluatea lui conditie,
aceasta condi-t ie de reluarea a ciclului este indentica cu cea de la while, ea se evalueaza la fiecare
reluare, inclusiv dupa ini-t alizarea lui; daca conditie la evaluare da true se trece la rularea lui
instructiune dupa terminarea execu-t iei corpului se trece la evaluarea lui iteratie din acest
moment reluarea se face de la evaluarea lui conditie dupa scenariul deja descris. Partea de
ini-t ializare poate con-t ine s-i declara-t ii, din acest punct de vedere urmatoarele cicluri sunt echivalente
ca s-i 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 initializare se termina odata cu terminarea ciclului for.


Componentele initializare , conditie s-i iteratie sunt op-t ionale, dar caracterele ; care
le separa sunt obligatorii. initializare s-i iteratie pot sa con-t ina o lista de expresii separate
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-t ializarea con-t ine doua expresii prin care i ia valoarea 1 s-i j valoarea lui i,
iar iteraia (avansul) consta n incrementarea lui i s-i modificarea lui j la produsul dintre valoarea lui
curenta s-i ce a lui i.
n exemplul al doilea () expresia de ini-t ializare a fost omisa s-i mutata nainte de nceperea ciclului
for. Observa-t i ca prezen-t a lui ; este obligatorie.
n cel de al treilea () exemplu este omisa s-i expresia de iteraie, dar ea a fost inclusa n corpul forului. Observa-t i ca, s-i n acest caz, prezen-t a lui ; este obligatorie.
n cel de al patrulea () exemplu toate cele trei expresii au fost omise. Lipsa lui conditie fiind
interpretata ca s-i true rezultatul este un ciclu infinit. Crearea unor astfel de cicluri ar fi absurda daca
nu ar exista o posibilitate de a le parasi (instruc-t iunea break este cea care permite ies-irea for-t a-t a unui
ciclu s-i 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 condiia 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 instruciune vid.


Eroarea
while nu are, asemenea lui for, interaia (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 obine 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 iniializat. Iteraia este continuat ct timp i este mai mic ca 10. Caracterul
; face ca instruciunea 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
instruciune urmtoare;
permite ieire prematur, deci i forat din cicluri

while (true) {
System.out.println(i);
if (i >= 20) //iesire pt. i>=20
break;
++i;
}
. . .
Instruc-t iunile de ciclare prezentate (while, do while, for) realizau testul pentru reluare sau
terminare la nceputul sau la sfrs-itul 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-t iunea break.
Sintaxa instruc-t iunii este:
break;
Parasirea ciclului, prin combinarea lui if cu break, se va putea face atunci cnd o anumita condi-t ie
este ndeplinita. Controlul va fi predat imediat instruc-t iunii care care urmeaza, secven-t ial, ciclului.
Exista grupuri de programatori care evita folosirea lui break deoarece instruc-t iunea nu este stric
necesara la scrierea aplica-t iilor. Aplica-t ia anterioara ar putea fi modificata asttfel:
while (i <= 20) {
. . .
}
pentru evitarea scrierii lui break.
O instruc-t iune break termina instruc-t iunea de ciclare n corpul careia este scrisa. Exista nsa
posibilitatea realizarii unor cicluri imbricate (un ciclu este n corpul altui ciclu). Utilizarea unui break
n aceasta situa-t ie va duce la terminarea unui singur ciclu, s-i anume, a celui din corpul caruia face parte
break-ul. Pentru parasirea mai multor cicluri se poate folosi instrc-t iunea break etichetata care va
fi prezentata imediat.
84

Saltul cu continue
!
!

se poate utiliza numai n cicluri


abandoneaz interaia 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-t iuni, exista situa-t ii n care un grup
de instruc-t iuni se dores-te a fi sarit, fara nsa a parasi ciclurile. n acest scop Java pune la dispozi-t ia
programatorului instruc-t iunea continue. Aceasta poate fi folosita numai n cicluri s-i are ca efect
continuarea execu-t iei unui ciclu ncepnd cu etapa urmatoare execu-t iei complete a corpului acestuia
(expresia de test pentru reluare corpului la while s-i do while sau interaie la for). Itera-t ia
curenta este abandonata s-i se trece la intera-t ia urmatoare. Secvena de cod prezentat permite
determinarea anilor bisec-t i. Itera-t ia n cazul n care anul este divizibil cu 100 dar nu este cu 400 este
sarita folosind continue dupa cu se vede mai sus.

85

break s- i continue etichetate


!
!
!

se utilizeaz n cazul ciclurilor imbricate


permit saltul n afara ciclului curent
eticheta este un nume dat instruciunii 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 ies-irii definitive dintr-o astfel de situa-t ie sau
de continuare a ciclului n care ciclul curent este imbricat. break s-i 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-t iune urma toare etichetei. Pentru continue saltul se face la
urmatoarea itera-t ie a ciclului marcat prin eticheta.
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-t iunea marcata cu afara2:. Acesta este ciclul for
(k=0; k<=3; ++k) .... Pentru acest break valoarea lui k pleaca ntotdeauna de la 0. Linia
continue afara1; faca ca linia de afis-are a mpar-t irii sa fie omisa, iar continuarea se face cu un
j actualizat. Des-i break s-i 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 s-i greu de depanat.
86

Aplicat- ia 1 - for
S se scrie o aplicaie 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

Observai 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. Aplicaia 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 nlocuii 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

Aplicat- ia 2 - for
Aplicaia const ntr-un applet ( o aplicaie ce se ruleaz n navigator). Codul Java al aplicaiei.
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 aplicaiei 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 cai e i s e
poate cu aplicaia
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
7 pe obiect n Java

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 puin 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 aplicaiei, 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;
#
ntreinere uoar;
#
adaptarea codului ct mai simpla la situaii noi;
#
minimizarea vulnerabiltii 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 manipularii unor entitat-i numite obiecte s-i nu prin prisma act-iunilor care trebuiesc
implementate (cum se face n programarea structurat).
POO are drept surs lumea nconjurtoare. Omul, n viaa 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 echivaleni". Mai general, un obiect este ceva cruia i se poate aplica un concept. Conceptul este
o idee sau o notaie comun, mai multor obiecte nconjurtoare.
Obiectul, din viaa 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 acioneaz asupra datelor.
Structura obiectului rezult ca urmare a abstractizrii. Abstractizarea implic o generalizare, prin
91

ignorarea sau ascunderea detaliilor, n vederea separrii unor proprieti sau caracteristici ale unei
entiti de obiectul fizic sau de conceptul pe care l descrie. Ca urmare, n programarea orientat pe
obiect, cutarea i definirea proprietilor 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 aplicaiei se stabilesc relaii de legatur, iar cooperarea ntre obiecte se face prin mesaje
transmise ntre acestea.
Etapele tipice acestei paradigme de proiectare sunt: identificarea claselor s-i a obiectelor, identificarea
semanticii acestora, identificarea relat-iilor s-i descrierea interfet-elor s-i a implementarilor de clase s-i de
obiecte.
Cteva nume care au avut contribuii 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
facilitile 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 - definit- ii


!

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 funciile de
prelucrare a lor

se definete prin atribute i operaii


atributele definesc starea, operaiile permit modificarea
strii.

Din punctul de vedere al aplicaie din care face parte obiectul el trebuie s asigur o parte din funciile
necesare funcionrii ntregii aplicaii. Termenul de modelare a obiectelor se foloses-te pentru a descrie
procedura de cautare a obiectelor prin care sa descriem problema de rezolvat.
Obiectele sunt descrise prin atribute s-i operat-ii. Atributele sunt caracteristici care se modifica, iar
operat-iile sunt act-iuni pe care obiectul le poate face. De exemplu, pisica are culoare, rasa s-i masa
(greutate), acestea ar fi cteva dintre atribute ei, ea pot prinde s-oareci, 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 operaiile unui al obiect. Operaiile
sunt cele ce modific starea obiectului. Modelarea orientat pe obiect este despre gsirea obiectelor i
a dependenelor ntre acestea. Dependenele ntre obiecte reprezint modul n care ele se aranjeaz, n
sensul legturilor - a relaiilor, a asocieriilor - care se formeaz, pentru a ne soluiona problema. De
regul, indentificarea obiectelor unui model de obiecte se face pe baz de substantive i verbe.
Sunbstativele vor fi obiecte, iar verbele operaii.
Relaii ntre obiecte
Agregarea, cunoscut n literatura de specialitate sub prescurtarea de relaie has-a, apare atunci cnd
un obiect este compus din mai multe sub-obiecte. Comportamentul obiectului complex este definit prin
comportamentul prilor componente, distincte i aflate n interaciune. n procesul de descompunere
al unui obiect n obiecte mai simple, acestea, deseori, vor putea fi reutilizate n alte aplicaii. Agregarea
ne permite deci, reutilizarea componentelor unei aplicaii ntr-o alt aplicaie.
Delegarea, cunoscut n literatura de specialitate sub prescurtarea de relaie uses-a, apare atunci cnd
un obiect, format total sau parial din alte obiecte, las obiectele componente s i defineasc
comportamentul. Obiectul nu are un comportament implicit, la nivel de interaciune cu alte obiecte,
acesta fiind motenit de la sub-obiectele lui.
93

Conceptul de clasa
7
!
!

clasa este o generalizare a unei mulimi de obiecte


definiia 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 ;
relaiile 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 colecie de obiecte similare ce poart denumirea de clas. Toate obiectele
clasei au aceleai atribute i fac aceleai operaii, 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 definiie 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 aplicaiei.
Clasa String este una singur, n timp ce numrul obiectelor de tipul String nu este limitat. n
procesul de proiectare a claselor apare situaia n care mai multe clase distincte au pri comune. Prile
comune pot fi cuprinse ntr-o singur clas i motenite la nivelul unor clase ulterioare. Motenirea,
cunoscut n literatura de specialitate sub prescurtarea de relaie 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

Definiia unei clase presupune descrierea


precis a formei i a naturii acesteia. Pentru
aceasta trebuie specificate datele (atributele) pe
care le conine i codul (operaiile) care va
opera cu respectivele date.
Datele, se vor stoca n variabile ce poart
denumirea de variabile de instan, iar
operaiile se implementeaz n metode.
Variabilele i metodele unei clase poart
denumirea comun de membri. Variabilele de
instan au aceast denumire deoarece sunt
proprii fiecrei instaieri de clas, adic fiecrui
obiect din clasa respectiv. Datele unui obiect
sunt distincte, separate de datele unui alt obiect
din aceeai clas.

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 */

Exemplul alturat definete n clasa Punct:


!
dou variabile de instan:

public void setX(double abscisa) {


x = abscisa;
}

private double x;
private double y;

doi constructori:

public void setY(double ordonata) {


y = ordonata;
}

Punct()
Punct(double abscisa ...)

ase metode:
public
public
public
public
public
public

public double x() {


return x;
}

void setX(double abscisa)


void setY(double ordonata)
double x()
double y()
double distantaOrigine()
String toString()

public double y() {


return y;
}

Clasa Grafica, are metoda main(), este


punctul de plecare al aplicaiei 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 spaiu unui


obiect, prin folosirea operatorului new:
p1 = new Punct();

modul n care se refer o metod


public dintr-un obiect:

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);
}
}

p1.setX(12);

95

Crearea obiectelor
!

obiectele se creeaza7 cu operatorul new

refObiect = new nume_clasa();


!

new realizeaza7 urma7 toarele act- iuni:


G
G
G

aloca7 memorie pentru nou obiect;


apeleaza7 o metoda7 speciala7 de init- ializare
numita7 constructor;
ntoarce o referint- a7 la noul obiect.

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 sageata 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 referint- a
7
!
!

prin referint- a7 se nt- elege adresa unei locat- ii


de RAM
membrii unui obiect se acceseaza7 printr-o
referint- a7 la obiect stocata7 n variabila obiect:
p1.setX(12);

la declarare, variabilele obiect sunt


init- ializate automat cu null:
Punct p1; este Punct p1 = null;

valoarea null poate fi comparata7 cu alte


referint- e:
if (p1 == null)
p1 = new Punct();

distrugerea unui obiect se face prin setarea


referint- ei 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 reprezentarile grafice
utilizate pentru descrierea starii spat-iului de date dreptunghiul reprezinta o locat-ie (sau un grup de
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 situat-ia referint-elor 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) s- i
vizibilitatea membrilor
!

vizibilitatea membrilor este controlata7 prin


specificatorii de acces:
G public
G private
G protected
ncapsularea asigura7 :
G
G

protect- ia datelor prin accesul la acestea numai


prin intermediul unei intefet- e publice (public)
izolarea pa7 rt- ilor vizibile prin interfat- a7 de
implementarea interna7 (private)

avantajele ncapsula7 rii:


G nu pot fi realizate modifica7 ri ilegale ale
G

datelor, deoarece accesul direct la ele este


restrict- ionat
gruparea datelor i a operat- iilor ce se pot
realiza cu ele permit depistarea uoara7 a
eventualelor probleme
modifica7 rile interne ale clasei nu se reflecta7 i
n afara ei (daca7 se pa7 streaza7 aceeai
interfat- a7 ), ca urmare restul programului nu
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

public class Punct {


//Campuri
private double x;
private double y;
private double distanta;

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(),

//Constructori
Punct() {
setX(0);
setY(0);
distanta = 0;
}
Punct(double x, double y) {
setX(x);
setY(y);
actualizareDistanta();
}

Punct(double x, double y)

prin apelul metodelor:


x) , setY(double y)

setX(double

Vizualizarea valorilor stocate n variabilele


provate se face cu metodele: x() , y() i
distantaOrigine() .

// 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 + ">";
}
}

99

Metode
!
!

metoda implementeaza7 o operat- ie cu datele


obiectului
metodele se implementeaza7 sub forma unor
proceduri sau funct- ii (ntorc valori cu
return) ce realizeaza7 anumite operat- ii
metodele pot fi definite numai ntr-o
deninit- ie de clasa7 , astfel:

vizibilitate tip nume_met([lista parametri])


{
corp_1
}
tip - definete tipul de date ntors de metoda7
nume_met - definete numele metodei
[lista parametri] - o secvent- a7 opt- ionala7 de
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 corespunzatoare 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 generala7 pentru apelul unei metode


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 transfera7 prin valoare
la transferul
prin valoare,
metodei, i se
transfera7 o copie
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.

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>

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.

102

Constructori
!
!
!
!

definete starea init- iala7 a obiectelor


are acelai nume cu clasa
este apelat automat dupa7 crearea obiectului,
nainte ca operatorul new sa7 se termine;
nu ntorc o valoarea de un anumit tip (nici
ma7 car void)
public nume_clasa(){
...
};

sintactic sunt identice cu metodele (pot avea


parametri)

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 masura n care este uitata
definirea lor, Java utilizeaza un constructor implicit
(default constructor), fara argumente i fara nici un
fel de cod, ce permite, macar crearea obiectelor din
clasa respectiva i init-ializarea la valori implicite a
variabilelor de instant-a. Constructorul implicit
poate fi scris i explicit daca init-ializarile 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-l apeleze pe baza
numarului i tipurilor parametrilor i a
argumentelor.

103

public class PunctOK {


//Campuri
...
//Constructori
PunctOK() {
setX(0);
setY(0);
distanta = 0;
}
PunctOK(double x, double y) {
setX(x);
setY(y);
actualizareDistanta();
}
...
}

104

Supranca
7 rcarea (overloading)
!
!

!
!

permite folosirea aceleiai sintaxe pentru


obiecte de tip diferit
la nivel de metode de clasa7 , apare atunci cnd
avem mai multe metode cu acelai nume, dar
cu declarat- ii de parametrii dinsticte
supranca7 rcarea este o forma7 polimorfism
Java se folosete de tipul i/sau de numa7 rul
parametrilor din apel pentru a determina
care dintre metodele supranca7 rcate sa7 le
apeleze

n exemplul prezentat clasa PunctOK are mai mult-i constructori. Dei constructorii au acelai nume,
au numar i/sau tipuri de parametrii distinct-i. Compilatorul determina care dintre constructori urmeaza
sa fie apelat prin compararea numarului i a tipurilor de parametri din definit-ia constructorului cu
numarul 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

Referint- a this
!
!
!

this este argument implicit al orica7 rei


metode
this este o referint- a7 la obiectul curent
this poate fi folosit n corpul orica7 rei
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.

public class Punct {


//Campuri
private double x;
private double y;
private double distanta;

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 secvene
de iniializare).

// Metode
public void setX(double x) {
this.x = x;
actualizareDistanta();
}

...

106

public void setY(double y) {


this.y = y;
actualizareDistanta();
}
...
}

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 {
ada7 ugarea de noi variabile i metode
}

reprezentarea grafica7 a
motenirii se face printr-o
sa7 geata7 (care se citete
motenete de la)
clasa care exista7 se numete
superclasa7 , clasa7 de baza7 sau clasa7 pa7 rinte,
noua clasa7 se numete sublclasa7 , clasa7
derivata7 sau clasa7 copil

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
corerspunzatoare 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 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

public void setX(double x) {


this.x = x;
}

public double getY() {


return y;
}

public String toString() {


return "(" + x + "," + y + ")";
}
}

public class Punct extends Coordonate


{
private String nume;
public Punct() {
super();
setNume("P");
}

=
=
=
=

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);

public double getX() {


return x;
}

public void setY(double y) {


this.y = y;
}

p1
p2
p3
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 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

Referint- a super
!
!
!
!
!

super este o referint- a7 la clasa de baza7


se utilizeaza7 la apelul constructorilor din
clasa de baza7
trebuie sa7 fie fie prima linie n constructorul
clasei derivate
se poate apela constructorul orica7 rei clase de
baza7
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 urma tor, 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 variabila7 , n
timpul rula7 rii, este ataata7 unor obiecte de
tipuri distincte
motenirea genereaza7 subclase ntre care
avem o dependent- a7 de tipul is-a
is-a reprezinta7 un principiu de substitut- ie
- conform lui se poate folosi o subclasa7 n
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, urmatoarea:
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
Except- ii, tablouri n Java

112

Except- ii
!

Surse de erori: date de intrare, probleme cu


dispozitive fizice, cod Java neglijent;
Except- ia este o condit- ie de eroare ce modifica7
rularea normala7 a programului: se face o
mpa7 rt- ire cu zero, se introduc date de intrare
greit etc. JAVA are un mecanism de tratare
a acestor situat- ii cu instruct- iunile try catch;
n Java eroarea se definete ca o situat- ie
anormala7 de funct- ionare din care nu se mai
poate reveni: JVM are o problema7 interna7 de
funct- ionare sau ra7 mne fa7 ra7 RAM.

Exist situaii n care apar probleme n timpul execuiei instruciunilor 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 aplicaia 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 ;) situaia n care pachetul de reea 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 spaiu;
Erori de programare: de exemplu o secven de instruciuni nu i face treaba corect, se face o
mpire cu zero, se ncearc referirea unui element de tablou inexistent etc.
n limbaje de nivel nalt tradiionale erorile sunt tratate prin utilizarea unor coduri de eroare ce trebuie
testate nainte de a continua execuia programului. La nivel de pseudocod o astfel de aplicaie are forma:
Tratarea erorilor n limbaje tradiionale (C, Pascal)

Tratarea erorilor n Java

cod_de_eroare1=0
grup de instruciuni1
dac (cod_de_eroare1 0) atunci {
instruciuni pentru tratarea erorii 1
}
cod_de_eroare2=0
grup de instruciuni2
dac (cod_de_eroare2 0 atunci {
instruciuni pentru tratarea erorii 2

try {
grup de instruciuni1
grup de instruciuni2
}
catch(cod de eroare1) {
instruciuni pentru tratarea erorii 1
}
catch(cod de eroare2) {
instruciuni pentru tratarea erorii 2
}

113

Acest mod de programare a problemei erorilor intercaleaz instruciunile 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 aplicaiei scade deoarece dup fiecare grup de instruciuni care ar putea genera erori
intervine testul prin care se decide ntre continuarea rulrii aplicaiei sau tratare a erorii.
n Java termenul de excepie (exception) arat c, datorit unei probleme, o instruciune nu s-a putut
executa n condiii normale de ctre JVM. JVM detecteaz automat aceste situaii oprind i terminnd
imediat execuia programului. Numele de excpie vine de la faptul c dei a aprut o problem situaia
nu este frecvent (adic regula, este execuia normal, iar eroare este situaia excepional). Limbajul
Java separ detaliile de tratare a erorilor (instruciuni pentru tratarea erorii ) de secvena de
instruciuni care le-ar putea genera (grup de instruciuni1) codul devenid n acest lizibil. try
(ncearc) nsemn c la nivel de cod se ncerc ceva ce ar putea genera o excepie, iar catch (prinde)
nsemn c excepia respectiv este tratat printr-un grup de instruciuni specifice. Fie urmtoare
aplicaie 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) aplicaia crap la execuia liniei 8 (c = a / b) cu mesajul de eroare
java.lang.ArithmeticException: / by zero .
n limbajele tradiionale, ntoarcerea unui cod de eroare nu implic i obligativitatea testrii acestuia.
Fie schema urmtoare:
Prinderea erorilor n limbaje tradiionale (C, Pascal)
metoda1 7

Prinderea erorilor n Java


metoda1 7

Eroarea se prinde aici


Cod de eroare

Cod de eroare

metoda2

metoda2
Cod de eroare

metoda3 W

Ex. se prinde direct

Cod de eroare
metoda3 W

Eroarea apare aici

114

Excepia apare aici

Aici avem metoda1 care apeleaz metoda2 i care apeleaz metoda3. ntr-un limbaj tradiional,
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 excepiilor, aceste probleme nu mai apar astfel:
!
atunci cnd apare o excepie, JVM transfer controlul direct proiunii de cod care trateaz
excepia;
!
dac o metod a generat o excepie (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 except- iilor n Java

!
!

Orice except- ie este un obiect creat folosind o


subclasa7 a clasei de baza7
java.lang.Throwable;
subclasa Error include erorile din care nu se
mai poate reveni - programul se termina7 ;
subclasa Exception include erorile din care se
poate reveni - corectarea situat- ie
execpt- ionale se face n rutina de tratare a
erorii (exception handler)

n Java, excepia este un obiect care se instaniaz pe baza unei subclase a clasei
java.lang.Throwable. Ierarhia de clas are dou subclase mari: Error i Exception.
Subclasa Error corespunde unor situaii de erori deosebit de grave, mediul rmne fr memorie sau
are o eroare intern. Programatorul nu poate face mare lucru n aceste situaii, cel mult poate fora
terminarea aplicaiei ntr-o manier elegant, n locul celei abrupte. Clasa Exception este cea pe care
programatorul o utilizeaz uzual n situaia n care programul nu se poate rula n condiii 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 excepie apare ca urmare
a unor cauze externe care opresc programul din execuie (de exemplu, datele de intrere nu sunt
introduse corect). Excepiile 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


!

secvent- a de
try {
//cod care poate genera erori
instruct- iuni ce
}
pot genera erori catch(tipexceptie1 ob) {
//rutin pentru tratarea excepiei 1
se cuprind
}
catch(tipexceptie2 ob) {
ntr-un bloc
//rutin pentru tratarea excepiei 2
}
try;
pentru fiecare
. . .
except- ie se
finally {
//cod de executat nainte de terminarea
folosete un
// blocului try
}
bloc catch
pentru tratarea
ei;
daca7 este cazul, orice preluca7 ri finale se fac
n blocul finally

Instruciunile unei metode care urmez s fie monitorizate pentru excepii trebuie cuprinse n blocul
format dintre acoladele instruciunii try. Instruciunea try conine un grup de instruciuni, numite
i bloc, ce urmeaz s fie executate. Dac o problem apare ntre instruciuni atunci se genereaz o
excepie (generarea are ca efect ntreruperea execuiei codului i saltul la codul de tratare a excepiei).
Prinderea excepiei generate se face folosind clauza catch, iar tratarea ei prin codul cuprins ntre
acoladele respectivului catch. Prin tipexceptie se nelege tipul excepie care a generat eroarea.
O instruciune try poate avea orice numr de clauze catch. Programatorul are posibilitatea ca o
excepie de un anumit tip s o prind i s o trateze prin rearucarea ei ca i o nou excepie. O alt
posibilitate ar fi ca excepia s nu fie tratat la nivelul metodei n care aceasta a aprut. n aceast
situaie excepia este pasat metodei apelante (metoda din care s-a apelat metoda n care a aprut
excepia). n general, dac o excepie nu este tratat n metoda apelat aceasta este pasat metodei
apelante. Aceast procedur de propagare a excepiei se repet pn cnd se ajunge la metoda main.
Dac nici aici excepia nu este tratat atunci aplicaia se termin brusc i anormal. Excepiile sunt
obiecte generate automat de JVM n situaii de eroare.

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

catch.

throw
Utilizatorul poate genera manual excepii prin folosirea instruciunii throw (ea se folosete pentru
regenerarea unei excepii n exemplu urmtor). Forma general a instruciunii 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 instruciuni codul se oprete din execuie, orice instruciuni urmtoare ne mai fiind executate,
execuia fiind transferat celui mai apropiat try. Aici se verific dac exist un catch ce are aceai
tip cu cel al excepiei, dac nu se trece la umtorul try etc.

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

finally
La generarea unei excepii execuia secvenial a programului se ntrerupe continundu-se cu un grup
de salturi. n funcie de anumite condiii, este posibil s revenim prematur dintr-o metod, aceast
situaie poate genera probleme uneori. Pentru pstratea continuitii execuie codului a fost creat
instruciunea finally. Ea definete un bloc de instruciuni care se execut ntotdeauna, indiferent
dac excepia a fost sau nu prins, dup un try - catch. Instruciunea este utilizat, tipic, pentru
a face curenie dup try ( nchiderea unor fiiere i eliberarea unor resurse alocate nainte de revenirea
din metodele generatoare de excepii).
Este obligatoriu ca o instruciune try s aib asociat o instruciune catch sau una finally .

Aplicat- ia 1 - try, catch, throw,


throws
Aplicaia ce urmeaz este format din dou fiiere Functie.java i TestExceptii.java. Ea
trebuie s evalueze valoarea unei funcii F(x) definit n metoda F din clasa Functie.

118

Aceast metod genereaz excepie de tipul ArithmeticException . Excepiile 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 aplicaia se oprete deoarece se
genereaz o eroare ca nu este prins n aplicaie. n aceast situaie aplicaie 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 aplicaia, dei ntlnete situaii excepionale, nu se termin brusc i abrupt, ci
ca urmare a tratrii acestora, ajunge s se termine normal.

120

Propagare except- iei codului


apelant
!

se folosete public double F(double x) throws


ArithmeticException {
throws n
. . .
throw new ArithmeticException("/ cu 0");
declarat- ia
. . .
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) {
except- ie;
System.out.printf("%6.3f %s\n", x, e);
}
este un
}
catch n
metoda
apelanta7 care prinde except- ia.

n aplicaia 1 se prezint modul n care o excepie 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 excepia ci o las s se propage
declaraia acesteia conie pe throws ArithmeticException . n general, dac am dori ca i metoda
apelant s realizeze propagarea excepie mai departe i declaraia ei ar trebui s conin 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
7 a unei
except- ii
!

except- ia se
public double F(double x) throws
ArithmeticException {
genereaza7
. . .
throw new ArithmeticException("/ cu
manual cu
. . .
throw new
}
obExcept
-ie()
;
n declarat- ia metodei se folosete throws.

0");

Generarea manual a unei excepii predefinite n ierahia de excepii Java sau a unei definite de utilizator
se face cu instruciune throw. Orice excepie generat n acest fel trebuie pus i n clauza throws
a metodei. Dac se vor genera mai multe excepii dintr-o metod, toate numele respectivelor excepii
trebuie scrise n list, separate prin virgul.
Exist ns i excepii care nu trebuie puse n list i anume Error, RuntimeException. Motivul
pentru care aceste nu trebuie scrise explicit const n numrul mare de situaii (JVM rmne fra
memorie, mprire cu zero, indice de tablou ilegal etc.) n care ele pot s apar n diferite poriuni de
cod. Aceasta ar implica scrierea lor n fiecare declaraie de metod pentru fiecare poriune 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 excepii permite ca la prinderea unei excepii s se genereze n locul acesteia
o alta. Un cod tipic este:
catch (exceptie1 e) {
throw new exceptie2( ... );
}
Aici s-a prins excepia excepie1, ns n codul de tratare a excepiei se genereaz o alta, i anume
excepie2.

122

Crearea unei except- ii noi


!

o except- ie
noua7 se
creaza7 prin
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 excepii prin extinderea clasei Exception. La crearea unei
subclase a lui Exception programatorul are deja o nou clas funcional 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 excepiilor are rost n situaia
unor particulariti specifice ale aplicaiei.

Aplicat- ia 2 - extindere Exception


Aplicaia 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 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)

public String toString() {


return "\nExceptie: " + mesaj;
}

{
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 colect- ie de


elemente de acelai tip;
un element poate stoca o
singura7 valoare;
elementele se identifica7 unic
printr-un numa7 r ntreg numit
indice;
tipul elementelor poate fi
simplu sau obiect;
numa7 rul de elemente de
tablou se fixeaza7 n momentul
crea7 rii acestuia.

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
muli 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 locaii 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 secvenial).

124

Etapele lucrului cu tablouri


!

declararea tabloului:
int []a;

crearea unui obiect tablou:


a = new int[4];

init- ializarea tabloului:


int[] a = {1, 7, 23, 1};

indicele 0 [0, nr_elem-1] > altfel apare


except- ia 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;
!
cream tabloul folosind operatorul new specificnd lungimea acestuia (numarul maxim de
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 aplicaiei)
!
init-ializam tabloul cu valori diferite de cele cu care acesta se init-ializaeza implicit de catre Java.
Valorile de iniializare implicit pentru tablouri:
char

boolean

byte, short, int, long

float, double

\u0000 - Unicode 0000 (Java


folosete codificarea Unicode)

false

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
notaia nume_tablou . length .

125

Aplicat- ia 1 - tablou de tipul int,


citire i afiare
Aplicaia 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);
}
}

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

=
=
=
=
=

12
45
33
21
108

126

valoare

Etapele lucrului cu tablouri de


obiecte
!

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

crearea unui obiect tablou:


puncte = new PunctOK[3];

init- ializarea obiectelor din tablou:


puncte[i] = new PunctOK(i,2*i);

n situaia lucrului cu tablouri de obiecte, etapele sunt indentice cu cele descrise la tablourile de
primitive, cu excecia c aici iniializarea elementelor de tablou este obligatorie i nu opional.

Aplicat- ia 2 - tablou de obiecte,


init- ializare i afiare
Aplicaia are la baz clasa PuncteOK. Se creeaz un tablou de obiecte PuncteOK cu numele
puncte. Iniializarea obiectelor din tablou se face n ciclul for cu linia puncte[i] = new
PunctOK(i,2*i);. Rezultatele afiate se obin prin iniializarea 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>

Aplicat- ia 3 - sortarea cresca


7 toare a
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);
}
}

129

rez,

"Sortare

Except- ii ntlnite la tablouri


!

utilizarea unei indice n afara domeniului


permis genereaza7 except- ia
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 nca7 nu a fost init- ializat genereaza7
except- ia 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
mult- i 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;

int- ializare:
int[][] a =
{
{1,3},
{0,0},
{0,0},
{0,0}
};
declarare i init- ializare fa7 ra7 specuficarea
numa7 rului de coloane:
tip [][] numetablou = new tip[nl][];
numetablou[il] = new tip[nc];

131

Aplicat- ia 1 - crearea unui tablou


cu numa
7 r variabil de coloane
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

S-ar putea să vă placă și