Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:design-avansat-de-clase [2025/10/19 23:26]
florian_luis.micu [🗄️ [Optional] Gestionarea memoriei în Java la nivel de memorie]
poo-ca-cd:laboratoare:design-avansat-de-clase [2025/10/25 19:50] (current)
florian_luis.micu [Laboratorul 3: Design Avansat de Clase]
Line 1: Line 1:
 ====== Laboratorul 3: Design Avansat de Clase ====== ====== Laboratorul 3: Design Avansat de Clase ======
  
-  * Autori: [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]], [[stefancocioran@gmail.com | Ștefan Cocioran ​]]+  * Autori: [[stefancocioran@gmail.com | Ștefan Cocioran ​]], [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]]
   * Data publicării:​ 20.10.2025   * Data publicării:​ 20.10.2025
-  * Data ultimei modificări: ​20.10.2025+  * Data ultimei modificări: ​25.10.2025 
 +    * clarificări pentru gestionarea memoriei statice și VTables.  
 +    * schimbat tipul de return în Lazy Evaluation. 
 +    * clarificări pentru specificatorii de acces în contextul moștenirii.
  
 =====Obiective===== =====Obiective=====
Line 72: Line 75:
    ​private Engine engine;    ​private Engine engine;
        
-   ​public ​void initializeEngine() {+   ​public ​Engine ​initializeEngine() {
       if (engine == null) {       if (engine == null) {
          ​engine = new Engine();          ​engine = new Engine();
Line 286: Line 289:
 ===Blocarea accesului la membrii folosind specificatori de acces=== ===Blocarea accesului la membrii folosind specificatori de acces===
  
-Reamintim **specificatorii de acces** prezentați în laboratorul trecut în contextul ​**moștenirii membrilor**:​ +Reamintim **specificatorii de acces** prezentați în laboratorul trecut ​**în contextul moștenirii membrilor**:​ 
-  * **public**: câmpul/​metoda poate fi accesată de oriundeinclusiv din clasele derivate. + 
-  * **protected/​default**:​ câmpul/​metoda poate fi accesată în clasa proprie sau în clasele derivate. +^ ^Default^Private^Protected^Public^ 
-  * **private**:​ câmpul/​metoda poate fi accesată doar în clasa proprie.+^Aceeași clasă|Da|Da|Da|Da| 
 +^Același pachetsubclasă|Da|Nu|Da|Da| 
 +^Același pachet, non-subclasă|Da|Nu|Da|Da| 
 +^Pachet diferit, subclasă|Nu|Nu|Da|Da| 
 +^Pachet diferit, non-subclasă|Nu|Nu|Nu|Da|
  
 ===Moștenirea constructorilor=== ===Moștenirea constructorilor===
Line 423: Line 430:
 | Expunerea metodei ​        | doar obiectul conținut ​               | toate metodele părintelui ​                 | | Expunerea metodei ​        | doar obiectul conținut ​               | toate metodele părintelui ​                 |
 | Control asupra obiectului | containerul folosește obiectul extern | copilul extinde comportamentele părintelui | | Control asupra obiectului | containerul folosește obiectul extern | copilul extinde comportamentele părintelui |
-| Exemplu ​                  | Car **has a**n Engine ​                 | Dog **is a** Animal ​                       |+| Exemplu ​                  | Car **has a**n Engine ​                 | Dog **is a**Animal ​                       |
  
 În general, întrebarea ''​has-a''​ sau ''​is-a''​ este suficientă pentru a determina tipul de relație, însă există obiecte pentru care relația nu poate fi stabilită ușor folosind această întrebare. ​ În general, întrebarea ''​has-a''​ sau ''​is-a''​ este suficientă pentru a determina tipul de relație, însă există obiecte pentru care relația nu poate fi stabilită ușor folosind această întrebare. ​
Line 716: Line 723:
 </​note>​ </​note>​
  
-Pentru mai multe detalii despre supraîncărcare reluați [[poo-ca-cd:​laboratoare:​obiecte-in-java|laboratorul 2]] sau vizionați imaginea de mai jos.+Pentru mai multe detalii despre supraîncărcare reluați [[poo-ca-cd:​laboratoare:​obiecte-in-java|laboratorul 2]] sau consultați imaginea de mai jos.
  
 ===TL;DR Overriding & Overloading=== ===TL;DR Overriding & Overloading===
Line 796: Line 803:
   * Puteți scrie și ''​st1.toString()'',​ doar că nu este recomandat din motive de lizibilitate.   * Puteți scrie și ''​st1.toString()'',​ doar că nu este recomandat din motive de lizibilitate.
   * Dacă nu definim un comportament specific pentru metoda ''​toString()'',​ se va printa adresa obiectului în memorie (pentru clasa Student am avea o adresă de tipul ''​Student@412''​).   * Dacă nu definim un comportament specific pentru metoda ''​toString()'',​ se va printa adresa obiectului în memorie (pentru clasa Student am avea o adresă de tipul ''​Student@412''​).
 +</​note>​
 +
 +<note tip>
 +Puteți folosi IntelliJ pentru generarea metodei ''​toString()'':​ click dreapta oriunde în cod -> ''​Generate...''​ -> ''​toString()''​ -> alegeți câmpurile care doriți să fie printate.
 </​note>​ </​note>​
  
Line 891: Line 902:
  
 <note tip> <note tip>
-Întotdeauna când doriți **să comparați două String-uri** folosiți metoda //equals//, deoarece și String este un obiect. Pentru primitive este **în regulă** să folosiți operatorul ''​==''​.+  * Întotdeauna când doriți **să comparați două String-uri** folosiți metoda //equals//, deoarece și String este un obiect. Pentru primitive este **în regulă** să folosiți operatorul ''​==''​
 +  * Puteți folosi **IntelliJ** pentru **generarea** metodei ''​equals(Object o)'':​ click dreapta oriunde în cod -> ''​Generate...''​ -> ''​equals() and hashSet()''​ -> alegeți getClass sau instanceof (nu este relevant) -> alegeți câmpurile folosite pentru egalitate. 
 +    * Puteți ignora momentan metoda //hashSet// care este generată.
 </​note>​ </​note>​
  
Line 1006: Line 1019:
 </​code>​ </​code>​
  
-Când se încarcă clasele, JVM construiește două **VTables** în **Metaspace**:​+Când se încarcă clasele, JVM construiește două **VTables** în **Metaspace**, doar pentru **metodele non-statice**:
  
 <code bash> ​ <code bash> ​
 Animal vtable: ​ Animal vtable: ​
 - makeSound() -> Animal.makeSound ​ - makeSound() -> Animal.makeSound ​
-- static info() -> Animal.info 
  
 Dog vtable: Dog vtable:
 - makeSound() -> Dog.makeSound (override) - makeSound() -> Dog.makeSound (override)
-- static info() -> Dog.info 
- 
 </​code>​ </​code>​
 +
 +<note tip>
 +VTable există doar pentru **metode virtuale (non-static)**. Metodele statice nu sunt incluse în VTable pentru a nu folosi mecanismul de suprascriere.
 +</​note>​
 +
  
 ====Legătura cu Upcasting & Downcasting==== ====Legătura cu Upcasting & Downcasting====
Line 1033: Line 1048:
 Dog.info(); // apelează Dog.info() din Metaspace Dog.info(); // apelează Dog.info() din Metaspace
 </​code>​ </​code>​
 +
 +====De ce metodele statice nu pot fi suprascrise====
 +
 +^ Caracteristică ​    ^ Metode de instanță ^ Metode ''​static'' ​                    ^
 +| Rezolvare ​         | runtime (dinamic) ​ | compile-time (static binding) ​      |
 +| Instrucțiune JVM   | ''​invokevirtual'' ​   | ''​invokestatic'' ​                     |
 +| Depind de instanță | Da               | Nu                                |
 +| Apar în VTable ​    | Da               | Nu                                |
 +| Pot fi suprascrise | Da               | Nu, doar ascunse (method hiding) |
 +
 +Metodele ''​static''​ aparțin clasei, nu obiectelor, deci JVM nu are motiv să le caute într-un VTable la runtime. Ele sunt apelate direct prin numele clasei, nu prin instanță.
 +
 +<note tip>
 +Instrucțiunile ''​invokevirtual''​ și ''​invokestatic''​ sunt instrucțiuni din bytecode-ul de Java folosite pentru a rezolva și apela metodele corecte.
 +</​note>​
 +
 +===Rolul constant Pool===
 +
 +Apelurile către metode ''​static''​ sunt rezolvate folosind **Constant Pool**, o zonă de memorie care se află tot în Metaspace și care este asociată fiecărei clase care conține **referințe simbolice** către metode, câmpuri și clase.
 +
 +  * Intrările din **Constant Pool** sunt folosite pentru a localiza metodele ''​static''​ în Metaspace, unde este stocată logica clasei.
 +  * La apel, ''​invokestatic''​ citește adresa metodei direct din Constant Pool, fără polimorfism,​ fără VTable.
 +
 +<note tip>
 +  * Constant Pool-ul **optimizează memoria** adresând duplicarea constantelor și a String-urilor (mai multe despre String în următoarele laboratoare). Totodată, această optimizare ajută și la **performanță**.
 +  * Ideal, am stoca cât mai multe informații în Constant Pool, însă putem stoca doar **constante** (variabile constante, nume de clasă, nume de metodă, semnături, referințe simbolice etc.).
 +  * Memoria statică efectivă este stocată în **Metaspace**,​ dar referința simbolică folosită de ''​invokestatic''​ este stocată în **Constant Pool**.
 +</​note>​
  
 ====Rezumat al memoriei în Java==== ====Rezumat al memoriei în Java====
Line 1039: Line 1082:
   * Stack = ține referințele către ele.   * Stack = ține referințele către ele.
   * Metaspace = știe ce este fiecare obiect, ce metode are, inclusiv variabile și metode statice, prin vtables.   * Metaspace = știe ce este fiecare obiect, ce metode are, inclusiv variabile și metode statice, prin vtables.
 +  * Constant Pool = stocat tot în Metaspace; conține literaluri, referințe simbolice către clase, metode și câmpuri, folosit de JVM pentru rezoluție dinamică și apeluri de metode.
   * Upcasting-ul funcționează fără probleme pentru că JVM știe din Metaspace ce este obiectul real.   * Upcasting-ul funcționează fără probleme pentru că JVM știe din Metaspace ce este obiectul real.
   * Downcasting-ul se verifică la runtime tot cu ajutorul informațiilor din Metaspace.   * Downcasting-ul se verifică la runtime tot cu ajutorul informațiilor din Metaspace.
Line 1144: Line 1188:
  
 ===== Resurse și link-uri utile ===== ===== Resurse și link-uri utile =====
-  * [[https://​www.visual-paradigm.com/​guide/​uml-unified-modeling-language/​uml-class-diagram-tutorial/​ | UML Diagrams]] ​+  * [[https://​www.visual-paradigm.com/​guide/​uml-unified-modeling-language/​uml-class-diagram-tutorial/​ | UML Diagrams ​(class relations)]] 
   * [[https://​www.visual-paradigm.com/​guide/​uml-unified-modeling-language/​uml-aggregation-vs-composition/​ | Aggregation vs Composition]]   * [[https://​www.visual-paradigm.com/​guide/​uml-unified-modeling-language/​uml-aggregation-vs-composition/​ | Aggregation vs Composition]]
   * [[http://​docs.oracle.com/​javase/​tutorial/​java/​IandI/​subclasses.html | Inheritance JavaDoc]]   * [[http://​docs.oracle.com/​javase/​tutorial/​java/​IandI/​subclasses.html | Inheritance JavaDoc]]
poo-ca-cd/laboratoare/design-avansat-de-clase.1760905570.txt.gz · Last modified: 2025/10/19 23:26 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