Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Horia GEORGESCU
IN T R O D U C E R !
in
UIUIVERSUL
JAVA
EDITURA TEHNICA
Bucurefti, 2002
PREFA
1. Introducere
1.2. Un prim program scris n Java
1.3. O clas folosit pentru intrrile i ieirile standard
1.4. Clase, cmpuri i metode
1.5. Simularea nregistrrilor n Java
1.6. Exemplu: crearea unei liste nlnuite
1.7. Introducere n programarea orientat pe obiecte (OOP)
5. EXTINDEREA CLASELOR 65
5.1. Cum se definesc clasele extinse 65
5.2. Din nou despre iniializare i constructori 67
5.3. Rescrierea metodelor i ascunderea cmpurilor 70
5.4. Cuvntul cheie su p e r 73
5.5. Motenire, polimorfism i legare dinamic 74
5.6. Din nou despre modificatori 76
7. EXCEPII. CONVERSII 97
7.1. Excepii 97
7.2. Conversii 106
9. FIRE DE EXECUTARE.
PROGRAMARE PARALEL I CONCURENT 134
9.1. Crearea firelor de executare 135
9.2. Un prim mod de sincronizare 138
9.3. Despre programarea paralel 139
9.4. Implementarea n Java a metodei arborelui binar 141
9.5. Despre programarea concurent 144
9.6. Rezolvarea excluderii reciproce n Java 147
9.7. Primitive de sincronizare. Problema Productor - Consumator 150
9.8. Lucrul cu semafoare n Java 153
9.9. Alte faciliti oferite de clasa Thread 158
44
13. SISTEME DISTRIBUITE SOCKET-URI
2
4
13.1. Sisteme distribuite
2
9
4
13.2. Comunicare prin socket-uri
2
2
5
13.3. Aplicaii
2
5
9
13.4. Semnarea digital a mesajeor
263
14. INVOCAREA LA DISTAN A METODELOR (RM)
3
6
2
14.1. Introducere
6
6
2
14.2. Principiile modelului RMI
0
7
2
14.3. Faciliti Java pentru invocarea ia distan
7
3
2
14.4. Apeluri inverse
6
7
2
14.5. ncrcarea dinamic a claselor
2
8
15. FE SCURT DESPRE APPLET-URI
*
2 2 2 2 2
8
^
15. Ce sunlapplet-urile?
8
~ ^ J
5.2. Faciliti de lucru cu applet-urile
9
15.3. Lucrul cu imagini i fiere audio
9
15.4. Comunicarea ntre applet-uri
9
15.5. Restricii n lucrul cu applet-uri
^ i.
BIBLIO G RAFIE SELEC TIV
INDEX 299
O P R IM IN C U R S IU N E
S N L IM B A J U L JA V A
1 Introdecere
Sim plitate. Dei sintaxa limbajului este bazat pe cea a limbajului C++,
limbajul Java este considerabil mai simplu. Au fost eliminate multe cuvinte
cheie, nu mai exist un preprocesor, iar limbajul este mbogit cu o bibliotec
mult mai bogat de unelte de dezvoltare. Nu mai exist funcii independente,
variabile globale, instruciunea g o to i lucrul liber cu pointed. Pointerii sunt
nlocuii cu referine, dar nu mai exist o aritmetic a pointerilor. n acest mod
sunt eliminate multe surse de erori de programare, ceea ce conduce la
programe corecte i robuste.
12 1. O PRIM INCURSIUNE IN LIMBAJUL JA VA
Java este proiectat pentru lucru n reea. Chiar de la nceput, limbajul Java
a fost gndit pentru Internet. Dei este posibil s construim programe care
folosesc numai resurse locale, Java pune la dispoziie o mulime de faciliti
pentru programare n reele, pentru a face conexiuni ntre calculatoare server i
client i pentru executare n medii ca de exemplu un browser WWW.
Este indicat, dar nu obligatoriu (aa cum se vede din exemplul prezentat),
ca numele unitii de compilare s coincid cu numele clasei ce conine metoda
principal; n primele versiuni ale limbajului exista ns aceast obligativitate. n
versiunile recente nici precizarea atributului p u b lic pentru metoda principal nu
mai este obligatorie.
catch (OException e} { }
if {f .ttype == -2) r e tu r n (f . n v a l) ;
else return(Double.N aN) ;
cmpuri ale obiectului. Ca i pentru metode, pot exista mai muli constructori dar
cu signaturi diferite.
Aceast posibilitate de a exista mai muli constructori, respectiv mai multe
metode cu acelai nume, dar cu signaturi diferite, poart numele de suprancrcare
{overloading).
Exemplul L Dac C este o cias, atunci crearea unui obiect de tipul clasei
C se poate face astfel:
1) new c ( . . . )
prin care este creat un obiect anonim de tipul C
2) c Ob Ob = new C ( . . . ) sau prescurtat: C Ob = new C ( . . . ) ;
prin care este creat un obiect de tipul C la care ne putem referi prin variabila b
(avnd evident tipul C).
La creare este invocat constructorul corespunztor (cu aceeai signatur cu cea din
lista de argumente). Dac n clasa C nu exist vreun constructor, se presupune c
"existMtotui un constructor f^r parametri, care nu prevede nici o aciune. Drept
urmare, la creare trebuie folosit forma: new C ( )
Variabila referin Ob poate fi folosit pentru accesarea cmpurilor i
metodelor clasei. Astfel, dac x este un cmp al clasei, el poate fi referit prin
O b.x, iar dac met este o metod a clasei, ea poate fi invocat prin
Ob.met ( . . . ) (evident, este invocat acea metod care are aceeai signatur cu
cea din lista de argumente). Mai spunem c Ob.x, respectiv o b .m e t sunt calificri
ale obiectului Ob cu cmpul x, respectiv metoda met.
Un obiect are o comportare, concretizat prin metodele clasei a crei
instaniere este. Deci un obiect poate fi privit ca o persoan, care la creare are nite
date (cmpurile) i modaliti de a opera asupra lor (metodele). Invocarea unei
metode pentru un obiect revine la a pune acel obiect (acea persoan) s execute
codul metodei respective.
O-writelnt + (Obl==Oto3));
2 .modif () ; 2 .scrie ();
I O . w r i t e l n ( ( 2 ) );
}
}
n care operatorul == este operatorul de egalitate, iar + este fie operatorul de
adunare, fie cel de concatenare (n situaia n care cel puin un membru este un ir
de caractere, caz n care i ceilali membri sunt convertii la iruri de caractere).
n acest program apare o noiune nou i anume modificatorul s t a t i c cu
care este declarat cmpul ntreg iO din clasa C. Aceasta face ca iO s fie comun
tuturor obiectelor de tipul C. Existena unui cmp static nu depinde de obiecte ce
instaniaz clasa. Cmpul .respectiv poate fi adresat din afara clasei prin numele
clasei calificat cu numele cmpului (C. iO); evident, pentru orice obiect Ob de tipul
C, cmpul poate fi adresat n continuare prin Ob. iO.
Analog, modificatorul s t a t i c poate fi folosit i pentru metodele unei
clase. Din afara clasei, metoda poate fi invocat prin numele clasei calificat cu
numele metodei i urmat de lista argumentelor. Metodele statice sunt n general
folosite pentru modificarea cmpurilor statice ale clasei. Cunoatem deja un
exemplu de folosire a acestui modificator; el nsoete "metoda principal" m ain
acest lucru este necesar deoarece nu este creat un obiect de tipul clamei din care
face parte aceast metod, ci este folosit un "ncrctor de clas", care trebuie s
aib acces la metoda main.
Mai menionm c, n mod implicit (prin lips), cmpurile unui obiect
primesc la creare o valoare (0 pentru tipuri numerice); de exemplu la crearea unui
obiect de tipul C, cmpul i are implicit valoarea 0.
Dup cum tim, idea de baz este de a forma "celule" care s conin un
element efectiv i "adresa" urmtoarei celule. Pentru aceasta vom defini o clas
elem format din:
- cmpurile c (de tip caracter) i le g (de tip eiem);
- cmpurile statice p i u, coninnd referinele spre primul i ultimul
element al listei;
- un constructor ISr parametri, care este folosit pentru crearea n metoda
principal a obiectului Ob;
- un constructor, care are un parametru de tip caracter; la crearea unui nou
obiect de tip elem, obiectul va primi n cmpul c caracterul transmis la invocarea
constructorului, iar cmpul le g va deveni n mod implicit referina nul n u l i ;
- metoda c r e a r e , care creeaz un prim element al listei (memornd
referina la el n variabilele p i u) i apoi n mod repetat, pn cnd este citit
caracterul *$ % obiectul u creeaz, folosind metoda adaug, un nou obiect pentru
noul caracter citit i actualizeaz referina u pe baza rezultatului ntors;
- metoda adaug, care creeaz un nou obiect i ntoarce o referin ctre el;
- metodele d i r e c t i in v e rs ce au un parametru x de tip elem i ntorc
un rezultat de tip ir de caractere ce corespunde parcurgerii n ordine normal (de
la stnga la dreapta), respectiv n ordine invers, a irului de caractere ce ncepe de
la "adresa" x.
n clasa L is ta , n metoda principal, este invocat metoda c re a r e i apoi
metodele d i r e c t i in v e rs, prin intermediul unui obiect Oh de tipul elem,
ultimele dou avnd ca argument cmpul static p ai clasei elem.
Programul corespunztor este prezentat n continuare.
class elem {
char c elem le g ; static elem p ,u ;
elem{} { }
elem (char ch) { c = ch; }
elem ad au g (char ch) {
elem x - new elem(ch); leg = x; return x;
}
1.6. Exemplu: crearea unei liste nlnuite 23
void creare () {
char ch - IO.readch()p = new elem(ch)u = p;
ch = IO.readch);
w h ile (ch!- ' $ ' ) { u = u ,adaug(ch ) ch = IO.readch() }
}
String direct(elem x) {
1 (x~~null) return "
1@ return x.c + direct(x.leg) ;
}
String invers(elem x) {
if (x =^ qu 11) @&1 f
22. Identificatori
n Java identificatorii ncep cu o liter (inclusiv i ' $ 1) i pot
continua cu litere sau i i cifre; este totui indicat s nu includem n identificatori
caracterul ' $ f, deoarece el este folosit de compilatorul lava pentru a genera
identificatori interni, despre care nu vom vorbi aici. Prin "litere" nelegem att pe
cele obinuite (literele mici i mari din alfabetul englez), ct i pe cele din alte
limbi. Un identificator poate avea orice lungime; de aceea este indicat s folosim
identificatori ct mai sugestivi pentru rolul pe care l joac, timpul Hpierdut" la
scrierea programului fiind recuperat din plin atunci cnd revedem programul peste
cteva iuni sau cnd trebuie ca ei s fie neles de alte persoane.
Anumii identificatori au o semnificaie predefmit, ce nu poate fi
modificat, i nu pot fi folosii n alt context dect cei intenionat de ctre autorii
limbajului. Ei se numesc c u v in te c h e ie . O prim list de cuvinte cheie este
urmtoarea:
abstract boolean break byte case
catch char class coninu default
do double else eKtens final
finally float for if ijxiplemeiibs
import instanceof int interface long
new null package private protected
public return short static super
switch synchronized this throw
throws try void while
2 3 . Constante
n limbajul Java, constantele mai poart i numele de lite r a li. Vom
prezenta doar o parte a acestor constante (de exemplu nu vom vorbi de literali
ntregi octali i hexazecimali):
2) L ite r a lii r e a li (n v ir g u l m o b il ):
- d u b lii reprezentai pe 64 de bii, pentru care scrierea este cea uzual. Este vorba
de numere zecimale ce conin opional punctul zecimal i pot fi urmate de un
exponent prefixat cu e sau E. De exemplu urmtorii trei literali reprezint aceeai
valoare:
21. 2 .le i .21E2
- n o rm a li, reprezentai pe 32 de bii. Aceti literali au aceeai form ca cei dubli,
dar au n plus sufixul 1f ' sau !F '.
Conform standardului IEEE 754, sunt inclui i literali pentru "nu este un
numr", i
Double . NaN D ouble . NEGATIVENFINITY i D ouble . POSITIVEINFINITY
(pentru aritmetica pe 8 octei);
F lo a t . NaN, F l o a t . NEGATIVEINFINITY i F lo a t . POSITIVEINFINITY
(pentru aritmetica pe 4 octei).
Valoarea NaN apare ca rezultatul unor operaii ca de exemplu mprirea la
zero; ea nu este HordonatH: compararea ei cu orice valoare produce rezultatul
f a ls e . n schimb valorile corespunztoare lui -i + sunt ordonate: pentru orice
literal "efectiv" v a l, avem
Cele mai mici valori pozitive pentru literalii normali i dubli sunt:
F lo a t .MINVALUBl .-4 3 - 4 5 f i D ouble .HXNVALUE=5e-324
iar cele mai mari vaiori posibile pentru literalii n virgul mobil sunt:
F l o a t . / =3.4 0 2 8 e + 3 8 f i D ouble .MAXVALUE=1.79769e+308,
4) L ite r a lii d e tip c a r a c te r au forma ' c ', unde c este un caracter sau o
secven Escape; aceste secvene au fost prezentate mai sus.
2. Com entarii
Comentariile sunt folosite n principal pentru explicitarea aciunilor
ntreprinse de cod; d e simt ignorate de compilator.
30 2 . E L E M E N T E D E B A Z L E L IM B A J U L U I J A V A
2.5. Variabile
O declarare poate s apar oriunde !n cadrul unei clase, metode sau a unui
bloc de iniializare, deci nu neaprat la nceputul lor.
Limbajul Java atribuie valori iniiale implicite cmpurilor claselor. Ele
sunt:
f a l s e (pentru b o o le a n ) ; * 0000' (pentru e h a r ) ; n u l i (pentru r eferin e).
0 (pentru orice tip ntreg) ;+0 . 0f sau +0 . d (pentru flost i d o u b le ) ,
2.5. 31
2.6. O peratori
Operatori aritmetici
Aceti operatori sunt urmtorii;
4- ~ * / %.
De asemenea este folosit operatorul unar - pentru schimbarea semnului,
precum i operatorul unar + (introdus pentru simetrie).
n aritmetica ntreag trebuie s inem cont de urmtoarele reguli:
- orice valoare ce depete limita admis este redus modulo aceast
limit; de aceea nu exist depiri { o v e r flo w i u n derflow )',
- mprirea ntreag se face prin trunchiere; de exemplu - 8/ 3 = =~ 2 , iar
8/3=^2
in d ic e va avea loc o singur dat (n caz contrar este posibil ca n membrul stng
i cel drept s nu se refere la aceeai component a tabloului a, de exemplu dac
metoda ntoarce n mod aleator un indice).
Diferena ntre x++ i ++x const n faptul c incrementarea este realizat
dup, respectiv nainte de utilizarea lui x n contextul n care apare. Astfel, dac
valoarea curent a iui x este 4, atunci:
- evaluarea expresiei 2 * --x conduce Ia rezultatul 10,
- evaluarea expresiei 2 * x++ conduce Ia rezultatul 8,
dup care valoarea lui x va fi n ambele cazuri 5.
Evident, operatorul se supune unor reguli analoagc.
O construcie de tipurile x + + , x - ~ # ++x, -~ x reprezint o expresie
aritmetic, dar i o instruciune (valoarea expresiei nu este folosit, ns x este
incrementat sau decrementat).
Operatorii de mai sus pot fi aplicai i pentru tipul c b a r, semnificnd
trecerea la precedentul, respectiv urmtorul caracter din setul de caractere
Unicode.
Operatorii de atribuire
Pe lng operatorul ~ folosit standard pentru atribuire, mai pot fi folosii i
operatorii;
+ !S = f = '* %5S
Operatorii relaionali
Este vorba de urmtorii operatori:
> (mai ca) >= (mai mare sau egal cu) == (egal cu)
< (mai mic ca) <= (mai mic sau egal cu) ! = (diferit de)
Operatori booleeni
! Este vorba de urmtorii operatori:
j ! (disjuncia iogic, sau) && (conjuncia logic, i) ! (negaie)
cu meniunea c ta evaluare se face s c u r tc ir c u ita r e (pe scurt, dac la evaluarea
unei expresii booleene devine la un moment dat clar valoarea ei, nu se mai
continu n mod inutil evaluarea; de exemplu dac expresia este disjuncia logic a
trei termeni i valoarea primului este t r u e , nu se mai evalueaz ceilali termeni).
34 2 . E L E M E N T E D E B A Z A L E L IM B A J U L U I J A V A
O peratori pe bii
Este vorba de operatorii binari | i & care realizeaz disjuncia logic i
conjuncia logic ia nivel de bit, pentru fiecare pereche de bii de pe aceeai poziie
din reprezentarea operanzilor.
O peratorul condiional ? %
O peratori postfix
Includem aici:
- cuprinderea ntre paranteze a indicilor (cu []);
- operatorul de calificare ( .) folosit pentru accesarea membrilor claselor;
- parantezele rotunde folosite pentru specificarea listei de parametri din
invocri;
- operatorii de incrementare/decrementare ++ i - - de mai sus.
Precedena operatorilor
Ordinea n care are loc efectuarea prelucrrilor determinate de operatori
este dat n urmtorul tabel de prioriti ale operatorilor (de la prioritate maxim ia
prioritate minim):
- operatorii postfix
- operatorii unari de incrementare/decrementare, operatorii + i - unari
operatorul de negaie !
- operatorul n@w de creare de obiecte i cei de conversie: ( tip)
e x p r e s ie
operatorii multiplicativi: * / %
- operatorii aditivi: + -
- operatorii relaionali i n s ta n c e o f
- operatorii de egalitate: == !&
- operatorul &
- opratorul I
- conjuncia logic &&
- disjuncia logic | |
- operatorul condiional ( ? )
operatorii de atribuire.
Observaii:
- la prioritate egal, operatorii "vecini" acioneaz conform regulilor de
asociativitate prezentate n continuare;
- utilizarea parantezelor este mai puternic dect prioritatea operatorilor.
Astfel, spre deosebire de x+y*z, n (x+y) *z prima operaie care va fi executat
este adunarea.
@ Asociativitate
Regula general o constituie asociativitatea la stnga. Fac excepie
urmtorii operatori, pentru care este folosit asociativitatea la dreapta:
36 2. E L E M E N T E D E B A Z A L E L IM B A J U L U I JA V A
- operatorii unari;
- operatorii de atribuire.
- operatorul ( ? ).
E x e m p le :
1) n expresia x~y+z nti se va efectua scderea i apoi adunarea;
2) Instruciunea:
x = = z = 0;
este echivalent cu:
x= (y = (z=0));
i are ca efect atribuirea vaiorii 0 variabilelor x , y, z. Explicaia const n aceea c
efectuarea unei atribuiri conduce i la obinerea unui rezultat (valoarea care a fost
atribuit) i care poate fi folosit ca n exemplul de mai sus.
3) Secvena de program;
i n t a = 5 # b=10/ c=15;
a += b -=c %= 4;
lO .w rite ln (a + " + b + " " + c } ;
produce la ieire:
12 7 3
2.7. Instruciuni
Limbajul Java prevede mai multe tipuri de instruciuni:
Instruciunea co m p u s grupeaz mai multe instruciuni prin includerea
lor ntre acolade; ia natere astfel un bloc. Un bloc este considerat a fi o unic
instruciune.
In stru ciu n ea d e d e c la ra re asociaz unei variabile un anumit tip i
eventual i atribuie o valoare iniial; variabila devine lo c a l celui mai interior
bloc care o conine, n sensul c exist atta timp ct se execut instruciuni ale
blocului. O instruciune de declarare poate s apar oriunde n interiorul unui bloc.
nainte de utilizarea for, variabilele locale trebuie s fi primit valori fie prin
iniializare la declarare, fie printr-o instruciune de atribuire (n caz contrar va fi
semnalat o eroare la compilare).
Invocarea unei m eto d e, indiferent dac ea ntoarce sau nu o valoare.
Incrementrile, ce folosesc forma prefixat sau postfixat a lui ++ i --
In stru ciu n ea d e a trib u ire conine semnul =, eventual prefixat cu un
operator.
In stru ciu n ea vid este format numai din i care nu prevede vreo
prelucrare. t
In stru ciu n ea prin c a r e este c r e a t un o b ie c t folosete n acest scop
operatorul new.
In stru ciun ile ce c o n tro le a z o rd in ea d e executare, ca de exemplu: i f -
m lm m , fo r , w h ile etc. Ele vor fi prezentate detaliat n continuare.
2,7 Instruciuni 37
case v a l k : secven_instruciunik
default : secven_instruciuni
}
unde:
- ipui expresiei poae fi numai char, byte, short sau int;
- v a l l v a l k sunt constante (literali sau cmpuri statice finale
iniializate cu expresii constante) de acelai tip cu al expresiei;
- alternativa d e fa u lt este opional.
Executarea instruciunii are loc dup cum urmeaz. Este calculat vaioarea
expresiei, care este apoi comparat pe rnd cu v a l 2, v a l ki pn cnd se
detecteaz prima dat egalitate. Urmeaz executarea secvenei de instruciuni
corespunztoare, dar i a celor care u rm eaz; executarea acestora poate fl limitat
prin folosirea instruciunii break. Dac nu se detecteaz nici o egalitate, atunci se
execut secvena de instruciuni corespunztoare lui d e fa u lt (dac aceast
alternativ este prezent) sau nu se execut nimic (n caz contrar).
Mai general, o alternativ poate avea mai multe valori, ca n exemplul
urmtor:
cai 1 case 3 : case 5 b; b a
E x e m p lu . Programul urmtor:
o l Switch {
t t i c v oid numr (irit i) {
witch (i) {
& 1 lO.writef"unu " )
case 10.write ("doi
case IO.writeln{"trei " )
Acest paragraf este menit a face mai puin arid prezentarea de mai sus i
de a face unele precizri suplimentare.
^ 7 10
clasa ArbSort {
p u b l i c s t a t i c v o id main(String[] arg) {
elern Ob = new elem{)
Ob.creare(); XO.writeln(Ob.parcurg(elem.rad))
}
}
Observm c este respectat unul dintre principiile programrii orientate
spre obiecte i anume ncapsularea: clasa elem "pune la un loc'1 cmpuri i
operaii (metode) prin care aceste cmpuri sunt prelucrate.
i va produce la ieire:
11
v o id listare (} {
f o r ( i n t x=0; i<n i++) {
IO.writeti + \tn);
f o r ( i n t j=0 ; j<mat[i].length j++)
O.write(mat[i][j]+ ;
IO,writeln ()
}
0 writeln("*********"};
v o id parcurg{) {
atins = n@w booXean[n]
i n t cc=0, i
f o r (i=0i<n; i++) atins[i] = false
f o r (i=0i<ni++)
i ( ! atins[i] ) {
10.write{"Comp. conexa " + ++cc +
\t");
DF {i ); IO.writelnO ;
p r i v a t e v o id DF( i n t i ) {
in t j , k
atins[i] = true; O.writefi + H w
f o r {j=0 j<mat[i].lengthj++) {
-mat[i]{j ]; f ( ! atins[k] ) DF(k);
}
c l a s s ParcDF {
p u b l i c s t a t i c v o id main(String[] s) {
df Ob = new df(); Ob.listare()0b.parcurg();
}
}
1) n interiorul constructorilor:
class clasa {
clasa(int i) { tbis.i=i;}
} .
prin care cmpul i al clasei c l a s a primete valoarea i transmis Ia crearea
obiectului prin utilizarea constructorului de mai sus. n acest mod este clar
distincia ntre cmpui i i parametrul i. Evident, am putea renumi parametrul:
c la s a ( i n t i i ) { i = i i ; }
ceea ce poate conduce ns uneori ia confuzii privind semnificaia variabilelor.
Ob=new C l a s a ( j , t h i s ) ;
O clas este iniializat !a prima utilizare activ a ei, adic atunci cnd:
este invocat o metod declarat n clasa respectiv;
- este invocat un constructor al clasei;
- este creat un tablou ale crui elemente sunt de tipul clasei;
- este folosit un cmp neconstant declarat n clas sau se atribuie o valoare
unui astfel de cmp.
Dup cum vom vedea n capitolul referitor la extinderea claselor, nainte
ca o clas s fie iniializat este iniializat superclasa sa.
Cnd o clas este iniializat, are loc iniializarea cmpurilor i blocurilor
statice, exact n ordinea n care apar. n consecin o iniializare poate conine
referiri numai la cmpuri declarate anterior. Astfel secvena de declarri:
static int i = j
static int j = 1
3.5. Aplicaia 2 : Generarea tuturor (n f k ) - combinrilor 51
cn ~ ck ~ l + c n- l Pentru n > k ()
Formulele cantitative de mai sus sunt uor de demonstrat prin inducie i
apar n orice culegere de probleme ce acoper clasa a X-a. Ce nu apare n aceste
culegeri, isnci s se cread c este vorba numai de artificii de caicui, este
aspectul lor calitativ. Mai precis, semnificaia lui (!') este:
C (n,k) = X J C (i - l , k - l ) (2)
i=k
unde C { i ~ l , k - 1 ) este mulimea obinut prin adugarea elementului i la fiecare
dintre vectorii de lungime k -1 din C ( i - 1 , k - 1). Vom nota acest lucru prin:
C (i~ l, k -1 ) = C ( i- 1 ,
S exem plificm cele de mai sus pentru n = 4 , k=2.
C(4f2) = ( 1 ) 2 U C ( 2 , l ) 3 U C ( 3 , l } 4 =
= {( 1) }2 U { ( 1 ) / (2)13 U { (1) 2 ) ) }4 -
= { ( 1 , 2 ) } U { { 1 #3 ) f ( 2 , 3 5 } U { { 1 ; 4 ) , ( 2 , 4 ) # ( 3 , 4 ) ) -
- { ( 1 , 2 ) , ( 1 , 3 ) # ( 2 #3 ) , { 1 , 4 ) , { 2 #4 ) , { 3, 4} }
52 3. A L T E ELEMENTE ALE LIMBAJULUI JAVA. A P L IC A II
Este clar c:
- dezvoltarea nodurilor din arbore se oprete cnd devine 0;
- ( 4 ,2 } - combinrile se regsesc parcurgnd drumul de la frunze ctre
rdcin.
v oid p() {
elem x=nullint i
i f ( == 0) IO.writeln(++cnJc + *\t: + print ())
e l s e fo r (i = i<=n i++) {
x = new elem(i~l, -l, this); x.p ()
}
) .
c la s s Comb {
p u b lic s t a t i c v oid main( String[] arg) {
10.write("n# =");
in t n= (in t) 10.read(); in t k= (in t} 10.read();
elem prim = new elem{n,k,null); ,
prim.pU ;
IO.writeln("n= " +n +" k= *+ k+ cnk= " +elem.chk)
un pachet fr nume, constituit din aceste uniti; dar n acest mod clasele
pachetului fr nume pot fi accesate numai din interiorul pachetului, ceea ce
evident reprezint un dezavantaj.
Ne ndreptm n continuare atenia asupre pachetelor cu nume. Pachetele
sunt organizate n directoare n sistemul de fiiere al mainii gazd.
Un pachet poate conine:
- subpachete ale pachetului;
- tipuri (clase sau interfee) declarate n unitile de compilare ale
pachetului (avnd toate aceeai declarare package).
O clas sau interfa dintr-un pachet poate fi accesat din afara pachetului
doar dac are modificatorul public* Aceeai regul este valabil pentru accesarea
direct a membrilor unei clase a pachetului. Pentru constructori trebuie procedat Ia
fel, afar de cazul n care se folosete constructorul implicit, care este considerat ca
avnd modificatorul p u b lic.
n a in te d e a d e s c r ie m o d u l n c a r e s t e e x e c u ta t a p lic a ia , s u n t n e c e s a r e
c te v a p r e c i z r i s u p lim e n ta r e r e la tiv e la c o m e n z ile j a v a i j a v a c i la v a r ia b ila
d e m e d iu C L A S S P A T H .
Putem spune c un parametru poate ascunde un cmp, iar o variabil local poate
ascunde un parametru i/sau un cmp.
Dup cum vom vedea n continuare, numele unei metode nu poate fi
ascuns.
@ Modificatorul f i n a l
Modificatorul s t a t i c
Modificatorul static poate fi folosit la declararea cmpurilor i
metodelor unei clase, precum i pentru a anuna un bloc de iniializare static.
O variabil local nu poate fi declarat cu s t a t i c .
Fie c un cmp declarat cu etatio n clasa Clasa. Aceast declarare are
dou consecine:
4,2. Vizibilitate i acces 63
Modificatorii de acces 0
Ne mrginim n acest paragraf ia o succint prezentare a acestor
modificatori. O discuie mai detaliat va fi fcut dup ce vom vorbi despre
extinderea claselor.
Toate cmpurile i metodele unei clase sunt accesibile (pot fi referite) din
interiorul clasei.
Rolul modificatorilor p u b lic , p r o te c te d , p r i v a t e i cel implicit
(numit uneori p a c k a g e ) referitor la accesul din exteriorul unei clase Ia membrii si
este sintetizat n urmtorul tabel:
c l a s s Punct {
i n t x , y ; Punct urm;
P u n c t ( in t x , i n t y) { t h i s . x = x t h i s .y= y; }
v o id O r i g i n e ( ) { x = 0 ; y - 0 }
Punct M i c a r e ( ia t x , i n t y) {
Punct p = new P u n c t ( x , y ) urm=p r e t u r n p
1
}
Clasa P unct conine:
- cmpurile x , y , urm;
- constructorul Punct cu signatura ( i n t , i n t ) ;
- metoda O r ig in e cu signatura () i metoda M ica re cu signatura
(In t, i n t ) ,
c l a s s P ix e l e x te n d s P unct {
String culoare;
P i x e l ( i n t x , i n t , S t r in g c u lo a r e ) {
s u p e r ( x , } t h i s . c u lo a r e = c u lo a r e ;
}
v o id O r i g i n e () { s u p e r . O r ig in e { ); c u lo a r e = " a lb " ; }
}
Clasa p i x e l conine:
- cmpurile x^y^urm { m o te n ite de la clasa P unct) i c u lo a r e (care a
fost adugat prin extindere);
- constructorul P ix e l cu signatura ( i n t , i n t , S t r i n g ) ;
- metoda M ica re cu signatura ( i n t , i n t ) , motenit de la clasa Punct,
precum i metoda O r ig in e cu signatura (5, care r e d e fin e te metoda O r ig in e a
clasei Punct.
Test {
public static void m a i n (String[] s) {
IO.writeln(Sub.i + ");
Observaii:
- un constructor poate invoca un alt constructor i anume prin t h is ( . . . ) ;
aceast invocare poate avea loc numai ca prim aciune a constructorului (deci nu
pot fi invocai doi constructori). n schimb acest mecanism nu poate fi folosit
pentru a invoca, din corpul unei metode, un constructor;
- un constructor poate invoca o metod, caz n care se consider
implementarea metodei corespunztoare tipului real al obiectului (vezi subcapitolul
urmtor).
- dac din constructorul P i x e l din Exemplul 1 am elimina invocarea
su p er ( x , y ) compilatorul ar semnala o eroare deoarece, conform mecanismului
descris mai sus, constructorul P i x e l va invoca implicit constructorul fr
argumente at superclasei, care ns nu exist (el exist implicit doar dac nu s-a
specificat un alt constructor).
5.2. Din nou despre iniializare i constructori 69
S considerm clasele:
c la s e a {
i n t va-1, v;
a() { v=va }
}
c l a s s b e x te n d s a {
i n t vb=2
b ( ) { v=va+vb; }
}
e la s s T e s tl {
p u b lic s t a t i c void main(String ) {
Super Ob = n#w Sub()Ob.metl(}0b.met2()
)
)
produce Ea ieire:
Btatlc^Super
Sub
@1 @3t A {
; 1 vb-2, v
B{) { v=va+vb; }
in t met O { return v b }
clase C o n str {
p u b lic t t i c v o id main ( S t r i n g [ ] s) {
A a = a@w () ;
0 .writeln (\t"+a.met ()};
72 5. EXTINDEREA CLASELOR
class A {
S t r in g s= " S u p er" ;
void scrie{) { IO.writeln{nA H+s) }
}
class A {
S t r in g s = MSub";
void s c r i e () { I O . w r i t e l n ( MB *+s) }
}
class AB1 {
public static void m a in ( S t r in g [] s) {
b = new ( ) ; A a = b;
a .scrie()b.scrie() '
10.writeln(a.s + "\t" + b .s )
}
n care b are mai nti tipul real x, apoi tipul real C, apoi tipul real Y. Spunem c
Ob este o variabil polimorflc, deoarece are pe rnd forma (comportamentul) a
mai multor clase.
Din exemplul de mai sus rezult clar c doar ia momentul executrii putem
determina necesarul de memorie pentru obiectul Ob, ceea ce justific de ce Ia
creare obiectele sunt "stocate" n heap-ul memoriei. Mai precis, la crearea unui
obiect este alocat spaiu pentru toate cmpurile nestatice din clas, inclusiv pentru
cele ascunse.
class extends A {
String s="Sub";
void scrie() { IO.writeln("B "+s+" "+supr.s};)
v o id metoda() { scrie( ) ; s u p e r . scrie( ) ; s u p e r . metoda(}
}
class AB2 {
p u b l i c s t a t i c v o id m a i n ( S t r i n g ! ] x) {
b = new {); b.metoda(); lO.writeln(b.s);
IO.writeln (* * * * * * * * * * * * * * * * * ' )
A a; a = b; a .m e to d a {) l O . w r i t e l n ( a . s ) ;
1 0 w iri t I n ("*** * * *}
A c = new A(); c .metoda{}IO.writeln{c.s)
: Sub Super
A : Super '
A:
Sub
* * **** ****
Sub Super
A : Super
A:
Super
A:
Super
class A {
int x=l;
void met() { 10.w rite("\t"+x) ; }
}
class extends A {
boolean x^false;
void met() { 10.write{"\t"+x) super.met() }
}
class C extends {
double x=3.14;
void met() { 10.write("\t"+x) super.met() }
}
class SubSup {
public static void main (String[} s) {
C Ob = new C {}; Ob.met(};
}
}
produce la ieire:
3 .14 false 1
- orice obiect care instaniaz o clas poate fi folosit n orice cod menit s
lucreze cu instanieri ale superclaselor sale;
- orice obiect care instaniaz o clas poate folosi (n modurile descrise mai
sus) codul supraclasei.
arat c doar la momentul invocrii metodei devine clar care dintre cele dou
metode met va fi invocat.
76 5 . EXTINDEREA CLASELOR
111.3. Dac membrul sau constructorul nu este declarat, deci are modificatorul
implicit, accesul este permis numai din pachetul n care entitatea respectiv
este declarat,
111.4. Dac membrul sau constructorul n care entitatea respectiv este
declarat cu p r i v a t e , accesul este permis doar din interiorul clasei n care
entitatea respectiv este declarat,
D
Presupunem c n clasa A apare un cmp x declarat cu protected. S
presupunem c din facem o referire la acest cmp prin c .x , unde c este un obiect
de tipul C. Aceast referire nu este permis (exceptnd cazul n care clasele i C
apar n acelai pachet) deoarece ieim din subarborele din care se face referirea.
Restricia de mai sus nu mai funcioneaz pentru membrii declarai cu
p r o t e c t e d , dar i cu s t a t i c : orice metod din , C, D poate accesa cmpul x
prin referine avnd oricare dintre tipurile , , C, D. 1
obiect avnd ca tip aceast clas. Astfel de clase sunt folosite de obicei pentru a
Htca" metode i cmpuri statice, un exemplu fiind clasa System. Dar aceasta nu
nseamn c nu putem folosi o construcie indirect: din afara clasei putem invoca
de exemplu o metod static a lui C ce construiete un obiect de tipul C i l
ntoarce ca rezultat:
class C {
private C () {}
static C met () { return new ; }
void scrie() { IO.writeln"O.K.")}
Ol&ee Constrf {
public static void main (Stringt] s) {
C Ob = C.metO; Ob.scrieO;
/L METODE I CLASE ABSTRACTE
0 INTERFEE. CLASE INTERNE .
class Cl extends C {
void met () {
int x-0
for (int i = 0 ; i < 1 0 0 0 0 0 0 ; i++) x = x + l~ l;
clase Abstr {
public static void main{String[3 s) {
Cl Ob = new Cl();
IO.writeln "durata"+0b.timp());
Precizm urmtoarele:
- o interfa poate extinde oricte interfee. In acest mod interfeele permit
motenirea unor Hcontracten (numele i signaturile unor metode) ftr motenirea
implementrii;
- dac o clas implementeaz doar unele din metodele unei interfee, atunci
ea trebuie deciara cu a b s tr a c t;
spre deosebire de interfee (care sunt limitate la constante i anunuri de
metode), clasele abstracte pot avea implementri pariale, metode statice, membri
cu modificatorul protected, cmpuri care nu sunt finale etc.;
- o clas poate implementa oricte interfee, dar poate extinde o singur
clas.
Dac o clas extinde o alt clas i implementeaz una sau mai multe
interfee, atunci trebuie anunat nti extinderea i apoi implementarea, ca n
exemplul urmtor:
class C extends iuqplLements 1 ,1 2 ,1 3 ;
z
i n clasele w, x i Y ar fi definit (respectiv redefmit) un cmp c, atunci pentru un
obiect b de tipul Z semnificaia lui . c ar fi neclar.
6 J, Extinderea interfeelor 83
X Y
/ ,
z
este posibil ca n una sau mai multe dintre interfee s fie declarat o constant c.
Deosebim dou cazuri:
1) Constanta c este redeclarat n interfaa Z : o referire la c constituie o
referire la constanta c din z. Putem face ns referire i la constantele din celelalte
interfee prin x . c, Y. c i W. c. '
2) Constanta c nu este redeclarat n interfaa z : o referire la c este corect
dac exist un unic drum de interfee ce "coboar" n z, drum n care c poate fi
declarat de mai multe ori; n acest caz referirea are ca obiect cea mai ^recent"
declarare a cmpului, adic cea din interfaa cea mai apropiat de z. Dac c este
declarat pe mai multe drumuri de interfee ce "coboar** n z, compilatorul va
semnala c este vorba de o referire ambigu. Dac n z constanta c nu poate fi
regsit pe nici un drum de interfee ce ajunge n z, atunci va fi semnalat din nou
eroare.
84 6. METODE I CLASE ABSTRACTE. INTERFEE. CLASE INTERNE
cl& C iiaplemat {
public void met () { IO.writeln(++++++) }
}
class D iznplmente 2 {
public void met () { IO.writeln(******") }
}
class I n t e r f e e i ixnplomonte Z {
public void m e t () { }
public static void main (S t r i n g [] s) {
C Obi new ; .m et ( ) ;
D 0b2 = new D ? 0b2 .m et ( ) ;
int c=-88; // met();
I O . w r i t e l n ( c + n "+W.C+" "+.+ "+Y.C+ "+Z_c );
produce ia ieire:
+++++
*****
-88 a 1 true -99
Presupunem mai nti c n unul sau mai multe dintre aceste tipuri apare un
cmp (constant n cazul interfeelor) cu acelai nume c. Atunci discuia este
analoag cu cea referitoare Ia extinderea interfeelor, cu urmtoarea adugire: dac
c este declarat att n Z, ct i n clasa pe care o extinde, va trebui s specificm
s u p e r. c pentru cmpul din superclas.
produce la ieire;
1
3 ;
K 4
3
din urmtoarele motive:
- y.x din metoda principal este o referire la un cmp constant, deci nu
conduce la iniializarea interfeei x
-z .y din metoda principal este o referire ia un cmp neconstan declarat
n Y i ca urmare aceast interfa este iniializat. Aceasta nu conduce ns la
iniializarea superinterfeei x. De asemenea nici interfaa z nu este iniializat, dei
numele ai apare n referirea z .y.
s C ixnplttmazitB {
X ObX= a@w CX(); I I Clasa C "stiee ca trebuie sa foloseasc
I I implementarea CX a interfeei X
public void xl() { ObX.xl (} }
public int x2() { return ObX.x2 () }
clase Muli {
public static void main (String[] a) {
ObC = new ;
.) ; IO.writeln(
, +0.2
}
produce la ieire :
xl 1
class C implements X {
X 0 b l( 0b2;
C(X Obi, X 0b2) { this.Obi=0bl; this.Ob2=Ob2;}
public void xl{) { Obl.xlO; }
public int x2() { return 0b2.x2(); }
class Mult2 {
public static void main (String[] s) {
X Obi = nw CXI(); X 0b2 = new CX2();
= new (0 ,0b2};
ObC.xl () ; lO.writet" '*+0bC.x2 ())
}
se obine la ieire:
xl 2
class Copiei {
public static void main {String[] s) {
= n@w ); Ob2 - .Clone ();
IO .writeln ( .x+n +2 .);
.inc {) ; 2 .inc () ; 2 .inc ();
IO .writeln (Obi.+" "-fOb2 .);
}
}
6.7. donarea obiectelor 91
produce la ieire:
0 0
1 2
Sunt necesare urmtoarele precizri:
- este obligatorie conversia explicit a rezultatului ntors de clo n e la tipul
dorit;
- am inclus invocarea lui c lo n e ntr-o metod C lone din clasa C deoarece
acolo i este n mod natural locul (este o prelucrare ce se refer la clasa c); pe de
alt parte nu puteam s invocm c lo n e din metoda principal, deoarece nu este
static;
- despre t r y i c a tc h vom vorbi pe larg n capitolul urmtor.
class Clonare {
public static void main(String[] s) {
Stiva SI = new Stiva(10);
5 1 . push(l); SI.push(3) ; SI.push( 5) ; SI.push(7);
Stiva S2 = SI.Clone();
52. pop(); S2.pop(); S2.push(13);
SI.scrie()S2.scrie{);
La ieire va aprea:
-1 3 13 7
1 3 13
care nu este rezultatul dorit. Explicaia const in faptul c la clonare, Ia copierea
cmpurilor n noul obiect S2, a fost copiat adresa tabloului v (tipul tablou este un
tip referin), deci se lucreaz cu aceeai stiv; cmpul top este ns distinct pentru
cele dou obiecte.
Pentm a lucra cu stive distincte, v va trebui conat explicit. Aceasta se
realizeaz transformnd comentariul din Clone n instruciune efectiv. Cu aceast
modificare, programul va produce acum la ieire rezultatele dorite:
13 5 7
1 3 13
Instanierea unei clase interne este asociat instanierii curente a clasei care
o conine; drept urmare clasa intern poate accesa direct cmpurile clasei ce o
cuprinde.
6.8. Clase interne 93
Cele de mai sus nu mai rmn valabile pentru clasele de nivel superior: o
clas care este membru static al unei clase nu poate folosi direct cmpurile clasei ce
o cuprinde (dar putem realiza acest lucru n mod indirect, prin crearea unui obiect
ce instaniaz clasa al crui membru este).
enor
enwhle
Pentru implementarea cozii am folosit o list nlnuit, n care primul
element este fals (deci coada propriu-zis ncepe de la al doilea element al listei).
v o id creare(} {
i n t i
i = (int) 10.read(); rad = new vrf(i); creare(rad);
class elem {
vrf inf; elem leg;
elem (vrf v} { inf = v }
String niveluri() {
elem p,u,xvrf ; String - ""/
p = new elem(null)u = new elem{rad); p.leg = u
while ( p != u ) {
x - p . legs x.inf.v 4- 11 '' P.leg = x.leg;
if (p,leg = = n u l l ) u = p //
x inffiu;
w h ile ( l = n u l l ) {
= nw elem(y); u.leg = x;^ u = X = .frate;
}
}
r e t u r n s
}
}
c l a s s Niveluri {
p u b lic s t a t i c v o id main ( String[ 3 arg) {
vrf Ob = nw vrf();
Ob
creare();
IO.writeln( "Niveluri " + '\t' -f Ob. niveluri {} };
}
}
olass A_C {
static A ObA
public etatc void main(Stringt] s) {
, ObA = aw A(3) {
void m e t f) { IO.writeln{"0,K. " ) }
};
ObA.met{);
}
}
Clasa abstract a are un constructor i o metod care nu prevede nici o
aciune. Pare ciudat faptul c dei metoda nu este abstract, clasa a fost declarat ca
fiind abstract; acest "artificiu" este de fapt o invitaie la a extinde clasa i a preciza
aciuni specifice pentru metode.
n clasa AC apare metoda principal, n care obiectul ObA (avnd tipul
declarat a ) este creat ca avnd ca tip reai o clas anonim care extinde clasa
abstract A. Clasa anonim este o clas intern. Dup invocarea constructorului este
invocat metoda met; este vorba bineneles de metoda m et redefinit n clasa
anonim. Drept urmare la ieire va aprea;
3
O.K.
class IC {
static I 0;
p u b l i c s t a t i c v o id m a i n (S t r i n g [] s) {
= new I () {
p u b l i c v o id m e t () { I O . w r i t e l n { " O . K . " ) ; }
};
Obi.met();
Din nou este creat o clas (intern) anonim i un obiect avnd ca tip real
HC&clSta. c in S a j lVOCa TlvtM XUSu r v ^ v f lr iit Sl d ^ S u utidliT iU i
Executarea programului produce la ieire:
O.K,
O interfa nu poate avea constructori explicii. Exist ns constructorul
implicit cu aciune nul; acest constructor a fost folosit n exemplul de mai sus.
Este interesant de subliniat nc un aspect. Clasa C are modificatorul de
acces implicit, dar n interiorul ei apare o metod cu modificatorul (mai permisiv)
p u b lic . Acesta se datoreaz faptului c metoda redefinete o metod (public)
dintr-o interfa.
7 Excepii
Noiunea de excepie
Un aspect important de care trebuie inut cont ori de ce ori scriem un
program este de a asigura robusteea sa. Prin aceasta nelegem identificarea
situaiilor nedorite (de exemplu introducerea unor date eronate, eecul la
ncercarea de a avea acces la Internet etc.) i specificarea aciunile
corespunztoare.
Exist ns i reversul aspectului descris mai sus. Introducerea de verificri
prin instruciuni de control face programul greu de citit i afecteaz buna sa
structurare.
Ceea ce dorim este s avem un mecanism care:
- s permit ca fiecare condiie legat de robusteea programului s fie
verificat exact acolo unde poate s apar;
- atunci cnd condiia apare (suntem n situaia c s-a ntmplat ceva
nedorit), controlul s fie trecut automat unei seciuni de cod aflat n program
"ntrun loc potrivit" (care poate fi departe" de locul unde condiia a fost
detectat), cod care realizeaz aciunea ce trebuie ntreprins. Acest cod va fi
numit handler (mnuitor) de excepie.
Construcia tr y
fin a lly b lo c _ f in a l
unde:
- E__l, E_2, . . . sunt tipuri de excepie (clase ce extind E x cep tion );
- e 1, e _2 , . . . sunt identificatori;
- clauza f i n a l l y este opional;
- blocurile reprezint tocmai handlerele de excepie.
Tratarea excepiilor
Descriem n continuare modul tipic de utilizare a excepiilor. Pentru
simplificare vom considera un singur tip de excepie cu un unic constructor i o
unic metod.
La construcia urmtoarei clase:
olaee Clasa {
Clasa(.) {.}
Met(. . ) t hrow* Excepie {
try {
Ob.Met (...);
}
catch (Excepie e){
" . e .MetExc (...};
Un exemplu
Vom aplica cele de mai sus la rezolvarea urmtoarei probleme:
Un vector a de lungime n conine n caractere. Ele trebuie mutate ntr-o
ordine oarecare n vectorul bt prin intermediul unui vector auxiliar s t a c k de
lungime lu ng, care implementeaz o stiv. Operaiile permise sunt:
7 Excepii 103
Unitatea de compilare P l i n a . ja v a :
clase Plina extends Exception {
* void print(String s) { IO.write(s); }
ClassNotFoundException
CloneNotSupportedException
XllegalAccessException
InstantiationException
InterruptedException
NoSuchFieldException
NoSuchMethodException
HuntimeException
ArithmeticException
ArraystoreException
ClassCastException
IllegalArgxamenfcException
IllegalThreadStateException
NumberFormatException
IllegalMonitorStateException
s IllegalStateException
IndexOutOfBoundsException
ArraylndexOutOfBoundsException
StringlndexOutOfBoundsException
106 7. EXCEPII CONVERSII
NegativeArraySizeException
NullPointerException
Security-Exception
UnsupportedOperationException
12. Conversii
Java acord o atenie deosebit tipurilor. Fiecare expresie are un tip ce
poate fi dedus din structura expresiei i din tipul entitilor ce intr n alctuirea sa:
literali, variabile i invocri de metode. Sunt ns permise, n anumite condiii bine
precizate, conversii de la un ip ia un al tip; acest aspect este subiectul acestui
subcapitol.
Evident, nu orice conversie este admis. De exemplu expresia ce apare n
instruciunea i f poate avea numai tipul b o o lean , n caz cdhtrar semnalndu-se o
eroare chiar la compilare. Mai precizm c o conversie (admis) poate conduce la
o aciune corespunztoare n faza de executare, aa cum vom vedea mai jos; aceste
aciuni pot conduce n anumite cazuri ia lansarea unei excepii.
Conversiile pot aprea n urmtoarele contexte;
- ia atribuire, cnd tipul unei expresii trebuie convertit la tipul variabilei ce
primete valoarea expresiei;
- la invocarea unei metode sau a unui constructor, cnd are loc transferul
argumente > parametri;
- la conversii ce implic tipul S tr in g : orice tip poate fi convertit la
String
- la evaluarea unei expresii numerice: operanzii trebuie adui la un tip
comun, astfel nct expresia s poat fi evaluat;
- ia o conversie explicit.
Ne propunem s prezentm numai principalele aspecte legate de conversii.
@ Conversii implicite
n aceast categorie intr conversiile efectuate automat, fr vreo precizare
explicit n program.
produce la ieire:
1234567890 1.234567894E9
Conversii explicite
Cunoatem deja c o conversie explicit la un tip T se face prin prefixare
cu (T ), ca de exemplu n;
T ObT = (T) Ob;
Evident, nu este permis orice conversie (chiar explicit) de la un tip ia un
alt tip.
8 Funcii matematice
Java pune la dispoziia utilizatorilor o larg gam de funcii matematice,
prin clasa Math din pachetul java.lang:
public final class Math extends Object
Metoda:
double pow(double a, double b)
ntoarce valoarea ab.
Metoda random fr parametri ntoarce o valoare aleatoare de tip d o u b le
din intervalul [0 , 1 ).
110 8. FACILITI STANDARD
Metoda:
in t ro u n d (flo a t f )
ntoarce valoarea ntreag cea mai apropiat de f .
Metodele publice:
b o o l e a n n e x t B o o l e a n ()
i n t n e x t l n t {)
l o n g n e x t L o n g {)
d o u b l e n e x t D o u b l e ()
f l o a t n e x t F l o a t ()
ntorc urmtoarea valoare aleatoare de tipul respectiv.
Metoda:
i n t n e x t l n t ( i n t n)
ntoarce urmtoarea vaioare ntreag aleatoare din intervalul [ 0 , n ) .
Metoda:
v o i d n e x t B y t e s f b y t e [ ] b)
ntoarce, n tabloul furnizat ca argument, valori aleatoare de tip b y te .
B ig ln t e g e r n e g a t e () -a
B ig ln t e g e r g c d ( B ig ln t e g e r b) cnmdc (a, b)
B ig ln t e g e r p o w (B ig ln te g e r b) ato
i n t sig n u m () s ig n ( a )
B ig ln t e g e r m od(B ig n t e g e r b) a mod b
B ig ln t e g e r a n d ( B ig ln t e g e r b) . &
B ig ln t e g e r o r ( B i g l n t e g e r b) 1 b
B ig ln t e g e r n o t ( B ig ln t e g e r b) ! b
B ig ln t e g e r x o r ( B i g l n t e g e r b) a xor b
B ig ln t e g e r s h i f t L e f t ( i n t n) a n
B ig ln t e g e r s h i f t R i g h t {i n t n) a >> n
i n t c o m p a r e T o (B ig ln te g e r b) -1 , 0 sau 1 (dup cum a<b(
a=b sau a>b)
B ig ln t e g e r m in ( B ig ln t e g e r b) m in (a ,b )
B ig ln t e g e r m ax( B ig ln t e g e r b) m a x (a ,b )
in t in t V a lu e ( B ig ln t e g e r b) (in t) a
lo n g lo n g V a lu e ( B ig ln t e g e r b) (lo n g ) a
f l o a t f lo a t V a l u e ( B i g l n t e g e r b) (flo a t) a
d ou b le d o u b le V a lu e ( B ig ln t e g e r b) (d o u b le) a
S tr in g t o S t r in g O reprezentarea lui a ca ir
b o o lea n e q u a l s ( B ig ln t e g e r b) a==b (ca valori numerice)
@ Compararea irurilor
b o o lea n e q u a l s ( S t r i n g s i ) :
ntoarce tr u e dac irurile coincid;
i n t CompareTo(S t r in g s l ) :
ntoarce o valoare negativ (dac e < s l) s zero (dac s = s l ) sau o valoare
pozitiv (dac s > s l);
b o o lea n r e g io n M a tc h e s ( i n t p , S t r in g s l , i n t p l , i n t l u n g ) :
compar secvenele de lungime lu n g ce ncep n s de pe poziia p, respectiv
n s l de pe poziia p l; este ntoars valoarea tr u e dac i numai dac aceste
secvene coincid;
b o o lea n s t a r t s W it h ( S t r in g p re) : ntoarce tr u e dac irul p re este prefix
al lui s i f a l s e altfel;
b o o lea n endsW ith (S t r in g s u f ) : ntoarce t r u e dac irul s u f este sufix al
lui s i f a l s e altfel.
valoarea ntoars de metoda intern este aceeai. Drept urmare putem verifica
dac dou iruri au acelai coninut prin:
s l .intern{} == s 2 .intern(}
care este mai rapid dect:
s l .equals s2).
Conversii
n multe cazuri suntem pui n situaia de a converti valori numerice n
iruri sau de a trebui s lucrm cu o valoare numeric memorat ntr-un ir.
irul ce corespunde unei valori numerice sau booleene x se obine simplu
prin:
String.valueOf{x}
Metoda valueOf a clasei S t r i n g mai poate invocat i pentru un
caracter: va fi ntors irul format din acel unic caracter.
Transformarea invers (de la un ir ce conine un literal boolean sau
numeric) Ia acel literal se poate realiza folosind metodele puse Ia dispoziie de
clasele nfturtoare.
Interfaa Cosnparator
Interfaa Comparator:
public interface Comparator
apare n pachetul java.util i n ea este anunat metoda:
public int compare(Object Obi, Object Ob2)
menit s compare cele dou argumente conform unei relaii de ordine totale,
specificate n implementrile metodei. Dac notm relaia de ordine prin <t atunci
rezultatul ntors trebuie s fie negativ, egal cu zero sau pozitiv, dup cum
118 8, FACILITI STANDARD
Clasa Arrays
Clasa A rrays:
public class Arrays extends Object
cu care lucrm este cea uzual pentru tipul primitiv corespunztor. n a doua form
se specific explicit un comparator.
import java.util .*
class elem {
in t x i n t y;
elemfint i , in t j ) { x = i ; y = j }
class Compar {
public static void main(String[] s) {
elem[3 tab ^
{new elem(1,2), new elem(3,1), new elem(1,1));
comp c = new comp ()
Arrays.sort(tab,c);
for (int i=0 i<tab.lengthi++) {
System.out.println(tab[i] .x + 11 + tab[i] .y)
}
Collection
S e t
List
Map
Enumeration
120 8. FACILITI STANDARD
Clasa Vector:
public class Vector implements List
Parcurgerea pe niveluri a unui graf presupune alegerea unui vrf drept vrf
iniial i vizitarea vrfurilor grafului n ordinea distanelor lor fa de vrful iniial.
Prin v iz ita r e a unui vrf se nelege efectuarea unor prelucrri, ce depind de
problema concret, asupra vrfului. n cele ce urmeaz, parcurgerea unui vrf va
consta n scrierea numrului su de ordine.
5. 7. Organizri ale datelor 123
Pentru a evita vizitarea repetat a unui acelai vrf, vom ataa fiecrui vrf
o variabil v i ce are valoarea t r u e sau f a l s e dup cum vrfu a fost sau nu
vizitat. Algoritmul folosete o coad C:
Programul are aceeai structur ca cel din capitolul 2, menionat mai sus.
Numele casd d f a fost schimbat n n i v e l . n tabioul temp, al cnii numr curent
de elemente este ntemp, sunt citite succesiv listele vecinilor vrfurilor. Metoda
p a rc u rg implementeaz algoritmul de mai sus.
import java.util .*
clasa nivel {
CIPRIAN COMA
i n t [][3 m a t i n t n Nr 4 b
nivel) {
int[] temp int ntemp; double d
10.write("n= "); n = (int) 10.read()
mat - new int[n][]; temp = new int[n ]
for (int i=0; i<n; i++) {
' C K w rite " V e c in ii l u i " -f 1 ")
124 8. FACILITI STANDARD
class Niveluri {
public static void main(StringE] s) {
nivel 0b ~ new nivel Ob.parcurg{);
}
}
Clasa Stack:
p u b lic c l a s s S ta c k e x te n d s V e c to r
adaug clasei V e c to r facilitile uzuale de lucru cu stive.
Clasa StringTokenizer:
public class StringTokenizer extends Object
im p lem en ts E num eration
furnizeaz metode pentru a extrage entiti dintr-un ir. Entitiie sunt separate ntre
ele prin unul sau mai multe caractere, cu rol de delimitatori. Delimitatorii implicii
sunt ' \ t \ ' \ n ' , ' \ r ' i ' \ f ' putem ns specifica explicit o mulime de
delimitatori. De asemenea putem alege ntre a considera sau nu un delimitator ca
fiind o entitate.
Detectarea entitilor se face secvenial de la nceputul irului spre sfritul
su.
unde hasM oreTokens verific dac mai exist entiti n ir dup poziia curent,
iar nextT oken ntoarce urmtoarea entitate; aceast a doua metod lanseaz
excepia N oSu ch E lem en tE xcep tion dac dup poziia curent nu mai urmeaz
nici o entitate.
126 8. FACILITI STANDARD
Clasa collections
v o id reverse( L is t l i s t a ) :
inverseaz ordinea elementelor din list;
v o id s h u f f l e ( L i s t l i s t a ) :
permut aleator ordinea elementelor din list;
v o id c o p y ( L i s t l i s t a i , L i s t l i s t a 2 )
copiaz l i s t a i n l i s t a 2 ; u
v o id sort ( L is t l i s t a . Comparator c ) :
sorteaz, prin metoda sortrii prin interclasare i conform ordinii stabilite prin
comparatorul c, lista primit ca argument;
8.7. Organizri ale datelor 127
folosete metoda cutrii binare pentru a verifica dac obiectul x apare n lista
l i s t a , ordonat conform comparatorului c. n caz afirmativ, este ntoars
poziia pe care se afl x. n contrar, este ntoars valoarea (negativ!) - p -
1, unde p este poziia pe care ar trebui inserat x.
Object min(Collection col, Comparator comp):
ntoarce cel mai mic element din list (conform ordinii stabilite prin
comparatorul c);
Object max(Collection col, Comparator comp):
ntoarce cel mai mare element din list (conform ordinii stabilite prin
comparatorul c).
Pentru ultimele patru metode exist i varianta de a nu specifica explicit un
comparator. Aceast variant nu este aplicabil n general, deoarece la ncercarea
de a compara dou obiecte nu e clar modalitatea de comparare i drept urmare va
fi lansat excepia ClassCastException. Varianta poate fi totui folosit de
exemplu cnd elementele din list au acelai tip i anume o clas nfurtoare.
}
class Sort {
public static void main(String s) {
int x,y,poz Object Ob; comp c = new comp)
Vector V = new Vector();
x = (int) XO.readU; = {int} 10.read (}
while { x != 0 ) {
if(y !~ 0) Ob = new elem(x,y )
else Ob = new Integer(x)
poz = Collections.binarySearch(V,Ob,c);
if (poz<0) poz = -poz-l V.insertElementAt(Ob#poz)
x = (int) 10.read() ; ~ (int) .;
}
E x e m p lu l 7. Urmtorul program:
in t e r f a c e I { }
c l a s s A im p lem en ts I { }
c l a s s e x te n d s A { }
c l a s s C la sa {
s t a t i c v o i d p r i n t ( C l a s s C) {
C la s s D = C. g e t S u p e r c l a s s ()
10.writeln(C.getName()+" +D.getName())
130 H. FAC1UT1 STANDARD
produce la ieire:
A java.lang.Object
BA
false
A java.Object
true
Member (interfa)
Constructor
Field
Method
S tr in g getN am e()
ntoarce numele metodei;
in t g e t M o d i f i e r s ()
ntoarce modificatorii metodei, codificai ca un ntreg; pentru decodificare
trebuie folosit clasa M o d ifie r (vezi documentaia);
C la ss g e tR e tu r n T y p e ()
ntoarce tipul rezultatului produs de metod;
C la s s [] g e tP a r a m e te r T y p e s{)
ntoarce signatura metodei;
C la s s [3 g e tE x c e p tio n T y p e s ()
ntoarce un tablou cu tipurile excepiilor declarate de metod.
Clasa Thread
Metoda run din clasa Thread nu prevede vreo aciune. De aceea trebuie
ca programatorul s extind clasa Thread i s rescrie (suprapun) metoda run,
preciznd aciunea dorit.