Documente Academic
Documente Profesional
Documente Cultură
Introducere n Java
Ce este Java?
!
!
!
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
!
!
!
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.
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
!
Navigator
JVM
JVM
Aplicat-ie
Miniaplicat-ie
10
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
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
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
javax.swing
java.applet
Applet, AudioClip
java.io
File, InputStream,
OutputStream
java.net
Socket, DatagramPacket,
URL, InetAddress
14
mpacheta
7 ri, platforme i
versiuni Java
mpacheta ri:
!
!
!
Versiuni:
!
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
Microsoft Windows
Solaris OE
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
1998
JDK 1.3
2000
JDK 1.4
2002
2004
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
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.
19
20
Etapele genera
7 rii unei aplicat- ii
Java
Etapa:
1
2
3
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 ;.
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
!
!
!
!
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
!
!
!
!
!
Greit - Y
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
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
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
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
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
(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
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
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 =
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).
39
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:
!
!
!
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
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++;
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.
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
mai mare
>=
<
mai mic
<=
!=
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
<=
>
Mai mare
>=
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
fr scurtcircuitare
nume
&&
&
||
SAU INCLUSIV
SAU EXCLUSIV
NU
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
S- I
SA U
&&
false
true
||
false
true
false
false
false
false
false
true
true
fals
true
true
true
true
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
>>
deplasarea la dreapta
>>>
<<
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
Bit "2"
Bit "1"
Bit "0"
23
22
21
20
14(10)
0(2)
7(10)
1(2)
50
Valoarea n baza 10
Bit "2"
Bit "1"
Bit "0"
23
22
21
20
0(2)
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
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
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
Simbol
Asociativitate
++ + - ~ ! (tip)
operatori unari
de la dreapta la stnga
(DS)
*/%
de la stnga la dreapta
(SD)
+-+
SD
SD
relaionali
SD
== !=
Egalitate
SD
&
I logic / pe bii
SD
SD
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
="
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
String
atribuirea (=)
concatenarea (+)
atribuirea compus (+=).
61
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
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
!
!
!
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
!
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
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
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:
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
!
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
!
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
double
dat de intrare
dobandaan
double
data de intrare
scop
double
dat de intrare
cont
double
depunere
luni
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
int
contorElev
int
total
int
mediaClasa
double
sirNota
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
!
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
!
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);
82
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)
;
. . .
83
Saltul cu break
!
!
!
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
!
!
85
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
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
89
5
Concepte de programare
orientata
7 pe obiect n Java
90
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
!
!
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 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
private double x;
private double y;
doi constructori:
Punct()
Punct(double abscisa ...)
ase metode:
public
public
public
public
public
public
p1.setX(12);
95
Crearea obiectelor
!
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
!
!
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
!
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
//Constructori
Punct() {
setX(0);
setY(0);
distanta = 0;
}
Punct(double x, double y) {
setX(x);
setY(y);
actualizareDistanta();
}
Punct(double x, double y)
setX(double
// 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
!
!
100
!
!
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.
= " + 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
102
Constructori
!
!
!
!
103
104
Supranca
7 rcarea (overloading)
!
!
!
!
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
!
!
!
// Metode
public void setX(double x) {
this.x = x;
actualizareDistanta();
}
...
106
Motenirea
!
!
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
=
=
=
=
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);
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)
108
Referint- a super
!
!
!
!
!
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
!
!
!
!
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
!
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)
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 );
}
}
}
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
Cod de eroare
metoda2
metoda2
Cod de eroare
metoda3 W
Cod de eroare
metoda3 W
114
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
!
!
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
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 .
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
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
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
o except- ie
noua7 se
creaza7 prin
extinderea
clasei
Exception.
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.
{
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 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
declararea tabloului:
int []a;
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
float, double
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
Rezultate:
a[0]
a[1]
a[2]
a[3]
a[4]
12
45
33
21
108
=
=
=
=
=
12
45
33
21
108
126
valoare
declararea tabloului:
PunctOK puncte[];
//sau PunctOK[] puncte;
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.
127
Rezultate:
<0.0,0.0>
<1.0,2.0>
<2.0,4.0>
128
129
rez,
"Sortare
130
Tablouri multidimensionale
!
!
!
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
Rezultate:
0 1 2 3 4
5 6
7 8 9 10
11 12 13 14 15 16 17
132