Sunteți pe pagina 1din 15

Curs: Core Java Programming

Module: Programarea orientată pe obiecte în Java


Unitate: Clase şi obiecte

În modulele precedente ne-am familiarizat cu caracteristicile


fundamentale ale limbajului Java. Profitând de cele învăţate până
acum, putem dezvolta programe simple care ne amintesc de cele
scrise în limbajele de programare structurale, precum limbajul C. În
limbajele structurale de programare, codul se execută secvenţial,
comandă după comandă, folosind construcţiile pentru decizie (if,
switch) şi construcţiile pentru repetarea codului, precum buclele (for,
while, do-while). Un astfel de mod de codare nu este foarte convenabil
pentru modelarea problemelor ce apar în lumea reală şi deseori
cauzează mari dificultăţi în ceea ce priveşte mentenanţa, atunci când
programele obţin o complexitate prea mare. Pentru a depăşi
problemele menţionate, avem la dispoziţie paradigma de programare
orientată pe obiecte, unde se folosesc obiectele şi clasele pentru o
modelare şi înţelegere mai uşoară a problemelor reale.

Java este un limbaj de programare orientat pe obiecte. Aceasta


înseamnă că limbajul de programare Java permite programatorilor
dezvoltarea programelor prin crearea obiectelor şi a relaţiilor dintre
obiectele respective.

Diferenţa dintre obiecte şi clase

Clasa reprezintă un şablon pe baza căruia se creează obiectele


cunoscute şi ca instanţe ale claselor. Clasele generalizează entităţi din
lumea reală, în timp ce obiectele reprezintă manifestări specifice ale
acestor entităţi. Clasa poate fi comparată cu o formă în care se coc
prăjiturile.

Obiectul sau instanţa este un exemplar al unui lucru, creat conform


unui anumit model (clasă). Fiecare pasăre este un obiect (o instanţă) al
clasei de păsări menţionate, în timp ce fiecare om este obiectul clasei
Om.

Să ne imaginăm acum că dorim să cumpărăm un automobil. Ştim că un


anumit model de automobile are anumite caracteristici, motiv pentru
care am decis să cumpărăm tocmai modelul respectiv. Pe de altă

© Copyright Link group 1 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

parte, avem şanse foarte mici ca din enorma ofertă de automobile să


cumpărăm un automobil atât de non-standard încât să nu intre în
conceptul de bază al automobilelor (roţi, uşi, portbagaj etc.). Acesta
probabil nici nu ar mai fi fost un automobil.

Când preluăm automobilul, preluăm de fapt un obiect al clasei


Automobil cu anumite caracteristici (culoare, număr uşi, motor etc.). Să
zicem că avem nevoie de un automobil pentru a transporta ceva. Pe de
altă parte, cineva poate avea nevoie de un automobil pentru viteza sa.
Fiecare dintre noi va obţine o instanţă a automobilului cu caracteristici
diferite.

De asemenea, o persoană reprezintă obiectul clasei Persoană. Aceasta


este clasa ale cărei caracteristici sunt: mâini, picioare, cap, stomac etc.
Deşi toate persoanele au aceste caracteristici, nicio persoană nu este
identică cu o alta, aşadar putem spune că toţi oamenii, deşi sunt creaţi
la fel, sunt de fapt diferiţi. Acestea sunt instanţe ale clasei Persoană.
De asemenea, toate persoanele, mai mult sau mai puţin, pot face
aceleaşi lucruri. Toţi oamenii pot alerga, umbla, vorbi etc. Totuşi, niciun
om nu poate zbura, aşadar această caracteristică va fi, cu siguranţă,
exclusă din descrierea clasei Persoană. Pe de altă parte, clasa Pasăre
are această caracteristică. Ea poate zbura, însă nu are mâini, aşadar
clasa care va descrie pasărea diferă de clasa Persoană.

În exemplele ilustrative precedente, am început să distingem ce este


de fapt o clasă şi ce este un obiect.

Crearea claselor şi a obiectelor

Am menţionat deja exemplul formei şi al prăjiturii. Nu se poate face o


prăjitură fără o formă. În acelaşi mod, nici obiectul nu se poate
instanţia dintr-o clasă inexistentă, aşadar, fiindcă nu există obiecte fără
clase, în primul rând trebuie declarată clasa propriu-zisă. Declararea
clasei este alcătuită din antet şi corp. Antetul conţine minim cuvântul
cheie pentru definirea clasei (class), după care urmează denumirea
care identifică clasa pentru ca ea să poată fi folosită astfel şi în alte

© Copyright Link group 2 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

locuri din cod. Corpul clasei începe cu paranteza acoladă deschisă şi se


termină cu paranteza acoladă închisă. Ceea ce este introdus între
paranteze se consideră drept corp al clasei. Iată cum arată declaraţia
unei clase:

class Cookie
{
// various member declarations
}

În codul de mai sus este declarată o clasă cu denumirea Cookie.


Conform regulei, numele claselor ar trebui să înceapă cu majusculă.
Dacă denumirea conţine mai multe cuvinte, atunci acestea se scriu
împreună, unde fiecare cuvânt începe cu majusculă (de exemplu:
MyCookie).

Clasa declarată în exemplul de mai sus reprezintă un tip de date


definite de utilizator, din care se pot crea clasei noi. Clasa Cookie
reprezintă forma despre care am vorbit deja, în timp ce obiectele care
vor fi create din această clasă vor fi prăjiturile. Obiectele se creează
prin folosirea cuvântului cheie new şi prin apelarea constructorului.

Cookie cookie = new Cookie();

În exemplul de mai sus este declarată variabila cookie de tip Cookie,


iar apoi, folosind cuvântul cheie new, este alocată memoria necesară
pentru introducerea obiectului de tip Cookie, iar la sfârşit avem
obiectul nou creat, atribuit variabilei cookie. Obiectele, după cum am
menţionat deja, se introduc într-o parte specială a memoriei, denumită
Heap, în timp ce în partea Stack se găseşte doar referinţa la obiecte.

Declararea şi instanţierea se pot executa şi separat.

Denumirea clasei urmată de paranteza rotundă deschisă şi închisă

© Copyright Link group 3 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

reprezintă apelul constructorului. Până acum nu am mai vorbit despre


constructor, însă trebuie să ştim că el reprezintă un bloc de cod folosit
pentru crearea obiectelor şi pentru iniţializarea valorilor. Constructorul
se defineşte în cadrul corpului clasei. Cuvântul cheie new este
responsabil pentru apelarea constructorului şi crearea obiectului
imediat după rezervarea memoriei, iar după aceea, referinţa la obiect
se introduce în variabilă.

Cu siguranţă vă întrebaţi cum putem crea un obiect în exemplul nostru,


având în vedere că niciunde în clasă nu am definit constructorul. Când
într-o clasă nu este definit constructorul, atunci Java creează în mod
implicit un constructor pentru clasa respectivă. Un astfel de
constructor se numeşte constructor implicit şi el nu conţine niciun
parametru. Tocmai din acest motiv, parantezele sunt goale în timpul
creării obiectului din exemplul nostru.

În următoarea lecţie vom explica în detaliu ce este constructorul, însă


acum este suficient să ştim că constructorul reprezintă un tip special
de metodă în cadrul clasei, metodă care se foloseşte pentru crearea
obiectelor clasei. Dacă nu specificăm constructorul, ca în exemplul
nostru, Java va crea în mod automat un constructor implicit.

O clasă poate conţine în corpul său atribute şi metode, în calitate de


membri. Atributele şi metodele pot fi înţelese ca anumite caracteristici
şi comportamente pe care le poate avea un obiect al clasei respective.
Vom vedea acum acest lucru pe exemplul unei persoane.

Am spus deja că poate exista un obiect al clasei Persoană. Acesta ar


putea fi orice persoană de pe pământ. Totuşi, prin ce se deosebesc
persoanele între ele? Este vorba tocmai de particularităţile trăsăturilor
comune. De exemplu, fiecare persoană are o anumită înălţime, o
persoană este mai înaltă, alta mai scundă, ceea ce face ca aceste două
persoane să fie diferite. De asemenea, o persoană are părul negru, alta
părul blond. În acest mod, am putea să descriem foarte uşor orice
persoană, folosindu-ne de atributele sale. Aceste atribute funcţionează
identic şi la nivelul modelului obiectual. Particularităţile pe care le
poate avea o persoană (înălţime, greutate, culoarea pielii, prenume,
nume) se pot considera drept atribute ale persoanei. În clasă,

© Copyright Link group 4 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

atributele se reprezintă concret prin câmpuri. Toate acestea,


transformate în codul de programare al unei clase în Java, ar arăta
astfel:

class Person
{
String name;
String surname;
int age;
int height;
int weight;
}

În afară de faptul că diferite persoane au un aspect diferit, acestea şi


acţionează diferit. De fapt, există lucruri pe care le pot face toate
persoanele. Deşi nicio persoană nu poate zbura sau respira sub apă,
având în vedere acţiunile valabile pentru om, persoanele se deosebesc
şi în funcţie de frecvenţa şi durata temporală în care acţiunile
respective pot fi efectuate. În general, ştim că omul poate face multe
lucruri: poate umbla, alerga, dormi, mânca, învăţa etc. Aceste acţiuni,
în modelul obiectual, se numesc metode. Câteva dintre metodele
definite în clasa Person ar arăta astfel:

class Person
{
String name;
String surname;
int age;
int height;
int weight;
void sleep()
{
//logic goes here
}

void run()

© Copyright Link group 5 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

{
//logic goes here
}
}

În acest mod vedem că, de fapt, atributele unui obiect sunt câmpurile
lui, iar competenţele sale sunt metodele. Aceste două noţiuni se mai
numesc stări şi comportamente (state and behavior).

Indiferent despre ce element al clasei este vorba, putem discuta


despre modificatorul de acces. Câmpurile au un modificator de acces,
metodele de asemenea, chiar şi clasele au un modificator de acces. Ce
reprezintă de fapt un modificator de acces? Un modificator de acces
reprezintă o funcţionalitate caracteristică limbajelor de programare
orientate pe obiect, care asigură controlul accesului la elementele unui
program. În aceste elemente intră clasele, câmpurile, metodele,
constructorii, precum şi interfeţele care urmează să fie explicate.

Fiecare limbaj de programare orientat pe obiecte se bazează pe trei


concepte foarte importante. Acestea sunt:

Încapsularea,
Moştenirea,
Polimorfismul.

Încapsularea

Noţiunea de încapsulare implică ascunderea unei logici complexe a


unei funcţionalităţi. Pentru aceasta este excelent exemplul cu
automobilul. Când răsucim cheia de contact, motorul va porni. Tot ce
ştim noi, ca şoferi, este că trebuie să răsucim cheia pentru a activa
motorul. Însă, întregul proces de pornire a motorului este mult mai
complex decât simpla răsucire a cheii. Producătorul maşinii a ascuns
logica complexă a pornirii motorului şi ne-a oferit acces doar la cele

© Copyright Link group 6 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

mai importante funcţii ale sale.

Dacă pornim un calculator, aceasta înseamnă că energia electrică


trece prin redresor care, la rândul său, lasă să treacă energia electrică
prin placa de bază. Placa de bază activează componentele
calculatorului (procesorul, placa grafică, hard disk-ul), după care placa
grafică transmite semnalul la monitor şi, în cele din urmă, obţinem
imaginea. Noi, ca utilizatori ai calculatorului, nu trebuie să ştim toate
aceste lucruri. Pe noi ne interesează doar faptul că, prin apăsarea
butonului, calculatorul va fi pornit.

În ambele cazuri este vorba de încapsulare, respectiv de ascundere a


logicii de executare.

Aceeaşi tehnologie este transmisă şi la modelul obiectual de


programare. O clasă, oricât de complexă ar fi logica sa internă, trebuie
să fie suficient de intuitivă pentru utilizatorul său. Dacă există o clasă
care conţine metoda pentru găsirea celui mai mare număr dintr-un şir,
pe noi nu ne va interesa deloc modul în care este rezolvată problema
de găsire a celui mai mare număr. Pe noi ne va interesa doar modul în
care vom putea folosi această clasă (denumirea clasei şi parametrii
necesari). În acest context, logica încapsulată este tocmai codul care
execută căutarea celui mai mare număr. Această funcţionalitate se
accesează apoi prin metodă, folosind modificatorul de acces public
(metoda publică). Modificatorii de acces vor fi explicaţi în detaliu în
continuare.

© Copyright Link group 7 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

Imaginea 15.1 Încapsularea logicii

În acest context, putem să menţionăm şi clasele încorporate, precum şi


metodele şi atributele lor. Am menţionat deja acest lucru şi îl vom mai
menţiona şi în lecţiile ce urmează. Există un număr mare de clase
încorporate în JDK. Metodele şi proprietăţile acestor clase ilustrează
tocmai exemplul de încapsulare. În programele noastre, noi folosim
aceste metode şi proprietăţi fără a şti cum funcţionează de fapt.
Metodele cu care ne-am familiarizat până acum sunt metode pentru
sortarea şi căutarea şirurilor, metode disponibile pentru wrapper-urile
de tipuri primitive şi multe altele. Faptul că noi nu ştim cum este
rezolvată logica acestor metode reprezintă de fapt încapsularea.

Moştenirea

Moştenirea defineşte relaţia dintre clase, inclusiv obiectele dintr-un


sistem orientat spre obiecte. Toate clasele în Java au o altă clasă
superioară, care se poate denumi drept clasă părinte. Dacă staţi şi vă

© Copyright Link group 8 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

gândiţi puţin la cele menţionate în proproziţia precedentă, veţi ajunge


repede la concluzia că trebuie să existe o clasă de la care începe totul.
Această clasă specială, şi singura care nu are o clasă părinte, se
numeşte Object. Toate celelalte obiecte din Java reprezintă
moştenitorii acestui tip.

Imaginea 15.2 Moştenirea în Java

Pentru a înţelege cât mai bine noţiunea de moştenire în Java, vom


analiza un simplu exemplu din lumea reală. Fiecare dintre noi poate
face parte dintr-un ansamblu de persoane (Person). Aşadar, putem
spune că noi suntem instanţele clasei Person. Cu toate acestea, fiecare
dintre noi poate ocupa diferite posturi de muncă, aşadar, conform
acestui lucru, putem crea noi ansambluri de persoane, în funcţie de
profesie (Principal, Student, Teacher). Putem detalia şi mai mult
lucrurile. De exemplu, un student poate studia la HighSchool şi la
College. Dacă am transpune toate acestea în modelul de clase al unui
limbaj orientat pe obiecte, am putea spune că clasa HighSchool
moşteneşte clasa Student, iar clasa Student moşteneşte clasa Person.
Fiecare clasă care nu are un părinte creat, are clasa Object drept clasă
superioară. Această structură este reprezentată şi în ilustraţia de mai
jos.

© Copyright Link group 9 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

Imaginea 15.3 Moştenirea clasei Person

Pentru a evidenţia că o clasă Java moşteneşte o altă clasă, folosim


cuvântul cheie extends. Să analizăm acum exemplul claselor Person şi
Student. Este clar că clasa Student moşteneşte clasa Person.

public class Person {

}
public class Student extends Person {

© Copyright Link group 10 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

În programarea orientată pe obiecte există şi noţiunea de moştenire


multiplă. O astfel de moştenire există atunci când o clasă moşteneşte
mai multe clase, adică atunci când o clasă are mai mulţi părinţi.
Moştenirea multiplă nu este susţinută în Java. Aceasta înseamnă că o
clasă poate avea doar un singur părinte.

Ca formă mai avansată de moştenire în Java, există noţiunile de clasă


abstractă şi interfaţă.

Clase abstracte şi interfeţe

Până acum am vorbit despre clase ca şabloane destinate creării


obiectelor, respectiv ca entităţi pentru instanţiere. Uneori, clasele nu
au deloc posibilitatea de instanţiere, ci acestea se folosesc doar ca
şabloane pentru crearea altor clase, respectiv pentru moştenire. În
acest mod introducem un set de reguli pentru crearea unei clase, dând
creatorului posibilitatea de creare a unei clase conform şablonului
nostru. Astfel de clase se numesc clase abstracte şi scopul de bază al
existenţei lor este să fie moştenite.

Imaginea 15.4 Moştenirea clasei abstracte

© Copyright Link group 11 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

Mai sus puteţi observa exemplul din ilustraţie. Clasa abstractă Shape
se va folosi, în acest caz, doar ca un cadru pentru continuarea
moştenirii, crearea unei instanţe a acestei clase nefiind posibilă.
Fiecare clasă care va moşteni clasa Shape va moşteni totodată şi
anumite proprietăţi caracteristice pentru fiecare formă geometrică (în
exemplul de mai sus este vorba de culoare – color). Pentru a specifica
faptul că o anumită clasă este abstractă, folosim cuvântul cheie
abstract.

abstract class Shape {

String color;

Datorită codului de mai sus, am definit clasa abstractă Shape, care are
un câmp ce reprezintă culoarea şi care va fi moştenit în toate clasele
care vor moşteni clasa Shape.

De asemenea, în Java există şi conceptul de interfaţă. Folosind


interfaţa, îl putem obliga pe creatorul clasei să folosească anumite
caracteristici (metode) conţinute în interfaţa propriu-zisă. Interfeţele, în
construcţia lor, conţin seturi de metode, adică semnături ale metodelor
(denumiri ale metodelor cu parametri de intrare şi de ieşire definiţi).
Când implementăm o interfaţă într-o clasă, este obligatorie
implementarea tuturor metodelor sale în cadrul clasei respective.

După cum am menţionat deja, o clasă poate avea un singur părinte,


însă poate implementa mai multe interfeţe.

Interfeţele şi clasele abstracte vor fi abordate în detaliu într-una din


următoarele lecţii.

Polimorfismul

© Copyright Link group 12 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

Polimorfismul (îşi are originea de la cuvintele greceşti poly, care


înseamnă mai multe sau câteva, şi morph care înseamnă formă)
reprezintă noţiunea care ne indică faptul că un lucru se poate folosi în
mai multe moduri.

În programarea orientată pe obiecte, un tip de polimorfism se


manifestă prin faptul că diferite clase pot defini, în diferite moduri,
metodele pe care le-au moştenit din clasa părinte.

12.5 Redefinirea metodei moştenite – polimorfismul

Angajaţii unei organizaţii muncesc pe diferite posturi, aşadar putem


avea secretari, manageri de proiect, şoferi sau directori. Putem vedea
acest lucru în ilustraţia de mai sus. Clasa Employee se foloseşte ca
bază pentru moştenirea tuturor celorlalte clase de angajaţi. Vedem că
clasa Employee are metoda pentru calcularea salariilor (getSalary).
Totuşi, salariul unui secretar şi al unui manager de proiect nu se
calculează în acelaşi mod. De aceea, fiecare dintre aceste clase îşi va
defini propria implementare a metodei moştenite getSalary. Acest
proces de definire a unei implementări diferite a metodei moştenite se
numeşte Overriding şi reprezintă un fel de polimorfism.

Al doilea tip de polimorfism se reflectă asupra faptului că într-o clasă

© Copyright Link group 13 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

putem avea definit acelaşi comportament, dar de mai multe ori şi în


diferite moduri. Aceasta înseamnă că putem avea mai multe metode
cu aceeaşi denumire, care realizează acelaşi lucru, dar în mod diferit.
Aceasta se mai numeşte şi overloading. În funcţie de parametrii
transmişi metodei, va depinde şi modul de alegere a executării. Acest
lucru se poate imagina şi ca un exemplu de metode care execută
adunarea. O clasă poate avea două metode de adunare, numai că o
metodă va aduna două numere, iar cealaltă metodă va aduna trei
numere. În timpul folosirii acestei funcţionalităţi, noi vom apela
întotdeauna aceeaşi metodă şi îi vom transmite 2 sau 3 parametri. În
funcţie de parametrii transmişi, va fi apelată şi metoda
corespunzătoare.

În următoarele lecţii vom da şi exemple practice de polimorfism.

Exerciţii

Exerciţiul 1

Trebuie creată clasa Animal care va fi definită ca una abstractă, iar


apoi trebuie create două clase, Horse şi Dog, care vor moşteni prima
clasă Animal.

Soluţie:

abstract class Animal {

}
class Horse extends Animal {

}
class Dog extends Animal {

© Copyright Link group 14 / 15


Curs: Core Java Programming
Module: Programarea orientată pe obiecte în Java
Unitate: Clase şi obiecte

Exerciţiul 2

Trebuie executată instanţierea claselor din exerciţiul precedent.

Horse horse = new Horse();


Dog dog = new Dog();

Clasa Animal nu se poate instanţia, deoarece aceasta este declarată ca


una abstractă.

© Copyright Link group 15 / 15

Powered by TCPDF (www.tcpdf.org)

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