Sunteți pe pagina 1din 139

1.

Introducere n limbajul de programare Java

1.1. Ce este Java?

o insul din Indonezia (126 650 km,

65 mil. locuitori)

un jargon american pentru cafea

o platform i un limbaj de programare orientat pe obiecte


Utilizarea Internetului ca mediu pentru difuzarea de informaii, dar i de
programe, conduce la ideea de numitor comun, de platform comun pentru care s
fie dezvoltate aplicaiile.
Costurile implementrii de aplicaii pot s scad spectaculos dac nu sunt
necesare adaptri de soluii pentru fiecare tip sau versiune hardware sau de sistem
de operare existent n lume.

1.2. Limbajul de programare Java

Java este un limbaj de programare de nivel nalt, dezvoltat de JavaSoft,


companie n cadrul firmei Sun Microsystems. Dintre caracteristicile principale ale
limbajului amintim:
simplitate Java este uor de nvat, caracteristicile complicate
(suprancrcarea operatorilor, motenirea multipl, abloane) ntlnite n
alte limbaje de programare sunt eliminate.

1
robustee, elimin sursele frecvente de erori ce apar n programare prin
eliminarea pointerilor, administrarea automat a memoriei i eliminarea
fisurilor de memorie printr-o procedur de colectare a 'gunoiului' care
ruleaz n fundal. Un program Java care a trecut de compilare are
proprietatea c la execuia sa nu "crap sistemul".
complet orientat pe obiecte - elimin complet stilul de programare
procedural; se bazeaz pe ncapsulare, motenire, polimorfism
uurin n ceea ce privete programarea n reea
securitate, este cel mai sigur limbaj de programare disponibil n acest
moment, asigurnd mecanisme stricte de securitate a programelor
concretizate prin: verificarea dinamic a codului pentru detectarea
secvenelor periculoase, impunerea unor reguli stricte pentru rularea
programelor lansate pe calculatoare aflate la distanta, etc
este neutru din punct de vedere arhitectural
portabilitate, cu alte cuvinte Java este un limbaj independent de
platforma de lucru, aceeai aplicaie rulnd, fr nici o modificare, pe
sisteme diferite cum ar fi Windows, UNIX sau Macintosh, lucru care aduce
economii substaniale firmelor care dezvolt aplicaii pentru Internet.
Sloganul de baz este: Write once, run anywhere
compilat i interpretat
asigur o performan ridicat a codului de octei
conine o librrie de clase i interfee pentru domenii specifice cum ar fi
programarea interfeelor utilizator (JFC, AWT, Swing), programare
distribuit (comunicare TCP/IP, CORBA, RMI etc.)
permite programarea cu fire de execuie (multithreaded)
dinamicitate
este modelat dup C i C++, trecerea de la C / C++ la Java fcndu-se
foarte uor.
face diferena ntre literele mici i mari (este case sensitive)
permite dezvoltarea aplicaiilor pentru Internet crearea unor
documente Web mbuntite cu animaie i multimedia.
Java Development Kit (JDK) este disponibil gratis

2
1.3. Java : un limbaj compilat i interpretat

n funcie de modul de execuie al programelor, limbajele de programare se


mpart n dou categorii :
interpretate: instruciunile sunt citite linie cu linie de un program numit
interpretor i traduse n instruciuni main; avantaj: simplitate;
dezavantaj: viteza de execuie redus;
compilate: codul surs al programelor este transformat de compilator ntr-
un cod ce poate fi executat direct de procesor; avantaj: execuie rapid;
dezavantaj: lipsa portabilitii, codul compilat ntr-un format de nivel sczut
nu poate fi rulat dect pe platforma pe care a fost compilat.
Programele Java sunt att interpretate ct i compilate
Codul de octei este diferit de codul main. Codul main este reprezentat de
o succesiune de 0 i 1; codurile de octei sunt seturi de instruciuni care seamn cu
codul scris n limbaj de asamblare. Codul main este executat direct de ctre
procesor i poate fi folosit numai pe platforma pe care a fost creat; codul de octei
este interpretat de mediul Java i de aceea poate fi rulat pe orice platform care
folosete mediul de execuie Java.
Fazele prin care trece un program Java sunt:
Cod sursa Java -> (compilare) -> Cod de octeti ->
(interpretare)

1.4. Istoria limbajului Java

1991: n cadrul companiei Sun Microsystems ncepe dezvoltarea unui proiect


pentru aparatur electronic inteligent conectat n reea.

1992: ncepe dezvoltarea limbajului de programare Oak (James Gosling);

1993: devine disponibil primul browser WWW (World Wide Web) Mosaic;
dezvoltarea unui web-browser (Webrunner), capabil s ncarce i s execute
programe mici scrise n Oak;

1994: Oak este redenumit Java iar Webrunner, HotJava

1995: Netscape (fondat de cei care au dezvoltat Mosaic-ul) decide s integreze


Java n Netscape Navigator 2.0

3
ianuarie 1996 : apare JDK 1.0 (soft gratuit);

februarie1997: apare JDK 1.1;

martie 1997: apar HotJava 1.0 i JavaOS 1.0;

1998 Java Foundation Classes JVC released, incluznd Swing 1.0

dup 1999 apar versiuni noi ale JDK

n prezent s-a ajuns la JDK1.4.

1.5. Mediul Java


n acest curs se utilizeaz distribuia JDK 1.3 (Java Development Kit), produs
de firma Sun.
Exist dou posibiliti de a lucra n Java: n linie de comand paii fiind
indicai mai jos, sau folosind un editor Java cum ar fi JCreator, Eclipse, etc.
Realizarea unui program Java const n urmtorii pai:
Editarea programului ntr-un editor de texte;
Salvarea programului sub numele NumeClasa.java unde NumeClasa este
numele clasei care conine metoda main(). ntr-un program Java trebuie s
existe o singur clas care s conin o metod main(). Cu alte cuvinte, numele
clasei trebuie s coincid cu numele fiierului. Extensia fiierului este .java
Compilarea programului se face cu ajutorul comenzii
javac NumeClasa.java

Executarea programului se face cu ajutorul comenzii


java NumeClasa

1.6. Crearea unei aplicaii simple

1. Scrierea codului surs:


class Salut {
public static void main(String args[]) {
System.out.println("Salut !!!");
}
}

4
Toate aplicaiile Java conin o clas principal n care trebuie s se gseasc
metoda main(). Clasele aplicaiei se pot gsi fie ntr-un singur fiier, fie n mai
multe.

2. Salvarea fiierelor surs


Se va face n fiiere cu extensia .java. Fiierul care conine codul surs al
clasei principale trebuie s aib acelai nume cu clasa principal a aplicaiei (clasa
care conine metoda main). Prin urmare, fiierul nostru o s-l salvm sub numele:
Salut.java

3. Compilarea aplicaiei
Se folosete compilatorul Java, javac. Apelul compilatorului se face pentru
fiierul ce conine clasa principal a aplicaiei. Compilatorul creeaz cte un fiier
separat pentru fiecare clas a programului; acestea au extensia .class i sunt
plasate n acelai director cu fiierele surs. Rezultatul comenzii
javac Salut.java
este fiierul Salut.class

4. Rularea aplicaiei
Se face cu interpretorul java, apelat pentru unitatea de compilare
corespunztoare clasei principale, fiind ns omis extensia .class asociat
acesteia.
java Salut

Rularea unei aplicaii care nu folosete interfa grafic, se va face ntr-o fereastr
sistem.

1.7. Crearea unui applet

Crearea structurii de fiiere i compilarea applet-urilor sunt identice ca n cazul


aplicaiilor. Difer n schimb structura programului i modul de rulare al acestuia.

1. Scrierea codului surs:


import javax.swing.*;
import java.awt.*;

public class Salut extends JApplet {


public void paint(Graphics g){

5
g.drawString("Salut",50,50);
}
}
2. Salvarea fiierelor surs
Salvarea se va face n fiierul Salut.java

3. Compilarea applet-ului
javac Salut.java
n urma compilrii rezult fiierul Salut.class

4. Rularea applet-ului
Applet-urile nu ruleaz independent. Ele pot fi rulate doar prin intermediul unui
browser: Internet Explorer, Netscape sau printr-un program special cum ar fi
appletviewer-ul din setul JDK.
Crearea unui fiier HTML pentru miniaplicaie (exemplu.html)
<html>
<head>
<title>Primul Applet Java</title>
</head>
<body>
<applet code=Salut.class width=400 height=400>
</applet>
</body>
</html>

5. Vizualizarea applet-tlui
appletviewer exemplu.html

6
2. Programarea Orientat pe Obiecte i Java

2.1. Obiecte i clase

Programarea Orientat pe Obiecte (OOP) este una dintre cele mai mari idei de
programare aprut n anii 1990. Ideea central a OOP este: organizarea
programelor astfel nct ele s reprezinte un ecou al modului n care lucrurile sunt
puse mpreun n lumea real.
Exemplu:
Pentru cine nu s-a jucat niciodat cu Lego, acesta const n diferite buci de
plastic, de diferite culori i dimensiuni. Ele sunt dotate cu crescturi i adncituri prin
intermediul crora piesele pot fi conectate ntre ele. Cu diferite componente Lego se
poate forma aproape orice: maini, oameni, castele, case, etc. n funcie de
imaginaia fiecruia. Fiecare pies de Lego este un mic obiect care mpreun cu
altele ajut la crearea altor obiecte mai mari. Exact aa stau lucrurile i n
programarea orientat pe obiecte: obiecte mici puse mpreun formeaz obiecte
mari.
Programarea orientat pe obiecte este gndit dup modelul lumii reale
obiectele sunt adesea formate din mai multe tipuri de obiecte mici.
Cnd scriem programe ntr-un limbaj orientat pe obiecte, nu definim obiecte ci
clase de obiecte, unde o clas reprezint un ablon pentru mai multe obiecte cu
caracteristici similare. Clasele ntrupeaz toate caracteristicile unei mulimi
particulare de obiecte. De exemplu, ne putem gndi la clasa Copac care descrie
caracteristicile tuturor copacilor (au rdcini, trunchi i frunze, cresc, produc clorofil,
i schimb frunzele, etc). Clasa Copac reprezint un model abstract pentru
conceptul de copac pentru a planta un copac, a-l atinge, a-i rupe o frunz sau a-l
tia avem nevoie de un copac concret, altfel spus de o instan a copacului.
Bineneles c, odat ce avem clasa copac, putem crea oricte instane diferite ale
copacului respectiv copaci concrei. Acetia pot avea caracteristici diferite (unii
sunt nali, alii pitici, unii i pierd frunzele toamna, alii nu, etc)

7
O alt noiune specific OOP este cea de obiect. Obiect sau instan a clasei
reprezint acelai lucru. Clasa este reprezentarea general a unui obiect iar
instana /obiectul este reprezentarea concret a clasei.

2.2. Atribute i comportamente

Fiecare clas scris n Java are dou caracteristici de baz: atribute i


comportament.

2.2.1. Atribute

Atributele difereniaz obiectele ntre ele i determin aparena, starea sau alte
caliti ale obiectului n cauz. Dac ne gndim s crem o clas Main, ea ar
trebui s includ urmtoarele atribute: culoare, stil, marc.
Atributele sunt definite n clase ca variabile. Tipul i numele variabilelor
sunt definite n clase i fiecare obiect are valori proprii pentru fiecare atribut.
Deoarece fiecare instan a clasei poate avea valori diferite pentru variabilele sale,
aceste variabile se mai numesc i variabile instan.

8
Exemplu: O instan a clasei main, MainaMea ar putea avea urmtoarele
valori pentru atribute:
culoare = alb
stil = elegant
marc = Mercedes
Exist, de asemenea, i un alt tip de variabile numite variabile clas.
Diferena dintre cele dou tipuri de variabile este aceea c valorile variabilelor
instan sunt pstrate n instane i se schimb pentru fiecare instan iar valorile
variabilelor clas sunt pstrate n clas i nu se schimb pentru fiecare instan.
Asupra diferenei dintre cele dou tipuri de variabile o s revin ntr-un capitol
urmtor.

2.2.2. Comportament

Comportamentul unei clase determin cum opereaz o instan a unei clase.


De exemplu, cum reacioneaz un obiect atunci cnd un alt obiect sau o alt clas i
cere s fac ceva. S revenim la clasa Main. Comportamentul unei maini const
n: pornete, oprete, frneaz, schimb viteza, schimb
direcia, etc.
Pentru a defini comportamentul unei clase se definesc metode, echivalentul
funciilor sau procedurilor din alte limbaje de programare. Spre diferen de alte
limbaje de programare, n Java nu se pot defini funcii n afara claselor. Prin urmare,
metodele sunt funcii definite n interiorul claselor care opereaz n instanele
claselor respective.
Metoda unui obiect poate fi apelat de ctre un alt obiect sau o alt clas.
Ca i n cazul atributelor, exist dou tipuri de metode: metode instan i
metode clas. Metodele instan opereaz doar n cadrul instanei unei clase. n
schimb, metodele clas opereaz n interiorul clasei.

2.3. Principiile OOP

Obiectul este o variabil care are o structura i o stare. Fiecare obiect dispune
de operaii prin intermediul crora i se poate manipula starea.

9
Obiectul trebuie privit ca o unitate atomic pe care utilizatorul nu ar trebui s o
disece. De exemplu, cnd lucrm cu numere ntregi, nu ne punem problema
reprezentrii lor. Utilizatorul nu are acces direct la prile constituente ale unui obiect
sau la implementarea sa; acestea vor putea fi accesate doar prin intermediul
metodelor care au fost furnizate mpreun cu obiectul. Gruparea datelor i a
operaiilor care pot fi efectuate asupra acestor date, avnd grij ca detaliile de
implementare s fie ascunse, poarta numele de ncapsulare.
Unul din principalele scopuri ale OOP este refolosirea codului. Limbajele de
programare orientate pe obiecte furnizeaz mai multe mecanisme n acest scop.
1. Folosirea codului generic dac implementarea este identic, i difer
doar tipul de baz al obiectului, nu este necesar rescrierea complet a
codului se scrie un cod generic care funcioneaz pentru orice tip. De
exemplu, se poate scrie o metod care s ordoneze un ir de numere ntregi,
caractere, iruri de caractere.
2. Motenirea este un mecanism care permite extinderea funcionalitii unei
clase. Se pot crea noi tipuri de date care s extind (sau s restricioneze)
proprietile tipului de date original.
3. Polimorfismul Un tip referin polimorfic poate s refere obiecte de mai
multe tipuri. Atunci cnd se apeleaz o metod a tipului polimorfic, se va
selecta automat metoda care corespunde tipului referit n acel moment.

10
3. Elementele de baz ale limbajului de
programare Java

3.1. Structura lexical a limbajului

3.1.1. Setul de caractere

Limbajului Java folosete setul de caractere Unicode. Este un standard


internaional care nglobeaz setul de caractere ASCII (permite reprezentarea a 256
de caractere). Folosete pentru reprezentarea caracterelor 2 octei, ceea ce
nseamn c se pot reprezenta 65536 de semne. Primele 256 caractere Unicode
corespund celor din ASCII. Referirea la un caracter se face prin \uxxxx, unde xxxx
reprezint codul caracterului.
Exemple:
\u0030 - \u0039 : cifre ISO-Latin 0 - 9
\u0660 - \u0669 : cifre arabic-indic 0 - 9
\u4e00 - \u9fff : litere din alfabetul Han (Chinez, Japonez,
Coreean)

3.1.2. Cuvinte cheie

Cuvintele rezervate n Java sunt cele din C++, cu cteva excepii.

3.1.3. Identificatori

Sunt secvene nelimitate de litere i cifre Unicode, ncepnd cu o liter.


Identificatorii nu au voie s fie identici cu cuvintele rezervate.

3.1.4. Constante

Constantele pot fi de urmtoarele tipuri


1. constante ntregi

11
Sunt acceptate 3 baze de numeraie : baza 10, baza 16 (ncep cu
caracterele 0x) i baza 8 (ncep cu cifra 0) i pot fi de dou tipuri:
normale, (se reprezint pe 4 octei - 32 bii)
lungi (8 octei - 64 bii): se termin cu caracterul L (sau l).
2. constante reale
Pentru ca o constant s fie considerat real ea trebuie s aib cel puin
o zecimal dup virgul, s fie n notaie exponenial sau s aib sufixul F sau f
pentru valorile normale (reprezentate pe 32 bii), respectiv D sau d pentru valorile
lungi (reprezentate pe 64 bii).

3. constante logice
true : valoarea boolean de adevr
false : valoarea boolean de fals
Observaie: spre deosebire de C++, constantele ntregi 1 i 0 nu mai au rolul
de adevrat i fals.
4. constante caracter
O constant de tip caracter este utilizat pentru a exprima caracterele
codului Unicode. Reprezentarea se face fie folosind o liter, fie o secven
escape scris ntre apostrofuri. Secvenele escape permit reprezentarea
caracterelor care nu au reprezentare grafic i reprezentarea unor caractere
speciale precum backslash, apostrof, etc. Secvene escape predefinite n Java:

Cod Secvena Escape Caracter


\u0008 '\b' Backspace(BS)
\u0009 '\t' Tab orizontal (HT)
\u000a '\n' Linie nou - linefeed (LF)
\u000c '\f' Pagin nou - formfeed (FF)
\u000d '\r' nceput de rnd (CR)
\u0022 '\"' Ghilimele
\u0027 '\'' Apostrof
\u005c '\\' Backslash
\u0008 '\b' Backspace(BS)

12
5. constante iruri de caractere
Un ir de caractere este format din zero sau mai multe caractere cuprinse
ntre ghilimele. Caracterele care formeaz irul de caractere pot fi caractere
grafice sau secvene escape. Dac irul este prea lung el poate fi scris ca o
concatenare de subiruri de dimensiune mai mic. Concatenarea irurilor se face
cu operatorul + ("Ana " + " are " + " mere "). irul vid este "". Dup
cum vom vedea, orice ir este de fapt, o instan a clasei String, definit n
pachetul java.lang.

3.1.5. Separatori

Un separator este un caracter care indic sfritul unei uniti lexicale i


nceputul alteia. n Java separatorii sunt urmtorii: ( ) { } [ ] ; , . Instruciunile unui
program se separ cu ;.

3.1.6. Operatori

1. operator de atribuire: = (semnul egal)


Exemplu: a=9 (lui a i se atribuie valoarea 9)
Operatorii de atribuire pot fi nlnuii. De exemplu: a=b=c=10
2. operatori aritmetici binari: +, -, *, /, %
Exemplu: s=a+b
n Java exist forme prescurtate care cuprind operatorul de atribuire i un
operator aritmetic binar. Operatorii prescurtai sunt:+=, -=, *=, /=, %=
Exemplu: n += 2 este echivalent cu n=n+2
3. operatori aritmetici unari: +, -, ++ (operator de incrementare), -- (operator de
decrementare). Operatorii de incrementare i decrementare pot fi prefixai (++x
sau --x) sau postfixai (x++ sau x--). Diferena dintre operatorii prefixai i cei
postfixai este semnificativ doar atunci cnd expresia de incrementare /
decrementare apare n cadrul unei expresii. Exemplele urmtoare vor evidenia
aceste lucruri.
Exemple:
a) -x reprezint opusul lui x

13
b) int x=5,y=7;
x++; // x primeste valoarea 6
y--; // y primeste valoarea 6
c) int x=5,y=7;
++x; // x primeste valoarea 6
--y; // y primeste valoarea 6
d) int x=5,y;
y=x++; // y primeste valoarea 5, x primeste
valoarea 6
e) int x=5,y;
y=x--; // y primeste valoarea 5, x primeste
valoarea 4
f) int x=5,y;
y=++x; // x primeste valoarea 6, y primeste
valoarea 6
g) int x=5,y;
y=--x; // x primeste valoarea 4, y primeste
valoarea 4

Observaii: n exemplele b i c nu se observ nici o diferen ntre


operatorii postfixai i cei prefixai deoarece ei nu sunt folosii n cadrul altor
expresii. n exemplele d i f, respectiv, e i g se observ c x primete aceeai
valoare dar y are valori diferite. n exemplele d i e sunt folosii operatorii
postfixai de incrementare i decrementare care se comport astfel: valoarea
variabilei asupra creia acioneaz operatorul postfixat (n cazul nostru x)
particip la evaluarea expresiei din care face parte (y primete valoarea lui x)
dup care se aplic operatorul (valoarea lui x crete / scade cu o unitate). n
exemplele f i g sunt folosii operatorii prefixai de incrementare i decrementare
care se comport astfel: valoarea variabilei asupra creia acioneaz operatorul
postfixat (n cazul nostru x) i schimb valoarea (valoarea lui x crete / scade cu
o unitate), noua valoare participnd la evaluarea expresiei din care face parte (y
primete noua valoare a lui x).
4. operatori logici: &&(and), ||(or), !(not)
Observaie: evaluarea expresiilor logice se face prin scurtcircuitare
(evaluarea se oprete n momentul n care valoarea de adevr a expresiei este
sigur determinat)
5. operatori relaionali: <, <=, >, >=, ==, !=
6. operatori pe bii: & (and), |(or), ^(xor), ~(not)
7. operatori de translaie: <<, >>, >>> (shift-are la dreapta fr semn)

14
8. operatorul condiional: ? : . Are forma:
expresie_logica ? expresie1 : expresie2

Valoarea expresiei este dat de expresie1 dac expresie_logic


este true sau de expresie2 dac expresie_logic este false.
Exemplu: Metoda de calculul minimului a dou numere este:
public int min (int a, int b){
return a<b?a:b;
}

9. operatorul , (virgula) este folosit pentru evaluarea secvenial a operaiilor


Exemplu: int x=0, y=1, z=2; (x=1,y=a=10,c=1)
10. operatorul + pentru concatenarea irurilor:
String s="abcd"
int x=100;
System.out.println(s + " - " + x); //afiseaza abcd-100

11. operatorul de conversie de tip (cast) este: (tip_de_data)


int i = 200;
long l = (long)i; //conversie prin extensie
long l2 = (long)200;
int i2 = (int)l2; // conversie prin contractie

Exemplu 1: Fie programul

public class Operator{


public static void main(String args[]){
int a=2, b=3,c;
c=a+b;
System.out.println(a+" "+b+" "+c);
a++; --b;
System.out.println(a+" "+b+" "+c);
c=++a+b++;
System.out.println(a+" "+b+" "+c);
a/=2;b*=2;
System.out.println(a+" "+b+" "+c);
c=a-- + --b;
System.out.println(a+" "+b+" "+c);
c=b=(a+=1);
System.out.println(a+" "+b+" "+c);
}
}

15
Rezultatul afiat este:
2 3 5
3 2 5
4 3 6
2 6 6
1 5 7
2 2 2

Exemplu 2: Fie programul


public class OpLogic{
public static void main(String args[]){
byte a=0;
System.out.println("Primul if");
if ((a!=0) && ((1/a)<1))
System.out.println("Ambele conditii sunt adevarate");
else
System.out.println("O conditie este falsa");
System.out.println("Al doilea if");
if ((1/a<1) && (a!=0))
System.out.println("Ambele conditii sunt adevarate");
else
System.out.println("O conditie este falsa");
}
}

Rezultatul afiat este:


Primul if
O conditie este falsa
Al doilea if
Exception in thread main java.lang.ArithmeticException:
/ by zero at OpLogic.main(OpLogic.java:11)

Explicaia se gsete n modul n care sunt evaluate expresiile logice (prin


scurtcircuitare). n primul if se evalueaz expresia a!=0 care are valoarea false.
Indiferent de rezultatul celei de-a doua expresii, rezultatul final va fi false. Prin
urmare, evaluarea ntregii expresii se oprete dup evaluarea lui a!=0, ceea ce
urmeaz dup nu mai conteaz. n al doilea if, evaluarea ncepe tot cu prima
expresie, i anume 1/a<1. Dar, ea nu poate fi evaluat deoarece 1/a nu are sens
(a fiind 0) i, este generat o excepie. Din nou, nu se ajunge la evaluarea celei de a
doua expresii.

16
3.1.7. Comentarii

n Java exist trei feluri de comentarii:


Comentarii pe o singur linie: ncep cu //.
Comentarii pe mai multe linii, nchise ntre /* i */.
Comentarii pe mai multe linii care formeaz documentaia, nchise ntre /** i
**/. Textul dintre cele dou secvene este automat mutat n documentaia
aplicaiei de ctre generatorul automat de documentaie javadoc.
Observaii:
1. nu pot fi scrise comentarii n interiorul altor comentarii.
2. nu pot fi introduse comentarii n interiorul constantelor caracter sau ir de
caractere.
3. secvenele /* i */ pot s apar pe aceeai linie cu secvena // dar i pierd
semnificaia; la fel se ntmpl cu secvena // n comentarii care ncep cu /*
sau /**.

3.2. Tipuri de date

n Java tipurile de date se mpart n dou categorii:


tipuri primitive de date
tipuri referin.
Java pornete de la premiza c "orice este un obiect". Prin urmare, tipurile de
date ar trebui s fie de fapt definite de clase i toate variabilele ar trebui s
memoreze de fapt instane (obiecte) ale acestor clase. n principiu acest lucru este
adevrat, ns, pentru uurina programrii, mai exist i aa numitele tipuri
primitive de date, care sunt cele uzuale:
1. tipuri ntregi
Tip de date Dimensiune n octei Domeniu
Byte 1 -128 .. 127
Short 2 -32768 .. 32767
-2147483648 ..
Int 4
2147483647
Long 8 -263 .. 263-1

17
2. tipuri reale
Tip de date Dimensiune n octei Domeniu
float 4 -1046 .. 1038
double 8 -10324 .. 10308

3. tipul caracter: char memorat pe 2 octei


4. tipul boolean: are dou valori true i false
n alte limbaje formatul i dimensiunea tipurilor primitive de date folosite ntr-un
program pot depinde de platforma pe care ruleaz programul. n Java acest lucru nu
mai este valabil, Java fiind independent de platform.
Vectorii, clasele i interfeele sunt tipuri referin. Valoarea unei variabile de
acest tip este, spre diferen de tipurile primitive, o referin (adres de memorie)
ctre valoarea sau mulimea de valori reprezentat de variabila respectiv.
Exist trei tipuri de date C care nu sunt suportate de limbajul Java: pointer,
struct i union. Pointerii au fost eliminai din cauza c erau o surs constant de
erori, locul lor fiind luat de tipul referin, iar struct i union nu i mai au rostul att
timp ct tipurile compuse de date sunt formate n Java prin intermediul claselor.

3.3. Variabile

Variabilele pot avea ca tip fie un tip primitiv de dat, fie o referin la un obiect.
Declararea variabilelor se face prin:
tip_de_date nume_variabila

Iniializarea variabilelor se face prin:


nume_variabila = valoare

Declararea i iniializarea variabilelor pot fi fcute n acelai moment:


tip_de_date nume_variabila = valoare

Declararea constantelor se face prin:


final tip_de_date nume_variabila

18
Exemple:
int a; a=5;
final double PI = 3.14;
int valoare = 100;
long numarElemente = 12345678L;
String floare = "frezie";

n funcie de locul n care sunt declarate, variabilele se mpart n urmtoarele


categorii:

1. Variabile membru, declarate n interiorul unei clase, vizibile pentru toate


metodele clasei respective i pentru alte clase n funcie de modificatorul lor
de acces
2. Variabile locale, declarate ntr-o metod sau ntr-un bloc de cod, vizibile
doar n metoda / blocul respectiv
3. Parametrii metodelor, vizibili doar n metoda respectiv
4. Parametrii de la tratarea excepiilor
Imaginea urmtoare ilustreaz tipurile de variabile i parametrii mpreun cu
domeniul lor de vizibilitate.

19
public class Nume_Clasa

{
...
declararea variabilelor membru
public void Metoda (parametrii metodei)

declararea variabilelor locale



catch (parametrii de la tratarea
excepiilor)
{

}


}

}

Observaie: Variabilele declarate ntr-un for, rmn locale corpului ciclului. De


exemplu:
for(int i=0; i<100; i++) { }
int i; //posibil n Java, eroare n C++

3.4. Instruciuni

3.4.1. Instruciunea vid

Este format din ;.

3.4.2. Instruciuni de decizie

1. Instruciunea ifelse are forma:


if (expresie_logic)
instruciuni1

20
else
instruciuni2
instruciuni

Dac expresie_logic are valoarea true atunci se execut instruciuni1, altfel


se execut instruciuni2. Expresie_logic este obligatoriu s fie cuprins ntre
paranteze. Dac pe una din ramuri sunt mai multe instruciuni ele trebuie s fie
cuprinse ntre acolade {}. Ramura
else
instruciuni2
poate s lipseasc.

Exemplu 3: S se calculeze maximul a dou numere.


1. public class Maxim
2. { public static void main(String args[])
3. {int a=12, b=5,m;
4. if (a>b)
5. m=a;
6. else
7. m=b;
8. System.out.println("Maximul dintre "+a+" si "+b+" este: "+m);
9. }
10. }

Exemplu 4: S se rezolve ecuaia de gradul I ax+b=0 cunoscnd coeficienii a i b.


1. public class ecGrI
2. { public static void main(String args[])
3. {int a=12, b=5;
4. System.out.print("Ecuatia: "+a+"x+"+b+"=0");
5. if (a==0)
6. if (b==0)
7. System.out.println(" are o infinitate de solutii");
8. else
9. System.out.println(" nu are solutii");
10. else { double x =-(double)b/a;
11. System.out.println(" are solutia "+x);
11. }
12. }
13. }

n exemplu 4 au fost folosite if-uri imbricate. Pe linia 10 a fost folosit


operatorul de conversie pentru ca rezultatul mpririi s se fie numr real. Dac

21
acest operator nu ar fi fost folosit, mprirea ar fi fost efectuat ntre doi operanzi
ntregi i, prin urmare, rezultatul ar fi fost numr ntreg.

2. Instruciunea switch are forma:


switch (expresie_selectare){
case val_1: instruciune_1; break;
case val_2: instruciune_2; break;
. . .
case val_i: instruciune_i; break;
. . .
case val_n: instruciune_n; break;
default: instruciune;
}
Instruciunea switch selecteaz dintre mai multe secvene de cod una care
va fi executat. Se evalueaz expresie_selectare; rezultatul obinut se compar
pe rnd cu val_1, val_2, ..., val_n. Dac se ntlnete o valoare val_i pentru
care se obine egalitate (expresie_selectare = val_i ) se execut
instruciunile instruciune_i. Altfel, (dac nu are loc nici o egalitate) se execut
instruciunile de pe ramura default.
Instruciune break ntlnit pe fiecare ramur are rolul de a ntrerupe execuia
instruciunii switch dup ce au fost executate instruciunile aferente ramurii alese.
Dac instruciunea break lipsete atunci se execut i instruciunile de pe
urmtoarele ramuri pn la ntlnirea primului break.

Exemplu 5: Se citete de la tastatur un caracter reprezentnd un operator: +, ,


* sau /. n funcie de operatorul citit s se fac suma, diferena, nmulirea sau
mprirea celor dou numere a i b.
1. public class Operatii{
2. public static void main(String args[]){
3. double a=12, b=5, r=0;
4. char oper=' ';
5. try{
6. System.out.println("Introduceti operatorul");
7. oper=(char)System.in.read();
8. }
9. catch(Exception e){}
10. switch (oper) {
11. case '+':
12. r=a+b; break;
13. case '-':
14. r=a-b; break;

22
15. case '*':
16. r=a*b; break;
17. case '/':
18. r=a/b; break;
19. default:
20. System.out.println("Operator invalid");
21. System.exit(1);
22. }
23. System.out.println(a+" "+oper+" "+b+" = "+r);
24. }
25. }

n linia 7 se citete un caracter de la tastatur memorat n oper i, n funcie de


el se execut instruciunile de pe liniile 12, 14, 16, 18 sau 20-21. Instruciunile de pe
liniile 20-21 se execut doar n cazul n care nu a fost introdus un operator corect.

Exemplu 6: S se spun dac un numr dat mai mic dect 10 este par sau impar.
1. public class ParImpar{
2. public static void main(String args[]){
3. int x=2;
4. switch (x) {
5. case 0:
6. case 2:
7. case 4:
8. case 6:
9. case 8:
10. System.out.println(x+" este numar par");break;
11. default:
12. System.out.println(x+" este numar impar");
13. }
14. }
15. }

n exemplul precedent ne intereseaz ca aceeai instruciune, cea din linia 9


s fie executat pentru mai multe potriviri. n acest caz, sunt folosite mai multe linii
de case fr nici un rezultat, instruciunea switch executnd prima instruciune
ntlnit dup gsirea potrivirii. Prin urmare, instruciunea break nu apare pe nici
una din liniile 5, 6, 7,8.

3.4.3. Instruciuni repetitive

23
1. Instruciunea for repet un bloc de instruciuni ct timp o condiie este
adevrat. n general, se cunoate de la nceput de cte ori urmeaz s se
execute blocul de instruciuni. Are forma general:
for (iniializare; test; incrementare)
instruciuni
unde:
iniializare este o expresie care iniializeaz variabila de control a
instruciunii for
test este o expresie boolean evaluat naintea fiecrei reluri a buclei; ct
timp valoarea ei este true blocul de instruciuni se execut. Cnd valoarea
ei este false, se prsete instruciunea for.
incrementare este o expresie care modific variabila de control a
instruciunii for.
Oricare dintre cele trei pri constituente ale instruciunii for poate s
lipseasc.
for ( ; ; )

n acest caz se obine o bucl infinit. Pentru a evita acest lucru este necesar
ca n cadrul blocului de instruciuni s existe o condiie de oprire.
De asemenea, blocul de instruciuni poate s lipseasc, el fiind nlocuit de
instruciunea vid. Exemplul 8 de mai jos ilustreaz aceast situaie.

Exemplu 7: S se calculeze n! unde n este iniializat n program.


2. public class Factorial{
3. public static void main(String args[]){
4. long f=1;
5. int n=15;
6. for(int i=2; i<=n; i++)
7. f*=i; //f=f*i;
8. System.out.println(n+"!="+f);
9. }
10. }

Exemplu 8: S se calculeze n! unde n este iniializat n program.


1. public class Factorial{
2. public static void main(String args[]){
3. long f=1;
4. int n=15;
5. for(int i=2; i<=n; f*=i, i++)

24
6. ;
7. System.out.println(n+"!="+f);
8. }
9. }

Dup cum se poate remarca, pe linia 6 este folosit instruciunea vid


deoarece codul f*=i a fost mutat n cadrul prii de incrementare.
O alt observaie ar fi c, oricare dintre prile constituente ale instruciunii for
poate fi format din mai multe instruciuni. Acest lucru este ilustrat n programul
urmtor.

Exemplu 9:
1. public class Factorial{
2. public static void main(String args[]){
3. long f, LimSup;
4. int n=10,i;
5. LimSup=(long)Math.pow(2,63);
6. for(i=2,f=1; i<=n && f<=LimSup/i; f*=i,i++)
7. ;
8. if (i==n+1)
9. System.out.println(n+"!="+f);
10. else
11. System.out.println(n+"!=este prea mare pentru puterile mele");
12. }
13. }

n linia 5 este calculat numrul maxim reprezentabil, de tip long. n for,


iniializm dou variabile i=2,f=1. Test-ul este format din dou condiii unite prin
&&. Incrementarea este, de asemenea, format din dou instruciuni f*=i,i++.

11. Instruciunea while are forma:


while (condiie)
instruciuni
Instruciunea while este folosit pentru a repeta execuia unui grup de
instruciuni atta timp ct condiie are valoare true.

Exemplu 10: S se calculeze suma cifrelor unui numr.


1. public class SumCifNr{
2. public static void main(String args[]){
3. long x=12345,xInit=x;

25
4. int s=0;
5. while(x>0){
6. s+=x%10;
7. x/=10;
8. }
9. System.out.println("Suma cifrelor numarului "+xInit+"
este: "+s);
10. }
11. }

Instruciunea while se mai numete i instruciune cu test iniial. Dac la prima


evaluarea a condiiei aceasta are valoarea false instruciunile din corpul
while-ului nu se execut niciodat. n exemplul precedent, dac iniializm x cu 0,
condiia x>0 este fals i se continu cu instruciunea din linia 9.

12. Instruciunea do-while are forma:


do{
instruciuni
}while (condiie);

Ca i while, instruciunea do-while este folosit pentru a repeta execuia


unui grup de instruciuni atta timp ct condiie are valoare true. Diferena dintre
cele dou instruciuni este c, dac la while se executau instruciunile doar dac
condiie era adevrat, n cazul lui do-while blocul de instruciuni se execut
cel puin o dat dup care se verific valoarea condiiei.
Instruciunea do-while se mai numete i instruciune cu test final.

Exemplu 11: S se calculeze cel mai mare divizor comun a dou numere a i b.
1. public class Cmmdc{
2. public static void main(String args[]){
3. long a=54,b=68,r;
4. System.out.print("Cmmdc-ul numerelor "+a+" si "+b+"
este: ");
5. do{
6. r=a%b;
7. a=b;
8. b=r;
9. }while(r>0);
10. System.out.println(a);
11. }
12. }

26
13. Instruciunea break
break
Este folosit pentru prsirea forat a corpurilor instruciunilor repetitive (for,
while, do-while).

Exemplu 12: S se caute un numr cuprins n intervalul [a,b].


1. public class ExBreak{
2. public static void main(String args[]){
3. int a=10, b=20, x;
4. while(true){
5. x=(int)(Math.random()*b);
6. if ( (a<=x) && (x<=b) )
7. break;
8. }
9. System.out.println(x);
10. }
11. }

n linia 5 se genereaz aleator un numr ntreg mai mic dect b. Dac numrul
este cuprins n intervalul [a,b] se prsete instruciunea while.
Dac instruciunea break este plasat n cadrul mai multor instruciuni
repetitive imbricate, ea are ca efect prsirea doar a instruciuni care o conine.
Exemplu:
1. for(...){
2. ...
3. for(...){
4. ...
5. break;
6. ...
7. }
8. ...
9. }

Efectul instruciunii break este prsirea for-ului din linia 3, execuia


continundu-se cu instruciunile de pe linia 8.

14. Instruciunea continue


Are ca efect ntreruperea execuiei iteraiei curente i trecerea la iteraia
urmtoare.

27
Exemplu 13: Urmtorul cod afieaz toate caracterele citite cu excepia cifrelor de la
0 la 9.
1. public class ExContinue{
2. public static void main(String args[]){
3. for(int i=0; i<=10; i++){
4. char c=' ';
5. try{
6. c=(char)System.in.read();
7. }
8. catch(Exception e){}
9. if ( ('0'<=c) && (c<='9') )
10. continue;
11. System.out.print(c+" ");
12. }
13. }
14. }

n cazul n care se citete o cifr, se execut instruciunea continue de pe


linia 10, nu se mai execut linia 11 i se sare direct la linia 3.
Observaie: Instruciunile break i continue pot s apar doar n cadrul unor
instruciuni repetitive. Excepie face instruciunea break care poate s apar i n
cadrul instruciunii switch.

3.5. Tablouri (vectori)

3.5.1. Tablouri (vectori) unidimensionale

Declararea unui vector se face prin


TipElement[] numeVector; sau TipElement numeVector[];

unde TipElement reprezint tipul elementelor vectorului, iar parantezele []


aezate fie naintea fie dup numele vectorului arat c este vorba despre un vector.

Exemple:
int[] v;
String adrese[];

28
Instanierea unui vector se realizeaz cu operatorul new i are ca efect
alocarea memoriei necesare pentru memorarea elementelor vectorului, mai precis
specificarea numrului maxim de elemente pe care l va avea vectorul. Instanierea
unui vector se face astfel:
numeVector = new TipElement[dimensiune];

Exemple:
v = new int[10]; //se aloc spaiu pentru 10 ntregi
adrese = new String[100]; //se aloc spaiu pentru 100 de String-uri

Declararea i instanierea unui vector pot fi fcute simultan astfel:


TipElement[] numeVector = new TipElement[dimensiune];

Exemple:
int [] v = new int[10];

Dup declararea unui vector, acesta poate fi iniializat, adic elementele sale
pot primi valori. n acest caz instanierea lipsete, alocarea memoriei fcndu-se
automat n funcie de numrul de elemente cu care se iniializeaz vectorul.

Exemple:
String culori[] = {"Rosu", "Galben", "Verde"};
int []v = {2, 4, 6, 8, 10, 12};

Observaii:
Primul indice al unui vector este 0, deci poziiile unui vector cu n elemente vor
fi cuprinse ntre 0 i n-1.
Nu sunt permise construcii de genul:
TipElement numeVector[dimensiune]

alocarea memoriei fcndu-se doar prin intermediul operatorului new sau prin
iniializare.
Exemple:
int v[10]; //incorect
int v[] = new int[10]; //corect

29
Accesul la elementul unui vector se face prin:
numeVector[indice]

Exemplu 1:
int v[]=new int[10];
for(i=0; i<10; i++)
v[i]=i;

Exemplu 2:
int v[]={1,2,3,4,5};
for(i=0; i<5; i++)
System.out.println(v[i]+ );

3.5.2. Tablouri (vectori) cu mai multe dimensiuni

n Java tablourile cu mai multe dimensiuni sunt de fapt vectori de vectori. Prin
urmare, declararea, instanierea i iniializarea se fac la fel ca n cazul vectorilor
unidimensionali.
TipElement numeVector[][] = new TipElement[dim1][dim2]
sau
TipElement[][] numeVector = new[dim1][dim2] TipElement
sau parantezele pot fi de o parte i de alta a lui numeVector.
Exemplu:
int m[][]; //declararea unei matrice
m = new int[5][10]; //cu 5 linii, 10 coloane
Observaie:
m[0], m[1], ..., m[4] sunt vectori de ntregi cu 10 elemente

3.5.3. Dimensiunea unui vector

Cu ajutorul cuvntului cheie length se poate afla dimensiunea unui vector.


Exemple:
Fie vectorul
int []a = new int[5];
atunci a.length are valoarea 5.
Fie matricea
int m = new int[5][10];

30
atunci:
m.length are valoarea 5 i reprezint numrul de linii al matricei
m[0].length are valoarea 10 i reprezint numrul de elemente al
primei linii a matricei,
m[1].length are valoarea 10 i reprezint numrul de elemente al
celei de-a doua linii a matricei, etc.

Exemplu 14: S se calculeze minimul elementelor unui vector.


1. public class MinVect{
2. public static void main(String args[]){
3. int a[]={2,1,4,7,3};
4. int min=a[0];
5. for(int i=0; i<a.length; i++)
6. if (min>a[i])
7. min=a[i];
8. System.out.println("Minimul este "+min);
9. }
10. }

Exemplu 15: S se ordoneze elementele de pe diagonala principal a unei matrice.


1. public class OrdDiagPrinc{
2. public static void main(String args[]){
3. int a[][]={{2,1,4,7},{3,5,1,8},{2,5,1,9},{3,2,5,8}};
4. boolean ordonat;
5. for(int i=0; i<a.length; i++){
6. for(int j=0; j<a[i].length; j++)
7. System.out.print(a[i][j]+" ");
8. System.out.println("");
9. }
10. do{
11. ordonat=true;
12. for(int i=0; i<a.length-1; i++)
13. if (a[i][i]>a[i+1][i+1]){
14. int aux=a[i][i];
15. a[i][i]=a[i+1][i+1];
16. a[i+1][i+1]=aux;
17. ordonat=false;
18. }
19. }while(!ordonat);
20. System.out.println("Matricea cu diagonala
ordonata:");
21. for(int i=0; i<a.length; i++){
22. for(int j=0; j<a[i].length; j++)
23. System.out.print(a[i][j]+" ");
24. System.out.println("");
25. }

31
26. }
27. }

3.5.4. Tablouri cu dimensiuni variabile

Java permite folosirea tablourilor cu dimensiuni variabile adic, a vectorilor de


vectori cu dimensiuni variabile.

Exemplu 16: S se genereze i s se afieze triunghiul lui Pascal.


1. public class TrPascal{
2. public static void main(String args[]){
3. int []a[]=new int[10][];
4. a[0]=new int[1];
5. a[1]=new int[2];
6. a[0][0]=a[1][0]=a[1][1]=1;
7. for(int i=2; i<a.length; i++){
8. a[i]=new int[i+1];
9. a[i][0]=a[i][i]=1;
10. for(int j=1; j<a[i].length-1; j++)
11. a[i][j]=a[i-1][j-1]+a[i-1][j];
12. }
13. for(int i=0; i<a.length; i++){
14. for(int j=0; j<a[i].length; j++)
15. System.out.print(a[i][j]+" ");
16. System.out.println("");
17. }
18. }
19. }

n linia 8 se observ c, pentru fiecare linie a matricei se aloc memorie pentru


un numr variabil de elemente: pe linia 0 va fi memorat un element, pe linia 1 vor fi
memorate dou elemente, etc.

3.6. iruri de caractere

n Java, un ir de caractere poate fi reprezentat printr-un vector format din


elemente de tip char, un obiect de tip String sau un obiect de tip StringBuffer.
Exemple echivalente de declarare a unui ir:
String str = "abc";
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String str = new String("abc");

32
Concatenarea irurilor de caractere se face prin intermediul operatorului +.
String str1 = "abc" + "xyz";
String str2 = "123";
String str3 = str1 + str2;

n Java, operatorul de concatenare + este extrem de flexibil n sensul c


permite concatenarea irurilor cu obiecte de orice tip care au o reprezentare de tip
ir de caractere.
Exemplu:
System.out.print("Vectorul v are" + v.length + "
elemente");

33
4. Clase i obiecte n Java

4.1. Referine

Dup cum am artat n capitolul 2, o clas este un ablon pentru mai multe
obiecte cu caracteristici asemntoare. Un obiect este o colecie de variabile
(atribute) i metode asociate descrise n clas.
Clasa poate fi asemnat cu un tip de date iar obiectul cu o variabil. Dac se
declar o variabil folosind numele unei clase ca i tip, aceast variabil conine o
referin ctre un obiect al clasei respective. Cu alte cuvinte, variabila nu va conine
obiectul actual ci o referin ctre un obiect / o instan a clasei. Deoarece folosind
numele unei clase ca i tip se declar o referin ctre un obiect, aceste tipuri poart
numele de tipuri referin.
Se disting dou caracteristici principale ale obiectelor n Java:
obiectele sunt ntotdeauna alocate dinamic. Durata de via a unui
obiect este determinat de logica programului. Ea ncepe atunci cnd
obiectul este creat i se termin n momentul n care obiectul nu mai
este folosit, el fiind distrus de un mecanism de curenie oferit de
limbajul Java garbage collector (colectorul de gunoaie).
obiectele nu sunt coninute de ctre variabile. O variabil pstreaz o
referin ctre un obiect. o referin este similar cu ceea ce se
numete pointer n alte limbaje de programare cum ar fi C++. Dac
exist dou variabile de acelai tip referin i o variabil este atribuit
celeilalte, ambele vor referi acelai obiect. Dac informaia din obiect se
modific, schimbarea este vizibil n ambele variabile.
O variabil referin poate conine i o referin ctre nimic. Valoarea unei
asemenea variabile referin este null.
n Java nu se permite tipurilor referin s fie convertite ctre tipuri primitive
sau invers.
n capitolul 2 am vzut cum se poate lucra cu tablouri (iruri) fr s ne punem
problema cu ce tip de date lucrm primitiv sau referin. n Java, irurile nu sunt
tipuri primitive ci referin. Ele se comport ca nite obiecte.

34
4.2. Obiecte

4.2.1. Noiuni generale

n Java obiectele sunt create prin instanierea unei clase, cu alte cuvinte prin
crearea unei instane a unei clase.
Declararea obiectului se face prin:
NumeClasa numeObiect;
Exemplu:
String s;
Complex c;

n urma declarrii, variabila este iniializat cu null.


Crearea obiectului echivalent cu instanierea clasei se realizeaz prin
intermediul operatorului new i presupune alocarea spaiului de memorie necesar
pstrrii obiectului. Adresa (referina) ctre obiectul respectiv o s fie memorat n
variabila numeObiect.
numeObiect = new NumeClasa();
Exemplu:
s=new String() ;
Complex c=new Complex(2,3);

Declararea i crearea obiectului pot fi fcute pe aceeai linie.


Exemplu:
String s=new String() ;
Complex c=new Complex(2,3);

n momentul n care se realizeaz crearea obiectului are loc i iniializarea lui.


Atenie
Spaiul de memorie nu este alocat n momentul declarrii obiectului.
Exemplu:
Complex c;
c.re = 10; //EROARE!
Alocarea memoriei se face doar la apelul instruciunii new !
Referirea valorii unei variabile se face prin
obiect.variabila

35
Exemplu:
Complex c = new Complex();
c.re = 2;
c.im = 3;
System.out.println("Re=" +c.re+ " Im="+c.im);

Observaie: Accesul la variabilele unui obiect se face n conformitate cu drepturile de


acces pe care le ofer variabilele respective celorlalte clase.
Apelul unei metode se face prin
obiect.metoda([parametri])
Exemplu:
Complex c = new Complex();
c.setRe(2);
c.setIm(3);

n Java programatorul nu mai are responsabilitatea distrugerii obiectelor sale


ntruct, n momentul rulrii unui program, simultan cu interpretorul Java ruleaz i
un proces care se ocup de distrugerea obiectelor care nu mai sunt folosite. Acest
proces pus la dispoziie de platforma Java de lucru se numete garbage collector
(colector de gunoaie). Un obiect este eliminat din memorie de procesul de colectare
atunci cnd nu mai exista nici o referin la acesta. Referinele (care sun de fapt
variabile) sunt distruse:
natural, atunci cnd variabila respectiv nu mai este folosit (de exemplu,
la terminarea unei metode)
explicit, dac atribuim variabilei respective valoare null.

4.2.2. Operatorul de atribuire =

n cazul n care operatorul = este folosit mpreun cu date de tip primitiv, are
loc o atribuire de valori.
Exemplu:
int x = 12, y = 10;
x = y;

Valoarea lui x se schimb, primind valoarea lui y.


n cazul n care operatorul = este folosit mpreun cu date de tip referin, are
loc tot o atribuire de valori. Atta doar c valorile sunt n acest caz adrese.

36
Exemplu:
1. class Nimic{
2. int x;
3. }

4. class Test{
5. public static void main(String args[]){
6. Nimic a1=new Nimic(),a2;
7. a1.x=10;
8. a2=a1;
9. System.out.println(a1.x+" "+a2.x);
10. a1.x=5;
11. System.out.println(a1.x+" "+a2.x);
12. }
13. }

n linia 7 se modific valoarea atributului x a obiectului a1. n linia 8 coninutul


variabilei a1 se copiaz n a2. Se afieaz 10 10. Se schimb valoarea atributului lui
a1 i, ne-am atepta s se afieze 5 10 dar se afieaz 5 5. Nu este greit! n linia 8
se copiaz valoarea lui a1 adic referina ctre obiect n a2. Din acest moment
exist un singur obiect ctre care refer att a1 ct i a2. Orice modificare are loc
asupra obiectului, ea este vzut i de a1 i de a2.
Exemplu:
public class Test{
public static void main(String args[]){
int[] a1={1,2,3,4,5};
int[] a2;
a2=a1;
for(int i=0; i<a1.length; i++)
a2[i]++;
for(int i=0; i<a1.length; i++)
System.out.print(a1[i]+" ");
System.out.println("");
for(int i=0; i<a2.length; i++)
System.out.print(a2[i]+" ");
}
}

Rezultatul este:
23456
23456

37
4.2.3. Operatorul de egalitate ==

n cazul n care operatorul == este folosit mpreun cu date de tip primitiv, are
loc o testare a egalitii valorilor celor dou variabile.
Exemplu:
int x = 12, y = 10, z = 12;
x == y are valoarea false; x i y au valori diferite
x == z are valoarea true; x i z au valori egale
n cazul n care operatorul = este folosit mpreun cu date de tip referin, se
verific dac cele dou variabile refer acelai obiect.

Exemplu:
1. class Nimic{
2. int x;
3. Nimic(int x){
4. this.x=x;
5. }
6. }

7. class Test{
8. public static void main(String args[]){
9. Nimic a1=new Nimic(1),a2=new Nimic(1);
10. if(a1==a2)
11. System.out.println("Sunt egale");
12. else
13. System.out.println("Nu sunt egale");
14. a2=a1;
15. if(a1==a2)
16. System.out.println("Sunt egale");
17. else
18. System.out.println("Nu sunt egale");
19. }
20. }

n linia 9 se creeaz dou obiecte cu aceeai valoare. Totui testul din linia 10
are ca rezultat valoarea false. Dup linia 14 cele dou variabile refer acelai
obiect i, prin urmare, testul din linia 15 are ca rezultat valoarea true.

38
4.3. Clase

4.3.1. Definirea claselor

[public][abstract][final] class NumeClasa


[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 ... ]]
{
//corpul clasei
}
Antetul clasei:
[public][abstract][final] class NumeClasa
este format din modificatorii clasei, cuvntul rezervat class i numele clasei
NumeClasa.
Prezena parantezelor [] indic faptul c ceea ce este cuprins ntre ele este
opional.
Modificatorii clasei sunt:
public: dac o clas este declarat public, ea este accesibil oricrei
alte clase. Dac modificatorul public nu apare, clasa poate fi accesat
doar de ctre clasele din pachetul cruia aparine clasa (dac nu se
specific un anume pachet, toate clasele din directorul curent sunt
considerate a fi n acelai pachet). Spaiul de cutare este definit de
variabila sistem CLASSPATH.
abstract: o clas declarat abstract este o clas ablon adic ea este
folosit doar pentru a crea un model comun pentru o serie de subclase. O
clas trebuie declarat abstract daca ea este incomplet implementat
adic nu toate metodele ei sunt definite. O astfel de clas nu poate fi
instaniat, dar poate fi extins de alte clase care s implementeze
metodele nedefinite. Doar clasele abstracte pot s conin metode
abstracte (metode declarate dar nu implementate).
final o clas poate fi declarat final dac a fost complet definit i nu se
dorete s fie extins (s aib subclase); cu alte cuvinte ea nu poate apare
n clauza extends a altei clase.

Observaie: O clas declarat att abstract ct i final genereaz eroare.


Dac clasa este abstract nseamn c ea conine metode neimplementate i, prin

39
urmare trebuie extins de o alt clas care s le implementeze. Dar, dac ar fi i
final, nu ar putea fi extins.
Dup numele clasei se pot specifica, dac este cazul, clasele motenite i
interfeele implementate. O clas poate moteni o singur clas, prin urmare dac
apare clauza extends ea este urmat doar de numele unei clase. ns, o clas
poate implementa mai multe interfee, ale cror nume apar dup clauza
implements i trebuie separate prin virgul. Asupra motenirii i interfeelor se
gsesc mai multe detalii n subcapitolele Motenire respectiv Interfee.
Corpul unei clase urmeaz dup antetul clasei i este cuprins ntre acolade.
Conine:
declararea variabilelor instan i clas care mpreun formeaz
variabilele membru;
definirea metodelor instan i clas care mpreun formeaz metodele
membru.
Observaie: variabilele unei clase pot avea acelai nume cu metodele clasei.

4.3.2. Variabile membru

Variabilele se declar de obicei naintea metodelor, dei acest lucru nu este


impus de compilator.
class NumeClasa {
//declararea variabilelor
//declararea metodelor
}
Variabilele unei clase sunt doar cele care sunt declarate n corpul clasei i nu
n corpul unei metode. Variabilele declarate n cadrul unei metode sunt locale
metodei respective.
Declararea unei variabile presupune specificarea urmtoarelor lucruri:
numele variabilei;
tipul de date;
nivelul de acces la acea variabil de ctre alte clase;
dac este constant sau nu;
tipul variabilei: instan sau clas
Tiparul declarrii unei variabile este:

40
[modificatori] TipDeDate numeVariabila [ = valoareInitiala ] ;
unde un modificator poate fi :
un specificator de acces: public, protected, private;
unul din cuvintele rezervate: static, final, transient, volatile.
Exemple:
double x;
protected static int n;
public String s = "abcd";
private Point p = new Point(10, 10);
final long MAX = 100000L;

Detalii despre modificatorii de acces se gsesc n subcapitolul Modificatori de


acces pentru membrii unei clase.
Cuvintele rezervate: static, final, transient, volatile au urmtoarele
roluri:
static este folosit pentru declararea variabilelor clas.
Exemplu:
int x ; //variabil instan
static int nrDeObiecteCreate; //variabil clas

final este folosit pentru declararea constantelor. O constant este o


variabil a crei valoare nu mai poate fi schimbat. Valoarea unei variabile
finale nu trebuie specificat neaprat la declararea ei, ci poate fi specificat
i ulterior, dup care ea nu va mai putea fi modificat.
Exemplu: se declar i se iniializeaz o variabil final (linia 1). Valoarea ei nu mai
poate fi modificat (linia 3).
1. final double PI = 3.14 ;
2. ...
3. PI = 3.141 // eroare la compilare

Exemplu: se declar o variabil final (linia 2). n linia 4 se iniializeaz iar n linia 5
se dorete modificarea valorii ei.
1. class Test {
2. final int MAX;
3. Test() {
4. MAX = 100; // legal
5. MAX = 200; // ilegal -> eroare la compilare
6. }
7. }

41
transient este folosit la serializarea obiectelor, pentru a specifica ce
variabile membru ale unui obiect nu participa la serializare.
volatile este folosit pentru a semnala compilatorului s nu execute
anumite optimizri asupra membrilor unei clase. Este o facilitate avansat
a limbajului Java.

4.3.3. Metode

4.3.3.1 Definirea metodelor


Metodele sunt folosite pentru descrierea comportamentului unui obiect. O
metod se declar astfel:
[modificatori] TipReturnat numeMetoda ([argumente])
[throws TipExceptie]
{
//corpul metodei
}

4.3.3.2 Modificatorii metodelor


Un modificator poate fi :
un specificator de acces: public, protected, private;
unul din cuvintele rezervate: static, abstract, final, native,
synchronized.

Detalii despre modificatorii de acces se gsesc n subcapitolul Modificatori de


acces.
Cuvintele rezervate: static, abstract, final, native, synchronized
au urmtoarele roluri:
static este folosit pentru declararea metodelor clas.
Exemplu:
void metoda1() ; //metoda de instanta
static void metoda2(); //metoda de clasa

abstract este folosit pentru declararea metodelor abstracte. O metod


abstract este o metod care nu are implementare i trebuie s aparin
unei clase abstracte.

42
final este folosit pentru a specifica faptul c acea metod nu mai poate fi
supradefinit n subclasele clasei n care ea este definit ca fiind final.
Acest lucru este util dac respectiva metod are o implementare care nu
trebuie schimbat n subclasele ei.
native este folosit pentru refolosirea unor funcii scrise n alt limbaj de
programare dect Java (C de exemplu).
synchronized este folosit n cazul n care se lucreaz cu mai multe fire de
execuie iar metoda respectiv se ocup cu partajarea unei resurse
comune. Are ca efect construirea unui semafor care nu permite executarea
metodei la un moment dat dect unui singur fir de execuie.

4.3.3.3 Tipul returnat de o metod


Metodele pot s returneze sau nu o valoare (un obiect) la terminarea lor. Tipul
valorii returnate poate fi att un tip primitiv de date (int, double, etc.) ct i o referin
la un obiect al unei clase. n cazul n care o metoda nu returneaz nimic atunci
TipReturnat este void.
Exemplu: void afisareRezultat()

Returnarea valorii de ctre o metod se realizeaz prin intermediul instruciunii


return.
Dac o metod returneaz o valoare de un tip de baz atunci tipul ei trebuie s
coincid cu TipReturnat, n caz contrar se primete eroare la compilare.

Exemplu: Metod care calculeaz maximul a dou numere


public int max(int a, int b){
return a>b?a:b;
}

Dac valoarea returnat este o referin la un obiect al unei clase, atunci clasa
obiectului returnat trebuie s coincid sau s fie o subclas a clasei specificate la
declararea metodei.

43
4.3.3.4 Parametrii unei metode
Dup cum am vzut, numele clasei este urmat de lista parametrilor
(argumentelor), list care este opional (o metod poate s nu aib parametrii).
Parametrii sunt specificai prin numele i tipul lor, fiind desprii unul de altul prin
virgul.
NumeMetoda([tip1 argument1], [tip2 argument2]
... )

Tipul de date al unui argument poate fi orice tip valid al limbajului, att tip
primitiv de date ct i referin la un obiect.
Exemplu:
void adaugarePersoana(String nume, int varsta, float
salariu){
...
}

unde String este tip referin, int i float sunt tipuri primitive.
n Java o metod nu poate primi un numr variabil de argumente, ceea ce
nseamn c apelul unei metode trebuie s se fac cu specificarea exact a
numrului i tipurilor argumentelor.
Nu este permis gruparea parametrilor dup tipul lor.
Exemplu:
public int max(int a,b){...} //este greit
public int max(int a, int b){ ...} //este corect

Numele argumentelor primite trebuie s difere ntre ele i nu trebuie s


coincid cu numele nici uneia din variabilele locale ale metodei. Pot ns, s coincid
cu numele variabilelor membre ale clasei caz n care diferenierea se va face prin
intermediul variabile this. Vezi subcapitolul Obiectul this
Exemplu:
class Complex{
int re,im;
public schimba(int re, int im){
this.re = re;
this.im = im;
}
}

Atenie: n Java argumentele sunt trimise doar prin valoare !!!

44
Asta nsemn c metoda recepioneaz doar valorile variabilelor primite ca
parametri. Cnd argumentul are tip primitiv de date metoda nu-i poate schimba
valoarea dect local (n cadrul metodei); la revenirea din metod variabila are
aceeai valoare ca la apelul iniial al metodei (modificrile fcute n cadrul metodei
sunt pierdute). Cnd argumentul este de tip referin metoda nu poate schimba
referina obiectului ns poate schimba variabilele membru ale respectivului obiect.
Prin urmare, dac dorim ca o metod s schimbe starea (valoarea) unui argument
primit, atunci el trebuie s fie neaprat de tip referin (trebuie s fie un obiect!).

4.3.4. Constructorii unei clase

Constructorii unei clase sunt metode speciale care au acelai nume cu cel al
clasei, nu returneaz nici o valoare i sunt folosii pentru iniializarea obiectelor
acelei clase n momentul instanierii lor. Constructorii controleaz modul n care un
obiect este creat i iniializat.
Class COMPLEX {
COMPLEX() {
//constructor
}
}

O clas poate avea unul sau mai muli constructori care trebuie ns s difere
prin lista de parametri primii. Astfel sunt permise diferite tipuri de iniializri ale
obiectului la crearea sa, n funcie de numrul parametrilor cu care este apelat
constructorul.
Exemplu: Clasa COMPLEX are trei constructori: unul fr parametrii definit n liniile
3-5, altul cu doi parametrii definit n liniile 6-8, altul cu un parametru definit n liniile 9-
11.
1. class COMPLEX {
2. double re, im;

3. COMPLEX () {
4. re=im=0;
5. }
6. COMPLEX (double r, double i ) {
7. re=r; im=i;
8. }
9. COMPLEX (double r) {
10. re=r; im=0;

45
11. }
12. }

Constructorii sunt apelai automat la instanierea unui obiect. n cazul n care


dorim s apelm explicit constructorul unei clase folosim metoda this(argumente),
care apeleaz constructorul corespunztor (ca argumente) al clasei respective.
Aceast metod este folosit atunci cnd sunt implementai mai muli constructori
pentru o clas pentru a nu repeta secvenele de cod scrise la constructorii cu mai
puine argumente.

Exemplu: n clasa COMPLEX a fost definit constructorul cu doi parametrii. Ceilali doi
constructori fac apel la constructorul cu doi parametrii n liniile 4 i 10.
1. class COMPLEX {
2. double re, im;

3. COMPLEX () {
4. this(0,0);
5. }
6. COMPLEX (double r, double i ) {
7. re=r; im=i;
8. }
9. COMPLEX (double r) {
10. this(r,0);
11. }
12. }

Dac ntr-o clas nu este definete nici un constructor, sistemul i creeaz


automat un constructor implicit care nu primete nici un argument. El iniializeaz
variabilele membru de tipuri primitive cu 0 i pe cele de tipuri referin cu null. Deci
prezena constructorilor n corpul unei clase nu este obligatorie. Dac ntr-o clas a
fost definit cel puin un constructor cu parametrii, atunci constructorul implicit (fr
parametrii) nu va mai fi creat automat.

Exemplu: n clasa COMPLEX nu a fost definit nici un constructor. n linia 5 se


apeleaz constructorul implicit creat automat pentru clasa Complex.
1. class COMPLEX {
2. double re, im;
3. }
4. ...
5. COMPLEX c= new COMPLEX ();

46
Exemplu: n clasa COMPLEX au fost definii doi constructori: cu un parametru i cu
doi parametrii. n linia 11 se apeleaz constructorul fr parametrii. Aceast linie
genereaz o eroare deoarece nu exist constructor fr parametrii el nu a fost
creat implicit.
1. class COMPLEX {
2. double re, im;
3. COMPLEX (double r, double i ) {
4. re=r; im=i;
5. }
6. COMPLEX (double r) {
7. this(r,0);
8. }
9. }
10. ...
11. COMPLEX c= new Complex(); //eroare

Constructorii unei clase pot avea urmtorii specificatori de acces:


private: nici o alt clas nu poate instania obiecte ale acestei clase. O astfel
de clas poate conine metode publice care s-i creeze propriile obiecte i s le
returneze altor clase;
public: orice clas poate crea instane ale clasei respective;
protected: doar subclasele pot crea obiecte de tipul clasei respective.
Dac specificatorul lipsete, doar clasele din acelai pachet pot crea instane
ale clasei respective.

4.3.5. Obiectul this

Obiectul this este o referin ctre obiectul curent.


Este folosit n trei situaii:
n cadrul unei metode care are parametrii cu nume identic cu numele
atributelor clasei. n aceast situaie, trebuie fcut o diferen ntre cele
dou. Cu this se calific atributele clasei.
Exemplu: Metoda schimba primete doi parametrii cu acelai nume cu atributele
clasei: re i im.
1. class Complex{
2. int re,im;
3. public schimba(int re, int im){

47
4. this.re = re;
5. this.im = im;
6. }
7. }

n cadrul constructorilor pentru a apela ceilali constructori ai clasei.


Exemplu: n liniile 4 i 11 se apeleaz constructorul cu doi parametrii definit n liniile
6-9.
1. public class Rational{
2. private long m,n;
3. public Rational(){
4. this(0,1);
5. }
6. public Rational(long m,long n){
7. this.m=m;
8. this.n=n;
9. }
10. public Rational(long m){
11. this(m,1);
12. }
13. }

pentru a testa c obiectul primit ca parametru nu este chiar obiectul curent.

Exemplu: Clasa ContBancar conine metoda transfer n care se transfer suma


de bani din contul primit n contul curent liniile 10, 11. n linia 15 se creeaz un
obiect ContBancar. n linia 16 se apeleaz metoda transfer a obiectului c cu
parametru c. Asta nseamn c, suma din contul c va fi transferat tot n contul c.
Citind cu atenie codul din liniile 10, 11 observm c se adun suma primit
(c.suma) la suma actual (this.suma) n cazul nostru, contul i dubleaz suma,
dup care suma contului primit (c.suma) se face zero.
1. public class ContBancar{
2. private long suma;
3. public ContBancar(){
4. this(0);
5. }
6. public ContBancar(long suma){
7. this.suma=suma;
8. }
9. public void transfer(ContBancar c){
10. this.suma+=c.suma;
11. c.suma=0;
12. }
13. }

48
14. ...
15. ContBancar c=new ContBancar(100);
16. c.transfer(c);

Din punct de vedere logic, nu este corect. Ar trebui ca naintea nceperii


transferului de bani s se verifice dac nu cumva este vorba despre acelai cont,
caz n care nu ar trebui s se ntmple nimic. Metoda transfer ar arta astfel:

1. public void transfer(ContBancar c){


2. if (this == c)
3. return;
4. this.suma+=c.suma;
5. c.suma=0;
6. }
7. }

n linia 2, this reprezint obiectul curent iar c obiectul primit ca parametru.

4.3.6. Suprancrcarea i supradefinirea metodelor

suprancrcarea (overloading): n cadrul unei clase pot exista metode cu


acelai nume cu condiia ca ele s difere prin lista parametrilor diferena
const n numrul parametrilor sau n tipul lor. Astfel la apelul metodei cu
acel nume se poate face distincia ntre ele i se stabilete n mod unic
care dintre ele se execut.
Exemplu: n clasa Maxim sunt definite dou metode max cu doi respectiv cu trei
parametrii.
1. public class Maxim {
2. public static int max(int a, int b){
3. return a>b?a:b;
4. }

5. public static int max(int a, int b, int c){


6. int m=a>b?a:b;
7. m=m>c?m:c;
8. return m;
9. }

10. public static void main(String args[]){


11. int a=12, b=5,c=90,m;
12. m=max(a,b);
13. System.out.println("Max. dintre "+a+" si "+b+"
este: "+m);

49
14. m=max(a,b,c);
15. System.out.println("Max. dintre "+a+", "+b+" si
"+c+" este: "+m);
16. }
17. }

.
supradefinirea (overriding): o subclas a unei clase poate rescrie o metod
a clasei printe, prin implementarea unei metode cu acelai antet ca al
superclasei.

4.3.7. Modificatori de acces pentru membrii unei clase

Sunt cuvinte rezervate ce controleaz accesul celorlalte clase la membrii unei


clase. Modificatoriii de acces pentru variabilele i metodele unei clase sunt: public,
protected, private i cel implicit. Nivelul lor de acces este dat n tabelul de mai
jos:
Modificat Clas Subclas Pachet Altundev
or a
private x
protected x x x
public x x x x
implicit x x

Dup cum se vede n tabelul de mai sus, modificatorii au urmtoarele


semnificaii.
private un membru declarat private este accesibil doar n clasa n care
este declarat;
protected un membru declarat protected este accesibil oricrei clase
care aparine aceluiai pachet ca i clasa n care este declarat membrul; de
asemenea, este accesibil i oricrei subclase a clasei respective;
public un membru declarat public este accesibil oricrei clase indiferent
de locul unde se afl ea.
Dac modificatorul unui membru lipsete, se consider implicit un modificator
friendly care d acces oricrei clase din pachetul respectiv.

50
Exemple:
private int re,im;
protected String secret;
public float[] elemente;
long x;
private void metodaInterna();
public void setRe(int re);

Observaie: n cazul n care declarm un membru "protected" atunci accesul la


acel membru din subclasele clasei n care a fost declarat variabila depinde i de
pachetul n care se gsete subclasa: dac sunt n acelai pachet accesul este
permis, dac nu sunt n acelai pachet accesul nu este permis dect pentru obiecte
de tipul subclasei.

4.3.8. Membrii instan i membrii clas

O clas Java poate conine dou tipuri de variabile i metode :


instan: declarate fr modificatorul static, specifice fiecrei
instane
clas: declarate cu modificatorul static, specifice clasei
Dac o variabil este declarat static atunci exist doar o copie a variabilei
asociat cu clasa respectiv i nu mai multe copii ale ei asociate cu fiecare instan
a clasei.
O variabil clas exist i poate fi folosit chiar dac clasa nu a fost instaniat
spre diferen de variabilele instan care exist doar dup ce a fost creat o
instan a clasei.
Pentru variabilele statice sistemul aloc o singur zon de memorie la care au
acces toate instanele clasei respective, ceea ce nseamn c dac un obiect
modific valoarea unei variabile statice, modificarea va fi vzut de ctre toate
celelalte obiecte. Variabilelor statice nu li se aloc dinamic memorie; memoria pentru
ele este rezervat nainte ca oricare obiect al clasei s fie creat. n cazul variabilelor
instan, la fiecare creare a unei instane a clasei sistemul aloc o zon de memorie
separat pentru memorarea valorii ei.

Exemplu: Clasa Punct conine dou variabile instan declarate pe linia 2 i o


variabil clas declarat i iniializat pe linia 3. Constructorul clasei Punct

51
iniializeaz variabilele instan i incrementeaz variabila clas. Cu alte cuvinte,
variabila nr_puncte va contoriza cte puncte (instane ale clasei Punct) se
creeaz. n clasa TestPunct se creeaz trei obiecte de tipul Punct i se afieaz
valoarea variabilei clas nr_puncte. Trebuie remarcat c variabila nr_puncte
este accesat prin intermediul numelui clasei.
1. class Punct{
2. int x, y;
3. static int nr_puncte=0;

4. Punct(int xx, int yy){


5. x=xx; y=yy;
6. nrpuncte++;
7. }
8. }

9. class TestPunct{
10. public static void main(String args[]){
11. Punct p1=newPunct(10, 10);
12. Punct p2=newPunct(20, 20);
13. Punct p3=newPunct(30, 30);
14. System.out.println(Punct.nr_puncte);
15. }
16. }

ntruct metodele clas nu depind de starea obiectelor clasei respective, apelul


lor se poate face prin:
NumeClasa.metodaStatica();
sau
NumeClasa obiect = new NumeClasa();
obiect.metodaStatica();
n cazul metodelor instan apelul nu se poate face dect prin intermediul unui
obiect:
NumeClass.metodaInstanta(), //ilegal
NumeClasa obiect = new NumeClasa();
obiect. metodaDeInstanta(); //legal

Exemplu: n clasa Cerc sunt definite: o metod instan n liniile 6-11 care
returneaz cercul cu raza cea mai mare i o metod clas n liniile 12-18 care
returneaz cercul cu raza cea mai mare dintre cele dou cercuri primite ca
parametru. n liniile 21, 22 sunt create dou cercuri a i b cu raze diferite. n linia 23
este apelat metoda maimare a obiectului a. n linia 24 este apelat metoda
maimare a clasei Cerc.

52
1. class Cerc{
2. double x,y,r;

3. Cerc(double x, double y, double r) {


4. this.x=x; this.y=y; this.r=r;
5. }

6. Cerc maimare(Cerc c) {
7. if(c.r>r)
8. return c;
9. else
10. return this;
11. }

12. static Cerc maimare(Cerc a, Cerc b) {


13. if (a.r>b.r)
14. return a;
15. else
16. return b;
17. }
18. }
19.
20. ...
21. Cerc a=new Cerc(10, 10, 50);
22. Cerc b=new Cerc(20, 20, 100);
23. Cerc c = a.maimare(b);
24. Cerc d = Cerc.maimare(a,b);

Metodele clas nu pot accesa cmpuri sau metode instan.


Metodele instan pot accesa att membrii clas ct i instan.

Membrii clas (statici) sunt folosii pentru a pune la dispoziie valori i metode
independente de starea obiectelor dintr-o anumit clas.
Spre deosebire de C++, n Java nu putem avea funcii globale definite ca
atare, ntruct "orice este un obiect". Din acest motiv i metodele care au o
funcionalitate global trebuie implementate n cadrul unei clase. Acest lucru se va
face prin intermediul metodelor clas (globale), deoarece acestea nu depind de
starea particular a obiectelor din clasa respectiv. De exemplu, s considerm
funcia global sqrt care extrage radicalul dintr-un numr i care se gsete n clasa
Math. Dac nu ar fi fost funcie clas, apelul ei ar fi trebuit fcut astfel:
Math m = new Math();
double rad121 = m.sqrt(121);
ceea ce ar fi fost extrem de neplcut pentru programatori. Fiind ns funcie
static ea poate fi apelat prin: Math.sqrt(121).

53
4.3.9. Argumente n linia de comand

n sfrit suntem n msur s descifrm antetul metodei main.


public static void main(String args[])
Metoda main primete un ir de String-uri ca parametru. Prin intermediul lui
o aplicaie Java poate primi oricte argumente din linia de comand n momentul
lansrii ei. Aceste argumente sunt utile pentru a permite utilizatorului s specifice
diverse opiuni legate de funcionarea aplicaiei sau s furnizeze anumite date iniiale
programului.
Argumentele din linia de comand sunt introduse la lansarea unei aplicaii,
fiind specificate dup numele aplicaiei i sunt separate prin spaiu.
Formatul general pentru lansarea unei aplicaii care primete argumente din
linia de comand este:
java NumeAplicatie [arg1 arg2 . . . argn]
Evident, o aplicaie poate s nu primeasc nici un argument sau poate s
ignore argumentele primite din linia de comand.
n momentul lansrii unei aplicaii interpretorul parcurge linia de comand cu
care a fost lansat aplicaia i, n cazul n care exist argumente, i transmite
aplicaiei sub forma irului de String-uri.
Numrul argumentelor primite de un program este dat de dimensiunea
vectorului args args.length:
numarArgumente = args.length ;

Exemplu: Afiarea argumentelor primite din linia de comand


public class ArgLinCom {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}

Un apel de genul:
java ArgLinCom Nu mai vine primavara odata
va produce urmtorul rezultat:
Nu

54
mai
vine
primavara
odata
Dac o anumit parte din irul de intrare este cuprins ntre ghilimelele se
interpreteaz ca un singur argument, spaiile fiind ignorate.
Una apel de genul:
java ArgLinCom "Nu mai vine" primavara odata
va produce urmtorul rezultat:
Nu mai vine
primavara
odata
Dac se dorete ca din linia de comand s fie transmise argumente
numerice, acestea sunt primite de metoda main sub forma unui vector de String-
uri. Ulterior ele trebuie convertite din String-uri n numere. Acest lucru se
realizeaz cu metode de tipul parseXXX aflate n clasa XXX corespunztoare tipului
n care vrem s facem conversia: Integer, Float, Double, etc.
Exemplu:
1. public class Maxim {
2. public static int max(int a, int b){
3. return a>b?a:b;
4. }

5. public static int max(int a, int b, int c){

6. int m=a>b?a:b;
7. m=m>c?m:c;
8. return m;
9. }

10. public static void main(String args[]){


11. if (args.length!=3){
12. System.out.println("Nu ati introdus trei
numere");
13. return;
14. }
15. int a=Integer.parseInt(args[0]),
16. b=Integer.parseInt(args[1]),
17. c=Integer.parseInt(args[2]),
18. m;
19. m=max(a,b);
20. System.out.println("Maximul dintre "+a+" si "+b+"
este: "+m);
21. m=max(a,b,c);

55
22. System.out.println("Maximul dintre "+a+", "+b+" si
"+c+" este: "+m);
23. }
24. }

n linia 11 se verific dac au fost transmii atia parametrii ci sunt necesari.


n liniile 15-17 se convertesc argumentele n ntregi.

4.4. Motenirea

4.4.1. Principiul motenirii

Dup ncapsularea datelor, este al doilea principiu de baz al programrii


orientate pe obiecte. Motenirea este folositoare deoarece reduce rescrierea codului.
Adic, o clas poate fi motenit de ctre o alt clas (toate caracteristicile primei
clase se regsesc i n a doua clas). Noua clas i poate modifica o parte din
comportament, poate aduga ceva nou sau poate ignora ceea ce este neinteresant.
Aceast idee provine din lumea nconjurtoare. De exemplu, primul model de
main a fost mult timp gndit i dificil de construit. Evident c nu a atins
perfeciunea i, omul a dorit repede ceva mai performant i mai frumos. Prin urmare,
s-a trecut la crearea celui de-al doilea model. Ar fi o naivitate s credem c lucrul la
acest al doilea model a fost luat de la zero. De fapt, s-a pornit de la primul model i
s-a ncercat o mbuntire a lui n diferite direcii s-a redus ceea ce nu era bun, s-
au adugat elemente noi i au fost fcute modificri. Astfel s-a nscut i al doilea
model. Pornind de la el, n acelai stil, s-au creat noi modele. i mainile elegante pe
care le vedem azi rulnd cu vitez pe osele se trag tot din acea prim main. Baza
este aceeai, puin mbuntit.
n Java pentru a crea o clas nou trebuie specificate: clasa motenit i
diferenele fa de clasa motenit. Clasa motenit se specific n clauza extends.
modificator NumeClasa extends ClasaDeBaza

Clasa motenete toate metodele accesibile i variabilele superclasei sale.

56
Exemplu: Urmtoare ierarhie de clase:
se exprim n Java astfel: A
class A{
...
}
B
class B extends A{
...
}
class C extends B{
... C D
}
class D extends B{
...
}

Dac clauza extends lipsete, implicit clasa motenete clasa Object.


Observaie: n Java motenirea multipl nu este permis. Adic o clas poate
s moteneasc o singur clas nu mai multe.
Prin urmare, orice clas are o superclas i poate avea una sau mai multe
subclase.
n exemplul nostru avem:
clasa A este subclas a clasei Object i are o subclas: clasa B.
clasa B este subclas a clasei A i are o subclas: clasa C.
clasele C i D sunt subclase ale clasei B i nu au subclase.
Nu este permis o asemenea motenire (motenire multipl):

A B

Avantajele crerii unei ierarhii de clase

57
- funcionalitatea comun a mai multor clase se pune n superclase. Acest
aranjament permite ca funcionalitatea s fie refolosit n mod repetat
deoarece fiecare subclas primete informaia comun din superclas.
- schimbarea sau inserarea unei clase n partea de sus a ierarhiei
determin automat schimbri n comportamentul claselor de jos
Ce se ntmpl cnd o clas conine o metod care are acelai antet cu
metoda unei superclase? Este executat prima metod ntlnit cutarea fcndu-
se pornind de la baza ierarhiei n sus. Datorit acestui fapt, se pot scrie metode care
s ascund metodele din superclase.
Dac o metod din superclas nu este rescris ea va fi luat ca atare de
subclas. Nu acelai lucru se ntmpl i cu constructorii. Fiecare clas derivat
trebuie s i defineasc proprii constructori. Dac nu se scrie nici un constructor n
subclas, atunci se genereaz constructorul implicit.

Exemplu: Se definesc dou clase Rational i RationalIred care motenete


clasa Rational. n linia 15 se construiete un obiect al clasei Rational prin
apelarea constructorului cu doi parametrii. Acest constructor exist deci, totul este n
regul. n linia 16 se dorete construirea unui obiect al clasei RationalIred tot
prin apelarea constructorului cu doi parametrii. Dar, n acest caz este generat o
eroare deoarece clasa RationalIred nu are definit constructorul cu doi parametrii.
1.public class Rational{
2. private long m,n;
3. public Rational(){
4. m=0; n=1;
5. }
6. public Rational(long m,long n){
7. this.m=m;
8. this.n=n;
9. }
10. }

11. public class RationalIred extends Rational {


12. ...
13. }

14. ...

15. Rational r = new Rational(2,5);


16. RationalIred r1 = new RationalIred(2,5);

58
Pentru ca linia 16 s nu mai genereze eroare, clasa RationalIred trenbuie
s arate astfel:

1. public class RationalIred extends Rational {


2. public RationalIred(){
3. m=0; n=1;
4. }

5. public RationalIred(long m,long n){


6. this.m=m;
7. this.n=n;
8. }
9. }

n cadrul unei metode a subclasei care supradefinete o metod din


superclas se poate apela metoda supradefinit (a superclasei), folosind super.

Exemplu: Relum exemplul precedent. Subclasa RationalIred conine ca i


superclasa Rational doi constructori: unul fr parametrii i unul cu doi parametrii.
Constructorii subclasei au aceeai funcionalitate cu cei ai superclasei. n linia 16 se
apeleaz constructorul fr parametrii ai superclasei Rational. n linia 19 se
apeleaz constructorul cu doi parametrii ai superclasei Rational. Pe lng cei doi
constructori care au aceeai funcionalitate n ambele clase, a mai fost definit o
metod produs care este suprascris n subclas. Metoda produs din subclas
trebuie s fac ceva n plus fa de metoda superclasei. Prin urmare, se copiaz
comportamentul metodei din liniile 10-12 i se adaug ceva n plus. Copierea se
realizeaz n linia 22, iar adugarea n linia 23. Aceast copiere const n apelarea
metodei din superclas.
1. public class Rational{
2. public long m,n;
3. public Rational(){
4. m=0; n=1;
5. }
6. public Rational(long m,long n){
7. this.m=m;
8. this.n=n;
9. }
10. public void produs(){
11. System.out.println("Inmultesc doua numere
rationale");
12. }
13. }

59
14. public class RationalIred extends Rational {
15. public RationalIred(){
16. super();
17. }
18. public RationalIred(long m,long n){
19. super(m,n);
20. }
21. public RationalIred produs(RationalIred r){
22. super.produs(r);
23. System.out.println("si ireductibile");
24. }
25. }

Observaii:
Cnd se dorete apelarea constructorului superclasei se folosete doar
super(...).
Cnd se dorete apelarea unei metode a superclasei se folosete
super.NumeMetoda(...).

4.4.2. Interfee

Interfeele duc conceptul de clas abstract cu un pas nainte prin eliminarea


oricrei implementri a metodelor, punnd n practic unul din conceptele OOP de
separare a modelului unui obiect (interfaa) de implementarea sa.
O interfa Java definete un set de metode dar nu specific nici o
implementare pentru ele. O clas care implementeaz o interfa trebuie obligatoriu
s defineasc toate metodele interfeei. Prin urmare, o interfa este o colecie de
metode fr implementare i declaraii de constante.
Definirea unei interfee se face prin intermediul cuvntului cheie interface:
[public] interface NumeInterfata
extends SuperInterfata1 [,extends
SuperInterfata2...]]
{
//corpul interfetei:constane si metode abstracte
}
O interfa poate fi declarat doar public. O clas poate extinde oricte
interfee. Acestea se numesc superinterfee i sunt separate prin virgul.
Corpul unei interfee conine:

60
constante: acestea pot fi sau nu declarate cu modificatorii public,
static i final care sunt implicii; nici un alt modificator nu poate aprea
n declaraia unei variabile a unei interfee. Constantele dintr-o interfa
trebuie obligatoriu iniializate.
Exemplu:
1. interface NumeInterfata {
2. int x = 100; //corect
3. public static final int y = 100; //corect
4. private z=100; //incorect
5. int a; //incorect
6. }

metode fr implementare: acestea pot fi sau nu declarate cu


modificatorul public care este implicit; nici un alt modificator nu poate
aprea n declaraia unei metode a unei interfee.
Exemplu:
7. interface NumeInterfata {
8. void metoda1(); //corect
9. public void metoda2(); //corect
10. private void metoda3(); //incorect
11. }

Atenie:
Variabilele i metodele unei interfee sunt implicit publice chiar dac nu sunt
declarate cu modificatorul public.
Variabilele unei interfee sunt implicit constante chiar dac nu sunt declarate
cu modificatorii static i final.
Implementarea unei interfee se face prin intermediul cuvntului cheie
implements:
class NumeClasa implements NumeInterfata
sau
class NumeClasa implements Interfata1, Interfata2...
O clas poate implementa oricte interfee. O clas care implementeaz o
interfa trebuie obligatoriu s defineasc toate metodele interfeei.

Exemplu: Se definete o interfa FigGeom care este implementat de clasa


Cerc i clasa Dreptunghi. Clasa Patrat motenete clasa Dreptunghi, iar
clasa Pataratel motenete clasa Patrat.

61
1. interface FigGeom{
2. void desen();
3. void arie();
4. }

5. class Cerc implements FigGeom{


6. int r;
7. Cerc(int r){
8. this.r=r;
9. System.out.println("Constructor cerc "+r);
10. }
11. public void desen(){
12. System.out.println("Deseneaza cercul "+r);
13. }
14. public void arie(){
15. double s=Math.PI*r*r;
16. System.out.println("Cercul "+r+" are aria "+s);
17. }
18. }

19. class Dreptunghi implements FigGeom{


20. int L,l;
21. Dreptunghi(){}
22. Dreptunghi(int L,int l){
23. this.L=L;
24. this.l=l;
25. System.out.println("Constructor dreptunghi "+L+"
"+l);
26. }
27. public void desen(){
28. System.out.println("Deseneaza dreptunghiul "+L+"
"+l);
29. }
30. public void arie(){
31. double s=L*l;
32. System.out.println("Dreptunghiul "+L+" "+l+" are
aria "+s);
33. }
34. }

35. public class TestFigGeom{


36. public static void main(String args[]){
37. FigGeom c=new Cerc(10),
38. d=new Dreptunghi(20,25),
39. c.desen();
40. c.arie();
41. d.desen();
42. d.arie();
43. }
44. }

62
Rezultatul execuiei este:
Constructor cerc 10
Constructor dreptunghi 20 25
Deseneaza cercul 10
Cercul 10 are aria 314.1592653589793
Deseneaza dreptunghiul 20 25
Dreptunghiul 20 25 are aria 500.0

Diferena dintre o interfa i o clas abstract


La prima vedere o interfa nu este altceva dect o clas abstract n care
toate metodele sunt abstracte (nu au nici o implementare). Deosebirea dintre ele
const n faptul c unele clase sunt forate s extind o anumit clas (de exemplu
orice applet trebuie s fie subclas a clasei Applet) i nu ar mai putea s extind o
clas abstract deoarece n Java nu exist dect motenire simpl. Fr folosirea
interfeelor nu am putea fora clasa respectiva s respecte un anumit protocol.
La nivel conceptual diferena const n:
extinderea unei clase abstracte foreaz o relaie ntre clase;
implementarea unei interfee specific doar necesitatea implementrii
unor anumite metode.

4.5. Probleme

Exemplu 1: Exemplificarea motenirii.


class Masina {
private String s = new String("Masina");

public void append(String a){


s += a;
}

public void porneste(){


append(" porneste()");
}

public void merge(){


append(" merge()");
}
public void opreste(){
append(" opreste()");
}
public void print(){
System.out.println(s);

63
}
}

class BMW extends Masina {


//schimbarea unei metode
public void opreste() {
append(" BMW opreste sigur()");
super.opreste(); // apelul metodei clasei de baza
}

// adaugarea unei metode noi


public void franeazaBine(){
append(" franeazaBine()");
}
}

// testarea noii clase


public class TestMasina{
public static void main(String[] args) {
BMW bmw = new BMW();
/* System.out.println(bmw.s); //Eroare s nu apartine lui
bmw */
bmw.porneste();
bmw.merge();
bmw.franeazaBine();
bmw.opreste();
bmw.print();
}
}
Rezultatul execuiei este:
Masina porneste() merge() franeazaBine() BMW opreste sigur()
opreste()

Exemplu 2: Exemplificarea motenirii i a polimorfismului.


abstract class FigGeom{
abstract void desen();
abstract void arie();
}

class Cerc extends FigGeom{


int r;
Cerc(int r){
this.r=r;
System.out.println("Constructor cerc "+r);
}
void desen(){
System.out.println("Deseneaza cercul "+r);
}
void arie(){

64
double s=Math.PI*r*r;
System.out.println("Cercul "+r+" are aria "+s);
}
}

class Dreptunghi extends FigGeom{


int L,l;
Dreptunghi(){}
Dreptunghi(int L,int l){
this.L=L;
this.l=l;
System.out.println("Constructor dreptunghi "+L+"
"+l);
}
void desen(){
System.out.println("Deseneaza dreptunghiul "+L+"
"+l);
}
void arie(){
double s=L*l;
System.out.println("Dreptunghiul "+L+" "+l+" are
aria "+s);
}
}

class Patrat extends Dreptunghi{


int l;
Patrat(int l){
// super(l,l);
this.l=l;
System.out.println("Constructor patrat "+l);
}
void desen(int k){
System.out.println("Deseneaza patratul "+l+" indice
"+k);
}
void arie(){
double s=l*l;
System.out.println("Patrat "+l+" are aria "+s);
}
}

class Patratel extends Patrat{


int l;
Patratel(int l){
super(l);
this.l=l;
System.out.println("Constructor patratel "+l);
}
void desen(int k){
System.out.println("Deseneaza patratelul "+l+"
indice "+k);

65
}
void arie(){
double s=l*l;
System.out.println("Patratelul "+l+" are aria "+s);
}
}

public class TestFigGeom{


public static void main(String args[]){
FigGeom c=new Cerc(10),
d=new Dreptunghi(20,25),
p=new Patrat(30),
pm=new Patratel(40);
c.desen();
c.arie();
d.desen();
d.arie();
// p.desen(100); da eroare p fiind o figura
geometrica
p.desen(); //se apeleaza desen din dreptunghi
p.arie();
pm.desen(); //se apeleaza desen din dreptunghi
pm.arie();
Patrat p1=new Patrat(300);
p1.desen(100); //este ok
p1.arie();

}
}

Rezultatul afiat este:


Constructor cerc 10
Constructor dreptunghi 20 25
Constructor patrat 30
Constructor patrat 40
Constructor patratel 40
Deseneaza cercul 10
Cercul 10 are aria 314.1592653589793
Deseneaza dreptunghiul 20 25
Dreptunghiul 20 25 are aria 500.0
Deseneaza dreptunghiul 0 0
Patrat 30 are aria 900.0
Deseneaza dreptunghiul 0 0
Patratelul 40 are aria 1600.0

66
Constructor patrat 300
Deseneaza patratul 300 indice 100
Patrat 300 are aria 90000.0

Exemplu 3: Ilustreaz ordinea iniializrilor


class Floare {
Floare(int nr) {
System.out.println("Floare(" + nr + ")");
}
void actiune(String fel) {
System.out.println("actiune(" + fel + ")");
}
}

class Vaza {
static Floare f1 = new Floare(1); //var STATICA
Vaza() {
System.out.println("Vaza()");
f2.actiune("Floare in vaza");
}
void pozitie(String loc) {
System.out.println("pozitie(" + loc + ")");
}
static Floare f2 = new Floare(2); //var STATICA
}

class Gradina {
Floare f3 = new Floare(3);
static Floare f4 = new Floare(4); //var STATICA
Gradina() {
System.out.println("Gradina()");
f4.actiune("Floare doarme");
}
void aspect(String tip) {
System.out.println("aspect(" + tip + ")");
}
static Floare f5 = new Floare(5); //var STATICA
}

public class StaticInit {


public static void main(String[] args) {
System.out.println(
"Creaza o Gradina() noua in main");
new Gradina();
System.out.println(
"Creaza o Gradina() noua in main");
new Gradina();
v2.pozitie("pe masa");

67
g3.aspect("frumos");
}
static Vaza v2 = new Vaza(); //var STATICA
static Gradina g3 = new Gradina(); //var STATICA
}
Rezultatul execuiei este:
Floare(1)
Floare(2)
Vaza()
actiune(Floare in vaza)
Floare(4)
Floare(5)
Floare(3)
Gradina()
actiune(Floare doarme)
Creaza o Gradina() noua in main
Floare(3)
Gradina()
actiune(Floare doarme)
Creaza o Gradina() noua in main
Floare(3)
Gradina()
actiune(Floare doarme)
pozitie(pe masa)
aspect(frumos)

Exemplu 4: Exemplificarea motenirii. Clasa Rational implementeaz lucrul cu


numere raionale. Clasa RationalIred motenete clasa Rational i
implementeaz lucrul cu numere raionale ireductibile.
public class Rational{
private long m,n;

public Rational(){
this(1,0);
}

public Rational(long m,long n){


setm(m);
setn(n);

68
}

public Rational(long m){


this(m,1);
}

public void setm(long m){


this.m=m;
}

public long getm(){


return m;
}

public void setn(long n){


this.n=n;
}

public long getn(){


return n;
}

public Rational produs(Rational r){


return new Rational(m*r.m,n*r.n);
}

public String toString(){


return m+"/"+n;
}

public class RationalIred extends Rational {

public RationalIred(){
super();
}

public RationalIred(long m,long n){


super(m,n);
}

public RationalIred(long m){


super(m);
}

private void simplifica(){


long x=getm(), y=getn();
while(x!=y){
if(x>y) x-=y;
else y-=x;
}

69
setm(getm()/x);
setn(getn()/x);
}

public RationalIred produs(RationalIred r){


RationalIred p=new RationalIred();
p.setm(getm()*r.getm());
p.setn(getn()*r.getn());
p.simplifica();
return p;
}

public class TestRational{


public static void main(String[] args) {
RationalIred r1,r2,p;
r1=new RationalIred(Integer.parseInt(args[0]),
Integer.parseInt(args[1]));
r2=new RationalIred(Integer.parseInt(args[2]),
Integer.parseInt(args[3]));
System.out.println(r1);
System.out.println(r2);
p=r1.produs(r2);
System.out.println(p);
}
}

70
5. Pachete

Un pachet este o colecie de clase i interfee nrudite. Sunt folosite pentru


gsirea i utilizarea mai uoar a claselor, pentru a evita conflictele de nume i
pentru a controla accesul la anumite clase.
n Java toate clasele i interfeele sunt grupate n diferite pachete dup
funcionalitatea lor. Cu ajutorul lor se pot construi aplicaiile. Cele mai importante
pachete pe care le pune Java la dispoziie sunt:
pachetul java.lang cuprinde clasele de baz ale limbajului;
pachetul java.io cuprinde clasele pentru intrri/ieiri, lucru cu fiiere;
pachetul java.math cuprinde clasele n care sunt definite operaiile
matematice;
pachetul java.util cuprinde clasele utile : Vector, Stack, Random,
Date etc;
pachetul java.text ofer suport pentru formatarea textelor;
pachetul java.sql ofer suport pentru interogri SQL;
pachetul java.beans cuprinde clasele necesare scrierii de
componente reutilizabile;
pachetul java.net cuprinde clasele care asigur accesul la reea;
pachetul java.awt cuprinde clasele pentru grafic (Abstract
Windowing Toolkit);
pachetul javax.swing cuprinde clasele pentru grafic; extinde
funcionalitatea claselor din pachetul java.awt.
pachetul java.rmi cuprinde clasele care asigur execuie la distan
(Remote Message Interface);
pachetul java.securitz cuprinde clasele care asigur mecanisme de
securitate: criptare, autentificare;

71
Pentru a folosi o component a unui pachet trebuie fcut cunoscut clasei
curente fie pachetul n care se gsete componenta, fie doar componenta. Acest
lucru se realizeaz prin importarea pachetului sau, doar a clasei.

5.1. Importul unui pachet, al unei clase sau a unei interfee

Importul se realizeaz prin instruciunea import.


Importul pachetelor se face prin specificarea numelui pachetului urmat de
simbolul '*'. '*' are semnificaia c toate clasele i interfeele pachetului sunt
importate.
import NumePachet.*;
Exemple:
import java.io.*;
import javax.swing.*;

O dat realizat ntr-un fiier importul pachetului, orice clas din pachet poate fi
accesat prin numele ei.
Exemplu: Clasa Date aparine pachetului java.util.
import java.util.*;
public class ExData{
public static void main(String[] args) {
Date d=new Date(2003,4,13);
System.out.println(d);
}
}

Atenie: n cazul n care sunt importate dou pachete care conin o clas cu
acelai nume atunci referirea la ea trebuie fcut folosind numele complet al clasei
respective (nume pachet urmat de nume clas).
Implicit, mediul Java import trei pachete:
pachetul java.lang
pachetul curent
pachetul implicit (fr nume)

Importul claselor (interfeelor) se realizeaz prin specificarea numelui clasei


(interfeei) pe care dorim s o folosim dintr-un pachet:

72
import NumePachet.NumeClasa;
Exemple:
import java.util.Date;
O dat realizat ntr-un fiier importul clasei (interfeei), aceasta poate fi
accesat prin numele ei.
Exemplu:
import java.util.Date;
public class ExData{
public static void main(String[] args) {
Date d=new Date(2003,4,13);
System.out.println(d);
}
}
n cazul n care nu avem nevoie dect de cteva clase dintr-un pachet este
mai eficient s importm clasele dect ntregul pachet.

5.2. Crearea unui pachet

Se creeaz un director cu numele NumePachet n care vor fi salvate toate


fiierele surs ce conin clasele i interfeele pe care dorim s le grupm ntr-un
pachet. Numele directorului d numele pachetului.
n prima linie a fiecrui fiier din directorul NumePachet se specific faptul c
toate clasele din fiierul respectiv vor aparine clasei. Aceasta se realizeaz prin:
package NumePachet;
Prin urmare codul unei clase care se adaug la un pachet arat astfel:
package NumePachet;
public class NumeClasa{
...
}
Instruciunea package acioneaz asupra ntregului fiier surs la nceputul
cruia apare. Cu alte cuvinte nu putem specifica faptul c anumite clase dintr-un
fiier surs aparin unui pachet iar altele altui pachet.
Dac nu este specificat un anumit pachet, clasele unui fiier surs vor face
parte din pachetul implicit (care nu are nici un nume). n general, pachetul implicit
este format din toate clasele i interfeele directorului curent.
Pentru compilare trebuie s ne plasm n directorul printe al directorului
NumePachet.

73
Se execut comanda:
javac NumePachet\*.java

n cazul n care nu sunt erori n pachet, n directorul NumePachet trebuie s


se creeze fiierele .class.
Clasele care folosesc pachetul creat se aeaz n afara directorului. Pentru ca
ele s aib acces la pachet trebuie setat variabila sistem CLASSPATH:
SET CLASSPATH = CaleDirectorNumePachet

Exemplu 1: n directorul c:\lucru se formeaz un director Pachete n care se


salveaz urmtoarele fiiere:
Fiierul A1.java conine clasa:
package Pachete;
public class A1{
int a=0;
public int b=0;
private int c=0;
protected int d=0;

void a(){
System.out.println(a);
}
public void b(){
System.out.println("public "+ b);
}
protected void d(){
System.out.println("protected "+d);
}
}

Fiierul A2.java conine clasa:


package Pachete;
public class A2 implements A3{
public void a3(){
A1 a1=new A1();
a1.a=1;
a1.b=1;
a1.d=1;
System.out.println(a1.a+" "+a1.b+" "+a1.d);
a1.a();
a1.b();
a1.d();
}
}

74
Fiierul A3.java conine clasa:
package Pachete;
public interface A3{
public void a3();
}

Setm variabila CLASSPATH:


SET CLASSPATH = c:\lucru

Pentru compilare ne poziionm n directorul c:\lucru i executm


comanda:
javac Pachete\*.java

Construim o clas de test A4.java pe care o salvm n c:\lucru:


import Pachete.*;
public class A4{
public static void main(String args[]){
A2 a=new A2();
a.a3();
A1 a1=new A1();
//a1.a(); eroare metoda a() este ca i protected
a1.b();
//a1.d(); eroare metoda d() este protected
}
}
Se compileaz i se execut ca orice clas Java .

Exemplu 2: Construim un pachet Tablou care conine o clas Matrice i una


Vector.
package Tablou;
public class Vector{
private double a[];

public Vector(){
a=new double[1];
}

public Vector(int n, double a[]){


this.a=new double[n];
for(int i=0; i<n; i++)
this.a[i]=a[i];
}

public int getLungime(){


return a.length;
}

75
public double getElem(int poz){
return a[poz];
}

public double[] getVector(){


return a;
}

public void setElem(int poz, double val){


a[poz]=val;
}

public void setVector(double a[]){


this.a=new double[a.length];
for(int i=0; i<a.length; i++)
this.a[i]=a[i];
}

public String toString(){


String s="";
for(int i=0; i<a.length; i++)
s=s+a[i]+" ";
return s;
}
}

package Tablou;
public class Matrice{
private double a[][];

public Matrice(){
a=new double[1][];
}

public Matrice(int n, int m, double a[][]){


this.a=new double[n][m];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
this.a[i][j]=a[i][j];
}

public int getNrLin(){


return a.length;
}

public int getNrCol(int l){


return a[l].length;
}

public double getElem(int l, int c){

76
return a[l][c];
}

public double[][] getMatrice(){


return a;
}

public String toString(){


String s="";
for(int i=0; i<a.length; i++){
for(int j=0; j<a[i].length; j++)
s+=a[i][j]+" ";
s+="\n";
}
return s;
}
}

O clas care folosete pachetul Tablou ar fi:


1. import Tablou.*;
2. public class TestTablou{
3. public static void main(String args[]){
4. double x[][]={{2,4},{5,6},{1,3}};
5. Matrice m=new Matrice(3,2,x);
6. System.out.println(m);
7. double y[]={2,4,5,6};
8. Vector v=new Vector(4,y);
9. System.out.println(v);
10. java.util.Vector vv=new java.util.Vector(5);
11. for (int i=0;i<5;i++)
12. vv.add(new Integer(i));
13. System.out.println(vv);
14. }
15. }

Se observ c n linia 10 se creeaz un obiect folosind de data aceasta clasa


Vector din pachetul java.util. Pentru a face diferen ntre clasa pachetului
nostru i clasa pachetului java.util trebuie s specificm i numele pachetului.

77
6. Excepii

6.1. Aspecte generale

O excepie este un eveniment ce se produce n timpul execuiei unui program


i care provoac ntreruperea cursului normal al execuiei.
De exemplu, o mprire la 0 sau utilizarea unui indice care depete o
dimensiune declarat a unui tablou reprezint un eveniment care perturb execuia
normal a programului este vorba despre o excepie. Cnd apare o astfel de
eroare n timpul execuiei programului sistemul genereaz automat un obiect de tip
excepie ce conine:
informaii despre excepia respectiv;
starea programului n momentul producerii excepiei
Exemplu:
public class Exceptii {
public static void main(String args[]) {
int v[] = new int[10];
v[10] = 0; //exceptie, vectorul are elementele v[0]...v[9]
System.out.println("Aici nu se mai ajunge...");
}
}

La rularea programului va fi generat o excepie i se va afia mesajul :


Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException :3
at Exceptii.main (Exceptii.java:4)

Java dispune de un mecanism care permite programatorului s preia controlul


programului n momentul n care apare o excepie i s o trateze.

78
Crearea unui obiect de tip excepie se numete aruncarea unei excepii
("throwing an exception"). n momentul n care o metod genereaz o excepie
(arunc o excepie) sistemul de execuie este responsabil cu gsirea unei secvene
de cod dintr-o metod care s trateze acea excepie. Excepiile sunt propagate
napoi prin secvena de metode apelate pn cnd o anumit metod prinde
excepia. Secvena de cod dintr-o metod care trateaz o anumit excepie se
numete analizor de exceptie ("exception handler") iar interceptarea i tratarea
excepiei se numete prinderea excepiei ("catch the exception").
Cu alte cuvinte la apariia unei erori este "aruncat" o excepie iar cineva trebuie s
o "prind" pentru a o trata. Dac sistemul nu gsete nici un analizor pentru o
anumita excepie atunci programul Java se oprete cu un mesaj de eroare.
Ierarhia claselor ce conin excepii este:

Toate excepiile Java sunt subclase ale clasei Exception.

6.2. Instruciunea try

try{
instruciuni ce pot declana excepii
}
[catch(ClasaExceptie obiectExceptie){
instruciuni de tratare a excepiei de clas ClasaExceptie
}]*
[finally{
instruciuni care se execut necondiionat n final
}]

79
Instruciunea try conine un bloc de instruciuni ce trebuie executate. Punerea
unor instruciuni n cadrul lui try nseamn c exist posibilitatea apariiei unor
excepii sau terminrii anormale a unei instruciuni. O instruciune try poate avea
oricte clauze catch (opionale) n care sunt tratate excepiile. De asemenea,
instruciunea try poate avea o clauz finally a crui bloc se execut ntotdeauna
naintea prsirii instruciunii try. Instruciunea try trebuie s aib fie o clauz
catch, fie una finnaly.

Formele generale ale instruciunii try.


1.
try{
...
}
catch(ClasaExceptie obiectExceptie){
...
}

2.
try{
...
}
catch(ClasaExceptie obiectExceptie){... }
...
catch(ClasaExceptie obiectExceptie){... }

3.
try{
...
}
finnaly{... }

4.
try{
...
}
catch(ClasaExceptie obiectExceptie){... }
...
catch(ClasaExceptie obiectExceptie){... }
finnaly{... }

80
n cazul n care este declanat o excepie i exist mai multe clauze catch,
este cutat, n ordine, acea clauz care poate trata excepia. Adic este gsit o
clauz a crui parametru are un tip care se potrivete cu tipul excepiei. Ordinea n
care clauzele catch apar este important: clauzele catch mai specifice trebuie s
apar naintea celor mai generale. Dac nu exist o clauz care s trateze excepia,
aceasta este propagat n sus, la instruciunile imediat urmtoare.
Excepii uzuale:
ArithmeticException Depire limit tip sau mprire la 0
NumberFormatException Conversia nepermis a unui
String la un tip numeric
IndexOutOfBoundsException Indice ilegal ntr-un ir
NegativeArraySizeException Crearea unui ir cu numr negativ
de elemente
NullPointerException Tentativ de a folosi o referin care
are valoarea null
SecurityException nclcarea normelor de securitate n
timpul execuiei

6.3. Crearea unei excepii

Adeseori poate aprea necesitatea crerii unor excepii proprii pentru a pune
n eviden cazuri speciale de erori provocate de clasele unei librrii, cazuri care nu
au fost prevzute n ierarhia excepiilor standard Java.
O excepie proprie trebuie s se ncadreze n ierarhia excepiilor Java, cu alte
cuvinte clasa care o implementeaz trebuie s fie subclas a clasei Exception.
public class ExceptieNoua extends Exception{ ... }

Exemplu:
1. public class Exc extends Exception{
2. public Exc(){
3. super(); //apeleaza constructorul clasei Exception
4. ...
5. }
6. }

81
ntr-o clas n care se dorete folosirea unei excepii exist o metod care creeaz
excepia (obiect al clasei de excepii), mai multe metode care arunc excepia
primit i, eventual o metod care o prinde, adic o trateaz. Dac ntr-o metod
apare o excepie creat n metoda respectiv sau ca urmare a apelrii unei
metode care a aruncat o excepie, atunci ea trebuie fie s fie tratat, fie s fie
aruncat mai departe. n ambele cazuri codul care ar putea genera excepia trebuie
pus n cadrul unei instruciuni try care s aib o clauz catch cu parametru care
s coincid cu clasa excepiei. Dac excepia se dorete s fie tratat, atunci n
clauza catch se pune un cod corespunztor. Dac se dorete ca excepia s nu fie
tratat atunci ea trebuie aruncat mai departe (metodei care a fcut apelul) i acest
lucru se realizeaz prin adugarea clauzei throws ClasaExceptie n antetul
metodei.

Exemplu 1: n clasa RationalIred se verific dac numitorul fraciei este 0. Dac da


atunci se creeaz o excepie linia 53.
1. public class Exc extends Exception{
2. public Exc(){
3. super();
4. System.out.println("Numitor 0");
5. }
6. }

7. public class Rational{


8. private long m,n;

9. public Rational(){
10. this(1,0);
11. }
12. public Rational(long m,long n){
13. setm(m);
14. setn(n);
15. }
16. public Rational(long m){
17. this(m,1);
18. }
19. public void setm(long m){
20. this.m=m;
21. }
22. public long getm(){
23. return m;
24. }
25. public void setn(long n){
26. this.n=n;
27. }

82
28. public long getn(){
29. return n;
30. }
31. public Rational produs(Rational r){
32. return new Rational(m*r.m,n*r.n);
33. }
34. public String toString(){
35. return m+"/"+n;
36. }
37. }

38. public class RationalIred extends Rational {


39. public RationalIred(){
40. super();
41. }
42. public RationalIred(long m,long n) throws Exc{
43. setm(m);
44. try{
45. setIn(n);
46. }
47. catch(Exc e){throw e;}
48. }
49. public void setIn(long n) throws Exc{
50. if (n!=0)
51. super.setn(n);
52. else
53. throw new Exc();
54. }
55. private void simplifica(){
56. long x=getm(), y=getn();
57. while(x!=y){
58. if(x>y) x-=y;
59. else y-=x;
60. }
61. setm(getm()/x);
62. setn(getn()/x);
63. }
64. public RationalIred produs(RationalIred r){
65. RationalIred p=new RationalIred();
66. p.setm(getm()*r.getm());
67. p.setn(getn()*r.getn());
68. p.simplifica();
69. return p;
70. }
71. }

72. public class TestRational{


73. public static void main(String[] args) {
74. RationalIred r1,r2,p;
75. try{
76. r1=new RationalIred(
77. Integer.parseInt(args[0]),

83
78. Integer.parseInt(args[1]));
79. r2=new RationalIred(
80. Integer.parseInt(args[2]),
81. Integer.parseInt(args[3]));
82. }
83. catch(Exc e){
84. System.exit(1);
85. }
86. System.out.println(r1);
87. System.out.println(r2);
88. p=r1.produs(r2);
89. System.out.println(p);
90. }
91. }

84
7. Intrri i ieiri

Informaia poate fi preluat de oriunde (fiier, disk, reea, memorie, alt


program) i poate fi de orice tip (obiecte, caractere, imagini, sunete).
Pentru a aduce informaii, un program Java deschide un flux (canal de
comunicaii) la o surs de informaii i citete informaia. Un flux care citete date se
numete flux de intrare.

Similar, un program poate trimite informaii ctre o destinaie extern


deschiznd un flux (canal de comunicaii) ctre acea destinaie i scriind serial
informaiile respective. Un flux care scrie date se numete flux de ieire.

Algoritmul de citire este:

85
deschide flux
ct timp exist informaie
citete informaia
nchide flux

Algoritmul de afiare este:


deschide flux
ct timp exist informaie
scrie informaia
nchide flux

Pachetul java.io conine o colecie de clase folosite pentru citiri i afiri.


Prin urmare, orice program care necesit operaii de intrare / ieire trebuie s
importe pachetul java.io:
import java.io.*.

7.1. Clasificarea fluxurilor

Exist trei tipuri de clasificare a fluxurilor:


Dup "direcia" canalului de comunicaie deschis, fluxurile se mpart n:
o fluxuri de intrare (pentru citirea datelor)
o fluxuri de ieire (pentru scrierea datelor)
Dup tipul de date pe care opereaz:
o fluxuri de octei (comunicarea serial se realizeaz pe 8 bii)
o fluxuri de caractere (comunicarea serial se realizeaz pe 16
bii)
Dup aciunea lor:
o fluxuri pentru citirea / scrierea datelor
o fluxuri pentru procesarea datelor

7.2. Ierarhia claselor pentru lucrul cu fluxuri

7.2.1. Fluxuri de caractere

86
Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de caractere
sunt Reader (pentru fluxuri de intrare) i Writer (pentru fluxuri de ieire).
Ierarhia claselor pentru fluxuri de intrare pe caractere este:

Ierarhia claselor pentru fluxuri de ieire pe caractere este:

7.2.2. Fluxuri de octei

Clasele rdcin pentru ierarhia claselor ce se ocup cu fluxurile de octei sunt


InputStream (pentru fluxuri de intrare) i OutputStream (pentru fluxuri de ieire).
Subclasele lor sunt folosite pentru citiri i scrieri de date binare cum ar fi imagini i
sunete.
Ierarhia claselor pentru fluxuri de intrare pe octei:

87
Ierarhia claselor pentru fluxuri de ieire pe octei:

7.3. Superclasele de intrare / ieire

Clasele Reader i InputStream definesc metode similare pentru citirea


datelor, tipul parametrilor variind.
Clasa Reader
int read()
int read(char cbuf[ ])
int read(char cbuf[ ], int index, int lungime)
Clasa InputStream
int read()
int read(byte cbuf[ ])
int read(byte cbuf[ ], int index, int lungime)

88
Analog, clasele Writer i OutputStream definesc metode similare pentru
afiarea datelor, tipul parametrilor variind.
Clasa Writer
int write()
int write(char cbuf[ ])
int write(char cbuf[ ], int index, int lungime)
Clasa OutputStream
int write()
int write(byte cbuf[ ])
int write(byte cbuf[ ], int index, int lungime)

7.4. Crearea unui flux

Orice flux este un obiect al clasei ce implementeaz fluxul respectiv. Crearea


unui flux se realizeaz similar cu crearea obiectelor, prin instruciunea new().
Exemple:
//crearea unui flux de intrare pe caractere
FileReader in = new FileReader("fisier_intrare.txt");

//crearea unui flux de iesire pe caractere


FileWriter out = new FileWriter("fisier_iesire.txt");

//crearea unui flux de intrare pe octeti


FileInputStream in = new
FileInputStream("fisier_intrare.txt");

//crearea unui flux de iesire pe octeti


FileOutputStrem out = new
FileOutputStream("fisier_iesire.txt");

Prin urmare, crearea unui flux de date care scrie / citete informaii de la un
dispozitiv extern are formatul general:
FluxPrimitiv numeFlux = new FluxPrimitiv (dispozitiv extern)

89
7.5. Citirea datelor de la tastatur

7.5.1. Obiectul System.in

n general, tastatura reprezint perifericul standard pentru introducerea datelor.


Clasa System conine o variabil membru care reprezint tastatura sau fluxul de
intrare standard. Aceast variabil membru se numete in i este o instan a clasei
InputStream.

Exemplu 1: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un


ir de caractere. Citirea se ncheie cnd se apas tasta Enter.
1. class Citire1 {
2. public static void main(String args[]) {
3. StringBuffer s=new StringBuffer();
4. char c;
5. try {
6. while((c=(char)System.in.read()) != \n)
7. s.append(c);
8. }
9. catch(Exception e) {
10. System.out.println(Error:+e.getMessage());
11. }
12. System.out.println("Sirul este:"+s);
13. }
14. }

Exemplu 2: Se citesc de la tastatur caractere. Ele sunt memorate ntr-un vector de


bytes (linia 5). Citirea se ncheie cnd se apas tasta Enter. Pe baza vectorului se
formeaz un String (linia 10) care este afiat.
1. class Citire2 {
2. public static void main(String args[]) {
3. byte buf[]=new byte[30];
4. try {
5. System.in.read(buf);
6. }
7. catch(Exception e) {
8. System.out.println(Error:+e.getMessage());
9. }
10. String s=new String(buf);
11. System.out.println(s);
12. }
13. }

90
7.5.2. Clasa InputStreamReader

Reprezint legtura dintre fluxurile de octei i fluxurile de caractere: citete


octei i i transform n caractere. Transformarea octeilor n caractere este
efectuat conform unei reguli de codificare. Dac nu se specific o astfel de regul,
atunci se utilizeaz codificarea implicit (dat de proprietatea de sistem file
encoding).
Clasa InputStreamReader are urmtorii constructori:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String enc)

Metoda principal pentru citirea unui caracter este:


int read()

Exemplu 3: Se citesc de la tastatur caractere. Fiecare caracter citit se adaug la un


ir de caractere. Citirea se ncheie cnd se apas tasta Enter.
1. import java.io.*;
2. class Citire3 {
3. public static void main(String args[]) {
4. InputStreamReader in=
5. new InputStreamReader(System.in);
6. char c;
7. StringBuffer s=new StringBuffer();
8. try {
9. while((c=(char)in.read()) != \n)
10. s.append(c);
11. }
12. catch(Exception e) {
13. System.out.println(Error:+e.getMessage());
14. }
15. System.out.println(s);
16. }
17. }

7.5.3. Clasa BufferedReader

91
n cazul folosirii clasei InputStreamReader, citirea se face caracter cu
caracter (adic, discul este accesat de fiecare dat). Pentru a crete eficiena se
folosete un flux care utilizeaz o zon tampon pentru citire (BufferedReader).
Clasa BufferedReader are definit metoda read() cu aceeai signatur ca i cea
definit n InputStreamReader dar, n plus, definete i metoda readLine().
Aceast metod poate fi folosit pentru a citi un ir de caractere terminat cu \n,\r
sau \r\n.

Exemplu 4: Se introduce un ir de caractere de la tastatur. La apsarea tastei Enter


irul este citit n ntregime i este depus ntr-un String.
1. import java.io.*;
2. class Citire4 {
3. public static void main(String args[]) {
4. InputStreamReader in1=
new InputStreamReader(System.in);
5. String s=new String();
6. try {
7. BufferedReader in= new BufferedReader(in1);
8. s=in.readLine();
9. }
10. catch(Exception e) {
11. System.out.println(Error:+e.getMessage());
12. }
13. System.out.println(s);
14. }
15. }

7.6. Citirea i scrierea datelor din fiier

7.6.1. Clasele FileReader i FileWriter

Clasa FileReader este folosit la citirea datelor dintr-un fiier text. Cei mai
importani constructori ai si sunt:
creeaz un flux care citete caractere din fiierul nume
public FileReader(String nume) throws
FileNotFoundException

92
creeaz un flux care citete caractere din fiierul varFis.
public FileReader(File varFis) throws
FileNotFoundException

Clasa FileWriter este folosit la scrierea datelor ntr-un fiier text. Cei mai
importani constructori ai si sunt:
creeaz un flux care scrie caractere in fiierul nume
public FileWriter (String nume) throws IOException

creeaz un flux care citete caractere din fiierul varFis


public FileWriter (File varFis) throws IOException

Exemplu 5: Citete caracter cu caracter un fiier n linia 8. Cnd valoarea


caracterului citit este 1 nseamn c s-a ajuns la sfritul fiierului. Caracterele sunt
adugate la un ir de caractere n linia 9, care la sfrit este afiat.
1. import java.io.*;
2. public class CitireFis {
3. public static void main(String args[]) {
4. int c;
5. StringBuffer s=new StringBuffer();
6. try {
7. FileReader in= new FileReader(cit4.txt);
8. while((c=in.read())!=-1)
9. s.append((char)c);
10. }
11. catch(Exception e) {
12. System.out.println(Error:+e.getMessage());
13. }
14. System.out.println(s);
15. }
16. }

Exemplu 6: Copiaz coninutul unui fiier n alt fiier.


1. import java.io.*;
2. public class CitireFis {
3. public static void main(String[] args){
4. try{
5. FileReader in = new FileReader("cit4.txt");
6. FileWriter out = new FileWriter("out.txt");
7. int c;
8. while ((c = in.read()) != -1)
9. out.write(c);
10. in.close();
11. out.close();
12. }

93
13. catch (IOException e) {
14. System.out.println("Error: " + e.toString());
15. }
16. }
17. }

8. Applet-uri

8.1. Ce este un applet?

Unul dintre scopurile limbajului Java a fost crearea unor programe mici
(applet) care s ruleze n interiorul unui browser Web.
Un applet reprezint o suprafa de afiare (container) ce poate fi inclus ntr-o
pagina Web i gestionat printr-un program Java. Un astfel de program se mai
numete miniaplicaie.
Codul unui applet poate fi format din una sau mai multe clase. Una dintre
acestea este principal i extinde clasa JApplet, fiind clasa ce trebuie specificat n
documentul HTML ce descrie pagina de Web n care dorim s includem applet-ul.
Diferena fundamental dintre un applet i o aplicaie const n faptul c, un applet
nu poate fi executat independent, ci va fi executat de browser-ul n care este
ncrcat pagina Web ce conine applet-ul respectiv. O aplicaie independent este
executat prin apelul interpretorului java, avnd ca parametru numele clasei
principale a aplicaiei, clasa principal fiind cea care conine metoda main.
Un applet nu se poate atinge de hardisk-ul local prin citiri sau scrieri. Scrierea
este mpiedicat din cauza viruilor care s-ar putea instala, iar citirea deoarece nu se
dorete preluarea de informaii de pe staia local.
Un neajuns al applet-urilor ar putea fi timpul destul de lung necesar ncrcrii
lor. O metod de nlturare a acestui neajuns ar fi arhivarea applet-urilor ntr-un fiier
JAR (Java ARchive) care s cuprind toate componentele. Astfel, fiierul compresat
este download-at la o singur tranzacie cu server-ul.
Un avantaj al folosirii applet-urilor este lipsa necesitii instalrii lor. De fapt,
instalarea este automat de cte ori utilizatorul ncarc pagina Web care conine
applet-ul.
Pachetul care ofer suport pentru crearea de applet-uri este javax.swing.
Clasa JApplet furnizeaz tot ce este necesar pentru construirea i ntreinerea unui

94
applet. Crearea unui applet implic implementarea metodelor puse la dispoziie de
clasa JApplet care ne ajut s descriem comportamentul dorit al applet-ului.
Ierarhia de clase este:
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Panel
|
+--java.applet.Applet
|
+--javax.swing.JApplet

8.2. Funciile unui applet

Execuia unui applet ncepe n momentul n care un browser afieaz o pagin


Web n care este inclus applet-ul respectiv i poate trece prin mai multe etape.
Fiecare etap este strns legat de un eveniment generat de ctre browser i
determin apelarea unei metode specifice din clasa ce implementeaz appletul.
ncrcarea n memorie se creeaz o instan a clasei principale a
applet-ului i se ncarc n memorie.
Iniializarea se apeleaz metoda init ce permite iniializarea
diverselor variabile, citirea unor parametri de intrare, etc. Metoda init
este responsabil i pentru aezarea tuturor componentelor pe form.
Pornirea se apeleaz metoda start
Execuia propriu-zis const n interaciunea dintre utilizator i
componentele afiate pe suprafaa applet-ului.
Oprirea temporar n cazul n care utilizatorul prsete pagina Web
n care ruleaz applet-ul se apeleaz metoda stop a acestuia, dndu-i
astfel posibilitatea s se opreasc temporar ct timp nu este vizibil,
pentru a nu consuma inutil din timpul procesorului. Acelai lucru se
ntmpl dac fereastra browser-ului este minimizat. n momentul cnd
pagina Web ce conine applet-ul devine din nou activ, va fi reapelat
metoda start.

95
Oprirea definitiv La nchiderea tuturor instanelor browser-ului folosit
pentru vizualizare, applet-ul va fi eliminat din memorie i va fi apelat
metoda destroy a acestuia, pentru a-i permite s elibereze resursele
deinute. Apelul metodei destroy este ntotdeauna precedat de apelul lui
stop.

8.3. Structura general a unui applet

import javax.swing.JApplet;
import java.awt.*;
import java.awt.event.*;

public class StructuraApplet extends JApplet {

public void init() {


/* codul descrie aciunile care dorim s fie efectuate la instanierea clasei
applet-ului. */
}

public void start() {


/* codul descrie aciunile care dorim s fie executate la lansarea applet-
ului n execuie sau la rentoarcerea n pagina applet-ului */
}

public void paint(Graphics g) {


/* codul descrie aciunile care dorim s fie executate la fiecare redesenare
a ferestrei applet-ului */
}

public void stop() {


/* codul descrie aciunile care dorim s fie executate la oprirea temporar
a applet-ului (pagina Web nu mai este vizibil, fereastra browser-ului este
minimizat, etc) */
}

public void destroy() {


/* codul descrie aciunile care dorim s fie executate la distrugerea applet-
ului (browser-ul prsete documentul .html din care a fost apelat applet-ul) */
}

96
}

Observaie: Aceste metode sunt apelate automat de browser i nu trebuie


apelate explicit din program !

8.4. HTML

Un browser Web interpreteaz coninutul (textul) unui fiier .html (Hyper Text
Markup Language). Limbajul HTML const ntr-o colecie de marcaje (tag-uri).
Marcajele au rolul de a descrie modul n care va aprea afiat textul, de a comanda
browser-ului s utilizeze i alte resurse Internet, aflate n fiiere diferite.
Sintaxa unui marcaj este:
<NumeTag [parametri ]> text </NumeTag>

Parametrii se scriu sub forma:


NumeParametru = valoare
Structura unui document .html este:
<HTML>
<HEAD>
<TITLE>
titlul documentului
</TITLE>
</HEAD>
<BODY>
. . .
<APPLET parametrii>
<PARAM parametrii>
<PARAM parametrii>
. . .
<PARAM parametrii>
</APPLET>
. . .
</BODY>
</HTML>

Considerm cunoscute noiunile de baz ale HTML. Ceea ce ne intereseaz


pentru construirea applet-urilor este marcajul <APPLET>. Acesta are parametrii
obligatorii i opionali.
Parametrii obligatorii:

97
CODE valoarea lui este numele fiierului care conine clasa applet-
ului: NumeClasa.class;
WIDTH valoarea lui este limea ferestrei atribuit de browser applet-
ului la afiarea documentului .html;
HEIGHT valoarea lui este nlimea ferestrei atribuit de browser
applet-ului la afiarea documentului .html;
Parametrii opionali:
CODEBASE valoarea lui este adresa URL (Universal Resource
Locator) sau calea la fiierul cu clasa applet-ului. Dac parametru
lipsete, cutarea clasei se face n directorul curent (cel din care a fost
ncrcat fiierul .html);
VSPACE valoarea lui este nlimea zonei (exprimat n pixeli) care
se las liber deasupra i dedesubtul ferestrei applet-ului;
HSPACE valoarea lui este limea zonei (exprimat n pixeli) care se
las liber n stnga i n dreapta ferestrei applet-ului;
ALT Specific textul ce trebuie afiat dac browser-ul nelege
marcajul <APPLET> dar nu poate rula applet-uri Java.
NAME Ofer posibilitatea de a da un nume respectivei instane a
applet-ului, astfel nct mai multe applet-uri aflate pe aceeai pagin s
comunice ntre ele folosindu-se de numele lor.
ALIGN Semnific modalitatea de aliniere a applet-ului n pagina Web.
Acest atribut poate primi una din urmtoarele valori: left, right,
top, texttop, middle, absmiddle, baseline, bottom,
absbottom, semnificaiile lor fiind aceleai ca i la marcajul IMG.
Marcajul <PARAM> nu este obligatoriu i poate s apar atunci cnd se
dorete ca applet-ul s preia parametrii. Un parametru este definit prin:
NAME reprezint numele variabilei recunoscut de applet;
VALUE reprezint valoarea recepionat de applet; este de tip String.

8.5. Exemple

Exemplu 1: Exemplific ordinea apelrii metodelor.


import javax.swing.*;

98
import java.awt.*;

public class app1 extends JApplet{


public void init(){
System.out.println("Sunt in init");
}

public void start(){


System.out.println("Sunt in start");
}

public void paint(Graphics g){


g.drawString("Sunt in paint", 20, 120);
System.out.println("Sunt in paint");
}

public void stop(){


System.out.println("Sunt in stop");
}
public void destroy(){
System.out.println("Sunt in destroy");
}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Primul Applet </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app1.class" WIDTH=300 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

Exemplu 2: Afieaz nite figuri geometrice.


import javax.swing.*;
import java.awt.*;

public class app2 extends JApplet{


public void paint(Graphics g){
g.setColor(Color.red);
g.drawRect(10,10,100,200);
g.setColor(new Color(200,100,255));
g.fillRect(20,20,50,50);
g.setColor(Color.blue);
g.drawOval(60,60,50,50);
}
}

99
Documentul .html este:
<HTML>
<HEAD>
<TITLE> Figuri geometrice </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app2.class" WIDTH=300 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

Exemplu 3: Afieaz lista tuturor font-urilor cunoscute de sistem.


import java.awt.*;
import javax.swing.*;

public class app3 extends JApplet


{
public void init(){
Container c=getContentPane();
c.setLayout(new FlowLayout());
JTextArea ta=new JTextArea();
JScrollPane sp=new JScrollPane(ta);
sp.setPreferredSize(new Dimension(100, 100));
c.add(sp, BorderLayout.CENTER);
GraphicsEnvironment gr=GraphicsEnvironment.
getLocalGraphicsEnvironment();
Font []f=gr.getAllFonts();
for (int i=0;i<f.length;i++)
ta.append(f[i].getFontName()+"\n");
}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Ce de mai font-uri !!! </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app3.class" WIDTH=300 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

Exemplu 4: Seteaz un font i i tiprete caracteristicile.


import javax.swing.JApplet;

100
import java.awt.Graphics;
import java.awt.Font;

public class app6 extends JApplet {


private Font fon;

public void init()


{
fon=new Font("Courier", Font.ITALIC + Font.BOLD, 24);
}
public void paint (Graphics g)
{
int stil, dim;
String str, nume;

g.setFont (fon);
stil = fon.getStyle();

if ( stil == Font.PLAIN)
str = "Plin";
else if (stil == Font.BOLD)
str = "Bold";
else if (stil == Font.ITALIC)
str = "Italic";
else
str = "Bold italic";

dim = fon.getSize();
str += dim + " puncte ";
nume = fon.getName();
str += nume;

g.drawString (str, 20, 40);


g.drawString ("Familia de font-uri este " +
fon.getFamily(), 20, 60);

}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Ce font frumos !!! </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app6.class" WIDTH=700 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

101
Exemplu 5: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei.
import javax.swing.JApplet;
import java.awt.*;

public class app7 extends JApplet {


int xValues[] = {20, 40, 50, 30, 20, 15, 20};
int yValues[] = {20, 20, 30, 50, 50, 30, 20};

private Polygon p2;

public void init ()


{
p2 = new Polygon();
p2.addPoint (70, 70);
p2.addPoint (90, 70);
p2.addPoint (100, 80);
p2.addPoint (80, 100);
p2.addPoint (70, 100);
p2.addPoint (65, 80);
p2.addPoint (60, 60);
}
public void paint (Graphics g)
{
//deseneaza conturul unui poligon
g.drawPolygon (xValues, yValues, 7);
//deseneaza un poligon
g.fillPolygon (p2);
//copiaza cele doua poligoane la noile coordonate
g.copyArea (0, 0, 100, 100, 10,10 );
}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Ce poligoane... </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app7.class" WIDTH=300 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

Exemplu 6: Deseneaz un poligon i l copiaz ntr-o alt zon a ferestrei.


import javax.swing.JApplet;
import java.awt.*;

102
public class app7 extends JApplet {
int xValues[] = {20, 40, 50, 30, 20, 15, 20};
int yValues[] = {20, 20, 30, 50, 50, 30, 20};

private Polygon p2;

public void init ()


{
p2 = new Polygon();
p2.addPoint (70, 70);
p2.addPoint (90, 70);
p2.addPoint (100, 80);
p2.addPoint (80, 100);
p2.addPoint (70, 100);
p2.addPoint (65, 80);
p2.addPoint (60, 60);
}
public void paint (Graphics g)
{
//deseneaza conturul unui poligon
g.drawPolygon (xValues, yValues, 7);
//deseneaza un poligon
g.fillPolygon (p2);
//copiaza cele doua poligoane la noile coordonate
g.copyArea (0, 0, 100, 100, 10,10 );
}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Ce poligoane... </TITLE>
</HEAD>
<BODY>
<APPLET CODE="app7.class" WIDTH=300 HEIGHT=200>
</APPLET>
</BODY>
</HTML>

Exemplu 7: Suma a dou numere folosind preluarea parametrilor.


import javax.swing.*;
import java.awt.*;

public class suma extends JApplet


{
int m,n;
String s;

public void init(){

103
String sm=getParameter("m"),
sn=getParameter("n");
m=Integer.parseInt(sm);
n=Integer.parseInt(sn);
s=new Integer(m+n).toString();
}

public void paint(Graphics g){


g.drawString("Cmmdc = "+s, 50, 60 );
}
}

Documentul .html este:


<HTML>
<HEAD>
<TITLE> Suma... </TITLE>
</HEAD>
<BODY>
<APPLET CODE="suma.class" WIDTH=300 HEIGHT=200>
<PARAM name="m" value="2">
<PARAM name="n" value="3">
</APPLET>
</BODY>
</HTML>

104
9. Interfee grafice

9.1. Ce este o interfa grafic?

Interfaa grafic se refer la toate tipurile de comunicare vizual ntre un


program i utilizatorii si. Interfaa grafic se refer nu numai la ceea ce utilizatorul
vede pe ecran ci i la toate mecanismele de comunicare ntre acesta i program.
Limbajul Java pune la dispoziie numeroase clase pentru implementarea
diferitelor functionaliti ale interfaei grafice, ns ne vom ocupa n continuare de
acelea care permit realizarea unei intefee grafice cu utilizatorul (GUI Graphical
User Interface).
n principiu, crearea unei aplicaii grafice presupune urmtorii pai:
1. crearea unei suprafee de afiare (cum ar fi o fereastr) pe care vor fi
aezate obiectele grafice care servesc la comunicarea cu utilizatorul
(butoane, controale de editare, texte, etc);
2. crearea i aezarea obiectelor grafice pe suprafaa de afiare n
poziiile corespunztoare;
3. definirea unor aciuni care trebuie s se execute n momentul cnd
utilizatorul interacioneaz cu obiectele grafice ale aplicaiei;
4. "ascultarea" evenimentelor generate de obiecte n momentul
interaciunii cu utilizatorul i executarea aciunilor corespunztoare aa
cum au fost ele definite.

n Java exist dou pachete de clase care ofer servicii grafice: java.awt i
javax.swing. n acest curs ne vom ocupa de pachetul Swing care este o extensie a
pachetului awt. "Swing" a fost numele de cod dat proiectului care dezvolta
componente noi. ncepnd cu javax.swing este numele pachetelor pentru Swing
API.

105
Majoritatea obiectelor grafice sunt subclase ale clasei JComponent, clas
care definete generic o component grafic care poate interaciona cu utilizatorul.
Aadar, printr-o component grafic vom nelege orice obiect care are o
reprezentare grafic ce poate fi afiat pe ecran i care poate interaciona cu
utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc.
n general, toate componentele sunt definte de clase proprii ce se gsesc n pachetul
javax.swing, clasa JComponent fiind superclasa abstract a tuturor acestor clase.
Crearea obiectelor grafice nu realizeaz automat i afiarea lor pe ecran. Mai
nti ele trebuie aezate pe o suprafa de afiare, care poate fi o fereastr sau
suprafaa unui applet, i vor deveni vizibile n momentul n care suprafaa pe care
sunt afiate va fi vizibil. O astfel de suprafa pe care se aeaz obiectele grafice
reprezint o instan a unei clase obinut prin extensia clasei Container; din acest
motiv suprafeele de afiare vor mai fi numite i containere. Clasa Container este o
subclas aparte a clasei Component, fiind la rndul ei superclasa tuturor suprafeelor
de afiare Java (ferestre, applet-uri, etc).
Pachetul Swing ofer programelor care folosesc componentele lui posibilitatea
s-i aleag natura interfeei (look and feel) sau, pur i simplu, s o conserve pe
cea caracteristic platformei respective.

9.2. Primele aplicaii Swing

9.2.1. Exemple

Exemplu 1: O aplicaie de sine stttoare, care nu utilizeaz applet-ul.


1. import javax.swing.*;
2. import java.awt.*;
3. import java.awt.event.*;

4. public class SwingTest {


5. private static String Prefix = "Numarul de click-
uri: ";
6. private int nrClick = 0;
7. JLabel eticheta = new JLabel(Prefix + "0 ");
8. JButton buton = new JButton("Buton Swing!");
9.
10. public Component creazaComponente() {
11. buton.addActionListener(new ActionListener() {

106
12. public void actionPerformed(ActionEvent e) {
13. nrClick++;
14. eticheta.setText(Prefix + nrClick);
15. }
16. });
17. JPanel panou = new JPanel();
18. panou.setBorder(BorderFactory.createEmptyBorder(
30,30,10,30));
19. panou.setLayout(new FlowLayout());
20. panou.add(buton);
21. panou.add(eticheta);
22. return panou;
23. }//creazaComponente
24.
25. public static void main(String[] args) {
26. try {
27. UIManager.setLookAndFeel(

UIManager.getLookAndFeel());
28. }catch (Exception e) { }
29. JFrame frame = new JFrame("Prima aplicatie
Swing");
30. SwingTest app = new SwingTest();
31. Component comp = app.creazaComponente();
32. frame.getContentPane().add(comp);
33. frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
34. frame.pack();
35. frame.setVisible(true);
36. }//main
37. }//class

n linia 17 se creaz un panel (panou) pe care vor fi aezate componentele.


n linia 18 se seteaz marginea panel-ului cu dimensiunile pentru (sus,
stnga, jos, dreapta).
n linia 29 se creaz container-ul principal (din vrful ierarhiei) i n linia 32 se
adaug componentele pe el.
n liniile 3335 se ncheie setrile pentru frame i se afieaz.

Exemplu 2: O aplicaie care utilizeaz applet-ul.


1. import javax.swing.*;
2. import java.awt.*;

3. public class SwingAppletTest extends JApplet {

107
4. public void init() {
5. JLabel eticheta=new JLabel("O eticheta
frumoasa!");
6. eticheta.setHorizontalAlignment(JLabel.CENTER);
7. label.setBorder(BorderFactory.createMatteBorder(
1,1,2,2,Color.black));
8. getContentPane().add(eticheta,
BorderLayout.CENTER);
9. }
10. }

9.2.2. Comentarea exemplelor

9.2.2.1 Alegerea naturii interfeei


n codul urmtor se specific natura interfeei:
try {
UIManager.setLookAndFeel(
UIManager. getLookAndFeel());
} catch (Exception e) { }

9.2.2.2 Setarea container-ului principal (din vrful ierarhiei)


Orice program care prezint o GUI Swing conine cel puin un container Swing.
n general, container-ele principale sunt instane ale lui JFrame, JDialog sau (pentru
appleturi) JApplet. Fiecare obiect JFrame implementeaz o singur fereastr
principal, fiecare obiect JDialog cte o fereastr secundar i fiecare obiect
JApplet implementeaz un applet n cadrul unui browser. Container-ul principal
Swing furnizeaz suportul necesar componentelor Swing pentru a fi afiate i pentru
a manipula evenimentele. n exemplu 1 container-ul folosit este JFrame i este creat
n linia 29. n exemplu 2 container-ul folosit este JApplet (vezi linia 3).
Aplicaiile Swing grupeaz etichetele i butoanele ntr-un container (un
JPanel) nainte s le adauge pe frame. Adugarea componentelor pe panel
nseamn c ele vor fi controlate de manager-ul de layout al panel-ului. Manager-ul
de layout al unui container determin dimensiunea i poziia fiecrei componente
care este adugat pe container.

108
9.2.2.3 Manipularea evenimentelor
Aplicaia din exemplu 1 conine dou evenimente tratate. Una trateaz click-ul
pe buton (action events); cealalt trateaz nchiderea ferestrei (window events):
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
numClicks++;
label.setText(labelPrefix + numClicks);
}
});
...
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

9.3. Containere principale

Dup cum am vzut, suprafeele de afiare ale componentelor grafice


(containerele) sunt extensii ale clasei Container.
Spre deosebire de un applet care i poate plasa componentele direct pe
suprafaa de afiare a browser-ului n care ruleaz, o aplicaie independent are
nevoie de propriile ferestre pe care s fac afiarea componentelor sale grafice. O
astfel de suprafa pe care se aeaz obiectele grafice se numete suprafa de
afiare sau container i reprezint o instan a unei clase obinut prin extensia
superclasei Container.
Cele mai importante containere principale sunt: JFrame, JDialog,
JWindow i JApplet. Ierarhia de clase este:
java.awt.Container
|__ java.awt.Panel
|__ java.applet.Applet
|__ javax.swing.JApplet
|__ java.awt.Window
|__ java.awt.Frame
| |__ javax.swing.JFrame
|__ java.awt.Dialog
| |__ javax.swing.JDialog
|__ javax.swing.JWindow

109
9.3.1. Clasa JFrame

Clasa JFrame este folosit pentru implementarea ferestrelor principale.


Aceast component are caracteristic cadrul, bara de titlu i controalele ferestrei
furnizate de sistemul de operare. Acestea nu pot fi modificate. Comportamentul
ferestrelor (redimensionare, minimizare, poziionare) este controlat de sistemul de
operare.
Constructorii clasei JFrame sunt:
JFrame() construiete o fereastr, fr titlu, iniial invizibil.
JFrame(String title) construiete o fereastr, cu titlu specificat,
iniial invizibil.
Aadar, o fereastr nou creat este invizibil. Pentru a fi fcut vizibil se va
apela metoda show().

Exemplu 3: Se construiete i se afieaz o fereastr cu titlul "Prima


fereastra".
import javax.swing.*;
public class AplJFrame {
public static void main(String args[]) {
JFrame f = new JFrame("Prima fereastra");
f.show();
}
}

Cteva dintre metodele cele mai folosite ale clasei JFrame sunt prezentate n
continuare.
Metoda pack() este folosit pentru a da o dimensiune frame-ului. O
alternativ pentru pack() este setarea explicit a dimensiunii frame-ului prin
apelarea metodei setSize(). n general, folosirea lui pack() este preferabil
folosirii lui setSize(), deoarece pack() las n seama layout manager-ului calculul
dimensiunii frame-ului care ine seama i de ali factori care pot afecta dimensiunea
componentelor.
Metoda setVisible() este folosit pentru a afiarea frame-ului.
Metoda getContentPane() returneaz obiectul contentPane al frame-ului.
Orice component se adaug pe contentPane-ul frame-ului curent.
Exemplu 4:

110
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicFrame{


public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
UIManager.getLookAndFeel());
} catch (Exception e) { }

/*Se creaza container-ul principal (din varful


ierarhiei) si se adauga componentele pe el*/
JFrame frame = new JFrame();

JLabel comp = new JLabel("eticheta1");


JLabel comp1 = new JLabel("eticheta2");
//eticheta2 va fi pusa peste eticheta1
frame.getContentPane().add(comp);
frame.getContentPane().add(comp1);

frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
}

9.3.2. Ferestre secundare i clasa JDialog

Pentru a crea ferestre secundare se folosete, de obicei, JDialog. Alte


ferestre secundare pot fi create cu:
JOptionPane creeaz o fereastr standard de dialog
ProgressMonitor creeaz o fereastr care arat progresul unei operaii
JColorChooser creeaz o fereastr pentru alegerea culorii
JFileChooser creeaz o fereastr pentru selectarea unui fiier

Exemplu 5:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicJOptionPane{

111
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
UIManager.getLookAndFeel());
} catch (Exception e) { }

JFrame frame = new JFrame();


JButton b=new JButton("Apasa-ma");
frame.getContentPane().add(b);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(new Frame(),
"Fereastra de informare");
}
});
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
}

Fiecare fereastr secundar este dependent de una principal (de un frame).


O fereastr de dialog poate fi modal. Dac este modal, ea blocheaz
accesul la oricare alt fereastr din program.
Cele mai simple ferestre modale pot fi create folosind una din metodele:
JOptionPane.showMessageDialog fereastr modal nzestrat
cu un buton. Se poate specifica mesajul, icoana i titlul ferestrei .
JOptionPane.showOptionDialog fereastr modal nzestrat
cu butoane, mesaj, icoana i titlul ferestrei. Pot fi modificate de
utilizator.
Exemplu 6:
Object[] options = {"Da!!!","Niciodata!!!","Cine stie!!!"};
int n=JOptionPane.showOptionDialog(
new Frame(),
"Ma parasesti?",
"Fereastra de Optiuni",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);

112
JOptionPane.showConfirmDialog fereastr modal nzestrat
cu dou butoane.
Exemplu 7:
JOptionPane.showConfirmDialog(
null,
"Alege un buton",
"Fereastra de confirmare",
JOptionPane.YES_NO_OPTION);

Parametrii folosii de aceste metode:


parentComponent: poate fi frame-ul care conine fereastra de dialog
(ea este afiat pornind de la coordonatele ferestrei printe) sau null
(se folosete un frame implicit i fereastra de dialog este centrat pe
ecran);
message: mesajul care apare n fereastra de dialog;
messageType: definete stilul mesajului. Valori posibile sunt:
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
optionType: definete mulimea de butoane care apar pe fereastr:
DEFAULT_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CANCEL_OPTION
Pot fi folosite i alte tipuri de butoane;
options: descriere detaliat a mulimii butoanelor afiate pe fereastr;
n general, este un vector de String-uri;
icon: icoana afiat pe fereastr;
title: titlul ferestrei;
initialValue: butonul selectat implicit.

113
Metodele showMessageDialog, showConfirmDialog i showOptionDialog
returneaz un ntreg semnificnd opiunea utilizatorului. Valorile acestui ntreg pot fi
YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION i CLOSED_OPTION.

Ferestre de dialog nemodale se pot crea cu JDialog.


JDialog este folosit pentru implementarea ferestrelor secundare (cum ar fi
dialog boxes i alert boxes) i a celor utilitare. Aceast component are
caracteristic cadrul i bara de titlu furnizate de sistemul de operare. Aduce nou fa
de clasa Dialog suportul pentru operaia de nchidere implicit.

Exemplu 8:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Dialog{


public static void main(String a[]){
final JFrame frame=new JFrame("Frame-ul meu");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(1,1));
JButton Buton = new JButton("Apasa-ma!");
contentPane.add(Buton);
Buton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Apasa-ma!")) {
final JDialog dialog=new JDialog(frame,
"O fereastra copil",true);
Container c=dialog.getContentPane();
JLabel label=new JLabel("Eticheta frumoasa");
c.add(label);
dialog.pack();
dialog.setVisible(true);
}
}
});
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

frame.pack();
frame.setVisible(true);
}
}

114
9.3.3. Clasa JWindow

Clasa JWindow este folosit pentru implementarea ferestrelor pline


(dreptunghiuri albe pline). Aceste ferestre nu conin bar de titlu sau controale de
fereastr.
Exemplu 9:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicJWindow {


public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
UIManager.getLookAndFeel());
} catch (Exception e) { }

final JFrame frame=new JFrame("Frame-ul meu");


Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(1,1));
JButton Buton = new JButton("Apasa-ma!");
contentPane.add(Buton);
Buton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Apasa-ma!"))
{
JWindow win = new JWindow();
JRootPane pane=new JRootPane();
JLabel label=new JLabel("hasd");
pane.setLayout(new FlowLayout());
pane.add(label);
win.getContentPane().add(pane);
win.setSize(200,200);
win.setVisible(true);
}
}
});
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);

}
}

115
9.3.4. Clasa JApplet

Clasa JApplet este folosit pentru implementarea applet-urilor. A se vedea


exemplul 2.

Forma containere-lor principale este ilustrat n figura urmtoare:

9.4. Containere intermediare

Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele


intermediare folosesc la mprirea ferestrei n mai multe zone sau la gruparea
componentelor. Swing furnizeaz urmtoarele containere intermediare:

Panel Este cel mai flexibil i frecvent utilizat container


intermediar. Se implementeaz folosind clasa JPanel. Un
panel grupeaz componentele dintr-o fereastr sau dintr-un
alt panel. Un panel poate folosi orice layout manager i poate

116
avea o margine (border).
Scroll Furnizeaz scroll bar (orizontal i vertical) pentru
Pane componentele prea mari.
Split Afieaz dou componente ntr-un spaiu fix, oferind
Pane utilizatorului posibilitatea s redimensioneze fiecare
component.
Tabbed Conine mai multe componente dar afieaz numai
Pane una la un moment dat. Utilizatorul poate alege ntre
componente.
Tool Grupeaz componentele (n general butoane) ntr-o
Bar linie sau o coloan, permind utilizatorului s o mute
oriunde.

Forma containere-lor intermediare este ilustrat n figura urmtoare:

Exemplu 10: Pentru JScrollPane

117
JFrame frame = new JFrame("Doar un exemplu");
JTextArea t = new JTextArea(20, 40);
JScrollPane scrpane=new JScrollPane(t);
scrpane.setPreferredSize(new Dimension(100, 100));
frame.getContentPane().add(scrpane);
for(int i=0;i<100;i++)
t.append(i+"\n");//(new Integer(i)).toString());

Exemplu 11: Pentru JSplitPane

JFrame frame = new JFrame("Doar un exemplu");


JTextArea t=new JTextArea();
for(int i=0;i<100;i++)
t.append(i+"\n");
JLabel label=new JLabel("hjsdkljasldjasljdlafj");
JSplitPane splitpane=new JSplitPane();
splitpane.setOneTouchExpandable(true);
splitpane.setLeftComponent(t);
splitpane.setRightComponent(label);
splitpane.setPreferredSize(new Dimension(100, 100));
frame.getContentPane().add(splitpane);

Exemplu 11: Pentru JTabbedPane


import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;

import java.awt.*;
import java.awt.event.*;

public class AplicTabbed extends JPanel {


public AplicTabbed() {
JTabbedPane tabbedPane = new JTabbedPane();

Component panel1 = crearePanel("Salut");


tabbedPane.addTab("Unu", panel1);
tabbedPane.setSelectedIndex(0);

Component panel2 = crearePanel("Salut Salut");


tabbedPane.addTab("Doi", panel2);

Component panel3 = crearePanel("Salut Salut Salut");


tabbedPane.addTab("Trei", panel3);

Component panel4 = crearePanel("Salut Salut Salut


Salut");
tabbedPane.addTab("Patru", panel4);

118
//Se adauga tabbed pane-ul pe panel.
setLayout(new GridLayout(1, 1));
add(tabbedPane);
}

protected Component crearePanel(String text) {


JPanel panel = new JPanel(false);
JLabel label = new JLabel(text);
label.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(label);
return panel;
}

public static void main(String[] args) {


JFrame frame = new JFrame("Exemplu de TabbedPane");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

frame.getContentPane().add(
new AplicTabbed(), BorderLayout.CENTER);
frame.setSize(400, 125);
frame.setVisible(true);
}
}

Figura urmtoare ilustreaz execuia exemplului.

9.5. Folosirea gestionarilor de poziionare (Layout Manager)

Un program poate avea interfee diferite, chiar dac sunt folosite aceleai
componente. Acest lucru se datoreaz folosirii a diferii gestionari de poziionare
care controleaz dimensiunea i poziiile componentelor.
Gestionarea poziionrii este procesul prin care se determin dimensiunea i
poziia componentelor. Implicit, fiecare container are un gestionar de poziionare

119
un obiect care gestioneaz poziionarea fiecrei componente de pe container. Acest
obiect implementeaz interfaa LayoutManager. Acesta poate fi nlocuit cu altul care
s fie pe msura cerinelor. n general, se seteaz gestionarul de poziionare pentru
dou tipuri de containere: contentpane (folosete implicit BorderLayout) i
JPanel (folosete implicit FlowLayout).
De cte ori se adaug o component pe container trebuie inut cont de
gestionarul de poziionare al containerului respectiv.

9.5.1. Setarea poziionrii (Layout Managerului)

Pentru schimbarea layout manager-ului folosit de un container se apeleaz


metoda setLayout. Metoda poate primi ca parametru orice instan a unei clase
care implementeaz interfaa LayoutManager. Secvena de ataare a unui gestionar
pentru un container este:
FlowLayout gestionar = new FlowLayout();
container.setLayout(gestionar);
sau:
container.setLayout(new FlowLayout());

De exemplu:
JPanel jp = new JPanel();
jp.setLayout(new BorderLayout());

Dac argumentul este null, container-ul nu folosete un layout manager. n


acest caz trebuie specificate dimensiunile i poziiile fiecrei componente de pe
container.
Cei mai folosii gestionari n Java sunt: BorderLayout, BoxLayout,
FlowLayout, GridBagLayout i GridLayout.

9.5.1.1 BorderLayout
BorderLayout este layout manager-ul implicit pentru fiecare container
principal. Un BorderLayout are cinci zone n care pot fi aezate componentele:
nord, sud, est, vest i centru.
Exemplu 12:

120
1. import javax.swing.*;
2. import java.awt.*;
3. import java.awt.event.*;

4. public class AplicBorderLayout extends JFrame{


5. public static void main(String[] args) {
6. AplicBorderLayout f=new AplicBorderLayout();
7. Container contentPane = f.getContentPane();
8. contentPane.setLayout(new BorderLayout());
9. contentPane.add(new JButton("Buton 1 NORD"),
BorderLayout.NORTH);
10. contentPane.add(new JButton("2 CENTRU"),
BorderLayout.CENTER);
11. contentPane.add(new JButton("Buton 3 VEST"),
BorderLayout.WEST);
12. contentPane.add(new JButton("Buton 4 SUD"),
BorderLayout.SOUTH);
13. contentPane.add(new JButton("Buton 5 EST"),
BorderLayout.EAST);
14. f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
15. f.setSize(400, 125);
16. f.setVisible(true);
17. }
18. }

innd cont c pentru frame-uri gestionarul implicit este BorderLayout, linia 8


nu mai este necesar. Rezultatul execuiei acestui program este:

9.5.1.2 BoxLayout

Gestionarul BoxLayout aeaz componentele pe o singur linie sau coloan.


Respect dimensiunile minime ale componentelor i permite alinierea lor.

Exemplu 13:

121
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicBoxLayout extends JFrame{


private static void adaugBut(String text,
Container container, float unde) {
JButton button = new JButton(text);
button.setAlignmentX(unde);
container.add(button);
}
public static void main(String[] args) {
AplicBoxLayout f=new AplicBoxLayout();
Container contentPane = f.getContentPane();
contentPane.setLayout(new BoxLayout(
contentPane, BoxLayout.Y_AXIS));
adaugBut("Buton 1", contentPane,
Component.CENTER_ALIGNMENT);
adaugBut("2", contentPane,Component.RIGHT_ALIGNMENT);
adaugBut("Buton 3", contentPane,
Component.LEFT_ALIGNMENT);
adaugBut("Buton 4 foarte lung", contentPane,
Component.CENTER_ALIGNMENT);
adaugBut("Buton 5", contentPane,
Component.LEFT_ALIGNMENT);

f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);}
});
f.pack();
f.setVisible(true);
}
}

Rezultatul execuiei acestui program este:

122
9.5.1.3 CardLayout
Clasa CardLayout permite implementarea unei arii care conine diferite
componente la momente diferite. Tabbed pane-urile sunt containere intermediare
care furnizeaz o funcionalitate similar. Un CardLayout este n general controlat
de un Combo Box, starea lui determinnd panel-ul de afiat.
Exemplu 14:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AplicCardWindow extends JFrame


implements ItemListener {
JPanel cards;
String BUTONPANEL = "Panel cu Butoane";
String TEXTPANEL = "Panel cu TextField-uri";

public AplicCardWindow() {
Container contentPane = getContentPane();

String comboBoxItems[] = { BUTONPANEL, TEXTPANEL };


JPanel cbp = new JPanel();
JComboBox c = new JComboBox(comboBoxItems);
c.setEditable(false);
c.addItemListener(this);
cbp.add(c);

contentPane.add(cbp, BorderLayout.NORTH);

cards = new JPanel();


cards.setLayout(new CardLayout());

JPanel p1 = new JPanel();


p1.add(new JButton("Buton 1"));
p1.add(new JButton("Buton 2"));
p1.add(new JButton("Buton 3"));

JPanel p2 = new JPanel();


p2.add(new JTextField("TextField", 20));

cards.add(p1, BUTONPANEL);
cards.add(p2, TEXTPANEL);
contentPane.add(cards, BorderLayout.CENTER);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

123
}

public void itemStateChanged(ItemEvent evt) {


CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getItem());
}

public static void main(String args[]) {


AplicCardWindow window = new AplicCardWindow();
window.setTitle("CardLayout");
window.pack();
window.setVisible(true);
}
}

n imaginea urmtoare se vd cele dou stri ale ferestrei n funcie de starea


Combo Box-ului:

9.5.1.4 FlowLayout
FlowLayout este layout manager-ul implicit pentru orice JPanel. Aeaz
componentele de la stnga spre dreapta, de sus n jos.
Exemplu 15:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicFlowLayout extends JFrame{


private static void adaugBut(String text,
Container container){
JButton button = new JButton(text);
container.add(button);
}
public static void main(String[] args) {
AplicFlowLayout f=new AplicFlowLayout();
Container contentPane = f.getContentPane();
contentPane.setLayout(new FlowLayout());
adaugBut("Buton 1", contentPane);
adaugBut("2", contentPane);
adaugBut("Buton 3", contentPane);

124
adaugBut("Buton 4 foarte lung", contentPane);
adaugBut("Buton 5", contentPane);

f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);}
});
f.pack();
f.setVisible(true);
}
}
Rezultatul execuiei acestui program este:

9.5.1.5 GridLayout
GridLayout-ul aeaz componentele n celulele unui tabel. Fiecare
component ocup tot locul disponibil din celul. Toate celulele au aceeai
dimensiune. La redimesionarea ferestrei GridLayout-ului, celulele i vor schimba
dimensiunile astfel nct s fie ocupat tot spaiul ferestrei.
Clasa GridLayout are doi constructori:
public GridLayout(int rows, int columns)
public GridLayout(int rows, int columns,
int horizontalGap, int verticalGap)

Cel puin unul din cele dou argumente rows i columns trebuie s fie nenul.
Argumentele horizontalGap i verticalGap din cel de-al doilea constructor permit
specificarea numrului de pixeli dintre celule. Implicit ele au valoarea 0.

Exemplu 16:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicGridLayout extends JFrame{


public static void main(String[] args) {
AplicGridLayout f=new AplicGridLayout();
Container contentPane = f.getContentPane();

125
contentPane.setLayout(new GridLayout(0,2));
contentPane.add(new JButton("Buton 1"));
contentPane.add(new JButton("2"));
contentPane.add(new JButton("Buton 3"));
contentPane.add(new JButton("Buton 4 foarte lung"));
contentPane.add(new JButton("Buton 5"));
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);}
});
f.pack();
f.setVisible(true);
}
}

Rezultatul execuiei acestui program este:

Constructorul apelat creeaz o instan a lui GridLayout care are dou


coloane i oricte linii sunt necesare new GridLayout(0,2).

9.5.1.6 GridBagLayout
GridBagLayout este cel mai sofisticat i flexibil layout manager pe care
platforma Java l furnizeaz. Aeaz componentele n celulele unui tabel, fiecare
component putnd s ocupe mai multe celule. Liniile / coloanele tabelului nu este
obligatoriu s aib aceeai nlime / lime. Pentru fiecare component care se
adaug pe fereastr se seteaz o serie de constrngeri prin crearea unui obiect al
clasei GridBagConstraints. Aceeai instan a lui GridBagConstraints
poate fi folosit pentru mai multe componente, chiar dac ele au constrngeri
diferite. GridBagLayout extrage valorile constrngerilor i nu refolosete
GridBagConstraints. Clasa conine urmtoarele atribute care pot fi setate:
gridx, gridy Specific linia i coloana colului din stnga sus a
componentei. Coloana cea mai din stnga are gridx=0 iar linia cea mai de sus are
gridy=0.

126
gridwidth, gridheight Reprezint numrul de coloane (pentru
gridwidth) sau de linii (pentru gridheight) pe care va fi afiat componenta. Valoarea
implicit este 1.
fill Este folosit atunci cnd aria de afiare a componentei este mai mare
dect dimensiunea cerut, pentru a determina cum poate fi redimensionat
componenta. Valorile valide sunt:
NONE (implicit),
HORIZONTAL (mrete componenta pe orizontal astfel nct s
acopere ntreaga suprafa disponibil dar nu schimb nlimea),
VERTICAL (mrete componenta pe vertical astfel nct s
acopere ntreaga suprafa disponibil dar nu schimb limea),
BOTH (mrete componenta astfel nct s acopere ntreaga
suprafa disponibil.
ipadx, ipady Folosite pentru redimensionarea celulelor. Specific ct
trebuie adunat la dimensiunea minim a componentei. Valoarea implicit este 0.
Limea / nlimea va avea valoarea minim plus ipadx*2 / ipady*2 pixeli (se aplic
n ambele capete ale componentei).
insets Specific distana dintre component i colurile suprafeei pe care
se afieaz. Valoarea atribuit este un obiect Insets.
anchor Este folosit atunci cnd componenta este mai mic dect suprafaa
pe care urmeaz s fie afiat, pentru a determina unde se plaseaz componenta.
Valori valide sunt CENTER (implicit), NORTH, NORTHEAST, EAST, SOUTHEAST,
SOUTH, SOUTHWEST, WEST i NORTHWEST.
weightx, weighty Folosite pentru a determina modul n care s fie
repartizat spaiul dintre coloane / linii. Dac nu se specific nici o valoare (implicit
este 0) atunci toate componentele vor fi grupate n centru container-ului deoarece
GridBagLayout pune orice spaiu n plus ntre tabel i colurile container-ului.

Exemplu 17:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AplicGridBagLayout extends JFrame {


final boolean shouldFill = true;
final boolean shouldWeightX = true;

127
public AplicGridBagLayout() {
JButton buton;
Container contentPane = getContentPane();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
contentPane.setLayout(gridbag);
if (shouldFill) {
//inaltime implicita, latime maxima
c.fill = GridBagConstraints.HORIZONTAL;
}

buton = new JButton("Buton 1");


if (shouldWeightX) {
c.weightx = 0.5;
}
c.gridx = 0;
c.gridy = 0;
gridbag.setConstraints(buton, c); //constrangerile
impuse sunt atasate componentei
contentPane.add(buton);

buton = new JButton("2");


c.gridx = 1;
c.gridy = 0;
gridbag.setConstraints(buton, c);
contentPane.add(buton);

buton = new JButton("Buton 3");


c.gridx = 2;
c.gridy = 0;
gridbag.setConstraints(buton, c);
contentPane.add(buton);

buton = new JButton("Buton 4 foarte lung");


c.ipady = 40; //seteaza cu cat va creste
inaltimea componentei
c.weightx = 0.0;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 1;
gridbag.setConstraints(buton, c);
contentPane.add(buton);

buton = new JButton("Button 5");


c.ipady = 0; //se revine la inaltimea implicita
c.weighty = 1.0; //spatiu vertical intre celule
suplimentar
c.anchor = GridBagConstraints.SOUTH; //componenta va
fi plasata in partea de jos a ferestrei
c.insets = new Insets(10,0,0,0);

128
c.gridx = 1; //componenta se alinieaza cu
butonul 2
c.gridwidth = 2; //ocupa latimea a doua butoane
c.gridy = 2; //se afla pe a treia linie
gridbag.setConstraints(buton, c);
contentPane.add(buton);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public static void main(String args[]) {


AplicGridBagLayout window = new AplicGridBagLayout();
window.setTitle("Exemplu GridBagLayout");
window.pack();
window.setVisible(true);
}
}
Rezultatul execuiei acestui program este:

9.6. Tratarea evenimentelor

Apsarea unei taste sau a unui buton al mouse-ului declaneaz un


eveniment. Pentru a trata evenimentul este necesar un obiect care s implementeze
interfaa corespunztoare i s fie nregistrat ca un consumator de evenimente
(event listener). Componentele Swing pot genera mai multe tipuri de evenimente.
Cteva dintre interfeele corespunztoare ar fi:

ActionListener aciuni asupra unui control (click pe un

129
buton, Enter dup introducerea unui text ntr-
un cmp, selectarea ntr-un meniu)
ComponentListener redimensionri, deplasri, ascunderi ale
unei componente
FocusListener preluare / pierdere focus
ItemListener selecie / deselecie obiect n list,
meniu, etc.
TextListener modificarea textului din control
AdjustmentListener modificarea unei valori variind ntre
dou limite (ex: ScrollBar)
KeyListener acionarea unei taste
MouseListener apsarea butonului mouse-ului n timp
ce cursorul se afl pe componenta respectiv
MouseMotionListener drag; micarea mouse-ului pe o
component
WindowListener nchidere, minimizare, maximizare etc.
ContainerListener adugare, tergere component
ListSelectionListener schimbarea seleciei ntr-o tabel sau
ntr-o list

Fiecare eveniment este reprezentat de un obiect care d informaii despre


eveniment i identific sursa evenimentului. Fiecare generator de eveniment poate
avea mai muli consumatori.

generator obiect eveniment /----> consummator de eveniment


de eveniment------------------------------------------> consummator de eveniment
\----> consummator de
eveniment

Un eveniment, o dat aprut, este distribuit tuturor asculttorilor nregistrai (nu


este consumat numai de primul).
Aa cum am spus mai devreme, pentru ca evenimentele unei componente s
fie interceptate de ctre o instan a unei clase asculttor, aceast clas trebuie

130
nregistrat n lista asculttorilor componentei respective. Am spus list, deoarece
evenimentele unei componente pot fi ascultate de oricte clase - cu condiia ca
acestea s fie nregistrate la componenta respectiv. nregistrarea unei clase n lista
asculttorilor unei componente se face cu metode din clasa Component de tipul
addXXXListener, iar eliminarea ei din aceasta lista cu removeXXXListener unde
XXX reprezint tipul evenimentului.

9.6.1. Exemplu de tratare a unui eveniment

Sunt necesari urmtorii pai:

1. Clasa trebuie s implementeze interfaa corespunztoare sau s


extind o clas care implementeaz interfaa.

public class NumeClasa implements ActionListener {...}

2. Scrierea codului care nregistreaz o instan a clasei (care va


consuma evenimentul) ca i consumator pentru una sau mai multe componente.

Componenta.addActionListener(instantaNumeClasa);

3. Scrierea codul care implementeaz metodele din interfaa


consumator.

public void actionPerformed(ActionEvent e) {


//cod care reacioneaza la aciune
}

Exemplu 18:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AplicEv extends JFrame{

JButton uB,lB,rB;
JPanel pbut;

131
JTextField txt;
Listener lsn;
TextWorker txtWorker;
public AplicEv() {
uB=new JButton("Majuscule");
lB=new JButton("Minuscule");
rB=new JButton("Sterge");
uB.setActionCommand("ActMajuscule");
lB.setActionCommand("ActMinuscule");
pbut=new JPanel();
pbut.add(uB);
pbut.add(lB);
pbut.add(rB);
txt= new JTextField("Introduceti text!");
lsn=new Listener();
getContentPane().setLayout(new BorderLayout());
getContentPane().add("North",txt);
getContentPane().add("Center",lsn);
getContentPane().add("South",pbut);
txtWorker=new TextWorker(txt);
rB.addActionListener(lsn);
uB.addActionListener(lsn);
lB.addActionListener(lsn);

rB.addActionListener(txtWorker);
uB.addActionListener(txtWorker);
lB.addActionListener(txtWorker);
}
public static void main(String[] args) {
AplicEv f=new AplicEv();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.addWindowListener(f.lsn);

f.setSize(400, 125);
//f.pack();
f.setVisible(true);
}
}

class TextWorker implements ActionListener {


private JTextField txt;

public TextWorker(JTextField txt){


this.txt=txt;
}

public void actionPerformed(ActionEvent e){


String c=e.getActionCommand();

132
if(c.equals("Sterge"))
txt.setText("");
if(c.equals("ActMajuscule")){
String oldText=txt.getText();
String uText=oldText.toUpperCase();
txt.setText(uText);
}
if(c.equals("ActMinuscule")){
String oldText=txt.getText();
String lText=oldText.toLowerCase();
txt.setText(lText);
}
}
}

class Listener extends JTextArea implements ActionListener,


WindowListener{
public Listener(){
super();
this.setEditable(false);
}
public void actionPerformed(ActionEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowClosed(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowOpened(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowClosing(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowIconified(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowDeiconified(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowActivated(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
public void windowDeactivated(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+" ]\n");
}
}

Rezultatul execuiei programului este:

133
9.7. Folosirea componentelor

9.7.1. Clasa JLabel

Un obiect de tip JLabel (etichet) reprezint o component pentru plasarea


unui text pe o suprafa de afiare. O etichet este format dintr-o singur linie de
text static ce nu poate fi modificat de ctre utilizator, dar poate fi modificat din
program.

9.7.2. Clasa JButton

Un obiect de tip JButton (buton) reprezint o component pentru plasarea


unui buton etichetat pe o suprafa de afiare.

9.7.3. Clasa JTextField

Un obiect de tip JTextField definete un control de editare a textului pe o


singur linie. Este util pentru interogarea utilizatorului asupra unor valori.

9.7.4. Clasa JTextArea

Un obiect de tip JTextArea definete un control de editare a textului pe mai


multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc .

9.7.5. Clasa JCheckBox

Un obiect de tip JCheckbox (comutator) reprezint o component care se


poate afla n dou stri : "selectat" sau "neselectat" (on/off). Aciunea utilizatorului
asupra unui comutator l trece pe acesta n starea complementar celei n care se
gsea. Este folosit pentru a prelua o anumit opiune de la utilizator.

134
9.7.6. Clasa JRadioButton

Un obiect de tip JRadioButton definete un grup de comutatoare din care


doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio
butoane.

9.7.7. Clasa JComboBox

Un obiect de tip JComboBox definete o list de opiuni din care utilizatorul


poate selecta una singur. La un moment dat, din ntreaga lista doar o singur
opiune este vizibil, cea selectat. O component JComboBox este nsoit de un
buton etichetat cu o sgeat vertical la apsarea cruia este afiat ntreaga sa
list, pentru ca utilizatorul s poat selecta o anumit opiune.

9.7.8. Clasa JList

Un obiect de tip JList definete o list de opiuni care poate fi setat astfel
nct utilizatorul s poat selecta o singur opiune sau mai multe. Toate opiunile
listei sunt vizibile n limita dimensiunilor grafice ale componentei.

9.7.9. Clasa JScrollBar

Un obiect de tip JScrollbar definete o bar de defilare vertical sau


orizontal. Este util pentru punerea la dispoziie a utilizatorului a unei modaliti
sugestive de a alege o anumit valoare dintr-un interval.

1. Introducere n limbajul de programare Java............................................. 1


1.1. Ce este Java? .................................................................................. 1
1.2. Limbajul de programare Java ........................................................... 1
1.3. Java : un limbaj compilat i interpretat .............................................. 3
1.4. Istoria limbajului Java ....................................................................... 3
1.5. Mediul Java ...................................................................................... 4
1.6. Crearea unei aplicaii simple ............................................................ 4

135
1.7. Crearea unui applet ......................................................................... 5
2. Programarea Orientat pe Obiecte i Java ............................................. 7
2.1. Obiecte i clase................................................................................ 7
2.2. Atribute i comportamente ............................................................... 8
2.2.1. Atribute ........................................................................................ 8
2.2.2. Comportament ............................................................................. 9
2.3. Principiile OOP ................................................................................ 9
3. Elementele de baz ale limbajului de programare Java ........................ 11
3.1. Structura lexical a limbajului ......................................................... 11
3.1.1. Setul de caractere ...................................................................... 11
3.1.2. Cuvinte cheie ............................................................................. 11
3.1.3. Identificatori ............................................................................... 11
3.1.4. Constante .................................................................................. 11
3.1.5. Separatori .................................................................................. 13
3.1.6. Operatori.................................................................................... 13
3.1.7. Comentarii ................................................................................. 17
3.2. Tipuri de date ................................................................................. 17
3.3. Variabile ......................................................................................... 18
3.4. Instruciuni ..................................................................................... 20
3.4.1. Instruciunea vid ....................................................................... 20
3.4.2. Instruciuni de decizie ................................................................ 20
3.4.3. Instruciuni repetitive .................................................................. 23
3.5. Tablouri (vectori) ............................................................................ 28
3.5.1. Tablouri (vectori) unidimensionale ............................................. 28
3.5.2. Tablouri (vectori) cu mai multe dimensiuni ................................. 30
3.5.3. Dimensiunea unui vector ........................................................... 30
3.5.4. Tablouri cu dimensiuni variabile ................................................. 32
3.6. iruri de caractere.......................................................................... 32
4. Clase i obiecte n Java ........................................................................ 34
4.1. Referine ........................................................................................ 34
4.2. Obiecte .......................................................................................... 35
4.2.1. Noiuni generale......................................................................... 35
4.2.2. Operatorul de atribuire = ............................................................ 36
4.2.3. Operatorul de egalitate == ......................................................... 38

136
4.3. Clase .............................................................................................. 39
4.3.1. Definirea claselor ....................................................................... 39
4.3.2. Variabile membru ....................................................................... 40
4.3.3. Metode ....................................................................................... 42
4.3.3.1 Definirea metodelor .............................................................. 42
4.3.3.2 Modificatorii metodelor.......................................................... 42
4.3.3.3 Tipul returnat de o metod .................................................... 43
4.3.3.4 Parametrii unei metode......................................................... 44
4.3.4. Constructorii unei clase .............................................................. 45
4.3.5. Obiectul this ............................................................................. 47
4.3.6. Suprancrcarea i supradefinirea metodelor ............................. 49
4.3.7. Modificatori de acces pentru membrii unei clase ........................ 50
4.3.8. Membrii instan i membrii clas .............................................. 51
4.3.9. Argumente n linia de comand .................................................. 54
4.4. Motenirea ..................................................................................... 56
4.4.1. Principiul motenirii .................................................................... 56
4.4.2. Interfee...................................................................................... 60
4.5. Probleme........................................................................................ 63
5. Pachete ................................................................................................. 71
5.1. Importul unui pachet, al unei clase sau a unei interfee .................. 72
5.2. Crearea unui pachet ....................................................................... 73

6. Excepii ............................................................................................ 78
6.1. Aspecte generale ........................................................................... 78
6.2. Instruciunea try.............................................................................. 79
6.3. Crearea unei excepii ..................................................................... 81
7. INTRRI I IEIRI ................................................................................ 85
7.1. Clasificarea fluxurilor ...................................................................... 86
7.2. Ierarhia claselor pentru lucru cu fluxuri ........................................... 86
7.2.1. Fluxuri de caractere ................................................................... 86
7.2.2. Fluxuri de octei .......................................................................... 87
7.3. Superclasele de intrare / ieire ....................................................... 88
7.4. Crearea unui flux ............................................................................ 89
7.5. Citirea datelor de la tastatur ......................................................... 90
7.5.1. Obiectul System.in ................................................................... 90

137
7.5.2. Clasa InputStreamReader .................................................... 91
7.5.3. Clasa BufferedReader ........................................................... 91
7.6. Citirea i scrierea datelor din fiier ................................................. 92
7.6.1. Clasele FileReader i FileWriter .................................... 92

8. APPLET-URI ............................................................................... 94
8.1. Ce este un applet? ......................................................................... 94
8.2. Funciile unui applet ....................................................................... 95
8.3. Structura general a unui applet .................................................... 96
8.4. HTML ............................................................................................. 97
8.5. Exemple ......................................................................................... 98
9. Interfee grafice ................................................................................... 105
9.1. Ce este o interfa grafic? .......................................................... 105
9.2. Primele aplicaii Swing ................................................................. 106
9.2.1. Exemple................................................................................... 106
9.2.2. Comentarea exemplelor ........................................................... 108
9.2.2.1 Alegerea naturii interfeei.................................................... 108
9.2.2.2 Setarea container-ului principal (din vrful ierarhiei) ........... 108
9.2.2.3 Manipularea evenimentelor ................................................ 109
9.3. Containere principale ................................................................... 109
9.3.1. Clasa JFrame.......................................................................... 110
9.3.2. Ferestre secundare i clasa JDialog ..................................... 111
9.3.3. Clasa JWindow ....................................................................... 115
9.3.4. Clasa JApplet ....................................................................... 116
9.4. Containere intermediare............................................................... 116
9.5. Folosirea gestionarilor de poziionare (Layout Manager) .............. 119
9.5.1. Setarea poziionrii (Layout Managerului) .............................. 120
9.5.1.1 BorderLayout...................................................................... 120
9.5.1.2 BoxLayout .......................................................................... 121
9.5.1.3 CardLayout......................................................................... 123
9.5.1.4 FlowLayout ......................................................................... 124
9.5.1.5 GridLayout.......................................................................... 125
9.5.1.6 GridBagLayout ................................................................... 126
9.6. Tratarea evenimentelor ................................................................ 129

138
9.6.1. Exemplu de tratare a unui eveniment ....................................... 131
9.7. Folosirea componentelor .............................................................. 134
9.7.1. Clasa JLabel ............................................................................ 134
9.7.2. Clasa JButton........................................................................... 134
9.7.3. Clasa JTextField ...................................................................... 134
9.7.4. Clasa JTextArea ...................................................................... 134
9.7.5. Clasa JCheckBox ..................................................................... 134
9.7.6. Clasa JRadioButton ................................................................. 135
9.7.7. Clasa JComboBox ................................................................... 135
9.7.8. Clasa JList ............................................................................... 135
9.7.9. Clasa JScrollBar ...................................................................... 135

139

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