Sunteți pe pagina 1din 65

Alexandru

Ene

Cosmin $tirbu

fu9ftffinm{e
nrieffitetd ps o6det&
o

teorie fn ep{it*{iitie Save

Editura llniversititii din Pitegfi


2008

Alexandru Eneo Cosmin $tirbu

Programare orient*n pe obiecte


teorie pi aplica{ii in Java

o
o
o
o
o
o
o
o
o

Introducere
Aplica{ii elementare in Java
Clase

Vectori. Matrici
Stringuri
Mo$tenirea
Clase abstracte. Interfete
Polimorfism
Grafica in Java

Editura Universitn{ii din Pitegti

PREFATA

liiiillttr i-t::il i:=.ll

fiffir*

1., iirau, ':,i


,o'.. ,,:
=i

(ffriurrgit&tii itn

iL$i. 'li

*$ rir
.iiii

Str. I6rgu din Vale, nr.l,


I 10040, Pitetti, jud. Aigeq

teVfax: 40 248 2l.64-48


''

Copyright O 2008 - Editura Universitifii din Pitegti


Toate drepturile asupra acestei edilii sunt rczewate
Editurii Universitilii din pitegti.
Nici o parte din acest volum nu poate fi reprodusd
sub nicio form6, ftrd permisiunea scrisd a autorului.

"=
ilr

Datoritd dezvoltdrii hard-ului (procesoare si memorii mai


performante), programele au putut deveni din ce in ce mai mari (ca
numdr de linii de cod). Programele mari, confin mai multe erori ceea
,
ce implici un cost de fabricalie mare. programarea orientata pe
obiecte (Poo) este o nour metodologie de programare care conduce
la dezvoltarea unor aplicafii mari, mai fiabile gilntr-un timp mai scurt,

decdt progra matea structuratf, .


Java este un limbaj de Poo, aparut in anul 1995, foarte

utilizat

in dezvoltarea de aplicatii dishibuite. Acest limbaj este de asemenea


foarte frecvent folosit, datoriti claritd{ii gi simplitilii lui, in studierea
conceptelor specifice de programare orientatd pe obiecte.
caftea se adreseaza studenlilor de la facultdfi tehnice, in scopul
inv6!6rii notiunilor de baza ale programdrii orientate pe obiecte, in
limbajul Java. Se presupune cunoscut limbajul C.

Editor: Lector univ.dr. Sorin FIANU


Redactor gef: Conf.univ.dr. Constantin TIBRIAN
Bun de tipar: 08.1 1.2007; tiraj:150

Referenfi gtiinfifici:

prof. univ. dr. ing. Ioan Li!5


prof. univ. dr. ing. Gheorghe Gawiloaia

Descrierea CIP a Bibliotecii Na{ionale a Romflniei


ENE, ALEXANDRU
Programare orientati pe obiecte. Teorie gi
aplicafii in Java / Alexandru Ene, Cosmin $tirbu. - Pitegti
Editura Universiti{ii din Pitegti, 2008
Bibliogr.
Index
rsBN 97 8-97 3-690-845-3

I. $tirbu, Cosmin
004.43

JAVA

004.42.045

Piteqti,2008

prof. dr. ing. Alexandru Ene


Universitatea din Pitegti

CUPRINS
Prefafi

Introducere
Cap.2 Aplicagii elementare in Java

11

Cap.

Cap.3
Cap. 4
Cap.5
Cap.6
Cap.7
Cap.8
Cap.9

Clase

Vectori. Matrici
Stringuri
Mogtenirea
Clase abstracte. Interfefe
Polimorfism
Excepfii
Cap. 10 Figiere
Cap. 11 Grafica in Java
Bibliografie

t7
37
55
63
75
79
89
95
105

125

Introducere

Capitolul 1
fntroducere

1. Ce este programarea orientati pe obiecte?


2. Ce este un obiect?
3. Ce este o clasi?
4. De ce a apirut?
5. Istoric limbaje POO.
6. Limbajul Java. Istoric. Avantaje. Dezavantaje.
1.

Ce este programarea

orientati pe obiecte?

Programarea orientatd pe obiecte (prescurtat: POO) este un stil


de programare in care descompunerea aplica{iei se face plecdnd de la
obiecte gi nu de la funcfii, a$a cum se fdcea in programarea structurati.
Proiectarea unei program ce folosegte metodologia POO incepe cu
gdsirea obiectelor ce intervin in aplicafie, gdsirea operaliilor ce se fac
asupra acestor obiecte, gf,sirea claselor gi a relafiilor dintre clase.

2. Ce este un obiect?
Un obiect este un lucru (o entitate soft) caractefizatprin
insugiri qi comportament. insugirile sunt modelate prin variabile
(variabile de instan{i), iar comportamentul prin func1ii. in
terminologia POO, funcfiile sunt denumite metode.
Un obiect este mai mult decdt o structur[ de date, este o
entitate ce are o stare gi este saracterizat de operalii ce pot fi executate
asupra lui.
Exemplu:
Obiectul cerc poate sI aibd ca gi insugiri caracteristice:
- coordonatele cercului: (x0,y0)
- culoarea cu care se deseneaz[

taza.
Ca operafii (metode), ce-i determini comportamentul:

calculArie$
calculPerimetru0

getYo0
setRaza$ * seteaz[ raza

getRaza0 - returneazd"raza
getxOQ

I 'Xmlr--

lntroducere
I

setXO0
setYO0

ntroducere

De asemenea, cu tehnologia POO se modeleazd mai bine


aplicatria ( realitatea ).

3. Ce este o clasi?

5.

Orice obiect se instanliazd, (se creazd) dintr-o clasd.


O clasd poate fi vdzutd ca un gablon din care se instanliazi
obiecte sau ca o "fabric5" de obiecte.
Clasa poate fi interpretatd qi ca o generalizare a noliunii de tip

ln anii '60, la nivel de cercetare este dezvoltat limbajul de


programare Simula, prirnul limbaj ce introduce nofiunea de clasd.
In anii '80 apar dciu6 tendinle in limbajele de POO:

1)

de date.

in general, o clasd conline variabile de instanf[ gi metode.


Existi clase particulare care nu au decdt variabile de instanli

crearea unor limbaje pur orientate pe obiect


adbugarea la limbajele procedurale existente, a suportului
pentru POO"
Ca limbaje pur orientate pe obiecr:

2)
gi

clase particulare care nu au decdt metode.


Clasele particulare ce contin doar variabile de instanf5 sunt

echivalentul structurilor (din limbajul C) .


in limbajul Java, ca qi in limbajul C+t, crearea unui obiect
(instan{iere) se face cu ajutorul operatorului new.
Se recomandi ca numele unei clase sd inceapf, cu literd mare,
iar numele unui obiect (instanfiat dintr-o clasd) sd inceapd cu literd

clasS de la Simula qi adaugd noi concepte debazd,pentru


POO, cum ar fi:
- rnogtenire
-legare dinarnicd ( polimorfism)
Este un limbaj mai ales pentru cercetbtori.

mici.
Exemplu:
Avem clasa Cerc gi obiectul cl din aceasti clas6.
Cerc cl; l/ declarafiaunui obiect cl de tipul Cerc.
De fapt, cl este numele unei variabile care va line adresa
(referin{a) unui obiect de tipul Cerc. Obiectul propriu-zis va fi creat in
zona de memorie denumitd heap.
Declara{ia unui obiect nu creazd obiectul. Obiectul este
instanfiat cu ajutorul operatorului new.
Exemple:
cl:new Cerc( );
c2:new Cerc(0,0,20);

4.

Istoric limbaje POO"

De ce a

apirut POO ?

Datoritl dezvoltirii hard-ului (procesoare si memorii mai


performante), programele au putut deveni din ce ?n ce mai mari (ca
numlr de linii de cod). Programele mari au mai multe erori latente,
ceea ce implic[ un cost de fabricafie mare. POO este un nou stil de
programare care conduce la dezvoltarea unor aplicafii mari, mai
fiabile (mai pufine erori) 9i intr-un timp mai scurt.

Limbajul C**, apbrut la inceputul anilor '80, urmeazd, cea dea doua tendinld i,"r limbajele de POO. Este veohiul limbaj C, la
care s-a addugat suportul pentru POO.

6.

Limba.futr Java" fstoric" Avantaje. Dezavantaje.

Limbajul
in anii'90.

.Iar.'a este urr

Istoric: O echipa

limbaj pur orientat pe obiecte gi a apdrut

de la firma Sun Microsystems, a dezvoltat un

limbaj de programare nou, portabil, pentru microcontrolere (pentru


: telecomenzi inteligente,
i
cl spozitive electrocasnice inteligente, etc.
).
Fortabilitatea este caracteristica programului de a fi executat
pe mai rr'rulte platforme diferite (sisteme de operare diferite qi/sau
procesoare diferite). Avern portabilitate la nivel sursd sau la nivel
binar. Fortabilitatea la nivel sursa este realizatl,in mdsura in care
programul sursd conline instrucliunile qi frmcliile standardizate ale
limbajului respectiv. Frogramul sursd trebuie sa fie recompilat pe noua
platbrm6 cle lurcru,
Portabilitatea la nivr:i binar a prrrgramului Java se obline prin
conrpilarea programului in chrrrii otflpe, tr)clripa de programatori de la
programal ea unor dispozitive inteligente

t0

Introducere

firma Sun a realizatportabilitatea la nivel binar realizAnd compilarea


de la limbajul sursd (.java) pentru un procesor virtual denumif magina
virtuali Java (wM * Java virtuar Machine). Figierul compilat
pentru acest procesor virtual are extensia.class, iar codul rezultat se
cheamd cod de octe{i.
Fste o compilare la nivel maqini pentru o maqinr virtuald .
In dispozitivul in care se doregte execulia aplicafiei trebuie s6
fie implementat[ magina virtuald Java gi aceastd maqin6, existentd in
dispozitivul unde se execut5 aplicalia, interpreteazd codul de octefi
(executd cate o instrucfiune, pe rand) sau codul de octeli (fiqierul
.class) poate fi compilat mai departe pentru procesorul real din sistem
(compilare just-in-time). Execulia interpretatd este mai lentd, acesta
fiind principalul dezavartaj al limbajului Java, comparativ cu c++.
Proiectul a reugit, dar echipa a fost desfiinlata pe motiv cd
cererea de dispozitive inteligente a scdzut. Directorul echipei soft nu a
renunlat, vdzdnd ca o utllizare deosebitd pentru Java dezvoltarea de
aplicalii pentru Intemet. Astfel ch, in 1995 afdcut o demonstrafie
publicd qi a dezvoltat un browser scris in Java (Hot Java) care avea
capacitatea sd descarce dintr-o pagind web gi sd execule pe maqina
client, mici aplicalii scrise in Java denumite applet-uri. Aceste appleturi erau inglobate ca qi fiqiere .class (figiere de octefi) in pagina web.
Astfel, pentru prima datd in istoria Internet-ului, paginileweb au
devenit dinamice (cu animafie).
$i astdzi, limbajul Java este foarte utilizatpenrru dezvoltarea
de aplicalii distribuire.

Avantaje:
- portabilitate la nivel binar

Capitolul2
Apticafii elementare in Java

1.

2.
3.
4.

1.

Prima aplicafie Java.


Ce sunt parametrii din linia de comandi?
Cum se face citirea de la tastaturi?
Pachete de clase.

Prima aplica{ie Java

Orice aplica{ie Java trebuie si confind o clas6 ce are definitd


metoda main( ).
Cel mai simplu program Java: vom afiqa un text pe ecran.
Aplicafia va consta dintr-o singuri clas6, iar aceasti clas6 nu are
variabile de instan{6, numai o singurd metodd ( metoda main( )).
Si afigim pe ecran urmatorul text, care se gdseqte in Biblie:
"Cdutafi mai int6i impdrd{ia lui Dumnezeu!".
class

Mailntai

public static void main(String argsIJ

{
System.

II

]
2.

out.println("Cautati mai intai Imparatia lui Dumnezeu!,) ;

Ce sunt parametrii din linia de comandi?

Exemplul I

are sintaxa Nirnbajului C (SA% - 9A%I

Scriem o clas[ in care pentru un numdr natural dat caparametru in


linia de comandd ii vom afiga divizorii. Dezvolt[m clasa

este pur orientat pe obiecte

AfigareDivizori.

are aspecte de securitate mai bine puse la punct dec6t


limbaiul C

Compilarea este operafia de traducere din limbajul surs[


(java) ?n limbajul maqinl al maginii virtuale Java. in urma compilirii
> figierul.class.
javac AfiqareDivizori.java <enter>
Execufia programului se face folosind interpretorul java

ll

Aplicafii elementare in Java

a eliminat din limbajul c nofiunile controversate (lucrul cu


pointeri)
a eliminat moqtenirea multipld
suportd lucrul cu fire de executie.
verificd indexarea tablourilor.
este distribuit gratuit de firma Sun.

( i nterpretea

zd" pr o gr

amul instrucf iune cu instrucf iune).

Exemplu:

java AfigareDivizori 6 <enter>

12

Aplicafii elementare in Java

In urna execufiei, se afrgeazd:

Aplica{ii elementare in Java


System.out.println("Primul numar prim mai mare este: "-tnrCrt);

2
J
6

private static boolean estePrim(int x)

{
boolean este:true;
for (int i: 2 ; i< : Math. sqrt
0){
f(x %

Parametrii din linia de comandd sunt in mod automat memora{i


ca String-uri in vectorul args[ ], ce e dat ca parametru in metoda
main( ).
Astfel, primul argument din linia de comand[ este memorat in
args[0].
Numele clasei trebuie si corespund[ cu numele fiqierului

i::

+)

este:folse;
break; )
return este;

sursa.

class AfisareDivizori

(x) ; i +

Specificatorii public, private gi static, vor fi explicafi ulterior.

public static void main(String args[

// in args[0J s-a memorat numdrul tastat, ca String!


// convertesc numdrul de la String la int:
int nr: Inte ger. parse Int (args [0] ) ;
int i;
for (i:1; i<:nr; i++)
if (nr%i::0)
Sy stem. out. println(i) ;

]// main
)//

class

Exemplul2

S[

se calculeze primul numdr prim mai mare decdt un numdr dat ca


parametru in linia de comand6.
class PrimulNrPrim

public static void main(String args[J)

int nr :Inte ger. parselnt (args [00 ;


int nrCrt:nr*l;//cautam irrcepand cu nrrl

-for(; ;)

if(estePrim(nrCrt))
break;//l-a gasit
else

nrCrt-f*;

3.

Cum se face citirea de la tastaturi?

Citirea de la tastatur[ in Java se poate face in dou[ moduri:


- in mod consold (text)
- in mod grafic.
Citirea in modul text este mai complicatd, Java lucrdnd cu
tastatura, la fel cum lucreazd cu un fiqier.
Citirea in modul grafic:
Pentru a citi de la tastaturf, putem folosi clasa: JOptionPane
metoda: showlnputDialog( )
Exemplu:
String nume: JOptionPane. showlnputDialog("dafi un nume");
Exemplul 1
Afigarea maximului a trei numere citite de la tastaturi.
import javax.swing.*;
class Maxim

public static void main(String argsI J)

String s I : JOpt ionP ane. s how Input D ialo g( " nr I : "1'


int nr I : Integer.parselnt(s I ) ;
int nr 2 : Inte ge r. pars e Int (JOpt ionP ane. s how Input Di alo g(

"nr2:

")) )

int nr3 = Inte ger.parse Int (JOpt ionP ane. show InputDialog(

qi

l4

Aplica{ii elementare in Java

"nr3:

"))

int max:nrl;
if (nr2>max) max:nr2;
if (nr3>max) max:nr3;
System. out. println( " Maxim: " * max) ;

f(brc){
//le comutam:
int aux:b;b:c; c:aux;

]
System.out.println(a-t "

tI
Operatorul 'o*" este un operator de concatenarc qirealizeazd
concatenarea intr-un gir a unui gir gi a altui operand(tot qir sau numdr
intreg, real, etc.).
in privinla compildrii acestui program:

javac Maximjava
java Maxim

l5

Aplica{ii elementare in Java

"+

fi +

" " *c) ;

]
j
Exemplul3
Se citesc doui numere a qi b. S[ se afigeze dacd cele doud
numere au acelagi numdr total de divizori.

<enter>

nrl:7

import javax.swing.*:

nrZ:10
nr3:6

class Comparare

Maxim:l0

public static void main(String args[])

{
Exemplul2
Se citesc de la tastaturd trei numere intregi a, b gi c. SI se ordoneze
aceste numere crescf,toare, astfel inc0t a va fi minimul, iar in c va fi

maximul. Citirea

de la

tastaturd

se va face cu

metoda

showlnputDialog$ din clasa JOptionPane.


import javax.swing.*;

if(na>

public static void main(String args[J)


int a:Inte ger.parselnt (JOptionP ane. show InputDialo g(" a: ")) ;
int b : Inte ger.parselnt (JOptionP ane. show InputDialo g(" b : "11,
int c :Inte ger. parselnt (JOptionP ane. show InputDialog(" c : ")) ;

f(a>b){

// le comutam:
int aux:a; a:b; b:aux;

]
f(a>c){
//le comutam:
int aux:a; a:c; c:awc;

t11

;
")) ;

if(a%i::0)na++;
int nb:2; // numarul de divizori ai lui b
for(int i:2 ; i<:b/2 ; i+ +)
if(b%i::O)nb++;

class Ordonare3

int a: Inte ger.parselnt (JOptionP ane. show InputDialo g('t a:


int b : Inte ger.parse Int (JOptionPane. show InputDialog(" b :
int na:2; // numarul de divizori ai lui a
// orice numar are ca diviyori pe I si el insusi
for(int i: 2 ; i<:a/2 ; i+ +)

nb) Sy s t e m. out.

pr int ln (a + " are mai mult i div iz or i ") ;

e I s e if(na : : nb) Sy s t e m. o ut. pr int ln ( " ac e I a s i numar

de d iv i z o r i ") ;

else System.out.println(b*" ere mai multi divizori ");

]
]
4.

Pachete de clase.

Clasa JOptionPane face parte din pachetul de clase javax.swing.


Clasele sunt organizate in pachete de clase. S-a adoptat solu{ia cu
organizarea claselor in pachete de clase, in primul rdnd pentru evitarea

16

Aplica{ii elementare in Java

Clase

conflictului de nume de clase. Numele complet al unei clase este dat


de numePachet.numeClasi.
o Exemple de pachete de clase:
- javax.swing (clasele pentru grafica)
- java.lang (clasele debazdale limbajului: String, Integer, System,

Capitolul3
Clase

etc.)

java.util (clasa Random)


java.io (pentru figiere: FileOutputStream)
java.sql (pentru baze de date)
java.net (pentru clase de comunica{ii in refea)
Intr-o aplica{ie hebuie folosit numele complet al clasei, adici
Pachet.nume.

o Exemplu:
String nume:javax.swing. JOptionPane.showlnputDialog
( "dafi un nume:");
Pentru a evita folosirea numelui complet al clasei de fiecare
datd cdnd se folosegte intr-o aplicalie (deoarece este dificil de scris un
nume a$a de lung), trebuie ca pachetul din care face parte clasa
respectivd sd fie in mod explicit importat la inceputul programului.
Exemplu:
import javax.swing.*
sau se poate importa in mod explicit doar clasa respectiv[:
import javax.swing.JOptionPane;
Pachetul java.lang este in mod implicit importat in orice
aplicafie java.

1. Specificatori de acces.
2. Modul de accesare a membrilor publici ai unei clase
3. Tipuri primare de date.
4. Cum se definesc constantele?
5. Exemplu de clasi ce are numai date.
6. Exemplu de clasi ce are numai metode.
7. Polimorfism parametric.
8. Exemplu de clasi ce are qi variabile de instan{i gi metode.
9. Constructori.
1. Specificatori de acces.

Prin membrii unei clase infelegem variabile de instanfi gi metode.


Accesul la aceqti membrii este controlat prin intermediul unor
specificatori i modificatori de acces.
Avem urmltorii patru specificatori de acces ( trei cuvinte
cheie):
1) private
2) public
3) protected
4) default (implicit).

Specificatorul de acces private:


Exemplu:
- pentru o variabild de instan{d: private int
- pentru o metodd: private int calcul( )
O variabild de instanfi privatd nu poate fi accesatd decdt din

metode ale clasei respective.

O metodi privatd nu poate

fi apelati

decdt de o altd metodl din

clasa respectivd.

Deci, membrii private ai unei clase nu pot fi accesa[i dinafarc


clasei respective.

l8

Clase

Clase

//

o Specificatorul de acces public:


Membrii public ai unei clase pot fi accesafi atdt din clasa
respectivd, cdt gi din orice altd clasd.
I Specificatorul de acces protected:
Este legat de relalia de mogtenire intre clase. Va fi studiat
ulterior.
t Specificatorul de acces implicit (atunci cdnd in fala declaraliei unui
membru nu este scris nici unul dintre cei trei specificatori de acces
anteriori).
Exemplu:

intraza:
membrii implicili pot fi accesa{i din clasa respectivd, dar qi din
orice alti clasl care face parte din acelagi pachet cu clasa
respectivd.
membrii cu accesul implicit nu pot fi accesali din alte clase ce fac
parte din alte pachete, diferite de pachetul clasei respective.

2.

Modul de accesare a membrilor publici ai unei clase.

Din afara clasei respective, membrii publici sau cu accesul implicit ai


clasei, se acceseazd in doi paqi, astfel:
f . instanfiez obiect din clasa respectiv[:
2. accesezmembrul clasei cu sintaxa:
obiect.numeMembruDeAccesat.
Exemplul 1
Cerc c:new Cerc( );
int r:c.getRuaO;
Exemplul2
Fie clasele A si B:
class A

public int x;

]
public static void main(String argsI J)

x+-

GRE$IT

A a:new AO;

a.x:7;

A doua posibilitate de accesare este valabild pentru membrii


declarafi statici. Declararea se face cu ajutorul cuvintului cheie static
Membrii statici pot fi accesafi, pe l6ng[ prima modalitate gi astfel:
nu se mai instanfiazd obiect din clasa respectivd, ci se acceseazd

folosind sintaxa:
NumeClasd. numeMembruDeAccesat.

o Exemplu:
Metoda parselnt( ) din clasa Integer, are semndtura:
public static int parselnt(String)
int nr:Integer.parselnt(" I2");
Se recomand[ ca variabilele de instan{i ale unei clase sd fie
declarate private, iar accesul la ele sd se facd prin metode public de
tipul:
set( ) - pentru a scrie in ele

getO-pentruaciti

Deqi se scrie mai mult cod, folosind nigte metode verificate,


programul este mai fiabil.
F. Brooks dd urm[toarea secvenf5 de timpi consumafi inrealizarea
unor programe mari (cu mii de linii sursl):

I/,

ai"timpul total, pentru design

I/u

codare

If

testare componente (testarea modulard)

testarcansamblu (testarea de integrare)

3. Tipuri primare de date

class B

Vrem sa introducem in x (din clasa A) valoarea 7:

r71 +

in Java existd urmdtoarele tipuri primare de date:


a. int: numere intregi cu semn, reprezentate pe 4 octe{i.

Clase
Spre deosebire de limbajul C, in Java nu existl modificatorul de tip

unsigned.
b. char pentru date de tip caracter.
O variabild de tip char ocupd 2 octeli.
Constantele caracter in Java sunt reprezentate cu ajutorul codului

Unicode.
c. boolean pentru date ce au doud valori: true qi false.
d. byte numere intregi intre - I 28 qi +t27 , ocupl un octet.
e. float pentru reprezentarea numerelor reale.
f. double pentru reprezentarea numerelor reale (precizie mai mare ca
tipul float).
La instanfierea unui obiect dintr-o clasd, dac[ variabilele de
instanfi ale clasei nu sunt in mod explicit ini{ializate (prin
constructori), ele sunt in mod automat inilializate astfel:
int--+0
byte--+0
char---+'\0' (cu caracterul al c6rui cod Unicode este 0)

Clase

Compilarea:
javac NumaiDatejava

fiqierul NumaiDate.class

Pentru a putea sa executam aplica[ia, trebuie sa scriem o clas[ ce


contine metoda main$:
class Test

public static void main(String argsI J)

// x<-7; y<- j.5 t


NumaiDate n:nev) NumaiDate

n.x:7;
n'Y:3'5;

()

: " + n. x) ;
Sy stem. out. println ( " y : " + y) ;

System. out. println ( " x

n.

boolean---+false

6.

float-+0.0
double-r0.0

4.

Cum se definesc constantele?

Constantele sunt variabile care au un con{inut fix.


Constantele se declarf, in Java cu ajutorul cuvdntului cheie final.

Exemplu:
final int NR*ELEVI:3O;

XtEffVeb

Exemplu de clasi ce are numai metode.

Ddm ca exemplu o clasd ce are doud metode: metoda main( ) qi


metoda calculMedie( ).
import javm.swing.*;
class Medie

public static void main(String argsI J)

eroare de compilare
Valoarea unei constante nu se modificl pe parcursul programului.
Se recomandi ca numele constantelor sd fie scris cu litere mari.

int

a:

int

h:

int

5.

Exemplu de clasi ce are numai date.

"

Int e ge r. p arse Int (JOpt ionP ane. show Input Dialo g(

"b

c:

Inte ge r.p ars e Int (JOpt ionP ane. show Input Dialo g(
doubl e m: c al cul Me die (a, b, c) ;
Sy s t e m. o ut. pr

class NumaiDate

public int x;
public double y;

a:

Inte ge r.parse Int (JOptionP ane. show Input Dialo g(

int I n (m)

"c

:
:

OBS: in cazul aceleiagi clase, dintr-o metodd staticd nu se poate apela


decdt tot o metodi static[ a aceleiagi clase:
private static double calculMedie(int x,

int z)

Clase

Clase

return (x+y+z)/3.0;

while (a!:b)
f (a>b) a:a-b;

7.

return a;

else

Polimorfism parametric.

Prin polimorfism se infelege: acelagi nume - mai multe forme.


Polimorfismul este o noliune specificd pentru POO.
Polimorfismul poate sd aparl la compilare sau la execufie.
Polimorfismul parametric este un polimorfism la compilare.
Acesta se referd la faptul cd intr-o clasi putem avea mai multe metode
ce au acelagi nume, dar definilii (implement[ri) diferite. Metodele care
au acelaqi nume diferf, intre ele prin lista de parametrii (9i evident 9i
prin implementare). Compilatorul gtie inc6 dinfaza de compilare ce
versiune de metodd sd apeleze, pebazanum[rului diferit de parametrii
sau pe baza tipurilor diferite de parametrii. Acest mecanism se mai
cheaml overloading (supraincdrcare).

private static int cmmdc(int a, int b, int c)

else

else

setRaza( )
getRaza( );
setXO( );
setYO( )

])

//citim trei numere tntregi:


int a:
Inte ger.parselnt (JOptionP ane. show InputDialog(

"

a:

b:

Integer.parse Int (JOptionP ane. show InputDialog("

int

Exemplu de clasi ce are gi variabile de instan{i gi metode

Scriem clasa Cerc ce are ca variabile de instan{i raza cercului gi


coordonatele lui, gi ca metode:

import jwax.swing.*;
class CalculeCmmdc

int

c:c-a;

)
8.

de la tastatura trei numere. calculati cmmdc al primelor dou[


numere qi cmmdc pentru toate trei.

b:b-a;

return a;

citim

public static void main(String args[

while (a!:b)
f (a>b) a:a-b;
while (a!:c)
f (a>c) a:a-c;

Exemplu

b:b-a;

int rezl:cmmdc(a,b);
println(re z I ) ;
:
int re z2 cmmdc (a, b, c) ;
Sy s t e m. o ut. pr intln(re z 2) ;

Sy s tem. ouL

)
private static int cmmdc(int a, int b)

)'

: ")) ;

"c

: ")) ;

c:

Inte ger.parse Int (JOptionP ane. showlnputDialog(

")

getX0( )
getY0( );
arie( ).
class Cerc

private int raza;


private int x0,y0;
public void setRaza(int raza)

j
/*

this.raza:raza;
cuvdntul cheie "this" este o refertnyd cdtre obiectul
curent(obleclul inslanyiat din clasa in care apare this).

Clase

Clase

9.

*/
public int getRaza(

public void setX}(int x)

x0:x;

instanf6.

public void setY?(int y)

Exemplul I
Rescriem clasa Cerc in care definim explicit doi constructori: primul
inilializeazdrazaSi coordonatele centrului cu (0,0) gi al doilea
inilializeazdraza gi coordonatele centrului cu trei numere date ca
parametrii.

y0:y;

]
public int getX0( )

return x0;

class Cerc

public int getY0( )

private int raza;


private int x0,y0;
// primul constructor:
public Cerc(int r)

returny0;

public double arie)

{
re

turn Math. P I raza* raz a ;

y0:0;

Cerc c:new Cerc( );


c.setRaza(10);
double a:c.arieO;
Sy stem. out.

// al doilea constructor:
public Cerc(int r, int x, int y)

public static void main(String argsI J)

raza:r;
x0:0;

class TestCerc

Constructori.

Defini{ie: Constructorul este o metodi specialI a unei clase care are


acelagi nume cu clasa, nu are in semn[turi cdmpul pentru tipul valorii
retumate gi este apelat[ in mod automat (implicit) la instanlierea unui
obiect din clasa respectivi.
O clasi poate sd aib[ in mod explicit definili zero, unul sau
mai mulli constructori.
In mod tipic, un constructor face ini{ializdrile variabilelor de

return raza;

25

println

( " arie

raza:r;
x0:x;
y0:y;

: " * a) ;

public double arie( )

{
tI

return Math. P l*raza*raza ;

Clase

26

Clase

Exemplu de utilizare pentru clasa Cerc:


class TestCerc

public static void main(String args[ ])

Cerc c I :new Cerc(I

0,

5,7)

: "+cI

println(
Cerc c2:new Cerc(3);
Sy stem. ouL println(c2. ar ie ( ) ) ;

System. out.

" arie

Syste m. out. println(" 1 ") ;


//Cautam divizorii intre 2 si jumatatea numarului:
for(int i:2 ; i<:nr/2 ; i+ +)
if(nr%i: : 0) Sy stem. out. println(i) ;
//numarul se divide cu el insusi:
Sy s te m. o ut. pr i nt ln (nr) ;

public boolean

arie ( )) ;

if(nr%i::0){

Constructorii au fost introduqi in POO pentru a nu uita

return este;

Scriem clasa Numar ce are ca variabild de instan{i privatd un num6r

private int nr;


public Numar(int x)

nr:x;

public int getNrQ

return nr;

)
publ ic

vo

//nr.

I,

id afis are D iv izor i Q


este sigur divizor:

+ +)

break;

Exemplul2
intreg nr, qi ca metode:
constructorul,ceinilializeazdvatiabilanr;
getNrQ, ce returneazl valoarea variabilei private nr;
metoda estePatratPerfect0 ce returneazd true dac[ nr este
pitrat perfect qifalse \n caz contrar;
metoda estePrimQ ce returneazd true dacd nr este prim qifalse
in caz contrar;
metoda afisareDivizori0 ce afryazd divizorii numlrului nr.
Scriem gi o clas[ de test pentru clasa Numar.
class Numar

;i

este:false;

si

facem inifializlrile variabilelor de instanp.

este PrimQ

boolean este true;


for (int i : 2 ; i< : Math. s qrt (nr)

27

public boolean

esteP atratPerfect Q

int r adic al : (int) Math. s qrt (nr) ;


if(r ad i c al * r ad i c al -- : nr) r e t urn t rue ;
else returnfalse;

]
]
class TestNumar

public static void main (String args[J)

{
Numar n:new Numar(25);
Sy s t e m. out. pr intln (" D iv iz o r i i numarului " + n. ge tNr Q) ;
n.afisareDivizoriQ;
System. out.println("este patrat perfect: " * n. e steP atrat P erfect Q) ;
if(n.e ste PrimQ : :true) System. out.println(n. getNrQ + " e ste prim. ") ;
e lse System. out.println(n. getNr Q + " nu e ste prim.') ;

]
)

Clase

Exemplul3
Construim clasa Dreptunghi, ce are ca variabile de instanfd private,
doud numere intregi a gi b, ce reprezinti lungimile laturilor unui
dreptunghi. in aceastd clasd avem ca metode:
constructorul, ce face inilializdrile;
metoda calculPerimetruQ, ce returneazd perimetrul
dreptunghiului;
metodacalculArieQ,cereturneazl,ariadreptunghiului;
metoda estePatratQ, ce returneazi true dacd dreptunghiul este

Clase

29

((this.

a:

--d. a) & & (this.b

: : d. b))re turn true ;

else returnfalse;

)
)
class TestDreptunghi

public static void main (String argsfl)

{
Dreptunghi d:new Dreptunghi (5, 7) ;
Sy stem. out.println(" Primetrul e ste " -l d.calculP erimetru)) ;
System. out.println("Aria este " * d.calculArie Q) ;
System. out.println("Dreptunghiul este patrat: tt + d.este P atratQ) ;
Dreptunghi d I :new Dreptunghi (5,7) ;
Sy s te m. o ut. pr int ln ( " S unt e gal e : " -l d. s unt E gal e (d I ) ) ;

pdtrat;

metoda suntEgale0, ce are ca parametru un dreptunghi d 9i


scoate ca rezultat true dacd dreptunghiul curent (cel pentru care se
apeleazdmetoda) este egal cu dreptunghiul d.
Scriem gi o clasd de test pentru clasa Dreptunghi.
class Dreptunghi

]
)

private int a;
private int b;
public Dreptunghi(int x,int y)

Ce trebuie adiugat in clasa Dreptunghi astfel incdt pentru un obiect


Dreptunghi s[-i putem afiqa lungimile laturilor? Vom prezenta trei

solutii.
Solutia l: Addugdm metodele publice getX( ) qi getY( ) in clasa
Dreptunghi.
public inr getX( )

a:x;
b:y;

public int c alcul P e rime tru 0

return 2*(a+b);

public int getY( )


t

public int calculArie)

return x;

return

return a*b;

]
pub I ic b oole an

e s te

atrat

f(a::b)return true;
else returnfalse;

]
public boole an sunt Egale (Dreptunghi d)

y;

)
fn main( ):
System. out.println( " x:
System. out.println( "y:

" + d.

getX( )) ;

" + d.

geYX( )) ;

Solutia 2: Scriem metoda publici afigare0 in clasa Dreptunghi.


public void afisare( )

{
Sy s te m. ouL

println(

"x

: " + x) ;

Clase
Sy st em.

out println( "y

Clase

: " +r1,

public static void main(String args[J)

{
DouaNumere d:new DouaNumere (l

in main( ):
d.afiqare(

);

solutia 3: (nerecomandat[) Facem variabilele x qi y publice in clasa


Dreptunghi gi le accesdm direct din main0 cu: d.x qi d.y.
Exemplul4
Dezvoltam clasa DouaNumere, ce are variabile de instanli doud
numere intregi a gi b, gi ca metode:
constructorul ce face ini{ializdrile;
metoda maxim0, ce retumeazd maximul dintre a 9i b;
metoda cmmdco, ce returneazd cel mai mare divizor comun al
celor dou[ numere.
Scriem qi o clasd de test pentru clasa DouaNumere'
class DouaNumere

2, I 8) ;
System.out.println("mmimul este : " +d.maximQ) ;
Sys tem. ouL print ln(" cmmdc e s te : " + d. cmmdc Q) ;

)
Exemplul5
Scriem clasa TreiNumere, ce are variabile de instanfd
numere
lntregi a,b qi c, gi ca metode:
constructorul ce face inilializ[rile;
metoda maximQ, ce retumeazl maximul dintre a, b gi c;
metoda suntPitagorice0, ce retumeazd true, dacd a, b, c sunt
numere pitagorice.
Scriem qi o clasd de test pentru clasa TreiNumere.
class TreiNumere
I
I

private int a,b;


public DouaNumere(int nl, int n2)

private int a,b,c;


public TreiNumere(int nl, int n2, int n3)

a:nl;

a:nl;
b:n2;
c:n3;

b:n2;

public int maximQ

public int maimQ

if(a>b)return a;
else return b;

int mec:a;

f(b>mac)mm:b;
if(c>max)ma)c:c;
return mqx;

public int cmmdcQ

{
int

A:a; int B:b;

)
pub I ic b oole an sunt P itagoric

while(A!:B)
if(A>B)A:A-B;
else B:B-A;
return A;

if((a*

a: : b * b + c * c) ll (b * b : : a* a+ c * c) ll (c * c : : a* a+ b *b) )

return(true);

else return(false);

class Test2Numere

class Tbst3Numere

Clase

32

Clase

public double getReQ

public static void main(String args[J)

return re;
Tre iNumere

t:new

Tre iNumere (3, 5, 4)

Sy s t e m. o ut. pr intln (" max

mul

es te

public double getlmQ

: " + t. max im Q) ;

if(t. s unt P it ago r ic e Q) Sy s t e m. o ut. pr int I n ( " Sunt nume r e p it a go r i c e ") ;

else System. out.println("Nu sunt numere pitagorice

")

{
return im;

public double modulQ

Exemplul6
SI se dezvolte clasa Complex, ce are variabile de instan!5 private doui
numere intregi re gi im (partea realS gi partea imaginari a unui numlr
complex) gi ca metode:
constructorul ce face inilializdrile;
modul0, ce retumeazdmodulul numlrului complex;
suma0, ce are ca parametru un numdr complex c, prin care la
numdrul oomplex curent se adun[ numbrul complex c (rezultaful se
depune in numIrul curent);
produs0, ce are ca parametru un numdr complex c, prin care in
numdrul complex curent se depune rezultatul inmul{irii dintre numIrul
complex curent gi num[ru] complex c;
getReQ,cereturneazdpartearealhanumiruluicomplex;
getlm0, ce retumeazdpartea imaginard a numf,rului complex;
equals0, ce redefinegte metoda equals0 din clasa Object, prin
care se compard din punct de vedere al confinutului, doud obiecte
Complex: obiectul curent gi obiectul dat ca parametru;
toString0, ce redefinegte metoda toString0 din clasa Object,
prin care se dd o reprezentare sub formd de String a unui numdr
complex;
Scriem gi o clasa de test pentru clasa Complex.
class Complex

re

//adunarea nr. complex curent, cu un alt nr. complex, cu depunerea


//rezultatului in numarul complex curent:
public void suma(Complex c)

re:re-lc.re;
im:imic.im;

//inmultirea nr. complex curent, cu un alt nr. complex, cu depunerea


//rezultatului in numarul complex curent:
public void produs(Complex c)

{
re:re*c.re-im*c.im,'
im:re*c.im+im*c.re;

]
//redefinirea metodei equalsQ din clasa parinte Object:
//(trebuie sa se pastreze aceeasi semnatura:)
public boolean equals(Object obj)

: (Complex) obj ;
iftc!:null)
f((re : : c. re) & & (im: : c. im)) return

C omplex c

private double re;


private double im;
public Complex(double x, double y)

turn Math. s qrt (re *re * im* im) ;

true

returnfalse;

//redefinirea metodei toString) din clasa parinte Object:


public String toStringQ

i*:y'
]

re:x;

String

"

(" * re + ", " + im* ") " ;

Clase

Clase

return s;

pub

]
]

ic doub I e c onv er sie Radiani ()

return (Math. P I*x)/ I 8A ;


I

class TestComplex

public static void main(String args[])

class TestUnghi
Complex c I :new ComPlex( I, I ) ;
Sy st e m. out.

ste :

pr intln(" Modulul e
:new ComPlex(l, I ) ;

I
"

+ c I . mo

dul Q) ;

public static void main (String argsIJ)

Complex c2

cl.suma(c2);
: " + c I . toStringfi ;
System. out.println(" suma
:new
ComPlex( 1, I ) ;
Complex c 3
( " s unt e gal e : " + c 2. e qual s (c 3) ) ;
pr
intln
m.
out.
Sy s t e

]
]

Unghi a:new Unghi(3?);


System. out.println(" Radiani:

Sy s te m. out.

" + a. conversieRadiarci
pr int ln ( u's unt c ornpl e ment a/' e : "

a.

swntC

Q)

mpl e me nt ar e (new Un glhi (6 0) ) ) ;

Exemplul T
S.ri.. clasa Unghi, ce are ca variabilS de instan{d privatl un numdr
intreg x, mdsura in grade a unui unghi' qi ca metode:
constructorul;
suntComplementareQ, ce ate ca parametru un alt unghi u, qi
care refurneazd true dacf, unghiul u este complementar cu unghiul
curent;
conversieRadiani0, ce returneazd valoarea exprimat[ in
radiani a unghiului curent x.
Scriem qi o clasl de test pentru clasa Unghi'
class Unghi

private int x;
public Unghi(int x)

this.x:x;

public boole an suntComplementare (Jnghi u)

llxemplul 8
Sd se dezvolte ciasa Timp ce are ca variabile de insianfd.
numere
intregi: h, min, sec (ore, rninute, secunde). Ca metode:
- constructorul;
- conversielnSecundeQ ce returneazi timpul curent, exprimat in
secunde;

oomparaQ, ce are ca pararnetru un 'fimp t, gi care l'eturneazS I dacd


timpul curent este mai mare ca t, 0 dacd cei doi timpi sunt egali , gi -1
in caz contrar.
Scriem gi o clasS de test.
class Timp
l

private int h; /iore


privare int min,'
private int sec;
public Timp(int ore,int m, int s)
I

if(thi s. x + u. x :

h.--.ore,'

0) re turn true ;

min:n1,'

else returnfalse;

(CCr":ir1,9,'

Vectori. Matrici.

return

60A *h+

60

*min+

sec

Capitolul4
Vectori. Matrici.

public int compara(Timp t)


//returneaza A daca cei d"oi timpi sunt egali
//returneaza I daca timpwl curent > timpul t clat ca argument
//returneaza -l daca timpul curnt < tiwrpul t

int s e c I : thi s. c onv er s i e S e cunde 0 /I t iwpul cu r ent, i n s e cunde


int s e c : t. c onv e r s i e S e cwnde {) ; //timpul t, in s e cunde

1.

2.
3.

Vectori intrinseci.
Exemplu de metode ce au ca parametrii vectori intrinseci.

Matrici.

if(secI>sec)return i;

if(sec 1 ::sec)return

else
else return

A,'

-l;

]
class TesfTimp

/
I

public static void main(Sn'ing args{J)

Timp t 1 :new Timp(l, 5, 6) ;


Timp t2 :new 7'imp(1, 5, 6) ;
int r ezultat :t l . com.p ar a (t 2),'
if(r e zult at : : I ) Sy s t em. o ut. pr int lrc ( " t I > t 2 ") :
el s e if(r e zul t at : : 0) Sy s t em. o ut. pr intln ( " t I :t 2 ") i
el s e System. out. pr intln (" t I < t 2 ") ;

j
j

l. Vectori intrinseci
Vectorii intrinseci sunt tablouri unidimensionale.
Spre deosebire de limbajul C, in limbajul Java, vectorii
sunt obiecte, instanfe ale unei clase intrinsec[ limbajului.
Fiind obiecte, vectorii intrinseci (pe scurt ii vom numi vectori) se
instanliazd cu ajutorul operatorului new.
Numele vectorului, ca gi in limbajul C, este o referinfi cdtre zona
de memorie unde se memorcazdobiectul vector.

Componentele vectorului se acceseazdprin indexare, ca gi in C.


Un vector, cu ajutorul operatorului new, se instan{iazd conform
sintaxei:
tip numeVector[ ]:new tip[dimensiune] ;

Exemplu: int a[ ]:new int[10];


Componentele vectorului sunt:
a[0], a[1], ...,afgf
Un vector poate fi creat si prin listarea directa a valorilor lui
initiale.
Exemplu:
int b[]:{1,5,-1};
Aceasta instructiune, putea fr rcalizata echivalent, astfel:
int b[]:new int[3];

b[o]:l;
b[1]:s;

bl2l:-1;
OBS: 1. Spre deosebire de limbajul C, in Java, se verifici indexarea
in afara granitelor gi dac[ se face aceastd indexare, avem eroare la
execufie.

s[ fie

2. Spre deosebire de limbajul C, dimensiunea vectorului poate


variabilI, ce a fost initializatd,

gi o

Vectori. Matrici.

38

Vectori. Matrici.

Exemplu:

C-in+dinrl&
iqt a[dirn];

Java: int dim:10;


int a[ ]:new int[dim]; //da!
3. Atentrie la diferenfa inhe declararea unui vector 9i definirea
sau crearea sau instanfierea lui.
Exemplu:
double bll; ll declarare vector
b:new double ll0l; I I Crearea obiectului vector:
Vectorii pot contine ca elemente ,nu numai date primitive, ci si
obiecte. Exemplu:
Integer v 1 []:new Integer[3];
Sau:

Integer

v2[]:{new Integer(l), new Integer(3), new Integer(4)};

in clasa din care se instanfiazS vectorii, este definita variabila


de instanf5 publicalength de tip read-only (poate fi doar cititl, nu 9i
modificatd) in care, in mod automat, la instanfierea vectorului, se
memoreazl dimensiunea vectorului.
Pentru a modela vectori a cdror dimensiune poate fi
modificat[, vectori dinamici, se foloseqte clasa Vector ce este
definit6 in iava.util.
Accesarea componentelor unui vector din clasa Vector nu
mai face prin indexare, ci prin metode: get( ), add( )' etc..

39

Exemplul2
Se citegte de la tastatur[ un numir natural N; se instan[iazd un
vector de N numere intregi. Sd se completeze acest vector cu numere
aleatoare in gama 0..N-1, cu condilia ca fiecare numdr din aceastl
gaml sI apard o singurd dat[.
Algoritm: vom inilializa vectorul cu numerele 0,1, .., N-1, date in
aceastl ordine. Apoi, aceste numere iniliale, le vom comuta, poziliile
de comutare fiind generate aleator.

import
import
c I as

javm.swing.*;
java.util.*;

s InitNumAle at o are

public static void main(String argsfl)

{
int N;

s : J Op t i onP ane. s how Input D i al o g ( "N :


N Integer.parselnt(s) ;
int a[J new int [NJ;
St r ing

se

")

int i;

//se initializeazavectorul cu numerele 0,1,...,N-1, in aceasta ordine:

: 0 ; i < a. I ength ; i + +)
a[iJ : i;

Exemplul 1
Citim un numdr natural N. Citim N numere intregi intr-un
vector a. Sd calculdm qi afig5m maximul din vector.

for

(i

r:

Random
ner4) RandomQ;
//se repeta de N ori:

class CalculMaxim

for(i:0;i<N;i++){

//se genereaza doua numere aleatoare

public static void main(String args[

{
int

N: Integer.parse

int a[
int i;

Int (JOptionP ane. show InputDialo g(

"

N: ")1'

]:new intNl;

for (i:0; i<N; i++)


a [iJ

int nl : r.nextlntQtl);
int n2 : r.nextlnt(N);
//se comutavariabilele a[nL] si a[n2J:
int aux: a[nlJ;
a[nIJ : a[n2J;
a[n2J : aux;

])

Integer.parse Int (JOptionP ane. showlnputDialog(

"

nr:

"))

int max:a[0];

//Afi s are

for (i:1;i<N; i++)

for (i:0;i<N;i++)

if (a[i] >max) max:a[i] ;


Sy s t e m. o ut.

pr int I n (n

ax)

ve

ct or ge nerat

System. out,prtnt I n(a I ifl ;

System.exlt(0);

nI si n2:

Vectori. Matrici.

]
]

]//main

Exemplul

Se citegte de la tastaturi un numdr natural N; se instan\iazd, un


vector de N numere intregi. Si se completeze acest vector cu numere
aleatoare in gama 0..N-1, cu condilia ca fiecare numdr din aceastd

gamd sd apari o singur6 datd. (Problema anterioarS, dar un alt


algoritm: vom introduce pe rdnd in vector, cdte un numdr aleatoro cu
condilia ca sd fie diferit de numerele anterioare introduse).
import java.util.*;
class Aleatoare

Vectori. Matrici.

Exemplul4
Se citesc de la tastaturi doi vectori a qi b, ce au aceeasr
dimensiune (dimensiunea lor comunf,, N, este cunoscuttr). S[ se
afigeze daci vectorul b este o permutare a vectorului a.
import javu.swing.*;
import java.util*;
class SuntPermutari

public static void main(String args[J)

public static void main(String args[J)

int N;

S trin g

N:

Jinal int N--10;


int a[J:new int[NJ;
Random

for(i:0;i<N;i++){
for(;;){
nr:r.nextlnt\) ;//intre 0 si Q,{- I )
//a maifost generat?
//cautare liniara:
bo ole

an

e ste

P re zent

j:0 j<ij++)
if(nr::a[j]){

:fal s e ;

for(int

estePrezent:true;
break;]
if(e

steP

re z e nt

a[i]:nr;

: :fal s e) {

J Opt

i o nP ane.

how Input D ial o g ( t'N : ") ;

:
:

new int [NJ;


new int [NJ;

for(i:0;i<N;i++)
a [i] :Inte ger.parse lnt (JOptionP
for(i:0;i<N;i++)

ane. show lnputDialog(" a [,, + i+,,J

for(i:0;i<N;i++)
if@til!:btil){
suntPerm:false;
break;

if(sunt P e rm) Sy s tem. out. pr intln(" sunt


else System.out.println("nu sunt") ;

)//for;;
)//for i

//afisare:

for(i:0;i<N;i++)
System.out.print (a[iJ

* " ") ;

pr intln("\n") ;

:,,)) ;

b[iJ:Integer.parselnt(JOptionPane.showlnputDialog(',b[,,+i+,,J:,,));
//sortam cei doi vectori:
Aways.sort(a);
Anays.sort(b);
//comparam cei doi vectori:
boolean suntPerm: true ;

break;

Sy s te m. out.

Inte ger.parse Int (s),'

int a[J
int b[J
int i;

r:new RandomQ;

int i;
int nr;

")

Vectori. Matrici.

2.

Vectori.

Exemplu de metode ce au ca parametrii vectori intrinseci.

tf(a t tl

: : a [j ]) re turn fat s e ;

return true;
Spre deosebire de limbajul C, unde intr-o funcfie ce avea ca
parametru un vector, trebuia dat ca parametru gi dimensiunea
vectorului, in Java, dimensiunea vectorului nu mai este necesard ca
parametru, deoarece dimensiunea vectorului este memoratd in

]
private static boolean compard(int a[ J, int b[
J)

variabila publicd length.

int i;

Exemplul 1
Citim de la tastaturd doi vectori a qi b ce au aceeagi dimensiune N.
Sd afiqdm dac6:
a) vectorul a are toate elementele diferite intre ele.
b) vectorul a este egal cu vectorul b.
Vom folosi doui metode separate: metoda suntDiferite( ) qi metoda
compard( ).
class Compara

public static void main(String args[ J)

{
ane. show InputDialo g( " nA: " 11'

int i;
int a[ ]:new int[NJ;
// citire a[ ]:

]
Exemp^lul2

In clasa System, care face parte din pachetul java.lang, este


definitl metoda: currentTimeMillisQ cu semndtura:
public static long int currentTimeMillis0.
Aceasti metod[ retumeazd valoarea
sistemului, in

[i]

for (i:0; i<N; i++)

Inte ger.parse Int (JOptionP ane. show InputDialog(


: s unt D ife r it e (a) ;
b o o I e an s unt
Sy stem. out. pr intln( " sunt diferit e ; " * sunt) )

memoreazd

Arrays-sort0,

Int e ge r. p ar s e Int (J Opt i onP ane. s how Input D i al o g ( " nr

se

100000 numere intregi aleatoare,

currentTimeMillis0,

int b[ ]:new intfN];


// citire b[ ]:
[iJ

N:

Se genereazd

sd

"

nr

"
-a: ) )'

-b:

"1) ;

qi apoi acelaqi vector, cu metoda de sortare prin

interschimbare.
import javm.swing.*;
import java.util.*;
class DurataSortare

public static void main(String argsfl)

private static boolean suntDiferite(int a[])

Jinal int N:100000;


final int GAMA:1000;
int a[J : new int [NJ;
Random r:new RandomQ;
int i;

for(i:0;i<N;i++)

bo

ole

an e gali : c omp ard

System.

(a, b) ;
out.println(" a [ ] :b [ ] : " + egali) ;

int ii;
for (i: 0 ; i<a.length- I ; i+ +)
for(j :i+ I i <a. lengthi + +)

in gama 0...gggg,

in vectorul a. Folosind metoda


se calculeze durata sortdrii in ordine

crescdtoare a vectorului a. Se va sorta vectorul mai intdi cu metoda

for (i:0; i<N; i++)

return true;

milisecunde.

//dimensiunea comund:
int N: Integer.parselnt (JoptionP

for (i:0; i<a.length; i++)


if (atil ! :btD return false ;

a[iJ :r. nextlnt (GAMA) ;


//salvam vectorul a:
tnt bfl = new lnt [NJ;

Vectori. Matrici.

Vectori. Matrici.

for(i:0;i<N;i++)
b[i]:a[iJ;

long t 1 : Sy st em. curuentTime Mill is 0 ;


Anays.sort(a);
long t 2 : Sy s te m. curre ntTime Mill is 0 ;
Sys te m. out. println(t 2 + I ) ;
//Acelasi vector sortat prin interschimbare:
l ong t 3 : Sy s tem. c urre ntTime Mill i s 0 ;
sortare(b);
long t 4 : Sy stem. curre ntTime Mill i s 0 ;
System.out.println(" sortare interschimbare :

private static void rotire(int a[J,char sens)

N: a. length ; //dimensiune
if(sens::'s){
int

int

aw:a[0];

for(int i:0 ;i<N-

I ; i++)
a[iJ:o[i+1];

a[N-1]:aux;

)
"

+ (t4-t3))

else

if(sens::'d){
int aux:a[N-IJ;
for(int i:N-2 ; i> :0 ; i-)

private static void sortare(int a[J)

a[i+1J:afiJ;
a[0]:aux;

for (int i:0 ; i<a. length- I ; i+ + )


for(int j : i+ I j <a. lengthj + +)

f(a[i]>aDD{
int aux:a[i];

a[i]:a[j|;
a[jJ:aux;

Exemplul3
Sd se scrie o aplicalie ce folosegte o metodd ce are doi
parametrii: un vector de numere inhegi a , qi un.parametru de tip
caracter denumit sens, ce poate avea doui valori: 's' (st0nga) qi 'd'
(dreapta). in metodi se rotesc in vectorul a toate elementele, cu o
pozilie, spre stdnga sau spre dreapta, dup[ valoarea parametrului sens.
Exemplu:

a:{1,2,30\ gi sens:'d'. Dup[ execu{ia metodei avem: r{30, t,2}


class Rotire

vector a IJ

Exemplul4
Scriefi o aplica{ie in care se implementeazd algoritmul de
clutare binard a prezentpi unui num[r x citit de la tastaturd intr-un
vector sortat cresc[tor.
class CautareBinara

public static void main(String args[J)

int a[J : {1, 5,7,9, I 2, 30} ;


int x:l;
//Este prezent x in vectorul a[J ?
if(estePrezent(x,a,0,a.length-1)system.out.println("Este
e I se Sy s te m. ouL println(" Nu e s te pre zent. ")
;

public static void main(String args[J)

private static boolean estePrezent(int x,int a[J,int s,int d)

int afl:{1,2,30};
rotire(a,'d');
for (int i: 0 ; i< a. length ; i + +)
Syste m. out.print (a [i] + " ") ;

if(s>d) returnfalse;

if(s::d){
if(x

: : a [sJ) re lurn |rue ; e I se re turn fal se ; ]

int m,'

prezent.,,);

Vectori. Matrici.

Vectori. Matrici.

m:(s+d)/2;
f(x : -- a [m] ) re t urn t rue ;
e t s e if(x < a I mJ ) re turn e st e P r e z e nt (x, a, s, m- I ) ;
else return e stePrezent (x,a,m* 1,d) ;

int max:A[0];
int pozMax:O;

]//estePrezent

for(int i:l;i<nA;i++)
if(A[i]>max){
max:A[i];
pozMax:i;]

Exemplul5

return pozMax;

sortare prin metoda selecfiei maximului.


import jwm.swing.*;
class SelectieMaxim{
-s''ie{ioaplica!ieJavaincareseimplementez5algoritmulde

public static void main(String args[]){

)
Exemplul6
Folosind clasa Vector, implementafi urmdtorul algoritm:

final int N:5;


int A[]:new intfN];
int i;

se

for(i:0;i<N;i++)
'

[i] :Inte ger.parselnt

(JOptionP ane. show InputDialo

ordonareCresc(A,N);
System. out.println("Numerele sortate cre scator :

")

g("nr:

")1

println(A I il ;

]//main
void ordonareCresc(int A[J, int nA)
private
-/hrebuiestatic
oblig. ca parametru safie dat si nA, pt' ca metoda
// apela recursiv pt. mai putine elemente.

{
se va

J/iomut elementul de pe utima poz- din A cu maximul gasit:


int temp--A[nA-1];

//ordoneaza recursiv portiunea din vectorul


// ce are doar nA-L comqonente:
ordonareCre s c (A,nA' I ) ;

]//ordonareCresc
private static int getPozMax(int A[J, int nA)

cAnd rf,spunsul este on'


Se vor afiqa in final numerele memorate in obiectul Vector

class VectorDinamic

if(nA: : t ) return ; //un s ingur e lement, e ste impli c it ordonat !


int p o z : ge t P o z Max (A, nA) ; // inde xul max imului
tf(poz!:iA-I){//daca este chiar pe ultima poz., nu avem ce comuta!
AIwA-1]:A[poz];
A[pozJ:temp;]

pini

import java.util.*;
import javax.swing.*;

for(i:0;i<N;i++)
System. out.

repeti

citim un numdr real


il memordm intr-un obiect de tip Vector
se afigeazi mesajul: "Dati un alt numar? [d/n] "
se citegte rlspunsul la acest mesaj

//citire vector A[]:


A

47

public static void main(String args[])


l

Vector

v:new Vector);

double nr;

"for(;;){
nr: Double. parseDouble (JOptionP
v. add(new Double (nr)) ;
String raspuns:

ane. show InputDialog("nr.

JOptionPane.showlnputDialog("Dati un alt numar? [d/nJ :


if(raspuns. charAt (0) : :'n') bre ak ;

A[]

afisareVector(v);
//Modificam primul numqr introdus anterior in Vector:
v. set (0,new Double (7. 5)) ;
System. out.println("Vectorul modificat : ") ;

:
")

"))

Vectori. Matrici.

Vectori. Matrici.
int

afisareVector(v);
System.outprintlnQ;

aw:a[iJ;

a[iJ:a[t+1J;

a[i+I]:aux;

suntlnv:true;

private static void afisareVector(Vector v)

{
int n:v.

ize

Q;

// dimens

iune a

o b ie

ctului

Ve ct or

if(s unt I nv : :fa I s e) b r e ak ;

for(int i:0;i<n;i++){
Double obiectCrt: (Double)v. get (i) ;

//fara operatorul cast (Double): eroare, caci metoda get)

]
)

//returneaza un obiect de tipul Object


Sy s tem.

out.println(ob

ie

ctC rt. doubleValue 0 ) ;

//dintr-un obiect Double se extrage valoarea lui numerica de tipul


//double, cu metoda doubleValueQ

]//fo,

]
]

Exemplul

doui mullimi de numere intregi, (in fiecare mulfime,


numerele sunt diferite), in doi vectori A qi B. Sd se calculeze
reuniunea celor doui mullimi.
Se citesc

class Reuniune

Exemplul

Sd se scrie o aplicafie Java in care se implementezi algoritmul


de sortare bubblesort a unui vector de numere intregi.
class Sortare

public static void main(String args[J)

int afl : { 1,7,6, 5, I 0,4, 3,2,9,8} ;


int i;
bubbleSort(a);
//afisare:
for (i: 0 ; i<a. length ; i+ +)
Sys te m. out. println(a I i]) ;

public static void main(String args[J){


int A[J:{1,10,2};
int B[J--{5, 6, 7, 2, 10};
int nA:A.length;//nr. de elemente din A
int nB:B.length;
int i;
int C [J :new int [nA+ nBJ ; //vectorul reuniune
//Copiem pe A in C:

for(i:0;i<nA;i++)

c[i]:A[i];

//Adaugam in Cfl toate elementele din B[J, care


// nu sunt si in A[J:
int iC:nA;//index in multimea C

for(i:0;i<nB;i++)
if(e ste P rezent (B [i],A)

tI

private static void bubbleSort(int a[J)

c[ic]:B[i];

iC++;

: :false) {

int dim:a.length;
int i;
boolean suntlnv;

int nC:iC;//numarul de elemente din


//Afisare A[]:

for(;;){

for(i:0;i<nA;i++)

suntlnv:false;

for(i:0;i<dim-1;i++)

if(a[iJ>a[i+tl{

System. out.print (A[iJ +

System.out.printIn0;
/Wsarea multlmll B:

"

")

Cfl

Vectori. Matrici.

for(i:0;i<nB;i++)
System.out.print(B [iJ +

"

")

System.out.printlnQ;
//Afisarea multimii C:

for(i:0;i<nc;i++)

System.out.print(C [i]

")

private static boolean estePrezent(int x,int a[J)

for (int i : 0 ; i< a. length ; i + + )


,f(a I i] : -- x) r e t urn t r ue ;
returnfalse;

]
3. Matrici

Matricile reprezintduncaz particular de vectori. O matrice


este un vector ale c[rui componente sunt tot vectori (liniile matricii).
O matrice se instanfiazd astfel:

tipDate nume[ ] [ ]:new tip[nrlinii] [nrColoane] ;


Exemplu: int a[ ][ ]:new int[10][20];
O matrice poate fi inilializatd qi in mod direct, ca in exemplul
urm[tor:

(-s
tt
Daca a:l I
tt
[-5

int a[ ][

]:{

o\

2l,

Exemplul 1
Citim de la tastaturd numirul de linii gi numdrul de coloane ale
unei matrici. Inilializ[m matricea cu numere aleatoare in gama 0...99
gi calcul5m gi afigdm maximul din matrice.
class

+"

o putem initializa direct, astfel:

7)

{-3,0},

{t,2},
{-5,7} };

O matrice fiind un vector de vectori (de linii), plecOnd de la


numele matricii, oblinem numdrul de linii qi numdrul de coloane,
astfel:

nrl,inii:nume.length
nrColoane=nume [0].length

5l

Vectori. Matrici.

public static void main(String args[

])

int nL, nC;

nL: Int e ger. pars e Int (JOpti onP ane. show Input D ialo g (" nr. I ini i :
nC : Int e ger. par se Int (JOpt ionP ane. s how Input D ialo g(" nr. col. :
int a[ ] [ ]:new int[nl] [nC] ;
final int GAMA:100;
Random r:new RandomO;
for(int i:0;i<nl;i++)
for(int j:0j<nC j++)
a I iJ [j J :r. next Int (GAMA) ;
Syste m. out. println(" max: " + maxim (a) ) i

private static int maxim(int at I t

")1

") )

;
;

l)

int max:a[0] [0J;

for(int i: 0 ; i<a. length; i + +)


for(int j : 0 j < a [0J .lengthi + +)
if(a[iJ fiJ>max) max:a[i] fiJ;
return max;

Exemplul2
Se citeqte de la tastatur[ o matrice de numere intregi, de
dimensiuni cunoscute (numdrul de linii gi numirul de coloane citite
anterior). Sf, se calculeze gi afiqeze daci matricea are toate numerele
egale intre ele.
import javax.swing.*;
c I as

s Matric

e Sunt E

gale

{
public static void main(String args[J)
f
t

int nl;//numar llnll malrlce

Vectori. Matrici.

Vectori. Matrici.

nL: Inte ger.parselnt (JOptionP ane. show InputDialog("nr. linii:


int nC;//numar coloane matrice
nC:Integer.parselnt(
JOptionP ane. show InputDialog("nr. coloane int a[] IJ :new int[nLJ [nCJ ;
//citire matrice:
int ij;

") )

if(sunt E gal e (a til,


System.
"))

return;

for(i:0;i<nl;i++)
for(j:0j<nC j++1

:Inte ger.parselnt (JOptionP ane. show Input Dialog(" nr: ")) ;


[jJ
boole an e gale : suntToate Egale (a) ;
f(e gale : : t rue ) Sy s t e m. o ut. pr int I n ( " 5 unt t o at e nume r e I e e gal e. ") ;
e lse System. out.println("Nu sunt toate e gale ") ;

private static boolean suntToateEgale(int o[] [])

for (int i: 0 ; i< a. length; i+ + )


for (int j : 0 ;j < a [0] .length j + +)
if(a [i] [j] ! : a [0] [0J) return false ;
return true;

out.println("Are linii e gale intre ele,,) ;

)
System.out.println("Nu are linii egale intre

ele,,)

private static boolean suntEgale(int liniel[J, int linie2fl)

{
//Se compara doi vectori pentru egalitatea

for(int : 0 ; i<linie I lengrh ; i+ +)


if( inie I [iJ ! :l inie 2 [i] ) re turn fals e ;
i

lor:

return true;

]
)
Exemplul4
Se dd o matrice de numere intregi.. Sd se calculeze gi afiqeze
acest[ matrice existd cel pu{in o linie care s[ aibd toate
elementele egale intre ele.
c las s Matr ic e Linie C onst anta

dacd

in

public static void main(String args[J)

Exemplul3

di

o matrice de numere intregi. S[ se calculeze gi afigeze


dacd in acesti matrice exist[ cel pulin doui linii egale intre ele.
clas s Matrice LiniiEgale
Se

int aflfl:{fl,2,3,4,5},
{0,0,0,0,0},
{1,2,3,4,5},

fl,1,1,0,1));

public static void main(String args[J)

//Parcurgem toate liniile matricii :


int nL: a. length ; //numarul de linii

{
int afl fl:{fl,2,3,4,5},
{0,1,0,0,0},
{1,2,3,4,5},
{1,1,1,1,1}};
//Comparam liniile matricii, doua cate doua:
int nL: a.length; //numarul de linii
int nC : a [0J . Iength; //numarul de colo ane
int ij;

for(i:O;i<nl-l;i++)
for(j:i+l j<nLj++)

a [iJ

j:
tj D {

//compara linia i cu linia

for(int i:0;i<nl;i++)

//are linia curenta i, toate elementele egale?


if(ar e To ot e E gal e (a I i]) ) {
Sy s te m. o ut. pr int ln ( "Ar e.
return;

)
Sys te m. out.

pr int ln

( "Nu

are. ") ;

private static boole an areToateEgale (int I inie fl)

Vectori. Matrici.

55

Stringuri

//Se compara toate elementele vectorului, cu primul:

Capitolul5
Stringuri

.for (int i: I ; i<linie. length ; i + + )


if( inie [d ! : I inie [ 0J) re turn fal s e ;

return true;

]
]

1. Clasa String. Generalitd{i.


2. Metode de bazi din clasa String.
3. Metode ce au ca parametrii stringuri.
4. Alte opera{ii cu stringuri.
5. Vectori de giruri.
6. Clasa StringTokenizer.

1.

Clasa String. Generalitati.

in limbajul C, un string este un vector de caractere.


in limbajul Java, un string este un obiect instanfiat din clasa
String, clasd definiti in java.lang.
Instanfierea unui string se face in doud moduri:
a) cu ajutorul operatorului new:
String s=new String("abc");

Variabila s este o variabild referin{i ce {ine adresa obiectului string


propriu-zis.
Obiectul string este alocat in memoria heap.

b) Al doilea mod de instanfiere: prin atribuire directi.

String st:"1234";
Stringurile sunt obiecte imutabile (nu se pot modifica).
Exemplu:
Shing s:"abc";

s:tt12";

in limbajul C*f, existd noliunea de destructor ca qi nofiune


complementard constructorului. Un destructor in limbajul Cr* este
apelat ln mod explicit pentru a elibera, in general, memoria dinamicd
atunci cdnd un obiect nu mai este folosit.

Stringuri

Stringuri

in limbajul Java, nu existd nofiunea de destructor, eliberarea


spaliului de memorie dinamicd atunci cdnd un obiect nu mai este
necesar, se face automat de cdtre un proces (fir de execu{ie) denumit
garbage collector (colectorul de gunoi). Acest garbage collector
sesizeazdcdnd un obiect nu mai este necesar gi dezalocd in mod
automat spa{iul de memorie ocupat de acesta.
in cazul stringurilor asupra clrora trebuie ftcute multe modificdri,
se recomand6 sd se foloseasc[ in loc de clasa String, clasa
StringBuffer din pachetul java.util, stringurile instanliate din aceast6
clasd fiind mutabile (pot fi modificate).
2. Metode debaza din clasa String.

]
]
3. Metode ce au ca parametrii stringuri.

Exemplul I
Rescriem programul anterior folosind o metodd separati ce
retumeazd numIrul de caractere egale cu un caracter dat ca parametru
dintr-un string.
import javm.swing.*;
class 52
f

public static void main(String args[ J)

1. Cea mai importantd metod[ este metoda length( ) cu semndtura:

public int length( )


care returneazd lungimea qirului.
2. metoda charAt( ) cu semndtura:
public char charAt(int index)
care returneazd caracterul de la pozilia index.

String s:JOptionP ane. showlnputDialog(" Sir:


int contor:calcul(s,' a') ;
Sy s t e m. o ut. pr int I n (c ont or) ;

")

private static int calcul(String s, char ch)

ATENTIE:

in limbajul C: s[i]
In limbajul Java: s.charAt(i)
OBS: Pentru a citi girul de la tastaturd se folosegte metoda
showlnputDialog( ) din clasa JoptionPane care face parte din
pachetul javax.swing.
Exemplu
Citim un gir de la tastaturd. Si afigdm de cdte ori apare caracterul a in
gir.( pentru'ocasa"
- 2).
import javax.swing.*;
class Sl

public static void main(String argsI J)

int contor:0;
for (int i:0; i<s.length( ); i++)
if (s.charAt(r: :'a') contor t-t;
return contor;

]
]
Exemplul2
Sd scriem o metod[ ce are ca parametru un string gi care
retumeazd adevdrat dac5 toate caracterele din gir sunt egale intre ele.

private static boolean toateEgale(String s)

for (int i:1; i<s.lengthO; i++1


if (s. charAt (i) ! : s. charAt(O) ) return false ;

String s :JOptionP ane. show InputDialog( " Sir : ") ;


int contor:0;
int i;
for (i:0; i<s.lengthO; i++)
if (s.charAt(, : :'a') contor -t * ;
Sy s t e m. out. pr intln (co ntor) ;

return true;

Stringuri

Stringuri

Exemplul3
SI scriem o metodi ce stabileqte dacd toate caracterele unui
sunt diferite intre ele.
pr iv at e s t at ic b o ol e an t o at e D ifer it e (S tr ing s)

Exemplu:

;ir

for (int i:0; i<s.length( )-I; i++)


for (int j:i+ I ; j<s.length( ); j++)
if

$.charAt (i)

:s.charAt(j)) return false ;

Pentru a compara dou[ stringuri ca qi con{inut se folosegte


metoda equals( ) sau metoda compareTo( ).

4. Alte operafii cu stringuri.

Concatenarea a doul giruri:


Pentru a concatena doud giruri se foloseqte operatorul de
concatenare ot*tt.

Exemplu:
String s;
String s1:"abc";
String s2:"12";
s:s1+s2; I I st-"abcl2" .
o'l' este un operator binar in care
Operatorul de concatenate
unul dintre operanzi trebuie sd fie in mod obligatoriu String, cel de-al
doilea poate sd fie qi diferit de String, dar va fi convertit in mod
automat, daci este posibil, la tipul String.
Exemplu:
String s:"abc";
int nr:15;
String rezultat:s-lnr ; // " abc I 5 ".

Compararea a doui qiruri.


Sunt trei posibilt[li de a compara dou[ qiruri:
a) cu ajutorul operatorului::
b) cu ajutorul metodei equals( )
c) cu ajutorul metodei compareTo( )
Compararea a doul giruri cu ajutorul operatorului

Se compara referintele, nu

continutul

I:

,2ffi

return true;

a)

String sl:"abco';
String s2: new String("abc");
if (s 1: :s2) System.out.println("DA");
else System.out.println('NU");//Programul afi qeazd: NU

=:

b) Compararea a doui qiruri cu ajutorul metodei equals( )


Metoda equals( ) este definitl in clasa Object gi este mogtenitd
ca atarc qi de cdtre clasa String. Metoda equals( ) are urm[toarea
semniturd:
public boolean equals(Object o)
Compard obiectul curent cu obiectul dat ca parametru. Dac[ sunt egale
returneaz[ true.
Exemplu de aplicare pentru clasa String:
String s1:"abco';
String s2: new String("abc");
if (sl.equals(s2): :true) System.out.println("DA");
else System.out.println('NU");//Programul afi qeazd DA
c) Compararea a doui giruri cu ajutorul metodei
compareTo( )
Metoda compareTo( ) este definitd in clasa String gi are
urmdtoarea semndturd:
public int compareTo(String s)
Compard girul curent cu girul dat ca parametru din punct de vedere al
ordinii lexicografice. Ordinea lexicografici este o generalizare a
ordinii alfabetice, in care doud giruri sunt comparate caracter cu
caracter, pebaza codurilor Unicode ale caracterelor.
Metoda compareTo( ) scoate un rezultat 0, dacl cele doud
giruri sunt egale(au acelaqi confinut). DacS girul curent este mai mare
decdt qirul dat ca parametru, in sensul ordinii lexicografice, metoda
compareTo( ) scoate un rezultat mai mare ca 0. Dacd girul curent este

Stringuri

Stringuri

mai mic decdt girul dat ca parametru, metoda scoate un rezultat mai
mic ca 0.
Exemplu:
String sl:"Abc";
String s2:"Aa"i
int rez:sl.compareTo(s2); / / >0

s1:

s2:

6. Clasa StringTokenizer
5. Vectori de qiruri.

Vectorii se giruri se declar[ la fel ca si vectorii de primitive.


Exemolu
Se citesc N nume de la tastaturi intr-un vector de stringuri. Sd
se sorteze vectorul de stringuri in ordine alfabeticl.
class VectorS

public static void main(Sning args[ J)

int N:Inte ger. parse Int (JOptionP ane. show InputDialog(

"

N:

") ) ;

String nume[ ]:new String[NJ;


for (int i:0; i<N; i++)
nume [iJ : J Opt i onP ane. s how Input D i al o g ( " nume : ") ;
sortare(nume);
for (int i:0; i<N; i++)
Sy s tem. out. println (nume I iJ) ;

private static void sortare(String numeI J)

for (int i:0; i<nume.length( )-1; i++)


for (int j :i* I ; j <nume.length( ) ; j + +)
//compar pe nume[i] cu nume[jJ:

if

I iJ . compare To (nume [j ] ) > 0) {


String aux:nume[iJ;
nume[iJ:nume[j];
nume[j]:aux; ]
(nume

OBS: Cdnd interschimblm doud giruri, se interschimbd doar referin{elo


lor.

Pentru a extrage atomii lexicali dintr-un string, se foloseqte clasa


Strin gToke nizer, defi nitl in pachetul j ava. util.

Constructori:
pu blic StringTokenizer(String

s)

Este folosit atunci cdnd separatorul implicit dintre atomi este


caracterul spafiu.
public StringTokenizer(String s, String separator)
Acest constructor se foloseste cand folosim alt caructet ca separator
(diferit de spatiu), caracter ce va fi dat caparametru.
Exemplu:In stringul "23:20215", caracterul de separafie este :

Metode:
a) public int countTokens( )
Returneaz[ numdrul de atomi din string.
b) public String nextToken( )
Returneazd atomul curent din string.
c) public boolean hasMoreTokens( )
Returneazd true dacd, mai sunt atomi neextragi din gir.
Exemplu
l.
Se citesc de la tastaturd sub formi de giruri de caractere doi
timpi, in formatul hh:mm:ss (ore: minute: secunde). Sf, se afiqeze care
timp este mai mare.
Exemplu:

T7:5:35:42
T2:5:18:50
Se va afiga: T2 >

import
import

Tl

javm.swing.*;

jwa.util.*;

class ComparaTimpi

public ststic void main(String args[J)

{
S tr i ng t i np

I =,IOpt ionP ane. s how Input Di al o g

Mogtenirea

("timpl (hh:mm:ss) : ");


:JOptionP
ane. show Input Di alo g
String t imp2
("timp2 (hh:mm:ss) : ");
//Extragem dinfiecare timp, orele, minutele si secundele.
// Folosim clasa StringTokenizer pentru a extrage acesti atomi.
StringTo lrenize r tk:new StringTokenizer (timp 1, " : ") ;
int ore I : Inte ger. p ar se Int (tk. nextToke
);
"0
:
,0
(tk.
nextTofu
ge
par
se
Int
r.
I
Inte
;
min
int
:
(t
par
k.nextToke"Q
s e Int
int s e c I Inte ger.
);
//Calculam primul timp, in secunde:
int T I : 3 600*ore I + 60*minl * sec I ;
//Similar, pentru timp2 :
tk: new StringToke nizer (t imp2, " : ") ;
int ore 2 : Inte ge r. p ar se Int (tk.nextTofu ,0 ;
int min2 : Inte ger. parse Int (tk.nextTofunD ;
int se c2 :Inte ger. parselnt (tk.nextTokenQ) ;
int T2 : 3 600*ore2 + 60*min2 * sec2 ;
ifQ I > T2) Sy s tem. out. println(' t imp I > t imp 2 ") ;
: : T2 ) Sy s t em. out. println(" timp I : t imp2 ") ;
e t s e ifQ 1
else System. out.println("timp I < timp2 ") ;

]
]

Capitolul6
Mogtenirea

1. Generaliti{i.
2. Exemple.
1.

Generalitl{i.
Mogtenirea este capacitatea prin care dezvoltlm o noud clas[

plecAnd de la o clasd existentd. Noua clasd oblinutd prin moqtenire de

la clasa existent5, se cheamd clasl derivati ( sau clasi fiu sau


subclasi). Clasa existentd din care prin mogtenire derivdm subclasa se
cheami clasi de bazl (sau clasi pirinte sau supraclasi).
Mogtenirea este o trisltur[ fundamentald in POO. Ea permite
sd dezvoltdm mai rapid noi clase pe baza claselor existente. Astfel, in
loc sI proiectf,m de la zero o nou[ clas[, cdutdm intre clasele existente
o clas[ asemdnitoare gi noua clasd o derivdm din aceasta. Acest stil de
programare se cheam[ programare prin diferen{e ( in noua clas[
programam doar diferenfele fafn de clasa existent[ ).
Subclasarea unor clase existente se face pentru a nu
"reinventa" cod deja creat.
in biblioteca grafrcd in pachetul javax.swing exist[ clasa
JFrame, ce modeleazi o fereastrd grafrca (cu bara de titlu, cu cele trei
butoane tipice si cu comportament de fereastri). Dac[ vrem sd facem
o aplica{ie in care intr-o fereastrd avem mai multe componente
grafice, atunci clasa necesard in aceastd aplica{ie va subclasa (va
mogteni) clasa JFrame.

Pentru a implementa moqtenirea se folosegte cuvdntul cheie


extends.
Exemplu

stGrild extends JFrame


Legat de moqtenire existd un specificator de acces ce se aplici
membrilor unei clase (variabile de instanfd, constructori, metode) gi
anume specificatorul de acces protected.
Membrii unei superclase declarafi protected pot fi accesa{i
doar de subclasele ei. Aceste subclase pot face parte din alte packageuri de clase decdt package-ul clasei de baz[.
Clasele ce fac parte din acelagi package ca qi superclas4 chiar
dac[ nu o subclaseazd (nu o moqtenesc) au acces gi la membrii
protected.
clas s FereastraTe

Moqtenirea

in

mod evident,

la

membrii private nu au acces nici

subclasele.

in Java, spre deosebire de limbajul C#, nu existd moqtenire


multipli-, adicd in Java o subclasd nu poate avea decdt un singur
pdrinte. in Java, o clasd extinde o singurd clasl (nu mogteneqte decdt
de la o singurd clasd), dar poate sd implementeze mai multe interfele.
Subclasa mogtenegte de la superclasl membrii protected sau
public ai superclasei.

In

subclasd pot

fi

adf,ugate noi variabile de instan!6(care nu


existd in superclas[) gi noi metode sau subclasa poate sd redefineascd
anumite metode mogtenite de la superclasS.
Constructorii nu sunt mogtenili de la superclasd la subclas[.

Din subclasi se poate apela constructorul clasei de bazd,


folosind cuvdntul cheie super(...), cu parametrii necesari.
in cazul in care se apeleaz[ iu super(...) constructorul clasei
de baz6, aceastd instrucfiune hebuie sd fie prima instrucfiune din
metoda respectivi (ce confine apelul cu super).
Str[mogul tuturor claselor din Java este clasa Object.
Chiar dacl o clasf, nu extinde in mod explicit o altd clasd (nu
folosegte cuvdntul cheie extends), ea mogtenegte in mod implicit clasa
Object.^
In clasa Object sunt definite metode ce sunt mogtenite de toate
clasele din Java. Iata cateva din acestea:
r metoda equals( )
public boolean equals(Object o)
Se folosegte pentru a compara doui obiecte din punct de
vedere al egalitdfii referinfelor.
Multe clase Java, redefinesc metoda equals0 mogteniti de la
clasa Object, pentru a compara doud obiecte din punct de vedere al
confinutului. Astfel, in clasa String, metoda equalsQ este redefiniti.
Ea returneazd true, dacf, cele doud giruri comparate au acelagi
confinut.
Exemplu:
String sl:"abc";
String s2:new String(s l) ;
if(s I e quals (s2)) System. out.println( " s I si s 2 au acelas i continut. ") ;
else System.out.println("sI si s2 nu au acelasi continut.");
//Se va afisa:
// sl si s2 au acelasi continut.
.

Moqtenirea

65

o metoda toString( )
public string toString( )
Se folosegte pentru a da o reprezentare sub formd de String
unui obiect.
2. Exemple.

Exemplul

SE se construiascd clasa ContBancar,

folosit[ pentru a modela

un cont bancar, ce are ca variabild de instanfd privat6, variabila suma,


(suma de bani din cont). Ca metode:
constructorul;
adauga0, ce arc ca parametru un numdr real x, valoarea ce se
adaugdin cont;
extrage0, ce are ca parametru un numdr real xo valoarea ce se
extrage din cont, qi care scoate ca rezultat true, dacd se poate face
extragerea (suma ;': X), Sifalse in caz contrar;
getSuma0, ce returneazi valoarea variabilei private suma;
afisare0, ce afigeazi valoarea sumei de bani din cont.
Pe baza clasei ContBancar se va dezvolta prin derivare (mogtenire)
clasa ContBancarExtins, in care se va adduga o nou6 variabilf, de

instanfd: ruta dobdnzii anuale gi o

noui

metodS:

adaugaDobandalunaraQ, ce adaugd in cont dobdnda calculatd dupd


trecerea unei luni. in clasa ContBancarExtins se va redefini gi metoda
afisareQ, astfel incdt si se afiqeze qi rata dobdnzii. De asemenea, in
aceastl noud clasi se va defini constructorul, prin care se inilializeazd
suma de bani din cont qi rata dobdnzii.
Sd se scrie gi o clasl de test pentru clasa ContBancarExtins.
class ContBancar

private double suma;


public C ontBancar (double

/
I

S)

suma:5,'

)
public void adauga(double

S)

{
suma:suma*S;

public boolean extrage(double

S)

Moqtenirea

Mogtenirea

{
if(S> s uma) re t urn fal s e ;

ContBancarExtins c:new ContBancarExtins(L000,0. t 2) ;


c.adauga(1000);

suma:suma-s;
return true;

c.

adaugaD

ob

and alunar a 0 ;

c.afisareQ;

public double getSumaQ

]
]

{
return surna;

Exemplul2

privati, un num[r intreg r, ce

public void aJisare0


System. out.

Si

println(" suma: " I

suma)

c I as s C ont B

ancarExtins

exte nds C ont B anc

ar

private double rd;//rata dobanzii anuale


pub I ic C o nt B anc ar Ext ins (do ub I e S, do ub I e r at a)

ffisuper(S);
rd:rata;

)
p ub

ic

v o id

adaugaD

{
doubl e

ob

andalunar

thi s. ge t Suma

aQ

double dob anda: S*rd/ I 2 ;


t hi s.

adauga (do b anda) ;

suntEgale0, ce are ca parametru un Cerc c, gi care retumeazd


true dacd cercul curent este egal cu cercul c (au aceeagirczFl.

afisareQ,ceafiqeazdruzacercului.
Din clasa Cerc se va deriva clasa CercExtins, in care se vor adiuga ca
variabile de instanfi x gi y: coordonatele centrului qi se vor redefini
metodele suntEgale0 (cercurile sunt egale cdnd au aceeagi razd qi
aceleagi coordonate ale centrului), qi afisare0 (pe ldng[ razd, va afrsa
qi coordonatele centrului)
Scriem qi o clasi de test pentru clasa CercExtins.
class Cerc

private int raza;


public Cerc(int x)

{
raza--x;

public void afisareQ

public int getRazaQ


Sy stem. out.
Sy s tem. out.

pr intln(" suma: " -t this. ge t Suma Q ) ;


pr intln(" rata dob anzi i: " + rd) ;

)
)
class TestCont

se construiasc[ clasa Cerco ce are c& variabild de instan{[


reptezintd, raza unui cerc. in aceast[
clasd avem ca metode:
constructorul, ce face initrializarea rczei;
getRaza0, ce r etumeazd r aza;
calculArie0,ce returne azd aria cercului ;

public static void nain(String args[J)

{
return raza;

public double calculArie

{
re

turn Mat h. P I * raz a* raz a ;

Mogtenirea

Mogtenirea

public boolean suntEgale(Cerc c)

Sys te m. out.

if(thi s. r az a: :

CercExtins
c.

raza) re turn true

println(" Aria: " + c. c alculArie


c I :new CercExtins (3, 0, I 0) ;

Sy s te m. o ut. pr int ln (" Sunt

else returnfalse;

e gal e

"

+ c.

Q)

unt E gal e (c I ) ) ;

public void afisareQ


Exemplul3

{
System. out.

println(" raza:

"+

raza)

]
class CercExtins extends Cerc

private int x;
private int y;
public CercExtins(int r,int x0, int y0 )

super(r);

x:x0;

!:y0;

pub

lic

bo

ole an sunt E gale (C e rc Ext ins c)

if((t his. ge t Raz a Q : :

c. ge t Raza

:
0) & & (thi s. x

return true;
else returnfalse;

public void afisare0

{
out.println("raza: " * this. get RazaQ) ;
pr intln("x: " + x)'
Sy s te m. out. pr intln(t'y : " sr| t

c.

x) & & (thi s.y

: : c.y))

Sd se construiascd clasa Punct3D, folositd pentru a modela un


punct in spafiu, ce are ca variabile de instanfd x, y, z, coordonatele
unui punct in spafiu. Ca metode:
constructorul'
muta0, ce are trei parametrii dx, dy gi dz, pe baza cdrora
coordonate ale punctului devin: 1*dx, yrdy, z-tdz;
compara0, ce are ca parametru un punct p, gi care retumeazd"
true, dacd" punctul curent (cel referit prin this ) este egal cu punctul p,
qifalse in caz contrar;
distanta0, ce are ca parametru un punct p, gi care reirneazd"
distanfa intre punctul curent gi punctul p;
getXQ ce returneazdvaloarca coordonatei x;
getY0 ce returneazdvaloarca coordonatei y;
getz0 ce returneazdvaloarea coordonatei z;
afisare0 ce afigeaz[ coordonatele punctului.
Pebaza clasei Punct3D, se va dezvolta clasa Punct3DColor, in care se
va ad[uga o nou[ variabild de instanfl de tipul String: culoarea
punctului gi o noud metodd getCuloareQ ce returneazd culoarea
punctului. Se vor redefini metodele comparaQ qi afigare0 qi noul
constructor.
S[ se scrie gi o clas[ de test pentru clasa Punct3DColor.
class Punct3D

System.

Sy ste m. out.

private int x;//coordonata x a punctului


private int y;
private int z;
public Punct3D(int x,int y, int z )

class TestCercExtins

public static void main (String argsfl)


f
I

CercExtins c:new

CercExtins (3, 0, I ) :

this.x:x;
this.y:y;
this.z:z;

publtc int getX)

70

Moqtenirea

7t

Mogtenirea
class Punct3 DColor extends Punct 3D

return x;

private String culoare ;


public Punct3DColor(int x, int y, int z, String culoare)

public int getYQ

super(x,y,z);

return Y;

this. culo are

public int getZ)

public String getCuloare)

return z;

return culoare;

public void afisareQ


Sy stem. out.

Println("x:

Sy st em. out.

Println

"

+ x)

public void aJisareQ

: " +r1 t
:
z
" + z)'
Sy stem. out. Println("
("Y

out.println("x: " + getX()) ;


out.println(t'y: " + getY Q) ;
Sy ste m. out. pr intln(" z : " + getZ) ) ;
Sy ste m. out. println(" culo are : " + culo are) ;
System.
System.

public void muta(int dx, int dy, int dz)

x:x+dx;
y:y+dy;
z:z*dz;

public boolean compara(P unct 3 DColor p)

: :p. ge tX| & &


:
(this. ge tYQ :p. ge tY| & &
(this. getZQ : :p. getZ| & &
(t his. cul o ar e : : p. c ul o are) )

tf((this.

public boolean compara(Punct3D p)


if( (x : --p. x) & & (y :
retum true;
else returnfalse;

-- p. y)

&&

(z

: : p' z) )

return true;

public double distanta(Punct3D p)


double dx:this.x-p.x;
double dY:this.Y-P.Y;
double dz:this.z-P.z;
*
double dist : Math. sqrt (dx dx+ dy* dy

class TestPulrcte

public static void main (String argsfl)

+ dz * dz)

return dist;

)
)

ge tXQ

else returnfalse;

: culo are ;

unct 3 DC o lor p

p.muta(I,1,1);
p.aJisareQ;

)
)

:new

unct 3 DC olor (0, l, 2, " ne gru")

Mogtenirea

72

Moqtenirea

Exemplul4
56 se dezvolte clasa Persoana ce are ca variabile de instan!5
numele qi prenumele unei persoane 9i vdrsta ei' qi ca metode:
constructorul ce face initializirile;
getNume0, ce returneaz[ numele;
-

Din

getPrenumeQ, ce refurneazd prenumele;


afisare0, ce afiqeazd informaliile despre persoanl.
clasa Persoana Se va deriva clasa Studento ce are

in plus

]
class Student extends Persoana

priv ate String nume Facultate ;


private int nrMatricol ;
public Student(String n, String p,

ca

super(n,p,v);

variabile de instanfi, numele facultaJii pe care o urmeazd qi numdrul


matricol. in clasa Student se va dezvolta un nou constructor qi se va
redefini metoda afisareQ. Se vor adiuga in plus metodele:
getFacultate0;
getNumdrMatricol0.
Se va dizvolta o aplica{ie in care se vor citi de la tastaturl N: l0
studenfi, ce Se vof memora intr-un vector. Se vor afiqa cdfi studenfi au
prenumele 'olon".
import jovax.swing.*;
class Persoana

private String nume;


private String prenume ;
private int varsta;
public Persoana(String n, String p, int v)

String facult, int nrMatr)

nume

F ac ult ate :fac ul t ;

nrMatricol:nrMatr'

public String getFacultate

return numeFacultate;

public int getNumarMatricol

return nrMatricol;

class TestStudenti

public static void main(String args[])

{
nume:n;
prenume:p;
varsta:v;

final int N:2;


int i;

for(i:0;i<N;i++){

Student s [J :new Student [NJ ;

public String getNumeQ

return nume;

public String getP renume

return prenume;

public void afisareQ

System. out.println(nums +

String nume :JOpt ionP ane. show InputD ial o g (" nume : ") ;
String prenume : JOptionP ane. show InputD ialo g ("prenume : ") ;
int varsta:
Int e ge r. p ar s e Int (J Op t i onP ane. s how Input D i al o g (" v ar s t a : ") ) i
String fac ultate :JOpt ionP ane. s how InputD ialog( focultate : ") ;
int nrMatr:Inte ger.parse Int
(J Opt i o nP ane. s how Input D i al o g ( " nr. matr ic o I : ") ) ;
s [iJ :new Student (nume,prenr.tme,verstalfacultate, nrMatr) ;

inl contor_ion=0;

" " * prenume * " : " +varsta) ;

.for(i:0:i<N;l++){

74

String prenume Crt : s [iJ.

Moqtenirea
ge tP re nume

if(pre nume C rt. c ompareTo (" Ion")

Sy s t e m. o ut. pr int ln (c ont o r _i o n)

]
]

Clase abstracte. Interfete.

: : 91 contor _ion't * ;

Capitolul T
Clase abstracte. Interfete

1. Clase abstracte.

2. Interfe{e
1. Clase abstracte.

O clasi abstracti este o clasl din care nu se pot instan{ia


obiecte. Din ea se pot ins6 deriva noi clase (poate fi subclasatd). Ea
este folositoare ca gi qablon mogtenit de alte clase.

Clasa abstractd poate s[ confind doud feluri de metode: metode


care au definilia completi (metode care au gi implementare) gi metode
care nu sunt implementate(nu au corp, au doar antet). Metodele care

nu sunt

implementate se definesc cu ajutorul cuvdntului cheie


abstract. In general, aceste metode abstracte sunt implementate de
cdtre clasele derivate din clasa abstractd.

O clasl abstractd se definegte cu

cheie

abstract.
Exemplu
abstract class

{
)

Ito\iaew*g

lleroarc de sintax6!!!

Exemplu

Definim clasa abstractd

A ce are doui

implementatd gi alta care nu este implementati.


metoda abstractd calcul0;

metoda durataCalculQ

ce retumeazd durata exprimatl

in

milisecunde, a execufiei metodei calcul$;


Din clasa abstract[ Ao se va deriva clasa B ce confine implementarea

metodei calculQ. Se va dezvolta gi


derivatd B.
import javm.swing.*;
import java.util.*;
abstract class A
I

clas6 de test, pentru clasa

Clase abstracte. Interfele.

Clase abstracte. Interfefe.

abstract public void calcul(int N);


public long durataCalcul(int N){
long t 1 :System.currentTimeMillis 0 ;

Nofiunea de interfafi poate fi vdzutd ca o generalizarc a


nofiunii de clasl abstractS, in sensul cd toate metodele din interfafi
sunt abstracte(ftr6 implementare).
O interfaf5 se definegte cu ajutorul cuvdntului cheie interface.

calculQ'{);

long t 2 : Sy s te m. cutentTime Mill


return (t2tl);

is 0

O clasd nu poate sd mogteneasc[ decdt o singurd clas5, dar


poate implementa mai multe interfe{e.
De ce s-a inventat qi nofiunea de interfald? S-a constatat cI in
timp, semn6turile metodelor sunt mai viabile, in sensul ed"av o viatl

]
]

class B extends A

mai lung6" decOt implementdrile.

public void calcul(int N)

{
//C alcule

az

Exemplu
Definim interfala Forma in care avem dou[ antete de metode:
arieTotald( ) qi volum( ).
interface Forma
r

a N *N * N pro duse

int ij,k;
long rezultat;

for(i:I;i<:N;i++)
for(j:1j<:N j++1

for(k:1;k<:N;k++1
rezultat:i*j*k;

public double arieTotald( ) ;


public double volum( );
Definim douf, clase ce implementeazdaceastd interfa!5:

clasa Cub

clasa Paralelipiped

class Test

class Cub implements Forma

/I

public static void main(String args[J)

final int N:1000;


B b:new B0;
Sy s t e m. o ut. pr

intln ( " dur at a c al c ul

private double a;
public Cub(inr a)

"

+ b. dur at aC al c ul (N) + " m s. ")

this.a:a;

public double getAo

2. Interfe(e.

return a;

O interfa{i con{ine o list[ de semndturi de metode (


fbrd implementare). O interfafi poate sd defineasc[, de
constante. O clas[ ce implementeazd o anumiti interfafi se obligl

public double arieTotald( )

dea implementarea pentru toate metodele declarate in interfafi.

clasd ce implementeazb

cuvdntul cheie implements.

anumitd interfa{d

return 6*a*a;

public double volum( )

{
return a#a*a,'

78

Clase abstracte. Interfete.

Polimorfism

Capitolul S
Polimorfism

]
1.

clas s P aralelipiped implements Forma

private double x;
private double y;
private double z;
public Paralelipiped(int a, int b, int c)

x:a;y:b;z:c;

public double arieTotald( )

re

turn

2 * (x *y + x * 2 +y* z) ;

1.

return x*y*z;

Generaliti{i.

Polimorfismul este de doul tipuri:


- polimorfism la compilare (polimorfism parametric)
- polimorfism la execu{ie.
in cazul polimorfismului parametric (in aceeaqi clasi mai multe
metode cu acelagi nume, dar cu num[r diferit de parametrii sau cu
tipuri diferite de parametrii) legarea codului metodei adecvate se face
in faza de compilare (early-binding).
Exemplu
c I as

public double volum( )

Generalitifi.

2. Exemple de polimorfism la execu{ie.

s Exe mpluP

oI

imorfismP arame tric

public static void main(String args[ J)

int a: Inte ger.parse Int (JOptionP ane. showlnputDialo g( " a: "y'


int b :Integer.parse Int (JOptionP ane. show InputDialog( " b : "11'
int c :Inte ger. parse Int (JOptionP ane. show InputDialo g( " c: ")) ;
int mail:maxim(a,b);
System.out.println("maxI : " +maxI) ;
int mec2 :maxim(a,b,c) ;
Sy stem. out.println( " max2 : " + max2) ;

private static int maxim(int a, int b)

(a>b) return a;

else return b;

private static int maxim(int a, int b, int c)

int rez:a;
if (b>rez) rez:b;
f (c>rez) rez:c;
return rez;

Polimorfism

Polimorfism

8l

tipul Punct (clasa de bazd). tn final se vor afiga pentru fiecare punct
din cele N informafiile memorate (pentru fiecare punct se va apela

]
Nofiunea de polimorfism in faza de execu{ie este legat[ in
primul rand de noliunea de mogtenire.
in cazul unei metode prezentdin clasa debazd 9i redefinitd in
clasa derivati (acelagi nume, doud forme: o forml in clasa debazd, o
forml in clasa derivat[) in anumite situafii, numai infaza de execufie
se poate qti care formd de metodl se va apela. Altfel spus, numai la
execufie se poate gti care cod va fi folosit(va fi "legat") de aplicafie.
Codul metodei adecvate va fi "legat" la execufie 9i aceasta se
cheam[ late-binding (legare tfurzie), spre deosebire de legarea codului
din faza de compilare (early-binding).

metoda afiqare0).

Aceasti aplicafie ilustreazd conceptul de polimorfism. Compilatorul


qtie la rulare ce versiune de metodl afigare0 sd apeleze.
import javm.swing.*;
class Punct
I
l

private int x;//coordonata x a punctului


private int y;
public Punct(int x0, int y0)

{
x--x0;

2. Exemple de polimorfism la executie.

Exemplul I
S[ se construiascd clasa Punct ce are ca variabile de instanf[
intregi x $i y - coordonatele unui punct in plan, 9i ca
numere
dou[
metode:
Constructorul ce face inilializdrile;
getX0 ce rctumeazdvaloarea coordonatei x
getYQ ce returneazdvaloarea coordonatei y
afisare0 in care se afrqeazd coordonatele punctului din clasa
Punct
Din clasa Punct se deriveazd dou[ clase: PunctColor 9i Punct3D.
Clasa PunctColor fafi de clasa Punct are in plus o variabil5 de instanfl
in care este memorat[ culoarea punctului, un nou constructor in car6
este inilializatd gi culoareao metoda getCuloare0 ce returneaz[
culoare4 gi redefineqte metoda clasei de bazd, afiqare0, afiqdnd po
l6ng6 coordonatele x qi y qi culoarea.
Clasa Punct3D, ce reprezintl un punct in spafiu, fafi de clasa Punot
are in plus o variabil[ de instan{6 z, un nou constructor in care sunt
inilializate toate cele trei coordonate, metoda getZ0 ce returneazl
valoarea coordonatei z, gi redefineqte metoda clasei de bazF+ afigare0,
afigdnd pe l6ng[ coordonatele x qi y gi coordonata z.
Foiosind aceste trei clase se va dezvolta o aplica{ie in care se vor citl
de la tastaturl N puncte (N- citit anterior), de tipul PunctColor sau
Punct3D. Pentru fiecare punct, in momentul citirii utilizatorul
aplicaliei va specifica dacd va introduce un PunctColor sau un
Punct3D. Cele N puncte se vor memora intr-un vector de obiecte de

!:v0;

public int getXQ

return x;

public int getYQ

{
return

y;

public void afisareQ

intln("x :
ty
Sy s te m. out. pr intln(' :
Sy ste m. out. pr

"
t t

y)'

4r;'

)
)
class PunctColor extends Punct

{
private String culoare ;
public PunctColor(int x, int y, String culoare)

{
super(x,y);
this. culo are

: culoare ;

)
public String getCuloare0

Polimorfism
int i;

return culoare;

for(i:0;i<N;i++){
Str ing s Raspuns

public void afisareQ

{
//System.out.println("x:t'+x);GRESIT!
System. out. println("x: " + getXQ) ;
System.

out.println("y:

System.

out.println(" culoare

"+

int raspuns :Inte ger.parse Int(sRaspuns) ;


int x:Inte ger.parse Int (JOptionP ane. show InputD ialo g(,,x:,,)) ;
int y: Inte ger.par se Int (JOpt ionP ane. s how InputD ialo g(,,y :,,) ;
)

x - este var. privata !

if(raspuns::0){

ge tY 0) ; )

"

:JOptionP ane. show Input Dialog


("Tip punct: (0,1,2) : ,');

* culoare) ;

//citeste un Punct:

p[iJ:new Punct(x,y);]
else if(raspuns::1){

//citeste un PunctColor :
String culo are : JOpt ionP ane. s how InputDialo g(,, culo are :,,) ;
p [iJ :new P unct C olor (x,y, culo are) ;
]

class Punct3D extends Punct

private int z;
public Punct3D(int x,int y, int

else
z

if(raspuns::2){

//citeste un Punct3D:
int z : Inte ger.parse Int (JOptionP ane. show InputDialo g(,, z:,,)) ;
p [iJ :new Punct 3 D (x,y, z) ; ]

super(x,y);

this.z:z;

]//fo,

//Afisare vector:

public int getZ)

for(i:0;i<N;i++)
p[iJ.afisareQ;

{
return z;

)
]

public void afisare0

Syste m. out. pr int ln ("v : " + ge tXQ ) ;


Sy s tem. out. pr intln("y : " + ge tY Q) ;
Sy te m. out.pr intln ( "z : " + z)'
s

]
]

Exemplul2

1.

Sd construiascd clasa Numdr ce are ca variabil[ de instanti un


numdr intreg 4 gi ca metode:
constructorul;
afisare0.

Din clasa Numar, se va deriva clasa DouaNumere, ?n care se va

class AfisarePuncte

public static void main (String args[J)

{
int N;//numarul de puncte

N : Inte ger. pars e Int (J Opt ionP ane. show InputD ialo g(" N :

Punct

"))'
p[J:new Punct[NJ;//vectorul de obiecte Punct (clasa de

//baza)

adduga variabila de instanfd b (ce reprezint[ al doilea numdr), gi se va


modifica constructorul gi metoda afisare0.
Folosind cele doud clase, se va dezvolta o aplicafie in care se
genereazd un num[r aleator 0 sau l. Daci este 0, se va instanfia un
obiect din clasa Numar (prin citire de la tastaturd), dacd este l, se va
instanfia un obiect din clasa Dou[Numere (tot prin citire de la
tastaturl). Pentru obiectul instanliat se va apela metoda afisare0.

Polimorfism

Polimorfism

f(caz::0){

import java.util.*;
import javax.swing.*;

//citeste un numar:

int a: Inte ger.parse Int(JOptionP


n:new Numar(a);
jelse

class Numar

private int a;
public Numar(int x)

ane. show InputDialog('t

a:

"11

{
//citeste doua numere:

a:x;

public void aJisare0

{
Sy stem. out.

println(" a:

]
"

-t a)

class DouaNumere extends Numar

ane.

super(a);

this.b:b;

public void afisare()

//afisare a:
super.afisare);//Cu cuvantul cheie super se apeleaza metoda
//clasei de baza
//afisare b:
Sy stem. out.println(" b : " * b) ;

)
]

"11

Exemplul3
Folosind cele doud clase anterioare, Cerc qi CercExtins create
in capitolul 6, sd se dezvolte o aplica{ie in care se vor citi N cercuri
(de tipul Cerc sau CercExtins), ce se memoreazd intr-un vector.
Citirea unui obiect de tip Cerc sau CercExtins este dat[ de valoarea 0
sau I a unui numdr aleator generat.
import java.util.*;
import javax.swing.*;
class Cerc

private int raza;


public Cerc(int x)

raza:x;

class AJisareNumere

public static void main (Strtng args[J)


Numar n;
Random r:new Random0;
int caz:r.nextlnt(2);

how InputD ialo g(" a: ") )

ane. show InputDialog("b

public void afisareQ

//Afisare:
n. afisareQ;//Numai la executie se stie care versiune de metoda
// afisareQ se va apela

]
]

private int b;
public DouaNumere(int a,int

int a: Inte ger. parse Int (JOpt ionP


int b :Integer.parselnt (JOptionP
n:new DouaNumere (a,b) ;

Sys te m. out. print

ln(' raza:

"+

]
)
class CercExtins extends Cerc

raza)

Polimorfism

private int x;
private int y;
public CercExtins(int r,int x0, int y0

Polimorfism
Int e ge r. p arse Int

(s

j))

)
)

)//for
//Afisare vector:

for(i:0;i<N;i++)

super(r);

c[iJ.afisareQ;

x:x0;

87

!:v0;

public void afisareQ

{
Sy stem. out.

println("

Sy s tem. out.

println("x:

raz

Sys tem. out. println ("y

a:
+ x)'

" * this.

ge t Raz a 0 )

Exemplul4
(Polimorfism la execu{ie, in cazul folosirii interfefelor)
intedace Forma

"

"

+r1,

public double arieTotald(


public double volumO;

);

class AJisareCercuri

class Cub implements Forma

public static void main (String args[J)

final int N:3;//numarul de cercuri


Cerc c[J:new Cerc[NJ;//vectorul de obiecte Cerc (clasa de

private double a;
public double arieTotalaQ

{
return 6*a*a;

//bazo)
Random r--new RandomQ;

int i;

public double volum( )

for(i:0;i<N;i++){

return a*a*a;

int caz:r.nextlnt(2);

if(caz::0){
//citeste un Cerc:
S tri ng s _r az a : J Op t io nP ane. s how lnput D i al o g ( " raz a :
c [i] :new C erc (Inte ger. parselnt (s _raza)) ;

)
")

)else{

class

P aralelipipe

d implements Forma

private double l, w, h;
public double arieTotald( )

//cite ste un CercExins :

String s raza;

a: JOptionP ane. show Input Dialo g(" raz a: ") ;


String s ;r:JOptionP ane. show InputDialo g("x: ") ;
Sning s I :JOpt ionP ane. s how Input D ialo g ("y : ") ;
a),
c I iJ : new C e rc Ex t ins (Int e ge r. p ar s e Int (s
-raz

s _r

az

Int e ge r. p ar s e Int (s _x),

re

turn

2 4' I *w + 2 * l*h+ 2 *w * h ;

public double volum( )

Polimorfism

Exceplii

return l*w*h;

Capitolul9

)
c

Exceplii
las s ExempluP

olimorfi smC ulnterfeye

1. Generalitati.

2. Blocuri try-catch.

public static void main(String args[ J)

Formaf[ ]:{new Cub(L0), new Paralelipiped(I ,2,7)};


for (int i : 0 ; i <f. length ; i+ +)
System. out. println(" Obie ctul din clasa " +f[iJ getClass ( ) +
" are volumltl " +f[iJ.volum(
)) ;
.

]
)

1. Generalitati.
La executarea anumitor metode pot apirea erori, denumite in
Java excep{ii. Mecanismul de tratare a acestor erori in Java, este
diferit de mecanismul de tratare a erorilor in programarea clasic6.
in programarea clasici erorile erau semnalate prin intermediul
unor argumente ale funcfiei sau printr-unrezultat scos de instructiunea

retum.
Exemplu
ln limbajul C:
Scriem o funclie ce retumeaza rezultatul imp6r{irii a doui numere
intregi a gi b.
void tmpdrlire(int a, int b, double& rezultat, int& esteEroore)

f (b::0){

esteEroare:l;

return; ]
esteEroare:0;
re zult at : a/ (doub

I e) b

Ca dezavantaj principal al mecanismului de tratare a erorilor in


programarea clasic6:
se poate uita de tratarea erorilor
dacd nu se uit[, totugi se incarcl antetul funcfiei cu parametrii
suplimentari.
Consecinfa cea mai grav[ o are ins[ uitarea tratirii erorilor
(compilatorul, in limbajele clasice nu ne for{eaz6 sl tratdm erorile).

Exemplu:
double tmpdrlire(int a, int b)

{
return a/(double)b;

// Exemplu

de .folo sire :
rez=lmpdrllre ( I 3, 0) ; //compilatorul nu semnale azd eroarea!

Excep{ii

Astfel, in programarea clasic[, la fiqiere, compilatorul nu ne forteazd


s6 tratdm cazul in care nu existi figierul ce trebuie prelucrat'
in Java, erorile ce apar in execulia unei metode sunt denumite
excepfii. Excepliile sunt obiecte derivate (care moqtenesc) dintr-una
din clasele de bibliotecd:
a) Exception
b) RunTimeException
Excepliile din clasa RunTimeException nu sunt obligatoriu
de tratat. Cele din clasa Exception sunt obligatoriu de tratat'
Tratarea excepfiilor se face in blocuri try...catch'
Atunci cand in executarea metodei apare o situalie anormala
(eroarea), oose arunc[o' un obiect excepfie, de tipul declarat in definirea
metodei. o metod[ in care se genereazd o exceplie qi care "arunc[" o
exceplie, trebuie sI aibd in antetul ei cuvdntul cheie "throws" urmat
de tipul excepfiei.
Exemplu
Metoda parselnt( ) din clasa Integer, poate sd genereze o
excepfie de tipul NumberFormatException (subclasd a lui
RuntimeException), exceplie care nu este obligatoriu de tratat.

Strings:"I23";

int nr:Integer.parselnt(s);//Aici, nu este nici o exceptie'


int nr2 : Inte ger. p arse Int ( " 1 2 AB ") ; //Aic i, e ste except ie'
in acest cati,se arunc[" o excepfie de tip NumberFormatException,
neobligatoriu de tratat. Dacd ea nu a fost tratatA de programator cu
blocul1ry...catch se intrerupe anormal execulia programului'
Avem urm[toarele categorii de excep{ii:
- exceplii aritmetice (nu sunt obligatoriu de tratat)
f . imp[rlirea cu 0
2. radical dintr-un numdr negativ
3. depigirea pentru un anumit tip de date
Exemplu: bYte x;
x:1000; lleroarc de dep6gire
- excepfii de adresare
Exemolu: apelarea unei metode folosind un obiect neinstanfiat, un
obiect null.
Shing s:null;

int L:s.length( ); //eroare la execu{ie


Nu este o eroare obligatoriu de tratat.
excep{ii in cazul vectorilor, indexare in afara granifelor

Excep!ii

Nu este obligatoriu de tratat.


Se aruncd o exceplie de tip ArraylndexOutOfBoundsException.
Exemplu:
int a[ ]:new intf10];

al20l:7; //nu este eroare la compilare. Eroarea apare la execulie.


Se opreqte programul forlat in acest punct, aruncdndu-se o
excepfie de tipul ArraylndexOutofBoundsException.
In general, nu se recomandd,tratarea excepliilor care nu sunt
obligatoriu de tratat pentru a nu incdrca suplimentar codul
programului cu blocuri try...catch.
- excep{ii legate de opera{iile de intrare-ieqire (lucrul cu figiere,
operafiile care se fac in refea, lucrul cubaze de date).
Aceste exceplii sunt exceplii obligatoriu de tratat.
Dacd nu le tratdm (in blocuri try...catch), programul nu se
compileazd.
ln cazul figierelor, cea mai des intAlniti exceplie este exceplia
de tipul lOException, exceplie obligatoriu de tratat.
Exempl_u:

In cazul programdrii ?n C, pentru deschiderea unui fiqier text,


avem urmdtoarele instrucliuni :
FILE* fp:fopen(" tlate.txt ", " rt ") ;
//tr at are ev entual d er oar e :
tf (fp::NULL) {

exit(]); ]
OBS: Aceastd tratare nu este obligatorie.
in Java secvenfa corespunzdtoare este urmdtoarea:
FileReader

trv{

"fr:null;

fr : new Fil e Re ader

( " dat e.

txt ") ;

)catch(IoException e) {
Syste m. out. println(e) ;
Syslem.exit(l

);

in Java este obligatoriu blocul try...catch.

Exceotii

Exemplu
Metoda parselnt( ) din clasa Integer genereazdo
excepfie
care nu este obligatolil d: tratat de
tiputttumi"rF;"t;;;;ption,
atunci cOnd argumentur ei este un string
ce nu poate fi convertit la un
numlr intreg.

2. Blocuri try-catch.
Sintaxa tipicd pentru blocurile try...catch este urmdtoarea:

trv{

int nI :Integer.parselnt(,, I 23,,) //nu este


;
exceptie !
int n 2 : Int e ge r,n a1s e
r t tr i,,1 ; //a i c i e s t e
iii i,
!,,
Exceptia este de tipullryt
" ^i,
NumberF,ormatException,
excep{ie
care nu este obligatoriu de tratat.
Definitia metodei parselnt( in clasa Integer
)
este urmdtorul:
public static int parselnt(String r)-th"o*.

// instrucliuni ce pot genera excep{ii.


)catch(tipExcepfie numeDeVariabila) {
// instrucliuni pentru tratarea excepliei.
)
Exemplu
FileReader

try{
fr

ot

fr:null;

NumberFormatException
{

--

new Fil

e Re

ade r ( " dat e. txt ")

//codul metodei:

//-in caz de imposibilitate de a converti pe


s la intreg:
throw new NumberFormatExceptioni
);

(IOException e) {
Sys tem. out. pr intln (e) ;
System.exit(I);

) catch

)
Dacd in blocul try...catch nu apare nici o excepfie, se exec
tot blocul try, nu se executd nici o instrucliune din blocul catch gi
apoi se continud cu execufia normald a prclgramului (dup6 blocui
try...catch).
Dacd, apare o excepfie, se pdrdseqte execulia blocului try in
locul unde a apdntt exceplia qi se executd blocul catch coresounzdtr
Cazul general de bloc try...catch este urmdtorul:

trv{

// instrucfiuni
)catch(tipExcep{ie e)
catch(tipExcepfie

en)

finally { //instrucfiuni }

)
Desi nu este obligatoriu, se poate trataexcepfia
Num berFormatException, astfel :
StriyS s :JOptionp ane. showlnputDialo g(,,

nr:,,)

try{

int nr : Inte ger.pars e Int (s) ;


. System.out.println(n4,
) catchQ{umberFormat Exception e)
Sy s te m. out. pr int I n (e)
;
System.exit(l),.

lltratare excepfie e1 }

lltratare excepfie en }

instrucfiunile din blocul finally se executd in mod obli


la finalul blocuiui try...catch, indiferent dacd afost sau nu a fost
exceplie. Dacd nu apare nici o excepfie, se executd tot blocul try pi
apoi instrucliunile din blocul finally.
Dacd apare o excepJie, se executd blocul try doar p6n6 in
unde apare excepfia, se executd blocul catch corespunzdtor
"*rr1
apdrute qi apoi se executd blocul finally.

o altd posibilitate de tratare a acestei excepfii, ftr6


a iegi din
program' ciin eaz de excepfie vom
repeta citirea o.'ru turtutura,
"for(;,) {
:Joptionp ane. show InputDialog(,,
nr:,,) .
Itriryg s
boolean stop:true;
try{
int nr : Inte ge r.parselnt (s) ;
Sy s tem. out. pr intln(nr)
;
// afiSare divizori nr:
for(int i : I ; i< :rr; ;* *,
if(nr%i : = 0) System. out.println(i)

Figiere
] c atc hQ{umb e rFormat Except ion e)

Capitolul 10

stop:false;

Fiqiere

f$top::true)
]//for;;

break;

1.

Generalititi.

2. Clase pentru figiere text.


1.

Generalitifi.

Figierele sunt de doul tipuri:

fiqiere text
figiere binare
Diferenfa principald dinhe ele este dati de modul de codificare
a informafiei.
Exemplu:
Fie un fisier text ce contine ca informatie valoarea numerica :
259
Informafia din figierul text este codificatd binar pebaza
codurilor Unicode ale celor 3 caractere: '2', o5' si '9'.
Codul caracterului o2'este 50p:2s*r+*2r:0 01 1.0 0 I 0
Deci, in binar: 00110010 .
Asemanator sunt codate si celelalte doua caractere:
Fie un figier binar de numere intregi, ce con{ine aceeasi
informafie:
259
Informatia va fi reprezentat[ ca num[r intreg pe 4 octefi,
corespulzitor reprezentdriiinbaza 2 a numdrului intreg 259:

259r':2t*rr*rs
Deci in baza2:
00000000 00000000 00000001 0000001 I
O alti diferenfa intre figierele text gi figierele binare este aceea
ca figierele text au inregistrdri (linii) de lungime variabild iar figierele
binare au inregistrdri de lungime fixi. Astfel, intr-un figier binar de
numere intregi, fiecare inregistrare ocupd 4 octefi.
Putem totugi interpreta un figier text ca un figier binar, ce are
ca inreg^istrare de bazd octetul.
In Java, clasele care prelucreaz[ fiqiere se gdsesc in pachetul
java.io.

Figiere

Figiere

in cazultuturor prelucrdrilor de fiqiere, se pot genera excep{ii


care sunt obligatoriu de tratat. Cea mai des intdlnitd excepfie face
parte din clasa IOException, excep{ie obligatoriu de tratat.
in Jav4 clasele ce prelucreazd figiere sunt specializate, atdt
pentru tipurile de figiere (text sau binar), cdt gi pentru operafiile ce se
fac asupra figierelor.
2. Clase pentru fisiere text.

public int read( ) - citegte gi returneazd codul caracterului


pe pozilia curent6.
Determind avansarea in mod automat pe urmdtoareapozilie
gapului de citire.
In caz de sfhrgit de fiqier returneazd -1.
public void close( ) - este folositi pentru a inchide fiqierul.

public static void main(String args[

I se Sys te m. out.

o ut.

println( " Nu

println

e s te

pre

(,, E ste pre ze


ze

nt a,,) ;

nt a, ) ;

r
class F2

{
a

: J Op t i o nP ane. s how Inp


FileReaderfr:null;
St r ing nume F

ut D i al o g ( " nume

boolean este_a:false;

w{

F ile Re ader (nume F)

fisierul caracter cu caracter:

int codd.reado
f (cod:: l) break;
if ((char) cod: :'a') {

este

_a:true ;

break;

_a:

public static void main(String args[ J)


T

//citesc

(e s te

Exemplu: citim de la tastaturi o linie de text. Sd copiem caracterele


din acest text in fiqierul "linie.txt" cdte un caracter pe fiecare linie a
figierului text.
Exemplu: mdr
m

FI

fr : new

ca parametru.

Exemplu: Se citegte de la tastaturd numele unui fiqier text. Sd afigtrm


daci este prezent caracterul a in figier.
class

]
: true)
Sy ste m.

System.exit(1);

b) Clasa FileWriter.
Constructorul
public FileWriter(String numeFisier)
Metode:
public void write(char ch)
Este folositd pentru a scrie in fiqier, pe pozilia curentd, caracterul dat

Constructorul:
public FileReader(String numeFisier)

b)

fr.close( );
] c atch(IOException e) {
System. out.println(e) ;

a) Clasa FileReader.
Este o clasl folositl pentru a citi un figier text caracter cu

a)

97

fi

ie r

: ") ;

Slring text:JOptionP

ane.

showlnputDialo g(,, text:',) ;

FileWriterfw:null;
try{
fw : new F ile Writer ( " l ini e. txt ") ;
for(int i:0; i<text.length(); i++) {
fw.w rite (t e xt. c harAt (i)) ;

fw.write('\n'),. ]
fw.close( );
) c atch(I OExcept ion e) {
Sy s tem. out. print ln (e) ;
System.exit(l); )
)//main
|//class

Figiere

Fiqiere

c) Clasa BufferedReader.
Este folositd pentru a citi un fiqier text linie cu linie.

Sy s te m.

]//main
]//class
Exemplul2
S[ se afigeze care este cel mai lung cuvdnt dintr-un figier text
dat. Se considerf, cd in fiqier nu se afl6 cuvinte despi(ite in silabe, la

Constructorul:
public BufferedReader(FileReader fr)
Metode:
public String readline( )
Returneazd sub formd de String, linia curentd cilir1ddin fiqier. in caz
sfrrgit de figier, returneazi null.

d'
l

Exemplul 1
,1,
Sd se calculeze qi afigeze care este cea mai lungd linie din fiqierul
text "scrisoare.txt".
Algoritmul:
Inilializ[m maximul(lungimea celei mai lungi
din figier) cu 0.
Citim pe rdnd fiecare linie gi compar[m lungimea ei cu maximul.
Dacd este mai mare, schimbdm maximul.
class F3

out.println ( inie Max) ;

cap de rdnd.
import java.io.*;
import java.util.*;
c I as s C e I Mai LungC

uv

ant

public static void main(String args[J)

FileReaderfr:null;
B uffe r e dRe a de r bfr : nul I ;
//initializari:
String cuvantMax:"";
int lungimeMax:0;//initializare

pt.

dimensiunea celui

//cuvant

public static void main(String args[ J)

{
FileReader

fr:null;

r e d Re a de r bfr

nu I I ;
int lMax:0;
String linie Max: " " ; //stringul v id

B uffe

trv{
fr :new F ile Re ader ( " scr is o are. txt ") ;
bfr : new Buffe r e dRe ade r (fr) ;
for(;;) {
String s :bfr. re adline ( ) ;
if (s: : null) break;
int l:s.lengthO;
if (>lMax) { IMax:l;

linieMax:s;

]//frr;;
bfr.close( );
fr.close( );
)

atch(IO Except ion

"for(;;){

Str ing linie

bfr. re adline 0 ;

if(inie : :null)

bre ak; //s-a terminat

fisierul

//Extragem cwintele din aceasta linie:


StringToknnizer tk:new StringTokenizer(inie) ;

int n:tk countTokensQ;

for(int i:0;i<n;i++){
String cuv ant : tk. nextTo kenQ ;
int lungime : cuv ant. lengthQ ;
if(ungime> I ungime Max)
lungimeMax:lungime;
cuvantMax:cuvant;

]
]

e)

println(e) ;
System.exit(l); ]
Syste m. out.

try{
fr:new File Re ader ("referat. txt") ;
bfr : n ew B uffe r e dRe a d e r (fr) ;

]
)

bfr.close0;
fr.close0;
] catch(IoExce ption

e)

mai lung

pr i ntln (e) ;
System.exit(I ) ;]
Sy s te m. o ut.

Sy s te m. o ut. pr int I n (" C e I

f(s [iJ

mai lung

uv ant

es te

"

c r,w

ant Max)

c ompare

To (s fi

: : 0) {

System.out.println('Nu ore toate liniile diferite !,,);


return;)
System.out.println("Are toate liniile diferite !,,) ;

]//main

]//main

Exemplul3
Se citeqte numele unui fiqier text ce confine
se afiqeze dacd toate

liniile sunt diferite intre ele

multe

sau

import jova.io.*;
import jrnm.swing.*;
class LiniiDiferite

public static void main(String args[J)

{
S tring nume

FileReader

: JOp t i onP ane. s how Input D i al o g ( " num e fi s ie r : ") ;

fr:null;

r bfr : null ;
//Vom copia toate liniile dinfisier, intr-unvector de Stringuri:
S t r ing s [J : new S t ring F 0 0 0J ; // dime ns iurrc ac ope r it o are
//initializare pt. numarul de linii dinfisier:
B uffe re dRe ade

N:0;
trv{
int

:
-f, new F ile Re ade r (nume F) ;
bfr : new B uffe re dRe ade r (fr) ;

for(;;){

String I inie :bfr. re adline 0 ;


if(inie : :null) bre ak; //s- a terminat fisierul
//copiem linia invectorul s[]:

s[NJ:linie;
N++;

d) Clasa BufferedWriter.
Se foloseqte pentru a scrie un fiqier text,
Constructorul:
public BufferedWriter(FileWriter frv)
Metode:
a) public write(String s, int indexStart, int L)
Scrie in fisier, pe pozitiacurenta, portiunea din sirul s (dat ca
parametru ), de lungime L caractere, incepand cupozitiaindexStart
din sir.
b) public void newline( )
Scrie un ENTER in fisier ( trece pe linia urmdtoare ).
Exemplul I
se citesc N linii de la tastatura (N - cunoscut). Sa se copieze
aceste linii intr-un fisier text.
import j att ax. sw ing. * ;
import

java.io.*;

cl as s F i sier Scrie P ropo z it i i

public static void main(String argsfl)


f

FileWriter

fw:null;

dWr i t e r bfw : 4711 1 t


:
int N Inte ger. pars e Int (

bfr.close0;

JOptionP

fr.close0;
) carch(IOException e) {
System. out.println(e) ;

System.exit(I);]
//Verificam dacavectorul s[J are toate elementele diferite:
for(int i:0 ; i<N- I ; i+ +)
for(int j=i+l j<Nj++)

B uffe re

try{

ane. show

InputDialo g(,,N:,,)) ;

fw :new F ile Writer ("propozit i i. tut,,)


bfw : new B uffe re dWri t e r fu) ;

for(int i:0;i<N;i++){

String s :JOptionP ane. show InputDialog(,,linie :,,1,


bfw.write(s,0,s.lengthQ);//index start si lungimea ce se scrie
bfw. new L ine Q ; //s ui e ENTE R

t02

Figiere

Figiere

//sortare bubblesort pentru vectorut st[J:


.for (;;)

]
bfw.close0;
fw.close0;
) catch(IOException e) {
System.out.println("Eroare scriere Jisier") ;
System.exit(l);

boolean gata:true;

for (int i:0 ; i<nl-

f (st [iJ. compareTo (st [i+ I D> 0)


{

]//main

String aw:st[iJ;
st[iJ:st[i+1J;

st[i+IJ:aw;

Exemplul2
Se da un fisier text de cuvinte (fiecare cuvant se afla pe o
linie). Sa se construiasca un alt fisier text, ce contine cuvintele din
primul fisier, sortate in ordine alfabetica.
import java.io.*;
clas s Scrie Fis ierSortat

gata:false;

)
)

//copiere vector st[J inJisier:

FileWriterfw:null;
: nul I ;

public static void main(Stringf] args)

{
FileReader

B uffe re dWr i t e r bfw

try

fr:null;

r bfr : null ;
//Copiem toate ctnintele (iniile) intr-un vector de Sninguri:
String s t [] : new String I I 0 0] ; //dimens iune acope rito are
int nL:0;//numarul de linii dinJisier
try
uffere dRe ade

fw :new FileWriter(" cuvinte Sortate. txt,,) ;


bfw : new B uffe re dl4rr it e r fu) ;
for(int i:0 ; i<nl ; i+ +) {
bfw.write (st [iJ, O,st [iJ. lengthQ) ; //index start si lungimea ce se scrie
bfw.newline Q ;// scrie ENTER in fisier

{
: n ew B uffe r e dRe ade r (r) ;
(;;)
"for
String s :bfr.

re

adline

'

if (s::null)break;
else st[nlJ:s;

nlr*i

)
bfr.closeQ;

fr.closeQ;
catch(IOException e) {
System. out.println(e) ;
System.exit(l);]

F ile Re ader (" cuv inte. txt ") ;

bfr

if (gata)break;

fr:new

I ; i+ +)

t03

bfw.closeQ;

fw.closeQ;
]catch(IOException e) {
Sy ste m. out. println (e) ;
System.exit(I);)

Exemplul3
Sd se creeze prin program, un figier text ce are urmdtorul
continut:

00...0

I I ... I

Fiqiere

104

99...9
in fiecare linie din fiqier sunt cate 10 numere

Grafica in Java

Capitolul 11
Grafica inJava

separate prin spa{ii'

import jasta.io.*;
class ScrieFisier

1.

Generalititi.

2. Exemple.

public static void main(String[] args)

final int N:10; //numarul


FileWriter

linii dinfisier

fw:null;

uffi re dWr
try

de

it e r bfw

null ;

:new F ile Write r ("numere. txt ") ;


bfw : new B uffe r e dWr i t e r (w ) ;

in realizarea aplicafiilor grafice sunt implicate, in principal,


pachetele de clase: java.awt si javax.swing.
In general, o aplicafie graficd constl din definirea unei ferestre,
fereastri in care progtamatorul aranjeazd componentele grafice.
Componentele grafice pot avea o reprezentare vizibild sau pot
sd nu aibi o reprezentare vizibild.
Exemple de componente grafice cu reprezentare vizibill:

fw

for(int i:0;i<N;i++){
//Cons truim I ini a curent a :

s:t"''
for(int i:0i<N;i++)
,:s+i*,, ,,i

String

bfw.w rite (s, 0,s. lengthQ ) ;


bfw.new Line Q ; // scrie ENTER in

bfw.close0;
fw.closeQ;
] catch (IOException e) {
Sy stem. out. Println(e) ;
System.exit(l);)

fisier

Butoane: fac parte din clasa JButton


b. Etichete: din clasa Jlabel
Casete de validare : din clasa JCheckBox
d. Butoane radio: clasa JRadioButton
e. Meniuri: clasele JMenuBar, JMenultem.
f. Cdmpuri de editare: clasa JTextField
g. Arie de text : clasa JTextArea
a.

Fiecare clasi are mai multe metode.


Dintre componentele care nu au o reprezentare vizibild ca
exemplu tipic avem componentele de tip container. Astfel, clasa
JPanel este un container intermediar, fdri o reprezentare vizibild.
Rolul lui este de a aduna in acelaqi grup mai multe componente
grafice, care pot fi manevrate ca un ansamblu..
Progamarea graficd" este o programare orientati pe
evenimente . La rcalizarea aplica{iei grafi ce coopereazd programatorul
cu mediul de execufie Java.
Programatorul este cel care definegte pentru aplicalie care sunt
sursele generatoare de evenimente si evenimentele de interes. Astfel, o
sursd de eveniment poate sI fie un buton, component[ de tipul
JButton, gi evenimentul este declangat atunci cdnd utilizatorul face
click cu mouse-ul pe acel buton.

Grafica in Java

Grafica in Java

106

Mai sunt si alte layout-uri posibile pe ldngd Borderlayout.

O componentd grafic[ este desemnatl de programator ca o


sursi de evenimente, prin ataqarea de acea componentd a unui obiect
de ascultare a evenimentului.
Ataqarea obiectului de ascultare a evenimentului se face printro metod[ specifica. In cazul unui buton de tip JButton, ataqarea unui
obiect de ascultare se face prin metoda addActionlistener( )'
Butonul respectiv devine astfel sursd de eveniment.
Nu orice componenta grafica poate fi surs[ de evenimente. Un

obiectdetipu1JLabelnupoates6fiesurs[deeveniment.De

fi

asemenea, nu toate componentele grafice care aupoten{ialul de a


surse de evenimente, sunt desemnate de programator ca fiind surse de

evenimente.
Progtamatorul trebuie s6 defineasca clasa din care se creazd"
obiectul deiscultare (obiect ce se ataqeazd sursei de evenimente).
in aceasti clas[ de ascultare se defineqte metoda de tratare a

De exemplu:

r Flowlayout - in care componentele grafice sunt aranjate in linie,


de la stdnga la dreapta. Obiectele de tip JPanel, au implicit acest
layout.

o Gridlayout - in care componentele grafice sunt aranjate intr-o


matrice, specificatd prin numdrul de linii gi numf,rul de coloane.
Layout-ul implicit al unui container poate fi modificat la un
nou layout, folosind metoda setlayout( ) care are caparametru un
obiect instanfiat din noul layout.
,l

2. Exemple.

Exemplul I
Scriem o aplicatie graficl, pentru calculul maximului dintre doua
numere, ce con{ine urmltoarele componente grafice:

Mediul de execulie Java este cel care detecteazd evenimentele


gi apeleazd in mod automat, la detectarea evenimentului respectiv,
metoda corespunzltoare de ttatate a evenimentului (metodd scrisb de
programator in clasa de ascultare). in plus, mediul de execulie Java
Lste-cel care impune numele metodei de tratare a evenimentului, dar
programatorul este cel care ii dI codul.
Astfel, pentru tratarcaevenimentului, click cu mouse-ul pe un

15

17

butono numele impus de metoda de tratare este actionPerformed( ) .


Fereastra aplicafiei extinde clasa de biblioteca Jf,'rame. De la
aceasta mogteneqte forma( bard de titlu, cele 3 butoane:minimizare,
maximizarc gi inchidere) qi comportamentul de fereastrd (m[rirea,
micgorarea dimensiunilor ferestrei, mutarea ferestrei). Componentele
g.uft.r, in cazul utilizarii ferestrei de tip JFrame (definita in pachetul
jlvax.swing), nu se adaugl direct pe suprafala ferestrei, ci intr-un
Lontainer r*t u, din fereastrd cu ajutorul metodei getContentPane( ).
Din considerente de portabilitate nu se fecomandd pozifionarea
componentelor grafice la coordonate absolute.
Pozi{ionit"u co*ponentelor se face cu ajutorul unor clase
denumite layout manager(clase ce fac gestionarea modului de
pozi{ionare).
Astfel, containerul extras din Jf,'rame are ca qi layout, mod de
aranjare implicit al componentelor, layout-ul de tip Borderlayout.
Componentele pot fi aranjate in 5 direcfii (cele patru puncte

cardinale si centrul ): North, South, East, West, Center'

JTextField

1'l

JButton

import java.owL*;
import j ava. aw t. eve nt.
import javax.swing.*;
class CalculMaxim

puhlic static void main(String ar4sI J)

Grafica in Java

Fereastra

f:new

Fereastra( ) ;

f.setVisible (true);

Grafica in Java

In continuare tn clasa Fereastra definim ca Si clasd interioard,


clasa de ascultare a butoanelor: clasa AscultdButoane. O clasd
interioard a unei alte clase ore acces in mod direct la toate variabilele
de instanld a unei clase private.

*/

class Fereastra extends JFrame

109

// clasa interioard:
class AscultdButoane implement s Actionlistener

priv ate JButton, j b C al cul, j b Exit ;


private JTextField jrfl, jtJ'2, jt/3;
public Fereastra( )

{
pub I ic

this. s etTitle ( " C alcul maxim ")


this. setSize (60 0, 4 00) ;

Jlabel j I 1 :new Jlabel(" nr I :


j tfl : new JText Fie ld (4 0) ;
JPanel jp 1 :new JPanel( ) ;
j p t add(j I I ) ; j pd. add(j tft ) ;
Jlabel j 12 :new Jlabel ( " nr2 :
j t/2 :new JText F i e ld (4 0) ;
JPanel jp2:new JPanel( ) ;
jp2. add(j 12) ; j p2. add( tJ2) ;
Jlabe I j I 3 :new JLabel ( " maxim :
j tJ'3 : new JText F i e I d (4 0) ;
j tJ3. se tEditable (fal s e) ;
JPanel jp3:new JPanel( ) ;
j p 3. add(j t 3) ; j pd. add(j tJ3) ;
AscultdButoane ab :new AscultdButoane ( ) ;
j b C alcul : new JB utt on ( " C al cul ") ;
j bC alcul. addAc t i onlistene r (ab) ;
j b Exit:new JButton( " Exit ") ;
j b Exit. addActi onli ste ne r (ab) ;
JPanel jp4:new JPanel ( ) ;
jp4.add(jbCalcul);
jp4.add(jbExit);
JPanel jp:new JPanel( ) ;
j p. s e t Layout (new Gridlqtout (4, I ) ) ;
Container cFinal :this. getContent P ane ( ) ;
cFinal.add(jp, " South") ;
end
constructor
]//

vo

id act ionP e rforme d (Act ionEv e nt ev)

Obj e ct surs a: ev. get Sourc e ( ) ;


if (sursa: :jbExit) System.exit(0) ;
else if (sursa: :jbCalcul){

String s I :j tfl. getText( ) ;


int nr I : Inte ger. p ars e Int (s I ) ;
int nr 2 : Inte ger. p ars e Int (j t/2. getText ( )) ;

int mm;
f (nrL>nr2) max:nrl;

else max:nr2;
j tJ3. setText (" " +max) ;
j//actionPedormed

Exemplul2
SI se scrie o aplicalie ce confine patru componente grafice:
JTextField pentru afigare gi trei butoane JButton, notate cu "unu",
"doi" gi "trei". Cele trei butoane vor fi aqezate in linie. La apdsarca
unui buton se va afiga in componenta JTextField numele butonului
apdsat.

import java.atvt.*;
import j av a. awt. eve nt. * ;
import javax.swing.*;
class ScrieNumeButon

public static void main(String args[])

{
Fe re as tra

f:

new F ere as tra

f,setTitle ("Te st de butoane") ;

f,setVisible(true);

110

Grafica in Java

Grafica in Java

]
]

System.exit(0);

class Fereastra extends JFrame

]private

{
O bj e c

Q)

)
)

jtf:new JTextFieldQ;
//doar pt. afisare:

j tf. s et E dit able (fal s e) ;


//Construim cele trei butoane:
j b I :new JButton("unu") ;
j b2 :new JButton("doi") ;
jb3 :new JButton("trei") ;
//Le plasez intr-un container intermediar Jpanel:

jp:new JPanelQ;
b 1 ) jp. add(j b 2) jp. add(j b 3) ;
//Atasam fiecarui buton, obiectul de ascultare, pentru o putea
//tratate evenimentele de apasare a acestor butoane:
Clas aButoane Listene r listener:new C las aButoane Listener\ ;
j b 1 addActionlistener (istener) ;
j b 2. addAct ionli s tene r ( istener) ;
j b 3. addAct ionli ste ne r ( is tene r) ;
//adaugam componentele in containerul /inal, ce se extrage
JPanel

jp. add(

//fereasta:
C ontainer cont ainerFinal:this. getContentp ane ;
Q
c o nt a ine r F inal. add (j tf, " C e nte r " ; // dac a I ip s e s t e, nu de s e ne az a
)
//in centru
containerFinal.add(jp,"South");//le aseoza in partea fu jos
//ferestrei

)
/ /clasa interioara:
priv ate class Fere astralistener extends WindowAdapter
vo

id

indow C lo s ing (LYindow Eve nt eu)

t surs

a:

ev. ge t Sourc e Q

:j b I )j tf,s e rText (" unu") ;


else if(surs a: :j b2)jtf,setText ("doi") ;
e I se if(sursa: :j b 3)j tf,setText (" tre i") ;
if(sur s a:

setSize(300,300);

pub I ic

ClasaButoane Listener implements Actionlistener

//Intedata Actionlistener are o singura metoda:


pub lic v o id act ionP edorme d(Ac t ionEv ent ev)

priv ate JTextF ie I d j tf;


private JButton jbl, jb2, jb3;
//constructor
public FereastraQ

addWindow Listener (new Fere astralistener


//construie ste componente :

clas

)
Exemplul3
SI se scrie o aplica{ie in care se afigeazd o fereastrd ce confine
patru componente grcfice: JTextField pentru introducerea unui numdr
intreg, JTextField pentru afigare gi doud componente JButton. Atunci
cdnd este apisat primul buton, se vor afiga toli divizorii numIrului
introdus. Cdnd se apasd cel de-al doilea, se iese din program.
import jova.awt.*;
import j av a. qw t. eve nt. *.
import javac.swing.*;
c I as s Gr afi cAfi s are D iv i z ori

public static void main(String args[J)

{
Fereastra

f:new

Fereastra() ;

f. se tTit le (" C alcul diviz or i ") ;

f,setVisible(true);

class Fereastra extends JFrame

private JTextF ie ld j tJDate, j tJAfi s are ;


private JButton jbCalcul, jbExit;
//constructor
public FereastraQ

Grafica in Java

r12

Grafica in Java

//inner class:
private class clasaButoanelistener implements Actionlistener
f

{
setSize(600,400);
addWindow Li s t e ner (new F e re a s tr aL i s te ne r Q) ;
//c onstruie st e c omponent e :
JLabel jl I :new Jlabel ("Numar:")'
j tJD at e : new JText F ie I d (5) ; //pt. inno duc e re numar
JPanel jp 1 :new JPanelQ ;
j p 1. add(j I 1) ; i p L add(i tJDate) ;

public void actionPedormed(ActionEvent ev)

a: ev. ge t Sourc e Q ;
a: :i b Exit) System. ex it (0) ;
tf(sursq::ibCalcul){
Obj e c t surs

tf(s urs

int nr :Inte ger.parse Int (j t/Date. getText


String rezultat:,,1 , ,, ;//primul divizor
for(int i:2 ; i<:nr/2. i+ +)
if(nr%i: : O)rezultat:rezuhat + i+,,,,, ;
//Utimul divizor este chiar nr:

: new JLabel (" D ivizorii :


j tfAfis are : new JT ext F ie H (a U ;
JLabe I j

I2

(false) ;
:new
JP anel 0 ;
JP anel j p 2

j tfAfisare.

ll3

set Editable

j p2. add (j 12) ; j p2. add(i tfAfi s are) ;

re zul tat

j b C alcul :new JButt on(" C alcul ") ;


j b Exit : new JB utton(" Exit ") ;
JP anel j p 3 :new JP anel 0 ;
j p 3. add(j b C alcul) ; j p 3. add (i b Exit) ;

j ffi

re zultat * ny-y

s are. s

Q)

r. r t .

etText (re zultat)

]//end inner class


)//end class Fereastra
Exemplul4

ClasaButoaneListener bL:new ClasaButoane Listener


j b C al cul. addActionli ste ner (b L) ;
j b Exit. addActi onLi stener @ L) ;
//Containerulfinal:
Container c:this. getContentP ane Q ;
c.add(jp,"South");

//inner class:
priv ate clas s F ere as tr ali s tener exte nds Window Adapter

Sd se scrie o aplicafie ?n care se afiqeazd o fereastri


ce confine
patru componente grafice: JTextField pentru introducerea
elementelor
unui vector de numere intregi (elementele sunt separate prin spa{ii),
JTextField pentru afigarea maximurui din vector gi doui componente
JButton. Atunci cand este apisat primul buton, se va afiga maximul
din vectorul introdus. c6nd se apas[ cel de-al doilea, se iese din
program.
import java.awL*;

import j ov a. aw t. event. * ;
import javax.swing.*;
import java.util.*;

class GraficAfisareMmim

public static void main(String argsfl)

public void w indow Clo sing(Window Event ev)

Fere astra f:new Fere astraQ


.f, s e tTitle (" C al cul max im,,) ;

System.exit(0);

)
]//end inner class

f,setVisible(true);

Grafica in Java

Grafica in Java

]
class Fereastra extends JFrame

//inner class:
private class Fere astralistener extends WindowAdapter

pr

iv ate

JTextF ie I d j tJD ate, j tf4fi s are ;

publ ic

private JButton jbCalcul, jbExit;


//constructor
public Fereastra0

{
pub I ic vo i d actionP erforme d (ActionEv ent ev)

duc e re

numar

JLab e I j I 2 :new JLab el (" Maxim :


j tJA/i s are : new JTe xt F ie I d (5) ;
j tJAfisare. s etEditable (false) ;

indow C lo s ing(lTindow Ev e nt ev)

)//end inner class


//inner class:
private class ClasaButoaneListener implements Actionlistener

addWindow Lis te ner (new Fe re as trali s t ener Q ) ;


//c ons truie s te compone nte :

System.exit(0);

setSize (600,400);

JP ane I jp2 :new JP anel Q ;


p 2. add(j I 2) ; p2. add (j tfAfi s are)

id

{
Jlabel jI 1 :new Jlabel("Vector:"1 .
j t/D at e : new JTe x t F ie I d (4 0) ; //p t. intro
JP anel jp I :new JP anel 0 ;
jp 1 . add( I 1) ; jp I. add(jtJDare) ;

vo

Obj e ct sur s a: ev. get Sourc e Q ;


if(surs a: :j b Exit) Sy ste m. ex it (0)
if(s ur s a -- :j b C a I c ul) {

//preluarea elementelor vectorului, din JTextField:


String s :j tJDate. ge tText Q ;
StringTokenizer tk:new StringTokenizer(s) ;
int N:tk. countTokens Q ; //nr. de elemente din vector
//initializam maximul cuprimul numar :
int mm:Inte ger.parse Int (tk. nextTokenQ),.
//Comparam cu restul numerelor:

j bC al cul :new JB utton(" C alcul ") ;


j b Ex it :new JButt on (" Exit ") ;

for(int i:l;i<N;i++){
int nrCrt: Inte ger.parselnt (tk.nextTokenQ) ;
if(nr C r t> m ax) m ax : nr C r t ;

jp3 :new JP anelQ ;


jp 3. add(j bC atcul) ; jp3. add(j bExit) ;
JP anel

//C o nt ainer int erme diar :


JPanel jp:new JPanelQ;
jp. setLay,out(new Gridlayout(3 , 1)) ;
j p. add( p t ) ; jp. add(jp2) ; j p. add(jp 3) ;

C I as aButo ane L i stene r b L : new Cl as aBut o ane Listener


j b C al cul. addAct ionlistene r (b L) ;
j b Exit. addActionli stener (b L) ;
//Containerul final:
C ontainer c: this. ge tContentP ane 0 ;
c.add(jp,"South");

//Afisare maxim:
j tfAJi s are. s e t Te xt (" " * m ax) ;

)//end inner class


)//end class Fereastra
Q

Exemplul5
Sd se scrie o aplicalie in care se afigeazd o fereastr[ ce con{ine
trei componente grafice: JTextArea pentru introducerea pe mai multe
linii a unor numere intregi (in fiecare linie sunt mai multe numere
separate prin spalii), JTextField pentru afiqare gi JButton pentru

116

Grafica in Java

comanda efectuirii calculelor. Atunci cdnd se apas[ butonul, m


JTextField se va afiga suma tuturor numerelor din JTextArea.
import jova.mttt.*;
import j av a. ow t. ev ent. * ;
import javax.swing.*;
import java.util.*;
class AfisareSuma

public static void main(String args[J)

F ere astra f: new F ere as tra Q ;


f. setTitle (" Sumo numerelor") ;

Ll7

Grafica in Java
ClasaButoane Listener

bl:new

ClasaButoane Listener) ;

j bC alcul. addActionlistener(b L) ;
//Containerul final:
C ont ainer c :this. getC onte ntP ane 0 ;

c.add(jta,"Center");
c.add(jp,"South");

]
//inner class:
private clas s F ere as traLi stene r exte nds llrindow Adapter

{
pub I ic

vo

id

indow C lo s ing(Window Event ev)

f.setVisible(true);

]
]

System.exit(0);

)
]//end inner class
//inner class:
private class ClasaButoane Listener implements Actionlistener

class Fereastra extends JFrame

private JTextAreajta;
priv ate JTextF ie I d j ffi s are ;
priv ate JButto n j b C alcul ;
//constructor
public FereastraQ

{
pub I ic vo id act ionP erforme d (Act ionEve nt ev)

{
String s :j t a. ge tText Q ;
//Extrag numerele :
StringTolcenizer tk:new StringTokenizer(s) ;
int N : tk. countTo lcens 0 ;
int suma:0;

{
setSize(600,400);
addWindow Listener(new FereastralisterrcrQ) ;
jta:new JTextAreaQ;
j tfAfi s are : new JTe xt F ie I d (5) ;

for(int i:0;i<N;i++)

j tJAfis are. setEditable (false) ;


JPanel jp I :new JPanel) ;

suma: suma* Inte ger.p arse Int


//Afisare suma:
j tJAJis are. se tTe xt (" " * suma) ;

(t k.

nextTo lrc n0 ) ;

jpl.add(jtfAfisare);
j b C alcul :new JButton(" C al cul ") ;
JPanel jp2 :new JPanel 0 ;
jp2.add(jbCalcul);

]//end class Fereastra

//C ont ainer interme diar :


JPaneljp:new JPanelQ;
j p. setlayout (new GridLayout
jp. add(ip ; jp. add(jp2) ;

Exemplul6
S[ se scrie o aplica{ie in care se afigeazd o fereastrd ce confine
trei componente grafice: JTextArea pentru introducerea unui text,
JTextField pentru afigare gi JButton pentru comanda efectu[rii

(2, I ))

j
]

]I

ll8

Grafica in Java

ll9

Grafica in Java

calculelor. Atunci cdnd se apasd butonul, in JTextField se va afiga


numarul de caractere 'a' din textul introdus in JTextArea.
import java.m,vt.*;
import j w a. ow t. event. * ;
import jwax.swing.*;
import java.util.*;
class Calcul

//inner class:
priv ate closs F ereastralistener extends WindowAdapter

public static void main(String args[])

{
Fere astra

f:

//Containerulfinal:
Container c :this. getC ontent P ane 0 ;
c.add(jta,"Center");
c.add(jp,"South");

pub

lic

id

indow C lo s ing(Tindow Ev ent ev)

{
new F e re as tra

System.exit(0);

f. setTitle ("Calcul nr. caractere a") ;


f.setVisible(true);

]//end inner class


//inner class:
private class ClasaButoaneListener implements ActionListener

]
]

class Fereastra extends JFrame

publ ic

private JTextArea jta;


pr iv ate JTe x t F ie I d j tfAJi s ar e ;
priv ate JButton j bC alcul ;
//constructor
public Fereastra)

addWindow Liste ner (new FereastraListener 0 ) ;

j ffi

are.

Exemplul

i<

se

s.

lengthQ ; i+ +)

: :' a') contor-t + ;

tText (" " + co ntor)

jpl.add(jtfAfisare);
j bC alcul : new JButton(" C alcul") ;
JPanel jp2:new JP anel) ;
jp2.add(jbCalcul);
//C ontaine r inte rme diar :
JPaneljp:new JPanelQ;
j p. se tlayo ut (new Gridlayout (2, I ) ) ;
ane Listener 0

Si

JP anel 0 ;

jp. add(jp I ) ; jp. add(jp2) ;


C I as aButo ane Li stener b L :new C I as aButo
j bC alcul. addActionlistene r(bl) ;

String s :j ta. ge tText Q ;


int contor:O;

]//end class Fereastra

jta:new JTextAreaQ;
j tfAfi s are : new JTe xt F ie I d (5) ;
j tfA/isare. setE ditable (false) ;

j p 1 :new

id act ionP erforme d(Act ionEv ent ev)

if(s. c harAt (i)

setSize(600,400);

vo

for(int i:0

JP ane

vo

se scrie o aplicalie in care se afigeazd o fereastr[ ce conline


urmltoarele componente grafice: JTextField pentru afiqarea textului:
Afisare cu diferite marimi de fonturi I trei butoane radio
JRadioButton, pentru selec{ia mirimii fontului cu care se scrie textul
din JTextField ( font mic, font mediu, font mare ), gi un buton JButton
pentru iegirea din program. Atunci cdnd este activat primul buton
radio, textul se va afiqa in JTextField folosind font de m[rime 12, cdnd
este activat al doilea buton radio, textul se va afiga cu font de mirime
18, cdnd este activat al treilea, se va folosi font de mdrime 24.
import java.ovrtt.*;
import j av a. avt t. ev e nt. * ;
i mpo

rt,i av ar. sw ing. * ;

120

Grafica in Java

import java.util.*;
I as s

t2t

Grafica in Java

jpRadio.add(radio3);

Grafi c B ut o ane Radio

public static void main(String args[J)

j b Exit : new JButt on(" Exit ") ;


JP ane I j pExit : new JP ane I 0 ;

jpExit.add(jbExit);

Fereastra J:new FereastraQ ;


f. se tTitle (" Buto ane radio ") ;

//C ont aine r int erme di ar :


JPaneljp:new JPanelQ;

f,setVisible(true);

j p. se tlayout (new Gr idlayout (2, I ) ) ;


j p. add(jp Radio) ; j p. add (jp Exit) ;

]
]

class Fereastra extends JFrame

Cl as aB uto ane Lis tener

j b Ex i t. addAc

private JTextF ield j ffisare ;


private JButton jbExit ;
private JRadioButton radio l,radio 2,radio 3 ;

{
j tfAfi s are :

new JTe xt F ie I d

("Afisore cu diferite marimi de fonturi !");


j tf4/i s are. s et E dit able (fal s e) ;
radto I : new JRadioButton('font mic") ;
radio I s e tSe le c te d (true) ;
r adio 2 -- new JRadi o B ut t on (' fo nt me di u ") ;
r adio 2. se tSe le cte d (fal s e) ;
radio 3 : new JRadioButton('font mare ") ;
r adio 3. se t Se le cte d (fal s e) ;
ButtonGroup radioGrup: new ButtonGroup 0 ;
radioGrup. add(radio I ) ;
radioGrup. add(radio 2) ;
r adio Grup. add (radio 3) ;
JPanel jpRadio: new JPanelQ;
//in JPanel nu este permisa adaugarea de ButtonGroup !
jpRadio.add(radioI);
.

.lp Radio. add (radio 2) ;

L:

new

nL i s t e ner (b L)

r (b L)

r adio 2. addAc t io nL

r @ L)

;
;

i s te ne

C I as aB uto ane Liste ner

radio I . addAct ionlistene

r adio 3. addAc t i o nL i s t e ne r (b L)

//constructor
public FereastraQ
setSize(600,400);
addWindow Listener(new FereastraListenerQ)
//cons truie ste componente :

tio

//Containerulfinal:
C ont aine r c :this. getC ontent P ane 0 ;
c. add( tf4fi s are, " C ente r") ;
c.add(jp,"South");
//Scriemtextul injffisare cufont mic (marimea 12):
j tfAfis are. s e t F o nt (new F o nt ( "Mo no Sp ac e d ", F o nt. ITAL IC, I 2) ) ;
jtf4fisare.repaintQ;

)
//inner class:
private clas s FereastraListener extends WindowAdapter

{
pub I ic

vo

id

indow C lo sing (Window Ev ent ev)

{
System.exit(0);

j//end inner class


//inner class:
private clas s C lasaButoane Listener implements Act ionListener

{
pub I ic vo id act ionP e rforme d (Act ionEv ent ev)

Obj e ct sur s a: ev. getSo urc e Q ;


if(surs a: :j b Exit) Sy stem. exit (0)

else{

r22

Grafica in Java

String tip F ont : "Mono Spac e d" ;


int stilFont : Font. ITALIC ;
int marimeFont:12;
if(radio2. isSelecte dQ) marime Font: I 8 ;
e lse if(radio 3. is Selecte dQ) marime Font: 2 4 ;
j tfLfisare. setFont (new Font (tipFont,stilFont,marime Font)) ;
jtf4fisare.repaintQ;

]
j

t23

Grafica in Java
setSize(600,400);

addWindowlistener(new FereastraListenerQ) ;
//cons truie ste c ompone nte :
j tJD ate :new JText F ie I d(4 0) ;
j tfDate. setE dit able (true) ;

tJDate. addKey Listener (new ClasaTaste ListenerQ) ;


JPanel jp 1 =new JPanel) ;

jpl.add(itJDate);

)//end class Fereastra

j tfAJi s are = new JTe xt F i e I d & 0) ;


j tfAJi s are. s e t E d i t ab le (fal s e) ;
JPanel jp2 :new JPanel) ;

Exemplul

jp2.add(jtfAJisare);

Sd se scrie o aplica{ie

in care se afigeazd o fereastrd ce conline

trei componente grafice: JTextField pentru introducerea unui text,


JTextField pentru afigare gi un buton JButton pentru ieqirea din
program. Atunci cdnd se apasd tasta ENTER in primul JTextField,
textul introdus acolo va fi copiat in al doilea JTextField.

j b Exit :new JButton(t' Exit ") ;


JPanel jp3 :new JPanel) ;
jp3.add(jbExit);

import java.mut.*;
import j ov a. aw t. eve nt. * ;

//C ontainer interme diar :


JPaneljp:new JPanelQ;

j p. se tlayout

import javax.swing.*;
c Iass

Gr afi c C op

i e re Te

(new Gridlayout (3, I )) ;

jp. add(j p 1) ; j p. add(j p2)

import java.util.*;

xt

public static void main(String args[J)

{
Fere astra f:new FereastraQ
f,s e tTitle (" C opiere text ") ;

f,setVisible(true);

)
]

; p.

add(j p 3) ;

C lasaButo ane Li s te ne r b L : new C I asaButo


j b Exit. addAc t ionli s tener (b L) ;
//ContainerulJinal:
Container c :this. getC ontentP ane 0 ;
c.add(jp,"South");

ane L iste ner 0

//inner class:
private clas s Fereastralistener extends WindowAdapter

class Fereastra extends JFrame

publ ic

vo

id

indow C lo s ing(lYindow Ev ent ev)

private JTextField jtJDate jtJAfisare ;


private JButton j bExit ;

//constructor
public Fereaslra)

]//end inner class


//inner class:
private class ClasaButoanelistener implements Actionlistener

System.exit(0);

.-rtllil

124

Grafica in Java

pub I ic vo id act ionP erforme d(ActionEve nt ev)

Bibliografie

System.exit(0);

]
]

1. Georgescu

pr

iv ate c I as s C I as aTas t e Li I t e ne

ext e nds KeyAdapt e r

{
publ ic

vo

id key P re s se d(Key Eve nt evt)

// S-a tastat ENTER

if (evt.getKeyCharQ :: '\n) {
j tf.4fi s are. s e tTe xt (j t/Dat e. ge t Text Q) ;

tI

j//end class Fereastra

H., Introducere in universul

Java, Ed. Tehnica,2002

2, Keogh L, Jwa fara mistere, Ed. Rosetti Educational,2006


3. Tanasa S., Olaru C., Andrei S. - Java de la 0 la expert, Ed. Polirom'
2003
4. Ene Al.- Programare orientatd pe obiecte, note de curs,
Universitatea din Piteqti, 2007
5. Ene Al., Stirbu C. 100 de probleme rezolvate in Java,
Ed. Universitatii din Pitesti, 2007

IStsN

e7 B-e7

3-6e0-84s-3