Sunteți pe pagina 1din 63

 Reprezintă colecții de tehnici de scriere

corectă a programelor
 Programarea de nivel scazut
◦ programul = o secvență de instrucțiuni mașină –
bazată pe arhitectura vonNeumann
 Programarea procedurală
◦ programul = o colecție de proceduri
implementând diverși algoritmi
◦ Limbaje: C, Pascal etc.
 Programarea funcțională
◦ programul = o funcție care calculează o valoare
pe baza prelucrării unor liste de valori (obținute
prin apel de alte funcții) (din matematică –
lambda calculus)
◦ Limbaje: Lisp, FP, Hope etc.
 Programarea declarativă (logică)
◦ programul = o interogare care pornește o căutare
automată într-un spațiu al soluțiilor
◦ Limbaje: Prolog, SQL etc.
 Programarea orientată pe obiecte
◦ programul = o colecție de obiecte (clase) care
modelează entitățile din problemă precum și
relațiile și comportamentul acestora.
◦ Clasele (obiectele) sunt organizate în ierarhii iar
obiectele comunică prin mesaje
◦ Starea unui obiect este definită de valorile
atributelor sale
◦ Comportamentul unui obiect este definit prin
metodele sale.
◦ Limbaje: Smalltalk, Eiffel, C++, Java, C# etc.
 Abstractizarea
◦ permite stapanirea complexitatii. Desparte comportamentul
de implementare
 Incapsularea
◦ ascunderea implementarii. Permite mai multe implementari
pentru o interfata data
 Modularitatea
◦ permite divizarea unor proiecte complexe si sprijina
reutilizarea codului
 Ierarhizarea
◦ permite exprimarea dependentelor si reutilizarea codului
 Există o distinctie clara intre proiectarea unei
aplicatii si implementarea acesteia
 Proiectarea unei aplicatii se poate face orientata pe
obiecte chiar daca implementarea nu este asa
 O implementare poate urmari paradigmele
orientarii pe obiecte chiar daca limbajul nu sprijina
acest lucru
 O implementare intr-un limbaj orientat pe obiecte
nu respecta automat aceasta paradigma
 Clasa
◦ matrita pentru creat obiecte
◦ contine membrii: atribute si metode
◦ membrii publici formeaza interfata clasei
 Obiect
◦ instanta a unei clase
◦ comunica prin mesaje (apeluri de metode) cu alte obiecte
◦ are valori proprii pentru atributele
◦ metodele sunt comune
 Moștenirea
◦ permite crearea unei clase noi prin extinderea unor clase existente. Poate
fi simpla sau multipla. Creaza relatii de tip subclasa-superclasa
 Polimorfismul
◦ permite folosirea unui obiect de un tip în locul altuia de alt tip dar având
aceiași interfață
 Limbajul JAVA a aparut recent – mai 1995

 Este rezultatul unui proiect al firmei SUN din 1991 condus de J.


Gosling si P. Naughton

 Java SDK – Software Development Kit – este freeware si cuprinde


compilator, masina virtuala, depanator etc.

 Avantaje: orientat pe obiecte, independent de platforma, eficient,


scalabil, robust
 JVM – Java Virtual Machine – masina virtuala Java – interpretor
de cod binar Java (simuleaza un procesor)
 bytecode Java – cod masina JVM
 Java API – Application Programming Interface – defineste
interfata de programare pentru aplicatii
 Applet – program de mici dimensiuni ce poate fi incarcat si
rulat intr-un browser de Web
 standard J2 SE API (Standard Edition)
 J2 EE API (Enterprise Edition) – pentru business
 J2 ME API (Micro Edition) – pagere .. masini de
spalat
 J2 Communication API – com(RS232) si serial (IEEE
1282)
 J2 Cryptography API – pentru cifrare
 J2 3D API – aplicatii grafice 3D
 J2 Telephony – centrale si telefoane
 Exista 3 categorii:
◦ Tipuri primitive (8)
◦ Clase si Interfete
◦ Tablouri (array)

 Tipuri primitive: pot reprezenta numere


intregi, reale, caractere si valori logice
 Tipurile sunt independente de masina,
avand aceiasi dimensiune si reprezentare in
toate implementarile
 Numerele intregi se pot reprezenta prin
patru tipuri:

Nr Tip Dim. Domeniu


1 byte 8 biti -128 .. 127
2 short 16 biti -32.768 .. 32.767
3 int 32 biti -2.147.483.648 .. 2.147.483.647
4 long 64 biti -9 * 1018 .. 9 * 1018
 Numerele reale se pot reprezenta prin
doua tipuri (standard IEEE 754):

Nr Tip Dim. Domeniu


1 float 32 -3.402823*1038 .. 3.402823*1038
biti
2 double 64 -1.79769313486232*10308 ..
biti 1.79769313486232*10308
 Caracterele – char - sunt reprezentate in UNICODE
pe 16 biti. Exista o serie de constante pentru
definirea caracterelor speciale

Simbol Caracter
\\ backslash
\n new line
\t tab
\” ghilimele
\’ apostrof

 Tipul logic – boolean - defineste doar doua valori:


true si false.
 Varibilele sunt zone de memorie in care
sunt retinute datele
 Fiecare variabila are asociate: un nume
(identificator), un tip si o valoare
 In Java exista trei feluri de variabile:
variabile de instanta, variabile de clasa si
variabile locale
 Observatie: Java este case sensitive – in
identificatori se tine cont de litere mari/mici
 Variabilele de instanta sunt atribute ale obiectelor.
Fiecare obiect al unei clase retine propriile valori
pentru atributele tip variabila instanta
 Varibilele de clasa sunt atribute cu valori comune
pentru toate obiectele-instante ale acelei clase
 Variabilele locale sunt declarate si folosite in
interiorul metodelor
 Observatie: Java nu are variabile globale. Necesitatea
folosirii variabilelor globale denota o proiectare care
incalca paradigmele orientarii pe obiecte
 Comentariile sunt informatii aditionale despre
liniile de cod
 In Java sunt permise trei tipuri de comentarii:
◦ Comentarii multilinie
 /* comentariu */
◦ Comentarii pe o singura linie
 // comentariu
◦ Comentarii Javadoc – pt. generarea automata a
documentatiei programului
 /**
 * @author Bill
 * @version 1.2
 */
◦ Operatorul de atribuire
 =
 in Java atribuirea nu este instructiune => se poate
scrie expresia a = b = c = 5
◦ Operatori matematici
 +, -, *, / (catul impartirii pt. numere intregi) , %
(modulo - restul impartirii). Daca un operand este
numar real, rezultatul va fi real
 ++ (incrementarea), -- (decrementarea) pot fi facute
pre si post evaluare
 post: b = x++;  b=x; x=x+1;
 pre: b = ++x;  x=x+1; b=x;
◦ Operatorii de comparare
 == (egal), != (diferit), <, >, <=, >=
◦ Operatorii logici:
 && (SI logic). Varianta cu evaluare completa &
 || (SAU logic). Varianta cu evaluare completa |
 ^ (SAU exclusiv - XOR)
 ! (NOT – negare logica)
◦ Operatori pe biti
 & (SI), | (SAU), ^ (XOR), ~ (complement)
 << (left shift), >> (right shift), >>> (zero fill right shift)
◦ Operatori combinati => operatie + atribuire
 +=, -=, /=, *=, %=, &=, |=, ^=, <<=, >>=, >>>=
◦ (), [], .(selectia membrilor unui obiect)
◦ ++, --, !, ~
◦ new (crearea unei instante)
◦ *, /, %
◦ +, -
◦ <<, >>, >>>
◦ <, >, <=, >=
◦ ==, !=
◦ &, ^, |
◦ &&
◦ ||
◦ +=, -=, *=, /=, %=, ^=
◦ &=, |=, <<=, >>=, >>>=
◦ Liniile de cod (statements) pot contine oricate spatii
si se pot intinde pe oricate linii fizice
◦ Liniile de cod se termina obligatoriu prin ‘;’
◦ Pentru a grupa mai multe linii de cod se poate
utiliaza notatia de bloc { … }
◦ Expresiile sunt linii de cod care returneaza o valoare
◦ Expresiile pot fi imbricate pe oricate nivele
◦ Expresiile sunt compuse din variabile, valori, apeluri
de metode și operatori
 Linie de cod = unitate de baza executabila
 Bloc = grup de linii de cod
 Bloc = inlocuitor pentru o linie de cod
 Domeniu de valabilitate pentru variabilele
definite local – in interiorul blocului [C4_1.java]
 Instructiunea if se foloseste pentru a executa
conditional o instructiune sau un bloc
 Conditia din instructiune poate fi doar una logica
(spre deosebire de C valorile intregi nu sunt
interpretate)
 Operatorul conditional ?:
 test ? instr_adevarat : instr_fals

 Instructiunea switch – pentru inlocuirea if in cascada


(discriminantul – doar tipuri primitive)
 Exemple [C4_2.java]
 Instructiunea for:
 for (expr_initializare; test; expr_incrementare)
instructiune;
 Instructiunea while:
 while (test)
instructiune;
 Instructiunea do … while:
 do
instructiune;
 while (test);
 Toate instructiunile de repetat pot fi
inclocuite prin blocuri
 Pentru intreruperea fortata a unei iteratii se
poate folosi:
 break – intrerupe ciclul
 continue – forteaza urmatoarea iteratie
 Exemple [C4_3.java]
 Permit izolarea codului care implementeaza un
anumit comportamnet al unei entitati
 Simplifica depanarea si permit reutilizarea codului
 In Java suprogramele se numesc metode si sunt
inglobate in definitia unei clase
 O metoda are:
 un nume
 o serie de parametrii de apel
 un tip returnat (poate fi void)
 un corp (un bloc - secventa de instructiuni)
 Exemplu [C4_4.java]
 Transmiterea parametrilor se face prin referinta

obiect1
// secventa de apel
a1 = new tip1();
obiect2
a2 = new tip2();

p ( a1, a2 );

// metoda p
void p ( tip1 x, tip2 y ) {

}
 Permit implementarea algoritmilor recursivi
 Un concept este recursiv daca este definit
prin el insusi
 Recursivitatea poate fi directa A->A sau
indirecta (circulara) A->B-> .. ->A
 Trebuie sa existe o conditie de oprire a
recursivitatii
 Exemplu [C4_5.java]
 Tablourile sunt obiecte ce contin colectii de elemente de
acelasi tip
 Referirea la componentele unui tablou – prin indici numerici
0 .. N-1 unde N este numarul total de elemente
 Java suporta doar tablouri unidimensionale. Tablourile
multidimensionale sunt simulate prin tablou de tablouri
 Exista doua sintaxe de declarare:
◦ tip variabila_tablou[];
◦ tip[] variabila_tablou;
 Pentru tablouri bidimensioanale:
◦ tip variabila_tablou[] [];
 Alocarea unui tablou se poate face prin:
◦ tip variabila_tablou[] = new tip[numar_elemente]
◦ tip variabila_tablou[] = { el1, el2, … eln};
 Dimensiunea unui tablou se poate afla prin intermediul
atributului length:
◦ Variabila_tablou.length
 Dimensiunea unui tablou este fixa
 Depasirea limitelor unui tablou este testata automat la
executie si genereaza o eroare de tip
IndexOutOfBoundsException
 Pentru parcurgerea unui tablou se foloseste o secventa de
genul:
 For( i=0 ; i<tablou.length ; i++)
prelucreaza( tablou[i]);
 Exemple [C4_6.java], [C4_7.java]
 Clasa este o descriere a unei multimi de
obiecte caracterizate prin structuri si
comportamente similare.
 O clasa va cuprinde:
◦ Atribute - definitiile datelor (starii obiectelor)
◦ Metode - rutinele ce implementeaza
comportamentul obiectelor
 Sintaxa folosita pentru a defini o clasa in Java este:
[modificatori] class nume_clasa [mostenire] {
// date si metode
}
 Atributele:
◦ Variabile instanta – starea fiecarui obiect
◦ Variabile clasa – comune - declarate “static”
◦ Constantele – atribute declarate “final”
 Exemple:
◦ Persoana p1; p1.nume
◦ java.lang.Math.PI
 Metodele – proceduri si functii care
implementeaza comportamentul obiectelor
 Java permite supraincarcarea metodelor
dupa parametrii dar nu si dupa tipul
returnat. Ex:
boolean setNume( String nume );
boolean setNume( String nume, String prenume);
String setNume( String nume ); // gresit
 Metodele pot fi ale instantelor sau ale clasei
 Metodele clasei:
 declarate “static”
 pot actiona doar asupra atributelor de clasa
 se aplica clasei si nu obiectelor ( ex:
java.lang.Math.random() ).
 Metoda speciala: main() – punct de intare in
program
 Metode speciale: constructorii – permit initializarea
obiectelor la creare
 Constructorii permit supraincarcarea
 Orice clasa are fie constructori expliciti fie un
constructor implicit fara argumente
 Caracteristicile unei metode constructor:
◦ are acelasi nume cu clasa
◦ nu returneaza nimic
◦ va fi apelata automat la crearea unui obiect nou
◦ trebuie declarat public
Exemplu:
public class Persoana {
/** Atributele clasei */
String nume;// numele de familie
String prenume; // prenumele persoanei
int varsta; // varsta in ani impliniti

/** Constructor */
public Persoana( String numePers, String prenumePers ) {
nume = numePers;
prenume = prenumePers;
varsta = 0;
}
/** Metodele clasei */
public String getNume() {
return nume+" "+prenume;
}

}
 Modificatori de vizibilitate pentru membrii unei
clase: public, private, protected
 Public: acces nelimitat
 Private: acces restrictionat la clasa respectiva
 Protected: semnificatie in contextul mostenirii
 Implicit: vizibilitate la nivel de package
 Recomandare: atributele – protected; metodele –
public
 Metode de acces: getAtribut(), setAtribut()
 Instanta este un obiect al clasei respective
 Instanta are o stare data de atributele de tip variabila instanta
 In Java toate instantele unei clase se creaza in mod dinamic
 Crearea unei instante presupune aplicarea operatorului new()
de alocare dinamica:
◦ p1 = new Persoana( “Ionescu”, “Mihai”);
 Operatorul new() va chema constructorul clasei respective
pentru a face initializarile dupa alocarea memoriei pentru
instanta
 Exemplu: [Persoana.java]
 In Java nu exista nici un operator pentru stergerea
unei instante (si eliberarea resurselor ei)
 De eliberarea resurselor se ocupa o componenta a
masinii virtuale numita Garbage Collector (GC)
 Principiul de lucru al GC: Daca spre un anumit
obiect nu mai exista nici o referinta externa, acel
obiect devine candidat la eliminare din memorie:

Persoana p1 = new Persoana(“Ionescu”);
p1 = p2; // Ob. “Ionescu” devine candidat la eliminare
 GC actioneaza doar atunci cand este necesar (nu
mai sunt suficiente resurse pentru noi alocari)

 Pentru a efectua operatii suplimentare la eliminarea


obiectului se poate scrie o metoda finalize:
protected void finalize() throws Throwable {
System.out.println(“Se elimina persoana"+getNume());
}
 Permite reutilizarea codului prin extinderea
unei clase
 Superclasa – clasa mostenita (clasa de baza)
 Subclasa – clasa mostenitoare (clasa
derivata)
 Subclasa este “un fel de" superclasa
 Mostenirea:
◦ Simpla
◦ Multipla
A A B C

D D

 La mostenirea multipla: conflicte de nume


 Java permite doar mostenire simpla intre clase
 Obs. O superclasa poate fi extinsa de mai multe
subclase distincte
 Sintaxa Java pentru specificarea unei mosteniri:
class nume_subclasa extends nume_superclasa {
//continut specific subclasei
}
 O subclasa mosteneste toti membrii declarati ca
fiind “public” sau “protected” in superclasa
 Membrii declarati “private” in superclasa nu sunt
accesibili un subclasa
 Membrii mosteniti se comporta ca si membrii
definiti in clasa
 O clasa de baza impreuna cu toate descendentele
ei formeaza o ierarhie de clase
 Mostenirea in Java permite suprascrierea
metodelor pentru a reflecta particularitatile
subclasei
 Apelul unei metode din superclase se poate face
prin:
super.numeMetoda(parametrii)
 Un obiect de tip subclasa poate fi referit de o
variabila de tip superclasa, insa isi pastreaza
identitatea
 Exemplu [Student.java]
 Clase abstracte – clase care nu pot fi
instantiate
 Au rol doar in organizarea modelului
 Declarate cu modificatorul abstract
 Pot sa contina si metode abstracte si ne-
abstracte
 Metodele abstracte – doar declaratia, fara
implementare
 Toate clasele Java sunt incluse in aceiasi
ierarhie de clase
 Clasa “suprema” este clasa Object
 Daca o clasa nu specifica mostenirea unei
alte clase (prin extends), implicit se
considera ca mosteneste clasa Object
 Clasa Object contine doar cateva metode
esentiale precum: clone(), equal(), toString()
etc.
 Exemplu: intr-o ierarhie de figuri geometrice:
public abstract class Figura {
protected int x, y;
public abstract double aria( );
public void muta(int x0, int y0 ) {
x = x0; y = y0;
}
}
 Exemple [Figuri.java]
 Interfata – o clasa abstracta care are doar metode
abstracte (=> nu poate fi instantiata)
 Toate metodele continute – implicit abstracte – nu
pot fi statice si sunt implicit publice (nu vor aparea
explicit abstract si public la definire)
 Toate atributele continute – constante de clasa
(“static final”), fara a preciza “static final”
 Pot fi utilizate pentru a suplini lipsa mostenirii
multiple
 Specifica metodele suportate de clasele care o
implementeaza
 Interfetele permit o functionalitate comuna
intre clase din ierarhii diferite
 O clasa poate implementa mai multe
interfete simultan
 Daca o clasa implementeaza o interfata, ea
tebuie sa implementeze toate metodele
acelei interfete
 O interfata poate extinde oricate alte
interfete dar nu poate redefinii metodele
acestora
 Sintaxa de declarare a unei interfete este:
interface nume_interfata [extends interfete] {
// declaratii de atribute “static final”
// declaratii de metode (fara implementare)
}
 Sintaxa de implementare a unei interfete:
class nume_clasa [extends clasa]
[implements interfete]{
// declaratii de atribute
// declaratii de metode (fara implementare)
}
 Testul de conformitate cu o interfata se poate face prin
operatorul instanceof (la fel ca si in cazul claselor)
Aparat

Electronic Electric

Fax
Radio Radiator
Bec
Calculator Monitor

Intreruptibil
 Exemple [Interfete.java]
 Excepții: condiții care apar la rulare și necesită oprirea
programului (ex. împărțire la 0).
 Java permite specificarea unor acțiuni speciale care vor
fi executate automat la apariția unor astfel de situații.
 Dacă programatorul nu tratează o anumită excepție ea
va fi tratată automat prin oprirea programului și
afișarea unui mesaj de eroare.
 Excepțiile se tratează prin obiecte ale unei clase
derivate din clasa Trowable.
 Majoritatea excepțiilor sunt derivate din clasa
Exception sau RuntimeException.
 Pentru o portiune de cod se pot intercepta mai
multe excepții diferite.
 Pentru a trata excepțiile care apar într-un bloc de cod, acesta va
fi inclus intr-o secvență try … catch:
try {
// intrucțiuni de supravegheat
} catch (Exceptie1 e1) {
// tratare eroare e1
System.out.println(“A aparut eroarea Excepție1");
}
catch (Exceptie2 e2) {
// tratare eroare e2
System.out.println(“A aparut eroarea Excepție2");
}
finally {
// eliberare resurse – se execută necondiționat
}
 La apariția unei erori blocurile catch vor fi baleiate în
ordinea care apar
 Eroarea este tratată de blocul catch care conține tipul
erorii sau un supertip al acesteia
 O eroare netratată provoacă oprirea funcției și
revenirea în funcția apelantă
 Secvența se repetă până când eroarea este tratată sau
se parasește programul
 Secvența finally se execută și dacă a apărut și dacă nu
a apărut vreo excepție
 Generarea unei erori se poate face prin instrucțiunea
trow:
if(eroare) throw new TipExcepție( );
 Pentru a putea genera o eroare, tipul ei trebuie
declarat în antetul metodei:
… tipReturnat funcție(…) throws TipExcepție1,
TipExcepție2 …
 Dacă se apelează o metodă care tratează un tip de
eroare, ea trebuie inclusă într-un bloc try … catch
sau metoda curentă trebuie să declare de asemenea
acel tip de eroare.
 In Java sunt identificate două tipuri de erori posibile
(clase derivate direct din Trowable):
◦ Error (erori grave)
◦ Exception (excepții care pot fi tratate)
 Excepțiile utilizator sunt derivate de obicei din clasa
Exception
 Execepțiile care trebuie tratate la funcțiile de
bibliotecă sunt prezentate în documentația Java API
 Exemple [Exceptii.java]

S-ar putea să vă placă și