This shows you the differences between two versions of the page.
|
poo-ca-cd:laboratoare:obiecte-in-java [2025/10/15 04:09] florian_luis.micu [Alocarea memoriei în Heap] |
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 885: | Line 886: | ||
| <note tip> | <note tip> | ||
| - | Dacă rulați în **debug mode** codul de mai sus veți observa că obiectul ''s'' primește o adresa de forma ''NumeClasă@ID'' (de exemplu în diagramă adresa este ''Student@413''). Această adresă este creată doar dacă se face alocarea de memorie cu ''new'', dacă referința avea valoarea ''null'' nu am fi avut o adresă asociată. | + | 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> | </note> | ||
| Line 1111: | 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 1193: | 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 1338: | 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 1387: | 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]] | ||