Se afișează postările cu eticheta poo. Afișați toate postările
Se afișează postările cu eticheta poo. Afișați toate postările

marți, 27 ianuarie 2026

Membri de instanță

MEMBRI DE INSTANȚĂ sunt membrii clasei declarați FĂRĂ cuvântul cheie static. Sunt asociate obiectelor. Aceștia definesc starea și comportamentul specific al fiecărei instanțe a unei clase. Sunt utilizați pentru a reprezenta date și operații care depind de particularitățile fiecărui obiect individual. Pentru a putea fi accesate este nevoie de a avea create obiectele în prealabil, adică de a avea clasa instanțiată.
a) Variabile de instanță. 
Pentru așa tip de variabile sistemul alocă spațiu de memorie pentru fiecare în parte. Fiecare instanță are valoarea sa pentru un membru al clasei din care fac parte. Sunt stocate în Stivă.

b) Metode de instanță. 
Lucrează direct atât cu variabile statice cât și cu cele nestatice în corpul lor. Metodele de instanță pot fi apelate cu ajutorul unei instanțe a clasei respective:

MyClass.metodaDeInstanta(); // ilegal 

MyClass obj = new MyClass();
obj.metodaDeInstanta(); // legal

c) Blocuri de inițializare de instanță. 
Blocurile de inițializare de instanță sunt utilizate pentru a inițializa variabilele de instanță înainte ca oricare metoda să fie apelată pe instanța respectivă. Aceste blocuri nu conțin cuvântul cheie static.






Membri de clasă

MEMBRI DE CLASA sunt membrii declarați cu ajutorul cuvântului cheie static. Fiind aplicat la diverse elemente, le face asociate cu clasa în loc de o instanță specifică a acelei clase. Datorită acestui fapt, puteți utiliza numele clasei pentru a face referire la un câmp static (variabilă statică) sau pentru a apela o metodă statică, fără a fi necesitate de a instanția clasa în acest sens.

Iată câteva elemente care pot fi marcate ca fiind statice:

a) Variabile statice.
Sunt folosite atunci când avem nevoie ca variabilele clasei să fie partajate de toate instanţele clasei. Sunt stocate în Heap. De obicei sunt constante simbolice. Pentru aşa tip de variabile sistemul aloca o singura zonă de memorie, la care au acces toate instanţele clasei respective. Nu vom putea avea pentru fiecare instanţă a clasei valoarea ei proprie pentru o astfel de variabila. Dacă o instanţă va modifica valoarea unei variabile statice aceasta valoare se va modifica pentru toate instanţele.

b) Metode statice. 
Sunt accesate fară o instanţiere a clasei respective:

DenumireClasa.metodaStatica();  //legal

<=>

MyClass obj = new MyClass();
obj.metodaStatica(); //legal, dar NU este recomandat


Este legal să apelați o metodă statică folosind un obiect în Java, dar este considerat o practică nepotrivită și este recomandat să evitați acest lucru. De obicei, metodele statice sunt apelate pe clasa în sine, nu pe o instanță specifică a clasei. Acest lucru se datorează faptului că metodele statice NU au acces la variabilele de instanță și nu sunt legate de o anumită instanță a clasei.
Din corpul unei metode statice nu pot fi apelați membri de instanță:


Pot utiliza variabile statice declarate în clasa respectivă:

Deoarece metodele statice nu aparțin unui obiect anumit asupra lor nu putem folosi cuvântul cheie
this:
Orice metodă statică este implicit şi finală.

c) Blocuri de inițializare statice.

Un bloc de inițializare este un bloc de cod definit între { și }, asemănător cu blocuri/corpuri de metode, principala diferență fiind, blocurile de inițializare nu au un nume. Ele sunt ca metodele, însă fără antet/header (tip returnat, nume metoda, lista de parametri). Deoarece în Java nu există cod înafara clasei, blocurile de inițializare vor fi la rândul lor definite în interiorul unei clase.

Blocurile de inițializare statice sunt blocuri de cod care sunt executate DOAR O DATA atunci când clasa este încărcată de Java Virtual Machine. Aceste tipuri de blocuri de inițializare sunt utile pentru inițializarea atributelor statice din clase sau pentru a efectua o singura data un set de prelucrări. Blocurile statice de inițializare pot accesa DOAR atributele statice ale clasei în care sunt definite. NU se pot folosi variabile de instanță în blocuri de inițializare statice. Dacă încercați să faceți acest lucru veți primi o eroare de compilare: non-static variable value cannot be referenced from a static context).
Dacă nu declarați un astfel de bloc, Java colectează toate câmpurile statice într-o singură listă și le inițializează atunci când clasa este încărcată.

Se poate defini atât de multe blocuri de inițializare (statice sau nu) de câte este nevoie, dar trebuie sa se acorde atenție ordinii lor de definire, deoarece aceasta este și ordinea lor de execuție!

d) Clase interne statice (static inner classes). 
O clasă statică internă este o clasă definită în interiorul altei clase, iar aceasta este declarată ca fiind statică. Ea nu are acces la membrii non-statice ai clasei exterioare. 

public class Exemplu {
static class ClasaStaticaIncorporata {
// Codul clasei încorporate statice
}
}

e) Variabile statice finale. 
Sunt de fapt constante. Pentru a fi accesate nu va fi necesar de instanțiat clasa.

f) Importuri statice. 
În Java, puteți importa membrii statici ai unei clase atunci când nu doriți să utilizați numele clasei în mod repetat.



duminică, 7 septembrie 2025

Principiile Programării Orientate spre Obiecte

Principiul Abstractizării

  • Este 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.

Principiul Moștenirii
  • Oferă posibilitatea de a proiecta noi clase folosind clase deja existente;
  • Clasa derivată moștenește variabilele și metodele clasei de bază;
  • Permite reutilizarea codului;
  • În Java o clasă nu poate extinde (moșteni) direct mai multe clase.
Principiul polimorfismului
  • 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ă”
Principiul Încapsulării
  • 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.

Programarea Orientată spre Obiecte


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

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;
  • 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.
Fiecare obiect are proprietăți (ce sau cum sunt) și acțiuni (ce pot face) și poate interacționa cu alte obiecte.


Dacă ar fi să facem o analogie cu lumea reală, atunci:

  • Obiect = un obiect din viața reală: elev, mașină, telefon
  • Proprietăți = caracteristici ale obiectului: culoare, vârstă, model
  • Acțiuni = ce poate face obiectul: merge, învață, sună


Proprietățile și acțiunile obiectelor sunt definite în clase.


Despre clase vom discuta în următoarele postări!


Succes!

❤️

sâmbătă, 13 ianuarie 2024

Bibliografie

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

D.Danciu, G.Mardale - Arta programării în JAVA (Vol. I), Editura Albastra 2004

C. Frăsinaru, Curs practic de Java, București, Ed. Matrix Rom, București 2000

Ștefan Tanasă, Cristian Olaru, Ștefan Andrei, Java de la 0 la Expert 

B. Eckel, Thinking in Java, Prentice Hall (4-th Edition), 2006

Y. Daniel Liang, Introduction.To.Java.Programming.10th.Edition