Documente Academic
Documente Profesional
Documente Cultură
1. Limbaje OO
Anul de
Limbaj Dezvoltare Variante
aparitie
Borland C++; Microsoft C++; Watcom C+
AT&T Bell Laboratories; inceputul anilor
C++ +;
Bjarne Stroustrup 1980
GNU C++
SUN JavaSoft; James inceputul anilor Sun JDK; Symantec Visual Cafe;
Java
Gosling 1990 Microsoft Visual Java; Borland JBuilder
inceputul anilor
Smalltalk XEROX PARC Smalltalk V.; Smalltalk-80; IBM Smalltalk
1970
inceputul anilor
Eiffel Bertrand Meyer
1980
Apple Computer, Niklaus
Pascal 1986 Borland Turbo Pascal; Borland Delphi
Wirth
Dupa aceea apare si o faza de intretinere a produsului, prin care se intelege corectarea
unor mici erori care apar cu timpul si adaugarea de noi facilitati (mai mici)
produsului. Cateodata la produse neproiectate in mod corespunzator faza de intretinere
poate fi mai costisitoare decat faza realizarii produsului. De aceea este foarte
important ca aplicatia sa fie proiectata modular astfel incat modulele independente sa
se poata intretine si separat.
Proiectarea: Sarcina acestei faze este de a detalia modelul obiect rezultat din faza de
analiza. Proiectantul va determina sarcina exacta a obiectelor si structurile de date
respectiv algoritmii necesari pentru faza de implementare. Tot in aceasta faza se
construiesc diagrame de clase si de obiecte precum si diagrame de colaborare intre
obiecte.
Metode:
In faza de proiectare a produsului ( si nu numai in aceasta ) ne ajuta produsele CASE
(Computer Aided Systems Engineering ). Unele dintre aceste produse CASE stiu sa
genereze si cod intr-un anumit limbaj sau in mai multe limbaje.
OMT (Object Modeling Technique) 1991, James Rumbaugh
Metoda Booch, 1991, Grady Booch
OOSE (Object Oriented Systems Engineering) 1992, Ivar Jacobson
UML (Unified Modeling Language ) 1997, Rational Corporation, Santa Clara
California. Grady Booch, James Rumbaugh, Ivar Jacobson
Instrumente:
2. Limbajul Java
Limbajul Java are radacinile in C. Java este asemanator cu C++, dar este mai flexibil,
mai portabil si mai simplu de invatat. Parintele limbajului a fost James Gosling,
autorul celebrului editor de text emacs. Java incearca sa ramana un limbaj simplu, s-a
preluat partea buna a limbajului C++ si au fost eliminate partile derutante cum ar fi
supraincarcarea operatorilor si mostenirea multipla. Limbajul este independent de
arhitectura calculatorului pe care lucreaza (portabil). Nu genereaza cod nativ pentru o
platforma sau alta ci genereaza o secventa de instructiuni pentru o masina virtuala,
numita si Masina Virtuala Java (JVM). Aplicatiile Java vor fi interpretate. Deci Java
este un limbaj compilat si interpretat. Dezavantajul principal al limbajelor interpretate
este viteza de executie.
2.1.1. Caracteristici:
orientat obiect
distribuit (are biblioteci pentru scrierea aplicatiilor ce lucreaza in retea:
TCP/IP, URL)
securitate ridicata (facilitati de protectie a obiectelor )
permite lucrul cu mai multe fire de executie
2.1.2. Scrierea aplicatiilor Java
Scrierea unei aplicatii Java presupune existenta a amai multe faze. In prima faza se
face editarea programului sursa. Putem utiliza orice editor care stie sa salveze in
format text sau putem utiliza medii care genereaza cod. Rezultatul acestei faze este
unul sau mai multe fisiere sursa Java. Dupa faza de editare urmeaza faza de
compilare. Prin compilare se obtine unul sau mai multe fisiere bytescode (.class) cate
unul pentru fiecare clasa, clasa fiind unitatea de compilare. Dupa faza de compilare
urmeaza faza de executie.
Faza de editare:
System.out.println(args[i]);
}
Faza de compilare:
Faza de interpretare:
Pachetele Java sunt grupe formate din clase si interfete Java. Principalele pachete sunt:
Toate variabilelel Java sunt initializate. Fiecare tip are o valoare implicita cu care se
initializeaza variabilele de tipul respectiv.
Declaratie: tip nume_variabila [ = expresie ];
In C standard se pot defini tipuri noi, complexe cu ajutorul structurilor. In Java sau
alte limbaje OO se utilizeaza clase in locul structurilor. Clasa defineste un tip nou.
Referinta este similara cu notiunea de pointer din C cu exceptia ca referinta este un
pointer sigur ("safe-pointer"). Referinta este un fel de alias, un alt nume pentru un
obiect. Se utilizeaza in definitia claselor pentru a referi un obiect din interiorul unui alt
obiect.
Exemplu:
String s1 = "Un sir"; // Se aloca memorie pentru referinta s1 si pentru sirul constant
"Un sir". Se initializeaza referinta s1 cu adresa sirului constant
In exemplele precedente am creat trei referinte toate de tipul String. Primul a fost
initializat cu un sir constant, al doilea cu o alta referinta, iar al treilea nu a fost deloc
initializat. Valoarea implicita pentru variabile de tip referinta este null (referinta
neinitializata). La crearea referintelor nu se aloca memorie pentru obiectul referit, ci
doar pentru referinta. Alocarea de memorie se face in mod dinamic cu cuvantul
cheie new.
2.2.1.3. Tablouri
2.2.1.3.1. Alocarea dinamica a tablourilor
Tablourile sunt referinte speciale. Numele tabloului este o referinta cu ajutorul careia
ne putem referi la elementele tabloului.
Exemplu de referinta la un tablou de intregi:
int ti[];
In Java tablourile sunt alocate dinamic, ele isi pot schimba dimensiunile pe parcurul
executiei. Practic la alocarea unui tablou se creaza un nou obiect instantiat dintr-o
clasa ce permite stocarea a mai multor elemente de acelasi tip. Astfel avem la
dispozitie variabila de clasa length ce ne furnizeaza lungimea tabloului. Pentru
exemplul precedent obtinem urmatoarele valori:
int dim_ti = ti.length; // se va obtine 5
int dim_ti_0 = ti[0].length; // se va obtine 2
int dim_ti_1 = ti[1].length; // se va obtine 3
Varianta 1. Se initializeaza un tablou cu doua linii, fiecare linie avand acelasi numar
de elemente.
int t[][] = new int[2][3];
int i,j;
for( i =0; i<t.length; i++)
{
for( j=0; j<t[i].length; j++){
t[i][j] = i*3+j;
System.out.print(t[i][j]);
System.out.print(" ");
}
System.out.println();
}
Rezultatul executiei:
0 1 2
3 4 5
Varianta 2. Se initializeaza un tablou cu doua linii, liniile avand lungime diferita.
int t[][] = new int[2][];
int i,j, c=0;
for( i =0; i<t.length; i++)
{
t[i] = new int[(i+1)*2];
for( j=0; j<t[i].length; j++){
t[i][j] = c++;
System.out.print(t[i][j]);
System.out.print(" ");
}
System.out.println();
}
Rezultatul executiei:
0 1
2 3 4 5
2.2.2. Expresii
Expresia are un tip si o valoare. Valoarea se obtine prin evaluarea expresiei. Tipul
expresiei se cunoaste inca din faza de compilare. Valoarea expresiei poate fi de un
anumit tip primitiv (rezultatul unei expresii numerice 20+3-6) sau poate fi o referinta
( new OClasa() ) sau poate fi tipul void, ca rezultatul unei metode (functii) ce
returneaza acest tip.
Operatori - Diferente fata de C standard
Java nu suporta operatorii de adresare directa & si cel de adresare indirecta *.
Operatorul de secventiere "," nu este suportat de Java. Nici sizeof nu este suportat.
In schimb avem operatori noi cum ar fiinstanceofsi operatorul + se poate utiliza si la
obiecte de tip String.
String s1 = new String("Un sir de caractere");
String s2 = "Un alt sir de caractere";
boolean b1= (s1 instanceof String);// true
b1 = ( s2 instanceof Object);// true
b1 = ( s1 instanceof Integer );// false
Toate clasele deriva din clasa Object. Aceasta este superclasa tuturor claselor Java.
Operatorul instanceof verifica daca un obiect apartine unei clase. Orice obiect din
subclasa unei clase apartine si superclasei. (Clasa String este subclasa clasei Object,
clasa Object este superclasa clasei String).
2.2.3. Exceptii
Cand vorbim despre exceptii trebuie sa facem diferenta intre instructiunea de generare
(aruncare) a exceptiilor ( throw) respectiv de instructiunea de tratarea acestora (try-
catch-finally).
Exemplu:
public class fin{
public static void main( String args[] )
{
int i =0;
try{
i = Integer.parseInt( args[ 0 ] );
}
catch( ArrayIndexOutOfBoundsException e1 )
{
System.out.println(e1.toString() );
i=10;
}
catch( NumberFormatException e2 ){
System.out.println( e2.toString() );
i = 20;
}
finally{
i++;
}
System.out.println(i);
}
}
Exemple de executii: ( se compileaza javac fin.java ---> fin.class )
1. java fin
java.lang.ArrayIndexOutOfBoundsException
11
2.java fin 4
5
3. java fin qwerty
java.lang.NumberFormatException
21
Daca exceptia generata nu este prinsa de catre program atunci aceasta va fi prinsa de
catre mediul de executie Java care de obicei suspenda executia programului afisand
exceptia din cauza caruia s-a oprit programul. Daca se trateaza exceptia atunci
controlul executiei programului se transfera la codul de tratare dupa care daca exista
si clauza finally se executa instructiunile de aici, dupa care se continua cu prima
instructiune de dupa blocul try-catch-finally. Daca intr-un bloc try avem mai multe
clauze catch atunci se va cauta secvential intre aceste clauze si numai primul potrivit
va fi executat.
Exemplu:
try{
//cod sursa exceptie de tip IOException
}
catch( Exception e1 ){
// cod de tratare 1
}
catch( IOException e1 ){
// cod de tratare 2
}
In exemplul precedent in cazul generarii exceptiilor intotdeauna se va executa codul de
tratare 1, deoarece orice exceptie este implicit si de tip Exception, aceasta clasa fiind
superclasa tuturor exceptiilor. Concluzia de aici este ca trebuie sa fim foarte atenti la
ordinea in care sunt plasate clauzele catch.
fara a crea o clasa noua de exceptii: prin constructia throw new Exception("S-a
intamplat ceva rau"); Se creaza un obiect de tip Exception si controlul se
transfera blocului de tratate a exceptiei cel mai apropiat.
prin extinderea clasei Exception
Utilizarea exceptiei:
try{
// operatii ce pot genera MyException
}
catch( MyException e ){
// tratare
}
catch( IOException e ){
//cod de tratare
}
Exemplu de aplicatie Java: Un program care isi afiseaza argumentele primite la linia
de comanda
public class OAplicatie{