curs java1

188
1 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...

Upload: gabriel-cosmin

Post on 14-Apr-2016

74 views

Category:

Documents


0 download

DESCRIPTION

Curs Java1

TRANSCRIPT

1

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

2

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

3

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.

4

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:

5

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:

6

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:

7

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:

8

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

9

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.

10

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)

11

Apelam metoda principala:

Consola se deschide si afisaza mesajul "Hello World!"

12

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

13

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: && || !

14

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:

15

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:

16

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:

17

== 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.

18

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:

19

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.

20

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

lipsi:

21

Blocul else poate sa lipseasca in intregime:

22

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;

23

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;

24

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.

25

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

26

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

27

/= 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;

28

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:

29

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:

30

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.

31

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.

32

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;

33

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

34

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

35

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.

36

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

37

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:

38

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:

39

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.

40

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.

41

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.

42

Apelul comportamentelor:

Un comportament nu poate fi apelat fara existenta unei instante.

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

43

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.

44

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.

45

Nu pot fi accesate entitati non-statice:

46

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.

47

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

48

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.

49

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:

50

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:

51

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

52

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

for imbricate.

Tablouri pluridimensionale:

53

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:

54

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.

55

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:

56

Enumerarea arata in BlueJ:

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

vineri, sambata, duminica

57

Afisarea valorii in consola:

Rezultat: marti

58

Metoda values() si parcurgerea valorilor unei enumerari:

59

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:

60

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.

61

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.

62

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.

63

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.

64

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.

65

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

66

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:

67

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.

68

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:

69

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.

70

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.

71

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.

72

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.

73

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

74

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:

75

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

76

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.

77

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

Clasa Forma nu poate defini instante:

78

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:

79

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:

80

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.

81

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.

82

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.

83

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

84

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:

85

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.

86

Clasa care va implementa interfata Vampir va trebui sa suprascrie metodele din interfata, inclusiv

cele mostenite pentru a ramane neabstracta.

87

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:

88

89

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.

90

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

exemplu de clasa String:

91

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

92

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. Byte - trateaza primitiva byte ca obiect

2. Short - trateaza primitiva short ca obiect

3. Integer - trateaza primitiva int ca obiect

4. Long - trateaza primitiva long ca obiect

5. Character - trateaza primitiva char ca obiect

6. Float - trateaza primitiva float ca obiect

7. Double - trateaza primitva double ca obiect

8. 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.

93

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!:

94

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.

95

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

96

Metoda random() este singura care nu primeste parametri. Poate fi folosita pentru obtinerea unei

valori aleatoare in intervalul [0,1]:

97

In general pentru obtinerea valorilor aleatoare nu este folosita metoda random() din clasa Math ci

clasa Random din pachetul java.util:

98

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

99

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:

100

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:

101

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

102

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;

103

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:

104

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

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

105

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:

106

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.

107

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

108

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:

109

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.

110

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

111

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;

112

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:

113

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

interfata Calendar:

ERA

YEAR

MONTH

WEEK_OF_YEAR

114

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

115

Recapitulare - exercitii

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;

2. Creati clasele Persoana, Student si Grupa dupa atributele specificate;

3. 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

4. Encapsulati cele trei clase;

5. Creati o clasa container cu numele Main care sa contina metoda principala si in care

sa creati o grupa dintr-un vector de Persoane;

6. Verificati in Main comportamentele clasei Grupa;

o 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

déjà 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?

116

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:

117

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:

118

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

119

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)

120

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

121

122

123

124

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

125

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

126

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;

127

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)

128

129

130

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

131

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

132

133

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

134

135

136

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:

void mouseClicked(MouseEvent e)

Pentru click cu mouseul pe o componenta

void mouseEntered(MouseEvent e)

Pentru intrarea cu cursorul pe o componenta

void mouseExited(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;

137

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

138

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 :

139

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

140

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

141

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:

142

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;

143

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;

144

145

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;

146

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

147

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:

148

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;

149

Exemplu:

JTextArea ta = new JTextArea(4.5);

JScrollPane jsp = new JScrollPane(ta);

add(jsp);

ta.setText("Un text");

150

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;

151

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:

152

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:

153

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:

154

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:

155

La instantiere:

156

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

157

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

clasa:

158

Un tip generic poate fi mostenit la definire. In acest fel poate fi creata o dependinta intre tipurile

generice ale unei clase:

159

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

160

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.

161

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.

162

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

163

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.

164

Folosirea clasei Vector:

165

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:

166

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.

167

168

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.

169

In continuare nu este permisa adaugarea elementelor egale.

170

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.

171

172

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.

173

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:

174

TreeMap defineste o colectie sortata si ordonata de tip Map.

175

176

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:

177

Ordonare inversa:

178

Amestecarea (shuffle):

179

Extragerea minimului sau a maximului:

180

181

Rotatia elementelor:

Initial:

182

Dupa ciclarea cu 4 elemente:

183

Interschimbarea a doua elemente (swap):

184

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:

185

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.

186

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;

187

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:

188

Se poate crea instanta Thread pe baza instantei Runnable (fereastra care implementeaza Runnable),

iar apoi firul poate fi pornit cu metoda start().