Sunteți pe pagina 1din 188

Modulul1: Introducere in progamare si IT

1.1 Introducere in tehnologia informatiei


In acest curs vom discuta impreuna despre modul in care cream programe (le vom numi si aplicatii
sau aplicatii software) cu Java. Pentru a putea intelege exact ce inseamna unele dintre notiuni precum
programare, limbaj de programare, compilator...etc va trebui sa intelegem modul in care
functioneaza un sistem.
Sistemul reprezinta ansamblul harware si software care stie sa execute prin calcule matematice si
logice algoritmi (seturi de instructiuni care au rolul procesarii unui set de informatii). Exemple de
sisteme sunt: computerul, PDA-ul, telefonul mobil, automatul de cafea ... etc. Un astfel de sistem nu
poate gandi singur (inca nu s-au creat sisteme inteligente desi se depune mult efort in acest sens din
partea cercetatorilor). Acesta are nevoie de instructiuni precise intr-o anumita ordine pentru a putea
executa un anumit proces. Scrierea acestor nstructiuni este rolul programatorului.
Crearea programului in sine reprezinta scrierea instructiunilor gandite dupa un anumit scop pentru a
crea o aplicatie utila si eficienta, atat din punct de vedere al corectitudinii informatiilor cat si prin
rapiditatea executiei instructiunilor.
Computere:
In principal ne vom referi la computere. Computerele sunt cele mai intalnite tipuri de sisteme. In
ansamblu toate sistemele functioneaza pe aceleasi principii de baza. Vom incerca sa intelegem modul
in care functioneaza un computer ca sistem pentru a intelege programarea aplicatiilor pentru un
computer.
Prin cea mai generala clasificare a unui computer acesta se imparte in Software si Hardware.

1.2 Hardware
Partea hardware reprezinta componentele fizice ale unui computer. Acestea se clasifica in:
1. Periferice
2. Unitate centrala

Perifericele reprezinta dispozitivele atasate unitatii centrale prin care se poate introduce informatia in
sistem sau prin care se poate afisa informatia procesata. Prifericele sunt de trei feluri:
1. de intrare (input devices) Ex: mouse-ul, tastatura, touch-pad, microfon ... etc
2. de iesire (output devices) Ex: monitorul, imprimanta, boxe ... etc
3. mixte (mixed devices) Ex: monitor touch

Unitatea centrala contine mai multe componente cu functii diferite: placa de baza, procesorul (CPU),
memoriile...
1

Din punctul de vedere al programatorului cele mai importante componente care trebuiesc intelese cu
functiile lor sunt memoria si procesorul;
Memoria:
Memoria este de trei tipuri: memorie cache (numele provine din limba franceza si inseamna
"ascunsa", totusi pronutia cel mai des intalnita este cea anglofona), memorie interna (denumita si
RAM) si memorie externa (sau auxiliara); Memoria cache este o memorie de tip buffer. Aceasta este
folosita imediat de procesor si stocheaza instructiunile imediat necesare procesorului.
Memoria interna este o memorie RAM (Random Access Memory).Cel mai important aspect al
acestei memorii, este faptul ca este volatila. Acest lucru inseamna ca memoria interna nu este facuta
pentru a stoca informatie pe termen indelungat. Informatia stocata in memoria RAM este necesara
numai proceselor ce se executa in acel moment si este complet stearsa daca se intrerupe alimentarea
acesteia.
Rolul in stoacarea de informatii il are memoria externa. Memoria externa este reprezentata de
dispozitive precum HDD (hard disk drive), floppy, cd-rom, dvd-rom, flash-drive... etc
Procesorul:
CPU (Central Processing Unit), sau procesorul reprezinta creierul computerului. Acesta se ocupa de
interpretarea unor operatii logice si matematice simple. Un procesor cu un singur nucleu (core) nu
poate interpreta decat o instructiune la un moment dat, dar rapiditatea de calul este foarte mare. Un
procesor rapid face calculele la nivel temporal mai mic de o nanosecunda.

1.3 Software
Software-ul nu este fizic vizibil. Acesta se imparte in:
1. Sistem de operare
2. Aplicatii
Sistemul de operare este managerul si intermediarul intre aplicatii (programe folosite de utilizator in
diferite scopuri) si hardware.
La nivel hardware sistemul intelege un limbaj binar (format numai din cifrele 0 si 1) iar la nivel
software informatiile sunt interpretate in decimal si hexadecimal.
Dezvoltarea programelor:
Crearea unui program presupune trei pasi: scrierea programului, compilarea si executia.
Scrierea programului presupune cunoastrea unui limbaj de programare. Exista mai multe limbaje de
programare, unele dintre acestea sunt high-level iar altele sunt low-level. Java, C++, C# sunt
exemple de high-level programming languages. Limbajele de programare au fost inventate pentru a
simplifica munca programatorului. Inainte de inventarea limbajelor de programare toate aplicatiile se
2

scriau in limbaj binar (deci siruri de 1 si 0) numit si limbaj masina. Limbajele de programare recente
sunt facute apropiat de limba engleza astfel incat se poate lucra mult mai usor ca ele. Totusi
computerul nu le intelege, dar pentru aceasta exista compilatorul care transforma limbajul nativ in
limbaj binar. Executia unui program reprezinta utilizarea lui efectiva.

1.4 Java ca limbaj de programare


Java este considerat unul dintre cele mai importante limbaje de programare. Este de asemenea unul
dintre cele mai cunoscute si totodata unul dintre cele mai "la moda" limbaje folosite in ziua de azi.
In primul rand as vrea sa precizez faptul ca java nu are nicio legatura cu javascript. Singura
asemanare intre cele doua limbaje este numele.
Java este un limbaj de programare high-level orientat pe obiecte. Programare orientata pe obiecte
(OOP sau POO) se refera la construirea de entitati numite obiecte care prin interactiunea unul cu
celalalt creaza aplicatia. Despre acest aspect vom discuta in momentul in care vom ajunge la crearea
efectiva a obiectelor. Limbajele de programare mai vechi se bazau numai pe programarea
procedurala. Programarea procedurala reprezinta un set de proceduri (instructiuni) care intr-o
anumita ordine formeaza un algoritm. Programarea procedurala este acum parte a programarii
orientate pe obiecte fiind intalnita asa cum vom vedea mai departe in dezvoltarea comportamentelor
obiectelor.
O caracteristica foarte importanta a acestui limbaj de programare prin care el se diferentiaza de multe
altele este independenta de platforma. Independenta de platforma reprezinta capacitatea acestui
limbaj de programare de a putea fi executat indiferent de sistemul de operare pe care a fost compilat.
Aceasta caracteristica este data de modul in care un program scris in java este executat. Ne intoarcem
la pasii de creare ai unui program cu java. Primul pas era scrierea programului. Programul poate fi
scris cu orice fel de editor de text intr-un fisier cu extensia .java. La compilare va fi creat un fisier cu
extensia .class ;
Fisierul cu extensia .class nu este un executabil similar cu cele ale altor limbaje de programare. Acest
fisier nu este interpreatat de sistemul de operare in mod direct ci de o aplicatie numita masina
virtuala. JVM (java virtual machine) este un emulator virtual ce are rolul de a traduce fisierul class
in limbaj masina. Pentru fiecare sistem de operare a fost creata o astfel de masina virtuala. Asadar
masina virtuala poate fi instalata pe UNIX, Linux, Windows, Solaris .. .etc. Fisierul class este unic
dar poate fi executat indiferent de sistemul de operare in modul acesta datorita JVM.
Java ca limbaj de programare open source:
Mai mult decat atat programele scrise cu Java reprezinta proprietate intelectala a programatorului si
nu este nevoie de o licenta platita la Oracle pentru ca acestea sa poata fi comercializate.

1.5 Instalarea Java


Vom avea nevoie de trei componente importante pentru a putea programa si executa aplicatii Java. In
primul rand, asa cum am discutat si in lectia anterioara oricine vrea sa execute aplicatii Java are
nevoie de o masina virtuala JVM instalata pe calculator. Masina virtuala se instaleaza descarcand si
instaland pachetul JRE (Java Runtime Environment) de pe siteul http://java.sun.com
Pentru a crea aplicatii Java, de pe acelasi site http://java.sun.com va trebui descarcat si instalat
pachetul JDK (Java Developer Kit); In acesta se afla mai multe aplicatii utile programatorului:

compilatorul - javac.exe
executorul - java.exe
vizualizatorul de appleturi - appletviewer.exe
dezvoltatorul de documentatie - javadoc.exe

In imaginile urmatoare puteti urmari modul in care se descaraca JDK si JRE:

Un program Java poate fi scris folosind orice fel de editor de text. Totusi ca sa ne facem viata putin
mai usoara vom folosi un editor de text care ne permite o compilare mai rapida a codului. Acest
editor se numeste BlueJ. Aplicatia este freeware si se poate downlaoda de pe siteul
http://www.bluej.org
Dupa instalarea ultimei versiuni de BlueJ ar trebui sa aveti o interfata similara cu cea din imaginea
de mai jos:

Modulul 2: Variabile constante si structuri de control


2.1 BlueJ si asamblarea primului program
Pentru a incepe dezvoltarea unei aplicatii software trebuie mai intai creat proiectul. Pentru asta se
poate folosi BlueJ, mediul de programare pe care il vom utiliza in acest curs pentru dezvoltare de
aplicatii care sa exemplifice odata instalat JDK, JRE si BlueJ putem incepe scrierea fisierelor cu
extensia .java (adica cele care contin codul nativ al programului)
Crearea unui proiect nou:

In poriectul nou creat suntem pregatiti sa cream primele clase. Java este un limbaj de programare
orientat pe obiecte, prin urmare nu exista niciun program fara cel putin o clasa. Despre clase vom
discuta in urmatorul modul, insa pentru inceput, pentru a crea prima aplicatie va trebui sa cream si o
clasa. Asadar sa urmarim modul in care putem crea o noua clasa folosind mediul de programare
BlueJ:

Dati un nume clasei. Standard numele de clase trebuie sa inceapa cu litera mare si, in cazul in care
este compus din mai multe cuvinte fiecare dintre acestea incepe cu litera mare. De exemplu:
NumeleClasei sau NumeleClaseiMele ...samd. Numele date pentru clase nu trebuie sa contina spatii
sau caractere speciale prcum +,=,&,(,) etc In principal numele clasei trebuie sa fie reprezentativ,
adica sa reprezinte exact ceea ce defineste sau face clasa.

Fisierul cu extensia .java este reprezentat in BlueJ de un dreptunghi de culoare portocalie. Un fisier
cu extensia .java trebuie sa contina cel putin o clasa publica si numai una. Clasa publica da numele
fisierului cu extensia .java, de exemplu, daca veti cauta in sistemul de fisiere al calculatorului pe care
lucrati, in proiectul pe care l-ati creat si salvat mai devreme ar trebui sa existe dupa crearea clasei cu
numele NumeleClasei fisierul NumeleClasei.java. De asemenea foarte important de tinut minte este
8

ca Java este un limbaj de programare case sensitive, asta inseamna ca face diferenta intre litere mari
si litere mici. Pentru Java, NumeleClasei nu este acelasi lucru cu numeleClasei sau cu Numeleclasei.
Cele trei nume sunt diferite si prin urmare vor fi tratate de compilator la elemente diferite ale
programului.
Dupa cum stiti Java are proprietatea de portabilitate. Asta inseamna ca fiecare aplicatie este
interpretata de catre JVM (Java Virtual Machine). Mai intai totusi este necesara compilarea de care
se ocupa javac (compilatorul). Daca in BlueJ dreptunghiul care reprezinta fisierul .java este hasurat
atunci codurile continute nu sunt compilate.

Cu un dublu-click pe dreptunghiul NumeleClasei se deschide editorul in care este de acum posibil


scrierea codului. Implicit BlueJ plaseaza in fisier cateva linii de cod pe care le vom sterge de fiecare
data pentru a incepe scrierea programului de la 0 si pentru a nu fi incurcati de catre acestea.

Putem contiua prin a scrie primele linii de cod.


public static void main(String [] args){} se numeste metoda principala a programlului. Orice
aplicatie isi incepe executia de pe prima linie a metodei principale. Intre acolade vor fi scrise
instructiunile metodei. In exemplul de mai jos este afisat un mesaj in consola folosind instructiunea
System.out.println()

Compilarea se face foarte usor. Click dreapta pe clasa si Compile

Daca nu apare nicio eroare la compilare dreptunghiul care reprezinta fisierul nu mai este hasurat.
Asta inseamna ca se poate face o executie prin trimiterea codului la executor (JVM)

10

Apelam metoda principala:

Consola se deschide si afisaza mesajul "Hello World!"


11

2.2 Date primitive


Orice program lucreaza cu date, iar pentru a lucra cu date acestea trebuiesc stocate. Deoarece
memoria unui sistem in care putem stoca informatie este limitata pentru a plasa o informatie in
memorie este necesar mai intai sa rezervam o zona in memorie in functie de tipul informatiei care va
fi stocata. O informatie poate fi stocata sub forma de numar intreg, numar real, caracter, valoare
booleana (adevarat sau fals) sau instanta. In afara de ultimul tip enumerat mai devreme toate celelalte
informatii reprezinta tipuri de date primitive. In functie de cantitatea de informatie (care depinde atat
de tip cat si de valoarea pe care dorim sa o stocam) se rezerva o zona de memorie mai mare sau mai
mica in memoria interna a sistemului. Mai jos am enumerat tipurile primitive pe care le putem folosi
in programarea cu Java:

short
int
long
float
double
byte
boolean
char

Orice zona de memorie se defineste folosind un tip de data si un nume (sau identificator); Numele se
poate alege dupa urmatoarele reguli:
1. nu poate incepe cu cifra
2. nu poate contine caractere speciale
3. nu poate fi cuvant rezervat (keyword)
Sintaxa pentru rezervarea unei zone de memorie este de forma <tip> <identificator>;

12

Aceste zone de memorie reprezinta parti ale memoriei interne. Memoria interna se imparte in doua
zone: stack si heap. Datele primitive sunt stocate in zone rezervate din stack;
Primitivele int, long, byte, short: reprezinta zone de memorie rezervate pentru stocarea valorilor
numerice intregi. Cel mai des, dintre acestea este folosit tipul int;
Primitivele float si double: reprezinta zone de memorie folosite pentru stocarea valorilor numerice
reale. Diferenta dintre cele doua tipuri de primitive este precizia zecimalelor valorilor stocate. Chiar
daca float si double sunt folosite pentru acelasi tip de date nu putem transporta informatia dintr-un
double intr-un float in mod direct, deoarece este posibila pierderea de precizie a valorii cu care se
face aceasta operatiune. Pentru a pune totusi o valoare stocata intr-o zona de memorie double intr-un
float putem folosi conversia explicita. Acest lucru se poate face in felul urmator:
Primitiva char: poate fi folosita pentru a stoca caractere in format Unicode.
Primitiva boolean: este folosita pentru a stoca una dintre valorile true sau false; Spre deosebire de
alte limbaje de programare nu mai exista posibilitatea de a folosi valorile 1 si 0 pentru adevarat sau
fals. Pentru a reprezenta valorile adevarat sau fals (tip boolean) singura modalitate este folosirea
cuvintelor true si false. true si false se scriu numai cu litere mici si reprezinta cuvinte rezervate in
Java.

2.3 Operatori
Operatorii se clasifica in:
1. operatori matematici: + - * / %
2. operatori logici: && || !
13

3. operatori de comparare <, >, <=, >=, ==, !=


4. operatorul de instantiere: new
5. operatorul de atribuire: =
Alti operatori ii vom folosi pe parcursul lectiilor urmatoare. Sa intelegem operatorii enumerati mai
sus. Unul dintre cei mai importanti operatori este operatorul de atribuire. Cu ajutorul operatorului de
atribuire poate fi pusa o valoare intr-o zona de memorie rezervata. In imaginea de mai jos aveti
exemplificat modul de folosire al operatorului de atribuire.

Operatorul de atribuire este executat de la dreapta la stanga. Asta inseamna ca in cazul in care in
partea dreapta este o expresie, aceasta va fi executata inainte de a face atribuirea. De exemplu in
cazul folosirii operatorilor matematici:

14

Similar folosirii operatorului + poate fi folosit oricare dintre operatorii matematici tinand cont de
functia lor. Ordinea efectuarii operatiilor din matematica se pastreaza si in cazul pogramarii:

+ este folosit pentru adunare


- este folosit pentru scadere
* este folosit entru inmultire
/ este folosit pentru obtinerea catului
% este folosit pentru obtinerea restului

In cazul in care vreau ca o operatie de scadere sa fie efectuata inainte unei operatii de inmultire pot
folosi paranteze similar ca in matematica. Atentie numai la urmatorul aspect: in programare nu exista
pentru operatii decat posibilitatea de a folosi paranteze rotunde. Aveti exemplu in imaginile de mai
jos:

Atributiea de valori variabilelor char:

15

Operatorii de comparare pot fi folositi pentru scrierea expresiilor de tip boolean (care au ca rezulat
true sau false)

ATENTIE! Nu confundati operatorul == (de testare a egalitatii) cu operatorul = (de


comparare). Cei doi nu pot fi inlocuiti unul cu celalalt. In cazul folosirii incorecte rzultatul va fi
o eroare.
Operatori de comparare:
16

== testare a egalitatii
!= testare a inegalitatii
< mai mic
> mai mare
<= mai mic sau egal
>= mai mare sau egal

Operatorii logici

|| sau
&& si
! not

Intr-o expresie in care doua conditii sunt reunite folosind OR (sau) este suficient ca macar una sa fie
adevarata ca intreaga expresie sa devina adevarata.
Intr-o expresie in care doua conditii sunt reunite folosind AND (si) este suficient ca macar una dintre
ele sa fie falsa pentru ca intreaga expresie sa fie falsa.

17

Operatorii de comparare impreuna cu operatorii logici sunt folositi asa cum vom vedea in urmatoarea
lectie in definirea conditiilor structurilor de control.
Un operator foarte important este de asmenea si ; (punct si virgula). Acesta marcheaza intotdeauna
sfarsitul unei instructiuni.
Operatorul supraincarcat +:
Operatorul + este considerat un operator supraincarcat. Acesta poate fi folosit pentru a concatena
(alipi) doua siruri de caractere. Iata cateva exemple:

18

2.4 Structuri de control decizionale


Exista doua structuri de control folosite pentru a lua decizii in dezvoltarea unui program; Acestea
sunt if si switch.
Iata cum functioneaza prima dintre acestea:
if(conditie){
// set de instructiuni care se executa in cazul in care conditia este adevarata
}
else{
//set de instructiuni care se executa daca conditia este falsa
}
Blocul de instructiuni else poate lipsi in intregime daca nu este necesar sa se execute nimic in cazul
in care conditia este falsa.

19

Daca blocul are o singura instructiune atunci acoladele care incadreaza blocul de instructiuni pot
lipsi:

20

Blocul else poate sa lipseasca in intregime:

21

switch testeaza o zona de memorie si in cazul in care aceasta are o anumita valoare se executa un
anumit set de instructiuni;
default este optional si reprezinta setul de instructiuni ce se executa daca valoarea variabilei testate
nu respecta niciunul dintre cazurile precizate;
Dupa fiecare caz trebuie pusa instructiunea break;

22

Putem pune cazul default daca dorim sa se execute instructiuni si in cazul in care valoarea variabilei
nu se gaseste in cazurile precizate. default poate lipsi caz in care pentru orice alta valoare nu se
executa nimic. Default este pus mereu ultimul si nu necesita instructiunea break;

23

2.5 Structuri de control repetitive


In aceasta lectie vor fi prezentate structurile de control while, do-while si for. Structurile repetitive
repeta un set de instructiuni intotdeauna in functie de o conditie de tip boolean data.
while:
while(conditie){
//instructiuni
}
cat timp conditia care obligatoriu trebuie sa fie de tip boolean este adevarata se executa instructiunile
dintre acolade. Daca este o singura instructiune atunci acoladele pot lipsi.

Intotdeauna in cazul unei structuri de control, conditia trebuie la un moment dat sa devina falsa. In
caz contrar aceasta va executa repetarea instructiunilor la infinit si programul se va bloca. In cazul
exemplului de mai sus care afisaza in consola numerele de la 10 la 1 pe linii diferite instructiunea
a=a-1 se asigura de faptul ca valoarea din zona de memorie a va deveni la un moment dat mai mica
decat 1 si deci conditia nu va ma fi adevarata.
Structura do-while functioneaza similar cu while. Diferenta este ca do-while este post-conditionata.
Daca in cazul structurii while se testeaza mai intai conditia iar apoi se executa instructiunile daca
conditia este adevarata, in cazul structurii do-while intai se executa primul set de instructiuni iar apoi
se verifica conditia.

24

Structura for este folosita in general pentru repetari de instructiuni de un numar fix de ori sau pentru
parcurgerea unor intervale de valori.
for are trei parti intre paranteze rotunde (partea de initializare, conditia si partea de control) si un set
de acolade care incadreaza blocul de instructiuni care se repeta.

Iata cum functioneaza structura for din exemplul de mai sus: Intai se executa prima parte i=0, apoi se
testeaza conditia. Daca conditia este adevarata se executa blocul de instructiuni. Se efectueaza a treia
parte i=i+1 apoi se verifica din nou conditia si, daca aceasta este adevarata se executa din nou
25

instructiunile. Acest ciclu se repeta pana cand condtia devine falsa. Operatorul ; (punct si virgula)
este de asemenea folosit, dupa cum se observa si din exemplul de mai sus pentru a separa partile unei
structuri for.

2.6 Zone de memorie: Variabile sau Constante?


De obicei zonele de memorie pe care le folosim sunt variabile. Acest lucru inseamna ca valoarea
acelei zone de memorie se modifica pe parcursul executiei programului. Exista totusi necesitatea
uneori de zone de memorie carora sa nu li se schimbe valoarea pe parcursul executiei programului.
Marcam aceste zone de memorie folosind un cuvant cheie cu valaore de modificator: final;
Daca o zona de memorie la declarare este final atunci aceasta este constanta si odata atribuita o
valoare acestei zone de memoria, valoarea atribuita nu mai poate fi modificata pe parcursul executiei
programului.

2.7 Operatori unari


Exemple de operatori unari:

++ de incrementare
-- de decrementare
+= de adunare la
-= de scadere din
*= inmultire cu
26

/= impartire cu

Pentru operatorii unari avem nevoie de o singura variabila cu care se opereaza. In imaginile de mai
jos aveti exemple de folosire a operatorilor de incrementare si decrementare. Operatorii de
incrementare si decrementare pot si postfixati sau prefixati. In cazul in care sunt prefixati (adica pusi
inaintea variabilei cu care se opereaza) atunci au prioritate in fata altor operatii care se executa, daca
sunt postfixati (pusi dupa variabila cu care se opereaza) atunci operatia de inrementare/decrementare
se face dupa o alta operatie.
Incrementarea este operatia de adunare cu 1 a unei valori.
Decrementarea este operatia de scadere cu 1 a unei valori.

b=5+0, adica ia valoarea 5. Dupa executia instructiunii b=b++ + a++ variabila a va avea valoarea 1 si
varaibila b va avea valoarea 6;

27

In exemplul de mai sus, deoarece operatorii sunt prefixati, inainte se executa incrementarea iar apoi
restul operatiilor, deci, intai b este facut 6, si a devine 1 apoi de face adunarea 6+1=7

Similar functioneaza operatorul -- insa in loc de incrementare se face decrementare.


Operatorii +=, -=, *=, /= se folosesc pentru auto-operare:

28

a+=5 este echivalent cu a=a+5; Similar functioneaza *=, _= sau /=

2.8 Structuri de control imbricate


Notiunea de structuri de control imbricate reprezinta folosirea structurilor de control ca instructiuni
ale unei alte structuri de control. Orice structura de control este o instructiune si poate fi, prin urmare,
pusa intre acoladele unei alte structuri de control. De exemplu:

29

2.10 Erori
Intotdeauna exista posibilitatea de a intalni erori in scrierea programelor. In general datorita
neatentiei puteti intampina urmatoarele tipuri de erori:

de sintaxa
de logica

Erorile de sintaxa sunt erori ce apar ca urmare a scrierii unei sintaxe gresite. Nerespectarea oricarei
reguli de sintaxa duce la o eroare de compilare. Practic la intampinarea oricarei erori de sintaxa
programul nu va compila. Mediul de programare indica linia pe care apare eroarea si rolul
programatorului este de a o corecta.

30

In exemplul de mai sus, datorita faptului ca a fost scris cu litera mica String compilatorul nu intelege
sinaxa si afiseaza o eroare.
Erorile de logica sunt erori ce apar in executie. In cazul erorilor de logica programul este scris
corect si poate fi executat insa rezultatul nu este cel asteptat. Acest lucru se poate intampla cand
algoritmul ales nu a fost gandit corect.

31

Modulul 3: Clase si obiecte


3.1 Clase
In programarea orientata pe obiecte, spre deorebire de programarea procedurala vom defini obiecte,
le vom crea mai apoi (sau instantia) si instantele create vor interactiona pentru a defini programul.
Clasa are unul dintre cele mai importante roluri. O clasa reprezinta o matrita (schita) care defineste
un prototip. Aceasta descrie modul in care vor arata instantele create. Un obiect este definit de o
clasa prin atribute si comportamente. Atributele reprezinta ceea ce cunoaste obiectul, iar
comportamentele ceea ce stie obiectul sa faca.
Definirea unei clase se face cu ajutorul cuvantului cheie class:
class Nume{
}
Standard numele unei clase incepe cu litera capitala. Fiind identificator, numele clasei se scrie si
respecta aceleasi reguli ca in cazul scrierii numelor de variabile.

Inaintea cuvantului cheie class se pot pune modificatori. Despre modificatori vom discuta in acest
curs in lectiile urmatoare.
public class Program{
}
Acoladele (in engleza braces) incadreaza blocul de cod al unei clase. In clasa se pot defini si
initializa zone de memorie, se pot defini metode si chiar putem crea alte clase. Alte instructiuni nu
pot fi facute direct intre acoladele ce incadreaza blocul de cod al unei clase.
O clasa precedata la definitie de modificatorul de acces public trebuie scrisa intr-un fisier care sa
aiba numele acestei clase (va aminesc faptul ca limbajul face diferenta intre litere mari si litere mici)
si extensia .java; Intr-un fisier cu extensia .java nu pot exista mai multe clase definite public. Clase
care nu sunt precedate de acest modificator pot fi puse mai multe in acelas fisier .java; Un fisier cu
extensia .java trebuie sa contina macar o clasa publica;

32

Nu puteau fi definite ambele clase public. Observati in imaginile de mai sus ca numele fisierului este
dat de numele clasei public.

3.2 Obiecte si definirea atributelor


Un obiect este definit de o clasa. Un program orientat pe obiecte se foloseste de instante de obiecte
si interactiuni intre acestea la executie. Clasa defineste modul in care va arata si se va comporta un
obiect; Prin urmare obiectul are doua caracteristici importante: Atributele si Comportamentul (in
engleza attributes and behaviour);

33

Atributele pot fi zone de memorie primitive sau alte instante de obiecte; Acesta este primul mod in
care doua instante de obiecte pot interactiona (De exemplu: obiectul masina are patru instante ale
obiectului roata).
Comportamentul unui obiect este reprezentat de metode numite metode de instanta;
Descrierea unui obiect prin atributele sale:
Standard atributele unui obiect sunt primele scrise in clasa; De exemplu sa presupunem ca vrem sa
programam o minge; Iata cateva atribute care ar putea descrie acest obiect:

String culoare
double greutate
double presiuneInterna

Pentru a defini acest obiect trebuie sa construim clasa Minge care sa contina aceste zone de memorie.

public class Minge{


String culoare;
double greutate;
double presiuneInterna;}

3.3 Comportamente
Metodele reprezinta blocuri de instructiuni care sunt definite si pot fi apelate ulterior de oricate ori
este nevoie. Aceste blocuri de instructiuni sunt identificate printr-un nume si pot primi informatii
pentru executie (numite parametrii sau argumente) avand si posibilitate de a oferi informatii utile la
34

finalizare (informatiile oferite la finalul executiei unei metode se numeste date returnate). Iata cum
se poate defini o metoda:

Se numeste semnatura metodei tipul acesteia impreuna cu numele si parametrii. Modificatorii nu


sunt obligatorii in scrierea unei metode, insa orice metoda trebuie sa aiba macar un tip, un nume si
parantezele parametrilor chiar daca nu primeste niciun parametru. Tipul metodei reprezinta exact
tipul informatiei pe care o returneaza. Daca metoda nu returneaza nicio data atunci tipul acesteia este
void. In exemplul de mai sus aveti definirea unei metode care nu primeste parametri si nu returneaza
nimic.
In exemplul de mai jos, este definita clasa Numere in care metoda afisare() primeste ca parametru o
valoare numerica intreaga si afisaza toate numerele intre 0 si valoarea primita prin parametru.

35

Observati ca la scrierea unei metode parametrii sunt considrati valori cunoscute. Acestea vor fi date
in momentul in care se face apelul metodei. Parametrii scrisi la definirea unei metode se numesc
parametri formali, in timp ce parametrii dati la apel se vor numi parametri efectivi. Metoda de mai
jos primeste doua numere reale prin parametrii si returneaza suma lor.

Instructiunea return este responsabila de returnarea valorii. In cazul acesta valoarea este suma celor
doua numere date prin parametri. Intotdeauna tipul datei returnate trebuie sa corespunda cu tipul
metodei. In exemplul de mai sus este definit corect, deoarece suma a doua numere reale nu poate fi
36

decat un numar tot real. Un aspect imporant este faptul ca o metoda nu poate returna decat o vaoare.
Odata apelata instructiunea return metoda isi incheie activitatea. Chiar daca ar mai exista alte
instructiuni dupa return acestea nu ar fi executate.

3.4 Constructorul si crearea instantelor


Dupa ce am descris obiectul prin atributele si comportamentele sale este timpul sa cream instante ale
acestuia. Instantele reprezinta entitatile care pot interactiona intre ele pentru a da un scop
programului nostru. Daca in interiorul clasei obiectul era descris prin atributele sale, diferenta intre
prototipul definit de clasa si o instanta construita cu ajutorul acestuia este ca atributele nu mai sunt
formale ci devin efective; De exemplu pentru obiectul Pisica:

37

Am sa creez o clasa cu numele Program in care voi defini o instanta de Pisica.

Din sintaxa de mai sus Pisica p1 = new Pisica();


Pisica - tipul zonei de memorie
p1 - numele instantei
= - operatorul de aribuire
new - operatorul de instantiere (folosit pentru crearea instantelor impreuna cu un constructor.
reprezinta de asemenea si un cuvant cheie)
Pisica() - constructor implicit
As fi putut face definirea si in urmatorul fel:

38

Constructorul poate fi considerat o metoda mai speciala. Aceasta nu are tip la definire. Constuctorul
este folosit in primul rand pentru a defini o instanta a clasei in care este scris si de asemenea ca
instructiuni ale constructorului putem scrie linii de cod care sa se execute la creare instantei. De
exemplu am putea da valori atributelor instantei in momentul crearii lor. Constructorul are
intotdeauna acelasi nume cu al clasei in care se afla si poate primi parametri care sunt considetati
pentru instructiuni valori cunoscute. Orice clasa are un constructor denumit constructor implicit, care
nu primeste parametri si nu executa nimic, dar cu ajutorul caruia se pot crea instante ale clasei. Odata
definit un alt constructor in clasa, constuctorul implicit nu mai exista.

39

Constuctorul implicit nu mai exista:

dar poate fi folosit:

Valorile date la creare instantei puse in zona de memorie p1 se numesc valori efecive. La apelul
constructorului se vor executa si instructiunile acestuia care vor face ca numele insantei sa fie "Tom"
si greutatea 3.5; Constructorul se scrie standard dupa definirea atributelor clasei.
40

O instanta poate fi creata si fara a o stoca intr-o zona de memorie:

3.5 Accesul la atribute si apelul comportamentelor


Accesul la atribute se poate face folosind operatorul . (punct); Operatorul . (punct) se numeste si
operator de dereferentiere. Cu ajutorul lui se poate face referirea la un atribut al unei instante sau la
un comportament al unei instante.

41

Apelul comportamentelor:

Un comportament nu poate fi apelat fara existenta unei instante.


Poate fi creata o instanta provizorie pentru a apela un comportament:

42

Un atribut este o valoare individuala a unei instante. Asta inseamna ca doua instante ale clasei Pisica
pot avea sau nu aceeasi culoare. Spunem ca doua instante sunt egale daca valorile atributelor lor sunt
egale.

3.6 Zone de memorie de clasa


Zonele de memorie de clasa se mai numesc si zone de memorie statice, deoarece se creaza folosind
modificaorul static. O zona de memorie de clasa nu reprezinta un atribut. Valoarea acesteia este
comuna in toate instantele definite de clasa. Deoarece valoarea ei este unica, o variabila statica poate
fi dereferentiata direct din clasa.

43

Rezulatul va fi ultima valoare atribuita lui z, deoarece z este acelasi si pentru p1 si pentru p2 si poate
fi accesat prin dereferentiere din clasa.(Rezultat 9)

3.7 Metode de clasa


Pana acum metodele definite reprezentau comportamente ale instantelor definite cu clasa in care
acestea erau create. Exista totusi posibilitatea de a defini metode care nu reprezinta comportamente.
Acestea se numesc metode statice sau de clasa, se creaza folosind modificatorul static si nu pot
folosi decat alte sintaxe tot statice. Cu alte cuvinte o metoda de clasa nu poate accesa atributele clasei
sau comportamentele definite in clasa. Cea mai importanta dintre metodele de clasa este metoda
principala a programului main(). Deoarece metodele statice nu reprezinta comportamente acesta pot
fi dereferentiate, similar variabilelor statice, folosind numele clasei in care se afla.

44

Nu pot fi accesate entitati non-statice:

45

3.8 Domeniul de vizibilitate al variabilelor


O variabila poate fi definita:

global (in interiorul clasei)


local (in interiorul unei metode sau structuri)

Daca variabila este definita direct in interiorul clasei ea este accesibila de catre toate metodele din
clasa. Daca este definita intr-o metoda sau o structura atunci variabila este vizibila numai local, in
structura care o defineste. Daca exista o variabila globala si una locala cu acelasi nume atunci cea
accesata este intotdeauna cea mai locala. Prin urmare exista posibilitatea de a defini variabile cu
acelasi nume doar daca sunt in domenii de vizibilitate diferite.

46

In cazul de mai sus este exemplificat modul de definire global si local al variabilelor. In structura
while, variabila x folosita este cea definita in interiorul structurii. Acea variabila este vizibila numai
in structura while, fiind inaccesibila in afara acesteia.
O variabila definita local nu are valoare implicita. Folosirea acesteia in operatii fara a-i atibui o
valoare duce la aparitia unei erori de sintaxa.
Variabilele definite global (precum atributele) au valori implicite in functie de tipul de data:
Pentru:

int, long, short, byte valoarea implicita este 0


float si double valoare implicita este 0.0
char valoarea implicita este '/u0000'
boolean valoarea implicita este false
orice tip de obiect valoarea implicita este null

3.9 Supraincarcare (overloading)


Supraincarcarea reprezinta posibilitatea de a defini mai multe metode in aceeasi clasa care au acelasi
identificator dar difera prin parametri. Daca doua metode diferite au parametrii diferiti atunci ele pot
avea acelasi nume. Parametrii pot fi diferiti fie prin tipul fie prin numarul fie prin ordinea lor. Mai jos
aveti exemplul de supraincarcare a metodei suma();

47

Compilatorul va sti ce metoda se apeleze in functie de parametrii dati.


Un exemplu gresit de supraincarare este:

Supraincarcarea este un procedeu care se poate aplica si constructorilor. Constructorii oricum sunt
fortati sa aiba acelasi nume cu al clasei. Asadar folosind supraincarcarea in cazul constructorilor
sinugurul lucru care trebuie avut in vedere este definirea folosind parametrii diferiti ca in cazul
metodelor.
48

Clasa de mai sus defineste un constructor si redefineste constructorul implicit. Constructorul implicit
nu mai exista in cazul definirii unui alt constructor asa cum am vazut deja, insa prin supraincarcare
poate fi redefinit si constructorul implicit.

3.10 Tablouri
Un tablou reprezinta o colectie de variabile de acelasi tip. Exista pozibilitatea de a defini o structura
de un numar definit de variabile de un anumit tip. Aceste tipuri de structui de date se numesc tablouri
(in engleza arrays).
Clasificam tablourile dupa numarul lor de dimensiuni:

unidimensionale - vectori
bidimensionale - matrice
pluridimensionale

Tablouri unidimensionale:

49

In exemplul de mai sus este definit un vector (tablou cu o singura dimensiune) cu dimensiunea de
lungime 100 de tipul int si cu identificatorul a. Fiecare element al acestei structuri este identificat
pintr-un index de tip int. Indecsii incep de la valoarea 0 si sunt crescatori, astfel ca ultimul index al
unui tablou va avea intotdeauna valoarea lungimii tabloului minus unu. Cum putem folosi o variabila
a unui vector:

50

Parcurgerea unui vector se poate face folosind o structura repetitva for, deoarece indecsii se gasesc
intotdeauna intr-un interval continuu de numere.

Cum variabila i ia valori intre 0 si 99 aceasta ia pe rand toate valorile indecsilor. Astfel ca fiecare
variabila a tabloului in cazul de mai sus este instantiata cu exact valoare indexului care o reprezinta.
Exemplul de mai sus demonstreaza modul in care se poate folosi o variabila ca valoare dinamica a
indexului.
Tablouri bidimensionale:

pot fi considerate vectori de vectori


au doua dimensiuni cu lungime proprie
fiecare dimensiune este indexata incepand cu valoare 0
intervalul indecsilor este intre 0 si lungimea - 1

51

Deoarece o matrice are doua dimensiuni parcurgerea se poate face folosind doua structuri de control
for imbricate.

Tablouri pluridimensionale:

52

3.11 Instanta this


Instanta this reprezinta intr-o clasa instanta curenta. Practic, folosita intr-un comportament aceasta
este instanta care se comporta (cea al carei comportament este apelat). Folosita intr-un constructor
this reprezinta instanta care este construita. In exemplul de mai jos este exemplificata folosirea
instantei this:

53

In exemplul de mai sus parametrii poarta acelasi nume cu atributele. Deoarece parametrii sunt
variabile locale iar atribuele clasei sunt varibile globale, in functie prin x si y vor fi apelati numai
parametrii. Pentru a putea accesa insa aributele clasei ne putem referi la acestea prin this.x respectiv
this.y; In felul acesta se face dereferentiere din instanta care este construita (this);
In cazul de mai jos, deoarece se face referire la this dintr-un comportament this reprezinta instanta
care isi executa comportamentul. Nu uitati ca this nu poate fi accesat din metode statice sau contexte
statice.

54

3.12 Constructorul this()


this() reprezinta consructorul clasei curente. Pentru a intelege mai bine utilitatea lui this() sa
analizam exemplul de mai jos:

Practic la apelul constructorului fara parametri se va crea o instanta de punct cu x=0 si y=1, deoarece
constructorul fara parametri apeleaza pe cel cu doi parametri care atribuie valorile atributelor clasei.

3.13 Tipul enum


O enumerare reprezinta un tip de data care poate lua numai anumite valori precizate prin sintaxa la
definirea enumerarii. Cel mai comun exemplu pentru o enumerare este prezentat in imaginea de mai
jos:

55

Enumerarea arata in BlueJ:

Odata definita enumerarea Zi exista tipul de data Zi care poate lua valorile: luni, marti, miercuri, joi,
vineri, sambata, duminica

56

Afisarea valorii in consola:

Rezultat: marti

57

Metoda values() si parcurgerea valorilor unei enumerari:

58

In cazul de mai sus, in variabila ziua1 de tip Zi se pune folosind metoda values() fiecare valoare a
enumerarii. In blocul de instructiuni a structurii de control for se poate face ceva mai apoi cu
valoarea preluata in variabila. In cazul exemplului de mai sus aceasta este afisata pe o linie noua in
consola. Astfel sunt afisate pe linii separate fiecare valoare din enumerare.
Folosirea in structura switch:

59

Modulul 4: Mostenire si implementare


4.1 Pachete - managementul claselor
Pachetele reprezinta colectii de clase. Acestea sunt utile in principal pentru managementul numelor.
Doua clase pot fi definite cu acelasi nume daca apartin de pachete diferite. In felul acesta folosirea
pachetelor micsoreaza posibilitatea aparitiei conflictelor de nume prin divizarea zonelor de conflict.
Fiecare pachet reprezinta o zona de conflict (un pachet nu poate contine clase cu acelasi nume).
Pentru a specifica unei clase pachetul din care apartine se foloseste instructiunea package. Aceasta
este folosita intotdeauna pe prima linie a fisierului cu extensia .java. Mai important, pentru acest curs
este insa modul in care pot fi folosite clase din anumite pachete.
Pentru a putea folosi in orice mod o clasa a unui anumit pachet (membri ai clasei) este necesar
importul clasei. Prin import se precizeaza practic care este pachetul din care apartine clasa utilizata in
scrierea codurilor sursa. In urmatorul modul vor fi folosite clase din API-urile platformei SE
(Standard Edition). Instructiunea prin care se efectueaza importul unei clase este:
import <nume_pachet>.<nume_clasa>;
Exemplu: daca pachetul se numeste java.awt si clasa se numeste Graphics, pentru a folosi membri
ai clasei va trebui scris:
import java.awt.Graphics;
Importurile se fac in fisierul .java in care este scrisa clasa, inainte de linia de definire a clasei.

60

In cazul in care vor fi folosite mai multe clase ce apartin unui pachet, se poate preciza importul
tuturor claselor inlocuind numele in sintaxa import cu *. In exemplul de mai jos sunt importate toate
clasele pachetului java.awt;

Este posibil ca un pachet sa contina subpachete. In cazul in care se intampla acest lucru, pentru a
folosi orice clasa din subpachet este necesar importul separat. Sa presupunem ca exista subpachetul
java.awt.event; Daca in clasa sunt importate toate clasele din pachetul java.awt, nu sunt automat
importate si cele din java.awt.event. Pentru a importa clasele din java.awt.event, acest lucru se va
face separat.

61

Toate clasele definite intr-un proiect BlueJ sunt parte a unui singur pachet.

4.2 Accesul la informatie si comportament


Modificatorii de acces reprezinta cuvinte cheie prin intermediul carora se poate preciza cine (ce
pachet/clasa/metoda) are acces la un anumit membru. Exista trei modificatori de acces:

public
protected
private

Acestia se plaseaza la definirea unui membru al unei clase (zona de memorie sau metoda) si
precizeaza cine poate accesa acel membru.
public este modificatorul care permite accesul oricui si oriunde. Daca o zona de memorie sau metoda
este facuta public atunci aceasta poate fi accesata de orice clasa a aplicatiei, din orice pachet.

62

private este modficatorul care restrange accesul la un membru numai in interiorul clasei. Doar clasa
care defineste acea zona de memorie/metoda are accesa la ea.

63

protected este modul in care un membru poate fi accesat numai de clasa care il defineste sau de
clasa care mosteneste clasa ce il defineste. Mostenirea este prezentata in acest modul il lectiile
urmatoare.
In cazul in care nu se precizeaza un modificator de acces, membrul este considerat a fi in modul
default care permite accesul la membrul respectiv similar cu public, dar numai la nivelul pachetului.
In exemplele din imaginile de mai sus sunt prezentati modificatorii numai pentru variabile, in acelasi
mod acestia pot fi folositi si pentru constante sau metode.

64

4.3 Encapsularea (incapsulare)


Din punctul de vedere al securitatii, limbajul de programare Java este proiectat cu un principiu numit
"sandbox" (groapa cu nisip). Programul scris in Java poate fi comparat cu un copil care se joaca in
groapa cu nisip, iar utilizatorul cu parintele. In acest fel, copilul este protejat din punctul de vedere al
parintelui, dar si parintele este protejat, deoarece copilul sta linistit si se joaca.
Encapsularea este procesul de ascundere a informatiilor in clasa pentru care se ofera acces indirect
prin intermediul unor metode numite "iterator methods". Informatiile (atributele) clasei pot fi
ascunse prin intermediul modificatorului e acces private. In felul acesta atributele nu vor mai putea
fi accesate decat de clasa in care sunt definite. Exista doua tipuri de "iterator methods": getters/
accessors si setters/mutators.
Mutatorii sunt metode definite pentru modificarea valorii unui atribut privat. Pentru a putea fi
accesate de catre alte clase, standard iterator methods sunt intotdeauna definite public. Mutatorii sau
setarii sunt de tip void doarece nu returneaza nimic si primesc intotdeauna ca parametru o variabila
de tipul atributului pentru care este creat. Pentru fiecare atribut privat trebuie creat un mutator si un
accesor.
Accesorul este metoda folosita pentru a accesa (prelua) valoarea atributului privat pentru care este
creata. Accesorul este intotdeauna de tipul variabilei a carei valori o returneaza si nu primeste
parametri. Rolul accesorului este de a returna valoarea variabilei privata.
Mai jos este dat un exemplu de encapsulare:

Prin conventie identificatorii mutatorilor incep cu cuvantul set si continua cu numele variabilei pentu
care sunt construiti. Identificatorii accesorilor incep cu cuvantul get si sunt urmati de numele
65

variabilei pentru care sunt definiti pentru toate tiprile de date mai putin boolean. Pentru variabile de
tip boolean idntificatorul accesorului incepe standard cu is.

Procesul de encapsulare se numeste mai numeste si "blackbox".

4.4 Mostenirea (extends)


Mostenirea este un procedeu specific programarii orintate pe obiecte. O clasa care mosteneste o alta
clasa preia atributele si comportamentele neprivate de la aceasta. Mostenirea se face prin folosirea
cuvantului cheie extends. Exemplul de mai jos demonstreaza modul in care o clasa poate prelua
membrii neprivati ai unei alte clase:
Clasa Forma defineste o forma avand ca singur membru variabila nume de tip String, neprivata:

66

Clasa Cerc defineste un tip de Forma. Clasa Cerc mosteneste clasa Forma, preluand membrul
neprivat nume.

In diagrama UML este reprezentata mostenirea printr-o sageata continua.

67

Un membru privat nu poate fi mostenit. Daca modificatorul de vizibilitate al membrului nume din
clasa Forma este facut private, variabila nu va mai fi mostenita:

68

In Java, o clasa nu poate mosteni maxim decat o singura alta clasa, dar poate fi mostenita de oricate
clase.
Clasa mostenita se mai numeste si clasa superioara. Clasa care mosteneste se mai numeste si clasa
copil.

69

4.5 Cuvantul cheie super


In urma studiului mostenirii se poate pune urmatoarea problema. In programul de mai jos clasa care
mosteneste defineste un membru ce are acelasi identficator cu membrul mostenit.

Rezolvarea este cuvantul cheie super. Similar cu this, instanta super este instanta clasei mostenite.
Se poate face referire la membrii clasei mostenite prin instanta super.
70

super este cuvant cheie si nu poate fi folosit ca identifcator.

4.6 Constructorul super()


Asa cum this() poate fi folosit pentru a se face referire la unul dintre constructorii clasei curente,
super() poate fi folosit pentru a face referire la unul dintre constructorii clasei superioare. super() nu
poate fi apelat decat pe prima linie a constructorului clasei copil. Acest lucru este datorat modului in
care se face instantierea pentru o clasa care mosteneste o alta clasa:
1. In momentul in care constructorul clasei copil este apelat acesta cauta pe prima linie a
constructorului apelul pentru constructorul clasei superioare, in cazul in care nu gaseste
apelul se apeleaza automat constructorul implicit, daca acesta nu exista rezultatul este o
eroare la compilare.
2. Este creata instanta super.
3. Este creata instanta this.

71

Fara apelul explicit al lui super() rezultatul este o eroare de compilare deoarece constructorul implicit
nu este definit in clasa Forma.

Dupa apelul implicit sintaxa este corecta.

72

Daca apelul lui super() nu se face pe prima linie,sintaxa este gresita:

73

4.7 Suprascrierea (overriding)


Cand o clasa mosteneste o alta clasa preia toate metodele neprivate. Exista insa posibilitatea de a
redefini comportamentul unei metode (setul de instructiuni), pastrand insa identifiatorul. Rescrierea
comportamentului unei metode mostenite, pastrand insa semnatura metodei se numeste
supraincarcare. Imaginile de mai jos exemplifica supraincarcarea unei metode in Java:

74

In felul acesta, clasa care mosteneste poate sa isi rescrie comportamentele propriilor membri.

75

4.8 Clase abstracte


In general, dupa cum a fost prezentat in acest curs, clasele sunt folosite pentru definirea obiectelor si
crearea instantelor care interactioneaza pentru a forma aplicatia. Exista totusi si clase care nu pot fi
instantiate. Aceste tipuri de clase se numesc clase abstracte si sunt folosite pentru a generaliza
atribute si comportamente. Cu alte cuvinte, o clasa abstracta este creata nu pentru a fi instantiata ci
numai pentru a fi mostenita. Prin modul in care este definita poate cumula atribute sau
comportamente comune mai multor tipuri de obiecte. Prin definirea lor intr-o clasa abstracta, acestea
sunt scrise doar o singura data, urmand ca obiectele care au nevoie de acestea la definire sa le
mosteneasca de la clasa abstracta.
Mai mult decat atat, clasele abstracte pot defini comportamente abstracte. Comportamentele
abstracte sunt acele tipuri e comportamente care nu sunt definite in intregime. Clasa defineste doar
antetele lor (modificatori, tip, identificator si parametri) fara a da insa un set de instructiuni. Orice
clasa neabstracta care mosteneste de la clasa abstracta aceste comportamente trebuie sa suprascrie
comportamentele abstracte. Deoarece o instanta este o entitate neabstracta si prin urmare nu are voie
sa aiba comportamente abstracte. Din acest motiv comportamentele abstracte trebuiesc suprascrise de
catre orice clasa care poate defini instante. O clasa care nu suprascrie comportamente abstracte
mostenite trebuie definita abstract.
Clasele si comportamentele abstracte sunt definite folosind cuvantul cheie abstract.

Daca in acest moment clasa Cerc moteneste clasa Forma dar nu suprascrie metoda arie() care este
abstracta, compilatorul nu va permite asamblarea codului.

76

In imaginea de mai sus clasa Cerc suprascrie metoda arie().


Clasa Forma nu poate defini instante:

77

dar prin ceea ce se numeste polimorfism pot fi adaugate instante ale claselor copii intr-o zona de
memorie a clasei superioare.

De asemenea, trebuie cunoscut fapul ca se pot defini zone de memorie ale unei clase abstracte, dar
clasa nu poate fi instantiata. Imaginea urmatoare prezinta o sintaxa corecta:

78

Procedeul de mostenire abstracta este foarte important si folosit in aplicatii. Acesta presupune o
sintaxa de suprascriere a metodelor abstracte sau modificare a prototipului clasei doar pentru
definirea unei instante:

79

Practic, doar pentru instanta forma de mai sus, aria va fi intotdeauna 5. Procedeul de mostenire
abstracta poate fi folosit si pentru clase neabstracte. Pentru instanta creata pot fi scrise
comportamente noi sau suprascrise comportamente abstracte sau neabstracte.

Imaginea de mai sus prezinta modul in care am adauga un nou comportament instantei.

4.9 Implementarea interfetelor


O interfata este similara unei clase abstracte. Diferenta dintre o clasa abstracta si o interfata este ca
interfata nu contine decat comportamente abstracte sau constante. Metodele intr-o interfata sunt
considerate abstracte, dar pentru definirea lor nu mai este folosit cuvantul cheie abstract. Imaginea
de mai jos prezinta un exemplu de definire a unei interfete. O interfata este creata cu ajutorul
cuvantului cheie interface.

80

Interfata poate fi implementata de o clasa prin folosirea cuvantului cheie implements.


Implementarea este similara cu mostenirea, dar este specifica interfetelor. Implementarea este
multipla in Java, asta inseamna ca o clasa poate implementa oricate interfete.

81

Interfata Acvatic defineste numai comportamente specifice unui animal acvatic. Deoarece rechinul
este un animal acvatic, clasa Rechin va trebui sa implementeze ambele interfete.

Clasa Rechin trebuie sa suprascrie si metodele abstracte mostenite de la intefata Acvatic. Mai jos este
modul in care BlueJ afiseaza diagrama pentru mostenire multipla a interfetelor.

82

Daca clasa Rechin ar fi trebuit in acelasi timp sa si mosteneasca o alta clasa, de exemplu cu numele
Clasa atunci sintaxa ar fi aratat:

O interfata poate crea zone de memorie:

Totusi nu poate defini instante. Exsta si aici un procedeu numit implementare abstracta, similar cu
mostenirea abstracta din cazul claselor abstracte discutate in lectia anterioara. Implementarea
83

abstracta permite suprascrierea metodelor publice ale interfetei si crearea unei instante in felul
acesta:

Polimorfismul este aplicabil si in cazul interfetelor: O zona de memorie dintr-o interfata mostenita
poate contine instate ale clasei ce o mosteneste, daca clasa ce o mosteneste nu este abstracta:

84

Atentie totusi, in cazul polimorfismului, instanta nu va avea decat comportamentele definite in zona
de memorie in care este stocata. De exemplu, pentru cazul de mai sus, rechinul nu va sti decat sa
inoate.
Interfetele sunt importante, deoarece acestea reprezinta modul de separare a dezvoltarii aplicatiei de
design-ul modelului acesteia.

4.10 Mostenirea interfetelor


O interfata poate mosteni una sau mai multe interfete. Mostenirea intre interfete se face ca in cazul
claselor prin folosirea cuvantului cheie extends. In acest caz insa, mostenirea se poate face multiplu.

85

Clasa care va implementa interfata Vampir va trebui sa suprascrie metodele din interfata, inclusiv
cele mostenite pentru a ramane neabstracta.

86

4.11 Clase finale


O clasa care este finala nu poate fi mostenita. Clasele finale sunt create prin folosirea modificatorului
final. O clasa nu poate fi niciodata si final si abstract in acelasi timp.

Clasa nu poate fi mostenita si nu poate fi abstracta. Urmatoarele doua imagini prezinta sintaxe
gresite:

87

88

Modulul 5: Clase fundamentale ale limbajului


5.1 Pachete fundamentale si folosirea manualului
Java este un limbaj de programare open source. Oricine are acces la API-uri si le poate folosi pentru
a dezvolta propriile aplicatii. API-urie platformei SE pot fi urmarite folosind manualul de API-uri
pus la dispozitie de site-ul Oracle: http://download.oracle.com/javase/7/docs/api. Urmatoarele
pachete contin cele mai des folosite clase:

java.lang - pachetul fundamental al limbajului. Clasele acestui pachet nu trebuiesc importate


pentru a fi folosite.
java.util - pachetul de utilitare
java.io - pachetul folosit pentru scrieri si citiri

Structura manualului de API-uri:

in partea stanga sus este lista pachetelor


in partea stanga jos este lista claselor din pachetul ales
in partea centrala este descrierea clasei alese

In descrierea unei clase alese pot fi identificate sintaxe ale constructorilor care pot fi folositi,
metodelor statice sau non-statice si constantelor sau campurilor neprivate.

89

In imaginea de mai sus se poate observa ca Math nu are definiti constructori. Spre deosebire de
exemplu de clasa String:

90

Unii constructori sau unele metode sunt catalogate ca deprecated. Acestea pot fi folosite dar nu se
recomanda folosirea lor.
Folosind manualul de API-uri se poate vedea cum functioneaza orice constructor sau metoda, daca o
metoda este sau nu statica, ce tip de data returneaza, ce si cati parametri primeste... etc.
Din cele trei pachete enumerate mai sus vor fi discutate clasele:
java.lang

clase wrapper
String
StringBuffer
System
Math

java.util

Scanner
Random
Date
TimeZone
GregorianCalendar

java.io

File
InputStreamReader
BufferedReader
91

PrinStream
FileInputStream
FileOutputStream
ObjectInputStream
ObjectOutputStream

5.2 Clase Wrapper


Clasele wrapper sunt clase care trateaza tipurile primitve ca obiecte. Exista opt clase wrapper definite
in pachetul java.lang:
1.
2.
3.
4.
5.
6.
7.
8.

Byte - trateaza primitiva byte ca obiect


Short - trateaza primitiva short ca obiect
Integer - trateaza primitiva int ca obiect
Long - trateaza primitiva long ca obiect
Character - trateaza primitiva char ca obiect
Float - trateaza primitiva float ca obiect
Double - trateaza primitva double ca obiect
Boolean - trateaza primitiva boolean ca obiect

Atributul primitiv definit in aceste clase este definit final. Tratand primitivele ca obiecte, clasele
wrapper definesc comportamente cu care se poate lucra pe valorile date.
De exemplu, o modalitate usoara de a transforma o valoare numerica stocata intr-o variabila de tip
String intr-o zona de memorie de tip int este folosirea metodei statice parseInt() din clasa Integer.

92

Similar, poate fi folosita de exemplu metoda cu numele parseDouble() definita static in clasa Double:

Metoda isDigit(char ch) verifica daca un caracter dat ca parametru este cifra:

Raspuns: Este cifra!:

93

5.3 java.lang.String
Clasa String trateaza ca obiect un vector de caractere. Intr-o zona de memorie de tip String poate fi
stocat un sir de caractere. Exista doua modalitati de a stoca un sir de caractere intr-o zona de
memorie de tip String. Prin folosirea unui constructor sau prin aribuire directa folosind operatorul =

Este o diferenta intre atribuire directa si folosirea operatorului new. In cazul folosirii operatorului
new, daca sirul de caracterea a mai fost anterior adaugat se creaza doar o referinta. Astfel, in
exemplul de mai sus sunt doar trei zone de memorie alocate pentru cele patru siruri.
Instantele String nu sunt folosite pentru prelucrarea sirurilor de caractere ci pentru valori fixe,
nemodificabile. Pentru valori ce urmeaza a fi prelucrate sau modificate este folosita clasa
StringBuffer.

94

5.4 java.lang.Math si java.util.Random


Clasa Math este clasa ce defineste metode ce efectueaza operatiile matematice elementare. Este
important faptul ca in clasa Math toate metodele sunt statice. Din acest motiv nu a fost definit un
constructor si nu este necesara crearea unei instante de Math. Cateva din metodele importante ale
clasei sunt:

abs(x) - modul de
cbrt(x) - radacina cubica
sqrt(x) - radacina patrata
exp(x) - functie exponentiala
floor(x) - aproximare in minus
hypot(x,y) - calculeaza ipotenuza avand data valorile catetelor
log(x) - logaritm natural
log10(x) - logaritm decimal
pow(x,y) - x la puterea y
random() - returneaza un numar aleator de tip real in intervalul [0,1]
sin(x) - sinus de x
sinh(x) - sinus hiperbolic de x
tan(x) - sangenta de x

De asemenea in clasa Math sunt definite constantele:

E - numarul lui Euler


PI - numarul PI (3.1416...)

95

Metoda random() este singura care nu primeste parametri. Poate fi folosita pentru obtinerea unei
valori aleatoare in intervalul [0,1]:

96

In general pentru obtinerea valorilor aleatoare nu este folosita metoda random() din clasa Math ci
clasa Random din pachetul java.util:

97

Odata creata o instanta de Random pot fi folosite comportamentele acesteia pentru a genera valori
aleatoare de diferite tipuri:

nextInt() - valoare de tip int


nextInt(int x) - valoare de tip int intre 0 si x-1
nextBoolean() - valoarea de tip boolean
nextDouble() - valoarea double in intervalul [0,1]

5.5 java.lang.System
Clasa System este clasa finala definita in pachetul java.lang ce reprezinta sistemul. Toate metodele
clasei sunt statice prin urmare nu este necesara crearea unei instante de System pentru a executa
vreun comportament al clasei. Cele mai importante metode sunt:

arraycopy(Object src,int srcpos,Object dest, int destpos) - folosita pentru copierea matricelor.
Matricele copiate trebuie sa fie identice in dimensiuni pentru a nu se genera o exceptie la
executie
currentTimeMillis() - returneaza timpul curent in milisecunde
exit(int status) - comanda inchiderea instantei curente a masinii virtuale si trimite un status de
eroare. Daca statusul este 0 se considera standard inchidere fara erori
gc() - Apeleaza GarbageCollector. Acesta distruge referintele facute null anterior

Clasa defineste si instantele de fluxuri care pot fi folosite petru a apela consola sistemului sau logul
de erori:

in - InputStream - consola de intrare


98

out - PrintStream - consola de iesire


err - PrintStream - logul de erori al SO

Exemplu de folosire al metodei statice gc() :

Ce inseamna System.out.println() sau System.out.print():


Este apelul comportamentului println() respectiv print() al instantei de OutputStream cu
identificatorul in definita static in clasa System.

5.6 java.util.Scanner
Clasa Scanner definita in pachetul java.util poate fi folosita pentru crearea unui flux de citire. La
crearea unei instante este trimis ca parametru instanta de flux de intrare sau fisierul din care urmeaza
sa se faca citirea. Prin folosirea comportamentelor instantei pot fi citite diferite tipuri de date. In
exemplul de mai jos este citit un sir de caractere care urmeaza sa fie afisat o linie mai jos:

99

Dupa executia aplicatiei poate fi pornit terminalul prin apasarea combinatiei de taste Ctrl-T

Tot folosind clasa Scanner, pot fi citite din consola si valori numerice. Aplicatia din exemplul de mai
jos asteapta introducerea pe linii separate a doua numere carora le afisaza suma:

100

5.7 Exceptii
Exceptiile reprezinta erori ce apar in timpul executiei programului, datorita unor conflicte ce nu pot
fi interpretate de masina virtuala. De exemplu este posibil ca datorita modului in care este construita
aplicatia cat si a modului in care este folosita in mediul de executie sa se intample ca anumiti
parametri sa fie trimisi incorect catre o metoda sau un constructor, un anumit fisier catre care sa se
incerce accesul sa nu fi accesibil, sau pur si simplu sa se incerce efectuarea unui calcul neinteles de
101

sistem (o impartire la 0). Toate acestea reprezinta exceptii, erori ce duc la blocarea aplicatiei in cazul
in care sistemul nu stie cum sa se comporte cand sunt intalnite. Modul in care programul este instruit
ce trebuie sa faca in cazul in care este intalnit un anumit tip de exceptie se numeste tratarea
exceptiilor.
Exista doua moduri generale de tratare a exceptiilor:

folosirea blocurilor try-catch-finally


aruncarea exceptiilor de catre metoda cu throws

Prin folosirea primei metode try-catch-finally pot fi date programului instructiuni exacte despre
tratarea oricarui tip de exceptie ce poate sa apara. In blocul de instructiuni try sunt puse instructiunile
ce pot arunca exceptii. Pentru blocul try trebuie scris cel putin un bloc de instructiuni catch sau
finally. Blocul de instructiuni catch primeste ca parametru un tip de exceptie si instructiunile care
trebuiesc executate in cazul acelui tip de exceptie. Blocul finally este scris pentru a se executa fie ca
a fost sau nu a fost aruncata o exceptie.
Exceptiile sunt definite de clase. Toate clasele care definesc un tip de exceptie mostenesc clasa
Exception din pachetul java.lang, din acest motiv clasa Exception poate fi folosita pentru a specifica
toate tipurile de exceptii. Exemple de clase care reprezinta exceptii sunt:

NumberFormatException
IOException
ArrayOutOfBoundsException
SQLException
NoSuchClassException
NoSuchAlgorithmException

In exemplul de mai jos este folosit blocul catch pentru a trata o exceptie aruncata in try;

102

finally nu poate fi folosit pentru tratarea exceptiei. Acesta se va executa chiar daca nu se arunca o
exceptie:

Chiar daca conversia a fost efectuata, si de aceasta data este afisat mesajul:

103

Clasa Exception poate fi folosita pentru a generaliza orice tip de exceptie:

Nu se poate trata o exceptie care nu este aruncata in try:

104

Pot fi folosite mai multe blocuri catch pentru a trata mai multe tipuri de exceptii separat; De exemplu
in cazul de mai jos este tratata exceptia de tip NumberFormatException aruncata de apelul metodei
parseInt() dar si NullPointerException aruncata de incercarea de folosire a unui comportament pe o
zona de memorie null;

Nu pot fi definite mai multe blocuri catch care trateaza aceeasi exceptie. Acest lucru se aplica si in
cazul in care unul dintre blocuri tratraza toate exceptiile folosind clasa Exception:
105

Oricand poate fi folosit si finally:

Exceptiile pot fi tratate de catre o metoda si prin folosirea cuvantului cheie throws. Acesta se scrie
dupa parantezele parametrilor si este urmat de clasele exceptiilor care trebuiesc tratate, separate prin
virgula. Nici in acest caz nu este permisa tratarea de mai multe ori a aceleiasi exceptii.

106

Pentru tratarea oricarui tip de exceptie poate fi folosita clasa Exception:

107

5.8 Citire si scriere in fisier


Pachetul java.io contine clasele necesare pentru creare fluxurilor de citire si scriere. Fluxurile de
citire se numesc si fluxuri de intrare iar fluxurile de scriere se numesc si fluxuri de iesire. Clasele
considerate fundamentale ale pachetului java.io sunt:

File
FileInputStream
FileOutputStream
InputStreamReader
OutputStreamWriter
DataInputStream
DataOutputStream
BufferedReader
BufferedWriter
PrintStream
PrintWriter

Clasa File poate fi folosita pentru a face referire la un fisier din sistem. La construirea instantei File
poate fi dat ca parametru pentru referire locatia fisierului relativ la fisierul cu extensia .class. Pe baza
instantei File poate fi creat un flux de intrare de tip FileInputStream. Folosind instanta de
FileInputStream poate fi creat un InputStreamReader si apoi un BufferedReader. BufferedReader
defineste comportamente care pot fi folosite pentru citirea din fisier. In exemplul de mai jos, dintr-un
fisier sunt citite toate liniile si afisate in consola.

Scrierea in fisier se poate face folosind clasa PrintStream:

108

Metoda close() este folosita pentru inchiderea fluxului. Aceasta poate fi folosita pentru fluxuri de
intrare sau de iesire.

5.9 Serializare
Fluxurile de date pot fi clasificate in:

low-level (trimiterea informatiilor se face octet cu octet)


high-level (timiterea informatiilor se face in tipuri de date)

Serializarea este procesul de impartire a unei instante de obiect in octeti pentru trimiterea acesteia
printr-un flux. Pentru a putea salva de exemplu un fisier instanta unui obiect aceasta trebuie sa fie
seriala. Pentru a fi seriala clasa care o defineste trebuie sa implementeze interfata Serializable din
pachetul java.io, dar si clasele care definesc instante ce reprezinta atribute ale acestei clase trebuie de
asemenea sa implementeze aceasta interfata. In exemplul de mai jos este definita clasa Pisica si se
incearca din metoda principala salvarea unei instante de Pisica si citirea acesteia mai apoi dintr-un
fisier cu numele pisica.dat.

109

Fluxrile pentru citirea si scrierea instantelor de obiecte seriale se numsc ObjectInputStream pentru
intrare, respectiv ObjectOutputStream pentru iesire. Acestea primesc ca parametru o instanta de flux
low-level, de exemplu pentru scriere in fisier FileInputStream respectiv FileOutputStream;
Comportamentele folosite pentru citire si scriere sunt:

readObject() - returneaza o instanta a clasei Object care poate fi convertita explicit


writeObject() - primeste ca parametru instanta seriala si o trimite prin flux

110

Rezultatul: p2 este la fel ca p1:

Pentru a specifica faptul ca un atribut nu trebuie salvat se poate folosi modificatorul transient:

Se observa ca valoarea varstei nu a mai fot salvata. Instanta p2 are acum valoare implicita pentru
tipul int;

111

5.10 Data si ora


Informatii privitoare la data si ora pot fi obtinute folosind membri ai urmatoarelor clase din pachetul
java.util:

TimeZone
SimpleTimeZone
Calendar
GregorianCalendar
Date

De exemplu afisarea informatiilor despre ora locala in Bucuresti se poate face conform exemplului
de mai jos:

112

Pot fi afisate toate informatiile privitoare la timp folosind similar oricare dintre constantele din
interfata Calendar:

ERA
YEAR
MONTH
WEEK_OF_YEAR
113

WEEK_OF_MONTH
DATE
DAY_OF_MONTH
DAY_OF_YEAR
DAY_OF_WEEK
DAY_OF_WEEK_IN_MONTH
AM_PM
HOUR
HOUR_OF_DAY
MINUTE
SECOND
MILLISECOND
ZONE_OFFSET
DST_OFFSET

114

Recapitulare - exercitii
o

2.
3.

4.
5.
6.
o

Un Student este caracterizat de numarul de inmatriculare (format din 5 cifre maxim)


si de o medie obtinuta. Orice Student este o Persoana. Persoana este caracterizata de
atributele: nume si cnp; O Grupa contine Studenti. Clasa Persoana este abstracta;
Creati clasele Persoana, Student si Grupa dupa atributele specificate;
Grupa contine metode care:
1. aranjeaza studentii in ordine alfabetica dupa nume
2. aranjaza studentii in ordine descresctoare dupa medii
3. Adauga un student la grupa
4. Scoate un student din grupa
Encapsulati cele trei clase;
Creati o clasa container cu numele Main care sa contina metoda principala si in care
sa creati o grupa dintr-un vector de Persoane;
Verificati in Main comportamentele clasei Grupa;
Clasa Curs este o clasa abstracta; Exista doua tipuri de cursuri: Java si Linux; Fiecare
curs este descris de un numar intreg reprezentand gradul de dificultate intre 1 si 10;
Un alt atribut al cursului este o instanta de instructor; Clasa Instructor are ca atribute:
nume, prenume si cnp; Toate atributele clasei Instructor trebuiesc programate in asa
fel incat sa nu poata fi accesibile direct decat din clasa Instructor sau din clasele care o
mostenesc pe aceasta;

8. Creati clasele Curs, Java, Linux, Instructor;


9. Creati comportamente in clasa Curs care sa modifice atributele existente;
10. Creati cel putin 3 constructori in clasa Instructor; Cum se numeste aceasta proprietate
care permite definirea mai multor metode cu acelasi nume?
11. Este Java un tip de Linux? Dar Linux un tip de Curs? Ce reprezinta aceasta
proprietate?
o Clasa Element defineste un element chimic; Aceasta contine atributele p,e,n
reprezentand numarul de protoni, electroni si neutroni ai elementului; Aceste trei
atribute sunt ascunse in clasa; Clasa Substanta contine mai multe instante de Elemente
ca atribute;
13. Creati clasele Element si Substanta
14. Creati comportamente ale clasei substanta care:
1. Sa adauge un element la substanta
2. Sa scoata un element din substanta
15. Ce metoda se suprascrie intr-o clasa pentru a afisa proprietati ale unei instante sub
forma de sir de caractere? Daca aceasta metoda este suprascrisa atunci unde este ea
dj definita?
o Clasa Punct defineste un punct in plan dupa coordonatele x si y; Consideram o Forta
descrisa printr-un vector; O instanta de Forta este definita de atributele nume, punct
de aplicare si norma;
Creati clasele Punct si Forta
Creati o metoda de clasa care calculeaza suma algebrica intre doua forte;
Prin ce se deosebeste o metoda de clasa de un comportament?

115

Modulul 7: Aplicatii applet si interfetegrafice cu java.awt


7.1 Ce este o interfata grafica?
Cu siguranta stiti deja ce este o interfata grafica. Pe numele ei GUI (Graphical User Interface),
interfata grafica reprezinta un mod elegant de interactiune a unui sistem cu utilizatorul. Pana acum
toate aplicatiile software create de noi afisau mesaje sau primeau informatie din consola. Consola
reprezinta primul mod dezvoltat vreodata prin care un program afisa sau primea informatii de la
utilizator. Dupa cum deja ati vazut, in consola nu se lucreaza decat cu siruri de caractere, ele
reprezentant atat datele de intrare (care trebuiesc procesate de program) cat si datele de iesire
(rezultatul executiei aplicatiei);
Consola este inca folosita si va ramane in continuare de o utilitate importanta pentru anumite tipuri
de aplicatii. De exemplu aplicatiile de tip server in general preiau informatie si o afisaza intr-o
consola. Acest lucru se intampl deoarece acest mod de lucru permite pastrarea neocupata si utilizarea
de cat mai putina memorie interna (RAM); Serverul, care este o aplicatie ce ofera servicii printr-un
proces daemon (ce ruleaza constant pe o masina asteptand conexiuni de la clienti) nu are nevoie in
principal de afisari de informatie pe computerul care ruleaza. Singurele modificari care pot fi facute
poate reprezinta configurarile si afisarea permanenta a statusului de executie; Pentru acest lucru nu
este nevoie de mai mult decat consola;
Totusi, pentru un utilizator neexperimentat (care nu lucreaza in domeniul IT), consola poate parea
greoaie la utilizare. De aceea intergata grafica este apreciata de majoritatea utilizatorilor de
computere, devenind in unele cazuri chiar obiect comercial care determina numarul de clienti
(utilizatori); De exemplu in cazul Microsoft Windows, accentul s-a pus din ce in ce mai mult pe
dezvoltarea unei interfete grafice aspectuase in detrimentul vitezei de executie sau al resurselor
folosite (memorie, procesor ... etc);
Interfata grafica este formata din imagini, text si componente care interactioneaza cu utilizatorul prin
evenimente; Componentele reprezinta entitati care interactioneaza cu utilizatorul: butoane, meniuri,
scrollbars, ferestre, panouri ..etc. Orice aplicatie care este destinata folosirii de catre persoane fara
experienta in domeniu IT, dar care sa poata invata usor modul de utilizare al unei aplicatii trebuie sa
aiba ca mod de interactiune o interfata grafica.

7.2 Componente si modul de functionare


Componentele reprezinta entitatile prin care utilizatorul interactioneaza cu aplicatia. Din punctul de
vedere al programaturului , orice componenta este un obiect; Fiind obiecte, acestea sunt create
fiecare cu ajutorul unei clase, avand atribute si comportamente;
Un aspect important al oricarei componente este urmatorul: Fiecare dintre acestea poate fi plasata pe
un sistem de axe Cartezian. In felul acesta componenta se afla cu originea in coltul din stanga sus, iar
in jos si la dreapta axele cresc; Sistemul de masurare al interfetelor grafice este in pixeli. Pixelul este
cea mai mica unitate (indivizibila) de os singura culoare a unei imagini;
Exemple de componente pe care le vom folosi:
116

applet
fereastra
buton
bara de meniu
meniu
item de meniu
buton de selectie checkbox
buton de selectie radio
panou
ferestra de dialog
bara de defilare (scrollbar)
eticheta

Componentele se divid in doua categorii: containere si non-containere; Containrerele sunt acele


componente care pe interfata lor pot sustine alte componente; De exemplu fereastra este un
containter, deoarece pe ea vom amplasa diverese ale componente cum ar fi butoane, meniuri ...etc;
Primele titpuri de interfete grafice pe care le vom crea sunt cu ajutorul java.awt.*;

7.3 Appleturile - java.applet


Appleturile reprezinta programe scrise cu Java. Acestea, spre deosebire de alte programe nu sunt de
sine statatoare (nu au o metoda main); Ele se folosesc de metoda principala a altor programe pentru a
se executa (cel mai des, de un web browser); Appleturile sunt cele mai simple aplicatii cu interfata
grafica scrise cu Java. Pentru a dezvolta astfel de programe folosim clasa Applet din pachetul
java.applet;
Un applet are definite doua metode pe care va trebui sa le suprasriem in vederea modificarii interfetei
grafice a acestuia; Metodele sunt definite in clasa Applet pe care va trebui sa o mosteneasca orice
clasa care defineste un applet;
1. paint(Grpagics g)
2. init()
Metoda paint() va fi suprascrisa pentru a desena folosind diferite comportamentele ale obiectului
Graphics pe interfata appletului;
Metoda init() va fi suprascrisa atunci cand trebuie sa adauga componente pe applet;
Aceste functii ale metodelor paint() si init() nu trebuiesc incurcate; In paint() nu pot fi adaugate
componente asa cum in init() nu se poate desena pe interfata appletului;
Clasa Graphics defineste uramtoarele comportamente cu ajutorul carora putem modifica
interfata:

117

drawLine(int x1,int y1, int x2,int y2) - pentru desenarea unui segment de dreapta definit de
punctele de coordonate A(x1,x2) si B(y1,y2);
drawString(String line, int x,int y) - pentru desenarea unui sir de caractere la coordonarele x,y
drawRect(int x,int y, int l,int h) - pentru desenarea unui dreptunghi cu coltul stanga sus la
coordonatele x,y si o anumita latime l si inaltime h
drawOval(int x,int y, int l,int h) - pentru desenarea unei elipse perfect icadrata de
dreptunghiul cu coordonatele date ca in metoda drawRect
setColor(Color c) - pentru setarea unei culori de desenare

118

7.4 Definirea culorilor - clasa Color


Intr-un sistem digital culorile se definesc prin standardul aditiv RGB (Red Green Blue); Acest
standard defineste culori prin amestecul unor cantitati din fiecare dintre cele trei culori rosu, verde si
albastru; Prin amestecul tuturor in cantintate maxima rezulta alb, iar prin absenta completa a
culorilor rezulta negru;
Fiecarei culori ii este rezervat un byte de informatie adica valori intre 0 si 255; Astfel o culoare poate
fi reprezentata cu clasa Color prin definirea instantelor cu urmatorul construcotor:

Color(int red,int green, int blue)

De exemplu: Color c1 = new Color(255,0,0); // defineste rosu aprins


Fiecare parametru poate lua valori intre 0 si 255, reprezentant cantitatile de culoare care se amesteca;
Exista posibilitatea de a defini culori cu transparenta; Pentru asta se foloseste construcotrul cu patru
parametrii, ultimul reprezentand transparenta care ia de asemenea valori intre 0 si 255;

Color(int red,int green,int blue,int alpha)

119

Culorile cunoscute sunt deja definite si reprezinta constante in clasa Color; Acestea pot fi accesate
prin dereferentiere:

Color.red
Color.blue
Color.yellow
Color.green
Color.violet

Culorile se modifica pe o instanta Graphics prin metoda setColor();

g.setColor(Color.red) // prin folosirea constantei


g.setColor(new Color(200,100,0)) // prin definirea unei culori cu ajutorul unuia dintre
constructori

120

121

122

123

7.5 Butoane - java.awt.Button


Cu ajutorul clasei Button din pachetul java.awt putem defini componente de tip buton;
Constructori:

Button()
Button(String s)

Exemple:

Button b1 = new Button();


Button b2 = new Button("Textul de pe buton");
Button b3= new Button(new String("Textul de pe buton"));

Adaugarea oricarei componente pe Applet se face cu metoda add(Component c) mostenita din clasa
Applet;
Exemplu:
Button b = new Button("Butonul meu");
add(b); // adaugarea butonului
Nu uitati ca adaugarea oricarei componente se face prin suprascrierea metodei init()

124

7.6 Manageri de positionare (Layout Managers)


Un manager de pozitionare reprezinta un obiect definit de o clasa care se ocupa de modul in care
sunt aranjate compoentele pe un container; (De exemplu putem defini un mangager de poziionare
pentru a amplasa intr-un anumit fel un buton pe un applet);
Vom invata trei tipuri de manageri de pozitionare:
1. FlowLayout
2. BorderLayout
3. GridLayout
FlowLayout este clasa ce pozitioneaza componentele la dreapta, la stanga sau centrat sus;
BorderLayout ii pozitioneaza in functie de marginea containerului, iar GridLayout in functie de un
grid imaginar cu coodronate date la construire;
Orice manager se pozitionare se seteaza cu ajutorul metodei setLayout() mostenita din clasa Applet;
Exemplu: setLayout(new FlowLayout());
Clasa FlowLayout are constante care definesc locatia unde sunt aranjate componentele:

FlowLayout.LEFT
125

FlowLayout.CENTER
FlowLayout.RIGHT

Exemplu: setLayout(new FlowLayou(FlowLayout.LEFT))


Daca nu se precizeaza constanta, atunci ele sunt default setate CENTER;
Clasa BorderLayout are cinci constante care sunt specifice la adaugarea fiecarei componente;
Managerul se seteaza setLayout(new BorderLayout()) dupa care se specifica o constanta la
adaugarea unei componente din cele 5:

BorderLayout.CENTER
BorderLayout.NORTH (pentru partea de sus)
BorderLayout.SOUTH (pentru partea de jos)
BorderLayout.WEST (pentru stanga)
BorderLayout.EAST (pentru dreapta)

Exemplu:
add(b, BorderLayout.NORTH) // unde b este un buton spre exemplu
Pentru GridLayout cosntrucotrul este GridLayout(int a,int b); a reprezinta numarul de linii si b
numarul de coloane ale gridului; O componeta se adauga dupa setarea gridului cu metoda add cu un
singur parametru si va completa intotdeauna urmatoarea casuta libera a gridului de la stanga la
dreapta de sus in jos;

126

7.7 Panouri
Panourile sunt componente de tip container. Acestea sunt folosite in formatarea interfetei grafice
prin adaugarea pe alte containere in influenta diferitilor manageri de pozitionare; Clasa Panel din
java.awt defineste aceste componente dupa constructorii:

Panel();
Panel(LayoutManaget lm)

127

128

129

7.8 Componente text


Componentele text sunt folosite pentru a-i permite utilizatorului sa introduca siruri de caractere;
Exista doua tipuri de componente text:

TextField (pentru texte de o singura linie)


TextArea (pentru texte pe mai multe linii)

Cele doua clase sunt parte a pachetului java.awt;


TextField se construieste:

TextField(int c) // c reprezinta dimensiunea in latime a textfield-ului

TextArea se construieste:

TextArea(int r,int c) // r,c reperezentand randurile si coloanele componentei text

Exemple:

TextArea ta = new TextArea(5,7);


TextField tf = new TextField(10);

130

Continutul campului text se poate lua cu ajutorul metodei:

getText() - care returneaza un String

Constinutul poate fi setat cu ajutorul setterului:

setText(String s)

Pentru TextArea se poate adauga text la continutul actual prin metoda append(String s);

131

132

Modul 8: Interfete grafice Swing


8.1 Evenimente
Evenimentele reprezinta unul dinre modurile in care un utilizator interactioneaza cu interfata grafica.
Dezvoltarea de aplicatii software care se bazeaza pe evenimente pentru interactiunea cu utilizatorul
se numeste event-driven programming; Exemple de evenimente sunt:

apasarea pe butonul unui mouse


tinerea apasata a unui buton
eliberarea unui buton
drag-and-drop
apasarea unei taste
eliberarea unei taste
miscarea cursorului
intrarea sau iesirea cursorului pe sau de pe o componenta

In urma unui astfel de eveniment programul poate fi conceput sa execute un anumit set de
instructiuni; Un eveniment este asociat unei componente; Altfel spus este nevoie sa precizam mai
intai la ce componenta se refera un anumit eveniment; Acest lucru se poate face cu ajutorul unui
ascultator (listener); Un ascultator este un obiect care dezvolta un fir de executie separat ce asteapta
un eveniment de un anumit tip pentru o componenta pe care a fost setat; Un eveniment este un obiect
care se instantiaza in momentul in care utilizatorul interactioneaza cu interfata grafica;
Pasii pentru descrierea unui eveniment sunt:
1. Aplicarea unui ascultator pe o componenta
2. Scrierea instructunilor care se executa dupa ce s-a returnat un astfel de eveniment

8.2 Click pe butoane


Unui buton definit cu ajutorul clasei Button din pachetul java.awt i se poate atasa un ascultator
pentru un eveniment de tip ActionEvent; Acest eveniment este de fapt cel ce reprezinta un click pe
buton;
Mai intai va trebui sa implementam interfata ActionListener; Aceasta se afla in pachetul
java.awt.event.* care trebuie importat; Pe butonul pe care vrem sa atasam ascutlatorul vom folosi
metoda addActionListener() care primeste ca paramentru o instanta a clasei care suprascrie metoda
actionPerformed(ActionEvent ev); La suprascrierea acestei metode scriem instructiunile care
trebuiesc executate la intalnirea evenimentului;
O a doua metoda este trimiterea ca parametru metodei addActionListener() a unei instante definite
abstract prin suprascrierea clasei si a metodei actionPerformed()

133

134

135

8.3 MouseListener
MouseListener este interfata care contine metodele ce trebuiesc suprascrise pentru cinci evenimente
diferite ce pot fi executate cu ajutorul mouseului pe o componente oarecare:
voidmouseClicked(MouseEvent e)
Pentru click cu mouseul pe o componenta
voidmouseEntered(MouseEvent e)
Pentru intrarea cu cursorul pe o componenta
voidmouseExited(MouseEvent e)
Pentru iesirea de pe o componenta a cursorului
mousePressed(MouseEvent e)
Pentru apasarea unui buton
mouseReleased(MouseEvent e)
Pentru eliberarea unui buton

Daca implementati interfata MouseListener va trebui sa suprascrieti toate metodele descrise in


tabelul de mai sus, chiar daca doar o parte au un rost in scrierea programului; Regula este urmatoarea
general valabila:
La implementarea unei interfete trebuiesc suprascrise toate metodele publice definite in acea
interfata;

136

8.4 MouseMotionListener
Interfata MouseMotionListener contine metode care trebuiesc suprascrise pentru evenimente de
miscare ale mouseului:

drag (apasarea butonului si miscarea cursorului)


move (miscarea cursorului)
mouseDragged(MouseEvent e)
pentru evenimentul de drag
mouseMoved(MouseEvent e)
pentru miscarea cursorului

Pentru a atasa un astfel de ascultator pentru oriceare dintre aceste doua metode folosim metoda
addMouseMotionListener();

137

8.5 MouseEvent
MouseEvent este clase care defineste un eveniment specific mouseului; Instante de MouseEvent sunt
trimise aproape pentru fiecare tip de eveniment specific mouseului; Din acest motiv voi arata cateva
comportamente ale acestui obiect care pot fi folosite in aplicatii;

getButton() - returneaza o constanta din care poate fi aflat butonul de pe mouse de pe care s-a
apasat
getClickCount() - returneaza numarul de click-uri single-click, double-click ... etc sub forma
unui int
getModifiersEx() - returneaza sub forma unui int tastele care au fost tinute apasat atunci cand
s-a facut click cu mouse-ul "ctrl", "shift", "ctrl-shift" ...etc
getMouseModifiersText(int mod) - traduce numarul care reprezinta tastele tinute apasat la
click in siruri de caractere care reprezinta exact numele tastelor ca mai sus
getPoint() - returneaza un Point reprezentad locatia cursorului pe componenta
getX() - returneaza coordonata X a punctului in care se afla cursorul relativ la componenta
getY() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la componenta
getXOnScreen() - returneaza coordonata X a punctului in care se alfa cursorul relativ la ecran
getYOnScreen() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la ecran

Metoda getButton este in general folosita impreuna cu constantele :

138

BUTTON1
BUTTON2
BUTTON3
NOBUTTON

Valoarea returnata de metoda se compara cu una din constante si se afla in felul acesta de pe ce
buton s-a apasat sau in cazul in care evenimentul nu a fost creat de catre mouse acesta va fi egal cu
NOBUTTON;

8.6 MouseWheelListener si MouseWheelEvent


MouseWheelListener este o interfata care contine metoda ce trebuie suprascrisa pentru verificarea
miscarii rotitei mouseului;

mouseWheelMoved(MouseWheelEvent ev)

Evenimentul specific rotitei mouseului este MouseWheelEvent

139

8.7 MouseAdapter
Folosirea interfetelor prezentate in lectiile anterioare are un dezavantaj semnificativ; De exemplu
pentru interfata MouseListener daca dorim sa folosim doar evenimentul Click adica metoda
mouseClicked(MouseEvent ev) atunci va trebui oricum sa le suprascriem si pe celelalte 5 metode;
MouseAdapter este o clasa care ne scapa de munca nefolositoare de suprascriere a acestor metode de
fiecare data cand folsim un eveniment; Aceasta clasa poate fi folosita pentru oricare dintre
evenimentele prezentate in lectiile antorioare referitoare la mouse sau la rotita mouseului; Cu alte
cuvinte in locul interfetelor descrise anterior vom folosi doar clasa MouseAdapter; Totusi va trebui
sa pastram in functie de tipul evenimentului ascultatorul corespunzator:

addMouseListener()
addMouseMotionListener()
addMouseWheelListener()

Fiind o clasa care suprascrie metodele in toate celelalte interfete, la folosirea MouseAdapter nu mai
este nevoie sa suprascrem decat metodele care ne sunt necesare (cele pe care le folosim);

140

8.8 ComponentListener si ContainerListener


Metode din interfata ComponentListener:
componentHidden(ComponentEvent e)
Aruncat daca componenta a fost facuta
invizibila
componentMoved(ComponentEvent e)
Aruncat daca componenta a fost mutata
componentResized(ComponentEvent e)
Aruncat daca s-a modificat dimensiunea
componentei
componentShown(ComponentEvent e)
Aruncat daca componenta a fost facuta vizibila

Metode din interfata ContainerListener:

141

componentAdded(ContainerEvent e)
Aruncat cand s-a adaugat o componenta pe
container
componentRemoved(ContainerEvent e)
Aruncat cand a fost scoasa o componenta de
pe container

8.9 TextListener
Metoda textValueChanged(TextEvent ev) este suprascrisa pentru evenimentul invocat atunci cand in
componenta text pe care am atasat ascultatorul este modificat continutul; Pentru a executa
instructiuni la modificarea continutului unei componente text trebuie sa folosimt interfata
TextListener si sa suprascriem metoda textValueChanged();

8.10 WindowAdapter si WindowEvent


WindowAdapter este clasa ce reuneste trei interfete ce contin metode referitoare la evenimentele pe
ferestre; Asemanatoare clasei MouseAdapter, cu ajutorul acestei clase putem suprascrie numai
metodele de care avem nevoie atunci cand folosim evenimente pe ferestre;
windowActivated(WindowEvent e)
Apelata la activarea unei ferestre
windowClosed(WindowEvent e)
Apelata la inchiderea unei ferestre
windowClosing(WindowEvent e)
Apelata in timpul procesului de
inchidere
windowDeactivated(WindowEvent e)
Apelata la dezactivarea unei
ferestre.
windowDeiconified(WindowEvent e)
Apelata la deiconificarea unei
ferestre
windowGainedFocus(WindowEvent e)
Apelata cand ferestra obtine
focusul;

142

windowIconified(WindowEvent e)
Apelata la iconificarea unei
ferestre
windowLostFocus(WindowEvent e)
Apelata atunci cand fereastra
pierde focusul
windowOpened(WindowEvent e)
Apelata la deschiderea ferestrei;
windowStateChanged(WindowEvent e)
Apelata la modificarea starii
ferestrei;

WindowEvent este evenimentul specific ferestrelor;


Pentru o fereastra se numeste stare de focus perisoada in care tastatura si combinatiile de taste se
refera direct la acea fereastra; Atunci cand tastatura nu se mai refera direct la fereastra ci la o alta
compoenenta, se numeste ca fereastra "a pierdut focusul";
O fereastra ese activa cand se poate lucra cu ea si inactiva atunci cand nu se poate lucra cu ea;
Iconificarea reprezinta scoaterea ferestrei din taskar, iar deiconificarea este operatiunea inversa;

143

144

Modulul 9: Interfete folosind tehnologia Swing

9.1 Crearea ferestrelor cu SWING - JFrame


Clasa JFrame este cea pe care o vom folosi pentru a crea ferestre; Ca orice alta clasa care reprezinta
componente swing ea se afla in pachetul javax.swing; Pentru ca este un container vom folosi de cele
mai multe ori aceasta clasa prin mostenire nu prin instantiere; Altfel spus, vom crea clase care sa
reprezinta ferestre si pentru ca acestea sa devina ferestre de tip JFrame ele vor mosteni aceasta clasa;
public class Fereastra extends JFrame{
}
Daca incercam in acest moment sa folosim clasa fereastra prin instantiere cu construcotrul default
acea instanta creata ar reprezenta o fereastra; Pentru a modifica aceasta fereastra adaugandu-i
componente pe interfata vom folosi un constructor;
public Fereastra(String titlu){
super(titlu);
}
De obicei acest contructor primeste prin parametru titlul ferestrei si il seteaza prin intermediul
constructorului clasei: JFrame(String titlu);
Toate componentele vor reprezenta pentru aceasta ferestra atribute si vor fi definite corespunzator
inainte de constructor; De obicei componentele de pe o ferestra sunt definite private pentru ca ele au
un scop numai in interiorul clasei si nu sunt accesate din exterior;
JFrame definieste un container prin urmare se pot atasa manageri de pozitionare unei ferestre pentru
a aranja interfata acesteia; Sunt folositi aceeasi LayoutManagers din java.awt si de asemenea se
seteaza folosind metoda setLayout();
Default o fereastra JFrame are setat managerul BorderLayout cu constanta CENTER; De asemenea
aceasta este invizibila si trebuie facuta vizibila dupa instantiere folosind metoda setVisible(boolean
state); Daca parametrul este false atunci ea este facuta invizibila, daca parametrul este true atunci
fereastra devine vizibila;
Alte metode prin intermediul careia putem modifica atribute ale ferestrei JFrame:

setSize(int w, int h)
setLocation(int x, int y)
setBounds(int x, int y,int h,int w)
setResizable(boolean state)
setIconImage(Image i)

Metoda add(Component c) este folosita pentru a adauga pe fereastra o componenta exact ca in cazul
Appleturilor; Metoda add() este mostenita din clasa Container;
145

9.2 Crearea butoanelor - JButton


Un buton poate fi creat folosind clasa JButton; De obicei butonul este contruit folosind unul dintre
constructorii:

public JButton(); // un buton fara text


public JButton(String text) // un buton cu text dat ca parametru la construire
public JButton(String text, Icon ico) // buton cu text si imagine

Textul de pe buton poate fi modificat folosind metoda setText(String text) sau poate fi preluat
folosind metoda getText(); Metodele setLabel() si getLabel() sunt considerate obsolete si nu se mai
folosesc in prezent;
Din moment ce butonul reprezinta o componenta, poate fi adaugat pe un container folosind metoda
add(Component c) a containerului;
Butonul JButton este sensibil la evenimente de tip ActionEvent, asadar modalitatea de atasare a
ascultatorilor si de creare evenimente este similara butoanelor Button din pachetul java.awt;

9.3 Crearea componentelor text


Vom folosi trei tipuri de componete text: JTextField, JTextArea si JPasswordField;
Componenta JTextFiled este un camp de text cu un singur rand pe care pot incapea mai multe
caractere; In general aceasta componenta este folosita pentru a introduce un text de dimensiuni mici;
Componenta JTextArea este un camp de text care permite introducerea unui text pe mai multe
randuri, deci aceasta componenta este folosita pentru texte de dimensiuni mai mari;
Metoda folosita pentru preluarea textului dintr-o componenta text este: getText() care returneaza o
instanta de String;
Pentru a modifica textul dintr-un camp de text se foloseste metoda setText(String text)
Componenta JTextArea are in comportament si metoda append(String text) care permite adaugarea
unui text la componenta;
Componenta JPasswordField este similara componentei JTextField, doar ca , aceasta ascunde
caracterele introduse de utilizator ca in cazul unui camp pentru introducerea parolei obisnuit;

9.4 Butoane de selectie


Clasele JCheckBox si JRadioButton definesc componente de tip butoane de selectie; Standard,
butoanele JCheckBox sunt folosite pentru a crea liste de optiuni de tip multiple-choice (din care poti
selecta mai multe variante), iar JRadioButton pentru crearea de liste de tip single-choice (din care se
poate selecta o singura optiune);
146

Astfel pentru butoanele JRadioButton adaugam o noua clasa ButtonGroup cu ajutorul careia
precizam care sunt butoanele din care se selecteaza o singura optiune; ButtonGroup defineste un
grup de butoane; Din butoanele ce apartin aceluiasi grup nu putem selecta decat o singura optiune;
Ambele tipuri de componente se creaza similar butoanelor JButton; In general acestea nu sunt
folosite cu evenimente si prin verificari ale starilor acestora (se verifica daca este sau nu select la un
anumit eveniment); Verificarea starii unei astfel de componente se face folosind medoda isSelected()
care returneaza true daca butonul este bifat si false daca nu este bifat;
Un grup de butoane se creaza astfel:
ButtonGroup bg = new ButtonGroup();
Un buton poate fi adaugat la grupul de butoane bg (instanta creata mai devreme) folosind metoda
add(Component c);
Daca este cazul se poate folosi un eveniment de modificare a starii unui buton care este definit in
pachetul javax.swing.event; Evenimentul se atasaza similar celor din java.awt.event; folosind
ascultatorul ItemListener;

9.5 Meniuri
Pentru a crea meniuri avem la dispozitie cinci clase: JMenuBar, JMenu, JMenuItem,
JRadioButtonMenuItem, JCheckBoxMenuItem;
Intai trebuie creata o instanta de bara de meniu cu ajutorul clasei JMenuBar; Pe aceasta instanta vor
trebui adaugate meniurile; Instanta clasei JMenuBar este setata pe fereastra folosind metoda
setJMenuBar(JMenuBar mb);
Clasa JMenu este cea care defineste un meniu ce poate fi adaugat pe bara de meniu; In general este
folosit constructorul:

public JMenu(String titlu) // titlul meniului Ex: File, Edit, Insert ...etc

Meniul este adaugat pe bara de meniu folosind metoda add();


JMenuBar mb = new JMenuBar();
JMenu m = new JMenu("File");
mb.add(m); // adaugam meniul pe bara de meniu
Folosind acceasi metoda add() poate fi adaugat un meniu intr-un alt meniu creindu-se astfel
submeniuri;
De asemenea se pot adauga intr-un meniu butoane (JMenuItem) folosind metoda add();
Un buton specific unui meniu se creeaza folosind unul dintre constructorii:

147

public JMenuItem(String text)


public JMenuItem(String text, Icon ico)

Exista de asemenea si butoane de selectie care pot fi adaugate in meniuri; Acestea pot fi create cu
ajutorul clasele JRadioButtonMenuItem si JCheckBoxMenuItem si functioneaza similar celor
definite cu clasele JRadioButton si JCheckBox;

9.6 Etichete - JLabel


O eticheta reprezinta cea mai simpla componenta; Aceasta este folosita pentru afisarea unui text
static in cele mai multe cazuri;
O eticheta se creaza folosind clasa JLabel:

public JLabel(String text)

si este adaugata pe un container folosind metoda add() a containerului;


Textul de pe o eticheta poate fi modificat sau preluat folosind metodele getText() si setText(String
text)

9.7 Panouri - JPanel


Un panou reprezinta un container asemenea unei ferestre; Acesta este folosit prin adaugarea pe alte
containere (in general ferestre sau alte panouri);
Panoul poate fi construit folosind constuctorii:

public JPanel()
public JPanel(LayoutManger lm)

O componenta poate fi adaugata pe un panou folosindaceeasi metoda add() ca si in cazul ferestrelor,


mostenita de la clasa Container;

9.8 JScrollPane
JScrollPane este o componenta folosita pentru adaugarea de bare de defilare pentru o alta compoenta
care ar putea depasi dimensiunile containerului in care este adaugata; Instanta JScrollPane nu este
folosita in actiunile directe pe care le are componente pe care o sustine; La construire instantei i se da
o componenta pentru care este creata si pe care adauga bare de defilare (scrollbars); Apoi instanta
JScrollPane este adaugata pe container in locul componentei din instanta JScrollPane;

148

Exemplu:
JTextArea ta = new JTextArea(4.5);
JScrollPane jsp = new JScrollPane(ta);
add(jsp);
ta.setText("Un text");

149

Modulul 10: Fire de executie, clase generice si colectii

10.1 Tipuri generice


Tipurile generice reprezinta entitati abstracte, care nu au definit un prototip, dar care pot fi tratate in
interiorul unei clase, pentru ca mai apoi sa fie precizat cu exactitate prototipul la care se refera. In
felul acesta poate fi creat un nou pototip flexibil, ale carui tipuri de atribute sunt dinamice, putand fi
modificate de la o instanta la alta. Sa presupunem urmtorul scenariu:
Clasa Animal defineste instante ce au ca unul dintre atribute chiar instante de animale. Insa Animal
este si cainele si tigrul si pisica. Cum poate fi creata o clasa care sa definesca instante in care un
atibut sa aiba mai intai tipul Caine, apoi Tigru si in cele din urma Pisica;

150

Clasa Animal defineste un prototip ce are ca atribut un tip generic (abstrct / neprecizat la definire):

In clasa Main sunt definite trei instante diferite de Animal:

151

In acest fel se spune ca atributul clasei generice este dinamic. Atributul generic poate lua orice tip,
atata timp cat va fi precizat la instantiere:

152

Datorita faptului ca sunt neprecizate ca prototip, tipurile generice nu pot face parte din tipuri statice.
Acestea pot fi tratate in clasa doar ca atribute (tipuri non-statice). De asemenea nu poate fi instantiata
o matrice de tipuri generice:

Tipurile generice pot fi folosite in parametrii metodelor non-statice dar si ca tipuri de return:

153

O clasa poate defini mai multe tipuri generice. Acestea vor fi separate prin virgula:

10.2 Mostenirea tipurilor generice


Un tip generic poate fi definit ca mostenitor al unei alte clase pentru a restrange dinamismul dat
tipului. In felul acesta poate fi creata o restrictie a tipului cu care poate fi instantiat genericul; De
exemplu in situatia de mai jos atributul dat genericului trebuie sa se afle in arborele de mostenire al
clasei JPanel, sub aceasta pentru a putea inlocui tipul abstract:

154

La instantiere:

155

Tipul generic in acest caz poate fi instantiat cu orice clasa ce mosteneste JPanel:

156

Totusi, spre deosebire de ultimul exemplu (clasa Animal), tipul generic nu mai poate fi dat de orice
clasa:

157

Un tip generic poate fi mostenit la definire. In acest fel poate fi creata o dependinta intre tipurile
generice ale unei clase:

158

10.3 Colectii
Pachetul java.util ofera un set de interfete si clase numite Java Collections Framework cu ajutorul
carora, instante de diferite tipuri pot fi grupate in entitati numite colectii asupra carora se pot efectua
algoritmi. Cele mai importante interfete si clase din Java Collections Framework sunt:
Interfete:

Collection
List
Set
Queue
SortedSet
NavigableSet
Map
SortedMap
NavigableMap

Clase:

HashSet
ArrayList
Vector
LinkedList
TreeSet
Hashtable
HashMap
TreeMap

Clase de algoritmi:

Arrays
Collections

159

Sunt patru tipuri de colectii:

Liste - grupuri de entitati


Multimi (Sets) - grupuri de entitati unice
Map - grupuri de entitati identiicate cu un ID unic
Queues (Cozi) - entitati ordonate intr-un mod in care urmeaza sa fi procesate

10.4 Collection, List, Set, Map si Queue


Interfata Collection este radacina intregului arbore ce reprezinta frameworkul Collection. O colectie
reprezinta un grup de obiecte denumite general elemente.
Interfata List defineste o lista. O lista este o colectie de elemente ordonate, identificate printr-un id.
Elementele pot fi accesate prin intermediul identificatorului, pot fi parcurse sau scoase din lista. Lista
permite adaugarea elementelor duplicat. Interfata List defineste un tip generic E (element) care poate
fi precizat la crearea listei.

160

Interfata Set defineste o colectie similara unei multimi matematice. Un obiect poate fi adaugat sau
scos din colectie. Colectia nu permite adaugarea elementelor egale (pentru care metoda equals()
returneaza true). De asemenea poate fi verificat faptul ca un element apartine unui Set.

Interfata Map defineste doua tipuri generice K si V. K se numeste key (cheie) si V se numeste value
(valoare). Colectia atribuie unei chei un element ca valoare.

161

Interfata Queue defineste o interfata similara unei structuri de coada. Queue contine metode care
adauga un element la capatul cozii, care preia primul element din coada si il sterge sau care doar
preia primul element din coada. O coada functioneaza standard pe principiul FIFO (First In First
Out).

162

10.5 List
Pentru instantierea unei liste este folosita una dintre clasele:

ArrayList - folosita in principal pentru parcurgeri rapide, aceasta clasa defineste ceva similar
unei matrici care poate creste dinamic.
Vector - una dintre cele mai vechi colectii Java. Este similara cu ArrayList dar metodele
definite de aceasta clasa sunt sincronizate pentru siguranta apelului in fire de executie
separate
LinkedList - Similara unei liste inlantuite. Fiecare element are legatura cu doi vecini. Clasa
poate fi usor folsita pentru implementarea structurilor de coada si stiva.

163

Folosirea clasei Vector:

164

Clasa LinkedList:
Instantele LinkedList pot fi de asemenea folosite cu o zona de memorie a interfetei List pentru a
restrage metodele la cele ale interfetei. De asemenea clasa poate fi instantiata in propria zona de
memorie ce ofera posibilitatea accesului si la alte metode comportament specifice:

Metode din clasa LinkedList:


165

add(E e);
addFirst(E e);
addLast(E e);
getFirst();
getLast()
removeFirst()
removeLast()

10.6 Set
Interfata Set nu permite duplicate in elementle adaugate colectiei. Pentru instantiere este folosita una
dintre clasele:

HashSet
LinkedHashSet
TreeSet

Clasa HashSet foloseste un hash pentru identificarea elementelor. Clasa poate fi folosita pentru
definirea unei colectii care nu ordoneaza elementele si nu permite duplicat in inregistrari.

166

167

Se poate observa din exemplu ca elementele nu sunt ordonate cat si ca acestea nu pot fi adaugate
duplicat.
Clasa LinkedHashSet defineste o structura HashSet in care elementele sunt ordonate. Elementele
vor fi afisate in ordinea introducerii.

168

In continuare nu este permisa adaugarea elementelor egale.

169

Clasa TreeSet descrie o colectie de tip set sortata. O colectie sortata aranjeaza elementele la
introducere dupa un algoritm. TreeSet este un arbore binar echilibrat. Algoritmul dupa care
elementele sunt ordonate este Red-Black Tree.

170

171

10.7 Map
Collectia de tipul Map identifica printr-o cheie unica valori adaugate. Fiecare element este o pereche
"key-value". Clasele care pot fi folosite pentru a crea o astfel de colectie sunt:

HashMap
Hashtable
LinkedHashMap
TreeMap

HashMap este cea mai simpla colectie de tip Map. Aceasta nu sorteaza si nu ordoneaza elementele.

172

Se observa faptul ca elementele nu sunt ordonate dupa adaugare si nici sortate. Cheile pot fi obinute
si parcurse cu un Iterator. Cheia este unica, prin urmare in functie de aceasta poate fi preluata
valoarea.
Clasa Hashtable este, similar clasei Vector, una dintre cele mai vechi clasedin Java API. In prezenta
versiune, clasa defineste o tabela de dispersie similar clasei HashMap, dar ofera metode sincronizate
pentru folosirea colectiilor din mai multe fire de executie in desfasurare.
Colectia LinkedHashMap este similara colectiei HashMap, dar ordoneaza elementele dupa ordinea
introducerii:

173

TreeMap defineste o colectie sortata si ordonata de tip Map.

174

175

10.8 Clasa Collections


Clasa Collections din pachetul java.util defineste algoritmi ca metode de clasa ce pot fi folosite
asupra colectiilor.
Sortarea unei liste:

176

Ordonare inversa:

177

Amestecarea (shuffle):

178

Extragerea minimului sau a maximului:

179

180

Rotatia elementelor:
Initial:

181

Dupa ciclarea cu 4 elemente:

182

Interschimbarea a doua elemente (swap):

183

10.9 Fire de executie


Firele de executie pot fi imaginate ca secvente de instructiuni ce se desfasoara in paralel independent
in cadrul unui proces.
Instructiunile executate de un fir de executie (numit Thread) au acces la aceleasi zone de memorie.
Firele de executie sunt create fie prin mostenirea clasei Thread, fie prin implementearea interfetei
Runnable. Orice clasa care mosteneste Thread sau implementeaza Runnable defineste instante care
pot porni un fir de executie. Instructiunile firului de executie sunt date de comportamentul run() ce
trebuie suprascris din clasa Thread sau din interfata Runnable. Exemplul de mai jos defineste un fir
de executie prin mostenirea clasei Thread:

184

Dupa crearea unei instante a unui fir de executie, pentru a porni firul de executie se apeleaza metoda
start(), comportament al instantei firului de executie mostenit de la clasa Thread.

185

Fiecare instanta reprezinta un fir de executie ce poate fi pornit:

Ultimul exemplu, din imaginea de mai sus reprezinta un program cu trei fire de executie. Unul este
firul principal de executie din care sunt pornite alte doua. instructiunile celor trei fire de executie
dupa pornirea fiecaruia se desfasoara simultan, independent unul de celalalt.
Metoda sleep() , definita static in clasa Thread poate fi folosita pentru adormirea firului de executie
timp de un numar de milisecunde. Exista urmatoarele doua supraincarcari ale metodei sleep():

sleep(int milisecunde)
sleep(int milisecunde, int nanosecunde)

In exemplul de mai jos, firul de executie este adormit 300 milisecunde dupa fiecare iteratie a ciclului
for. Metoda arunca o exceptie de tip InterruptedException, care trebuie tratata pentru apelul metodei;

186

10.10 Implementarea interfetei Runnable


Metoda de creare a unui fir de executie prin implementarea interfetei Runnable poate fi utila atunci
cand clasa care trebuie sa devina fir de executie mosteneste deja o alta clasa:

187

Se poate crea instanta Thread pe baza instantei Runnable (fereastra care implementeaza Runnable),
iar apoi firul poate fi pornit cu metoda start().

188

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