User Tools

Site Tools


Problem constructing authldap
laboratoare:constructori-referinte
Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
laboratoare:constructori-referinte [2017/10/06 13:30]
laurentiu.piciu
laboratoare:constructori-referinte [2019/01/06 17:19]
Laurentiu Stamate [Resurse]
Line 1: Line 1:
 = Constructori și referințe = = Constructori și referințe =
- 
-* Responsabil:​ Miruna Barbu, Theodor Stoican 
-* Data publicării:​ 15.10.2016 
-* Data ultimei modificări:​ 15.10.2016 
- 
 == Obiective == == Obiective ==
  
Line 26: Line 21:
    ...    ...
 } }
 +
 ... ...
 +
 +MyClass instanceObject;​
 +
 // constructor call // constructor call
 instanceObject = new MyClass(param_1,​ param_2, ..., param_n); ​ instanceObject = new MyClass(param_1,​ param_2, ..., param_n); ​
Line 66: Line 65:
         return name;         return name;
     }     }
- 
 } }
  
Line 75: Line 73:
         System.out.println(instance.getName());​         System.out.println(instance.getName());​
     }     }
- 
 } }
 </​code>​ </​code>​
Line 121: Line 118:
         return name;          return name; 
     }     }
- 
 } }
 </​code>​ </​code>​
Line 158: Line 154:
         Student s = new Student();         Student s = new Student();
     }     }
- 
 } }
 </​code>​ </​code>​
Line 164: Line 159:
 == Referințe. Implicații în transferul de parametri == == Referințe. Implicații în transferul de parametri ==
   ​   ​
-După cum știți din [[laboratoare:​java-basics|laboratorul 1]], obictele ​se alocă pe ''​heap''​. Pentru ca un obiect să poată fi folosit, este necesară cunoașterea adresei lui. Această adresă, așa cum știm din limbajul C, se reține într-un **pointer**.+Obiectele ​se alocă pe ''​heap''​. Pentru ca un obiect să poată fi folosit, este necesară cunoașterea adresei lui. Această adresă, așa cum știm din limbajul C, se reține într-un **pointer**.
  
 Limbajul Java nu permite lucrul direct cu pointeri, deoarece s-a considerat că această facilitate introduce o complexitate prea mare, de care programatorul poate fi scutit. Totuși, în Java există noțiunea de **referinţe** care înlocuiesc pointerii, oferind un mecanism de gestiune transparent. ​ Limbajul Java nu permite lucrul direct cu pointeri, deoarece s-a considerat că această facilitate introduce o complexitate prea mare, de care programatorul poate fi scutit. Totuși, în Java există noțiunea de **referinţe** care înlocuiesc pointerii, oferind un mecanism de gestiune transparent. ​
Line 215: Line 210:
     public static void main(String[] args) {     public static void main(String[] args) {
         Student s = new Student("​Alice",​ 5);         Student s = new Student("​Alice",​ 5);
-        changeReference(s); ​                // 1 +        changeReference(s); ​                // ​apel (1) 
-        System.out.println(s.getName()); ​   // 1'+        System.out.println(s.getName()); ​   // "​Alice"​
  
-        changeObject(s); ​                   // 2 +        changeObject(s); ​                   // apel (2) 
-        System.out.println(s.averageGrade);​ // 2'+        System.out.println(s.averageGrade);​ // "​10"​
     }     }
- 
 } }
 </​code>​ </​code>​
   ​   ​
-Astfel, apelul (1) nu are nici un efect în metoda ''​main''​ pentru că metoda ''​changeReference''​ are ca efect asignarea unei noi valori referinței ''​s'',​ copiată pe stivă. ​Linia (1'​) ​va afișa textul: ''​Alice''​.+Astfel, apelul (1) nu are nici un efect în metoda ''​main''​ pentru că metoda ''​changeReference''​ are ca efect asignarea unei noi valori referinței ''​s'',​ copiată pe stivă. ​Se va afișa textul: ''​Alice''​.
 {{ :​laboratoare:​constructori-referinte:​poza1.png?​600 |}}  {{ :​laboratoare:​constructori-referinte:​poza1.png?​600 |}} 
  
-Apelul (2) metodei ''​changeObject''​ are ca efect modificarea structurii interne a obiectului referit de ''​s''​ prin schimbarea valorii atributului ''​averageGrade''​. ​Linia (2'​) ​va afișa textul: ''​10''​.+Apelul (2) metodei ''​changeObject''​ are ca efect modificarea structurii interne a obiectului referit de ''​s''​ prin schimbarea valorii atributului ''​averageGrade''​. ​Se va afișa textul: ''​10''​.
 {{ :​laboratoare:​constructori-referinte:​poza2.png?​600 |}} {{ :​laboratoare:​constructori-referinte:​poza2.png?​600 |}}
  
Line 245: Line 239:
 Iată un exemplu în care vom extinde clasa ''​Student''​ pentru a cunoaște grupa din care face parte: ​ Iată un exemplu în care vom extinde clasa ''​Student''​ pentru a cunoaște grupa din care face parte: ​
  
-<code java5 Grupa.java>+<code java5 Group.java>
 class Group { class Group {
  
Line 261: Line 255:
             return true;             return true;
         }         }
 +        ​
         return false;         return false;
     }     }
- 
 } }
 </​code>​ </​code>​
Line 279: Line 273:
         this.averageGrade = averageGrade;​         this.averageGrade = averageGrade;​
     }     }
- 
 } }
 </​code>​ </​code>​
Line 301: Line 294:
         this.group = group;         this.group = group;
     }     }
- 
 } }
 </​code>​ </​code>​
Line 312: Line 304:
 String s1 = "​abc";​ String s1 = "​abc";​
  
-String s2 = s.toUpperCase(); ​    // ​does not change; the method returns a reference to a new object which can be accessed using s2 variable +String s2 = s1.toUpperCase(); ​    // ​s1 does not change; the method returns a reference to a new object which can be accessed using s2 variable 
-s.toUpperCase();​ // is now a reference to a new object+s1 s1.toUpperCase();​ // s1 is now a reference to a new object
 </​code>​ </​code>​
 <note tip> <note tip>
Line 372: Line 364:
          ​return hasStaticFields;​          ​return hasStaticFields;​
     }     }
- 
 } }
  
Line 381: Line 372:
         System.out.println(ClassWithStatics.getStaticFields());​         System.out.println(ClassWithStatics.getStaticFields());​
     }     }
- 
 }  ​ }  ​
 </​code>​ </​code>​
Line 392: Line 382:
 </​note>​ </​note>​
  
-  - (**1p**) Să se implementeze o clasă ''​Punct''​ care să conțină: ​+  - (**1p**) Să se implementeze o clasă ''​Point''​ care să conțină: ​
     * un constructor care să primească cele două numere reale (de tip ''​float''​) ce reprezintă coordonatele. ​     * un constructor care să primească cele două numere reale (de tip ''​float''​) ce reprezintă coordonatele. ​
     * o metodă ''​changeCoords''​ ce primește două numere reale și modifică cele două coordonate ale punctului. ​     * o metodă ''​changeCoords''​ ce primește două numere reale și modifică cele două coordonate ale punctului. ​
     * o funcție de afișare a unui punct astfel: ''​(x,​ y)''​.     * o funcție de afișare a unui punct astfel: ''​(x,​ y)''​.
-  - (**2p**) Să se implementeze o clasă ''​Poligon''​ cu următoarele:​  +  - (**2p**) Să se implementeze o clasă ''​Polygon''​ cu următoarele:​  
-    * un constructor care preia ca parametru un singur număr //n// (reprezentând numărul de colțuri al poligonului) și alocă spațiu pentru puncte (un punct reprezentând o instanță a clasei ''​Punct''​).  +    * un constructor care preia ca parametru un singur număr //n// (reprezentând numărul de colțuri al poligonului) și alocă spațiu pentru puncte (un punct reprezentând o instanță a clasei ''​Point''​).  
-    * un constructor care preia ca parametru un vector, cu //2n// numere reale reprezentând colțurile. Acest constructor apelează constructorul de la punctul de mai sus și completează vectorul de puncte cu cele //n// instanțe ale clasei ''​Punct''​ obținute din parametrii primiți.  +    * un constructor care preia ca parametru un vector, cu //2n// numere reale reprezentând colțurile. Acest constructor apelează constructorul de la punctul de mai sus și completează vectorul de puncte cu cele //n// instanțe ale clasei ''​Point''​ obținute din parametrii primiți.  
-      * La final, afișați coordonatele poligonului utilizând metodă de afișare a clasei ''​Punct''​. ​+      * La final, afișați coordonatele poligonului utilizând metodă de afișare a clasei ''​Point''​. ​
   - (**1p**) Testați diferența de viteză introdusă de crearea de noi obiecte. Măsurați diferența între folosirea ''​new Integer(2+3)''​ și ''​2+3'',​ după modelul de mai jos:   - (**1p**) Testați diferența de viteză introdusă de crearea de noi obiecte. Măsurați diferența între folosirea ''​new Integer(2+3)''​ și ''​2+3'',​ după modelul de mai jos:
     * <code java> ​     * <code java> ​
Line 408: Line 398:
  
 </​code> ​ </​code> ​
-  - (**1p**) Testați diferența de memorie utilizată între a folosi String literal și String obținut prin constructor. Construiți un vector de String. Umpleți acest vector în primă fază cu literal-ul ''"​abc"''​ și măsurați memoria utilizată. Apoi, umpleți vectorul cu ''​new ​Strîng("​abc"​)''​ și măsurați memoria utilizată. Măsurarea memoriei utilizate se poate face folosind următoarea metodă:+  - (**1p**) Testați diferența de memorie utilizată între a folosi String literal și String obținut prin constructor. Construiți un vector de String. Umpleți acest vector în primă fază cu literal-ul ''"​abc"''​ și măsurați memoria utilizată. Apoi, umpleți vectorul cu ''​new ​String("​abc"​)''​ și măsurați memoria utilizată. Măsurarea memoriei utilizate se poate face folosind următoarea metodă:
     * <code java> ​     * <code java> ​
 public void showUsedMemory() {  public void showUsedMemory() { 
Line 442: Line 432:
         * un șir random de lungime MAGIC_NUMBER,​ generat cu ''​RandomStringGenerator''​ și cu un alfabet obținut din 10 caractere obținute random din MAGIC_STRING         * un șir random de lungime MAGIC_NUMBER,​ generat cu ''​RandomStringGenerator''​ și cu un alfabet obținut din 10 caractere obținute random din MAGIC_STRING
         * și șirul format prin conversia la String a numărului (age + lungimea lui lastName).         * și șirul format prin conversia la String a numărului (age + lungimea lui lastName).
-    * Pentru subșiruri și alte metode utile consultați documentația clasei [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​String.html | String]]+    * Pentru subșiruri și alte metode utile consultați documentația clasei [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​String.html | String]]
  
 == Resurse == == Resurse ==
-* <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​laboratoare/​constructori-referinte?​do=export_pdf">​PDF laborator</​a></​html>​ 
-* {{Soluții}} 
- 
- 
  
 +* {{:​laboratoare:​constructori-referinte:​lab2-sol.zip|Soluție}}
 +* <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​PDF laborator</​a></​html>​
 == Referințe == == Referințe ==
  
laboratoare/constructori-referinte.txt · Last modified: 2020/01/14 14:00 by Adriana Draghici