Sunteți pe pagina 1din 14

Introducere

1. Limbaje orientate obiect - Dezvoltarea aplicatiilor in stil OO


2. Limbajul Java
2.1. Generalitati
2.1.1. Caracteristici
2.1.2. Scrierea aplicatiilor Java
2.1.3. Pachete Java
2.2. Elementele limbajului
2.2.1. Variablie
2.2.1.1. Tipuri primitive
2.2.1.2. Tipul referinta
2.2.1.3. Tablouri
2.2.1.3.1. Alocarea memoriei pentru tablouri
2.2.1.3.2. Lungimea tablourilor
2.2.1.3.3. Initializarea tablourilor
2.2.1.3.4. Eliberarea memoriei alocate dinamic
2.2.2. Expresii
2.2.3. Exceptii
2.2.3.1. Exceptii si tratarea acestora
2.2.3.2. Aruncarea exceptiilor
2.2.3.3. Aspecte legate de performanta utilizarii exceptiilor
2.3. Tipuri de programe Java

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

Dezvoltarea aplicatiilor in stil OO


Pasii in dezvoltarea unei aplicatii indiferent de stilul de dezvoltare utilizat sunt:
1. analiza
2. proiectarea
3. implementarea
4. testarea.

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.

Analiza: Este facuta de catre un analist, care colaborand cu beneficiarul produsului


identifica obiectele principale ale aplicatiei. De exemplu in cazul unui sistem
informatic pentru banci, obiectele principale ar fi: Client, Factura, Tranzactie,
Angajat_Bancar etc. Rezultatul acestei faze se va concretiza intr-un model realizat de
catre analist. In aceasta faza se determina CE trebuie facut, dar nu si CUM trebuie
facut. Detaliile de implementare apartin altor faze. Se vor identifica subsistemele
principale ale produsului si se va realiza un dictionar de date continand descrierea
principalelor obiecte. In ultima faza a analizei se identifica resursele necesare pentru
sistem (hardver si software).

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.

Implementare, testare: Se implementeaza clasele pe baza diagramelor de clase. Daca


proiectul este bine pus la punct atunci munca din aceasta faza este doar munca de
rutina. Tot in acesta faza se incearca utilizarea componentelor gata facute astfel
reutilizand codul existent. Prima data se testeaza componente mai mici, dupa aceea
modulele si in ultima faza se testeaza produsul intreg.

Metode si instrumente de dezvoltare

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

UML este un standard, versiunile se gasesc la adresa http://www.rational.rose

Instrumente:

Denumire Metode Generare cod


OMT, Booch, C++, Smalltalk, Visual Basic,
Rational Rose (Rational Corporation)
OOSE, UML Java, Modula
OMTolol (General Electric Research and
OMT C++
Development Center )
Objectory (Objective Systems) OOSE
OMT, Booch,
With Class (MicroGold Software Inc. ) C++, Pascal, Eiffel, Smalltalk
OOSE, UML

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:

Fiser sursa: Aplicatie.java

// Un program care isi afiseaza argumentele primite la linia de comanda


public class Aplicatie{

public static void main( String args[] ){

for( int i=0; i<args.length; i++)

System.out.println(args[i]);

}
Faza de compilare:

javac Aplicatie.java -------> Aplicatie.class

Faza de interpretare:

java Aplicatie argument1 argument2 argument3 ...

In faza de interpretare se va crea un proces care contine in zona cod codul


interpretorului, iar in zona de date codul interpretat (BYTESCODE). Interpretorul este
mic si poate fi implementat usor pentru diferite platforme.
Unitatea de compilare este clasa. Clasele sunt componentele unei aplicatii care contin
date si cod. Clasele sunt incarcate in mod dinamic de catre o aplicatie Java. Ele sunt
incarcate in momentul in care sunt efectiv utilizate. Java contine si cateva clase
fundamentale care contin metode dependente de arhitectura. Aceste metode native sunt
implementate intr-un limbaj nativ platformei si permit accesul la sistemul de fisiere,
sistemul de ferestre si retea. Restul limbajului este scris in Java si este portabil. Aici
sunt incluse aplicatiile ca: compilatorul Java, browserul HotJava de la Sun etc.

2.1.3. Pachete Java

Pachetele Java sunt grupe formate din clase si interfete Java. Principalele pachete sunt:

Contine clasa Applet si clase pentru comunicarea intre


java.applet
aplet si contextul acestuia
Contine clase pentru crearea interfetelor grafice cat si
java.awt
pentru desenare si lucrul cu imagini
java.awt.color Permite lucrul cu culori
Clase si interfete pentru transferul datelor intre
java.awt.datatransfer
aplicatii
java.awt.dnd Clase si interfete pentru operatia drag and drop
Clase si interfete pentru evenimente generate de
java.awt.event
componente AWT
Clase si interfete pentru lucrul cu diferite tipuri de
java.awt.font
fonturi
Clase si interfete pentru crearea si modificarea
java.awt.image
imaginilor
java.awt.print Clase si interfete pentru tiparire
java.beans Clase si interfete pentru Java Beans
Clase si interfete pentru intrare/iesire cu fluxuri de
java.io
date
java.lang Clase fundamentale Java
Clase pentru efectuarea operatiilor aritmetice de
java.math
precizie oarecare
java.net Clase pentru implementarea aplicatiilor de retea
java.rmi Pachetul Remote Method Invocation
java.sql Pachetul pentru JDBC
java.util Clase utilitare ( Vector, Random, StringTokenizer, Date)
javax.swing Clase pentru componente lightwight

2.2. Descrierea limbajul Java


2.2.1. Variabile

Toate variabilelel Java sunt initializate. Fiecare tip are o valoare implicita cu care se
initializeaza variabilele de tipul respectiv.
Declaratie: tip nume_variabila [ = expresie ];

2.2.1.1. Tipuri primitive


logic - boolean
caracter - char
intregi - byte, short, int, long
flotante - float, double
Tipul boolean are ca valori true si false. Variabilele boolean neinitializate explicit vor
avea valorarea implicita false.
Tipul caracter are ca valori coduri UNICODE reprezentate pe doi octeti, astfel
permitand reprezentarea tuturor caracterelor limbilor existente. Valoarea implicita este
caracterul null cu codul '\u0000'.
Tipul byte este un tip intreg cu semn avand valorile intre -128 ..127. Valoarea implicita
pentru variabilele de tip intreg este 0. Celelalte tipuri intregi sunt reprezentate pe 16,
32 respectiv 64 biti.
Tipurile flotante sunt reprezentate pe 32 de biti, respectiv 64 de biti. Valoarea implicita
pentru variabilele flotante este 0.0f.
Reali speciali definiti de standardul IEEE
NaN - Not a Number. Este rezultatul unei impartiri cu 0. Ex. 0.0/0.0
Clasa java.lang.Float defineste aceasta constanta precum si altele cum ar
fi: POSITIVE_INFINITY, NEGATIVE_INFINITY

2.2.1.2. Tipul referinta

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

String s2 = s1; // Se aloca memorie pentru referinta s2 care este initializat cu


referinta s1

String s3; // Se aloca memorie pentru referinta s3

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[];

Cu constructia de mai sus se creaza o referinta la un tablou de inregi. Nu se aloca


memorie pentru inregii din tablou, practic in acest moment nici nu se cunoaste
dimensiunea acestuia. Alocarea de memorie pentru acest tablou se va face cu
urmatoarea constructie:
ti = new int[10];

Declaratia se poate face si mai compact: int ti[]= new int[10];


Initializarea tablourilor unidimensionale

int ti[]={1, 2, 3, 4, 5};

Tablourile bidimensionale sunt practic tablouri unidimensionale de referinte


int ti[][]=new int[5][]; // Se creaza un tablou de cinci referinte
ti[0]= new int[2]; // Se initializeaza prima referinta din tabloul ti,
ti[0]
ti[1]= new int[3];// Se initializeaza a doua referinta din tabloul ti,
ti[1]
2.2.1.3.2. Lungimea tablorilor

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

2.2.1.3.3. Initializarea unui tablou bidimensional.

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.1.3.4. Eliberarea memoriei alocate dinamic

Eliberarea memoriei alocate dinamic se face automat in Java. Zonele de memorie


nerefeite de nici o referinta sunt colectate de asa zisa "colectorul de gunoi", care se
ruleaza pe un fir de executie de tip demon (cu prioritate mica). Colectorul de gunoi se
poate invoca si explicit prin: System.gc(); Dereferentierea unei variabile se poate
face in urmatoarele moduri:
int x[] = new int[10];
...
x= null; sau x = new int[20];

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).

2.2.3.1. Exceptii si tratarea acestora

Proiectul Java a pornit cu scopul declarat de a dezvolta un software performant pentru


aparatele electronice de larg consum. Aceste echipamente se definesc ca mici,
portabile, distribuite si lucrand in timp real. Pentru controlul acestor echipamente era
absolut necesar ca erorile de tip software sa fie adecvat tratate. Nu se admite ca un
telefon sa nu functioneze din cauza unei erori software. Erorile software nu pot fi
eliminate, dar putem identifica secventele de cod care pot cauza acestea si le putem
trata. In limbajul C standard cade in responsabilitatea programatorului tratarea acestor
erori. Functiile returneaza de obicei -1 in caz ca a aparut vreo eroare. De exemplu la
deschiderea unui fisier inexistent pentru citire.
Java ofera o solutie eleganta pentru aceste probleme prin mecanismul de tratarea
exceptiilor. In cazul aparitiei acestor exceptii controlul executiei programului se
transfera la o sectiune de cod, scris in special pentru tratarea unei exceptii. Metodele
Java sunt declarate specificand tipurile de exceptii ce pot fi generate de acestea.
Exceptiile sunt instante (obiecte) ale clasei java.lang.Exception si ale sublcaselor
acesteia. Subclasele clasei Exception pot contine informatii speciale despre un anumit
tip de exceptie si un comportament adecvat. Exceptia cea mai importanta este definita
de clasa java.lang.IOException cu subclase speciale pentru diferite probleme I/O
cum ar fi FileNotFoundException respectiv SocketException.
Un obiect Exception este creat de catre cod in momentul cand au aparut conditiile
pentru o eroare. Obiectul de tip exceptie este transmis impreuna cu controlul executiei
catre codul de tratare a exceptiei.

In continuare vom prezenta exceptiile di cadrul pachetului java.lang impreuna cu


ierarhia de clase din care fac parte. In general avem doua tipuri de exceptii si acestea
sunt repezentate de subclasele clasei Throwable Exception si Error.Cele de tip Error si
RuntimeException sunt generate de mediul de executie. Ecxeptiile de tip Error sunt
generate de asemenea de catre mediul de executie, dar acestea nu pot fi prinse de
program. De exemplu masina virtuala Java nu are memorie suficienta.
java.lang.Exception
1. Object
1.1. Throwable
1.1.1. Exception
1.1.1.1. ClassNotFoundException
1.1.1.2. CloneNotSupportedException
1.1.1.3. IllegalAccessException
1.1.1.4. InstantiationException
1.1.1.5. InterruptedException
1.1.1.6. NoSuchMethodException
1.1.1.7. RuntimeException
1.1.1.7.1. ArithmeticException
1.1.1.7.2. ArrayStoreException
1.1.1.7.3. ClassCastException
1.1.1.7.4. IllegalArgumentException
1.1.1.7.4.1. IllegalThreadStateException
1.1.1.7.4.2. NumberFormatException
1.1.1.7.5. IllegalMonitorStateException
1.1.1.7.6. IllegalStateException
1.1.1.7.7. IndexOutOfBoundsException
1.1.1.7.7.1. ArrayIndexOutOfBoundsException
1.1.1.7.7.2. StringIndexOutOfBoundsException
1.1.1.7.8. NegativeArraySizeException
1.1.1.7.9. NullPointerException
1.1.1.7.10. SecurityException
java.lang.Error
1. Object
1.1. Throwable
1.1.1 Error
1.1.1.1. LinkageError
1.1.1.1.1. ClassCircularityError
1.1.1.1.2. ClassFormatError
1.1.1.1.3. ExceptionInitializerError
1.1.1.1.4. IncompatibleClassChangeError
1.1.1.1.4.1. AbstractMethodError
1.1.1.1.4.2. IllegalAccessError
1.1.1.1.4.3. InstantiationError
1.1.1.1.4.4. NoSuchFieldError
1.1.1.1.4.5. NoSuchMethodError
1.1.1.1.5. NoClassDefFoundError
1.1.1.1.6. UnsatisfiedLinkError
1.1.1.1.7. VerifyError
1.1.1.2. ThreadDeath
1.1.1.3. VirtulaMachineError
Sintaxa instructiunii:
try{
//bloc de instructiuni care pot cauza exceptii
}
catch( TipExceptie1 obiect1 ){
// codul de tratare a exceptiei TipExceptie1
}
catch( TipExceptie2 obiect2 ){
// codul de tratare a exceptiei TipExceptie2
}
finally{
//bloc de instructiuni care se executa intotdeauna
}

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.

2.2.3.2. Aruncarea exceptiilor

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

class MyException extends Exception{


MyException(){
super(); // Apel constructor superclasa
}
MyException( String text ){
super( text ); // Apel constructor superclasa
}
}

Utilizarea exceptiei:
try{
// operatii ce pot genera MyException
}
catch( MyException e ){
// tratare
}
catch( IOException e ){
//cod de tratare
}

2.2.3.3. Aspecte legate de performanta utilizarii tratarii exceptiilor

Exceptiile trebuie generate doar in imprejurari exceptionale. De exemplu la scrierea


unui ciclu se recomanda efectuarea unui test mic la fiecare reluare a ciclului, decat
generarea unei exceptii, care conduce inevitabil la marirea timpului de executie
datorita faptului ca trebuie gasit contextul cel mai apropiat de try-catch, dupa care
trebuie transferat controlul executiei si revenit dupa aceea.
2.3. Tipuri de programe scrise in Java
Java permite scrierea a doua tipuri de programe:
apleturi care se ruleaza in interiorul paginilor Web, incarcate de navigatoare. In
acest caz navigatorul are si un interpretor Java si interpreteaza codul octeti.
public class UnAplet extends java.awt.Applet{

public void paint( java.awt.Graphics g ){


g.drawString("Un aplet demonstrativ",10,10);
}
}
Fisierul HTML in care se incadreaza apletul:
<html>
<applet code="UnAplet.class" width=300 height=300>
</applet>
</html>

aplicatii care vor fi interpretate de catre interpretorul Java

Exemplu de aplicatie Java: Un program care isi afiseaza argumentele primite la linia
de comanda
public class OAplicatie{

public static void main( String args[] ){


int i;
for( i=0; i<args.length; i++)
System.out.println(args[i]);
}
}

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