45
05/21/22 1 Cuvinte importante: - concepte fundamentale ale programarii orientate obiect in Java: incapsulare, mostenire, polimorfism; - crearea claselor de obiecte: definirea claselor; modificatorii pentru tipurile de clasa; modificatorii de acces; - variabilele (campurile) clasei de obiecte: declararea variabilelor de instanta; declararea variabilelor de clasa; declararea constantelor; - domeniul de vizibilitate (acces) al variabilelor folosite in clasele de obiecte: domeniul de vizibilitate al variabilelor locale; domeniul de vizibilitate al variabilelor clasei; modificatorii de acces (vizibilitate); - metodele unei clase de obiecte: definirea si apelul metodelor; modificatorii de metoda; - metode de instanta si metode de clasa; - domeniul de vizibilitate (acces) al metodelor unei clase: modificatori de acces;

cursuri java

Embed Size (px)

DESCRIPTION

cursuri java

Citation preview

Page 1: cursuri java

04/17/23 1

Cuvinte importante:- concepte fundamentale ale programarii orientate obiect in Java:

incapsulare, mostenire, polimorfism;- crearea claselor de obiecte: definirea claselor; modificatorii

pentru tipurile de clasa; modificatorii de acces;- variabilele (campurile) clasei de obiecte: declararea variabilelor

de instanta; declararea variabilelor de clasa; declararea constantelor;- domeniul de vizibilitate (acces) al variabilelor folosite in

clasele de obiecte: domeniul de vizibilitate al variabilelor locale; domeniul de vizibilitate al variabilelor clasei; modificatorii de acces (vizibilitate);

- metodele unei clase de obiecte: definirea si apelul metodelor; modificatorii de metoda;

- metode de instanta si metode de clasa;- domeniul de vizibilitate (acces) al metodelor unei clase:

modificatori de acces; referinta this;- metode constructor: caracteristici, supraincarcarea metodelor

constructor; cuvantul-cheie this pentru constructori;- initializatori statici.

Page 2: cursuri java

04/17/23 2

Concepte fundamentale ale programarii orientate obiect (OOP) in Java

In Java un obiect este o variabila complexa care se caracterizeaza prin:

- o structura, descrisa de atributele (proprietatile) sale;

- o stare, descrisa de valorile pe care le ia la un moment dat atributele sale;

- un set de operatii prin intermediul carora se poate manevra (accesa sau modifica) starea sa.

1. Conceptul de incapsulare

Obiectul trebuie privit ca o unitate atomica la care utilizatorul nu ar trebui sa aiba 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 “ascundrii 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. Deci, datele sunt “ascunse”, iar accesul la aceste date se realizeaza numai prin intermediul metodelor incapsulate cu ele.

Page 3: cursuri java

04/17/23 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.

Vom reveni asupra mecanismului de mostenire intr-o lectie viitoare.

Page 4: cursuri java

04/17/23 4

3. Polimorfismul este al treilea concept fundamental in OOP.

Polimorfismul reprezinta capacitatea unui obiect de a aparea sub diferite forme. De exemplu, in lumea reala, apa apare sub forma solida, sub forma lichida sau sub forma gazoasa.

In Java, polimorfismul inseamna ca o singura variabila referinta de tipul unei superclase poate fi 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.

Vom reveni asupra mecanismului de polimorfism intr-o lectie viitoare.

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).

Page 5: cursuri java

04/17/23 5

Crearea claselor de obiecte

O clasa contine membri care pot fi:

- 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;

Page 6: cursuri java

04/17/23 6

- <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 inplements); despre aceste clauze vom vorbi intr-o lectie viitoare.

- <corpul_clasei> - variabilele clasei (de instana si de clasa) si metodele care lucreaza cu acestea, numite la un loc membrii clasei.

Observatie: Continutul (corpul) unei clase nu este o succesiune de instructiuni.

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. Vom reveni intr-o lectie viitoare.

Page 7: cursuri java

04/17/23 7

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. Vom reveni intr-o lectie viitoare.

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.

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. Totusi, aceasta modalitate de folosire a accesului de tip friendly nu este recomandata.

Page 8: cursuri java

04/17/23 8

Variabilele (campurile) clasei de obiecte

Declararea variabilelor de instanta

O variabila este considerata ca variabila de instanta daca este declarata in afara metodelor clasei respective, insa valorile variabilelor de instanta se stocheaza individual in instantele (obiectele) clasei. Rezulta ca, acestea pot lua valori diferite (se pot modifica) pentru fiecare obiect al clasei respective.

Toate variabilele de instanta se declara imediat dupa prima linie a definitiei clasei (si dupa acolada deschisa { ).

De exemplu:

class Copil{

String culoare_piele;String sex;boolean flamand;

}

Clasa Copil contine trei variabile. Deoarece aceste variabile sunt declarate in afara oricarei metode, ele sunt variabile (campuri) de instanta.

Page 9: cursuri java

04/17/23 9

Declararea variabilelor de clasa

O variabila este considerata ca variabila de clasa daca este declarata in afara metodelor clasei folosind modificatorul static. Valoarea variabilei de clasa ramane aceeasi pentru toata clasa in ansamblul ei. Rezulta ca, variabila de clasa are o singura valoare comuna tuturor instantelor clasei in care este declarata.

Modificarea valorii variabilei de clasa din interiorul unui obiect face ca modificarea sa se reflecte in toate celelalte instante ale clasei existente in acel moment al executiei programului.

Variabilele de clasa sunt folosite la comunicarea intre diferite obiecte ale aceleiasi clase sau pentru pastrarea unor date comune la nivelul intregii clase.

Variabilele statice sunt initializate la incarcarea codului specific unei clase si exista chiar si daca nu exista nici o instanta a clasei respective.

De exemplu:

static int maxObiecte = 10;

O variabila statica poate fi accesata fie conform regulii generale prin crearea si utilizarea unei instante a clasei din care provine (si precalificarea variabilei cu numele instantei), fie direct, prin precalificarea variabilei cu numele clasei.

Page 10: cursuri java

04/17/23 10

Referirea (accesul) la variabilele de instanta si de clasa

Accesarea unei variabile de instanta sau de clasa se realizeaza in mai multe moduri:

- prin crearea si utilizarea unei instante a clasei in care a fost declarata variabila sau a unei subclase a clasei respective (ca regula generala); in acest caz se foloseste operatorul punct ( . ), in stinga acestuia punandu-se numele instantei, iar in dreapa acestuia punandu-se numele variabilei;

- prin simpla folosire a numelui sau, in cazul in care clasa in care este accesata variabila este aceeasi cu clasa in care a fost declarata;

- prin folosirea operatorului punct ( . ), in stanga acestuia punandu-se numele clasei in care a fost declarata, iar in dreapta acestuia punandu-se numele variabilei; aceasta modalitate este folosita numai cand variabila este declarata ca variabila de clasa.

Page 11: cursuri java

04/17/23 11

Variabile locale

Declararea variabilelor locale

Stim ca, pin bloc intelegem o secventa (eventual, vida) de instructiuni, cuprinsa intre acolade. De asemenea, ori ce bloc poate contine la randul sau un alt bloc, putand astfel lua nastere o structura imbricata de blocuri.

Prin variabila locala intelegem o variabila declarata in interiorul unei metode, unui bloc, inclusiv intr-o instructiune for.

De asemenea, parametrii metodei sunt considerati variabile locale.

Observatie: Numele variabilelor de instanta, de clasa sau locale este de preferat sa inceapa cu o litera mica, iar fiecare cuvant incepand cu al doilea, in cazul in care exista, sa inceapa cu majuscule.

Constante

Declararea constantelor locale si ale clasei

Constanta este un tip special de variabila a carei valoare nu se modifica niciodata pe parcursul executiei programului.

In Java, se pot declara constante pentru toate tipurile de variabile: de instanta, de clasa sau locale.

Page 12: cursuri java

04/17/23 12

Pentru a declara o constanta se foloseste modificatorul final. De asemenea, constantei i se atribuie o valoare care nu se modifica pe parcursul executiei programului.

In cazul constantelor locale, atribuirea valorii acestora se face la declarare sau inainte de a fi folosita.

Se mentioneaza ca, modificatorul final este singurul care poate fi atasat unei constante locale.

De exemplu:

final float pi = 3.141592;final numarMaxim = 12567;

Observatie: Numele constantelor locale este de preferat sa inceapa cu o litera mica, iar fiecare cuvant incepand cu al doilea, in cazul in care exista, sa inceapa cu o majuscula.

In cazul constantelor care definesc atributele unei clase, atribuirea valorii acestora se face fie prin initializare, in afara corpului tuturor metodelor clasei, fie prin constructori.

Constantele pot fi folositoare pentru denumirea diferitelor stari ale unui obiect (instanta) sau pentru testarea acestor stari.

Page 13: cursuri java

04/17/23 13

De exemplu, sa presupunem ca avem o eticheta text care poate fi aliniata la stanga, la dreapta sau centrat. Aceste constante se pot declara astfel:

final int LEFT = 0;

final int RIGHT = 1;

final int CENTER = 2;

Observatie: Numele constantelor care definesc proprietatile clasei este de preferat sa fie scris in totalitate cu majuscule, iar daca sunt mai multe cuvinte in componenta unui nume de constanta, atunci acestea sa fie separate prin linie de subliniere ( _ ) ca in exemplul de mai sus.

Daca constanta defineste un atribut al unei intregi clase (adica, al tuturor instantelor clasei) atunci modificatorul final este folosit impreuna cu modificatorul static.

Programul urmator (LotoConstante.java) ilustreaza modul de folosire al constantelor pentru atributele clasei . In jocul de loterie, se selecteaza saptamanal sase numere de la 1 la 49. Programul alege aleator numere pentru 1000 de jocuri si afiseaza apoi de cate ori a aparut fiecare numar in cele 1000 de jocuri. Se definesc trei constante de tip intreg pentru clasa LotoConstante: NUMERE care are valoarea 49, NUMERE_PE_JOC care are valoarea 6 si JOCURI are valoarea 1000.

Page 14: cursuri java

04/17/23 14

public class LotoConstante{

static final int NUMERE = 49;static final int NUMERE_PE_JOC = 6;static final int JOCURI = 1000;//genereaza numere de loterie intre 1 si 49//afiseaza numarul de aparitii al fiecarui numarpublic static void main(String[] args){

//genereaza numereleint[] numere = new int[50];for (int i = 0; i < numere.length; ++i)

numere[i] = 0;for (int i = 0; i < JOCURI; ++i)

for (int j = 0 ; j < NUMERE_PE_JOC; ++j) numere[(int) (Math.random() * NUMERE) +1]++ ;

// numara aparitiile de numere pe joc//afisare rezultatefor (int k = 1; k <= NUMERE; ++k)

System.out.println(k + ": " + numere[k]);}

}

Page 15: cursuri java

04/17/23 15

Domeniul de vizibilitate (acces) al variabilelor folosite in clasele de obiecte. Modificatori de acces.

Domeniul de vizibilitate al variabilelor locale

Domeniul de vizibilitate al unei variabile locale este constituit din partea din blocul in care variabila a fost declarata, parte ce urmeaza declararii, precum si din subblocurile blocului de instructiuni, subblocuri care urmeaza declararii. Variabilele locale exista si pot fi folosite numai pe perioada in care blocul unde sunt declarate este in curs de executie.

O variabila locala nu poate fi redeclarata nici in blocul in care a fost declarata, nici intr-un bloc inclus in acesta. O variabila locala poate fi redeclarata in blocuri disjuncte.

Domeniul de vizibilitate al parametrilor metodelor

Parametrii unei metode sunt vizibili (folosibili) doar in corpul metodei respective, deoarece se comporta ca variabile locale. Este insa posibil ca intr-un bloc dintr-o metoda sa se redeclare parametrul respectiv. In acest caz, in partea din bloc ce urmeaza redeclararii, parametrul respectiv este considerat ca avand semnificatia data de redeclarare.

Page 16: cursuri java

04/17/23 16

Domeniul de vizibilitate al variabilelor clasei

Variabilele de instanta si de clasa au un domeniu de vizibilitate extins la intreaga clasa in care au fost declarate, deci ele pot fi folosite de oricare dintre metodele din cadrul clasei fara a fi prefixate cu operatorul punct si numele instantei sau clasei.

Java verifica existenta unei declaratii a unei variabile de instanta sau de clasa in clasa curenta. Daca Java nu gaseste declaratia variabilei in clasa curenta , o cauta in superclasa corespunzatoare si asa mai departe pe toata ramura din ierarhie pe care se afla clasa respectiva.

Daca o variabila de instanta sau de clasa este redeclarata intr-o metoda (este folosita ca un parametru sau ca o variabila locala) atunci declararea cea mai interioara este cea care primeaza cand se face o referire la acea variabila. Se spune ca variabila redeclarata cu un domeniu de vizibilitate interior “ascunde” (inlocuieste) valoarea originala a variabilei si poate produce erori greu de depanat.

Page 17: cursuri java

04/17/23 17

De exemplu, urmatorul program (TestDomeniu.java):

class TestDomeniu {int test = 10;void printTest(int test) {

System.out.println("test = " + test);} public static void main (String args[]) {

TestDomeniu st = new TestDomeniu(); st.printTest(20);}

}

Programul are declarate doua variabile cu acelasi nume. Prima, o variabila de instanta, are numele test si a fost initializata cu valoarea 10. A doua este un parametru cu acelasi nume al metodei printTest, insa cu valoarea 20. Parametrul test din cadrul metodei printTest ascunde variabila de instanta test. Metoda printTest apelata in metoda main afiseaza parametrul test cu valoarea 20 si nu variabila de instanta.

Se poate evita aceasta eroare folosind referinta this ca o referinta la obiectul curent. Astfel, this.test refera variabila de instanta si numele simplu test refera parametrul metodei printTest. Programul de mai sus se poate, astfel, modifica (TestDomeniuThis) pentru a afisa valoarea 10 a variabilei de instanta si nu valoarea parametrului.

Page 18: cursuri java

04/17/23 18

class TestDomeniuThis {int test = 10;void printTest(int test) {

System.out.println("test = " + this.test);} public static void main (String args[]) {

TestDomeniuThis st = new TestDomeniuThis(); st.printTest(20);}

}

Vom reveni asupra referintei this dupa descrierea metodelor si a modificatorilor aplicati acestora.

Modificatorii de acces (vizibilitate) ai variabilelor unei clase

In Java exista trei modificatori de vizibilitate ai variabilelor unei clase:

- modificatorul public;

- modificatorul protected;

- modificatorul private.

Putem spune ca, prin acesti modificatori de acces, un obiect poate controla modul cum este vazut si cum se poate interactiona cu el din exterior.

Page 19: cursuri java

04/17/23 19

Revenind la incapsulare, aceasta poate fi definita ca procesul de prevenire a folosirii sau a modificarii directe a unor variabile apartinand unei clase de catre alte clase. Singura metoda de folosire a acestor variabile este prin apelarea metodelor clasei, daca si acestea sunt disponibile.

Modificatorul public face ca variabila respectiva sa fie accesibila, prin intermediul operatorului punct, oriunde este accesibila clasa variabilei.

Modificatorul protected face ca variabila respectiva sa fie accesibila in orice clasa din pachetul careia ii apartine clasa in care a fost declarata. In acelasi timp, variabila este accesibila in toate subclasele clasei date, chiar daca ele apartin altor pachete.

Modificatorul private face ca variabila respectiva sa fie accesibila doar in interiorul clasei in care a fost declarata.

Page 20: cursuri java

04/17/23 20

Daca pentru o variabila a unei clase nu se precizeaza nici un modificator de acces din cei descrisi mai sus, atunci variabila respectiva devine package-friendly. O variabila friendly este accesibila in pachetul din care face parte clasa in interiorul careia a fost declarata, dar nu este accesibila in subclasele clasei date daca acestea apartin altor pachete.

Nota: Modificatorii de acces (public, protected, private) sunt plasati primii in declaratia variabilei, urmeaza apoi modificatorii care determina felul variabilei (static, final) si apoi tipul de data al variabilei (referinta sau tip primitiv), ca mai jos:

[<modificatori_acces>] [<modificatori_variabila>] <tip_variabila> <nume_variabila>

Page 21: cursuri java

04/17/23 21

Metodele unei clase de obiecte

Definirea metodelor

Definitia unei metode cuprinde patru parti principale:

- numele metodei;

- o lista de parametrii (definiti prin nume si tip);

- tipul obiectului sau tipul primitiv de date returnat de metoda;

- corpul metodei

Primele trei parti ale definitiei metodei formeaza ceea ce se numeste semnatura metodei.

In plus, o metoda mai poate contine:

- modificatorii care descriu proprietatile metodei si modul de lucru al acesteia;

- clauze throws care indica exceptiile (erorile) pe care le poate semnala metoda.

Page 22: cursuri java

04/17/23 22

Sintaxa definitiei unei metode este:

[<modificatori_acces>] [<modificatori_metoda>] <tip_returnat> <nume_metoda> ([<param1>, <param2>, …]) [<clauze_specifice>]

{<corpul_metodei>

}

- <modificatori_acces> - specifica domeniul de vizibilitate (folosire sau acces) al metodei; modificatorul de acces este optional si poate fi: public; protected; private;

- <modificatori_metoda> - specifica proprietatile metodei si modul de lucru al acesteia; modificatorul este optional si poate fi: static, abstract, final;

- <tip_returnat> - specifica unul din tipurile primitive, un nume de clasa sau cuvantul cheie void (cand metoda nu returneaza nici o valoare);

- <nume_metoda> - specifica numele metodei; este de preferat ca numele metodei sa inceapa cu o litera mica si daca numele metodei contine in interior mai multe cuvinte, aceste cuvinte sa inceapa cu o litera majuscula;

- <param1>, <param2>, … - specifica lista de parametrii ai metodei, care reprezinta un set de definitii de variabile separate prin virgula;

Page 23: cursuri java

04/17/23 23

- <clauze_specifice> - specifica anumite clauze throws care indica exceptiile (erorile) pe care le poate semnala (“arunca”) metoda; despre aceste clauze vom vorbi intr-o lectie viitoare;

- <corpul_metodei> - instructiuni, apelari de metode etc.

Observatii:

1. Daca o metoda returneaza o referinta la un tablou de valori sau de obiecte, trebuie folosite parantezele drepte ([]) fie dupa <tip_returnat>, fie dupa lista de parametrii.

2. In afara cazurilor cand este declarata cu tipul void, o metoda returneaza la terminarea sa o valoare de un anumit tip.Acesata valoare trebuie specificata explicit intr-o instructiune return.

3. In aceeasi clasa pot exista metode cu acelasi nume si acelasi tip al valorii returnate, dar care difera prin numarul si tipul parametrilor din lista de parametrii. Acest mecanism poarta denumirea de supraincarcarea (overloading) metodei.

Page 24: cursuri java

04/17/23 24

Apelul metodelor

Apelul unei metode definita intr-o clasa de obiecte se realizeaza in mai multe moduri:

- prin crearea si utilizarea unei instante a clasei in care a fost definita metoda sau a unei subclase a clasei respective (ca regula generala de invocare a unei metode); in acest caz se foloseste operatorul punct ( . ), in stinga acestuia punandu-se numele instantei, iar in dreapa acestuia punandu-se numele metodei;

- prin simpla folosire a numelui sau, in cazul in care clasa in care este apelata metoda este aceeasi cu clasa in care a fost definita; aceasta modalitate este folosita daca atat metoda apelanta cat si metoda apelata sunt fie numai metode de instanta, fie numai metode de clasa;

- prin folosirea operatorului punct ( . ), in stanga acestuia punandu-se numele clasei in care a fost definita, iar in dreapta acestuia punandu-se numele metodei; aceasta modalitate este folosita numai daca metoda este definita ca metoda de clasa.

Page 25: cursuri java

04/17/23 25

Programele urmatoare (ClasaTablou1.java si ClasaTablou2.java) prezinta un exemplu de creare a unei clase care defineste o metoda numita creareTablou. Acesta preia doua numere naturale (o limita inferioara si una superioara) si creaza un tablou unidimensional care contine toate numerele naturale aflate intre cele doua limite, inclusiv aceste limite.

Varianta de apel a unei metode prin crearea si utilizarea unei instante a clasei in care a fost definita metoda.

public class ClasaTablou1 {int [] creareTablou(int inf, int sup) {

int [] tabl = new int[(sup - inf) +1]; for (int i = 0 ; i < tabl.length; i++)

tabl[i] = inf++; return tabl; }

public static void main(String args[]) { ClasaTablou1 unTablou = new ClasaTablou1(); int [] tablou = unTablou.creareTablou(1,10); System.out.print("Tabloul: [ "); for (int i = 0; i < tablou.length; i++) System.out.print(tablou[i] + " "); System.out.println("]");}

}

Page 26: cursuri java

04/17/23 26

Varianta de apel a unei metode prin simpla folosire a numelui metodei, deoarece metoda este definita si apelata in aceeasi clasa. Totusi metoda creareTablou trebuie sa fie declarata ca metoda de clasa (modificatorul static) pentru a putea fi apelata dintr-o alta metoda de clasa.

public class ClasaTablou2 {static int [] creareTablou(int inf, int sup)

{ int [] tabl = new int[(sup - inf) +1]; for (int i = 0 ; i < tabl.length; i++)

tabl[i] = inf++; return tabl; }

public static void main(String args[]){ int [] tablou = creareTablou(1,10); System.out.print("Tabloul: [ "); for (int i = 0; i < tablou.length; i++) System.out.print(tablou[i] + " "); System.out.println("]");}

}

Page 27: cursuri java

04/17/23 27

Modificatorii de metoda specifica proprietati suplimentare pentru o metoda.

In Java exista mai multi modificatori de metoda, dintre care mentionam:

- modificatorul static - pentru metode de clasa;

- modificatorul abstract - pentru metode abstracte, ce vor fi descrise intr-o lectie viitoare;

- modificatorul final - pentru metode finale, ce vor fi descrise intr-o lectie viitoare.

Page 28: cursuri java

04/17/23 28

Metode de instanta si metode de clasa

Metode de instanta

Ca regula generala, o metoda definita intr-o clasa se poate apela prin crearea unei instante a clasei respective sau a unei subclase a clasei respective. Aceasta se datoreaza faptului ca metoda lucreaza cu o serie de variabile ale clasei care sunt memorate in interiorul instantei si care au valori diferite in instante diferite (numite variabile de instanta). Astfel de metode se numesc metode ale instantelor clasei.

Metodele de instanta sunt aplicate unui anume obiect, nu unei clase intregi. Majoritatea metodelor definite intr-o clasa sunt metode de instanta.

Metode de clasa

Dupa cum stim deja, exista si un alt tip de variabile si anume variabilele de clasa sau variabilele statice care sunt comune tuturor instantelor clasei respective. Aceste variabile pot fi accesate fara a avea nevoie de o instanta a clasei in care au fost declarate.

In mod similar exista si metode de clasa sau metode statice. Pentru a fi apelate, aceste metode, definite intr-o clasa, nu au nevoie sa fie creata o instanta a clasei respective sau a subclasei derivata din clasa respectiva. Metodele de clasa sunt disponibile oricarei instante a clasei.

Page 29: cursuri java

04/17/23 29

Metodele de clasa nu folosesc variabilele de instanta, in schimb pot sa foloseasca variabilele de clasa (variabile statice) declarate in interiorul clasei in care au fost definite.

Intr-o metoda de clasa se pot apela metode de instanta dar cu precalificarea acestora cu numele instantei.

Pentru a defini metode de clasa se foloseste modificatorul static, pozitionat in fata definitiei metodei, la fel ca in cazul declararii variabilelor de clasa.

Ca si in cazul variabilelor de clasa, o metoda de clasa poate fi apelata fie conform regulii generale prin precalificarea numelui metodei cu numele instantei (despartite de operatorul punct), fie direct, prin precalificarea numelui metodei cu numele clasei (despartite de operatorul punct).

De exemplu, Java contine clase pentru fiecare dintre tipurile de baza: Byte, Integer, Long, Float, Double, Boolean, Character, Short. Fiecare din aceste clase contin metode care se aplica oricarei instante a clasei respective. De exemplu, putem folosi metodele de clasa care realizeaza conversia obiectelor in tipuri primitive si invers (parseInt, parseFloat etc sau toString).

Metodele de clasa pot fi de asemenea folositoare pentru adunarea intr-un singur loc (o clasa) a unor metode generale. De exemplu, clasa Math contine un set larg de operatii matematice definite cu metode de clasa - nu exista instante ale clasei Math.

Page 30: cursuri java

04/17/23 30

Domeniul de vizibilitate (acces) al metodelor unei clase. Modificatori de acces

O metoda este accesibila (apelabila) daca este definita in clasa din care este apelata sau intr-una din subclasele acesteia. Atunci cand se apeleaza metoda unui obiect, Java cauta definitia metodei respective in clasa obiectului. Daca nu o gaseste, cauta mai sus in ierarhia de clase pana cand gaseste o definitie.

In acelasi timp pentru a “vedea” o metoda si pentru a o putea apela, este nevoie sa avem drepturile de acces necesare (date de modificatorii de acces).

Modificatorii de acces (vizibilitate) ai metodelor unei clase

In Java exista trei modificatori de vizibilitate ai variabilelor unei clase:

- modificatorul public;

- modificatorul protected;

- modificatorul private.

Page 31: cursuri java

04/17/23 31

Modificatorul public face ca metoda respectiva sa fie accesibila oriunde este accesibila clasa din care face parte metoda.

Modificatorul protected face ca metoda respectiva sa fie accesibila in orice clasa din pachetul careia ii apartine clasa in care a fost definita. In acelasi timp, metoda este accesibila in toate subclasele clasei date, chiar daca ele apartin altor pachete.

Modificatorul private face ca metoda respectiva sa fie accesibila doar in interiorul clasei in care a fost definita.

Daca pentru o metoda a unei clase nu se precizeaza nici un modificator de acces din cei descrisi mai sus, atunci metoda respectiva devine package-friendly. O metoda friendly este accesibila in pachetul din care face parte clasa in interiorul careia a fost definita, dar nu este accesibila in subclasele clasei date daca acestea apartin altor pachete.

Nota: Modificatorii de acces (public, protected, private) sunt plasati primii in definitia metodei, urmeaza apoi modificatorii care determina felul metodei (static, abstract, final) si apoi semnatura metodei.

Page 32: cursuri java

04/17/23 32

Urmatorul program (TestCerc.java) ilustreaza modul de folosire al variabilelor de instanata, precum si al metodelor de instanta. In clasa Cerc variabila de instanta este raza care este vizibila numai in clasa in care a fost declarata (are modificatorul private). De aceea, accesul la aceasta variabila (pentru examinare si modificare) se face numai prin intermediul metodelor setRaza si getRaza care sunt publice.

class Cerc{

private double raza;public void setRaza(double r) {

raza = r; }public double getRaza() {

return raza; }public double arie() {

return Math.PI * raza * raza; }public double lungime() {

return 2 * Math.PI * raza; }}

Page 33: cursuri java

04/17/23 33

public class TestCerc{

public static void main(String[] args) { Cerc cerculMeu = new Cerc(); cerculMeu.setRaza(10); System.out.println("Raza=" + cerculMeu.getRaza()); System.out.println("Aria=" + cerculMeu.arie()); System.out.println("Lungimea=" + cerculMeu.lungime());

} }

Observatie: Deoarece fisierul-sursa TestCerc.java contine o clasa publica, TestCerc, numele fisierului trebuie sa fie identic cu numele clasei publice, altfel compilarea nu se va face cu succes. Intr-un fisier-sursa nu se poate defini decat o singura clasa publica.

Page 34: cursuri java

04/17/23 34

Referinta this

Cuvantul-cheie this se refera la obiectul curent, adica obiectul a carei metoda a fost apelata. Metoda poate folosi variabilele de instanta ale obiectului curent sau poate transmite obiectul curent ca parametru unei alte metode. Iata cateva exemple de folosire a cuvantului this:

t = this.x; // variabila de instanta x pentru acest obiect

this.resetRaza(this); // apeleaza metoda resetRaza, definita in clasa curenta si

// transmite obiectul curent

return this; // returneaza obiectul curent

In cele mai multe cazuri nu este nevoie sa se foloseasca explicit cuvantul-cheie this, deoarece este presupus. De exemplu, ne putem referi atat la variabilele de instanta, cat si la apelurile de metode definite in clasa curenta prin simpla folosire a numelui lor, deoarece this este implicit folosit de aceste referinte.

De aceea, primele doua exemple se pot rescrie astfel:

t = x; // variabila de instanta x pentru acest obiect

resetRaza(this); // apeleaza metoda resetRaza, definita in clasa curenta

Page 35: cursuri java

04/17/23 35

Nu se omite cuvantul-cheie this daca in domeniul de vizibilitate al obiectului curent au fost definite variabile locale cu acelasi nume ca cel al unei variabile de instanta sau au fost transmisi unei metode, a obiectului curent, parametrii cu acelasi nume ca cel al unei variabile de instanta. Aceste aspecte au fost explicate la paragraful referitor la domeniul de vizibilitate al variabilelor clasei.

Nota: Deoarece this este o referinta a instantei curente a clasei, trebuie sa se foloseasca doar in corpul unei definitii de metoda de instanta. Metodele de clasa, declarate cu modificatorul static, nu pot folosi this.

Metode constructor

Pe langa metodele obisnuite, in clase se pot include si metode constructor.

O metoda constructor este o metoda apelata atunci cand obiectul este creat si initializat, folosind operatorul new.

Spre deosebire de alte metode, o metoda constructor nu poate fi apelata direct in cadrul programului; Java apeleaza metodele constructor in mod automat.

Page 36: cursuri java

04/17/23 36

Atunci cand este folosit operatorul new pentru crearea unei instante a unei clase, Java executa trei activitati:

- aloca memorie pentru obiect;

- initializeaza variabilele de instanta ale obiectului fie la valorile initiale date de programator, fie la cele implicite (0 pentru numere, null pentru obiecte, false pentru valori booleene, si ‘\0’ pentru caractere);

- apeleaza metodele constructor ale clasei.

Daca la definirea clasei nu se furnizeaza nici un constructor, compilatorul creaza automat un constructor implicit care initializeaza fiecare membru al clasei cu valorile implicite.

Prin definirea unor metode constructor in clase, se pot seta valorile initiale ale variabilelor de instanta, se pot apela metode pe baza acestor variabile, se pot apela metode ale altor obiecte etc.

Metodele constructor au doua caracteristici de baza:

- au intotdeauna acelasi nume cu cel al clasei;

- nu returneaza nici o valoare.

Page 37: cursuri java

04/17/23 37

Urmatorul program (TestCercCons.java) prezinta clasa Cerc care are trei variabile de instanta: raza si coordonatele centrului cercului, x si y. Clasa Cerc foloseste o metoda constructor pentru a-si initializa variabilele de instanta pe baza argumentelor primite de new.

class Cerc{

private double raza;private int x, y;Cerc(int coordX, int coordY, double lungRaza) {

x = coordX;y = coordY;raza = lungRaza;

}public void setRaza(double r) {

raza = r; }public double getRaza() {

return raza; }public int getX() {

return x; }public int getY() {

return y; }public double arie() {

return Math.PI * raza * raza; }

Page 38: cursuri java

04/17/23 38

public double lungime() {return 2 * Math.PI * raza;}

}public class TestCercCons{

public static void main(String[] args) { Cerc cerculMeu = new Cerc(3, 9, 20); System.out.println("Raza=" + cerculMeu.getRaza()); System.out.println("Centrul cercului este in punctul: x= " +

cerculMeu.getX() + " y= " + cerculMeu.getY()); System.out.println("Modificarea razei cercului"); cerculMeu.setRaza(10); System.out.println("Raza=" + cerculMeu.getRaza()); System.out.println("Aria=" + cerculMeu.arie()); System.out.println("Lungimea=" + cerculMeu.lungime());

} }

Page 39: cursuri java

04/17/23 39

Supraincarcarea metodelor constructor

Ca si metodele obisnuite, constructorii pot avea un numar diferit de parametrii sau tipuri diferite pentru acestia desi au acelasi nume. Folosirea mai multor constructori cu acelasi nume dar cu parametrii care difera prin numar si/sau tip poarta denumirea de supraincarcarea metodelor constructor.

Aceasta tehnica ne permite sa cream un obiect cu proprietatile dorite sau ne da posibilitatea sa cream obiecte care sa isi seteze proprietatile pornind de la date de intrare diferite.

Cuvantul-cheie this pentru constructori

Multe clase dispun de mai multi constructori care au un comportament similar. Putem folosi cuvantul-cheie this in cadrul unei metode constructor pentru a apela ceilalti constructori ai clasei.

Apelul unei metode constructor definita in clasa curenta, folosind this se face astfel:

this(<arg1>, <arg2>, <arg3>, …)

unde:

- <arg1>, <arg2>, <arg3>, … - specifica parametrii metodei constructor.

Page 40: cursuri java

04/17/23 40

Intotdeauna apelul lui this trebuie sa fie prima instructiune din metoda constructor, celelalte instructiuni urmand dupa aceasta..

Urmatorul program (TestCercCons.java) prezinta clasa Cerc care are trei variabile de instanta: raza si coordonatele centrului cercului, x si y. Clasa Cerc foloseste doua metode constructor: unul in care sunt initializate variabilele de instanta pe baza datelor furnizate de parametrii lui new, si unul in care coordonatele x si y sunt preluate pe baza datelor furnizate de new dar variabila raza primeste valoarea prestabilita 1.

class Cerc{

private double raza;private int x, y;Cerc(int coordX, int coordY, double lungRaza) {

x = coordX;y = coordY;raza = lungRaza;

}Cerc(int coordX, int coordY) {

this(coordX, coordY, 1);}

Page 41: cursuri java

04/17/23 41

public void setRaza(double r) {raza = r; }

public double getRaza() {return raza; }

public int getX() {return x; }

public int getY() {return y; }

public double arie() {return Math.PI * raza * raza; }

public double lungime() {return 2 * Math.PI * raza;}

}public class TestCercCons{

public static void main(String[] args) { {System.out.println("Crearea obiectului cu primul constructor"); Cerc cerculMeu = new Cerc(3, 9, 20); System.out.println("Raza=" + cerculMeu.getRaza()); System.out.println("Centrul cercului este in punctul: x= " +

cerculMeu.getX() + " y= " + cerculMeu.getY());}

Page 42: cursuri java

04/17/23 42

System.out.println("Crearea obiectului cu al doilea constructor");Cerc cerculMeu = new Cerc(3, 9);System.out.println("Raza=" + cerculMeu.getRaza());System.out.println("Centrul cercului este in punctul: x= " +

cerculMeu.getX() + " y= " + cerculMeu.getY());System.out.println("Modificarea razei cercului");cerculMeu.setRaza(10);System.out.println("Raza=" + cerculMeu.getRaza());System.out.println("Aria=" + cerculMeu.arie());System.out.println("Lungimea=" + cerculMeu.lungime());}

}

Page 43: cursuri java

04/17/23 43

Dupa executia programului pe ecran se afiseaza urmatoarele:

Crearea obiectului cu primul constructorRaza=20.0Centrul cercului este in punctul: x= 3 y= 9Crearea obiectului cu al doilea constructorRaza=1.0Centrul cercului este in punctul: x= 3 y= 9Modificarea razei cerculuiRaza=10.0Aria=314.1592653589793Lungimea=62.83185307179586

Initializatori statici

La incarcarea in memorie a unei clase (deci inainte de a fi creata prima instanta) sunt automat initializate toate variabilele statice declarate in interiorul clasei. In plus, sunt apelati toti initializatorii statici ai clasei.

Un initializator static are urmatoarea sintaxa:

static {<set_instructiuni>}

Setul de instructiuni din initializatorul static este executat automat la incarcarea clasei in memorie.

Page 44: cursuri java

04/17/23 44

De exemplu, putem defini un initializator static in felul urmator:

class A {static double a;static int b;static {

a = Math.random(); // numar aleator intre 0.0 si 1.0 b = (int) (a * 500); // numar intreg intre 0 si 500

}// restul clasei}

Page 45: cursuri java

04/17/23 45

Declaratiile de variabile statice si initializatorii statici sunt executate in ordinea in care apar in clasa.

De exemplu:

class A {static int i = 11;static { i += 100; i %= 55;}static int j = i + 1;

// restul clasei}

Valoarea finala a lui i va fi 1 ((11+100) % 55) iar valoarea lui j va fi 2.