Documente Academic
Documente Profesional
Documente Cultură
Curs Java
Curs Java
compilat i interpretat
dinamicitate
traduse
instruciuni
main;
avantaj:
simplitate;
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;
februarie
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:
java NumeClasa
caracteristicile tuturor copacilor (au rdcini, trunchi i frunze, cresc, produc clorofil,
i schimb frunzele, etc). Clasa Copac
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)
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.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.
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.
10
3. Elementele
de
baz
ale
limbajului
de
programare Java
3.1. Structura lexical a limbajului
11
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
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:
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
\u0008
\u0009
12
Secvena Escape
'\b'
'\t'
Caracter
Backspace(BS)
Tab orizontal (HT)
\u000a
\u000c
\u000d
\u0022
\u0027
\u005c
\u0008
'\n'
'\f'
'\r'
'\"'
'\''
'\\'
'\b'
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
13
5,
primeste
5,
primeste
6,
primeste
4,
primeste
14
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)
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)
15
System.out.println(a+"
a++; --b;
System.out.println(a+"
c=++a+b++;
System.out.println(a+"
a/=2;b*=2;
System.out.println(a+"
c=a-- + --b;
System.out.println(a+"
c=b=(a+=1);
System.out.println(a+"
"+b+" "+c);
"+b+" "+c);
"+b+" "+c);
"+b+" "+c);
"+b+" "+c);
"+b+" "+c);
3
2
3
6
5
2
5
5
6
6
7
2
sunt adevarate");
falsa");
sunt adevarate");
falsa");
16
3.1.7. Comentarii
n Java exist trei feluri de comentarii:
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:
tipuri referin.
17
Dimensiune n octei
1
2
Domeniu
-128 .. 127
-32768 .. 32767
-2147483648 ..
Int
Long
2147483647
-263 .. 263-1
Dimensiune n octei
4
8
Domeniu
-1046 .. 1038
-10324 .. 10308
2. tipuri reale
Tip de date
float
double
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
18
nume_variabila
nume_variabila = valoare
nume_variabila
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
3.4. Instruciuni
20
else
instruciuni2
instruciuni
Dac expresie_logic are valoarea true atunci se execut instruciuni1, altfel
se execut instruciuni2. Expresie_logic
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. }
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;
case val_2: instruciune_2;
. . .
case val_i: instruciune_i;
. . .
case val_n: instruciune_n;
default: instruciune;
}
Instruciunea switch selecteaz
break;
break;
break;
break;
dintre mai multe secvene de cod una care
val_i
) se execut
22
class Operatii{
public static void main(String args[]){
double a=12, b=5, r=0;
char oper=' ';
try{
System.out.println("Introduceti operatorul");
oper=(char)System.in.read();
}
catch(Exception e){}
switch (oper) {
case '+':
r=a+b; break;
case '-':
r=a-b; break;
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37. }
case '*':
r=a*b; break;
case '/':
r=a/b; break;
default:
System.out.println("Operator invalid");
System.exit(1);
}
System.out.println(a+" "+oper+" "+b+" = "+r);
}
23
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.
4.
5.
6.
7.
8.
9.
int s=0;
while(x>0){
s+=x%10;
x/=10;
}
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.
2.
3.
4.
26
for(...){
...
for(...){
...
break;
...
}
...
}
Efectul instruciunii break este prsirea for-ului din linia 3, execuia
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.
sau
TipElement
aezate fie naintea fie dup numele vectorului arat c este vorba despre un vector.
Exemple:
int[] v;
String adrese[];
28
alocarea memoriei fcndu-se doar prin intermediul operatorului new sau prin
iniializare.
Exemple:
int v[10];
//incorect
29
Exemplu:
int m[][];
m = new int[5][10];
Observaie:
30
31
25.
26.
27.
33
are"
v.length
"
34
4.2. Obiecte
35
Exemplu:
Complex c = new Complex();
c.re = 2;
c.im = 3;
System.out.println("Re=" +c.re+ "
Im="+c.im);
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)
Exemplu:
1.
2.
3.
class Nimic{
int x;
}
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Test{
public static void main(String args[]){
Nimic a1=new Nimic(),a2;
a1.x=10;
a2=a1;
System.out.println(a1.x+" "+a2.x);
a1.x=5;
System.out.println(a1.x+" "+a2.x);
}
}
37
class Nimic{
int x;
Nimic(int x){
this.x=x;
}
}
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
39
Observaie: variabilele unei clase pot avea acelai nume cu metodele clasei.
numele variabilei;
tipul de date;
40
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:
Exemplu:
int x ; //variabil instan
static int nrDeObiecteCreate; //variabil clas
Exemplu: se declar o variabil final (linia 2). n linia 4 se iniializeaz iar n linia 5
se dorete modificarea valorii ei.
1.
2.
3.
4.
41
class Test {
final int MAX;
Test() {
MAX = 100;
// legal
5.
6.
7.
MAX = 200;
}
transient este folosit la serializarea obiectelor, pentru a specifica ce
variabile membru ale unui obiect nu participa la serializare.
4.3.3. Metode
Exemplu:
void metoda1() ;
//metoda de instanta
static void metoda2(); //metoda de clasa
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).
argument1],
[tip2
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
salariu){
...
}
adaugarePersoana(String
nume,
int
varsta,
float
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
45
class COMPLEX {
double re, im;
COMPLEX () {
re=im=0;
}
COMPLEX (double r, double i ) {
re=r; im=i;
}
COMPLEX (double r) {
re=r; im=0;
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.
2.
class COMPLEX {
double re, im;
3.
4.
5.
6.
7.
8.
9.
10.
11.
12. }
COMPLEX () {
this(0,0);
}
COMPLEX (double r, double i ) {
re=r; im=i;
}
COMPLEX (double r) {
this(r,0);
}
46
class COMPLEX {
double re, im;
}
...
COMPLEX c= new COMPLEX ();
class COMPLEX {
double re, im;
COMPLEX (double r, double i ) {
re=r; im=i;
}
COMPLEX (double r) {
this(r,0);
}
}
...
COMPLEX c= new Complex(); //eroare
47
class Complex{
int re,im;
public schimba(int re, int im){
4.
5.
6.
7.
this.re = re;
this.im = im;
}
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.
2.
3.
4.
5.
6.
7.
Exemplu: n clasa Maxim sunt definite dou metode max cu doi respectiv cu trei
parametrii.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
49
13.
14.
15.
16.
17.
jos:
Modificato
r
private
protected
public
implicit
Clas
Subclas
Pachet
Altundeva
x
x
x
x
x
x
x
x
x
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
iniializeaz variabilele instan i incrementeaz variabila clas. Cu alte cuvinte,
51
class Punct{
int x, y;
static int nr_puncte=0;
4.
5.
6.
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(),
NumeClasa obiect = new NumeClasa();
obiect. metodaDeInstanta();
//ilegal
//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.
1.
52
class Cerc{
2.
double x,y,r;
3.
4.
5.
6.
7.
8.
9.
10.
11.
Cerc maimare(Cerc c) {
if(c.r>r)
return c;
else
return this;
}
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
...
Cerc
Cerc
Cerc
Cerc
53
54
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
55
4.4. Motenirea
56
class B extends A{
...
}
class C extends B{
...
}
class D extends B{
...
}
57
58
2.
3.
4.
public RationalIred(){
m=0; n=1;
}
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. }
14. public class RationalIred extends Rational {
15.
public RationalIred(){
16.
super();
17.
}
59
18.
19.
20.
21.
22.
23.
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
Exemplu:
1. interface NumeInterfata {
2.
int x = 100;
//corect
3.
public static final int y = 100;
4.
private z=100; //incorect
5.
int a; //incorect
6. }
//corect
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:
interface FigGeom{
void desen();
void arie();
}
5.
61
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18. }
int r;
Cerc(int r){
this.r=r;
System.out.println("Constructor cerc "+r);
}
public void desen(){
System.out.println("Deseneaza cercul "+r);
}
public void arie(){
double s=Math.PI*r*r;
System.out.println("Cercul "+r+" are aria "+s);
}
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()");
}
63
64
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);
}
void arie(){
double s=l*l;
System.out.println("Patratelul "+l+" are aria "+s);
}
}
65
}
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
Constructor patrat 300
Deseneaza patratul 300 indice 100
Patrat 300 are aria 90000.0
66
//var STATICA
//var STATICA
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
this.m=m;
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;
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.
71
pachetul java.lang
pachetul curent
72
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.
73
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.a();
a1.b();
a1.d();
}
}
Fiierul A3.java conine clasa:
package Pachete;
public interface A3{
public void a3();
}
Setm variabila CLASSPATH:
74
"+a1.d);
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;
}
public double getElem(int poz){
return a[poz];
}
public double[] getVector(){
return a;
}
75
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){
return a[l][c];
}
public double[][] getMatrice(){
return a;
}
public String toString(){
76
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Tablou.*;
public class TestTablou{
public static void main(String args[]){
double x[][]={{2,4},{5,6},{1,3}};
Matrice m=new Matrice(3,2,x);
System.out.println(m);
double y[]={2,4,5,6};
Vector v=new Vector(4,y);
System.out.println(v);
java.util.Vector vv=new java.util.Vector(5);
for (int i=0;i<5;i++)
vv.add(new Integer(i));
System.out.println(vv);
}
}
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.
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
78
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:
}
[catch(ClasaExceptie obiectExceptie){
instruciuni de tratare a excepiei de clas ClasaExceptie
}]*
[finally{
instruciuni care se execut necondiionat n final
}]
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
79
naintea prsirii instruciunii try. Instruciunea try trebuie s aib fie o clauz
catch, fie una finnaly.
80
Excepii uzuale:
ArithmeticException
NumberFormatException
IndexOutOfBoundsException
NegativeArraySizeException
NullPointerException
de elemente
Tentativ de a folosi o referin care
SecurityException
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
81
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37. }
public Rational(){
this(1,0);
}
public Rational(long m,long n){
setm(m);
setn(n);
}
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;
}
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71. }
public RationalIred(){
super();
}
public RationalIred(long m,long n) throws Exc{
setm(m);
try{
setIn(n);
}
catch(Exc e){throw e;}
}
public void setIn(long n) throws Exc{
if (n!=0)
super.setn(n);
else
throw new Exc();
}
private void simplifica(){
long x=getm(), y=getn();
while(x!=y){
if(x>y) x-=y;
else
y-=x;
}
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;
}
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.
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.*.
86
87
new
new
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
90
91
import java.io.*;
class Citire4 {
public static void main(String args[]) {
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. }
92
Clasa FileWriter este folosit la scrierea datelor ntr-un fiier text. Cei mai
importani constructori ai si sunt:
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
95
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
<PARAM
<PARAM
. . .
<PARAM
</APPLET>
. . .
</BODY>
</HTML>
parametrii>
parametrii>
parametrii>
parametrii>
97
CODE valoarea lui este numele fiierului care conine clasa appletului: NumeClasa.class;
WIDTH valoarea lui este limea ferestrei atribuit de browser appletului 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,
8.5. Exemple
Exemplu 1: Exemplific ordinea apelrii metodelor.
98
import javax.swing.*;
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");
}
HEIGHT=200>
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
</APPLET>
</BODY>
</HTML>
HEIGHT=200>
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);
}
101
HEIGHT=200>
HEIGHT=200>
102
HEIGHT=200>
103
String sm=getParameter("m"),
sn=getParameter("n");
m=Integer.parseInt(sm);
n=Integer.parseInt(sn);
s=new Integer(m+n).toString();
104
HEIGHT=200>
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
momentul
105
9.2.1. Exemple
Exemplu 1: O aplicaie de sine stttoare, care nu utilizeaz applet-ul.
1.
2.
3.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
4.
5.
6.
7.
8.
9.
10.
11.
106
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
;
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
(sus,
import javax.swing.*;
import java.awt.*;
3.
107
4.
5.
6.
7.
label.setBorder(BorderFactory.createMatteBorder(
2,2,Color.black));
8.
getContentPane().add(eticheta,
BorderLayout.CENTER);
9.
}
10. }
1,1,
108
109
JFrame,
JDialog,
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);
}
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
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
DEFAULT_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CANCEL_OPTION
113
frame.pack();
frame.setVisible(true);
114
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!"))
{
115
116
Scroll
Pane
Split
Pane
Tabbed
Pane
posibilitatea
redimensioneze
fiecare
component.
Conine mai multe componente dar afieaz numai
una la un moment dat. Utilizatorul poate alege ntre
Tool
Bar
componente.
Grupeaz componentele (n general butoane) ntr-o
linie sau o coloan, permind utilizatorului s o mute
oriunde.
117
javax.swing.JTabbedPane;
javax.swing.ImageIcon;
javax.swing.JLabel;
javax.swing.JPanel;
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);
//Se adauga tabbed pane-ul pe panel.
setLayout(new GridLayout(1, 1));
add(tabbedPane);
118
}
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.
119
9.5.1.1 BorderLayout
BorderLayout este layout manager-ul implicit pentru fiecare container
120
import javax.swing.*;
import java.awt.*;
3.
import java.awt.event.*;
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
9.5.1.2 BoxLayout
Gestionarul BoxLayout aeaz componentele pe o singur linie sau coloan.
121
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);
}
122
9.5.1.3 CardLayout
Clasa
}
public void itemStateChanged(ItemEvent evt) {
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getItem());
}
9.5.1.4 FlowLayout
FlowLayout este layout manager-ul implicit pentru orice JPanel. Aeaz
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
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();
contentPane.setLayout(new GridLayout(0,2));
contentPane.add(new JButton("Buton 1"));
contentPane.add(new JButton("2"));
contentPane.add(new JButton("Buton 3"));
125
}
Rezultatul execuiei acestui program este:
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
componentei. Coloana cea mai din stnga are gridx=0 iar linia cea mai de sus are
gridy=0.
gridwidth,
fill Este folosit atunci cnd aria de afiare a componentei este mai mare
dect dimensiunea cerut,
NONE (implicit),
127
contentPane.add(buton);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Rezultatul
execuiei
129
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
AdjustmentListene
r
KeyListener
acionarea unei taste
MouseListener
apsarea butonului mouse-ului n
timp ce cursorul se afl pe componenta
respectiv
MouseMotionListen
er
WindowListener
nchidere, minimizare, maximizare
etc.
ContainerListener
adugare, tergere component
ListSelectionListener
schimbarea seleciei ntr-o tabel
sau ntr-o list
130
2.
3.
132
System.exit(0);
});
f.addWindowListener(f.lsn);
f.setSize(400, 125);
//f.pack();
f.setVisible(true);
}
}
public void windowIconified(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+"
}
public void windowDeiconified(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+"
}
public void windowActivated(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+"
}
public void windowDeactivated(WindowEvent e){
append(e.paramString()+" [ "+e.toString()+"
}
]\n");
]\n");
]\n");
]\n");
134
135
Ce este Java?...................................................................................1
1.2.
1.3.
1.4.
1.5.
Mediul Java.......................................................................................4
1.6.
1.7.
2.
Obiecte i clase.................................................................................7
2.2.
Atribute i comportamente.................................................................8
2.2.1.
Atribute..........................................................................................8
2.2.2.
Comportament..............................................................................9
2.3.
3.
Principiile OOP..................................................................................9
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.
136
Instruciunea vid........................................................................20
3.4.2.
Instruciuni de decizie..................................................................20
3.4.3.
Instruciuni repetitive...................................................................24
3.5.
3.5.1.
3.5.2.
3.5.3.
3.5.4.
3.6.
4.
Tablouri (vectori)..............................................................................28
iruri de caractere...........................................................................32
Referine..........................................................................................34
4.2.
Obiecte............................................................................................35
4.2.1.
Noiuni generale..........................................................................35
4.2.2.
4.2.3.
4.3.
4.3.1.
Definirea claselor........................................................................38
4.3.2.
Variabile membru........................................................................40
4.3.3.
Metode........................................................................................42
Definirea metodelor...............................................................42
4.3.3.2
Modificatorii metodelor...........................................................42
4.3.3.3
4.3.3.4
4.3.5.
Obiectul this..............................................................................47
4.3.6.
4.3.7.
4.3.8.
4.3.9.
Motenirea......................................................................................56
4.4.1.
Principiul motenirii.....................................................................56
4.4.2.
Interfee.......................................................................................60
4.5.
137
4.3.3.1
4.3.4.
4.4.
5.
Clase...............................................................................................38
Probleme.........................................................................................63
Pachete..................................................................................................70
5.1.
5.2.
Excepii.............................................................................................77
6.
6.1.
Aspecte generale............................................................................77
6.2.
Instruciunea try...............................................................................78
6.3.
7.
INTRRI I IEIRI.................................................................................83
7.1.
Clasificarea fluxurilor.......................................................................84
7.2.
7.2.1.
Fluxuri de caractere....................................................................85
7.2.2.
Fluxuri de octei...........................................................................86
7.3.
7.4.
7.5.
7.5.1.
Obiectul System.in....................................................................88
7.5.2.
Clasa InputStreamReader......................................................89
7.5.3.
Clasa BufferedReader............................................................90
7.6.
7.6.1.
APPLET-URI.................................................................................92
8.
8.1.
Ce este un applet?..........................................................................92
8.2.
8.3.
8.4.
HTML..............................................................................................95
8.5.
Exemple..........................................................................................97
9.
Interfee grafice....................................................................................103
9.1.
9.2.
138
9.2.1.
Exemple....................................................................................105
9.2.2.
Comentarea exemplelor............................................................106
9.2.2.1
9.2.2.2
9.2.2.3
9.3.
Manipularea evenimentelor..................................................107
Containere principale....................................................................107
9.3.1.
Clasa JFrame...........................................................................108
9.3.2.
9.3.3.
Clasa JWindow.........................................................................113
9.3.4.
Clasa JApplet.........................................................................114
9.4.
Containere intermediare................................................................115
9.5.
9.5.1.
9.6.
9.5.1.1
BorderLayout.......................................................................119
9.5.1.2
BoxLayout............................................................................120
9.5.1.3
CardLayout..........................................................................121
9.5.1.4
FlowLayout..........................................................................123
9.5.1.5
GridLayout...........................................................................124
9.5.1.6
GridBagLayout.....................................................................125
Tratarea evenimentelor.................................................................128
9.6.1.
9.7.
139
Folosirea componentelor...............................................................132
9.7.1.
Clasa JLabel.............................................................................132
9.7.2.
Clasa JButton............................................................................133
9.7.3.
Clasa JTextField........................................................................133
9.7.4.
Clasa JTextArea........................................................................133
9.7.5.
Clasa JCheckBox......................................................................133
9.7.6.
Clasa JRadioButton..................................................................133
9.7.7.
Clasa JComboBox....................................................................134
9.7.8.
Clasa JList................................................................................134
9.7.9.
Clasa JScrollBar........................................................................134