Sunteți pe pagina 1din 8

Modulul: Programarea Orientată spre Obiecte CEITI

Capitolul 2. Clase și obiecte


UC1. Cunoașterea tehnologiei de programare ale limbajului orientat spre obiect.
UC3. Crearea și instanţierea claselor.
La finele capitolului elevul va fi capabil să:
- să identifice tipul de programare structurat, procedural și orientat spre obiect.
- să prezinte situații de utilizare a claselor.
- să creeze clase conform specificațiilor propuse.
- să declarare datele și metodelor membre a clase.
- să protejeze membrii clasei conform specificațiilor propuse.
- să instanțieze clase.
- să inițializeze datele unui obiect la nivel de metode.

2.1 Stiluri de organizarea a codului unui program.


Implică-te și studiază, informează-te!
Ca urmare a dezvoltării aplicațiilor software se impune o organizare cât mai eficientă a
codului sursă astfel încât acesta să fie mai ușor de întreținut și înțeles.
Dea lungul timpului au fost dezvoltate mai multe tehnici de organizare a codului sursă:
a) Programarea nestructurată
✓ Date și instrucțiunile se găsesc în programul principal, într-o unitate de compilare;
✓ Implică utilizarea excesivă a instrucțiunilor "goto" pentru a transfera controlul de la
o secțiune a codului la alta. Aceasta poate duce la crearea unor structuri de control
dificil de urmărit și de înțeles.
✓ Lipsesc structuri de control clare, precum bucle și condiții, care sunt fundamentale
în tehnicile noi de organizare a codului;
✓ Cu cât codul devine mai lung cu atât mai greu este de întreținut;
✓ Mult cod duplicat;
Exemple: Assembler, Fortran, Basic, Cobol, ș.a
❗ Este important să subliniem că aceste limbaje nu erau neapărat proiectate pentru
a încuraja programarea nestructurată, ci mai degrabă reflectau practicile de
dezvoltare din perioadele timpurii ale informaticii, când conceptele de
programare structurată nu erau încă pe deplin înțelese și adoptate. Cu timpul,
oamenii au recunoscut avantajele programării structurate și au dezvoltat limbaje
și practici care să promoveze o abordare mai clară și ușor de înțeles a dezvoltării
software.
b) Programarea structurată
✓ Utilizarea instrucțiunilor de control de flux precum bucle (for, while), condiționale
(if, else), și structuri de selecție (switch) pentru a organiza logica programului.
✓ Minimizarea utilizării instrucțiunilor de salt necontrolate ("goto") pentru a preveni
crearea de fluxuri de control haotice și greu de urmărit.
✓ Își propune să creeze programe mai ușor de înțeles, de întreținut și de extins,
contribuind astfel la eficiența și calitatea dezvoltării software.
Exemple: C, C++, Pascal, Modula-2, Phyton, ș.a
musteata.victoria@ceiti.md 1 ©Musteață Victoria
Modulul: Programarea Orientată spre Obiecte CEITI
c) Programarea procedurală
✓ Se bazează pe noțiunea de subprogram ( proceduri, funcții) ;
✓ Codul este mai bine organizat cu o funcționalitate mai bine precizată;
✓ Codul devine mai complicat însă poate fi reutilizat;
✓ Modificarea subprogramelor nu afectează restul programului;
Exemple: C, C++, Pascal, Fortran, Algol, ș.a
d) Programarea modulară
✓ A apărut în urma creșterii dimensiunilor programelor, iar simpla organizare a codului
sub formă de proceduri nu mai era eficientă;
✓ Implică împărțirea unui sistem software mare și complex în module mai mici și
independente ce permit rezolvarea problemelor dintr-un anumit domeniu;
✓ Fiecare modul are o interfață bine definită care specifică cum poate fi utilizat de către
alte module. Aceasta include declarații de funcții, tipuri de date și alte detalii necesare
pentru a interacționa cu modulul.
✓ Îmbunătățește lucrul cu reutilizarea codului;
✓ Echipele de dezvoltare pot lucra independent la diferite module, reducând
dependențele și facilitând dezvoltarea paralelă.
✓ Testarea modulelor în mod separat este mai ușor de realizat, ceea ce contribuie la
identificarea și remedierea erorilor mai rapid.
Exemple: C, C++, Pascal, Python, Modula2, Ada, ș.a
e) Programarea orientată spre obiecte
✓ Tendință nouă de programare;
✓ Modelează obiecte din lumea reală;
✓ Programele sunt organizate ca colecții de obiecte ce cooperează între ele;
✓ Detaliile și comportamentul obiectelor sunt păstrate în clase;
Programarea procedurală Programarea orientată spre obiecte

extragere , suplinire, transfer client , bani, cont


✓ Programele sunt mult mai complexe și ușor de întreținut și modificat;
✓ Simplifică lucrul în echipă la un program;
✓ Se bazează pe 4 principii: încapsulare, moștenire, polimorfism, abstractizare;
Exemple: C++, Simula, Smalltalk, Java, ș.a
Deci, POO este un stil de programare în care programele sunt organizate ca şi colecții de
obiecte cooperante, fiecare dintre ele reprezentând o instanță a unei clase, iar clasele sunt
membre ale unei ierarhii de clase între care există relații de moștenire și respectă principiile
POO.

musteata.victoria@ceiti.md 2 ©Musteață Victoria


Modulul: Programarea Orientată spre Obiecte CEITI
2.2 Principiile programării orientată spre obiect.
Abstractizare - Procesul de a prelua obiecte din lumea reală și a le transforma în
concepte virtuale;
- Reprezintă posibilitatea ca un program să ignore unele aspecte ale
informației pe care o manipulează, adică oferă posibilitatea
concentrării asupra esențialului, dintr-un anumit punct de vedere;
Moștenire - Oferă posibilitatea de a roșii
proiecta noi clase folosind terestre
clase deja existente; castraveți
- Clasa derivată legume
moștenește variabilele și morcov
metodele clasei de bază; subterane
- Permite reutilizarea
cartof
codului;
- În Java o clasă nu poate
extinde (moșteni) direct mai multe clase.
Polimorfism - Etimologic , cuvântul polimorfism provine din limba greacă, de la polys
(multe) și morphos (forme);
- În POO, prin polimorfism se înțelege posibilitatea ca, prin apelarea
unei funcții, să obținem efecte diferite, în fucție de contextul apelului.
De exemplu, pentru toate figurile geometrice putem calcula aria, însă
pentru fiecare din ele se calculează diferit;
- Deviza polimorfismului este ,, Același nume – implementare diferită”
Încapsulare - Acest termen definește accesul la membrii unei clase. Din anumite
motive accesul la membrii unei clase se dorește a fi restricționați ca
urmare aceștia sunt încapsulați în clasă prin intermediul unor cuvinte
rezervate (modificatori de acces);
- Reprezintă proprietatea obiectelor de a-și ascunde o parte din date și
metode. Din exteriorul obiectului sunt accesibile (”vizibile”) numai
datele și metodele publice.
2.3 Clase și obiecte. Sintaxă și semantică
2.3.1 Clase
Clasa stă de fapt la baza programării orientate e obiecte, pe ea este construit întregul limbaj
Java, deoarece clasa definește obiectul.
O clasă reprezintă un șablon sau un tip de bază pentru crearea obiectelor. Este un tip abstract
de date definit de programator. Atunci când definim o clasă nouă creăm un nou tip de date.
O clasă descrie un set de caracteristici (date, atribute sau variabile de instanță) și
comportamente (funcționalitate, metode sau funcții) pe care obiectele create din acea clasă le
vor avea. Clasa în POO întrunește toate obiectele de una şi aceeași natură, ceea ce înseamnă că
obiectele care aparțin uneia și aceleiași clase au una şi aceeași structură şi comportament.

musteata.victoria@ceiti.md 3 ©Musteață Victoria


Modulul: Programarea Orientată spre Obiecte CEITI
Sintaxa de definire a unei clase este:
[public][abstract][final] class nume_clasa
[extends nume_super_clasă]
[implements Interfata1,Interfata2,...,InterfataN]
{//început bloc clasa
//atribute și metode
//blocuri de cod
//alte clase
}//sfârșit bloc clasa
Prima parte din declarația unei clase o constituie modificatorii de acces care sunt opționali.
După numele clasei putem specifica, dacă este cazul, faptul că respectiva clasă este subclasă
a unei alte clase cu numele nume_super_clasă, sau/şi că implementează una sau mai multe
interfeţe ale căror nume trebuie separate prin virgulă.
Corpul unei clase este cuprins între { } şi are ca conţinut:
- declararea şi inițializarea variabilelor de instanţă şi de clasă;
- declararea şi implementarea constructorilor;
- declararea şi implementarea metodelor de instanţă şi de clasă;
- declararea unor clase interne.
Reţineţi!
- într-un fișier Java pot fi definite mai multe clase;
- într-un fișier Java numai o clasă poate avea modificatorul public;
- fișierul Java ce conține o clasă publică trebuie să fie cu același nume ca și clasa
publică.
O clasă poate avea unul din următoarele cuvinte rezervate în declarația acestora:
Modificator Semnificație
public Implicit o clasă poate fi folosită doar de clasele aflate în același pachet cu clasa
respectivă, o clasă declarată public poate fi folosită din orice altă clasă indiferent de
pachetul în care se află.
abstract O clasă declarată abstractă nu poate fi instaţiată, este folosită doar pentru a crea un
model comun pentru o serie de subclase (tema Clase și metode abstracte).
final O clasă declarată final nu poate avea subclase, adică nu va putea fi moștenită.
Exemplu de declarație de clasă:
public class Client public final class BMW
{ {
} }

În Java orice clasă conţine 2 tipuri de elemente : atribute (variabilele) şi metode.


Variabilele unei clase se declară înaintea metodelor, (deşi nu este impus de compilator acest
lucru), şi sunt vizibile în toate metodele respectivei clase.
Variabilele declarate în cadrul unei metode sunt locale metodei respectivei.
O variabilă de declară respectând sintaxa :
[modificatori] tip_variabila nume_variabila [=valoareInitiala];

musteata.victoria@ceiti.md 4 ©Musteață Victoria


Modulul: Programarea Orientată spre Obiecte CEITI
Modificatorii pot fi :
1) modificatori de acces :
Specificator Clasa Subclasa Pachet Oriunde
private x
protected x x* x
public x x x x
implicit x x
x*- dacă subclasa se află în același pachet cu clasa.
2) unul din cuvintele rezervate :
▪ static – indică că variabila este variabilă de clasă şi nu de instanță;
De exemplu : static int varClasa; int varInstanta;
▪ final – indică faptul că valoarea variabile nu poate fi modificată, declararea
constantelor;
exemplu: final double PI = 3.14;
▪ transient – folosit pentru a specifica dacă variabila membră participă la serializare
( detalii tema ,,Serializarea obiectelor’’)
De exemplu:
class Exemplu {
double x; //variabila vizibila in clasa data si pachetul din care face parte clasa
protected static int n; //vizibila in clasa data si in subclasele același pachet cu clasa data
public String s=”abc”; // variabila s de tip string va fi vizibila oriunde
final int MAX=1000; // constanta de tip întreg
}

O metodă se declară respectând sintaxa:


[modificatori] tipReturnat numeMetoda ([lista_argumente])
[throws tipExceptie1, tipExceptie2,...]{
// corpul metodei
}

Modificatorii pot fi
1) un specificator de acces: public, protected, private;
2) unul din cuvintele rezervate :
▪ static – metoda este de clasă şi nu de instanţă.
De exemplu: void metodaInstanta(); static void metodaClasa();
▪ abstract – indică că o metodă este abstractă , nu are implementare şi obligatoriu face
parte dintr-o clasă abstractă. (tema Clase şi metode abstracte)
▪ final – indică că metoda nu mai poate fi supradefinită în subclasele clasei în care ea
este definită ca fiind finală. Se folosești atunci când nu dorim ca metoda să fie
modificată în subclasele clasei date;
▪ synchronized – este folosit în cazul în care se lucrează cu mai multe fire de execuție.

O metodă poate sau nu să returneze o valoare la finisarea execuției. Tipul returnat poate fi un
tip primitiv de date sau o referință la un obiect al unei clase. Atunci când o metodă nu returnează
nimic trebuie obligatoriu de specificat cuvântul cheie ,,void’’ ca fiind tipul returnat de aceasta.
musteata.victoria@ceiti.md 5 ©Musteață Victoria
Modulul: Programarea Orientată spre Obiecte CEITI
De exemplu:
public void afisare(){System.out.println(“Rezultat “);}
Dacă o metodă trebuie să returneze o valoare, la terminarea funcției trebuie să apară obligatoriu
instrucțiunea return urmată de rezultat compatibil cu tipul metodei.
De exemplu:
int metoda(){ return 1; // corect }
int metoda(){ return 1.5; //eroare}
int metoda(){ return (int)1.5; }

Dacă valoarea returnată este o referință la un obiect al unei clase atunci clasa obiectului returnat
trebuie să coincidă sau să fie o subclasă a clasei specificate la declararea metodei.
De exemplu, fie clasa Poligon şi subclasa ei Patrat:
a) Poligon metoda1(){ b) Patrat metoda2(){
Poligon p=new Poligon(); Poligon p=new Poligon();
Patrat t=new Patrat(); Patrat t=new Patrat();
if (...) return p; else t; } if (...) return p;//ilegal
else t; }

Lista de argumente este opţională la declararea metodei, dar dacă aceasta este atunci va avea
forma:
<tipVariabila1> <Variabila1> , ... , <tipVariabilaN> <VariabilaN>
variabila1,...,variabilaN reprezintă parametri formali.
Parametri formali sunt acei parametri care apar la definirea metodei. La apelarea metodei sunt
parametri actuali, iar valorile acestora se transmite parametrilor formali.
Nu este posibil ca 2 parametri formali să conțină același nume.

2.3.2 Obiecte
Dicționarele explicative ale limbii române definesc termenul ,,obiect’’ în felul următor:
✓ corp solid
✓ lucru
✓ disciplină de studiu
Aceste definiții cuprind diferite domenii ce țin de natură şi activitatea omului. Ele pot fi
transformate în concepte virtuale fiind modelate de POO prin declarări de clase şi crearea
obiectelor clasei respective.
Obiectul în programare este un modul de program ce îndeplinește următoarele cerințe
principale:
- întrunește date și are comportament;
- posedă proprietăți de moștenire, încapsulare şi polimorfism.
Obiectele sunt construite pe baza unor șabloane numite clase respectând sintaxa:
Denumire_clasă denumire_obiect = new Denumire_clasă();
Odată creat obiectul poate fi folosit pentru a: afla informații despre obiect, schimba starea
obiectului, executa unele acțiuni.

musteata.victoria@ceiti.md 6 ©Musteață Victoria


Modulul: Programarea Orientată spre Obiecte CEITI
Obiectul accesează metodele şi datele clasei sale prin intermediul operatorului ,, .’’ folosind
sintaxa:
denumire_Obiect.variabilă;
denumire_Obiect.numeMetoda();
Exemple:
elev1.nume=”Ion”; elev1.bursa();
elev1.virsta=20; elev1.setNume(“Ion”);

Deci procesul prin care creăm obiecte pentru o clasă, de fapt în POO poartă denumirea de
instanțierea unei clase și implică următoarele:
1) declarare : numeClasa numeObiect;
De exemplu: Elev elev1;
2) instanţiere – se realizează cu operatorul new() şi are ca efect crearea obiectului cu
alocarea spaţiului de memorie corespunzător: numeObiect = new numeClasa();
De exemplu: elev1 = new Elev();
3) iniţializare – se realizează prin intermediul constructorilor clasei respective, are loc de
fapt împreună cu instanţierea, urmează imediat după operatorul new.
Parantezele rotunde de după identificatorul numeClasa(); indică că acolo este de fapt
un apel la unul din constructorii clasei. Deci instanţierea şi iniţializarea au forma:
numeObiect = new numeClasa([argumente_constructor]);
De exemplu: elev1 = new Elev(“Ion”,20);

Notă! O clasă poate fi instanțiată și în felul următor:


numeClasa numeObiect = new numeClasa([argumente_constructor]);
De exemplu: Elev elev1 = new Elev(“Ion”,20);

Analizează și discută!

1. Definiți clasa Client care are trei variabile de instanță: nume, adresa și email. Adăugați clasei
o metodă cu parametri care va inițializa variabilele de instanță și o metodă fără parametri
care va afișa informația despre detaliile clientului.
2. În metoda main(), se creează o instanță a clasei Client, se afișează informațiile despre client,
se actualizează adresa și se afișează informațiile actualizate.
3. Definiți clasa Dreptunghi care descrie suprafețe grafice definite de coordonatele colțul
stânga sus, lățimea respectiv înălțimea dreptunghiului. Definiți o clasă Test pentru clasa
Dreptunghi în care instanţiați această clasă.

musteata.victoria@ceiti.md 7 ©Musteață Victoria


Modulul: Programarea Orientată spre Obiecte CEITI

Evaluează-te!

1. Indicați valoarea de adevăr a afirmațiilor de mai jos:


Într-un fişier Java pot fi mai multe clase;
Într-un fişier Java mai multe clase pot avea modificatorul public;
O clasă în Java are un singur constructor şi numai unul;
Fişierul Java care are o clasă publică trebuie să conţină acelaşi nume ca şi clasa publică;
În Java programatorul trebuie obligatoriu să distrugă obiectele nefolosite;
Constructorii se folosec pentru instanţierea claselor;
2. Care din următoarele declarații de clasă sunt greșite?
a) public class Client {} d) private class Client {}
b) public static class Client {} e) final class Client {}
c) public abstract final class Client {} f) implement class Client {}
3. Să se construiască clasa Cerc, ce are ca variabilă de instanţă privată, un număr întreg r ce reprezintă
raza unui cerc. În această clasă avem ca metode:
- metoda initializareDate() ce va inițializa starea obiectului.
- metoda Perimetru() ce va returna perimetrul (2*PI*r) cercului;
- metoda Arie() ce va returna aria (PI*r2) cercului.
Scrieţi şi o clasă test pentru clasa Cerc unde instanţiaţi un obiect al acestei clase şi calculaţi pentru el
aria şi perimetrul.

Știați că...
1. Sunt peste 10 milioane de programatori Java în lume – mai mult decât populația New York-ului!
2. Inițial programul s-a numit Oak, având ca inspirație stejarul din fața biroului lui James Gosling de la Sun
Microsystems.
3. Java este downloadat de 1 miliard de ori pe an!
4. Ziua de naștere a limbajului Java este 23 mai 1995. Anume atunci a avut loc lansarea oficială a Java 1.0.
5. Indicele TIOBE, care măsoară popularitatea limbajelor de programare, clasează în mod constant Java
printre cele mai importante limbaje de programare.

Surse:
1. Emanuela Cerchez, Marinel Șerban, Programarea în limbajul C/C++ pentru liceu,
Programarea Orientată spre Obiecte și programarea generică cu STL, Polirom, 2013, pag.
12

Succes!

musteata.victoria@ceiti.md 8 ©Musteață Victoria

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