User Tools

Site Tools


Problem constructing authldap
laboratoare:poo-java
Differences

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

Link to this comparison view

Next revision
Previous revision
laboratoare:poo-java [2013/08/06 20:52]
Mihnea Muraru creat
laboratoare:poo-java [2018/10/01 01:14] (current)
Laurentiu Stamate [Tipuri primitive]
Line 1: Line 1:
 = POO și Java = = POO și Java =
 +
 +== Programarea Orientată pe Obiecte==
 +
 +Programarea Orientată pe Obiecte este o paradigmă de programare care utilizează **obiecte** și **interacțiuni** între acestea pentru a modela arhitectura unui program. ​
 +  ​
 + ​Până în anii '60, paradigma cea mai utilizată era cea a **programării structurate**. Programarea structurată este tipul de programare pe care l-ați folosit până acum, la cursul de Programare și la cel de SD. Această paradigmă constă în utilizarea **funcțiilor și procedurilor** pentru a realiza un program (cu eliminarea apelurilor GOTO). ​
 +  ​
 + ​Totuși,​ în anii '60, deja pe măsură ce programale deveneau din ce în ce mai mari, randamentul programatorilor scădea și în consecință TTM-ul (''​time-to-market''​) creștea. Stilul de programare structurată nu mai făcea față unor programe de dimensiuni mereu în creștere. ​
 +  ​
 + ​Fiecare paradigmă de programare propune un nivel de împărțire a taskului de realizat (adică a programului) în taskuri mai mici pentru a micșora complexitatea. ​
 + ​Astfel,​ într-un program **monoprocedural**,​ unitatea de abstractizare este instrucțiunea. În programarea **structurată** este funcția/​procedura. **Programarea Orientată Obiect** (POO) propune pentru acest lucru obiectul. Obiectele în POO modelează (sau ar trebui să modeleze dacă arhitectură aplicației este corectă) obiecte din lumea reală. ​
 +  ​
 + ​**Obiectele** din POO sunt **instanțe** ale unui tip de date numit **clasă**. Relația dintre clasă și obiect-instanță a acelei clase este exemplificată de relația între conceptul de masă și masă din sufragerie. Adică: ​
 + * conceptul de masă implică existența anumitor caracteristici (un număr de picioare și un blat, totul de o anumită culoare) ​
 + * conceptul de masă implică realizarea potențială a unor acțiuni (se poate mânca pe masă) ​
 + * obiectul masă are caracteristicile respective (4 picioare, culoare neagră) ​
 + * obiectul masă permite realizarea practică a acțiunilor respective (se poate mânca doar pe masă fizică, nu pe ideea de masă) ​
 +  ​
 + Ce remarcăm este că există niște tipare în lumea reală, care grupează în mintea noastră niște **atribute** ale obiectelor cu **acțiunile** lor, pentru a forma un tot ce definește obiectul respectiv. Pe acest concept, numit **încapsulare**,​ se sprijină programarea orientată obiect. ​
 +  ​
 + ​Folosirea POO permite realizarea de sisteme informatice de dimensiuni mărite, cu timpi de dezvoltare, testare și mentenanță reduși față de paradigmele anterioare. Totuși, pentru a creă un sistem funcțional este necesară înțelegerea corectă a conceptelor care stau în spatele POO. Cu aceste concepte se ocupă cursul și laboratoarele de POO. 
 +
 +== Platforma Java == 
 +  ​
 + ​Programarea Orientată pe Obiecte se poate aplică în orice limbaj care permite acest lucru. Cele mai cunoscute asemenea limbaje astăzi sunt C++, Java, C#, chiar și PHP. În acest semestru vom ilustra conceptele de POO folosind limbajul Java. 
 +  ​
 + Java a pornit că o platformă de programare pentru sisteme embedded. Țelurile principale ale proiectului erau: 
 + * **independența** de sistem ​
 + * utilizarea **POO**. ​
 + ​Astăzi,​ Java este folosită mai mult că o platformă pentru Internet și a atins o utilizare impresionantă. ​
 +  ​
 + Java este un mediu (platformă) de programare care constă în: 
 + * un **limbaj** de programare (Java) care descrie programatorului ce instrucțiuni sunt valide și ce face fiecare ​
 + * un **compilator** (''​javac.exe''​ (Windows) / ''​javac''​ (Linux)) care transformă fișierul sursă într-un limbaj intermediar numit **bytecode** ​
 + * o **mașină virtuală**,​ **Java Virtual Machine** (''​JVM''​),​ care permite transformarea codului intermediar în instrucțiuni executabile pe procesorul curent. ​
 + * o **bibliotecă** puternică ce răspunde foarte bine nevoilor apărute în practică (''​class library''​) ​
 +  ​
 + ​**Workflowul** este următorul. Dezvoltatorul instalează **Java Development Kit** (''​JDK''​) care constă în principal din: 
 + * **Java Runtime Environment** (''​JRE''​),​ ce conține ''​JVM'' ​
 + * **compilator**. ​
 + ​Compilatorul este aplicat codului scris și se obțin fișiere conținând bytecode. Aceste fișiere au în Java extensia ''​.class''​. ​
 +  ​
 + ​Diagrama,​ până acum, arată astfel: ​
 +  ​
 + ''​Clasamea.java''​ ----compilare--->​ ''​Clasamea.class''​ [ pe mașina de dezvoltare ] 
 +  ​
 + Acest pas corespunde cu invocarea compilatorului astfel: ​
 +
 +<​code>​
 +javac Clasamea.java
 +</​code> ​
 +  ​
 + Apoi codul bytecode este distribuit (nu analizăm acum cum se face acest lucru) utilizatorului. El are instalat ''​JRE'',​ care este mașina care interpretează bytecode-ul și îl transformă într-un flow de instrucțiuni pentru procesorul utilizatorului (există un ''​JRE''​ pentru fiecare procesor și sistem de operare folosit). ​
 +  ​
 + ​Diagrama arată așa: 
 +  ​
 + ​---------------------------------------------------------------------- ​
 + | flow de bytecode | ------> | JRE | ----> | flow instrucțiuni native | 
 + ​---------------------------------------------------------------------- ​
 +  ​
 + Pasul corespunde cu invocarea mașinii virtuale astfel: ​
 +  ​
 +<​code>​
 +java Clasamea
 +</​code> ​
 +  ​
 + ​Rezultatul instrucțiunilor native afectează flowul de instrucțiuni bytecode, astfel încât rolul ''​JRE''​ nu este doar o etapă de preprocesare. Nu se aplică o simplă transformare de instrucțiuni ca să se obțină o imagine, după care să se trimite imaginea de executabil nativ la procesor. Mașina virtuală "​interpretează"​ tot timpul. Codul bytecode este numit interpretat din această cauză. ​
 +  ​
 +Cel mai important avantaj în acest workflow este că permite obținerea **independenței** de sistem. Dezvoltatorul are nevoie de un compilator funcțional pentru platformă pe care face dezvoltarea,​ iar utilizatorii,​ pe orice patforma ar fi (sistem de operare, arhitectură hardware), pot utiliza programul cât timp au o mașină virtuală Java instalată pentru acea platformă. ​
 +  ​
 + Un dezavantaj este viteza scăzută a codului Java. Există overhead-ul implicat de acțiunile adiționale realizate de ''​JRE''​ tot timpul rulării programului. Pentru a combate acest dezavantaj au apărut compilatoare ''​just-în-time''​ (''​JIT''​) care permit transformarea bytecodeului în cod executabil la prima rulare a unei secvențe de instrucțiuni bytecode, apoi stocarea acestuia pentru refolosire. Aici mașina virtuală nu este folosită decât o dată. Modelul clasic este C#, care folosește acest artificiu încă de la apariția sa. (Întârzierea cauzată de prima pornire a aplicației .NET respective este vizibilă în multe cazuri). Rețineți că modelul clasic Java este unul cu compilator și interpretor (mașină virtuală). ​
 +  ​
 +  ​
 + ​{{alte-resurse:​poo-java:​jvm.gif?​450| Flow-ul Java}} ​
 +
 +
 +==Tipuri primitive==
 +
 +Conform POO, **orice este un obiect**, însă din motive de performanță,​ Java suportă și tipurile de bază, care nu sunt clase. Aceste tipuri, numite **tipuri primitive**,​ corespund tipurilor de date cel mai des folosite și sunt prezentate mai jos, alături de spațiul ocupat și intervalul corespunzător de valori: ​
 +  ​
 +<​tabcaption | Tipuri primitive de date>
 +^  Tip primitiv ​ ^  Dimensiune ​ ^  Minim  ^  Maxim ^
 +|  ''​boolean'' ​ |  <​dimensiune variabilă> ​ |  —  |  —  |
 +|  ''​char'' ​ |  16  |  Unicode 0  |  Unicode 2<​sup>​16</​sup>​ - 1  |
 +|  ''​byte'' ​ |  8  |  -128  |  127  |
 +|  ''​short'' ​ |  16  |  -2<​sup>​15</​sup> ​ |  2<​sup>​15</​sup>​ - 1  |
 +|  ''​int'' ​ |  32  |  -2<​sup>​31</​sup> ​ |  2<​sup>​31</​sup>​ - 1  |
 +|  ''​long'' ​ |  64  |  -2<​sup>​63</​sup> ​ |  2<​sup>​63</​sup>​ - 1  |
 +|  ''​float'' ​ |  32  |  IEEE754 ​ |  IEEE754 ​ |
 +|  ''​double'' ​ |  64  |  IEEE754 ​ |  IEEE754 ​ |
 +</​tabcaption>​
 +
 +<note tip>​Tipurile de date primitive sunt asemănătoare celor din C. Variabilele (locale metodelor, a nu se confunda cu membri claselor) având tipuri primitive sunt alocate pe stivă (exact ca în C), în contrast cu instanțele claselor, care sunt alocate pe heap (remember stack vs. heap).</​note>​
 +
 +Se observă că: 
 +  * Java **nu** posedă tipuri ''​unsigned''​
 +  * tipul ''​char''​ este pe 16 biți și întrebuințează **Unicode**
 +  * tipul ''​boolean''​ nu are o dimensiune fixă
 +  * deși valorile posibile sunt doar 0 și 1, ocupând 1 bit, acestui bit i se adaugă un header dependent de mașină, după care acesta se completează cu biți până se ajunge la un număr multiplu de 8
 +  * pentru mai multe detalii: http://​docs.oracle.com/​javase/​tutorial/​java/​nutsandbolts/​datatypes.html
 +  * ''​void''​ **nu este tip in Java**, este doar un cuvânt cheie pentru cazurile în care dorim să indicăm că ceea ce se returnează este **nimic** <code java>
 +// cod C
 +int f(void) // specificăm explicit ca funcția nu are parametrii
 +void f(int) // definim o metodă care primeste un int și nu întoarce nimic
 +void *p // definim un pointer care poate conține orice tip
 +(void) p // cast către orice tip
 +
 +// cod Java
 +int f(void) // eroare de compilare, nu există parametrii de tip void
 +void f(int) // similar cu C
 +void *p // nu există conceptul de pointer in Java
 +(void) p // nu se poate face cast către void in Java
 +
 +</​code>​
 +  * din documentația 'Java Language specification 7': " Note that the Java programming language does not allow a "cast to void" - void is not a type "
 +
 +  ​
 +
 +Segmentele de memorie inițiale, precum și parametri de rulare sunt ilustrați mai jos.
 +{{ :​laboratoare:​java-basics:​jvm.jpg?​nolink |Java VM memory }}
 +
 +
 +
 +
 +Exemplu de declarație:​
 +
 +<code java>
 +int i, j;
 +boolean k;
 +</​code>​
 +  ​
 +  /* Mutat la resurse utile - in labul acesta mentionat ca exista tipul Referinta.*/​
 +  ​
 + ​Celelalte tipuri existente sunt **clase**. Instanțele claselor sunt tipuri **referință**. Acest lucru înseamnă că în spate, mașina virtuală Java lucrează cu pointeri la obiecte și noi folosim pointeri impliciți către zone de memorie alocate pentru obiectele utilizate. Acest lucru va avea consecințe mai târziu, când vom studia transferul parametrilor în Java. 
 +
 + Care este diferența dintre referințe (Java) și pointeri (C) ?
 +  * referințele pot ascunde un anumit număr de niveluri de indirectare deasupra pointerilor ​
 +  * din cauza faptului că nu putem accesa direct memoria, **nu putem face operații aritmetice cu referințele**,​ spre deosebire de pointeri
 +  * datorită libertății oferite de pointerii din C, putem face cast oricărui pointer pentru a da un alt sens zonei respective de memorie; acest lucru nu este posibil in cazul referințelor,​ se poate face cast doar la un alt tip al unui obiect care este deja încapsulat în obiectul curent (mai multe detalii când vom discuta despre moștenire)
 +  ​
 + Acum e de reținut faptul că în Java **nu** există pointeri expliciți. Această facilitate a fost considerată generatoare de erori și nu a fost implementată. Acest lucru nu limitează capacitățile platformei.  ​
 +  ​
 +  ​
 +  ​
 +
 +== Hello World ==
 +
 +Pentru a începe dezvoltarea avem nevoie de ''​JDK''​ pe care îl găsim pe site-ul [[http://​www.oracle.com/​technetwork/​java/​javase/​downloads/​java-se-jdk-7-download-432154.html |oracle]]. ''​JDK''​ conține și ''​JRE''​ pentru procesorul curent, așa că putem testa aplicațiile pe mașină locală. ​
 +  ​
 + ​Pentru a seta variabilele de mediu în Linux adăugați următoarea linie în ''/​etc/​bash.bashrc''​ (pentru a fi disponibil tuturor utilizatorilor): ​
 +<code bash> ​
 +  export JAVA_HOME=/​usr/​lib/​jvm/​java-<​versiunea undefined> ​
 +</​code> ​
 +  unde valoarea variabilei ''​JAVA_HOME''​ este calea către directorul unde aveți Java instalat. ​
 +  ​
 + ​Conform paradigmei POO, programul este compus din clase. Pentru a avea un entry point al programului (punct de început, cum este funcția ''​main''​ în C), trebuie să scriem o clasă: ​
 +
 +<code java> ​
 + class HelloWorld ​ { 
 +     ​public static void main(String[] args) { 
 +         ​System.out.println(a€œHello world!”); ​
 +     ​} ​
 + ​} ​
 +</​code> ​
 +  ​
 + ​Observăm că: 
 + * o clasă se definește prin listarea metodelor, cuprinse între acolade, după declararea ei prin cuvântul cheie ''​class''​ urmat de numele clasei. ​
 + * semnătura functei de entry în program este: ''​public static void main(String[] args)'' ​
 + * intuim că linia ''​System.out.println(a€œHello world”)''​ va afișa mesajul de întâmpinare ​
 +  ​
 + ​Salvăm textul ca ''​HelloWorld.java''​. Compilăm programul cu: 
 +
 +<​code>​
 +  javac HelloWorld.java ​
 +</​code> ​
 + ​Observăm apariția în directorul curent a unui fișier ''​HelloWorld.class''​ cu: 
 +  dir (ls pentru Linux) ​
 +  ​
 + ​Pentru rulare: ​
 +
 +<​code> ​  java HelloWorld ​
 +</​code> ​
 + == Instalare Eclipse IDE == 
 +  ​
 + ​Pentru Java există mai multe medii de dezvoltare dintre care noi recomandăm Eclipse datorită plugin-urilor disponibile. Eclipse oferă plugin-uri și pentru PHP, C/C++, Python etc. 
 +  ​
 + ​Eclipse poate fi download-at de [[http://​eclipse.org/​downloads/​ |aici]]. Pentru instalare vă recomandăm acest [[http://​www.vogella.de/​articles/​Eclipse/​article.html | tutorial]]. ​
 +
 +==Download==
 +* [[http://​www.oracle.com/​technetwork/​java/​javase/​downloads/​java-se-jdk-7-download-432154.html |JDK]]
 +* [[http://​eclipse.org/​downloads/​packages/​eclipse-ide-java-developers/​indigosr2 |Eclipse]]
laboratoare/poo-java.1375811531.txt.gz · Last modified: 2013/08/06 20:52 by Mihnea Muraru