This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:design-avansat-de-clase [2025/10/13 22:30] florian_luis.micu [Proprietăți] |
poo-ca-cd:laboratoare:design-avansat-de-clase [2025/10/13 22:40] (current) florian_luis.micu [Laboratorul 2: Obiecte în Java] |
||
---|---|---|---|
Line 3: | Line 3: | ||
* Autori: [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]], [[stefancocioran@gmail.com | Ștefan Cocioran ]] | * Autori: [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]], [[stefancocioran@gmail.com | Ștefan Cocioran ]] | ||
* Data publicării: 13.10.2025 | * Data publicării: 13.10.2025 | ||
- | * Data ultimei modificări: 13.10.2025 | + | * Data ultimei modificări: 14.10.2025 |
+ | * reordonarea secțiunilor, mutarea anumitor concepte în [Nice to know] și refrazări. | ||
===== Obiective ===== | ===== Obiective ===== | ||
Line 933: | Line 934: | ||
==== Alocarea memoriei în Heap ==== | ==== Alocarea memoriei în Heap ==== | ||
- | Obiectele în Java sunt stocate în **heap**, o zonă de memorie dedicată alocărilor dinamice. | + | Obiectele în Java sunt stocate în **Heap**, o zonă de memorie dedicată alocărilor dinamice. Pentru a crea un obiect, folosim operatorul ''new''. |
- | Pentru a crea un obiect, folosim operatorul ''new'', care: | + | |
- | + | ||
- | * alocă spațiu în memoria heap; | + | |
- | * apelează constructorul clasei; | + | |
- | * returnează o **referință** către noul obiect, care este stocată pe stack. | + | |
<code java Student.java> | <code java Student.java> | ||
Line 967: | Line 963: | ||
În exemplul de mai sus: | În exemplul de mai sus: | ||
- | * referința ''st'' este pe **stack**; | + | * referința ''st'' este pe **Stack**; |
- | * obiectul ''Student'' este alocat pe **heap**; | + | * obiectul ''Student'' este alocat pe **Heap**; |
* adresa obiectului din heap este copiată în referința ''st''. | * adresa obiectului din heap este copiată în referința ''st''. | ||
{{:poo-ca-cd:laboratoare:obiecte-in-java:stack_and_heap_vars.png?nolink&750|}} | {{:poo-ca-cd:laboratoare:obiecte-in-java:stack_and_heap_vars.png?nolink&750|}} | ||
- | Când metoda în care a fost creat obiectul se termină, referința ''st'' dispare, dar obiectul rămâne în heap până când **Garbage Collector-ul** decide că nu mai este utilizat. | + | Când metoda în care a fost creat obiectul se termină, referința ''st'' dispare, dar obiectul rămâne în Heap până când **Garbage Collector-ul** decide că nu mai este utilizat (când numărul de referințe către acea zonă din Heap ajunge la 0). |
- | + | ||
- | <note tip> | + | |
- | Heap-ul este gestionat **automat** de JVM prin Garbage Collector, programatorul nu trebuie să elibereze manual memoria. | + | |
- | </note> | + | |
Line 1046: | Line 1038: | ||
</spoiler> | </spoiler> | ||
- | După cum se poate observa, ''a1'' și ''a2'' vor funcționa ca entități independente una de cealaltă, astfel că modificarea câmpului ''mass'' din ''a1'' nu va avea nici un efect implicit și automat în ''a2''. Există totuși situații când dorim să creăm câmpuri care să fie partajate și să nu fie memorate separat pentru fiecare instanță. | + | După cum se poate observa, ''a1'' și ''a2'' vor funcționa ca entități independente una de cealaltă, astfel că modificarea câmpului ''mass'' din ''a1'' nu va avea nici un efect implicit și automat în ''a2''. |
Membrii statici **nu aparțin unei instanțe** anume, ci **clasei** în sine. Aceștia sunt împărtășiți de-a lungul tuturor obiectelor create din acea clasă și pot să fie accesate **fără** să se creeze o instanță, având o locație specială în memorie (diferită de Heap și Stack). | Membrii statici **nu aparțin unei instanțe** anume, ci **clasei** în sine. Aceștia sunt împărtășiți de-a lungul tuturor obiectelor create din acea clasă și pot să fie accesate **fără** să se creeze o instanță, având o locație specială în memorie (diferită de Heap și Stack). | ||
Line 1054: | Line 1046: | ||
Când declarați o variabilă sau o metodă înăuntrul unei clase: | Când declarați o variabilă sau o metodă înăuntrul unei clase: | ||
* **Membrii instanței**: aparțin doar obiectului instanțiat. (ex. ''a1.mass'' și ''a2.mass'' pot avea valori diferite). | * **Membrii instanței**: aparțin doar obiectului instanțiat. (ex. ''a1.mass'' și ''a2.mass'' pot avea valori diferite). | ||
- | * **Membrii statici**: aparțin clasei și sunt împărtășiți de către toate obiectele (ex. toate merele pot avea aceeași constantă gravitațională). | + | * **Membrii statici**: aparțin clasei și sunt împărtășiți de către toate obiectele (ex. toate merele pot avea aceeași constantă gravitațională ''gravAcc''). |
^Tip^Apartenență^Accesat prin^Cum este valoarea reținută în memorie^ | ^Tip^Apartenență^Accesat prin^Cum este valoarea reținută în memorie^ | ||
Line 1095: | Line 1087: | ||
</spoiler> | </spoiler> | ||
- | <note tip> | ||
- | Folosiți variabile statice pentru a avea **configurații împărtășite** sau **constante la nivel de clase**, nu pentru a stoca date per obiect. | ||
- | </note> | ||
====Accesarea membrilor statici==== | ====Accesarea membrilor statici==== | ||
Line 1126: | Line 1115: | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
float g = Apple.gravAcc; | float g = Apple.gravAcc; | ||
+ | | ||
+ | // Corect, dar nepreferat | ||
+ | Apple a1 = new Apple(); | ||
+ | float g = a1.gravAcc; | ||
} | } | ||
} | } |