Documente Academic
Documente Profesional
Documente Cultură
1.2 Hardware
Partea hardware reprezinta componentele fizice ale unui computer. Acestea se clasifica in:
1. Periferice
2. Unitate centrala
Perifericele reprezinta dispozitivele atasate unitatii centrale prin care se poate introduce informatia in
sistem sau prin care se poate afisa informatia procesata. Prifericele sunt de trei feluri:
1. de intrare (input devices) Ex: mouse-ul, tastatura, touch-pad, microfon ... etc
2. de iesire (output devices) Ex: monitorul, imprimanta, boxe ... etc
3. mixte (mixed devices) Ex: monitor touch
Unitatea centrala contine mai multe componente cu functii diferite: placa de baza, procesorul (CPU),
memoriile...
1
Din punctul de vedere al programatorului cele mai importante componente care trebuiesc intelese cu
functiile lor sunt memoria si procesorul;
Memoria:
Memoria este de trei tipuri: memorie cache (numele provine din limba franceza si inseamna
"ascunsa", totusi pronutia cel mai des intalnita este cea anglofona), memorie interna (denumita si
RAM) si memorie externa (sau auxiliara); Memoria cache este o memorie de tip buffer. Aceasta este
folosita imediat de procesor si stocheaza instructiunile imediat necesare procesorului.
Memoria interna este o memorie RAM (Random Access Memory).Cel mai important aspect al
acestei memorii, este faptul ca este volatila. Acest lucru inseamna ca memoria interna nu este facuta
pentru a stoca informatie pe termen indelungat. Informatia stocata in memoria RAM este necesara
numai proceselor ce se executa in acel moment si este complet stearsa daca se intrerupe alimentarea
acesteia.
Rolul in stoacarea de informatii il are memoria externa. Memoria externa este reprezentata de
dispozitive precum HDD (hard disk drive), floppy, cd-rom, dvd-rom, flash-drive... etc
Procesorul:
CPU (Central Processing Unit), sau procesorul reprezinta creierul computerului. Acesta se ocupa de
interpretarea unor operatii logice si matematice simple. Un procesor cu un singur nucleu (core) nu
poate interpreta decat o instructiune la un moment dat, dar rapiditatea de calul este foarte mare. Un
procesor rapid face calculele la nivel temporal mai mic de o nanosecunda.
1.3 Software
Software-ul nu este fizic vizibil. Acesta se imparte in:
1. Sistem de operare
2. Aplicatii
Sistemul de operare este managerul si intermediarul intre aplicatii (programe folosite de utilizator in
diferite scopuri) si hardware.
La nivel hardware sistemul intelege un limbaj binar (format numai din cifrele 0 si 1) iar la nivel
software informatiile sunt interpretate in decimal si hexadecimal.
Dezvoltarea programelor:
Crearea unui program presupune trei pasi: scrierea programului, compilarea si executia.
Scrierea programului presupune cunoastrea unui limbaj de programare. Exista mai multe limbaje de
programare, unele dintre acestea sunt high-level iar altele sunt low-level. Java, C++, C# sunt
exemple de high-level programming languages. Limbajele de programare au fost inventate pentru a
simplifica munca programatorului. Inainte de inventarea limbajelor de programare toate aplicatiile se
2
scriau in limbaj binar (deci siruri de 1 si 0) numit si limbaj masina. Limbajele de programare recente
sunt facute apropiat de limba engleza astfel incat se poate lucra mult mai usor ca ele. Totusi
computerul nu le intelege, dar pentru aceasta exista compilatorul care transforma limbajul nativ in
limbaj binar. Executia unui program reprezinta utilizarea lui efectiva.
compilatorul - javac.exe
executorul - java.exe
vizualizatorul de appleturi - appletviewer.exe
dezvoltatorul de documentatie - javadoc.exe
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:
In poriectul nou creat suntem pregatiti sa cream primele clase. Java este un limbaj de programare
orientat pe obiecte, prin urmare nu exista niciun program fara cel putin o clasa. Despre clase vom
discuta in urmatorul modul, insa pentru inceput, pentru a crea prima aplicatie va trebui sa cream si o
clasa. Asadar sa urmarim modul in care putem crea o noua clasa folosind mediul de programare
BlueJ:
Dati un nume clasei. Standard numele de clase trebuie sa inceapa cu litera mare si, in cazul in care
este compus din mai multe cuvinte fiecare dintre acestea incepe cu litera mare. De exemplu:
NumeleClasei sau NumeleClaseiMele ...samd. Numele date pentru clase nu trebuie sa contina spatii
sau caractere speciale prcum +,=,&,(,) etc In principal numele clasei trebuie sa fie reprezentativ,
adica sa reprezinte exact ceea ce defineste sau face clasa.
Fisierul cu extensia .java este reprezentat in BlueJ de un dreptunghi de culoare portocalie. Un fisier
cu extensia .java trebuie sa contina cel putin o clasa publica si numai una. Clasa publica da numele
fisierului cu extensia .java, de exemplu, daca veti cauta in sistemul de fisiere al calculatorului pe care
lucrati, in proiectul pe care l-ati creat si salvat mai devreme ar trebui sa existe dupa crearea clasei cu
numele NumeleClasei fisierul NumeleClasei.java. De asemenea foarte important de tinut minte este
8
ca Java este un limbaj de programare case sensitive, asta inseamna ca face diferenta intre litere mari
si litere mici. Pentru Java, NumeleClasei nu este acelasi lucru cu numeleClasei sau cu Numeleclasei.
Cele trei nume sunt diferite si prin urmare vor fi tratate de compilator la elemente diferite ale
programului.
Dupa cum stiti Java are proprietatea de portabilitate. Asta inseamna ca fiecare aplicatie este
interpretata de catre JVM (Java Virtual Machine). Mai intai totusi este necesara compilarea de care
se ocupa javac (compilatorul). Daca in BlueJ dreptunghiul care reprezinta fisierul .java este hasurat
atunci codurile continute nu sunt compilate.
Daca nu apare nicio eroare la compilare dreptunghiul care reprezinta fisierul nu mai este hasurat.
Asta inseamna ca se poate face o executie prin trimiterea codului la executor (JVM)
10
short
int
long
float
double
byte
boolean
char
Orice zona de memorie se defineste folosind un tip de data si un nume (sau identificator); Numele se
poate alege dupa urmatoarele reguli:
1. nu poate incepe cu cifra
2. nu poate contine caractere speciale
3. nu poate fi cuvant rezervat (keyword)
Sintaxa pentru rezervarea unei zone de memorie este de forma <tip> <identificator>;
12
Aceste zone de memorie reprezinta parti ale memoriei interne. Memoria interna se imparte in doua
zone: stack si heap. Datele primitive sunt stocate in zone rezervate din stack;
Primitivele int, long, byte, short: reprezinta zone de memorie rezervate pentru stocarea valorilor
numerice intregi. Cel mai des, dintre acestea este folosit tipul int;
Primitivele float si double: reprezinta zone de memorie folosite pentru stocarea valorilor numerice
reale. Diferenta dintre cele doua tipuri de primitive este precizia zecimalelor valorilor stocate. Chiar
daca float si double sunt folosite pentru acelasi tip de date nu putem transporta informatia dintr-un
double intr-un float in mod direct, deoarece este posibila pierderea de precizie a valorii cu care se
face aceasta operatiune. Pentru a pune totusi o valoare stocata intr-o zona de memorie double intr-un
float putem folosi conversia explicita. Acest lucru se poate face in felul urmator:
Primitiva char: poate fi folosita pentru a stoca caractere in format Unicode.
Primitiva boolean: este folosita pentru a stoca una dintre valorile true sau false; Spre deosebire de
alte limbaje de programare nu mai exista posibilitatea de a folosi valorile 1 si 0 pentru adevarat sau
fals. Pentru a reprezenta valorile adevarat sau fals (tip boolean) singura modalitate este folosirea
cuvintelor true si false. true si false se scriu numai cu litere mici si reprezinta cuvinte rezervate in
Java.
2.3 Operatori
Operatorii se clasifica in:
1. operatori matematici: + - * / %
2. operatori logici: && || !
13
Operatorul de atribuire este executat de la dreapta la stanga. Asta inseamna ca in cazul in care in
partea dreapta este o expresie, aceasta va fi executata inainte de a face atribuirea. De exemplu in
cazul folosirii operatorilor matematici:
14
Similar folosirii operatorului + poate fi folosit oricare dintre operatorii matematici tinand cont de
functia lor. Ordinea efectuarii operatiilor din matematica se pastreaza si in cazul pogramarii:
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:
15
Operatorii de comparare pot fi folositi pentru scrierea expresiilor de tip boolean (care au ca rezulat
true sau false)
== testare a egalitatii
!= testare a inegalitatii
< mai mic
> mai mare
<= mai mic sau egal
>= mai mare sau egal
Operatorii logici
|| sau
&& si
! not
Intr-o expresie in care doua conditii sunt reunite folosind OR (sau) este suficient ca macar una sa fie
adevarata ca intreaga expresie sa devina adevarata.
Intr-o expresie in care doua conditii sunt reunite folosind AND (si) este suficient ca macar una dintre
ele sa fie falsa pentru ca intreaga expresie sa fie falsa.
17
Operatorii de comparare impreuna cu operatorii logici sunt folositi asa cum vom vedea in urmatoarea
lectie in definirea conditiilor structurilor de control.
Un operator foarte important este de asmenea si ; (punct si virgula). Acesta marcheaza intotdeauna
sfarsitul unei instructiuni.
Operatorul supraincarcat +:
Operatorul + este considerat un operator supraincarcat. Acesta poate fi folosit pentru a concatena
(alipi) doua siruri de caractere. Iata cateva exemple:
18
19
Daca blocul are o singura instructiune atunci acoladele care incadreaza blocul de instructiuni pot
lipsi:
20
21
switch testeaza o zona de memorie si in cazul in care aceasta are o anumita valoare se executa un
anumit set de instructiuni;
default este optional si reprezinta setul de instructiuni ce se executa daca valoarea variabilei testate
nu respecta niciunul dintre cazurile precizate;
Dupa fiecare caz trebuie pusa instructiunea break;
22
Putem pune cazul default daca dorim sa se execute instructiuni si in cazul in care valoarea variabilei
nu se gaseste in cazurile precizate. default poate lipsi caz in care pentru orice alta valoare nu se
executa nimic. Default este pus mereu ultimul si nu necesita instructiunea break;
23
Intotdeauna in cazul unei structuri de control, conditia trebuie la un moment dat sa devina falsa. In
caz contrar aceasta va executa repetarea instructiunilor la infinit si programul se va bloca. In cazul
exemplului de mai sus care afisaza in consola numerele de la 10 la 1 pe linii diferite instructiunea
a=a-1 se asigura de faptul ca valoarea din zona de memorie a va deveni la un moment dat mai mica
decat 1 si deci conditia nu va ma fi adevarata.
Structura do-while functioneaza similar cu while. Diferenta este ca do-while este post-conditionata.
Daca in cazul structurii while se testeaza mai intai conditia iar apoi se executa instructiunile daca
conditia este adevarata, in cazul structurii do-while intai se executa primul set de instructiuni iar apoi
se verifica conditia.
24
Structura for este folosita in general pentru repetari de instructiuni de un numar fix de ori sau pentru
parcurgerea unor intervale de valori.
for are trei parti intre paranteze rotunde (partea de initializare, conditia si partea de control) si un set
de acolade care incadreaza blocul de instructiuni care se repeta.
Iata cum functioneaza structura for din exemplul de mai sus: Intai se executa prima parte i=0, apoi se
testeaza conditia. Daca conditia este adevarata se executa blocul de instructiuni. Se efectueaza a treia
parte i=i+1 apoi se verifica din nou conditia si, daca aceasta este adevarata se executa din nou
25
instructiunile. Acest ciclu se repeta pana cand condtia devine falsa. Operatorul ; (punct si virgula)
este de asemenea folosit, dupa cum se observa si din exemplul de mai sus pentru a separa partile unei
structuri for.
++ de incrementare
-- de decrementare
+= de adunare la
-= de scadere din
*= inmultire cu
26
/= impartire cu
Pentru operatorii unari avem nevoie de o singura variabila cu care se opereaza. In imaginile de mai
jos aveti exemple de folosire a operatorilor de incrementare si decrementare. Operatorii de
incrementare si decrementare pot si postfixati sau prefixati. In cazul in care sunt prefixati (adica pusi
inaintea variabilei cu care se opereaza) atunci au prioritate in fata altor operatii care se executa, daca
sunt postfixati (pusi dupa variabila cu care se opereaza) atunci operatia de inrementare/decrementare
se face dupa o alta operatie.
Incrementarea este operatia de adunare cu 1 a unei valori.
Decrementarea este operatia de scadere cu 1 a unei valori.
b=5+0, adica ia valoarea 5. Dupa executia instructiunii b=b++ + a++ variabila a va avea valoarea 1 si
varaibila b va avea valoarea 6;
27
In exemplul de mai sus, deoarece operatorii sunt prefixati, inainte se executa incrementarea iar apoi
restul operatiilor, deci, intai b este facut 6, si a devine 1 apoi de face adunarea 6+1=7
28
29
2.10 Erori
Intotdeauna exista posibilitatea de a intalni erori in scrierea programelor. In general datorita
neatentiei puteti intampina urmatoarele tipuri de erori:
de sintaxa
de logica
Erorile de sintaxa sunt erori ce apar ca urmare a scrierii unei sintaxe gresite. Nerespectarea oricarei
reguli de sintaxa duce la o eroare de compilare. Practic la intampinarea oricarei erori de sintaxa
programul nu va compila. Mediul de programare indica linia pe care apare eroarea si rolul
programatorului este de a o corecta.
30
In exemplul de mai sus, datorita faptului ca a fost scris cu litera mica String compilatorul nu intelege
sinaxa si afiseaza o eroare.
Erorile de logica sunt erori ce apar in executie. In cazul erorilor de logica programul este scris
corect si poate fi executat insa rezultatul nu este cel asteptat. Acest lucru se poate intampla cand
algoritmul ales nu a fost gandit corect.
31
Inaintea cuvantului cheie class se pot pune modificatori. Despre modificatori vom discuta in acest
curs in lectiile urmatoare.
public class Program{
}
Acoladele (in engleza braces) incadreaza blocul de cod al unei clase. In clasa se pot defini si
initializa zone de memorie, se pot defini metode si chiar putem crea alte clase. Alte instructiuni nu
pot fi facute direct intre acoladele ce incadreaza blocul de cod al unei clase.
O clasa precedata la definitie de modificatorul de acces public trebuie scrisa intr-un fisier care sa
aiba numele acestei clase (va aminesc faptul ca limbajul face diferenta intre litere mari si litere mici)
si extensia .java; Intr-un fisier cu extensia .java nu pot exista mai multe clase definite public. Clase
care nu sunt precedate de acest modificator pot fi puse mai multe in acelas fisier .java; Un fisier cu
extensia .java trebuie sa contina macar o clasa publica;
32
Nu puteau fi definite ambele clase public. Observati in imaginile de mai sus ca numele fisierului este
dat de numele clasei public.
33
Atributele pot fi zone de memorie primitive sau alte instante de obiecte; Acesta este primul mod in
care doua instante de obiecte pot interactiona (De exemplu: obiectul masina are patru instante ale
obiectului roata).
Comportamentul unui obiect este reprezentat de metode numite metode de instanta;
Descrierea unui obiect prin atributele sale:
Standard atributele unui obiect sunt primele scrise in clasa; De exemplu sa presupunem ca vrem sa
programam o minge; Iata cateva atribute care ar putea descrie acest obiect:
String culoare
double greutate
double presiuneInterna
Pentru a defini acest obiect trebuie sa construim clasa Minge care sa contina aceste zone de memorie.
3.3 Comportamente
Metodele reprezinta blocuri de instructiuni care sunt definite si pot fi apelate ulterior de oricate ori
este nevoie. Aceste blocuri de instructiuni sunt identificate printr-un nume si pot primi informatii
pentru executie (numite parametrii sau argumente) avand si posibilitate de a oferi informatii utile la
34
finalizare (informatiile oferite la finalul executiei unei metode se numeste date returnate). Iata cum
se poate defini o metoda:
35
Observati ca la scrierea unei metode parametrii sunt considrati valori cunoscute. Acestea vor fi date
in momentul in care se face apelul metodei. Parametrii scrisi la definirea unei metode se numesc
parametri formali, in timp ce parametrii dati la apel se vor numi parametri efectivi. Metoda de mai
jos primeste doua numere reale prin parametrii si returneaza suma lor.
Instructiunea return este responsabila de returnarea valorii. In cazul acesta valoarea este suma celor
doua numere date prin parametri. Intotdeauna tipul datei returnate trebuie sa corespunda cu tipul
metodei. In exemplul de mai sus este definit corect, deoarece suma a doua numere reale nu poate fi
36
decat un numar tot real. Un aspect imporant este faptul ca o metoda nu poate returna decat o vaoare.
Odata apelata instructiunea return metoda isi incheie activitatea. Chiar daca ar mai exista alte
instructiuni dupa return acestea nu ar fi executate.
37
38
Constructorul poate fi considerat o metoda mai speciala. Aceasta nu are tip la definire. Constuctorul
este folosit in primul rand pentru a defini o instanta a clasei in care este scris si de asemenea ca
instructiuni ale constructorului putem scrie linii de cod care sa se execute la creare instantei. De
exemplu am putea da valori atributelor instantei in momentul crearii lor. Constructorul are
intotdeauna acelasi nume cu al clasei in care se afla si poate primi parametri care sunt considetati
pentru instructiuni valori cunoscute. Orice clasa are un constructor denumit constructor implicit, care
nu primeste parametri si nu executa nimic, dar cu ajutorul caruia se pot crea instante ale clasei. Odata
definit un alt constructor in clasa, constuctorul implicit nu mai exista.
39
Valorile date la creare instantei puse in zona de memorie p1 se numesc valori efecive. La apelul
constructorului se vor executa si instructiunile acestuia care vor face ca numele insantei sa fie "Tom"
si greutatea 3.5; Constructorul se scrie standard dupa definirea atributelor clasei.
40
41
Apelul comportamentelor:
42
Un atribut este o valoare individuala a unei instante. Asta inseamna ca doua instante ale clasei Pisica
pot avea sau nu aceeasi culoare. Spunem ca doua instante sunt egale daca valorile atributelor lor sunt
egale.
43
Rezulatul va fi ultima valoare atribuita lui z, deoarece z este acelasi si pentru p1 si pentru p2 si poate
fi accesat prin dereferentiere din clasa.(Rezultat 9)
44
45
Daca variabila este definita direct in interiorul clasei ea este accesibila de catre toate metodele din
clasa. Daca este definita intr-o metoda sau o structura atunci variabila este vizibila numai local, in
structura care o defineste. Daca exista o variabila globala si una locala cu acelasi nume atunci cea
accesata este intotdeauna cea mai locala. Prin urmare exista posibilitatea de a defini variabile cu
acelasi nume doar daca sunt in domenii de vizibilitate diferite.
46
In cazul de mai sus este exemplificat modul de definire global si local al variabilelor. In structura
while, variabila x folosita este cea definita in interiorul structurii. Acea variabila este vizibila numai
in structura while, fiind inaccesibila in afara acesteia.
O variabila definita local nu are valoare implicita. Folosirea acesteia in operatii fara a-i atibui o
valoare duce la aparitia unei erori de sintaxa.
Variabilele definite global (precum atributele) au valori implicite in functie de tipul de data:
Pentru:
47
Supraincarcarea este un procedeu care se poate aplica si constructorilor. Constructorii oricum sunt
fortati sa aiba acelasi nume cu al clasei. Asadar folosind supraincarcarea in cazul constructorilor
sinugurul lucru care trebuie avut in vedere este definirea folosind parametrii diferiti ca in cazul
metodelor.
48
Clasa de mai sus defineste un constructor si redefineste constructorul implicit. Constructorul implicit
nu mai exista in cazul definirii unui alt constructor asa cum am vazut deja, insa prin supraincarcare
poate fi redefinit si constructorul implicit.
3.10 Tablouri
Un tablou reprezinta o colectie de variabile de acelasi tip. Exista pozibilitatea de a defini o structura
de un numar definit de variabile de un anumit tip. Aceste tipuri de structui de date se numesc tablouri
(in engleza arrays).
Clasificam tablourile dupa numarul lor de dimensiuni:
unidimensionale - vectori
bidimensionale - matrice
pluridimensionale
Tablouri unidimensionale:
49
In exemplul de mai sus este definit un vector (tablou cu o singura dimensiune) cu dimensiunea de
lungime 100 de tipul int si cu identificatorul a. Fiecare element al acestei structuri este identificat
pintr-un index de tip int. Indecsii incep de la valoarea 0 si sunt crescatori, astfel ca ultimul index al
unui tablou va avea intotdeauna valoarea lungimii tabloului minus unu. Cum putem folosi o variabila
a unui vector:
50
Parcurgerea unui vector se poate face folosind o structura repetitva for, deoarece indecsii se gasesc
intotdeauna intr-un interval continuu de numere.
Cum variabila i ia valori intre 0 si 99 aceasta ia pe rand toate valorile indecsilor. Astfel ca fiecare
variabila a tabloului in cazul de mai sus este instantiata cu exact valoare indexului care o reprezinta.
Exemplul de mai sus demonstreaza modul in care se poate folosi o variabila ca valoare dinamica a
indexului.
Tablouri bidimensionale:
51
Deoarece o matrice are doua dimensiuni parcurgerea se poate face folosind doua structuri de control
for imbricate.
Tablouri pluridimensionale:
52
53
In exemplul de mai sus parametrii poarta acelasi nume cu atributele. Deoarece parametrii sunt
variabile locale iar atribuele clasei sunt varibile globale, in functie prin x si y vor fi apelati numai
parametrii. Pentru a putea accesa insa aributele clasei ne putem referi la acestea prin this.x respectiv
this.y; In felul acesta se face dereferentiere din instanta care este construita (this);
In cazul de mai jos, deoarece se face referire la this dintr-un comportament this reprezinta instanta
care isi executa comportamentul. Nu uitati ca this nu poate fi accesat din metode statice sau contexte
statice.
54
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.
55
Odata definita enumerarea Zi exista tipul de data Zi care poate lua valorile: luni, marti, miercuri, joi,
vineri, sambata, duminica
56
Rezultat: marti
57
58
In cazul de mai sus, in variabila ziua1 de tip Zi se pune folosind metoda values() fiecare valoare a
enumerarii. In blocul de instructiuni a structurii de control for se poate face ceva mai apoi cu
valoarea preluata in variabila. In cazul exemplului de mai sus aceasta este afisata pe o linie noua in
consola. Astfel sunt afisate pe linii separate fiecare valoare din enumerare.
Folosirea in structura switch:
59
60
In cazul in care vor fi folosite mai multe clase ce apartin unui pachet, se poate preciza importul
tuturor claselor inlocuind numele in sintaxa import cu *. In exemplul de mai jos sunt importate toate
clasele pachetului java.awt;
Este posibil ca un pachet sa contina subpachete. In cazul in care se intampla acest lucru, pentru a
folosi orice clasa din subpachet este necesar importul separat. Sa presupunem ca exista subpachetul
java.awt.event; Daca in clasa sunt importate toate clasele din pachetul java.awt, nu sunt automat
importate si cele din java.awt.event. Pentru a importa clasele din java.awt.event, acest lucru se va
face separat.
61
Toate clasele definite intr-un proiect BlueJ sunt parte a unui singur pachet.
public
protected
private
Acestia se plaseaza la definirea unui membru al unei clase (zona de memorie sau metoda) si
precizeaza cine poate accesa acel membru.
public este modificatorul care permite accesul oricui si oriunde. Daca o zona de memorie sau metoda
este facuta public atunci aceasta poate fi accesata de orice clasa a aplicatiei, din orice pachet.
62
private este modficatorul care restrange accesul la un membru numai in interiorul clasei. Doar clasa
care defineste acea zona de memorie/metoda are accesa la ea.
63
protected este modul in care un membru poate fi accesat numai de clasa care il defineste sau de
clasa care mosteneste clasa ce il defineste. Mostenirea este prezentata in acest modul il lectiile
urmatoare.
In cazul in care nu se precizeaza un modificator de acces, membrul este considerat a fi in modul
default care permite accesul la membrul respectiv similar cu public, dar numai la nivelul pachetului.
In exemplele din imaginile de mai sus sunt prezentati modificatorii numai pentru variabile, in acelasi
mod acestia pot fi folositi si pentru constante sau metode.
64
Prin conventie identificatorii mutatorilor incep cu cuvantul set si continua cu numele variabilei pentu
care sunt construiti. Identificatorii accesorilor incep cu cuvantul get si sunt urmati de numele
65
variabilei pentru care sunt definiti pentru toate tiprile de date mai putin boolean. Pentru variabile de
tip boolean idntificatorul accesorului incepe standard cu is.
66
Clasa Cerc defineste un tip de Forma. Clasa Cerc mosteneste clasa Forma, preluand membrul
neprivat nume.
67
Un membru privat nu poate fi mostenit. Daca modificatorul de vizibilitate al membrului nume din
clasa Forma este facut private, variabila nu va mai fi mostenita:
68
In Java, o clasa nu poate mosteni maxim decat o singura alta clasa, dar poate fi mostenita de oricate
clase.
Clasa mostenita se mai numeste si clasa superioara. Clasa care mosteneste se mai numeste si clasa
copil.
69
Rezolvarea este cuvantul cheie super. Similar cu this, instanta super este instanta clasei mostenite.
Se poate face referire la membrii clasei mostenite prin instanta super.
70
71
Fara apelul explicit al lui super() rezultatul este o eroare de compilare deoarece constructorul implicit
nu este definit in clasa Forma.
72
73
74
In felul acesta, clasa care mosteneste poate sa isi rescrie comportamentele propriilor membri.
75
Daca in acest moment clasa Cerc moteneste clasa Forma dar nu suprascrie metoda arie() care este
abstracta, compilatorul nu va permite asamblarea codului.
76
77
dar prin ceea ce se numeste polimorfism pot fi adaugate instante ale claselor copii intr-o zona de
memorie a clasei superioare.
De asemenea, trebuie cunoscut fapul ca se pot defini zone de memorie ale unei clase abstracte, dar
clasa nu poate fi instantiata. Imaginea urmatoare prezinta o sintaxa corecta:
78
Procedeul de mostenire abstracta este foarte important si folosit in aplicatii. Acesta presupune o
sintaxa de suprascriere a metodelor abstracte sau modificare a prototipului clasei doar pentru
definirea unei instante:
79
Practic, doar pentru instanta forma de mai sus, aria va fi intotdeauna 5. Procedeul de mostenire
abstracta poate fi folosit si pentru clase neabstracte. Pentru instanta creata pot fi scrise
comportamente noi sau suprascrise comportamente abstracte sau neabstracte.
Imaginea de mai sus prezinta modul in care am adauga un nou comportament instantei.
80
81
Interfata Acvatic defineste numai comportamente specifice unui animal acvatic. Deoarece rechinul
este un animal acvatic, clasa Rechin va trebui sa implementeze ambele interfete.
Clasa Rechin trebuie sa suprascrie si metodele abstracte mostenite de la intefata Acvatic. Mai jos este
modul in care BlueJ afiseaza diagrama pentru mostenire multipla a interfetelor.
82
Daca clasa Rechin ar fi trebuit in acelasi timp sa si mosteneasca o alta clasa, de exemplu cu numele
Clasa atunci sintaxa ar fi aratat:
Totusi nu poate defini instante. Exsta si aici un procedeu numit implementare abstracta, similar cu
mostenirea abstracta din cazul claselor abstracte discutate in lectia anterioara. Implementarea
83
abstracta permite suprascrierea metodelor publice ale interfetei si crearea unei instante in felul
acesta:
Polimorfismul este aplicabil si in cazul interfetelor: O zona de memorie dintr-o interfata mostenita
poate contine instate ale clasei ce o mosteneste, daca clasa ce o mosteneste nu este abstracta:
84
Atentie totusi, in cazul polimorfismului, instanta nu va avea decat comportamentele definite in zona
de memorie in care este stocata. De exemplu, pentru cazul de mai sus, rechinul nu va sti decat sa
inoate.
Interfetele sunt importante, deoarece acestea reprezinta modul de separare a dezvoltarii aplicatiei de
design-ul modelului acesteia.
85
Clasa care va implementa interfata Vampir va trebui sa suprascrie metodele din interfata, inclusiv
cele mostenite pentru a ramane neabstracta.
86
Clasa nu poate fi mostenita si nu poate fi abstracta. Urmatoarele doua imagini prezinta sintaxe
gresite:
87
88
In descrierea unei clase alese pot fi identificate sintaxe ale constructorilor care pot fi folositi,
metodelor statice sau non-statice si constantelor sau campurilor neprivate.
89
In imaginea de mai sus se poate observa ca Math nu are definiti constructori. Spre deosebire de
exemplu de clasa String:
90
Unii constructori sau unele metode sunt catalogate ca deprecated. Acestea pot fi folosite dar nu se
recomanda folosirea lor.
Folosind manualul de API-uri se poate vedea cum functioneaza orice constructor sau metoda, daca o
metoda este sau nu statica, ce tip de data returneaza, ce si cati parametri primeste... etc.
Din cele trei pachete enumerate mai sus vor fi discutate clasele:
java.lang
clase wrapper
String
StringBuffer
System
Math
java.util
Scanner
Random
Date
TimeZone
GregorianCalendar
java.io
File
InputStreamReader
BufferedReader
91
PrinStream
FileInputStream
FileOutputStream
ObjectInputStream
ObjectOutputStream
Atributul primitiv definit in aceste clase este definit final. Tratand primitivele ca obiecte, clasele
wrapper definesc comportamente cu care se poate lucra pe valorile date.
De exemplu, o modalitate usoara de a transforma o valoare numerica stocata intr-o variabila de tip
String intr-o zona de memorie de tip int este folosirea metodei statice parseInt() din clasa Integer.
92
Similar, poate fi folosita de exemplu metoda cu numele parseDouble() definita static in clasa Double:
Metoda isDigit(char ch) verifica daca un caracter dat ca parametru este cifra:
93
5.3 java.lang.String
Clasa String trateaza ca obiect un vector de caractere. Intr-o zona de memorie de tip String poate fi
stocat un sir de caractere. Exista doua modalitati de a stoca un sir de caractere intr-o zona de
memorie de tip String. Prin folosirea unui constructor sau prin aribuire directa folosind operatorul =
Este o diferenta intre atribuire directa si folosirea operatorului new. In cazul folosirii operatorului
new, daca sirul de caracterea a mai fost anterior adaugat se creaza doar o referinta. Astfel, in
exemplul de mai sus sunt doar trei zone de memorie alocate pentru cele patru siruri.
Instantele String nu sunt folosite pentru prelucrarea sirurilor de caractere ci pentru valori fixe,
nemodificabile. Pentru valori ce urmeaza a fi prelucrate sau modificate este folosita clasa
StringBuffer.
94
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
95
Metoda random() este singura care nu primeste parametri. Poate fi folosita pentru obtinerea unei
valori aleatoare in intervalul [0,1]:
96
In general pentru obtinerea valorilor aleatoare nu este folosita metoda random() din clasa Math ci
clasa Random din pachetul java.util:
97
Odata creata o instanta de Random pot fi folosite comportamentele acesteia pentru a genera valori
aleatoare de diferite tipuri:
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:
5.6 java.util.Scanner
Clasa Scanner definita in pachetul java.util poate fi folosita pentru crearea unui flux de citire. La
crearea unei instante este trimis ca parametru instanta de flux de intrare sau fisierul din care urmeaza
sa se faca citirea. Prin folosirea comportamentelor instantei pot fi citite diferite tipuri de date. In
exemplul de mai jos este citit un sir de caractere care urmeaza sa fie afisat o linie mai jos:
99
Dupa executia aplicatiei poate fi pornit terminalul prin apasarea combinatiei de taste Ctrl-T
Tot folosind clasa Scanner, pot fi citite din consola si valori numerice. Aplicatia din exemplul de mai
jos asteapta introducerea pe linii separate a doua numere carora le afisaza suma:
100
5.7 Exceptii
Exceptiile reprezinta erori ce apar in timpul executiei programului, datorita unor conflicte ce nu pot
fi interpretate de masina virtuala. De exemplu este posibil ca datorita modului in care este construita
aplicatia cat si a modului in care este folosita in mediul de executie sa se intample ca anumiti
parametri sa fie trimisi incorect catre o metoda sau un constructor, un anumit fisier catre care sa se
incerce accesul sa nu fi accesibil, sau pur si simplu sa se incerce efectuarea unui calcul neinteles de
101
sistem (o impartire la 0). Toate acestea reprezinta exceptii, erori ce duc la blocarea aplicatiei in cazul
in care sistemul nu stie cum sa se comporte cand sunt intalnite. Modul in care programul este instruit
ce trebuie sa faca in cazul in care este intalnit un anumit tip de exceptie se numeste tratarea
exceptiilor.
Exista doua moduri generale de tratare a exceptiilor:
Prin folosirea primei metode try-catch-finally pot fi date programului instructiuni exacte despre
tratarea oricarui tip de exceptie ce poate sa apara. In blocul de instructiuni try sunt puse instructiunile
ce pot arunca exceptii. Pentru blocul try trebuie scris cel putin un bloc de instructiuni catch sau
finally. Blocul de instructiuni catch primeste ca parametru un tip de exceptie si instructiunile care
trebuiesc executate in cazul acelui tip de exceptie. Blocul finally este scris pentru a se executa fie ca
a fost sau nu a fost aruncata o exceptie.
Exceptiile sunt definite de clase. Toate clasele care definesc un tip de exceptie mostenesc clasa
Exception din pachetul java.lang, din acest motiv clasa Exception poate fi folosita pentru a specifica
toate tipurile de exceptii. Exemple de clase care reprezinta exceptii sunt:
NumberFormatException
IOException
ArrayOutOfBoundsException
SQLException
NoSuchClassException
NoSuchAlgorithmException
In exemplul de mai jos este folosit blocul catch pentru a trata o exceptie aruncata in try;
102
finally nu poate fi folosit pentru tratarea exceptiei. Acesta se va executa chiar daca nu se arunca o
exceptie:
Chiar daca conversia a fost efectuata, si de aceasta data este afisat mesajul:
103
104
Pot fi folosite mai multe blocuri catch pentru a trata mai multe tipuri de exceptii separat; De exemplu
in cazul de mai jos este tratata exceptia de tip NumberFormatException aruncata de apelul metodei
parseInt() dar si NullPointerException aruncata de incercarea de folosire a unui comportament pe o
zona de memorie null;
Nu pot fi definite mai multe blocuri catch care trateaza aceeasi exceptie. Acest lucru se aplica si in
cazul in care unul dintre blocuri tratraza toate exceptiile folosind clasa Exception:
105
Exceptiile pot fi tratate de catre o metoda si prin folosirea cuvantului cheie throws. Acesta se scrie
dupa parantezele parametrilor si este urmat de clasele exceptiilor care trebuiesc tratate, separate prin
virgula. Nici in acest caz nu este permisa tratarea de mai multe ori a aceleiasi exceptii.
106
107
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.
108
Metoda close() este folosita pentru inchiderea fluxului. Aceasta poate fi folosita pentru fluxuri de
intrare sau de iesire.
5.9 Serializare
Fluxurile de date pot fi clasificate in:
Serializarea este procesul de impartire a unei instante de obiect in octeti pentru trimiterea acesteia
printr-un flux. Pentru a putea salva de exemplu un fisier instanta unui obiect aceasta trebuie sa fie
seriala. Pentru a fi seriala clasa care o defineste trebuie sa implementeze interfata Serializable din
pachetul java.io, dar si clasele care definesc instante ce reprezinta atribute ale acestei clase trebuie de
asemenea sa implementeze aceasta interfata. In exemplul de mai jos este definita clasa Pisica si se
incearca din metoda principala salvarea unei instante de Pisica si citirea acesteia mai apoi dintr-un
fisier cu numele pisica.dat.
109
Fluxrile pentru citirea si scrierea instantelor de obiecte seriale se numsc ObjectInputStream pentru
intrare, respectiv ObjectOutputStream pentru iesire. Acestea primesc ca parametru o instanta de flux
low-level, de exemplu pentru scriere in fisier FileInputStream respectiv FileOutputStream;
Comportamentele folosite pentru citire si scriere sunt:
110
Pentru a specifica faptul ca un atribut nu trebuie salvat se poate folosi modificatorul transient:
Se observa ca valoarea varstei nu a mai fot salvata. Instanta p2 are acum valoare implicita pentru
tipul int;
111
TimeZone
SimpleTimeZone
Calendar
GregorianCalendar
Date
De exemplu afisarea informatiilor despre ora locala in Bucuresti se poate face conform exemplului
de mai jos:
112
Pot fi afisate toate informatiile privitoare la timp folosind similar oricare dintre constantele din
interfata Calendar:
ERA
YEAR
MONTH
WEEK_OF_YEAR
113
WEEK_OF_MONTH
DATE
DAY_OF_MONTH
DAY_OF_YEAR
DAY_OF_WEEK
DAY_OF_WEEK_IN_MONTH
AM_PM
HOUR
HOUR_OF_DAY
MINUTE
SECOND
MILLISECOND
ZONE_OFFSET
DST_OFFSET
114
Recapitulare - exercitii
o
2.
3.
4.
5.
6.
o
115
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
117
drawLine(int x1,int y1, int x2,int y2) - pentru desenarea unui segment de dreapta definit de
punctele de coordonate A(x1,x2) si B(y1,y2);
drawString(String line, int x,int y) - pentru desenarea unui sir de caractere la coordonarele x,y
drawRect(int x,int y, int l,int h) - pentru desenarea unui dreptunghi cu coltul stanga sus la
coordonatele x,y si o anumita latime l si inaltime h
drawOval(int x,int y, int l,int h) - pentru desenarea unei elipse perfect icadrata de
dreptunghiul cu coordonatele date ca in metoda drawRect
setColor(Color c) - pentru setarea unei culori de desenare
118
119
Culorile cunoscute sunt deja definite si reprezinta constante in clasa Color; Acestea pot fi accesate
prin dereferentiere:
Color.red
Color.blue
Color.yellow
Color.green
Color.violet
120
121
122
123
Button()
Button(String s)
Exemple:
Adaugarea oricarei componente pe Applet se face cu metoda add(Component c) mostenita din clasa
Applet;
Exemplu:
Button b = new Button("Butonul meu");
add(b); // adaugarea butonului
Nu uitati ca adaugarea oricarei componente se face prin suprascrierea metodei init()
124
FlowLayout.LEFT
125
FlowLayout.CENTER
FlowLayout.RIGHT
BorderLayout.CENTER
BorderLayout.NORTH (pentru partea de sus)
BorderLayout.SOUTH (pentru partea de jos)
BorderLayout.WEST (pentru stanga)
BorderLayout.EAST (pentru dreapta)
Exemplu:
add(b, BorderLayout.NORTH) // unde b este un buton spre exemplu
Pentru GridLayout cosntrucotrul este GridLayout(int a,int b); a reprezinta numarul de linii si b
numarul de coloane ale gridului; O componeta se adauga dupa setarea gridului cu metoda add cu un
singur parametru si va completa intotdeauna urmatoarea casuta libera a gridului de la stanga la
dreapta de sus in jos;
126
7.7 Panouri
Panourile sunt componente de tip container. Acestea sunt folosite in formatarea interfetei grafice
prin adaugarea pe alte containere in influenta diferitilor manageri de pozitionare; Clasa Panel din
java.awt defineste aceste componente dupa constructorii:
Panel();
Panel(LayoutManaget lm)
127
128
129
TextArea se construieste:
Exemple:
130
setText(String s)
Pentru TextArea se poate adauga text la continutul actual prin metoda append(String s);
131
132
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
133
134
135
8.3 MouseListener
MouseListener este interfata care contine metodele ce trebuiesc suprascrise pentru cinci evenimente
diferite ce pot fi executate cu ajutorul mouseului pe o componente oarecare:
voidmouseClicked(MouseEvent e)
Pentru click cu mouseul pe o componenta
voidmouseEntered(MouseEvent e)
Pentru intrarea cu cursorul pe o componenta
voidmouseExited(MouseEvent e)
Pentru iesirea de pe o componenta a cursorului
mousePressed(MouseEvent e)
Pentru apasarea unui buton
mouseReleased(MouseEvent e)
Pentru eliberarea unui buton
136
8.4 MouseMotionListener
Interfata MouseMotionListener contine metode care trebuiesc suprascrise pentru evenimente de
miscare ale mouseului:
Pentru a atasa un astfel de ascultator pentru oriceare dintre aceste doua metode folosim metoda
addMouseMotionListener();
137
8.5 MouseEvent
MouseEvent este clase care defineste un eveniment specific mouseului; Instante de MouseEvent sunt
trimise aproape pentru fiecare tip de eveniment specific mouseului; Din acest motiv voi arata cateva
comportamente ale acestui obiect care pot fi folosite in aplicatii;
getButton() - returneaza o constanta din care poate fi aflat butonul de pe mouse de pe care s-a
apasat
getClickCount() - returneaza numarul de click-uri single-click, double-click ... etc sub forma
unui int
getModifiersEx() - returneaza sub forma unui int tastele care au fost tinute apasat atunci cand
s-a facut click cu mouse-ul "ctrl", "shift", "ctrl-shift" ...etc
getMouseModifiersText(int mod) - traduce numarul care reprezinta tastele tinute apasat la
click in siruri de caractere care reprezinta exact numele tastelor ca mai sus
getPoint() - returneaza un Point reprezentad locatia cursorului pe componenta
getX() - returneaza coordonata X a punctului in care se afla cursorul relativ la componenta
getY() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la componenta
getXOnScreen() - returneaza coordonata X a punctului in care se alfa cursorul relativ la ecran
getYOnScreen() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la ecran
138
BUTTON1
BUTTON2
BUTTON3
NOBUTTON
Valoarea returnata de metoda se compara cu una din constante si se afla in felul acesta de pe ce
buton s-a apasat sau in cazul in care evenimentul nu a fost creat de catre mouse acesta va fi egal cu
NOBUTTON;
mouseWheelMoved(MouseWheelEvent ev)
139
8.7 MouseAdapter
Folosirea interfetelor prezentate in lectiile anterioare are un dezavantaj semnificativ; De exemplu
pentru interfata MouseListener daca dorim sa folosim doar evenimentul Click adica metoda
mouseClicked(MouseEvent ev) atunci va trebui oricum sa le suprascriem si pe celelalte 5 metode;
MouseAdapter este o clasa care ne scapa de munca nefolositoare de suprascriere a acestor metode de
fiecare data cand folsim un eveniment; Aceasta clasa poate fi folosita pentru oricare dintre
evenimentele prezentate in lectiile antorioare referitoare la mouse sau la rotita mouseului; Cu alte
cuvinte in locul interfetelor descrise anterior vom folosi doar clasa MouseAdapter; Totusi va trebui
sa pastram in functie de tipul evenimentului ascultatorul corespunzator:
addMouseListener()
addMouseMotionListener()
addMouseWheelListener()
Fiind o clasa care suprascrie metodele in toate celelalte interfete, la folosirea MouseAdapter nu mai
este nevoie sa suprascrem decat metodele care ne sunt necesare (cele pe care le folosim);
140
141
componentAdded(ContainerEvent e)
Aruncat cand s-a adaugat o componenta pe
container
componentRemoved(ContainerEvent e)
Aruncat cand a fost scoasa o componenta de
pe container
8.9 TextListener
Metoda textValueChanged(TextEvent ev) este suprascrisa pentru evenimentul invocat atunci cand in
componenta text pe care am atasat ascultatorul este modificat continutul; Pentru a executa
instructiuni la modificarea continutului unei componente text trebuie sa folosimt interfata
TextListener si sa suprascriem metoda textValueChanged();
142
windowIconified(WindowEvent e)
Apelata la iconificarea unei
ferestre
windowLostFocus(WindowEvent e)
Apelata atunci cand fereastra
pierde focusul
windowOpened(WindowEvent e)
Apelata la deschiderea ferestrei;
windowStateChanged(WindowEvent e)
Apelata la modificarea starii
ferestrei;
143
144
setSize(int w, int h)
setLocation(int x, int y)
setBounds(int x, int y,int h,int w)
setResizable(boolean state)
setIconImage(Image i)
Metoda add(Component c) este folosita pentru a adauga pe fereastra o componenta exact ca in cazul
Appleturilor; Metoda add() este mostenita din clasa Container;
145
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;
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
147
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;
public JPanel()
public JPanel(LayoutManger lm)
9.8 JScrollPane
JScrollPane este o componenta folosita pentru adaugarea de bare de defilare pentru o alta compoenta
care ar putea depasi dimensiunile containerului in care este adaugata; Instanta JScrollPane nu este
folosita in actiunile directe pe care le are componente pe care o sustine; La construire instantei i se da
o componenta pentru care este creata si pe care adauga bare de defilare (scrollbars); Apoi instanta
JScrollPane este adaugata pe container in locul componentei din instanta JScrollPane;
148
Exemplu:
JTextArea ta = new JTextArea(4.5);
JScrollPane jsp = new JScrollPane(ta);
add(jsp);
ta.setText("Un text");
149
150
Clasa Animal defineste un prototip ce are ca atribut un tip generic (abstrct / neprecizat la definire):
151
In acest fel se spune ca atributul clasei generice este dinamic. Atributul generic poate lua orice tip,
atata timp cat va fi precizat la instantiere:
152
Datorita faptului ca sunt neprecizate ca prototip, tipurile generice nu pot face parte din tipuri statice.
Acestea pot fi tratate in clasa doar ca atribute (tipuri non-statice). De asemenea nu poate fi instantiata
o matrice de tipuri generice:
Tipurile generice pot fi folosite in parametrii metodelor non-statice dar si ca tipuri de return:
153
O clasa poate defini mai multe tipuri generice. Acestea vor fi separate prin virgula:
154
La instantiere:
155
Tipul generic in acest caz poate fi instantiat cu orice clasa ce mosteneste JPanel:
156
Totusi, spre deosebire de ultimul exemplu (clasa Animal), tipul generic nu mai poate fi dat de orice
clasa:
157
Un tip generic poate fi mostenit la definire. In acest fel poate fi creata o dependinta intre tipurile
generice ale unei clase:
158
10.3 Colectii
Pachetul java.util ofera un set de interfete si clase numite Java Collections Framework cu ajutorul
carora, instante de diferite tipuri pot fi grupate in entitati numite colectii asupra carora se pot efectua
algoritmi. Cele mai importante interfete si clase din Java Collections Framework sunt:
Interfete:
Collection
List
Set
Queue
SortedSet
NavigableSet
Map
SortedMap
NavigableMap
Clase:
HashSet
ArrayList
Vector
LinkedList
TreeSet
Hashtable
HashMap
TreeMap
Clase de algoritmi:
Arrays
Collections
159
160
Interfata Set defineste o colectie similara unei multimi matematice. Un obiect poate fi adaugat sau
scos din colectie. Colectia nu permite adaugarea elementelor egale (pentru care metoda equals()
returneaza true). De asemenea poate fi verificat faptul ca un element apartine unui Set.
Interfata Map defineste doua tipuri generice K si V. K se numeste key (cheie) si V se numeste value
(valoare). Colectia atribuie unei chei un element ca valoare.
161
Interfata Queue defineste o interfata similara unei structuri de coada. Queue contine metode care
adauga un element la capatul cozii, care preia primul element din coada si il sterge sau care doar
preia primul element din coada. O coada functioneaza standard pe principiul FIFO (First In First
Out).
162
10.5 List
Pentru instantierea unei liste este folosita una dintre clasele:
ArrayList - folosita in principal pentru parcurgeri rapide, aceasta clasa defineste ceva similar
unei matrici care poate creste dinamic.
Vector - una dintre cele mai vechi colectii Java. Este similara cu ArrayList dar metodele
definite de aceasta clasa sunt sincronizate pentru siguranta apelului in fire de executie
separate
LinkedList - Similara unei liste inlantuite. Fiecare element are legatura cu doi vecini. Clasa
poate fi usor folsita pentru implementarea structurilor de coada si stiva.
163
164
Clasa LinkedList:
Instantele LinkedList pot fi de asemenea folosite cu o zona de memorie a interfetei List pentru a
restrage metodele la cele ale interfetei. De asemenea clasa poate fi instantiata in propria zona de
memorie ce ofera posibilitatea accesului si la alte metode comportament specifice:
add(E e);
addFirst(E e);
addLast(E e);
getFirst();
getLast()
removeFirst()
removeLast()
10.6 Set
Interfata Set nu permite duplicate in elementle adaugate colectiei. Pentru instantiere este folosita una
dintre clasele:
HashSet
LinkedHashSet
TreeSet
Clasa HashSet foloseste un hash pentru identificarea elementelor. Clasa poate fi folosita pentru
definirea unei colectii care nu ordoneaza elementele si nu permite duplicat in inregistrari.
166
167
Se poate observa din exemplu ca elementele nu sunt ordonate cat si ca acestea nu pot fi adaugate
duplicat.
Clasa LinkedHashSet defineste o structura HashSet in care elementele sunt ordonate. Elementele
vor fi afisate in ordinea introducerii.
168
169
Clasa TreeSet descrie o colectie de tip set sortata. O colectie sortata aranjeaza elementele la
introducere dupa un algoritm. TreeSet este un arbore binar echilibrat. Algoritmul dupa care
elementele sunt ordonate este Red-Black Tree.
170
171
10.7 Map
Collectia de tipul Map identifica printr-o cheie unica valori adaugate. Fiecare element este o pereche
"key-value". Clasele care pot fi folosite pentru a crea o astfel de colectie sunt:
HashMap
Hashtable
LinkedHashMap
TreeMap
HashMap este cea mai simpla colectie de tip Map. Aceasta nu sorteaza si nu ordoneaza elementele.
172
Se observa faptul ca elementele nu sunt ordonate dupa adaugare si nici sortate. Cheile pot fi obinute
si parcurse cu un Iterator. Cheia este unica, prin urmare in functie de aceasta poate fi preluata
valoarea.
Clasa Hashtable este, similar clasei Vector, una dintre cele mai vechi clasedin Java API. In prezenta
versiune, clasa defineste o tabela de dispersie similar clasei HashMap, dar ofera metode sincronizate
pentru folosirea colectiilor din mai multe fire de executie in desfasurare.
Colectia LinkedHashMap este similara colectiei HashMap, dar ordoneaza elementele dupa ordinea
introducerii:
173
174
175
176
Ordonare inversa:
177
Amestecarea (shuffle):
178
179
180
Rotatia elementelor:
Initial:
181
182
183
184
Dupa crearea unei instante a unui fir de executie, pentru a porni firul de executie se apeleaza metoda
start(), comportament al instantei firului de executie mostenit de la clasa Thread.
185
Ultimul exemplu, din imaginea de mai sus reprezinta un program cu trei fire de executie. Unul este
firul principal de executie din care sunt pornite alte doua. instructiunile celor trei fire de executie
dupa pornirea fiecaruia se desfasoara simultan, independent unul de celalalt.
Metoda sleep() , definita static in clasa Thread poate fi folosita pentru adormirea firului de executie
timp de un numar de milisecunde. Exista urmatoarele doua supraincarcari ale metodei sleep():
sleep(int milisecunde)
sleep(int milisecunde, int nanosecunde)
In exemplul de mai jos, firul de executie este adormit 300 milisecunde dupa fiecare iteratie a ciclului
for. Metoda arunca o exceptie de tip InterruptedException, care trebuie tratata pentru apelul metodei;
186
187
Se poate crea instanta Thread pe baza instantei Runnable (fereastra care implementeaza Runnable),
iar apoi firul poate fi pornit cu metoda start().
188