Sunteți pe pagina 1din 7

Interfee JAVA

Interfeele JAVA reprezint o colecie de metode abstracte i de constante. Utilizarea


unei interfee este justificat n cazurile n care se dorete ca o clas s poat fi
convertit n mai multe tipuri de baz ntre care nu exist o relaie de motenire.
Deoarece Java nu suport motenirea multipl, interfeele sunt o variant de rezolvare
a acestor situaii.
La fel ca i o clas, o interfa nainte ca ea s poat fi utilizat, trebuie declarat. Ca
i n cazul claselor abstracte nu putem instania o interfa, dar putem declara o
variabil ca fiind de tipul interfeei.
Declararea unei interfee Java
-

prin cuvntul cheie interface


structura

[modificator] interface identificator interfa [extends lista_interfete]{


lista_metode;
lista_constante;
}
Modificatorul unei interfee poate fi public sau abstract. Avnd n vedere c o
interfa este abstract prin definiie, utilizarea modificatorului abstract este
redundant. Public acelai neles ca i n declaraia clasei.
Identificatorul (numele) unei interfee respect aceleai reguli ca i identificatorul unei
clase avnd domeniul de vizibilitate package-ul n care a fost declarat interfaa i
programele n care a fost importat package-ul respectiv.
O interfa spre deosebire de o clas poate moteni mai multe interfee. Motenirea se
face prin extends urmat de lista numelor interfeelor motenite (lista_interfee)
separate prin virgul. Prin derivare, o interfa motenete de la interfaa de baz att
metodele, ct i constantele acesteia.
Ex.

Public interface Id1 extends Id2, Id3, Id4 {

n corpul interfeei pot exista o list de declaraii metode i o list de declaraii de


constante. Metodele declarate ntr-o interfa sunt implicit abstracte. Constantele
declarate n interfa sunt atribute care sunt implicit static i final.
La compilarea unui fiier surs Java ce conine o interfa va rezulta un fiier cu
extensia .class ataat respectivei interfee.
Interfeele la fel ca i clasele abstracte nu pot fi instaniate. Ele pot fi utilizate n
declaraia unei clase, oblignd clasa respectiv s implementeze metodele declarate n
interfa. n acest context, se spune c o clas implementeaz interfaa respectiv.
Acest lucru se face folosind implements.

O clas poate implementa mai multe interfee. La fel ca i n cazul derivrii dintr-o
clas abstract, clasa este obligat s implementeze fiecare metod din interfeele ce
le implementeaz. n caz contrar interfaa trebuie declarat abstract.
Dac o clas A implementeaz o interfa X, un obiect al clasei A este de tip X
implicit. Ca urmare el poate fi atribuit unui alt obiect de tip X. Numele unei interfee
poate fi utilizat la fel ca i numele unei clase, mai puin ns la instanierea prin
operatorul nero.

Clase interioare (Inner classes)


O clas interioar este o clas definit n interiorul altei clase. Astfel, clasa interioar
de acces direct la toi membrii clasei n care este definit i invers.
O clas interioar poate fi declarat oriunde n interiorul unei clase. n cazul n care e
declarat n afara oricrei metode, clasa interioar are acces la oricare membru al
clasei exterioare, fie el i privat.
n cazul n care clasa interioar se declar n interiorul unei metode, are n plus acces
la oricare variabil local a metodei.
Nu numai clasa interioar are acces la membrii privai ai clasei exterioare, ci i invers
clasa exterioar are acces la membrii privai ai clasei interioare.
La compilarea unui program sursa ce conine declaraii de clase se vor obine pentru
fiecare clas un fiier .class, iar pentru clasa interioar un fiier
Nume clas ext $ InnerClass.class
nume clas interioar
O clas interioar poate avea modificatorii specifici claselor (abstract, final) i o serie
de modificatori specifici membrilor unei clase (public, protected, private, static).
Aceti modificatori atribuie clasei interioare aceleai proprieti ca n cazul oricrui
membru al unei clase.
O clas interioar static nu poate accesa dect membrii statici ai clasei exterioare. Iar
o metod static a clasei interioare definite n metoda respectiv.
O caracteristic a claselor interioare este c ele pot fi declarate fr nume (anonime)
implementnd o interfa sau o clas Java.
Noiunea de interfa
Este posibil s declarm clase abstracte n care toate metodele sunt abstracte. Acest
lucru este posibil i cu ajutorul interfeelor.
Interfeele constituie (soluia) mecanismul propus de Java pentru tratarea problemelor
ridicate de motenirea multipl.

Motenirea multipl este facilitatea oferit de unele limbaje de programare ca o clas


s moteneasc (prin extindere) membri ai mai multor clase.
Interfeele reprezint o modalitate de a declara un tip constnd numai din constante i
din metode abstracte. Ca sintax, o interfa este asemntoare unei clase, cu
deosebirea c n loc de class trebuie precizat, interface, iar metodele nu au corp,
acesta fiind nlocuit cu ;.
Ca i n cazul claselor abstracte, este evident c nu pot fi create obiecte de tipul unei
interfee.
Cmpurile unei interfee au n mod implicit modificatorii static i final, deci
sunt constante.
Metodele interfeelor sunt ntotdeauna publice i au n mod implicit
modificatorul abstract. n plus ele nu pot fi statice, deoarece fiind abstracte, nu
pot fi specifice claselor.
Orice interfa este gndit pentru a fi ulterior implementat de o clas, n care
metodele interfeei s fie redefinite, adic s fie specifice aciunile ce trebuie
ntreprinse. Faptul c o clas C implementeaz o interfa I trebuie specificat prin
inserarea informaiei implements I n antetul clasei.
Ex.

interface I{
char c=a; int i=0;
void scrie();
}
class C implements I{
public void scrie(){ IO.writeln(c+ +i);}
}

Obs.

o interfa poate extinde oricte interfee


dac o clas implementeaz doar unele din metodele unei interfee, atunci
ea trebuie declarat cu abstract
spre deosebire de interfee (care sunt limitate la constante i anunuri de
metode), clasele abstracte pot avea implementri pariale, metode statice,
membri cu modificatorul protected, cmpuri care nu sunt finale
o clas poate implementa oricte interfee, dar poate extinde o singur
clas

Dac o clas extinde o alt clas i implementeaz una sau mai multe interfee, atunci
trebuie anunat nti extinderea i apoi implementarea, ca de ex:
class C extends B implements I1, I2, I3;
Ca i clasele, interfeele pot fi extinse. O interfa I poate extinde oricte interfee, n
acest mod adugndu-se la I noi constante i (anunuri) de metode.
Este permis ca o interfa ce extinde alt interfa s conin o constant cu acelai
nume!!
W
De ex. pentru urmtoarea structur de interfee:
Cl C X
Cl D Y
Cl E Z

X
Y
Z

este posibil ca n una sau mai multe dintre interfee s fie declarat o constant c.
Deosebim 2 cazuri:
1) Constanta c este redeclarat n interfaa Z: o referire la c constituie o referire la
constanta c din Z. Putem face referire i la constantele din celelalte interfee
prin X.c, Y.c i W.c.
2) Constanta c nu este redeclarat n interfaa Z: o referire la c este corect dac
exist un unic drum de interfee ce coboar n Z, drum n care c poate fi
declarat de mai multe ori; n acest caz referirea are ca obiect cea mai
recent declarare a cmpului, adic cea din interfaa cea mai apropiat de Z.
Dac c este declarat pe mai multe drumuri de interfee ce coboar n Z,
compilatorul va semnala c este vorba de o referire ambigu. Dac n Z
constanta c nu poate fi regsit pe nici un drum de interfee ce ajunge n Z,
atunci va fi semnalat din nou eroare.
Dac presupunem c n X i n Y (sau n supertipurile lor) apare o metod cu acelai
nume, deosebim 3 situaii:
1) dac metodele au signaturi diferite, vor fi motenite ambele metode;
2) dac metodele au signaturi egale i acelai tip pentru valoarea ntoars, va fi
motenit o singur metod;
3) dac metodele au aceiai signatur, iar tipurile valorilor ntoarse difer, atunci
motenirea nu va fi posibil (eroare de compilare).
Obs.
1) n clasele C i D, redefinirea metodei met s-a fcut cu precizarea
modificatorului public. Acest lucru este obligatoriu, pentru c altfel ar
fi fost folosit modificatorul implicit, dar o redefinire nu poate fi
restrictiv n privina drepturilor de acces.
2) Din metoda principal nu putem invoca implementarea lui met din
interfee, deoarece o metod static poate accesa numai cmpurile i
metodele statice ale clasei; pe de alt parte ns, o metod anunat ntro interfa nu poate fi redefinit printr-o metod static, deci nu putem
preciza atributul static pentru metoda met din interfee.
Implementarea interfeelor
Fie o clas D care implementeaz dou interfee A, B i extinde o clas C.
Presupunem c n toate clasele apare un cmp cu acelai nume X.
(trebuie specificat super.x pentru cmpul din superclas)

Motenirea metodelor interfeelor are loc n modul descris la extinderea interfeelor,


deci toate metodele motenite din interfee trebuie implementate. Dac o metod cu
acelai nume i aceeai signatur apare n superclas i n interfeele implementate,
atunci:
dac precizm n C o implementare a metodei, ea va constitui o redefinire
a metodei din superclas; la aceasta fcndu-se referire (apel) prin super
dac n C nu este precizat o implementare a metodei, atunci metoda
(motenit) din superclas constituie implementarea metodei din interfee,
cu condiia ca ea s aib modificatorul public.
Afieaz rezultatul
1
2
3
1
2
3

4
1

Obs. ob1 are tipul declarat A i tipul real D, ceea ce face ca metoda scrie prin
intermediul acestui obiect s se refere la metoda scrie din clasa C, iar referina ob1.x
s se adreseze constantei x din interfaa A.
Iniializarea interfeelor
Cum cmpurile unei interfee sunt statice, este important ordinea n care ele sunt
declarate. (vezi iniializarea claselor pag. 31)
Iniializarea unei interfee nu implic iniializarea superinterfeelor sale.
1
y=3
yy=4
3
Obs.
- Y.x este o referire la un cmp constant, deci nu conduce la iniializarea interfeei X
- Z.y este o referire la un cmp neconstant declarat n Y i ca urmare aceast interfa
este iniializat. Aceasta nu conduce ns la iniializarea superinterfeei X. De
asemenea, nici interfaa Z nu este iniializat, dei numele ei apare n referirea Z.y
Rezolvarea n Java a problemei motenirii multiple
S presupunem c plecnd de la clasele C1, C2, ..., Cn dorim s construim o nou
clas care s moteneasc unele dintre metodele lor. Java permite doar motenire
simpl, deci va fi necesar s apelm la interfee.
Modalitatea de rezolvare a problemei motenirii multiple prezentat este independent
de numrul de clase motenite.
Vom folosi urmtoarea structur de interfee i clase:
I1

I2

.......

In

C
C
1

C
2

C
n

Clasele C1, C2, ..., Cn implementeaz respectiv metodele anunate n interfeele I1,
I2, ...., In, iar clasa C implementeaz toate interfeele I1, I2, ..., In. Vom explica doar
modul n care clasa C motenete implementrile din C1 ale metodelor anunate n I1
(restul la fel). Deci vom presupune situaia n care C trebuie s extind doar clasa C1.
n clasa C vom declara i crea un obiect Ob1 de tipul C1 (se presupune c n clasa C
se tie ce implemetare a interfeei I1 trebuie folosit). Atunci pentru fiecare metod
met implementat de C1 introducem n clasa C metoda met cu aceiai signatur i
avnd una din formele:
tip met(...) {return Ob1.met(...);}
void met() {Ob1.met();}
dup cum metoda ntoarce sau nu o valoare.

Produce la ieire:
x1
1
Obs. Putem declara variabile avnd ca tip numele unei interfee i putem atribui unei
astfel de variabile un obiect care implementeaz interfaa.
n exemplul prezentat nu este necesar ca C s tie care este clasa ce
implementeaz pe I1, ci poate afla acest lucru prin intermediul unui constructor, deci
la crearea unei instanieri a lui C, putem preciza ce implementare a lui I1 s
foloseasc. Mai mult, putem folosi implementri diferite pentru redefinirea unor
metode diferite.
n exemplul urmtor interfaa X este implementat de clasele Cx1 i Cx2, dar i de
clasa C ale crei metode folosesc acelai mecanism: invoc n fapt, metodele cu
acelai nume ale claselor Cx1 i Cx2 prin instanieri ale acestora.

Se obine la ieire
x1
2
Obs. Dac n loc de X Ob1=new Cx1(); X Ob2=new Cx2(); se folosete
X Ob1=new Cx2(); X Ob2=new Cx1();
la ieire avem
x2
1
Clase interne
Clasele- care sunt membrii unui pachet sunt considerate clase de nivel superior.
Clasele se pot declara ntr-o alt clas ele se mpart n 2 categorii:

clase de nivel superior: este vorba de membrii statici ai unei clase de nivel
superior; aceste clase au deci acelai statut cu clasele membre ale unui
pachet
clase interne care nu sunt de nivel superior
(ntr-o clas de nivel superior se poate plasa i o interfa)

ntr-un bloc sau n corpul unei metode putem defini clase la fel cum putem
defini variabile locale, acestea sunt clasele interne.
O clas intern poate conine la rndul ei o clas intern.
Instanierea unei clase interne este asociat instanierii curente a clasei care o
conine, drept urmare clasa intern poate accesa direct cmpurile clasei ce o
cuprinde.
O clas care este membru static al unei clase nu poate folosi direct cmpurile
clasei ce o cuprinde (acest lucru poate fi realizat indirect, prin crearea unui obiect
ce instanieaz clasa al crui membru este).
O clas intern nu poate fi folosit direct n clasa n care a fost declarat i n
descendenii (n arborele de clase ai) acesteia. Domeniul ei de vizibilitate este cel
al unui cmp, respectiv al unei variabile locale.

Clase anonime sunt clase fr nume. O clas anonim apare ntr-o new SuperA(...)
{}
prin care clasa anonim extinde o clas sau implementeaz o interfa SuperA i prin
care este creat un obiect al clasei anonime.
Obs. Crearea de clase anonime permite extinderea implicit a unei clase i
implementarea implicit a unei interfee (fr a folosi extends sau implements).
Aceast tehnic este larg folosit n lucrul cu interfee grafice.

Obs.

- clasa A are un constructor i o metod fr aciune


- n clasa A-C apare metoda principal, n care obiectul ObA (avnd tipul
declarat A) este creat ca tip real o clas anonim care extinde clasa abstract A. Clasa
anonim