Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:obiecte-in-java [2025/10/15 03:56]
florian_luis.micu [Alocarea memoriei pe Stack]
poo-ca-cd:laboratoare:obiecte-in-java [2025/10/15 04:36] (current)
florian_luis.micu [Metode statice]
Line 5: Line 5:
   * Data ultimei modificări:​ 14.10.2025   * Data ultimei modificări:​ 14.10.2025
     * reordonarea secțiunilor,​ mutarea anumitor concepte în [Nice to know] și refrazări.     * reordonarea secțiunilor,​ mutarea anumitor concepte în [Nice to know] și refrazări.
-    * tipurile wrapper au fost mutate în laboratoarele următoare. ​ +    * tipurile wrapper au fost mutate în laboratoarele următoare. 
 +    * diagrama despre alocarea memoriei în Heap a fost revizuită. ​
  
 ===== Obiective ===== ===== Obiective =====
Line 376: Line 377:
 ====Crearea obiectelor==== ====Crearea obiectelor====
  
-===Constructorii===+===Constructori===
  
 Un constructor este o metodă specială care: Un constructor este o metodă specială care:
Line 559: Line 560:
 </​note>​ </​note>​
  
-Metoda finalize() este apelată de Garbage Collector **înainte** ca obiectul să fie distrus, dar **nu se recomandă** folosirea ei, deoarece:+Metoda ​''​finalize()'' ​este apelată de Garbage Collector **înainte** ca obiectul să fie distrus, dar **nu se recomandă** folosirea ei, deoarece:
   * momentul apelului nu este garantat;   * momentul apelului nu este garantat;
   * afectează performanța;​   * afectează performanța;​
-  * în versiunile moderne de Java, finalize() este deprecated.+  * în versiunile moderne de Java, ''​finalize()'' ​este deprecated.
  
 În practică, curățarea resurselor (fișiere, conexiuni etc.) se face explicit, folosind practici recomandate pe care le vom studia în laboratoarele următoare. În practică, curățarea resurselor (fișiere, conexiuni etc.) se face explicit, folosind practici recomandate pe care le vom studia în laboratoarele următoare.
Line 748: Line 749:
 ====Proprietăți==== ​ ====Proprietăți==== ​
   ​   ​
-În secțiunile de mai sus am menționat că o clasă poate conține și **proprietăți**. O proprietate este un **câmp** (membru) căruia i se atașează **două metode** ce îi pot expune sau modifica starea. Aceste doua metode se numesc ''​getter''​ si ''​setter''​.+În secțiunile de mai sus am menționat că o clasă poate conține și **proprietăți**. O proprietate este un **câmp** (membru) căruia i se atașează **două metode** ce îi pot expune sau modifica starea. Aceste doua metode se numesc ''​getter''​ si ''​setter'' ​și sunt în general folosite pentru a **expune** un câmp privat.
   ​   ​
 <code java> ​ <code java> ​
Line 834: Line 835:
 public void test() { public void test() {
     int x = 10; // stocat pe stack     int x = 10; // stocat pe stack
-    Student s = null;  // referință ​către un obiect ​Student cu valoarea "​null"​+    Student s = null;  // referință ​de tip Student cu valoarea "​null" ​(neinițializat)
 } }
 </​code>​ </​code>​
Line 871: Line 872:
 <code java> <code java>
 public void test() { public void test() {
-   ​Student ​st = new Student("​Mihai",​ 8);+   ​Student ​= new Student("​Mihai",​ 8);
 } }
 </​code>​ </​code>​
  
 În exemplul de mai sus: În exemplul de mai sus:
-  * referința ''​st''​ este pe **Stack**;+  * referința ''​s''​ 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 ''​s''​.
  
 {{:​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 numărul de referințe către acea zonă din Heap ajunge la 0).+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 (mai exact, ​când numărul de referințe către acea zonă din Heap ajunge la 0). 
 + 
 +<note tip> 
 +Dacă rulați codul de mai sus în **mod debug**, veți observa că obiectul ''​s''​ primește o adresă de forma ''​NumeClasă@ID''​ (de exemplu în diagramă avem ''​Student@413''​). Această adresă apare **numai** atunci când obiectul este creat cu ''​new'';​ dacă variabila ar avea valoarea ''​null'',​ nu ar exista nicio adresă asociată. 
 +</​note>​
  
  
Line 1107: Line 1112:
 <note tip> <note tip>
 Variabilele statice **pot** fi accesate în constructori,​ întrucât sunt inițializate odată cu încărcarea clasei. Variabilele statice **pot** fi accesate în constructori,​ întrucât sunt inițializate odată cu încărcarea clasei.
 +</​note>​
 +
 +
 +
 +
 +
 +====Metode statice====
 +
 +O **metodă statică** este o metodă care aparține clasei și poate fi apelată **fără a crea un obiect** al clasei, având acces doar la membri statici.
 +
 +<code java>
 +class Apple {
 +    public static final int SMALL = 0, MEDIUM = 1, LARGE = 2;
 +    ​
 +    public int size;
 +
 +    // Funcționează
 +    public static String[] getAppleSizes() {
 +       ​return new String[] { "​SMALL",​ "​MEDIUM",​ "​LARGE"​ };
 +    }
 +    ​
 +    // Eroare, "​size"​ nu este static
 +    public static int getSize() {
 +       ​return size;
 +    }
 +}
 +</​code>​
 +
 +<note important>​
 +  * Metodele statice pot accesa doar **variabile statice**, deoarece membrii statici sunt inițializați **înainte de crearea instanțelor**. Astfel, o variabilă care aparține instanței, cum este ''​size'',​ nu ar fi încă inițializată în momentul în care metoda statică ''​getSize()''​ este apelată.
 +  * În **metodele sau blocurile statice**, cuvântul cheie ''​this''​ nu poate fi folosit, deoarece el face referire la **instanța curentă a clasei**. În momentul în care codul static este executat, **nu există** încă niciun obiect creat, deci nu există nicio instanță la care ''​this''​ să se refere.
 +</​note>​
 +
 +===== =====
 +
 +<note tip>
 +  * Folosiți ''​static''​ pentru **constante**,​ **contoare**,​ **configurații globale** sau **metode utilitare** (ex. ''​Math.sqrt()''​). Puteți găsi câteva exemple concrete în secțiunea **[Nice to know]** de mai jos. 
 +  * Nu folosiți foarte des ''​static'',​ deoarece poate strica **încapsularea** ceea ce va face codul mai greu de testat.
 </​note>​ </​note>​
  
Line 1189: Line 1232:
 </​code>​ </​code>​
 </​spoiler>​ </​spoiler>​
- 
-<note tip> 
-Folosiți ''​static''​ pentru **constante**,​ **contoare**,​ **configurații globale** sau **metode utilitare** (ex. ''​Math.sqrt()''​). Nu folosiți foarte des ''​static'',​ deoarece poate strica **încapsularea** ceea ce va face codul mai greu de testat. 
-</​note>​ 
- 
-<note important>​ 
-În metode sau blocuri statice, ''​this''​ **nu poate fi folosit**, deoarece ''​this''​ se referă la **instanța curentă a clasei**, iar la momentul executării codului static **niciun obiect nu există**. 
-</​note>​ 
- 
-====Metode statice==== 
- 
-O **metodă statică** este o metodă care aparține clasei și poate fi apelată **fără a crea un obiect** al clasei, având acces doar la membri statici. 
- 
-<code java> 
-class Apple { 
-    public static final int SMALL = 0, MEDIUM = 1, LARGE = 2; 
-    ​ 
-    public int size; 
- 
-    // Funcționează 
-    public static String[] getAppleSizes() { 
-       ​return new String[] { "​SMALL",​ "​MEDIUM",​ "​LARGE"​ }; 
-    } 
-    ​ 
-    // Eroare, "​size"​ nu este static 
-    public static int getSize() { 
-       ​return size; 
-    } 
-} 
-</​code>​ 
- 
-<note tip> 
-Metodele statice pot accesa doar **variabile statice**, deoarece membrii statici sunt inițializați **înainte de crearea instanțelor**. Astfel, o variabilă care aparține instanței, cum este ''​size'',​ nu ar fi încă inițializată în momentul în care metoda statică ''​getSize()''​ este apelată. 
-</​note>​ 
  
 <​hidden>​ <​hidden>​
Line 1334: Line 1343:
 <note warning> <note warning>
   * Exercițiile vor fi făcute pe platforma [[https://​code.devmind.ro/​|Devmind Code]]. Găsiți exercițiile din acest laborator în **contestul aferent**.   * Exercițiile vor fi făcute pe platforma [[https://​code.devmind.ro/​|Devmind Code]]. Găsiți exercițiile din acest laborator în **contestul aferent**.
-  * Vă recomandăm să faceți exercițiile **mai întâi** în IntelliJ, deoarece acolo aveți acces la o serie de **instrumente** specifice unui IDE. După ce ați terminat exercițiile puteți să le **copiați** pe Devmind Code.+  * Vă recomandăm ​să copiați scheletul și să faceți exercițiile **mai întâi** în IntelliJ, deoarece acolo aveți acces la o serie de **instrumente** specifice unui IDE. După ce ați terminat exercițiile puteți să le **copiați** pe Devmind Code.
 </​note>​ </​note>​
  
Line 1383: Line 1392:
   * completați metoda showData() pentru a afisa contul unei persoane sub forma: "​Titular [NUME] are in cont [SUMA] RON si o dobanda de [dobanda]."​   * completați metoda showData() pentru a afisa contul unei persoane sub forma: "​Titular [NUME] are in cont [SUMA] RON si o dobanda de [dobanda]."​
  
-===== Referințe ​=====+===== Resurse și link-uri utile =====
  
   * [[http://​docs.oracle.com/​javase/​tutorial/​java/​javaOO/​constructors.html| Constructors in Java]]   * [[http://​docs.oracle.com/​javase/​tutorial/​java/​javaOO/​constructors.html| Constructors in Java]]
poo-ca-cd/laboratoare/obiecte-in-java.1760489765.txt.gz · Last modified: 2025/10/15 03:56 by florian_luis.micu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0