This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:design-avansat-de-clase [2025/10/13 22:25] florian_luis.micu [Cuvântul cheie this] |
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 758: | Line 759: | ||
<code java> | <code java> | ||
class PropertiesExample { | class PropertiesExample { | ||
- | String myString; | + | private String myString; |
- | String getMyString() { | + | public String getMyString() { |
return myString; | return myString; | ||
} | } | ||
- | void setMyString(String myString) { | + | public void setMyString(String myString) { |
this.myString = myString; | this.myString = myString; | ||
} | } | ||
Line 775: | Line 776: | ||
PropertiesExample pe = new PropertiesExample(); | PropertiesExample pe = new PropertiesExample(); | ||
- | pe.setMyString("This is my string!"); | + | pe.myString = "This is bad"; // nu funcționează pentru că este "private" |
+ | |||
+ | pe.setMyString("This is my string!"); // funcționează | ||
System.out.println(pe.getMyString()); | System.out.println(pe.getMyString()); | ||
Line 931: | 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 965: | 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 1044: | 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 1052: | 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 1093: | 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 1124: | 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; | ||
} | } | ||
} | } |