Read without ads and support Scribd by becoming a Scribd Premium Reader.
 
 9
Programare Java – Lucrarea de laborator Nr. 2
PROGRAMAREA OBIECTUALA IN JAVA
Limbajul Java este un limbaj în întregime orientat pe obiecte: în Java (spre deosebire de C++) nuexista variabile sau functii care sa nu fie membre ale unei clase. Conceptele de programare obiectuala suntaceleasi ca si în C++: programele sunt organizate ca si colectii de
obiecte
cooperante, fiecare obiect fiind oinstanta a unei
clase
. Fiecare clasa reprezinta
abstractizarea
unui tip de entitate din realitatea modelata, iarclasele sunt membre ale unei ierarhii de clase, corelate între ele prin relatii de
mostenire
. Orice obiect este
încapsulat 
, ceea ce înseamna ca reprezentarea lui (adica structura interna a acelui obiect) nu este vizibilautilizatorilor, care au acces doar la functiile (
metodele
) pe care acel obiect este capabil sa le execute.
2.1. CLASE SI OBIECTE
Forma completa de definire a unei clase este urmatoarea:
lista_modificatori class nume_clasa
extends
nume_clasa_de_baza
implements
lista_interfete{// corpul clasei;}
Definitia unei clase trebuie sa contina în mod obligatoriu cuvântul cheie
class
, numele clasei sicorpul clasei. Toti ceilalti termeni din definitie sunt optionali. Înainte de cuvântul
class
poate exista o listade modificatori (despartiti prin spatiu) care atribuie anumite proprietati clasei definite. Acesti modificatoripot fi din categoria cuvintelor cheie:
public
,
abstract
si
final
. Pentru a deriva o clasa dintr-o clasa debaza (
superclasa
) se foloseste cuvantul cheie
extends
urmat de numele clasei de baza.În Java, spre deosebire de C++, poate exista o singura clasa de baza (Java nu supporta mostenireamultipla) si în lipsa mostenirii multiple se folosesc interfete Java. O interfata Java (
interface
) este un tipde date abstract, un fel de clasa în care nici una din metode nu este definita în intregime (lipseste corpulmetodei, doar s-a declarat metoda). O clasa implementeaza o interfata daca declara acest lucru în declaratiaclasei prin cuvântul cheie
implements
urmat de numele interfetei si daca defineste toate metodele declarate în interfata. O clasa poate implementa mai multe interfete utilizand cuvântul cheie
implements
urmat denumele interfetelor separate de virgula.În Java nu poate exista o declaratie de clasa independenta de corpul clasei. Corpul unei clase contineo serie de declaratii de membrii ai clasei si constructori. Membrii unei clase pot fi atât atribute cât si metode.Un membru declarat într-o clasa este disponibil prin numele sau oriunde în interiorul acelei clase.
Atributele
unei clase (variabile membru) pot fi de orice tip de data primitiv sau referinta (clasa sautablou). Declaratia atributelor are urmatoarea forma generala:
lista_modificatori_atribut tip_data lista_declaratori_variabile;
unde
lista_declaratori_variabile
 
cuprinde o serie de declaratori de variabila separati prin virgula.Un declarator de variabila are una din urmatoarele forme generale:
nume_variabila = expresie_initializare;nume_tablou[] = expresie_initializare;
Expresiile de initializare pot lipsi dintr-un declarator de variabila. Lista modificatorilor poate contineo serie de cuvinte cheie delimitate prin spatiu. Acesti modificatori stabilesc proprietatile unui atribut si pot fiunul din urmatoarele cuvinte cheie:
public
,
protected
,
private
,
final
,
static
,
transient
si
volatile
. Primii trei sunt
modificatori de acces
si nu poate exista decât unul dintre ei într-o declaratie.
O metoda
are urmatoarea forma generala de definitie:
lista_modificatori tip_returnat nume(lista_parametri)throws lista_exceptii{//corp_metoda}
 
 10Modificatori de metoda care definesc proprietatile metodei pot fi urmatoarele cuvinte cheie:
public
,
protected
,
private
,
abstract
,
static
,
final
,
synchronized
sau
native
. Se pastreazaprincipiul supraîncarcarii (
overloading
) metodelor din C++. O functie poate arunca o serie de exceptii. Acestlucru trebuie specificat prin cuvântul cheie
throws
urmat de o lista a tipurilor de exceptii care pot fiaruncate. Corpul metodei defineste operatiile pe care le va executa metoda la apelul ei.
Constructorul
este (ca si în C++) metoda cu nume identic cu numele clasei si care nu returneazanici un tip de date. Ca orice metoda, si constructorii contin o lista de parametrii formali. Exista astfelposibilitatea supraîncarcarii constructorilor prin modificarea listei parametrilor formali. În functie devariabilele (tipurile lor) utilizate ca si parametri la instantierea unui obiect prin operatorul
new
, se apeleazaconstructorul corespunzator. În cazul în care nu se declara nici un constructor (doar în acest caz)compilatorul creaza un constructor implicit, având numele clasei, fara nici un parametru formal si avândcorpul constructorului gol. Corpul constructorului poate contine ca prima linie (doar ca prima linie) una dinurmatoarele instructiuni:
this(lista_parametri) sau super(lista_parametri)
Cuvântul cheie
this
reprezinta referinta la obiectul curent. Prin
this(lista_parametri)
sepoate apela un alt constructor (al aceleiasi clase) cu o lista de parametri diferita de cea a constructoruluicurent. Cuvântul cheie
super
reprezinta referinta la clasa de baza a clasei actuale. Prin instructiunea
super(lista_parametri)
 
se apeleaza constructorul superclasei (clasa de baza directa). Cele douainstructiuni nu pot exista simultan. Un exemplu de supraîncarcare a constructorilor si utilizare a cuvântuluicheie
this
într-un constructor este urmatorul:
public class Masina{public Masina(int nr){. . .} // primul constructorpublic Masina(int nr, String marca){ // al doilea constructorthis(nr); // apelul primului constructor. . . . . .}}
Cuvântul cheie
this
poate fi utilizat nu numai la apelul constructorului, ci si în alte metode. Osituatie mai des întâlnita este aceea de accesare a unui atribut al clasei din interiorul unei metode a clasei încare exista o variabila (de regula, un parametru formal) cu nume identic cu cel al atributului clasei. Caurmare, în doemniul de vizibilitate al metodei, numele respectiv va referi parametrul formal, nu atributulclasei. Situatia acesta se rezolva în modul urmator:
int width; // atribut al claseiint setWidth(int width) // parametru formal{this.width = width; // this.width refera atributul clasei// iar width parametrul formal al metodei}
Obiecte.
În crearea unui obiect dintr-o clasa sunt trei etape:
declararea, instantierea si initializarea
.Daca declararea unui obiect se poate face separat, instantierea si initializarea sunt operatii ce au loc simultanprin folosirea operatorului
new
.Operatorul
new
aloca memoria necesara stocarii obiectului respectiv (atributelor lui) si apeleaza unconstructor, care initializeaza obiectul conform operatiilor specificate în corpul constructorului. Lainstantierea unei clase se aloca memorie fiecarui atribut din clasa respectiva, se initializeaza la valoareaimplicita (
0
pentru tipurile primitive numerice,
false
pentru tipul boolean, si
null
pentru tipurilereferinta), se atribuie valoarea din expresia de initializare din declaratia atributului (daca aceasta exista) sidupa aceea se apeleaza constructorul. Variabilele sunt initializate în ordinea definirii lor si înaintea apeluluioricarei metode inclusiv a constructorului. Doar dupa terminarea executiei constructorului obiectul estedisponibil. În schimb referinta
this
poate fi utilizata în interiorul lui imediat dupa alocarea memorieinecesare stocarii lui.De multe ori este necesara eliberarea unor resurse în momentul distrugerii unui obiect. În limbajulC++ aveam la dispozitie destructorul. În Java, masina JVM contine o componenta numita
Garbage Colector 
 care se ocupa de dezalocarea zonelor de memorie alocate prin
new
, în momentul în care acele zone nu maisunt referite de nici o variabila. Exista cazuri însa în care e nevoie de dezalocarea altor resurse atasate unuiobiect decât cele de memorie, ca de exemplu conexiuni la fisiere sau conexiuni în retea. O solutie este
 
 11utilizarea metodei
finalize
mostenita din clasa
Object
. Metoda
finalize
este apelata automat de JVMdupa ce obiectul nu mai este referit, dar înainte de eliberarea zonei de memorie alocata acestuia.
Membrii statici ai unei clase.
Utilizarea modificatorului
static
la declararea unui atribut sau ladeclararea unei metode înseamna apartenenta membrului respectiv la clasa si nu la o instanta a ei (la unobiect). În cazul unui atribut static, se aloca memorie o singura data, la prima initializare a clasei. Laurmatoarele instantieri ale clasei nu se mai aloca memorie pentru un atribut
static
, dar toate obiectele dinacea clasa pot accesa aceeasi variabila statica, aflata în aceeasi zona de memorie. Un exemplu de utilizare aunei variabile statice este de a contoriza obiectele create din acea clasa:
class Contor{static int contor = 0;public Contor(){contor++;System.out.println(“Acesta este obiectul nr. ” + contor);}}...Contor c1 = new Contor(); // Acesta este obiectul nr. 1Contor c2 = new Contor(); // Acesta este obiectul nr. 2...
Metodele statice ale unei clase sunt un fel de functii globale si se pot folosi fara sa fie necesaracrearea unei instante a clasei (obiect). Un exemplu de metoda statica este metoda
main()
a claseiprincipale a aplicatiilor. Metodele statice nu pot utiliza atribute si metode care nu sunt
statice
.
Specificatorii de acces
. În cazul în care o clasa este declarata de tipul
public
, ea poate fi utilizatadin exteriorul package-ului în care a fost definita. Specificatorul
public
permite declararea unui obiect detipul clasei respective (referinta obiectului). Pentru a putea fi însa instantiata, clasa trebuie sa aiba si unconstructor declarat de tip
public
. În cazul în care cuvântul cheie
public
lipseste din definitia clasei, clasadevine clasa
 friend 
si poate fi accesata doar din interiorul package-ului în care a fost creata.În cazul metodelor, atributelor si constructorilor unei clase, se poate vorbi despre patru niveluri deacces, prezentate în tabelul urmator.
AccesSpecificatorÎn clasa În clase derviate În packageÎn exteriorulpackage-uluipublic DA DA DA DADA DA DA NUprotected DA DA NU NUprivate DA NU NU NU
2.2. MOSTENIREA CLASELOR
Prin mostenire se pot crea clase noi (numite clase derivate sau subclase) care extind clasa de baza(superclasa). Clasa derivata mosteneste de la clasa de baza toate metodele si toate atributele. Constructorii nuse mostenesc. Ca urmare se poate spune ca un obiect din clasa derivata este si un obiect de tipul clasei debaza. Pe lânga metodele si atributele pe care le mosteneste de la clasa de baza, clasa derivata poate sa adaugealtele noi. Clasa derivata este o specizalizare a clasei de baza.Derivarea unei clase în Java se face utilizând cuvântul cheie
extends
urmat de numele clasei debaza. Dupa cuvântul cheie
extends
nu poate exista decât o singura clasa deoarece limbajul Java nu admitemostenirea multipla. În cazul claselor derivate compilatorul adauga la inceputul constructorului un apel alconstructorului fara argumente al clasei de baza daca si numai daca nu exista un apel explicit al unuiconstructor al clasei de baza introdus în programul sursa. În cazul în care apelul se face explicit, esteobligatoriu ca acest apel sa se faca înaintea oricaror alte instructiuni. Apelul explicit se face prin intermediulcuvantului cheie
super
si este util în cazul în care dorim apelul unui alt constructor al clasei de baza decâtcel fara parametru. La instantierea unei clase derivate, ordinea initializarilor este urmatoarea:
Initializarea atributelor statice ale clasei de baza
Initializarea atributelor statice ale clasei derivate
Initializarea atributelor nestatice ale clasei de baza
Apelul constructorului clasei de baza
Search History:
Searching...
Result 00 of 00
00 results for result for
  • p.
  • Notes
    Load more