Documente Academic
Documente Profesional
Documente Cultură
Interfete NBSP JAVA
Interfete NBSP JAVA
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.
interface I{
char c=a; int i=0;
void scrie();
}
class C implements I{
public void scrie(){ IO.writeln(c+ +i);}
}
Obs.
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)
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.