User Tools

Site Tools


Problem constructing authldap
laboratoare:java-basics
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
laboratoare:java-basics [2018/09/25 11:39]
Tudor Paraschivescu [Exerciții]
laboratoare:java-basics [2019/10/21 17:35] (current)
Adriana Draghici [Resurse și linkuri utile]
Line 6: Line 6:
  
 Aspectele urmărite sunt: Aspectele urmărite sunt:
-* organizarea ​fișierelor într-un ​proiect Java+* organizarea ​unui proiect Java
 * familiarizarea cu IDE-ul * familiarizarea cu IDE-ul
 * definirea noțiunilor de clasă, câmpuri, proprietăți,​ metode, specificatori de acces * definirea noțiunilor de clasă, câmpuri, proprietăți,​ metode, specificatori de acces
 +* folosirea unor tipuri de date 
 +
  
  
Line 16: Line 18:
 Înainte de a începe orice implementare,​ trebuie să vă gandiți cum grupați logica întregului program pe unități. Elementele care se regăsesc în același grup trebuie să fie **conectate în mod logic**, pentru o ușoară implementare și înțelegere ulterioară a codului. În cazul Java, aceste grupuri logice se numesc **pachete** și se reflectă pe disc conform ierarhiei din cadrul proiectului. Pachetele pot conține atât alte pachete, cât și fișiere sursă. Înainte de a începe orice implementare,​ trebuie să vă gandiți cum grupați logica întregului program pe unități. Elementele care se regăsesc în același grup trebuie să fie **conectate în mod logic**, pentru o ușoară implementare și înțelegere ulterioară a codului. În cazul Java, aceste grupuri logice se numesc **pachete** și se reflectă pe disc conform ierarhiei din cadrul proiectului. Pachetele pot conține atât alte pachete, cât și fișiere sursă.
  
-{{laboratoare:​java-basics:​package.jpg| Organizarea pachetelor in Java}} ​+{{laboratoare:​java-basics:​lab-java-basics-packages.png| Organizarea pachetelor in Java}} ​
  
 Următorul pas este delimitarea entităților din cadrul unui grup, pe baza unor trăsături individuale. În cazul nostru, aceste entități vor fi clasele. Pentru a crea o clasă, trebuie mai întâi să creăm un fișier aparținând proiectului nostru și unui pachet (dacă este cazul și proiectul este prea simplu pentru a-l împărți în pachete). În cadrul acestui fișier definim una sau mai multe clase, conform urmatoarelor reguli: Următorul pas este delimitarea entităților din cadrul unui grup, pe baza unor trăsături individuale. În cazul nostru, aceste entități vor fi clasele. Pentru a crea o clasă, trebuie mai întâi să creăm un fișier aparținând proiectului nostru și unui pachet (dacă este cazul și proiectul este prea simplu pentru a-l împărți în pachete). În cadrul acestui fișier definim una sau mai multe clase, conform urmatoarelor reguli:
   * dacă dorim ca această clasă să fie vizibilă din întreg proiectul, îi vom pune specificatorul **public** (vom vorbi despre specificatori de acces mai în detaliu în cele ce urmează); acest lucru implică însă 2 restricții:​   * dacă dorim ca această clasă să fie vizibilă din întreg proiectul, îi vom pune specificatorul **public** (vom vorbi despre specificatori de acces mai în detaliu în cele ce urmează); acest lucru implică însă 2 restricții:​
     * fișierul și clasa publică trebuie să aibă același nume     * fișierul și clasa publică trebuie să aibă același nume
-    * nu poate exista o altă clasă/interfată publică în același fișier (vom vedea în laboratoarele următoare ce sunt interfețele)+    * nu poate exista o altă clasă/interfață publică în același fișier (vom vedea în laboratoarele următoare ce sunt interfețele)
   * pot exista mai multe clase în același fișier sursă, cu condiția ca **maxim una** să fie publică   * pot exista mai multe clase în același fișier sursă, cu condiția ca **maxim una** să fie publică
 +
 +Pentru mai multe informații despre cum funcționează mașina virtuală de Java (JVM) precum și o aprofundare în POO și Java, consultați [[laboratoare:​poo-java|acest link]].
  
 Pentru un exemplu de creare a unui proiect, adăugare de pachete și fișiere sursă, consultați [[resurse-utile:​proiect-intellij-idea|acest link]] pentru IntelliJ Idea si [[resurse:​proiect-eclipse|acest link]] pentru Eclipse. Pentru un exemplu de creare a unui proiect, adăugare de pachete și fișiere sursă, consultați [[resurse-utile:​proiect-intellij-idea|acest link]] pentru IntelliJ Idea si [[resurse:​proiect-eclipse|acest link]] pentru Eclipse.
Line 74: Line 78:
 </​code> ​ </​code> ​
   ​   ​
- Această ​este varianta preferată pentru instanțierea string-urilor. De remarcat că și varianta următoare este corectă, dar **ineficientă**,​ din motive ce vor fi explicate ulterior. ​+ Aceasta ​este varianta preferată pentru instanțierea string-urilor. De remarcat că și varianta următoare este corectă, dar **ineficientă**,​ din motive ce vor fi explicate ulterior. ​
  
 <code java> ​ <code java> ​
Line 168: Line 172:
  
 ^  Tip primitiv ​ ^Definitie ^ ^  Tip primitiv ​ ^Definitie ^
-|  **public** ​ | permite acces complet din exteriorul clasei curente ​ | 
 |  **private** ​ | limitează accesul doar în cadrul clasei curente ​ | |  **private** ​ | limitează accesul doar în cadrul clasei curente ​ |
-|  **protected** ​ | limitează accesul doar în cadrul pachetului, clasei curente si a celor care o mostenesc ​ | 
 |  **default** ​ | accesul este permis doar în cadrul //​pachetului//​ (package private) ​ | |  **default** ​ | accesul este permis doar în cadrul //​pachetului//​ (package private) ​ |
 +|  **protected** ​ | accesul este permis doar în cadrul pachetului si în clasele ce moștenesc clasa curentă ​ |
 +|  **public** ​ | permite acces complet ​ |
  
 <note warning>​Atenţie,​ nu confundaţi specificatorul default (lipsa unui specificator explicit) cu ''​protected''</​note>​ <note warning>​Atenţie,​ nu confundaţi specificatorul default (lipsa unui specificator explicit) cu ''​protected''</​note>​
  
-Încapsularea se referă la acumularea atributelor şi metodelor caracteristice unei anumite categorii de obiecte într-o clasă. ​//Pe de altă parte, acest concept denotă şi ascunderea informaţiei de stare internă a unui obiect, reprezentată de atributele acestuia, alături de valorile aferente, şi asigurarea ​comunicării strict ​prin intermediul metodelor// (//​interfata//​ clasei)+//**Încapsularea**// se referă la acumularea atributelor şi metodelor caracteristice unei anumite categorii de obiecte într-o clasă. Pe de altă parte, acest concept denotă şi ascunderea informaţiei de stare internă a unui obiect, reprezentată de atributele acestuia, alături de valorile aferente, şi asigurarea ​modificării lor doar prin intermediul metodelor. ​
  
 <note important>​Utilizarea specificatorilor contribuie la realizarea //​**încapsulării**//​.</​note> ​ <note important>​Utilizarea specificatorilor contribuie la realizarea //​**încapsulării**//​.</​note> ​
  
-Acest lucru conduce la izolarea modului de implementare a unei clase (atributele acesteia şi cum sunt manipulate) de utilizarea acesteia. Utilizatorii unei clase pot conta pe funcţionalitatea expusă de aceasta, **indiferent de implementarea ei internă** (chiar şi dacă se poate modifica în timp). ​Dacă utilizatorii ar avea acces la modul efectiv de implementare a unei clase, ar fi imposibilă modificarea implementării ei (necesitate care apare des în practică) fără un impact lateral asupra utilizatorului. +Încapsularea ​conduce la izolarea modului de implementare a unei clase (atributele acesteia şi cum sunt manipulate) de utilizarea acesteia. Utilizatorii unei clase pot conta pe funcţionalitatea expusă de aceasta, **indiferent de implementarea ei internă** (chiar şi dacă se poate modifica în timp).
  
  ​==Exemplu de implementare== ​  ​==Exemplu de implementare== ​
Line 250: Line 253:
 * Deși câmpul ''​dogs''​ aparținând obiectului ''​vr2''​ a fost actualizat la valoarea 2, câmpul ''​dogs''​ al obiectului ''​vr1''​ a rămas la valoarea inițiala (199). **Fiecare obiect are spațiul lui pentru date!** * Deși câmpul ''​dogs''​ aparținând obiectului ''​vr2''​ a fost actualizat la valoarea 2, câmpul ''​dogs''​ al obiectului ''​vr1''​ a rămas la valoarea inițiala (199). **Fiecare obiect are spațiul lui pentru date!**
  
-* System.out.println(...) este metoda utilizată pentru a afișa la consola standard de ieșire+''​System.out.println(...)'' ​este metoda utilizată pentru a afișa la consola standard de ieșire
  
 * Operatorul '​+'​ este utilizat pentru a concatena două șiruri * Operatorul '​+'​ este utilizat pentru a concatena două șiruri
  
-* Având în vedere cele două observații anterioare, observăm că noi am afișat cu succes șirul "The first/​second class method says there are " + vr.getAnimalsCount() + " animals",​ deși metoda getAnimalsCount() întoarce un întreg. Acest lucru este posibil deoarece se apelează implicit o metodă care convertește numărul întors de metodă în șir de caractere. Apelul acestei metode implicite atunci când chemăm ''​System.out.println''​ se întâmplă pentru orice obiect și primitivă, nu doar pentru întregi.+* Având în vedere cele două observații anterioare, observăm că noi am afișat cu succes șirul "The first/​second class method says there are " + vr.getAnimalsCount() + " animals",​ deși metoda getAnimalsCount() întoarce un întreg. Acest lucru este posibil deoarece se apelează implicit o metodă care convertește numărul întors de metodă în șir de caractere. Apelul acestei ​//metode implicite// atunci când chemăm ''​System.out.println''​ se întâmplă pentru orice obiect și primitivă, nu doar pentru întregi.
  
 <note important>​ <note important>​
-Având în vedere că au fost oferite exemple de cod în acest laborator, puteți observa că se respectă un anumit stil de a scrie codul in Java. Acest coding style face parte din informațiile transmise in cadrul acestei materii și trebuie să încercați să îl urmați încă din primele laboratoare,​ devenind un criteriu obligatoriu ulterior în corectarea temelor. Puteți gasi documentația oficială pe site-ul Oracle. Pentru început, încercați să urmați regulile de denumire: http://​www.oracle.com/​technetwork/​java/​codeconventions-135099.html+Având în vedere că au fost oferite exemple de cod în acest laborator, puteți observa că se respectă un anumit stil de a scrie codul in Java. Acest **coding style** face parte din informațiile transmise in cadrul acestei materii și trebuie să încercați să îl urmați încă din primele laboratoare,​ devenind un criteriu obligatoriu ulterior în corectarea temelor. Puteți gasi documentația oficială pe site-ul Oracle. Pentru început, încercați să urmați regulile de denumire: http://​www.oracle.com/​technetwork/​java/​codeconventions-135099.html
  
 </​note>​ </​note>​
-  ​ 
-==Exerciții== 
  
-<note tip>În cadrul laboratorului și la teme vom lucra cu Java 8. Când consultați documentația uitați-vă la cea pentru această versiune.</​note>​+== Arrays ==
  
-  - (**1p**) Numere complexe +Vectorii sunt utilizați pentru a stoca mai multe valori într-o singură variabilă. Un vector este de fapt matrice ​(arrayunidimensională.
-     - Creați un proiect nou cu numele ''​ComplexNumber''​. +
-     - Creați clasa ''​ComplexNumber.java''​. Aceasta va avea două campuri: ''​re''​ si ''​im'',​ ambele de tip ''​float''​. +
-  - (**1p**) Operații +
-     - Creați clasa ''​Operations.java''​. Această clasă va implementa operațiile de adunare și înmulțire pentru numere complexe. Definiți în clasă ''​Operations''​ câte o metodă pentru fiecare operație;  +
-     - (**0.5p**) Testați metodele implementate. +
-  - (**3p**) Biblioteca +
-     ​- ​ Creați un proiect nou cu numele ''​Bookstore''​. +
-     - Creați clasa ''​Book.java''​ cu următoarele atribute: ''​title'',​ ''​author'',​ ''​publisher'',​ ''​pageCount''​. +
-     - Creați clasa ''​BookstoreTest.java'', ​pentru a testa viitoarele funcționalități ale bibliotecii. Completați această clasă, așa cum considerați necesar. Apoi, creați un obiect de tip carte și setați atributele introducând date de la tastatură. Pentru această folosiți clasa ''​[[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Scanner.html |Scanner]]'':​ +
-     * <code java> +
-     ​Scanner s = new Scanner(System.in);​ +
-     ​String title = s.nextLine();​ +
-      </​code>​ +
-    ​Verificați ca numărul de pagini introdus să fie diferit de zeroPuteți consulta documentația claselor ''​[[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​String.html |String]]''​ și ''​[[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Integer.html |Integer]]''​.  +
-  -  (**3p**) Verificări cărți +
-     ​- ​ Creați o clasă nouă, ''​BookstoreCheck'',​ ce va conține două metode, cu câte 2 parametri ​de tipul ''​Book''​.  +
-        * Prima metodă va verifica dacă carte este în dublu exemplar, caz în care va întoarce adevărat.  +
-        * A doua metodă va verifica care carte este mai groasă decât altă, și va întoarce cartea mai groasă.  +
-     - Testați aceste doua metode.  +
-  - (**2p**Formatare afișare +
-     * Puteți consulta documentația clasei ''​[[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​String.html |String]]''​ +
-     * Afișați informația despre o carte în felul următor: ​+
  
 +<code Java Exemplu definire vector de String-uri cu valorile deja cunoscute>​
 +String[] cars = { "​Volvo",​ "​BMW",​ "​Ford"​ };
 +</​code>​
 +
 +<code Java Exemplu creare și populare vector cu valori de la 1 la 20>
 +int[] intArray = new int[20];
 +for (int i = 0; i < intArray.length;​ i++) {
 + intArray[i] = i + 1;
 +}
 +</​code>​
 +
 +<​note>​
 +  * Înainte să populăm vectorul, trebuie declarat (**int[] intArray**) și alocată memorie pentru 20 elemente de tip int (**new int[20]**).
 +  * Pentru a accesa lungimea vectorului, folosim câmpul **length** păstrat în vector.
 +  * Indexarea elementelor într-un array începe de la 0.
 +</​note>​
 +== Nice to know ==
 +
 +  * Fiecare versiune de Java aduce și concepte noi, dar codul rămâne cross-compatible (cod scris pt Java 8 va compila si rula cu Java 12). Dintre lucrurile adaugate in versiuni recente avem declararea variabilelor locale folosind ''​var'',​ ceea ce face implicit inferarea tipului. Codul devine astfel mai ușor de urmărit ​ ([[https://​dzone.com/​articles/​finally-java-10-has-var-to-declare-local-variables|Detalii și exemple]])
 <​code>​ <​code>​
-BOOK_TITLE: [insert_book_title] +var labString = "lab 1" // type String
-BOOK_AUTHOR:​ [insert_book_author] +
-BOOK_PUBLISHER:​ [insert_book_publisher]+
 </​code>​ </​code>​
  
-Cu următoarele ​precizări:+  * Când folosiți biblioteci third-party o să observați că pachetele au denumiri de forma //​com.organizationname.libname//​. Acesta este modul recomandat pentru a le denumi, vedeți mai multe detalii pe [[https://​docs.oracle.com/​javase/​tutorial/​java/​package/​namingpkgs.html|pagina oficială]]. Există situații în care acest stil este obligatoriu,​ de exemplu o aplicație Android nu poate fi publicată pe Play Store dacă numele pachetelor sale nu respectă aceasta convenție. 
 + 
 +== Summary == 
 + 
 +  * Codul Java este scris în interiorul claselor, enum-urilor și interfețelor (todo link lab cu interfete) 
 +  * Un fișier de tip java poate conține mai multe clase 
 +  * Numele singurei clase publice dintr-un fișier trebuie să fie același cu numele fișierului (fără extensia //​.java//​) 
 +  * Fișierele sunt grupate în pachete 
 +  * În interiorul unei clase declarăm 
 +    * variabile 
 +    * metode 
 +    * alte clase ([[.:​clase-interne|lab clase interne]]) 
 +  * **Clasele și metodele ar trebui să aibă o singură responsabilitate. Evitați metodele lungi și clase cu mai mult de un rol. Nu puneți toată logica în metoda //main//. Metoda main ar trebui să conțină doar câteva linii cu instațieri si apeluri de metodele specializate.** 
 +  * În declarația claselor, câmpurilor,​ metodelor putem adăuga specificatori de acces sau diverse keywords pe care le vom studia în următoarele ​laboratoare 
 +    * specificatori de access: public, private, default, protected 
 +  * Java are coding style-ul său și este importantă respectarea lui, altfel proiectele, mai ales cele cu mulți dezoltatori ar arăta haotic. 
 +  * Tipuri de date primitive: int, long, boolean, float, double, byte, char, short. Câmpurile primitive se inițializează automat la instanțierea unei clase cu valori default: e.g. 0 pentru int. 
 +  * Clasa String oferă multe metode pentru manipularea șirurilor de caractere.  
 +   
 +==Exerciții== 
 + 
 +<note tip>În cadrul laboratorului și la teme vom lucra cu Java 12. Când consultați documentația uitați-vă la cea pentru această versiune.</​note>​ 
 + 
 +**Prerequisites** 
 +  * Java JDK 12 instalat 
 +  * IDE ([[resurse-utile:​instalare-intellij-idea|Intellij]],​ [[resurse-utile:​instalare-eclipse|eclipse]]) instalat 
 +  * Verificat din linia de comandă versiunea de java: 
 +    * ''​javac -version''​ - comanda //javac// este folosită pentru compilare 
 +    * ''​java -version'' ​ - comanda //java// este folosită pentru rulare 
 + 
 +**Task 1** (3p) 
 +  - Creați folosind IDE-ul un nou proiect și adăugați codul din secțiunea [[.java-basics:#​exemplu-de-implementare|Exemplu de implementare]]. Rulați codul din IDE. 
 +  - Folosind linia de comandă, compilați și rulați codul din exemplu 
 +  - Mutați codul într-un pachet //task1// (sau alt nume pe care il doriți să îl folosiți). Folosiți-vă de IDE, de exemplu Refactor -> Move pentru IntelliJ. Observați ce s-a schimbat în fiecare fișier mutat. 
 + 
 +**Task 2**  (5p) 
 + 
 +Creați un pachet //task2// (sau alt nume pe care îl doriți să îl folosiți). În el creați clasele: 
 +    * ''​Student''​ cu proprietățile:​ //name// (String), //year// (Integer) 
 +    * ''​Course''​  
 +      * cu proprietățile:​ //title// (String), //​description//​ (String), //​students//​ (array de clase Student - [[.:​java-basics#​arrays|exemplu arrays]]). 
 +      * cu metoda: //​filterYear//​ care întoarce o listă de studenți care sunt intr-un an dat ca parametru. 
 +    * Nu folosiți vreun modificator de acces pentru variabile (aka "nu puneți nimic în fața lor în afară de tip"​) 
 +    * ''​Test''​ cu metoda main. La rulare, ca [[https://​docs.oracle.com/​javase/​tutorial/​essential/​environment/​cmdLineArgs.html|argument]] în linia de comandă se va da un integer reprezentând anul în care este un student 
 +      - creați un obiect //Course// și 3-4 obiecte //​Student//​. Populați obiectul Course. 
 +      - afișați toți studenții din anul dat ca parametru. **Hint:** folositi ''​Arrays.toString(listStudenti)''​. In clasa Student folositi IDE-ul pentru a genera metoda toString (pt Intellij Code->​Generate...) 
 +      - rulați atât din IDE (modificati run configuration) cât și din linie de comandă 
 +    * Opțional, în loc de [[.:​java-basics#​arrays|arrays]] pentru //​filterYear//​ puteți să folosiți și obiecte de tip List, e.g. [[https://​docs.oracle.com/​en/​java/​javase/​12/​docs/​api/​java.base/​java/​util/​ArrayList.html|ArrayList]] ([[https://​www.w3schools.com/​java/​java_arraylist.asp|exemplu]]) 
 + 
 +** Task 3** (1p) 
 + 
 +    - Creați două obiecte //Student// cu aceleași date în ele. Afișați rezultatul folosirii //​equals()//​ între ele. Discutați cu asistentul despre ce observați și pentru a vă explica mai multe despre această metodă. 
 +       * [[https://​docs.oracle.com/​en/​java/​javase/​12/​docs/​api/​java.base/​java/​lang/​Object.html#​equals(java.lang.Object)|documentație]] 
 + 
 +/* moved to lab 2 
 + 
 +** Task 4** (1p) 
 +    - Afișați un obiect de tip //Course//. Ce observați?​ 
 +    - Implementați în clasa //Course// metoda //​toString()//​ care întoarce un String compus din: 
 +      * titlul cu uppercase (folosiți una din metodele clasei [[https://​docs.oracle.com/​javase/​9/​docs/​api/​java/​lang/​String.html|String]]) 
 +      * descrierea 
 +      * numele studenților  
 +    - Afișați obiectul de tip //​Course//​ 
 +      * //Hint//: puteți să porniți să implementați generând întâi metoda //​toString//​ folosind IDE-ul 
 +*/ 
 +** Task 4** (1p) 
 +   - Adăugați modificatorul de acces '​private'​ tuturor variabilelor claselor Student și Course (e.g. ''​private String name;''​) 
 +   - Rezolvați erorile de compilare adăugând metode getter și setter acestor variabile. 
 +     - Ce ați făcut acum se numește //​încapsulare (encapsulation)//​ și este unul din principiile de bază din programarea orientată pe obiecte. Prin această restricționare protejați accesarea și modificarea variabilelor. 
 +       * //Hint//: pentru a vă eficientiza timpul, folosiți IDE-ul pentru a generarea aceste metode 
 +         * Eclipse: Source -> Generate Getters and Setters 
 +         * IntelliJ: Code -> Generate... -> Getters and Setters 
 +== Resurse și linkuri utile== 
 + 
 +* {{:​laboratoare:​java-basics:​lab1-sol.zip|Soluție}} 
 +* [[laboratoare:​old-exercises|Exerciții din alți ani]] 
 +* [[laboratoare:​poo-java|POO și Java]] 
 +* [[laboratoare:organizare-acces|Organizarea surselor și modificatori de acces]]
  
-Titlul cărții va fi scris în întregime cu **majuscule** +/Nu mai merge:
-* Numele editurii va fi scris în întregime cu **minuscule** +
-* Numele autorului rămânând **neschimbat**+
  
 + <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​PDF laborator</​a></​html>​
  
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​PDF laborator<​/a></​html>​+*/
laboratoare/java-basics.1537864767.txt.gz · Last modified: 2018/09/25 11:39 by Tudor Paraschivescu