Sunteți pe pagina 1din 21

Curs 9

Clase abstracte Interfee Clase imbricate i clase interioare

Clase abstracte
Clasele abstracte conin n declaraia lor modificatorul abstract. Clasele abstracte nu pot fi instaniate. Remarcm nsa c pot exista clase care nu pot fi instaniate dei nu sunt abstracte, cum sunt, de exemplu, clasele care nu au dect constructori privai. Cu toate c clasa abstract nu poate fi instaniat, se pot declara variabile aparinnd unor clase abstracte. Acestor variabile li se pot da nsa ca valori numai referine ctre instane ale unor subclase concrete. De exemplu, daca A este o clas abstracta, iar B este o subclas concreta a clasei A, atunci este corect declaraia A a1=new B();

Din punct de vedere conceptual, clasa abstract modeleaz un concept general, care trebuie apoi dezvoltat prin subclase. Subclasele unei clase abstracte pot fi, la rndul lor, abstracte sau concrete. De exemplu, clasa abstract FiguraPlana poate avea ca subclase clasele Cerc, Elipsa, Poligon etc. Din punct de vedere al progrmarii, clasa abstract conine cel puin o metod abstract, adic o metod pentru care s-a declarat numai antetul, fr s i se defineasc i corpul. O clas poate s conin o metod abstract n mai multe moduri: a/ n corpul clasei este declarat explicit o metod abstract; b/ clasa mostenete de la superclasa ei o metod abstract, care nu este definita nici n corpul clasei curente; c/ clasa implementeaza o interfa, dar nu definete una sau mai multe din metodele acesteia. Dac apare o astfel de situaie, iar clasa nu este declarat n mod explicit abstract, se genereaza o eroare la compilare. Declararea unei metode abstracte: - antetul metodei trebuie sa conina modificatorul abstract; - corpul metodei se nlocuiete prin caracterul ';' (punct i virgul).

abstract class FiguraPlana { public abstract double perimetru(); // metoda abstracta public abstract double arie(); // metoda abstracta } class Cerc extends FiguraPlana { private double raza; public Cerc(double raza) { this.raza=raza; } public double raza() { return raza; } public double perimetru() { // redefinirea metodei abstracte return 2*Math.PI*raza; } public double arie() { // redefinirea metodei abstacte return Math.PI*raza*raza; } public double diametru() { return 2*raza; } }

Conform principiului ncapsulrii, fiecare clas are "interfaa" sa intrinsec, prin care poate fi accesata din exterior. Aceasta "interfa" conine toate datele i metodele publice ale clasei respective. Pentru a compensa lipsa motenirii multiple, n limbajul Java s-a admis c o clas poate avea mai multe interfee i c mai multe clase pot implementa aceeai interfa. S-a introdus astfel o nou categorie de componente, numite interfee, care se declar n mod asemntor cu nite clase abstracte, dar nu sunt nglobate, aa cum sunt clasele abstracte, n ierarhia unic de clase .
INTERFAA este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie sa le aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe interfee, ea conine toate metodele publice i variabilele finale publice ale acestora.

Interfee

Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la obiecte aparinnd unei clase, adic sub forma: interfaa nume_variabila1[=initializare1], ..., nume_variabilaN[=initializareN]; n care interfaa este numele unei interfee, iar celelalte elemente ale declaraiei sunt aceleai ca n cazul declarrii de referine la obiecte. Interfeele pot fi i ele organizate ierarhic, aplicndu-se principiul motenirii. n schimb, pentru interfee, ierarhia nu mai este unic, aa cum este n cazul claselor, i se admite motenirea multipl. Remarcam c, la fel ca i clasele abstracte, interfeele nu pot fi instaniate. n schimb, unei variabile referin la o interfa i se pot da ca valori referine ctre obiecte din orice clas care implementeaz acea interfa sau este descendent a unei astfel de clase.

Clasele B i C implementeaza interfeele I1 i I2, iar clasele C si D implementeaz interfeele I2 i I3. n acest exemplu, interfetele I1 i I2 sunt derivate din interfata I0 deci motenesc variabilele finale i metodele acesteia, putnd avea fiecare, de asemenea, date finale, cmpuri i metode proprii. Clasa B implementeaz interfaa I1, deci conine variabilele finale i metodele interfeei I1 i pe cele mostenite de aceasta de la interfaa I0.

Clasa C implementeaz interfeele I1 i I2, deci conine variabilele finale i metodele interfeelor I1 i I2, inclusiv pe cele motenite de acestea de la interfaa I0. Totodat, clasele A, B i C motenesc datele i metodele clasei A. Faptul c variabilele finale i metodele interfeei I0 se propag la clasa C att pe traseul I0-I1C, ct i pe traseul I0-I2-C nu mai produce dificulti, ca n cazul motenirii multiple a claselor, deoarece implementarea efectiv a acestor variabile i metode se face n clasa C i nu in interfee.

Declararea interfeelor
O declaraie de interfa introduce un nou tip referin, ai crui membri sunt cmpuri statice finale i metode abstracte. n consecin, interfaa se aseamn cu o clasa abstract pur, care nu conine dect metode abstracte i cmpuri statice finale i nu se ncadreaz n ierarhia unic de clase descendente din Object (amintim ca o clasa abstract, n afar de una sau mai multe metode abstracte, poate conine i cmpuri de date i metode concrete i este descendent a clasei Object). Dei nu se ncadreaz n ierarhia claselor, interfeele se pot constitui in diverse ierarhii de interfee, aplicndu-li-se principiul mostenirii. Cel mai important avantaj al folosirii interfeelor este c mai multe clase, de pe diferite ramuri ale arborelui ierarhic al claselor, pot fi "vzute" printr-o singur interfa. Se pot declara variabile referin la interfa la fel cum se pot declara variabile referin la clas. Interfaa este abstract i deci nu poate fi instaniat. n schimb, unei variabile referin la

interfa i se pot atribui ca valori referine la obiecte din orice clas care implementeaz interfaa respectiv.

Declaraia de interfa are forma general urmtoare: [public] interface NumeInterfata [extends lista_superinterfete] { }

declaratii_de_membri_ai_interfetei

n afar de modificatorul public, se poate folosi i modificatorul abstract, numai c acesta este implicit, deci folosirea lui este de prisos. Spre deosebire de clase, la care motenirea multipl este interzis (o clas poate avea numai o singura superclas), n cazul interfeelor motenirea multipl este permis. n consecin, clauza extends poate conine o list de nume de interfee separate prin virgule.

Declaraiile de membri ai interfeei pot fi: a/ Declaraia de cmpuri statice finale, numit i declaraie de constante, sub forma: tip NUME_CAMP1=valoare1, NUME_CAMP2=valoare2, ... , NUME_CAMP_N=valoareN; n care tip este un tip primitiv. Modificatorii public, static i final pentru cmpurile interfeei sunt implicii, deci folosirea lor este de prisos. Aceasta nseamn c toate cmpurile unei interfee sunt publice, statice i finale, deci ele trebuie s fie iniializate la declarare i nu mai pot fi modificate ulterior. Se obisnuiete ca numele de cmp ale interfeelor s fie scrise numai cu majuscule.

Exemplu: interface CuloareDeBaza { int ROSU=1, VERDE=2, ALBASTRU=4; } interface Culoare extends CuloareDeBaza { int GALBEN=3, ORANGE=5, INDIGO=6, VIOLET=7; }

b/ Declaraia de metod abstract, care const din antetul metodei urmat de simbolul ';' (punct i virgul). Ea este deci la fel ca o declaraie de metod abstract din corpul unei clase, cu urmtoarele observaii: - modificatorii public i abstract sunt impliciti, deci folosirea lor este de prisos (dar este permis); - modificatorul final nu poate fi folosit, deoarece se declar o metod abstract; - corpul metodei este nlocuit prin simbolul punct i virgul, ca la orice metod abstract.

Exemplu:
interface Interf1 { double metoda1(); int metoda2(int a, int b, double c); } Ambele metode din exemplul de mai sus sunt implicit publice i abstracte. Orice clas, care implementeaz aceasta interfa, trebuie sa conin declaraii de metode cu aceeai semntur cu cele din interfa. La definirea acestor metode m cadrul claselor, folosirea identificatorului public este obligatorie.

Clase imbricate i clase interioare


n limbajul Java se permite ca o clas s aib ca membri alte clase. Acestea se numesc clase imbricate sau clase ncuibate (engleza: nested classes). Ca i ceilali membri, clasele imbricate pot fi statice sau nestatice i se declar n corpul clasei care le ncorporeaz. Clasele imbricate nestatice se numesc clase interioare (englez: inner classes).

Clase imbricate i clase interioare


O clas care ncorporeaz (imbric) alte clase se declar astfel: [public] class NumeClasa {

declaratii_de_membri_ai_clasei [modificatori_de_camp] class NumeClasaImbricata { declaratii_de_membri_ai_clasei_imbricate


}

declaratii_de_membri_ai_clasei
}

Se recurge la aceasta tehnic atunci cnd utilizarea unei clase are sens numai n cadrul altei clase. Aadar, prin imbricare se creeaz o legatur strnsa ntre dou clase. Este posibil, desigur, ca o clasa s conin mai multe clase imbricate. Remarcm c declaraia clasei imbricate este tratata ca oricare alta declaraie de membru al clasei, putnd avea i modificatori de cmp (de exemplu static). Fiind membru al clasei, clasa imbricat are acces la toi membrii clasei care o conine, chiar i la cei privai. Dac clasa imbricat este static, ea nu poate referi direct dect membrii statici ai clasei care o conine. Clasa imbricat static exist, la fel ca i cmpurile sau metodele statice, numai n cadrul clasei care o conine, nu i n instanele acesteia. n consecin, pentru a referi membrii acestei clase, se folosete pentru calificare numele clasei. Clasa interioar (clasa imbricat nestatic) are cte o instan n interiorul fiecrei instane a clasei care o conine. n consecin, accesul la membrii ei se poate face folosind drept calificator referina la o instan. Clasa interioar are acces la toi membrii clasei care o conine, att la cei statici, ct i la cei de instan (nestatici).

Nivel 1
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

Intrebri

Ce este ncapsularea? Care sunt modificatorii de acces pentru cmpuri i metode? Ce sunt constructorii? Ce particulariti prezint declaraiile de constructori? Poate avea o clas mai multi constructori? cum se disting acetia? Ce este constructorul implicit? Ce este agregarea? Ce este motenirea? Ce relaie exist ntre o clas i superclasa ei? Cte superclase poate avea o clas n limbajul Java? Ce sunt membrii protejai ai clasei? Ce sunt this si super? Ce particulariti prezint constructorul unei clase derivate? Ce se nelege prin redefinirea metodelor? Ce fel de metode pot fi redefinite?

Intrebri
16. 17. 18. 19. 20. 21. 22. 23.
24. 25. 26. 27. 28. 29. 30. 31.

Ce este o metod final? Ce se nelege prin ascunderea cmpurilor? n ce situaie o metoda poate fi ascuns? Este posibil declararea unei clase de excepii proprie? Ce este o clas final? Ce este polimorfismul? n ce situaii se manifest polimorfismul? Cum se face conversia unei referine dintr-o clasa n referin dintr-o subclas? Poate fi instaniata clasa care conine metoda main()? Ce este o clas abstract? Ce este o metod abstract? Cum se declar o clas abstract? Ce este o interfa? Ce efect are faptul c o clas implementeaz o interfa? Ce este o clasa imbricat? Ce este o clasa interioar?

Nivel 2
1. 2. 3. 4. 5. 6. 7. 8. 9.

10. 11.

12.
13. 14.

Enumerai caracteristicile obiectelor i claselor Ce se nelege prin identitatea obiectelor? Ce se nelege prin clasificare, ca proprietate a obiectelor? Ce este motenirea? Ce fel de motenire este permis n limbajul Java n cazul claselor? Ce se nelege prin ascunderea cmpurilor? Cum poate fi accesat dintr-o clas un cmp ascuns al superclasei? Este posibil s utilizm ntr-o clas un membru privat al superclasei? Este posibil s declarm ntr-o clas o metod cu aceeai signatur ca o metod privat din superclas? Ce se ntmpl dac un argument sau o alt variabil local a unei metode are acelai nume cu un cmp al clasei respective? Cum putem utiliza ntr-o metod a unei clase un cmp ascuns al propriei clase? Sa considerm c n subclasa B a clasei A a fost redefinit metoda met(); cum putem utiliza n B metoda met() din A? Ce este o metoda static? Ce se ntmpl dac ntr-o clas se declar o metod static cu aceeai signatura ca a unei metode statice din superclas?

15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.

27.
28. 29.

Cum poate fi invocat o metod static? Cum poate fi invocat o metod de instan? Dai un exemplu de declarare a unei clase de excepii. Ce metode, n limbajul Java, nu sunt supuse polimorfismului? Dai un exemplu de situaie n care trebuie folosit castul pentru a converti o referin. n ce scop au fost definite n clasa Object metodele equals() i toString()? S considerm c clasa A conine att metoda main(), ct i un cmp nestatic a i o metod nestatica met(). Cum putem utiliza n main cmpul a i metoda met()? Ce asemnri i deosebiri exist ntre interfee i clasele abstracte? Poate exista motenire multipl n cazul interfeelor? Care sunt proprietile implicite ale cmpurilor unei interfee? Care sunt proprietile implicite ale metodelor unei interfee? Poate fi declarat ca final o metod a unei interfee? Justificati rspunsul. Ce avantaj prezint declatrarea interfeei Integrator ca o interfa i nu ca o clas? Ce avantaj prezint folosirea unei interfee ca argument al unei metode? Ce deosebire exist ntre clasa imbricat i clasa interioar?

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