Programare in Java Curs 4 Concepte fundamentale programarii













![public class Polimorfism { public static void main(String args[]) { Animal. De. Casa a public class Polimorfism { public static void main(String args[]) { Animal. De. Casa a](https://slidetodoc.com/presentation_image_h/0aa16c0b562c24b634d0d5a149fe1203/image-14.jpg)




















![Crearea si folosirea interfetelor Java Sintaxa de definire a unei interfete este urmatoarea: [<modificatori] Crearea si folosirea interfetelor Java Sintaxa de definire a unei interfete este urmatoarea: [<modificatori]](https://slidetodoc.com/presentation_image_h/0aa16c0b562c24b634d0d5a149fe1203/image-35.jpg)







- Slides: 42

Programare in Java - Curs 4 -


Concepte fundamentale programarii orientate obiect (OOP) in Java In Java un obiect este structura complexa caracterizata prin: - atributele (proprietatile/datele) sale; - un set de metode/operatii prin intermediul carora se poate manevra (accesa sau modifica) starea sa. - o instanta a obiectului(numele conjunctural al obiectului), descrisa de valorile pe care le ia la un moment dat atributele sale; 1. Conceptul de incapsulare Obiectul trebuie privit ca o entitate compacta la care utilizatorul nu are acces direct. Acest principiu al OOP este cunoscut sub numele de “ascunderea informatiei”. Acest principiu spune ca un obiect poate fi accesat numai prin intermediul metodelor care au fost furnizate impreuna cu obiectul. In legatura cu principiul “ascunderii informatiei”, programarea orientata obiect a introdus conceptul de incapsulare. Incapsularea inseamna gruparea datelor si a operatiilor asupra acestor date in acelasi intreg (agregat) avand grija sa se ascunda detaliile de implementare (proiectare-realizare) ale acestui intreg. 2/22/2021 3

2. Mostenirea este un alt concept fundamental al OOP. Mostenirea permite unei clase sa mosteneasca atributele si metodele unei alte clase existente. Prin mostenire, o clasa noua dobandeste imediat tot comportamentul unei clase existente. Aceasta clasa noua se numeste clasa derivata din clasa existenta. O clasa de obiecte derivata dintr-o alta clasa existenta pastreaza toate proprietatile si metodele acesteia din urma aducand, in plus, proprietati si metode noi. Prin mostenire, toate clasele sunt aranjate intr-o ierarhie stricta. De exemplu, intr-o ierarhie stricta sunt aranjate si clasele provenite din biblioteca de clase Java. In ierarhia de clase, clasa care mosteneste alta clasa este denumita subclasa, iar clasa care isi ofera mostenirea se numeste superclasa. Mostenirea da posibilitatea extinderii functionalitatii unui obiect. Cu alte cuvinte se pot crea noi clase de obiecte care sa extinda proprietatile si metodele clasei originale. 2/22/2021 4

3. Polimorfismul este al treilea concept fundamental in OOP. Polimorfismul reprezinta capacitatea unui obiect de a aparea sub diferite forme. In Java, polimorfismul se datoreaza conceptului de clase superclase si subclase si a intsntelor acestora. Mai precis inseamna ca o singura variabila referinta de tipul unei superclase poate fi apelata/folosita pentru a referi mai multe obiecte (instante) din clase derivate direct sau indirect din aceeasi superclasa, in diferite momente ale executiei unui program. Unele dintre proprietatile si metodele definite in superclasa pot fi redefinite (rescrise) in subclasele de obiecte derivate. Redefinirea proprietatilor si metodelor in subclasele derivate direct sau indirect dintr-o superclasa ne da, de fapt, o mare flexibilitate in constructia ierarhiei de clase pentru o problema de rezolvat, pentru ca nici o proprietate sau metoda definita intr-un punct al ierarhiei nu este impusa definitiv pentru clasele derivate din acest punct direct sau indirect. Conceptele fundamentale prezentate mai sus sunt folosite pentru a indeplini unul din principalele scopuri ale OOP si anume reutilizarea codului (refolosirea obiectelor sau refolosirea unor programe). 2/22/2021 5

Programul urmator (Afisare. Sub. Clasa. java) prezinta o clasa ce contine o metoda afisare. Date(), care afiseaza numele clasei si valorile variabilelor de instanta. De asemenea, in acelasi fisier-sursa este inclusa si clasa denumita Afisare. Sub. Clasa derivata din clasa Afisare. Clasa. A fost creat un obiect de tip Afisare. Sub. Clasa si a fost apelata metoda afisare. Date(). Deoarece clasa Afisare. Sub. Clasa nu defineste aceasta metoda, Java o cauta in superclasele clasei Afisare. Sub. Clasa, incepand cu superclasa Afisare. Clasa, unde gaseste metoda afisare. Date() si o executa. class Afisare. Clasa { int x = 0; int y = 1; void afisare. Date() { System. out. println("x este " + x + ", y este " + y); System. out. println("Sunt un obiect al clasei " + this. get. Class(). get. Name()); } } class Afisare. Sub. Clasa extends Afisare. Clasa { int z = 3; public static void main(String [] args) { Afisare. Sub. Clasa ob = new Afisare. Sub. Clasa(); ob. afisare. Date(); } } 2/22/2021 6

Rezultatul programului este: x este 0, y este 1 Sunt un obiect al clasei Afisare. Sub. Clasa Deoarece metoda afisare. Date() a superclasei Afisare. Clasa nu afiseaza si variabila de instanta z specifica subclasei Afisare. Sub. Clasa, metoda afisare. Date() va fi redefinita (suprascrisa) in interiorul subclasei. Iata noul program (Afisare. Sub. Clasa. java): class Afisare. Clasa { int x = 0; int y = 1; void afisare. Date() { System. out. println("x este " + x + ", y este " + y); System. out. println("Sunt un obiect al clasei " + this. get. Class(). get. Name()); } } class Afisare. Sub. Clasa extends Afisare. Clasa { int z = 3; void afisare. Date() { System. out. println("x este " + x + ", y este " + y + ", z este " + z); System. out. println("Sunt un obiect al clasei " + this. get. Class(). get. Name()); } public static void main(String [] args) { Afisare. Sub. Clasa ob = new Afisare. Sub. Clasa(); ob. afisare. Date(); } } 2/22/2021 7

Rezultatul programului este: x este 0, y este 1, z este 3 Sunt un obiect al clasei Afisare. Sub. Clasa Nota: Apelul de metoda: this. get. Class(). get. Name()); este folosit pentru aflarea numelui clasei din care face parte un obiect, in cazul de fata obiectul curent. Redefinirea partiala a unei metode Redefinirea partiala inseamna ca metoda din clasa derivata nu redefineste complet metoda cu aceeasi semnatura din superclasa, ci extinde operatiile pe care aceasta le realizeaza. Cu alte cuvinte, metoda din clasa derivata face ceva in plus fata de cea originala din superclasa. Pentru a apela metoda din superclasa in interiorul metodei din clasa derivata se foloseste referinta super. 2/22/2021 8

Urmatorul program (Afisare. Sub. Clasa 1. java) ilustreaza modul de redefinire partiala a metodei afisare. Date() din subclasa Afisare. Sub. Clasa 1 si apelul in cadrul acesteia a metodei afisare. Date() din superclasa Afisare. Clasa. class Afisare. Clasa { int x = 0; int y = 1; void afisare. Date() { System. out. println("Sunt un obiect al clasei " + this. get. Class(). get. Name()); System. out. println("x este " + x); System. out. println("y este " + y); } } class Afisare. Sub. Clasa 1 extends Afisare. Clasa { int z = 3; void afisare. Date() { super. afisare. Date(); System. out. println("z este " + z); } public static void main(String [] args) { Afisare. Sub. Clasa 1 ob = new Afisare. Sub. Clasa 1(); ob. afisare. Date(); } } 2/22/2021 9

In Java, Polimorfismul inseamna ca o singura variabila referinta x de tipul unei superclase poate fi folosita pentru a construi diferite obiecte (instante) ale claselor derivate, direct sau indirect din acea superclasa, in momente diferite ale executiei unui program. Cand variabila referinta x este folosita pentru a apela o metoda a unui obiect apartinand unei clase derivate, metoda adecvata care va fi selectata depinde de tipul obiectului pe care variabila referinta x il indica in acel moment. Se spune ca variabila referinta este polimorfica. De exemplu, sa presupunem ca s-au definit clasele: Animal. De. Casa, Pisica, Caine. Se doreste sa se afiseze la ecran (programul Polimorfism. java) caracteristicile principale claselor Pisica si Caine, atunci cand instantele lor sunt infometate. 2/22/2021 10

class Animal. De. Casa { private boolean stare. Suparare; public boolean flamand; protected void hranesc() { System. out. println("Nu se cunoaste"); } public void caracteristici() { System. out. println("Caracteristici necunoscute"); } public boolean get. Stare() { return stare. Suparare; } public void set. Stare(boolean stare) { stare. Suparare = stare; } } 2/22/2021 11

class Pisica extends Animal. De. Casa { public void caracteristici() { String stare. Pisica; if (get. Stare() == true) stare. Pisica = "miauna"; else stare. Pisica = "nu miauna"; if (flamand == true) System. out. println("Pisica " + stare. Pisica + ". Este flamanda. "); else System. out. println("Pisica " + stare. Pisica + ". Este satula. "); } public void hranesc() { if (flamand==true) {System. out. println("Pisica mananca lapte. "); flamand = false; set. Stare(false); } else System. out. println("Pisica a mancat deja. "); } } 2/22/2021 12

class Caine extends Animal. De. Casa { public void caracteristici() { String stare. Caine; if (get. Stare() == true) stare. Caine = "latra"; else stare. Caine = "nu latra"; if (flamand == true) System. out. println("Cainele " + stare. Caine + ". Este flamand. "); else System. out. println("Cainele " + stare. Caine + ". Este satul. "); } public void hranesc() { if (flamand==true) {System. out. println("Cainele mananca oase. "); flamand = false; set. Stare(false); } else System. out. println("Cainele a mancat deja. "); } } 2/22/2021 13
![public class Polimorfism public static void mainString args Animal De Casa a public class Polimorfism { public static void main(String args[]) { Animal. De. Casa a](https://slidetodoc.com/presentation_image_h/0aa16c0b562c24b634d0d5a149fe1203/image-14.jpg)
public class Polimorfism { public static void main(String args[]) { Animal. De. Casa a = new Pisica(); a. flamand = true; a. set. Stare(true); System. out. println("Caracteristicile primului animal de casa: "); a. caracteristici(); a. hranesc(); a. caracteristici(); a = new Caine(); a. flamand = true; a. set. Stare(true); System. out. println("Caracteristicile celui de al doilea animal de casa: "); a. caracteristici(); a. hranesc(); a. caracteristici(); } } 2/22/2021 14

Ceeace este specific acestui program este ca el contine trei metode cu numele caracteristici() care au aceeasi semnatura (nume, tip valoare returnata si numar si tip parametrii) si trei metode cu numele hranesc() care au, de asemenea, aceeasi semnatura. Dar, aceste metode se afla in clase diferite si anume, intr-o superclasa numita Animal. De. Casa si in doua clase derivate numite Pisica si Caine care extind clasa Animal. De. Casa. Spunem ca metodele caracteristici() si hranesc() din clasele derivate redefinesc (override) metodea caracteristici() si, respectiv, hranesc() din superclasa. Sa analizam acum instructiunea urmatoare: Animal. De. Casa a = new Pisica(); Variabila referinta a care este de tipul Animal. De. Casa desemneaza un obiect de tipul Pisica, care ESTE-UN Animal. De. Casa prin mostenire. Sa analizam si instructiunea: a = new Caine(); Variabila a refera (la momente diferite de timp) obiecte de tipuri diferite, dar similare (adica derivate din aceeasi superclasa: Animal. De. Casa). 2/22/2021 15

Pe baza celor prezentate mai sus, programul va afisa urmatoarele rezultate: Caracteristicile primului animal de casa: Pisica miauna. Este flamanda. Pisica mananca lapte. Pisica nu miauna. Este satula. Pisica a mancat deja. Pisica nu miauna. Este satula. Caracteristicile celui de al doilea animal de casa: Cainele latra. Este flamand. Cainele mananca oase. Cainele nu latra. Este satul. Dupa cum se poate observa, apelurile metodelor caracteristici() si hranesc(), prin intermediul referintei a, au determinat apelarea metodelor corespunzatoare din clasa Pisica si Caine (si prin urmare doua afisari diferite), deoarece la momentul fiecarui apel, variabila a refera un obiect de tip diferit (dar, apartinand unei clase derivate din superclasa). Trebuie de remarcat ca, inversarea rolurilor celor doua clase nu este posibila, adica: Pisica p = new Animal. De. Casa(); este incorecta (deoarece un animal nu este in mod obligatoriu o pisica). 2/22/2021 16

In concluzie: - pe de o parte, mostenirea permite tratarea unui obiect ca fiind de tipul propriu sau de tipul de baza (din care este derivat tipul propriu). Aceasta caracteristica permite mai multor tipuri (derivate din acelasi tip de baza) sa fie tratate ca si cum ar fi un singur tip, ceea ce face ca aceeasi secventa de cod sa fie folosita de catre toate aceste tipuri. In cazul din exemplul prezentat, clasa Pisica si clasa Caine au doua atribute (stare. Suparare si flamand) si doua metode set. Stare() si get. Stare() mostenite de la superclasa Animal. De. Casa din care deriva. - pe de alta parte, polimorfismul permite unui tip de obiect sa exprime distinctia fata de un alt tip de obiect similar, atata timp cat amandoua sunt derivate din aceeasi superclasa. Distinctia este exprimata prin redefinirea (suprascrierea) metodelor care pot fi apelate prin intermediul unei variabile-referinta de tipul superclasei (in exemplul nostru este vorba despre metodele caracteristici() si hranesc()). 2/22/2021 17

Accesul la metodele din superclasa si redefinirea metodelor in clasele derivate Atunci cand se creaza o clasa derivata si se redefineste (suprascrie) o metoda declarata intr-o superclasa, trebuie sa se ia in considerare tipul de acces dat pentru metoda originala. Astfel, in cazul metodelor mostenite, pentru care se doreste redefinirea (suprascrierea) in clasa derivata se impun urmatoarele reguli: - metodele de tip public dintr-o superclasa trebuie sa fie, de asemenea, de tip public in toate clasele derivate; ele nu pot fi redefinite de tip private in clasele derivate; - metodele de tip protected dintr-o superclasa pot fi de tip protected sau de tip public in clasele derivate; ele nu pot fi redefinite de tip private in clasele derivate; - metodele de tip private dintr-o superclasa nu pot fi redefinite (suprascrise) in clasele derivate. 2/22/2021 18

Crearea claselor de obiecte Structura unei clase (obiect) este formata din : - atribute (campuri, date); - metode (functii). Metodele pot actiona asupra atributelor si pot apela alte metode. Definirea claselor de obiecte O clasa este definita prin cuvantul cheie class urmat de numele clasei. Sintaxa folosita este: [<modificatori_acces>] [<modificatori_clasa>] class <nume_clasa> [<clauze_s>] { <corpul_clasei> } unde: - <modificatori_acces> - specifica domeniul de vizibilitate (folosire sau acces) al clasei; modificatorul de acces este optional si poate fi: public; - <modificatori_clasa> - specifica tipul clasei definite; modificatorul clasei este optional si poate fi: abstract, final;

- <nume_clasa> - specifica numele clasei de obiecte; este de preferat ca numele clasei sa inceapa cu o litera majuscula si daca numele clasei contine in interior mai multe cuvinte, aceste cuvinte sa inceapa cu o litera majuscula; - <clauze_s> - specifica anumite clauze referitoare la pozitia pe care o ocupa clasa in ierarhia de clase din care face parte (clauza extends) sau daca aceasta clasa foloseste o interfata (clauza implements); -<corpul_clasei> - variabilele clasei (de instana si de clasa) si metodele care lucreaza cu acestea, numite la un loc membrii clasei. Modificatorii de acces In cazul in care declaram o clasa de obiecte ca fiind publica, atunci aceasta clasa poate fi folosita (accesata) si din exteriorul pachetului din care face parte. Daca o clasa nu este declarata ca fiind de tip public atunci ea va putea fi folosita (accesata) doar de clasele din cadrul aceluiasi pachet. Acest tip de acces la o clasa se numeste package-friendly si este implicit in Java. Nota: Toate clasele care nu fac parte din nici un pachet, sunt considerate automat ca facand parte din acelasi pachet implicit. Ca o consecinta, accesul de tip friendly se aplica pentru toate aceste clase. Acesta este motivul pentru care vizibilitatea nu este afectata daca se omite modificatorul public pentru clasele care nu fac parte dintr-un pachet.

Modificatorii pentru tipurile de clasa O clasa poate fi: - abstracta, caz in care folosim modificatorul abstract; - finala, caz in care folosim modificatorul final. In cazul in care declaram o clasa de obiecte ca fiind abstracta, compilatorul va interzice instantierea acestei clase, adica nu se permite crearea de obiecte din aceasta clasa. In cazul in care declaram o clasa de obiecte ca fiind finala, compilatorul va interzice ca pornind de la aceasta clasa sa se defineasca subclase. Nota: In cazul in care se declara, in acelasi timp, o clasa de obiecte ca fiind abstracta si finala, eroarea va fi semnalata la compilare, pentru ca cei doi modificatori se exclud.

Datorita relatiilor de mostenire clasele de obiecte sunt organizate intr-o ierarhie bine precizata. In cadrul ierarhiei claselor de obiecte, operatia de definire a unei noi clase de obiecte pe baza uneia deja existente se numeste derivare. Clasa originala (mai generala) se va numi superclasa a noii clase, iar noua clasa de obiecte se va numi subclasa a clasei din care deriva. Uneori, in loc de derivare se foloseste termenul de extindere. Termenul vine de la faptul ca o subclasa isi extinde superclasa cu noi variabile si metode. De exemplu, putem extinde clasa Copac la Brad, respectiv Molid, etc. Observatie importanta: Un alt tip de relatie intre obiecte este relatia ARE-UN sau ESTE-COMPUS-DIN. De exemplu, Bradul ARE-UN ornament. Aceasta relatie nu este o relatie de mostenire, ci este de agregare. Componentele care pot fi agregate devin simple campuri (atribute) de tip private ale clasei nou create. 2/22/2021 22

Intr-o ierarhie de clase, o clasa poate avea o singura superclasa, insa poate avea un numar nelimitat de subclase. Subclasele mostenesc toate atributele si metodele superclasei lor, care la randul ei mosteneste toate atributele si metodele de la superclasa ei si asa mai departe, urcand in ierarhie. Rezulta ca o clasa nou creata contine toate atributele si metodele claselor aflate deasupra sa in ierarhie, si in plus contine propriile atribute si metode. Figura de mai jos prezinta o ierarhie de clase. Clasa A Clasa B Clasa C Clasa D Clasa E Clasa A este superclasa a clasei B. Clasa B este subclasa a clasei A. Clasa B este superclasa pentru clasele C, D si E. Clasele C, D si E sunt subclase ale clasei B. 2/22/2021 23

In varful ierarhiei de clase Java se afla clasa Object, iar toate clasele de obiecte, care se creaza, sunt derivate din aceasta unica superclasa. Object reprezinta clasa initiala, sa-i spunem clasa de obiecte generice, care defineste atributele si comportamentul (metodele) mostenite de toate clasele din biblioteca de clase Java. In varful ierarhiei se definesc concepte (clase) abstracte, foarte generale. Aceste concepte generale devin din ce mai concrete, mai particularizate, o data cu “coborarea” spre subclasele de pe nivelele de mai jos in ierarhie. Cand clasa nou creata defineste un comportament complet nou si nu este o subclasa a unei alte clase, atunci ea mosteneste direct clasa Object. Astfel, noua clasa se integreaza corect in ierarhia claselor Java. De asemenea, daca se defineste o clasa care nu specifica o superclasa, Java presupune ca noua clasa mosteneste direct clasa Object. Clasele definite in exemplele de pana acum au mostenit direct clasa Object. 2/22/2021 24

De exemplu, se poate construi o ierarhie Om care deriva direct din clasa generica Object si are doua clase derivate: clasa barbatilor (Barbat) si clasa femeilor (Femeie). Obiect (Object) Om Barbat Femeie Daca la nivelul clasei de obiecte Om am definit forma bipeda a acestuia si capacitatea de a vorbi si de a intelege, toate aceste caracteristici vor fi mostenite si de clasele derivate din clasa Om, si anume clasa barbatilor si cea a femeilor. Fiecare din aceste clase de obiecte derivate isi vor defini propriile lor proprietati si operatii pentru a descrie diferenta dintre ele si clasa originala. 2/22/2021 25

Caracteristicile unei ierarhi de clase Organizarea unei aplicatii informatice intr-o ierarhie de clase presupune o planificare atenta. Proiectarea arborelui de clase de obiecte necesare rezolvarii unei anumite probleme este un talent pe care fiecare programator trebuie sa si-l descopere si sa si-l cultive cu atentie. De alegerea claselor si de proiectarea arborelui acestor clase depinde eficienta si flexibilitatea aplicatiei. Principalele caracteristici ale unei ierarhie de clase sunt: - atributele si metodele comune mai multor clase pot fi definite in superclase, care permit folosirea repetata a acestora pentru toate clasele aflate pe nivelele mai joase din ierarhie; - modificarile efectuate in superclasa se reflecta automat in toate subclasele ei, subclasele acestora si asa mai departe; nu trebuie modificat si recompilat nimic in clasele aflate pe nivelurile inferioare, deoarece acestea primesc noile informatii prin mostenire; 2/22/2021 26

- clasa derivata poate sa adauge noi atribute si metode si poate modifica semnificatia metodelor mostenite; - superclasa nu este afectata in nici un fel de modificarile aduse in clasele derivate; - o clasa derivata este compatibila ca tip cu superclasa, ceea ce inseamna ca o variabila referinta de tipul superclasei poate referi un obiect al clasei derivate, dar nu si invers; clasele derivate dintr-o superclasa nu sunt compatibile ca tip. Mostenirea simpla si multipla Forma de mostenire folosita in Java este denumita mostenire simpla (single inheritance), deoarece fiecare clasa de obiecte Java nou creata poate fi derivata dintr-o singura superclasa (poate avea o singura superclasa). Mostenirea multipla inseamna ca o clasa nou creata pot fi derivata din doua sau mai multe superclase, mostenind variabilele si metodele combinate din toate aceste superclase. Mostenire multipla (multiple inferitance) ofera mijloace de creare a unor clase care cuprind aproape orice comportament imaginabil. Acest lucru complica semnificativ definitia clasei si a codului necesar acesteia. 2/22/2021 27

Mostenirea simpla poate fi restrictiva, mai ales atunci cand exista un comportament similar, care trebuie duplicat pe diferite “ramuri” ale ierarhiei de clase (nu pe aceeasi ramura a ierarhiei). De exemplu, omul poate fi privit ca un mamifer care naste pui vii sau poate fi privit ca un obiect spatio-temporal care propria lui forma si pozitie in functie de timp. Aceasta inseamna ca trebuie sa dam definitii de metode despre ce inseamna faptul ca un obiect poate fi privit ca un mamifer sau ca un obiect spatio-temporal. Dar, aceste definitii de metode sunt comune nu numai clasei de obiecte Om dar si altor clase de obiecte derivate sau nu din clasa Om, superclase sau nu ale clasei Om. Putem sa gasim o multime de clase de obiecte ale caror instane pot fi privite ca obiecte spatio-temporale dar care sa nu aiba mare lucu in comun cu omul (de exemplu clasa Minge). Pentru rezolvarea problemei mostenirii multiple, Java foloseste interfetele. Declaratiile de metode si atribute comune mai multor clase de obiecte care nu sunt mostenite de la superclasele lor poarta denumirea de interfeta. 2/22/2021 28

Sintaxa folosita pentru a deriva o clasa noua dintr-o superclasa O clasa derivata (numita si subclasa) mosteneste toate atributele (variabilele de instanta si de clasa) superclasei din care provine. Clasa derivata poate apoi sa adauge noi atribute, sa redefineasca metode ale superclasei sau sa adauge noi metode. Fiecare clasa derivata este o clasa complet noua. Pentru a declara o clasa derivata se foloseste clauza extends, astfel: [<modificatori_acces>] [<modificatori_clasa>] class <nume_subclasa> extends <nume_superclasa> { <corpul_clasei> } unde: - <modificatori_acces> - specifica domeniul de vizibilitate (folosire sau acces) al subclasei; modificatorul de acces poate fi: public; - <modificatori_clasa> - specifica tipul subclasei definite; modificatorul clasei poate fi: abstract, final; - <nume_subclasa> - specifica numele clasei derivate dintr-o superclasa; 2/22/2021 29

- <nume_superclasa> - specifica numele unei superclase din care deriva subclasa; - <corpul_clasei> - variabilele clasei si metodele care lucreaza cu acestea, adaugate sau redefinite in subclasa. Observatii: 1. Orice metoda neprivata (adica publica, protejata sau prietenoasa) din superclasa, care nu este redefinita (suprascrisa) in clasa derivata, este mostenita nemodificat, cu exceptia constructorilor. Metoda poate fi apoi apelata ca si cum ar face parte din clasa derivata. 2. Clasa derivata contine atribute si metode suplimentare (fata de cele mostenite din superclasa) care pot fi declarate: private, protected, public sau fara modificator de acces. 2/22/2021 30

Controlul accesului si mostenirea Ca regula generala, toti membrii de tip public ai superclasei devin membrii de tip public ai clasei derivate. De asemenea, membrii de tip private ai superclasei sunt mosteniti, dar acestia nu sunt accesibili in mod direct (adica, folosind operatorul “punct” sau direct numele membrului) in clasa derivata, ci prin intermediul altor metode publice mostenite de la superclasa care fac posibil accesul. Metodele speciale care examineaza si modifica valoarea fiecarui atribut de tip private sunt denumite “accesori” si, respectiv, “modificatori”. Se foloseste conventia ca numele metodelor “accesor” sa inceapa cu get. De asemenea, se foloseste conventia ca numele metodelor “modificator” sa inceapa cu set Folosirea metodelor “accesori” si “modificatori” este foarte raspandita in programarea orientata obiect. Acest mod de abordare mareste gradul de reutilizare a codului, evitand folosirea lui necorespunzatoare. 2/22/2021 31

Metode-constructor pentru clase derivate si cuvantul-cheie super Metodele-constructor nu se mostenesc. Fiecare clasa derivata trebuie sa isi defineasca propriile metode-constructor. Daca nu se defineste nici un constructor, Java va genera un constructor implicit (fara parametri). Acest constructor implicit al clasei derivate: - va apela automat constructorul implicit (fara parametrii) al superclasei (aflata pe nivelul imediat superior) pentru membrii care au fost mosteniti, apoi - va aplica initializarea implicita pentru atributele adaugate in clasa derivata (adica 0/false pentru tipurile primitive numerice/booleene si null pentru tipurile referinta). Asadar, construirea unui obiect al unei clase derivate are loc prin construirea prealabila a portiunii mostenite (constructorul clasei derivate apeleaza automat constructorul superclasei aflata pe nivelul imediat superior). Acest lucu este normal, deoarece mecanismul incapsularii afirma ca partea mostenita este un “intreg”, iar constructorul superclasei ne spune cum sa initializam acest “intreg”. Metodele-constructor ale superclasei pot fi apelate explicit in clasa derivata prin metoda super(). Metoda super poate sa apara doar in prima linie dintr-o metoda-constructor. 2/22/2021 32

Apelul unei metode-constructor a superclasei dintr-o clasa derivata, folosind super se face astfel: super(<arg 1>, <arg 2>, <arg 3>, …) unde: - <arg 1>, <arg 2>, <arg 3>, … - specifica parametrii metodei-constructor a superclasei. De exemplu, sa presupunem ca o superclasa (Clasa. Super) are un constructor cu doi parametri de tip int. Constructorul clasei derivate va avea, in general, forma: public class Clasa. Derivata extends Clasa. Super { public Clasa. Derivata(int x, int y); { super(x, y); // alte instructiuni } … } Observatie: Daca in superclasa este definit explicit cel putin un constructor, atunci trebuie apelat explicit (prin super) constructorul superclasei respective 2/22/2021 33 din interiorul constructorului clasei derivate. Altfel se obtine eroare de

Mostenire multipla. Interfata In cazul mostenirii multiple o clasa este derivata din doua sau mai multe superclase. De exemplu, pot exista in ierarhie clase precum Student si Angajat. Din aceste doua clase ar putea fi derivata o clasa cu numele Angajat. Student care sa contina atribute si metode combinate din clasele Student si Angajat. 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 Java este cea mai abstracta clasa posibila. Ea consta doar din metode 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 2/22/2021 interfata se comporta ca si cand ar fi extins o clasa abstracta specificata de 34
![Crearea si folosirea interfetelor Java Sintaxa de definire a unei interfete este urmatoarea modificatori Crearea si folosirea interfetelor Java Sintaxa de definire a unei interfete este urmatoarea: [<modificatori]](https://slidetodoc.com/presentation_image_h/0aa16c0b562c24b634d0d5a149fe1203/image-35.jpg)
Crearea si folosirea interfetelor Java Sintaxa de definire a unei interfete este urmatoarea: [<modificatori] interface <nume_interfata> [extends <nume_interfata 1> [, <nume_interfata 2>][, <nume_interfata 3>], …]] { <corpul interfetei> } unde: - <modificatori> - sunt specificati prin cuvintele-cheie public si abstract; o interfata publica poate fi accesata si de alte pachete decat cel care a definito; fiecare interfata este in mod implicit abstracta deci cuvantul-cheie abstract poate lipsi; - <nume_interfata> - specifica numele interfetei; este de preferat ca numele interfetei sa respecte aceeasi conventie de numire ca si cea de numire a claselor; - <nume_interfata 1>, <nume_interfata 2>, . . - specifica numele superinterfetelor din care poate deriva interfata; - <corpul_clasei> - contine declaratii de variabile si declaratii de metode (numai antetul acestora). 2/22/2021 35

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 doua interfete. Interfetele trebuie sa posede o protectie de pachet sau publica. Interfetele care nu contin modificatorul public nu-si vor converti automat metodele la accesul public si abstract si nici constantele la accesul public. 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 package in prima linie din fisierul-sursa. De asemenea, interfetele pot importa interfete sau clase din alte pachete. 2/22/2021 36

interface W Extinderea interfetelor { char c='a‘; } interface X extends W { int c=1; void met(); } interface Y ******* { boolean c=true; } ++++++ interface Z extends X, Y -88 a 1 99 { int c=99; void met(); } class C implements X { public void met() { System. out. println("*******"); } } class D implements Z { public void met() { System. out. println("++++++"); } } class interfete implements Z { public void met() { } public static void main (String[] s) { C OB 1 = new C(); OB 1. met(); D OB 2 = new D(); OB 2. met(); int c = -88; System. out. println(c+" "+W. c+" "+X. c+" "+Z. c); } } 2/22/2021 37

Implementarea interfetelor interface A { int x=1; void scrie(); } interface B { int x=2; void scrie(); } class C { int x=3; public void scrie() { System. out. println(A. x+ " "+B. x+" "+x); } } class D extends C implements A, B run: { int x=4; } 1 2 3 class interfete 4 { public static void main (String[] w) 1 2 3 { D Ob = new D(); 1 Ob. scrie(); BUILD SUCCESSFUL (total time: 1 second) System. out. println(" "+Ob. x); A Ob 1 = new D(); Ob 1. scrie(); System. out. println(" "+Ob 1. x); } } 2/22/2021 38

Initializarea interfetelor interface X { int x=1; xx =Init. Interfata. out("xx", 2); } interface Y extends X { int y =Init. Interfata. out("y", 3); int yy =Init. Interfata. out("yy", 2); interface Z extends Y { int z=Init. Interfata. out("z", 5); int zz =Init. Interfata. out("zz", 6); class Init. Interfata { public static void main (String[] l) { System. out. println(Y. x+" + "); System. out. println(Z. z+" * "); } static int out(String s, int i) { System. out. println(s +" = "+i); return i; } } 1+ z=5 zz = 6 5* } } 2/22/2021 39

Mostenire multipla prin interfete interface X { void x 1(); int x 2(); } class CX implements X { public void x 1() {System. out. println(" x 1 "); } public int x 2() x 1 {return 1; } } +1 class C implements X { X Ob. X= new CX(); public void x 1() {Ob. X. x 1(); } public int x 2() {return Ob. X. x 2(); } } class Mostenire. Multipla { public static void main (String[] s) { C Ob. C = new C(); Ob. C. x 1(); System. out. println(" + "+Ob. C. x 2()); } } 2/22/2021 40

Metode si clase finale Metodele finale sunt acele metode care nu pot fi redefinite niciodata intr-o subclasa. Acestea sunt declarate folosind modificatorul final. Metode finale sunt folosite pentru a mari viteza de executie a aplicatiei care le foloseste. In mod normal, atunci cand interpretorul Java apeleaza o metoda, el cauta metoda mai intai in clasa curenta, dupa aceea in superclasa si “urca” mai departe in ierarhie pana ce gaseste definitia acesteia. Prin acest proces se pierde din viteza in favoarea flexibilitatii si a usurintei in dezvoltare. In cazul metodelor finale legarea este statica, la compilare, si nu in timpul executiei aplicatiei. Astfel, compilatorul Java poate introduce codul executabil (bytecode-ul) al metodei in locul instructiunii de apel a acesteia in cadrul programelor care o apeleaza. Nota: Metodele cu acces de tip private sunt implicit si de tip final, deoarece ele nu pot fi suprascrise in nici o situatie. Clasele finale sunt acele clase din care nu se pot deriva subclase. Acestea sunt declarate folosind modificatorul final. Clasele finale sunt folosite pentru a mari viteza de executie a aplicatiei care le foloseste.

Tema 1. Rulati toate aplicatiile din curs 2. Pentru fiecare aplicatie , construiti inca 2 similare, cu alte variabile si evolutii. 3. Tema scrisa va contine explicatia programului si codul sursa. Codurile sursa si fisierele class le veti trimite prin e-mail