Download - Curs07 Java
-
7/22/2019 Curs07 Java
1/39
3/2/2014 1
Cuvinte importante:
- conversia explicita de tip (casting) pentru obiecte: conversie
implicita si explicita de tip;- conversia tipurilor primitive in obiecte si invers;
- pachete de clase de obiecte: utilizarea pachetelor existente de
clase de obiecte; comanda import; variabila CLASSPATH; locul de
dispunere a claselor in sistemul de fisiere; crearea propriilor pachete de
clase de obiecte;pachetele de clase si controlul accesului la clase;
- mostenire multipla;
- interfata Java: crearea interfetelor; folosirea interfetelor;
implementarea unei interfete; implementarea unor interfete multiple;
derivarea interfetelor;
- implementarea de componente generice: programarea generica;
clase generice.
-
7/22/2019 Curs07 Java
2/39
3/2/2014 2
Conversia explicita de tip (casting) pentru obiecte
Operatia de conversie a instantelor unor clase catre instante ale altor clase se poate
face numai daca clasele sursa si destinatie sunt inrudite prin mostenire, adica o clasa
trebuie sa fie o subclasa a alteia.Pentru ca mostenirea permite tratarea unui obiect ca fiind de tip propriu sau de tipul
superclasei, unele obiecte nu au nevoie de conversie explicita. Astfel, deoarece
subclasele contin toate informatiile superclasei lor, si chiar mai mult, se poate folosi
o instanta a unei subclase acolo unde se doreste referirea la o instanta a superclasei.
La operatia de atribuire, conversia implicita inseamna ca unei variabile referinta detipul unei superclase i se poate atribui o referinta la o instanta de tipul oricarei
subclase a ei. Variabila de tipul superclasei, folosita in acest fel, se spune ca este
polimorfica.
Urmatorul exemplu arata o conversie implicita prin atribuirea valorii unei variabile
referinta de tipul unei subclase (clasaPisica) la o variabila de tipul unei superclase
(clasaAnimalDeCasa):
AnimalDeCasa a = new Pisica();
Variabila referinta acare este de tipulAnimalDeCasadesemneaza un obiect de tipul
Pisica.
-
7/22/2019 Curs07 Java
3/39
3/2/2014 3
Conversia explicita intre tipurile obiectelor (sau casting-ul) este necesara atunci cand
se foloseste o instanta a superclasei acolo unde se doreste referirea la o instanta a
subclasei.Sintaxa folosita pentru conversia explicita de tip este:
()
unde:
- - numele subclasei catre care se doreste conversia;
- - numele variabilei referinta care indica o instanta a
unei superclase din care face parte subclasa cu numele .
Nota:Sa retinem ca operatia de casting creaza o referinta de tip la
instanta superclasei, in timp ce instanta cu tipul superclasei continua sa existe ca si
inainte.
-
7/22/2019 Curs07 Java
4/39
3/2/2014 4
De exemplu, daca avem o operatie care apeleaza metode ale obiectelor apartinand
claseiInteger, folosirea unui obiect din clasa Objectnu va dispune de multe din
metodele definite inIntegersi drept urmare va fi necesara o conversie explicita la
tipulInteger, ca mai jos:
int elemVarf = ((Integer) s.top()).intValue();
In acest exemplu metodas.top()returneaza un obiect de tip Object. Pentru a extrage
valoarea retinuta in acest obiect trebuie sa-l convertim explicit la tipulInteger,astfel
incat sa dispunem de metoda intValue()care returneaza valoarea obiectului convertit
laIntegerca o valoare intreaga de tip int.
Conversia tipurilor primitive in obiecte si invers
Conversia de la un tip de data primitiv la un tip referinta si invers nu este posibila in
Java in mod implicit. Tipurile primitive si obiectele sunt elemente foarte diferite in
Java si nu se poate face conversie automata intre cele doua. In acest sens se poate
analiza si instructiunea prezentata mai sus.
Ca alternativa, pachetulJava.langcontine clase de obiecte care corespund fiecarui
tip de date primitive:Byte, Short, Integer, Long, Float, Double, Character, Boolean.
Totusi, ele sunt interpretate diferit fata de tipurile primitive corespondente si de
aceea ele nu pot fi folosite in locul tipurilor primitive si nici invers.
-
7/22/2019 Curs07 Java
5/39
3/2/2014 5
Pentru a crea un obiect de un tip ca:Byte, Short, Integer, Long, Float, Double,
Character, Boolean, se foloseste operatorul new.
Urmatoarea instructiune creaza o instanta a claseiIntegercu valoarea 44:
Integer numarInt = new Integer(44);
Obiectul numarIntse poate folosi ca orice alt obiect, beneficiind, in acelasi timp si
de toate metodele claseiIntegerdin bibliotecajava.lang.
La fel se procedeaza si pentru celelalte clase de obiecte care corespund tipurilor
primitive.
Pentru a folosi valoarea dintr-un obiect de un tip:Byte, Short, Integer, Long, Float,
Double, Character, Boolean, ca valoare de tip primitiv corespunzator, se pot apela
metode care realizeaza acest lucru.
Metodele des folosite pentru transformarea valorii unui obiect de acest gen in valori
de un tip primitiv sunt:
byteValue() - pentru valori de tip byte;
shortValue() - pentru valori de tipshort;
intValue() - pentru valori de tip int;
-
7/22/2019 Curs07 Java
6/39
3/2/2014 6
longValue() - pentru valori de tip long;
floatValue() - pentru valori de tipfloat;
doubleValue() - pentru valori de tip double;
charValue() - pentru valori de tip char;
booleanValue() - pentru valori booleene;
De exemplu, pentru a extrage o valoare intdin obiectul numarInt, se foloseste
urmatoarea instructiune:int numar = numarInt.intValue(); // returneaza valoarea 44.
Pachete de clase de obiecte
Un pachet (package) contine un numar de clase inrudite ca scop, ca domeniu sau din
punct de vedere al mostenirii.
Daca programele sunt mici si folosesc un numar limitat de clase, nu este necesar sa
cream pachete. Insa daca aplicatia noastra foloseste din ce in ce mai multe clase
atunci este necesar sa le organizam in pachete.
-
7/22/2019 Curs07 Java
7/39
3/2/2014 7
De ce sunt folositoare pachetele?
- Pachetele permit organizarea claselor in grupuri. Asa cum pe hard-disc
avem directoare si subdirectoare pentru a ne organiza fisierele si aplicatiile,
pachetele ne permit sa organizam clasele in grupuri din care putem folosi doar ceea
ce avem nevoie pentru fiecare aplicatie.
- Pachetele reduc problemele datorate conflictelor de nume. Cu cat creste
numarul claselor de obiecte, cu atat creste posibilitatea de a folosi un nume de clasa
deja existent, ceea ce va duce la aparitia unor conflicte si erori la integrarea acestora
in aplicatii. Pacetele permit ascunderea claselor si evitarea acestor conflicte.
- Pachetele protejeaza clasele, variabilele si metodele depasind nivelul declasa.
- Pachetele pot fi folosite la identificarea claselor. De exemplu, daca
implementam un set de clase pentru a realiza o anumita sarcina, putem sa folosim
pentru pachetul de clase respectiv un identificator unic, care sa desemneze autorul
sau organizatia din care provine.Nota:Chiar daca un pachet este, in esenta, un grup de clase, acesta poate contine si
alte pachete, care formeaza alt nivel ierarhic asemanator, cumva, ierarhiei de clase.
Fiecare nivel reprezinta, de obicei, o grupare mai mica de clase si cu sarcini mai
precise. Biblioteca de clase Java este organizata si ea dupa aceste principii.
-
7/22/2019 Curs07 Java
8/39
3/2/2014 8
Utilizarea pachetelor existente de clase de obiecte
Stim ca pachetele grupeaza mai multe clase la un loc. Pana acum am folosit pachete
din biblioteca Java in legatura cu operatiile de I/O necesare citirii de la tastatura a
datelor, pentru generarea unor obiecte de tipRandometc.
Ca regula, putem alege unul dintre urmatoarele trei mecanisme pentru a utiliza o
clasa continuta intr-un pachet:
- cand clasa pe care dorim sa o folosim se afla in pachetuljava.lang, ea se
poate referi pur si simplu prin numele ei;
- cand clasa pe care dorim sa o folosim se afla in alt pachet, ea se poate
referi folosindu-i numele complet, adica inclusiv pe cel al pachetului
(java.util.Random);
- pentru clasele din alte pachete folosite frecvent in aplicatie, se pot
importa clasele individuale sau intreg pachetul de clase folosit; dupa ce clasa sau
pachetul au fost importate, se poate referi clasa doar prin numele sau.
Nota: Clasele care nu sunt declarate ca facand parte dintr-un anumit pachet sunt
automat incluse intr-un pachet prestabilit. Aceste clase pot fi referite prin numele lor,
de oriunde din cod.
-
7/22/2019 Curs07 Java
9/39
3/2/2014 9
Comanda import
Pentru a importa clasele dintr-un pachet se foloseste comanda import, asa cum am
vazut in multe exemple prezentate pana acum.
Se poate importa o clasa ca in exemplul urmator:
import java.util.Vector;
Se poate importa un intreg pachet de clase, folosind simbolul asterisc (*) in locul
numelor de clasa, astfel:
import java.io.*;
Nota:Comanda din exemplul de mai sus nu importa toate clasele pachetului; sunt
importate doar acele clase care au fost declaratepublic, si chiar si asa sunt importate
doar acele clase care sunt referite in cod. De asemenea, daca pachetul respectiv are si
subpachete, prin comanda importdin exemplul de mai sus, nu se vor importa si
subpachetele pachetului specificat in comanda import.
Pentru a importa toate clasele dintr-o ierarhie complexa de pachete va trebui sa seimporte explicit fiecare nivel al ierarhiei.
Instructiunea importtrebuie plasata inaintea oricarei definitii de clasa (insa dupa
definitia pachetului, daca se doreste crearea unui pachet propriu, asa cu se va
prezenta in sectiunea urmatoare).
-
7/22/2019 Curs07 Java
10/39
3/2/2014 10
Spre deosebire de directiva #includedin limbajul C/C++, care include cod-sursa
dintr-un alt fisier, instructiunea importindica doar locul unde poate fi gasita o clasa
si nu are nici un rol in marirea dimensiunii aplicatiei proiectate.Observatie:Trebuie evitate conflictele de nume de clasa, deoarece compilatorul va
semnala o eroare. Conflicul de nume de clasa are loc atunci cand doua clase din
pachete diferite au acelasi nume. In aceasta situatie, referirea la clasa dorita din
aceste pachete trebuie sa se faca prin numele sau complet (inclusiv numele
pachetului).
Variabila CLASSPATH si locul de dispunere a claselor in sistemul de fisiere
Pentru ca programul nostru sa poata folosi o clasa, trebuie sa afle locul unde este
dispusa clasa in sistemul de fisiere; altfel, va fi generata o eroare referitoare la
inexistenta clasei. Pentru gasirea claselor Java foloseste:
- numele pachetului;
- directoarele referite de variabile de mediu CLASSPATH.
Numele pachetelor corespund unor nume de directoare ale sistemului de fisiere.
-
7/22/2019 Curs07 Java
11/39
3/2/2014 11
De exemplu, clasajava.applet.Appletse va gasi in directorul appletcare face parte si
el din directoruljava(adica, java\applet\Applet.class).
Java cauta aceste directoare, pe rand, in cadrul cailor (path-urilor) incluse in variabila
de mediu CLASSPATH, daca aceasta este definita. Daca nu este configurata nici o
variabila CLASSPATH, Java cauta in directorul prestabilit,java\lib(aflat in
directorul cu versiunea de soft SDK folosita), precum si in directorul curent.
Java cauta, in aceste directoare, clasa referita in fisierul-sursa folosindu-se de numele
pachetului si al clasei, iar daca nu o gaseste semnaleaza eroare de tip class not
found.
-
7/22/2019 Curs07 Java
12/39
3/2/2014 12
Crearea propriilor pachete de clase de obiecte
Pentru crearea unor pachete proprii de clase de obiecte se parcurg urmatoareleetape:
1. Alegerea unui nume pentru pachet.
Numele ales pentru pachet depinde de modul in care dorin sa folosim aceste clase.
Conventia de denumire a pachetelor, recomandata de Sun este de a folosi numele de
domeniu Internet cu elementele inversate. Ideea este de a ne asigura ca numele
pachetului creat este unic.
Prin conventie, numele pachetelor incep cu litera mica, pentru a le deosebi de
numele claselor, care incep cu litera mare. De exemplu, in cazul denumirii complete
a clasei String(adica,java.lang.String) putem vizualiza foarte usor numele
pachetului de numele clasei. Aceasta conventie ajuta si ea la reducerea conflictelorde nume.
-
7/22/2019 Curs07 Java
13/39
3/2/2014 13
2. Crearea structurii de directoare.
Se creaza pe hard-disc o structura de directoare conforma cu numele pachetelor.
Daca pachetul are un singur nume (cum ar fi:pachetulmeu) este suficient sa cream
un director cu acest nume.
Daca numele pachetului este compus din mai multe parti (cum ar fi:
ro.utcb.pachetulmeu), trebuie create si subdirectoarele respective.
De exemplu, pentru pachetul ro.utcb.pachetulmeutrebuie sa cream directorul ro, in
cadrul acestuia subdirectorul utcb, iar in cel din urma, subdirectorulpachetulmeu.
Clasele si fisierele sursa vor fi pastrate apoi in directorulpachetulmeu.
3. Adaugarea unei clase intr-un pachet.
Pasul final este de a introduce clasa intr-un pachet, folosind instructiunea package,
plasata inainte de orice instructiune importfolosita.
Se poate adauga o clasa la un pachet ca in exemplul urmator:
packagero.utcb.pachetulmeu;
Nota:Folosirea unui mediu de dezvoltare de aplicatii de tipul IDE NetBeans
usureaza crearea pachetelor si a structurii de directoare aferente acestora. Mediile de
acest tip permit si crearea de proiecte care inglobeaza pachetele si alte fisiere
necesare aplicatiei, creand de fapt aplicatii de tip .jar.
-
7/22/2019 Curs07 Java
14/39
3/2/2014 14
Pachetele de clase si controlul accesului la clase
Controlul accesului la clase se poate realiza folosind modificatorul de accespublic.
Acest acces inseamna ca respectiva clasa este vizibila si poate fi importata in afara
pachetului. Clasele declarate publice pot fi importate de orice alte clase din afara
pachetului.
Atunci cand folosim instructiunea importcu simbolul *, se vor importa numai
clasele publice din pachetul respectiv.
Daca nu este specificat nici un modificator pentru clasa, atunci acesteia i se atribuie
un control prestabilit al accesului de tippackage-friendly. Acest acces presupune ca
respectiva clasa este disponibila (vizibila) tuturor claselor din acelasi pachet, insa nu
si in afara pachetului- nici macar subpachetelor.Clasa nu poate fi importata sau
referita prin nume.
-
7/22/2019 Curs07 Java
15/39
3/2/2014 15
Exemplu de pachete proprii de clase create pentrun aplicatia
TestFormaInterfata.java
Ne propunem sa rezolvam urmatoarea problema:
Se citesc N forme geometrice (patrate, dreptunghiuri, cercuri) de latastatura. Sa se afiseze formele geometrice ordonate dupa arie.
Pentru rezolvarea acestei probleme s-au definit urmatoarele clase de obiecte:
- clasa abstracta a formelor geometrice cu numeleFormaGeo;
- clasele derivate din superclasaFormaGeocare caracterizeaza formele
geometrice specifice: Cerc,DreptunghisiPatrat;
- doua clase ajutatoare, care pot fi folosite si de alte aplicatii si anume:
- interfata Compra(despre folosirea interfetei vom vorbi ceva
mai tarziu in aceasta lectie) care declara o metoda publica cu numele comparaCu(),
asemanatoare metodei din biblioteca Java compareTo(), folosita pentru comparareaariei a doua obiecte de tipFormaGeo;
- clasa Sortcare realizeaza ordonarea formelor geometrice
concrete (Cerc, Patrat si Dreptunghi) dupa arie; acesta clasa are un caracter mai
general si poate fi folosita pentru ordonarea altor obiecte dupa diferite criterii.
-
7/22/2019 Curs07 Java
16/39
3/2/2014 16
- clasa aplicatiei propriu-zise cu numele TestFormaInterfatafolosita
pentru citirea formelor de la tastatura si afisarea formelor geometrice ordonate dupa
arie.
Pentru o mai buna organizare, clasele de obiecte enumerate au fost impartite pepachete, ceea ce inseamna ca fiecare fisier de tip .classa fost stocat intr-un director
corespunzator numelui pachetului.
Astfel, au fost create urmatoarele pachete de clase de obiecte:
- pachetul cu numele clasegenericecare contine fisierele de tip .class:
Sort.classsi Compara.class; acest pachet a fost stocat in directorul cu numeleclasegenerice;
- pachetul cu numeleformegeometricecare contine fisierele de tip .class:
Cerc.class,Dreptunghi.class,Patrat.classsiFormaGeo.class; acest pachet a fost
stocat in directorul cu numeleformegeometrice.
Fisierul TestFormaInterfata.class corespunzator aplicatiei propriu-zise nu a fostinclus in nici un pachet si a fost stocat in directorul curent de lucru aplicatiipachete.
Pentru ca aplicatia sa functioneze, acest director trebuie adaugat la variabila de
mediu CLASSPATH. In directorul curent s-au creat si directoarele corespunzatoare
pachetelor descrise.
-
7/22/2019 Curs07 Java
17/39
3/2/2014 17
In concluzie, structura de directoare si pachetele continute in aceste directoare arata
ca in schema de mai jos:
Directorul de lucru
aplicatiipachete
Directorul
clasegenericeFisierul aplicatiei
TestFormaInterfata.class
Directorul
formegeometrice
Fisierele Sort.class si
Compara.class
Fisierele Cerc.class,
Dreptunghi.class, Patrat.class
si FormaGeo.class
Descrierea detaliata a programelor-sursa se va face in capitolul referitor la interfete.
-
7/22/2019 Curs07 Java
18/39
3/2/2014 18
Mostenire multipla. Interfata
In cazul mostenirii multipleo clasa este derivata din doua sau mai multe superclase.
De exemplu, pot exista in ierarhie clase precum StudentsiAngajat. Din aceste doua
clase ar putea fi derivata o clasa cu numeleAngajatStudentcare sa contina atribute si
metode combinate din clasele StudentsiAngajat.
Mostenirea multipla poate conduce insa la dificultati de proiectare. De exemplu, cele
doua superclase din care deriveaza subclasa ar putea contine metode care au aceeasi
semnatura, dar implementari diferite sau ar putea avea atribute cu acelasi nume.
Dificultatea rezolvarii unor astfel de probleme a facut ca Java sa nu permita
mostenirea multipla.
Alternativa oferita de Java pentru mostenirea multipla este folosirea interfetelor.
O interfata Java este o colectie de comportamente abstracte, care pot fi combinate in
orice clasa pentru a introduce in acea clasa comportamente care nu pot fi mostenite de
la superclasa.
Tehnic, interfata Javaeste cea mai abstracta clasa posibila. Ea consta doar dinmetode publice abstracte si din atribute statice si finale.
O clasa implementeaza o anumita interfata daca furnizeaza definitii pentru toate
metodele abstracte din cadrul interfetei. O clasa care implementeaza o interfata se
comporta ca si cand ar fi extins o clasa abstracta specificata de acea interfata.
-
7/22/2019 Curs07 Java
19/39
3/2/2014 19
Crearea si folosirea interfetelor Java
Sintaxa de definire a unei interfete este urmatoarea:
[
-
7/22/2019 Curs07 Java
20/39
3/2/2014 20
Variabilele interfetei sunt implicit statice si finale si deci trebuie specificate valori
initiale pentru acestea.
Metodele sunt declarate in interfata numai cu antetul lor, fara corp. Ele sunt implicit
abstracte.
Observatii:
1. Interfetele nu se pot instantia, adica nu se poate crea o instanta a unei interfete;
deci, o interfata nu are o metoda constructor.
2. Nu pot exista implementari diferite pentru aceeasi metoda declarata in douainterfete.
Interfetele trebuie sa posede o protectie de pachet sau publica. Interfetele care nu
contin modificatorulpublicnu-si vor converti automat metodele la accesulpublicsi
abstractsi nici constantele la accesulpublic. O interfata nepublica are metode si
constante nepublice, acestea neputand fi folosite decat in clasele sau interfetele din
acelasi pachet.
Interfetele, ca si clasele, pot apartine unui pachet daca se foloseste instructiunea
packagein prima linie din fisierul-sursa. De asemenea, interfetele pot importa
interfete sau clase din alte pachete.
-
7/22/2019 Curs07 Java
21/39
3/2/2014 21
Un exemplu de interfata este Compara, prezentata mai jos:
/* INTERFATA folosita de mai multe clase pentru comparatii
* --------------------Metode publice---------------
* int comparaCu --> Compara doua obiecte de tip Compara
* metoda trebuie definita in clasa care o implementeaza
*/
package clasegenerice;
public interface Compara
{
int comparaCu(Compara rhs);
}
-
7/22/2019 Curs07 Java
22/39
3/2/2014 22
Interfata Comparadeclara o metoda pe care orice clasa derivata din ea (in declaratia
clasei se foloseste cuvantul-cheie implements) trebuie sa o implementeze. Metoda
comparaCu ()se va comporta similar cu metoda compareTo()din clasa String.
Metoda este implicit publica si abstracta si deci nu trebuie sa folosim modificatorii
de accespublicsi de metoda abstract.
Implementarea unei interfete
O clasa implementeaza o interfata in doi pasi:
- declara ca implementeaza interfata, folosind cuvantul-cheie implements
in antetul sau;- defineste implementari pentru toate metodele din interfata.
Pentru a exemplifica implementarea unei interfete ne vom referi la clasaFormaGeo
descrisa in lectia 6.
Aceasta clasa implementeaza interfata Comparasi, deci, trebuie sa definim si
metoda comparaCu()din interfata Compara. Implementarea metodei in clasa
FormaGeotrebuie sa fie identica cu declaratia din interfata si, din acest motiv,
metoda comparaCu()are ca parametru un obiect de tip Comparasi nu un obiect de
tipFormaGeo. Codul clasei este ilustrat in continuare (FormaGeo.java):
-
7/22/2019 Curs07 Java
23/39
3/2/2014 23
/* Superclasa abstracta pentru forme */
package formegeometrice;
import clasegenerice.*;
public abstract class FormaGeo implements Compara
{
private String nume;
abstract public double arie();
public FormaGeo(String numeForma) {
nume = numeForma;
}
public int comparaCu(Compara rhs) {
if (arie() < ((FormaGeo) rhs).arie())return -1;
else
if (arie() == ((FormaGeo) rhs).arie())
return 0;
else
return 1;
}
final public String toString() {
return nume + ", avand aria " + arie();
}
}
-
7/22/2019 Curs07 Java
24/39
3/2/2014 24
Nota:
1. O clasa care implementeaza o interfata poate sa extinda si o alta clasa. In acest cazin declaratia clasei se foloseste mai intai cuvantul-cheie extendsurmat de numele
clasei din care deriveaza si apoi cuvantul-cheie implementsurmat de numele
interfetei pe care o implementeaza.
2. Retinem ca definirea metodelor declarate intr-o interfata trebuie obligatoriu sa fie
facuta in fiecare clasa in parte, care implementeaza interfata respectiva.3. Metodele interfetei definite in clasa care o implementeaza sunt mostenite de toate
subclasele clasei respective. Aceste metode pot fi redefinite (suprascrise) in subclase.
4. Daca o clasa extinde o superclasa care implementeaza o interfata, atunci si clasa
respectiva mosteneste interfata.
-
7/22/2019 Curs07 Java
25/39
3/2/2014 25
Implementarea unor interfete multiple
O clasa poate sa implementeze mai mult decat o singura interfata. O clasa poate
implementa mai multe interfe in doi pasi:
- declara toate interfetele pe care le implementeaza, folosind cuvantul-cheieimplementsin antetul sau urmat de numele tuturor interfetelor separate prin virgula;
- defineste implementari pentru toate metodele din toate interfetele pe care
le implementeaza.
Folosirea unor interfete multiple poate crea totusi complicatii.
Derivarea interfetelor
Ca si in cazul claselor, interfetele pot fi organizate intr-o ierarhie. Atunci cand o
interfata mosteneste o alta interfata, subinterfata primeste toate metodele si
constantele definite in superinterfata.
Pentru a deriva (extinde) o interfata se foloseste tot cuvantul-cheie extends, la fel ca incazul definitiilor de clasa:
public interface extends {
..
}
-
7/22/2019 Curs07 Java
26/39
3/2/2014 26
Nota:In cazul interfetelor nu exista o radacina comuna a arborelui de derivare asa
cum exista pentru arborele de clasa, clasa Object. Interfetele pot exista independent
sau pot mosteni o alta interfata.
Ierarhia de interfete este cu mostenire multipla. O singura interfata poate mostenioricate clase are nevoie.
Implementarea de componente generice
Unul dintre scopurile principale ale programarii orientate pe obiecte este suportul
pentru reutilizarea codului. Unul dintre mecanismele importante folosite pentru
indeplinirea acestui scop este programarea generica.
Programarea genericane spune ca, daca implementarea unei metode este identica
pentru mai multe clase (cu exceptia superclasei) se poate folosi o implementare
generica a metodei.
De exemplu, putem defini o metoda care sa sorteze un sir de elemente. Algoritmul
pentru aceasta metoda este independent de tipul de obiecte care sunt sortate. Se poatedeci folosi un algoritm generic.
In Java programarea generica este implementata folosind conceptele de baza ale
mostenirii si interfetele.
-
7/22/2019 Curs07 Java
27/39
3/2/2014 27
Vom prezenta doua exemple care evidentiaza cum pot fi implementate metode si
clase generice folosind principiile de baza ale mostenirii.
1.Un prim exemplu este problema sortarii. Cum putem sorta un sir generic, care sa
nu depinda de tipul obiectelor supuse ordonarii?
Problema se poate rezolva cu ajutorul unei interfete in care este declarata o metodade comparare a doua obiecte, care are un parametru de tipul interfetei. In acest fel se
pot crea parametrii generici care functioneaza pentru orice clasa care ar folosi
aceasta interfata.
Exemplul urmator (programul Sort.java) prezinta o metoda de sortare generica
denumitasortareComp()care foloseste ca parametru un tablou de obiecte de tipCompara. Tipul Comparaeste definit de interfata Comparaprezentata deja in lectie.
/* Clasa generica pentru sortarea unor obiecte comparabile
*----------------------Metode publice-------------------
*void sortareComp - -> sorteaza un sir de obiecte de tip Compara
*/
package clasegenerice;public final class Sort
{
public static void sortareComp(Compara [] a)
{
Compara temp;
-
7/22/2019 Curs07 Java
28/39
3/2/2014 28
for (int i = 0; i
-
7/22/2019 Curs07 Java
29/39
3/2/201429
Secventa de cod de mai jos prezinta implementarea metodei comparaCu()in clasa
FormaGeosi conversia explicita la tipulFormaGeoa unui obiect de tip Compara:
public int comparaCu(Compara rhs) {
if (arie() < ((FormaGeo) rhs).arie())
return -1;
else
if (arie() == ((FormaGeo) rhs).arie())return 0;
else
return 1;
Exemplul urmator (TestFormaInterfata.java) arata cum poate fi folosita metoda
generica de sortare denumitasortareComp()pentru sortarea unui tablou de formegeometrice:
-
7/22/2019 Curs07 Java
30/39
3/2/201430
import java.io.* ;
import clasegenerice.*;
import formegeometrice.*;
class TestFormaInterfata
{private static BufferedReader in;
public static void main(String[] args) throws IOException
{
//Citeste numarul de figuri
in = new BufferedReader(new
InputStreamReader(System.in));System.out.print("Numarul de figuri: ");
int numForme = Integer.parseInt(
in.readLine());
//citeste formele
FormaGeo[] forme = new FormaGeo[numForme];
for (int i = 0; i < numForme; ++i)
{forme[i] = citesteForma();
}
//sortare si afisare
Sort.sortareComp(forme);
-
7/22/2019 Curs07 Java
31/39
3/2/201431
System.out.println("Sortarea dupa arie: ");
for (int i = 0; i < numForme; ++i)
{
System.out.println(forme[i]);
}
for (int i = 1; i < numForme; ++i){
if (forme[i-1].comparaCu(forme[i]) == -1)
System.out.println(forme[i-1] + " are o arie mai micadecat " + forme[i]);
else
System.out.println(forme[i-1] + " are o arie egala cu
sau mai mare ca " + forme[i]); }
}
//creaza un obiect adecvat de tip FormaGeo functie de
//datele de intrare.
//utilizatorul introduce 'c', 'p' sau 'd' pentru a indica
//forma, apoi introduce dimensiunile//in caz de eroare se intoarce un cerc de raza 0
private static FormaGeo citesteForma() throws IOException
{
double rad;
-
7/22/2019 Curs07 Java
32/39
3/2/201432
double lg;
double lat;
String s;
System.out.println("Introduceti tipul formei: ");
do {
s = in.readLine();} while (s.length() == 0);
switch (s.charAt(0)) {
case 'c':
System.out.println("Raza cercului: ");
rad = Integer.parseInt(in.readLine());
return new Cerc(rad);
case 'p':System.out.println("Latura patratului: ");
lg = Integer.parseInt(in.readLine());
return new Patrat(lg);
case 'd':
System.out.println("Lungimea si latimea "
+ " dreptunghiului pe linii separate: ");
lg = Integer.parseInt(in.readLine());
lat= Integer.parseInt(in.readLine());
return new Dreptunghi(lg, lat);
default:
System.err.println("Tastati c, p sau d: ");
return new Cerc(0); }}}
-
7/22/2019 Curs07 Java
33/39
3/2/201433
2.Un al doilea exemplu se refera la crearea unei clase generice folosind o superclasa
adecvata, cum ar fi Object. In java, daca o clasa nu extinde o alta clasa, atunci ea
extinde implicit clasa Object. Rezulta ca, fiecare clasa este o subclasa a lui Object.
De exemplu, structura de date abstracta stiva poate fi descrisa prin intermediul unei
interfete denumita Stiva. Clasa generica StivaArcare implementeaza aceasta interfata
defineste toate metodele specificate in interfata Stiva. Clasa StivaArfoloseste obiecte
de tip Object, deci poate sa stocheze orice fel de obiecte.
Interfata Stivadescrie functiile disponibile; clasa concreta StivaArtrebuie sa
defineasca aceste functii. Aceasta abordare, separarea interfetei de implementarea ei,
este o parte fundamentala a orientarii pe obiecte. Programatorul care foloseste, de
exemplu, structura de date stiva nu trebuie sa vada implementarea ei, ci doar
operatiile admisibile. Aceasta tine de partea de ascundere a informatiei din
programarea orientata pe obiecte.
De asemenea, folosirea interfetelor mai are si avantajul ca interfetele fiind fixate, oserie de inlocuiri facute in implementarile lor nu necesita practic nici o modificare in
programele care utilizeaza aceste interfete.
-
7/22/2019 Curs07 Java
34/39
3/2/201434
Sa ne reamintim ce este structura de date abstracta stiva.
O stiva este o structura de date in care accesul este permis doar pentru ultimul
element inserat.
Comportamentul unei stive este foarte asemanator cu cel al unei gramezi de farfurii.Ultima farfurie adaugata va fi plasata in varf fiind, in consecinta, usor de accesat, in
timp ce farfuriile puse cu mai mult timp in urma (aflate sub alte farfurii) vor fi mai
greu de accesat, putand periclita stabilitatea intregii gramezi.
Deci, stiva este adecvata in situatiile in care avem nevoie sa accesam doar elementul
din varf. Toate celelalte elemente sunt inaccesibile.Cele trei operatii care se pot face cu structura de date stiva sunt:
- inserare - denumita push;
- stergere - denumita pop;
- cautare - denumita top.
Interfata Java, pentru o structura de tip stiva, denumita Stiva, declara operatiile
permise pe stiva si este prezentata in continuare (programul Stiva.java).
-
7/22/2019 Curs07 Java
35/39
3/2/201435
/* Interfata pentru o stiva. Stiva expune metode pentru
* manipularea (adaugarea, stergerea, consultarea)
* elementului din varful ei*/
package clasegenerice;public interface Stiva {
public void push(Object x);
public void pop();
public Object top();
public Object topAndPop();
public boolean isEmpty();
public void makeEmpty();
public boolean isFull();
}
Nota:Interfata declara si metodele: topAndPop()care combina doua operatii,
consultare si extragere; isEmpty()care verifica daca stiva este goala; makeEmpty()
care goleste stiva; isFull()care verifica daca stiva este plina.
-
7/22/2019 Curs07 Java
36/39
3/2/201436
Clasa generica StivaArstocheaza elementele de tip Object (orice tip de obiecte) ale
stivei intr-un tablou unidimensional. Clasa StivaAr implementeaza interfata Stiva. Ea
foloseste un tablou unidimensional pentru a retine elementele din stiva. Mai exista si
alte modalitati de implementare a unei stive, cum ar fi listele inlantuite.
Codul sursa al clasei StivaAr(program StivaAr.java) se prezinta in continuare:
/* Implementarea unei stive folosind un tablou */
package clasegenerice;
public final class StivaAr implements Stiva
{
/* Tablou care retine elementele stivei*/
private Object[] elemStiva;/*Dimensiunea maxima a stivei*/
private static int dimMax;
/*Pozitia varfului stivei */
private int pozitieVarf;
/* Constructor care aloca memorie pentru elemStiva si
* initializeaza varful stivei */
public StivaAr(int e)
{
dimMax = e;
elemStiva = new Object[dimMax];
pozitieVarf = -1;
}
-
7/22/2019 Curs07 Java
37/39
3/2/201437
/* Incrementeaza indicele pozitieVarf si adauga elementul x in stiva.*/
public void push(Object x)
{
elemStiva[++pozitieVarf] = x;
}/* Extrage elementul din varful stivei si apoi decrementeaza indicele pozitieVarf. */
public void pop()
{
pozitieVarf--;
}
/* Returneaza elementul din varful stivei
* (ultimul adaugat).*/public Object top()
{
return elemStiva[pozitieVarf];
}
/* Returneaza elementul din varful stivei si
* il elimina apoi din stiva.*/public Object topAndPop()
{
return elemStiva[pozitieVarf--];
}
-
7/22/2019 Curs07 Java
38/39
3/2/2014 38
/* Verifica daca stiva e vida. */
public boolean isEmpty()
{
return (pozitieVarf == -1);
}/* Elimina toate elementele din stiva. */
public void makeEmpty()
{
pozitieVarf = -1;
}
/* Verifica daca stiva este plina */
public boolean isFull()
{
return (pozitieVarf == dimMax - 1);
}
}
Programul urmator (TestStiva.java) prezinta un exemplu de utilizare a structurii de
tip stiva in care se foloseste implementarea din clasa StivaAra interfetei Stiva. Acest
program afiseaza 10 numere naturale, stocate intr-un tablou, in ordine inversa
folosind structura de tip stiva.
/* Clasa de test simpla pentru o stiva care adauga 10 numere
-
7/22/2019 Curs07 Java
39/39
3/2/2014 39
/* Clasa de test simpla pentru o stiva, care adauga 10 numere
* dupa care le extrage in ordine inversa */
import clasegenerice.*;
public class TestStiva
{
public static void main(String[] args) {
Stiva s = new StivaAr(10);
//introducem elemente in stiva
for (int i = 0; i < 10; i++)
{
s.push(new Integer(i));
}
// Verificam daca stiva este plinaif (s.isFull())
System.out.println("Stiva este plina");
// Aflam elementul din varful stivei
int elemVarf = ((Integer) s.top()).intValue();
System.out.println("Elementul din varful stivei este:" +elemVarf);
//scoatem elementele din stiva si le afisamSystem.out.print("Continutul stivei este: ");
while (!s.isEmpty())
{System.out.print(s.topAndPop() + " ");}
}
}