Documente Academic
Documente Profesional
Documente Cultură
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
Simbol Caracter
\\ backslash
\n new line
\t tab
\” ghilimele
\’ apostrof
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)
D D
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]