You are on page 1of 86

Luca Dan Serbanati-Programare orientata spre obiect

PROGRAMARE ORIENTAT SPRE OBIECT (Limbajul Java)

Coordonator curs: Prof. univ. dr. Luca Dan erbnai

Luca Dan Serbanati-Programare orientata spre obiect

Luca Dan Serbanati-Programare orientata spre obiect

1 CARACTERISTICILE LIMBAJULUI JAVA


Limbajul Java prezint urmtoarele caracteristici: - limbaj de programare orientat spre obiecte (POO), - mic, simplu (conceput de Sun n jurul unor concepte de programare riguros respectate), - robust (posibiliti reduse de erori), - sigur, protejat de programele care pot crea daune accidentale sau intenionate, - independent de platform (portabil: write once, run anywhere), - distribuit n reea (adaptat folosirii n Internet precum i n intranet), - interpretat (utilizeaz o Main Virtual Java care interpreteaz un cod compilat), - concurent (include faciliti ce permit crearea i gestiunea de fluxuri de control concurente). Java este un limbaj de programare orientat spre obiecte din urmtoarele motive: - n timpul proiectrii, un program este un ansamblu de clase i interfee, - n timpul execuiei, un program este un ansamblu de obiecte care comunic ntre ele, - un obiect este format din date i metode (obiect = date+metode), - obiectele sunt grupate n clase, - a fost construit pe o ierarhie de clase bazat pe motenire, - conine o bibliotec de clase, - ncurajeaz reutilizarea componentelor. 1.1 INSTALAREA SDK 1.x.x SDK 1.x.x sunt versiuni standard Sun ce conin implementri de Maina Virtual Java, pachete de clase i interfee standard, precum i un mediu rudimentar de programare constituit din cteva instrumente de suport al programrii. SDK 1.x.x se pot descrca din site-ul www.java.sun.com. Pentru platforme Windows sunt fiiere executabile (.exe) care instaleaz n mod ghidat ntregul software al versiunii 1.x.x. Structura arborescent de directoare JDK : \jdk1.x.x - director ce conine software-ul JDK bin - compilator+alte instrumente demo - programe demonstrative applets jfc include - fiiere pentru metode native win32 jre bin lib lib - fiiere de bibliotec ... In directorul \jdk1.x.x \bin se gasesc programele executabile ale kit-ului de instalare. Cele mai importante programe sunt:
java javac appletviewer jdb javap javah javadoc jar policytool rmi, rmid, rmiregistry interpretorul de execuie (run time) compilator Java -> bytecode vizualizeaz applet-urile debugger deasamblor bytecode -> Java generator de fisiere .h n C generator de documentaie instrument de arhivare interfa pentru politicile de securitate instrumente RMI

Pentru instalarea kit-ului pe o masina Windows xx se vor executa urmatoarele operatii: 1. n fiierul autoexec.bat se va aduga la variabila de sistem PATH path-ul directorului n care se gsesc programele executabile. De exemplu, dac instalarea software-ului s-a fcut n directorul C:\jdk1.4.x se va aduga C:\jdk1.4.x\bin; :

Luca Dan Serbanati-Programare orientata spre obiect

SET PATH=%PATH%;C:\jdk1.4.x\bin Similar, n Windows NT se va aduga la variabila de sistem PATH path-ul directorului n care se gsesc programele executabile. 2. Opional, se creaz o variabil CLASSPATH astfel: SET CLASSPATH =C:\jdk1.x.x\lib\tools.jar;.;C:\DirectorulMeu unde x.x este versiunea utilizat de JDK i DirectorulMeu este directorul unde se gsesc programele compilate aplicatieie (fisere .class). 1.2 TIPURI DE PROGRAME N JAVA n Java, programele sunt de patru tipuri: - aplicaii - applet - servlet - plug-in Program n Java = una sau mai multe clase care definesc date i comportamente ale obiectelor care reprezint instane de concepte. Un program Java trebuie s fie compilat cu compilatorul Java (javac.exe). Programul compilat este o secven de bytecode care va fi memorat n una sau mai multe fisiere .class. Operaiile din bytecode stream vor fi interpretate de o Main Virtual Java (JVM). Fiierele class sunt portabile pe toate platformele hardware i software. 1.3 APLICAII VS. APPLET -------------------------------------Pagina HTML

contine

angajat

---------------Programul (file .java)

editor
EDITARE

Execuie (Interpretare) browse r Pagina Web

javac COMPILARE +(import) Aplicaie

-------------

------Applet Monitor

Programe n bytecode (fiiere .class) Bibliotec (FIIERE .java) java EXECUIE (Interpretare)

1.4

MEDIUL DE EXECUIE

n figura urmtoare se prezint structura mediului de execuie al mainii virtuale Java:

Luca Dan Serbanati-Programare orientata spre obiect

Faza 1

Editor

Programul este creat cu editorul i este memorat pe disc Compilatorul creaz bytecode-urile i le memoreaz pe disc Memoria principal Clasa loader ncarc bytecode-ul n memorie

Faza 2 Compilator

Faza 3

Clasa Loader

Faza 4

Bytecode

Memoria principal Verificatorul de bytecode confirm c ntregul program este corect i nu contrazice legturile de siguran

Faza 5

Bytecode

Memoria principal Interpretorul citete bytecode-ul i l traduce n limbajul calculatorului, memornd valorile datelor pn cnd programul va fi executat

Luca Dan Serbanati-Programare orientata spre obiect

2 FUNDAMENTE DE PROGRAMARE N JAVA


2.1 COMPILAREA SI EXECUTIA UNUI PROGRAM JAVA S se compileze i s se execute urmtorul program:
public class ProgramSimplu { //Metoda main initiaza executia unei aplicatii Java public static void main(String[] args){ System.out.println("Acesta este un program simplu"); System.exit(0); } }

Paii procedurii de compilare si executie sunt: - Scrieti textul programului cu un word-processor la ndemana. Utilizai de exemplu Notepad sau WordPad pentru scrierea codului programelor voastre; - salvai programului ntr-un director numit CursJava pe disc, cu numele i extensia ProgramSimplu.java; - deschidei o fereastr DOS de la Start>Programs>MS-DOS Prompt; - schimbai directorul curent n directorul CursJava; - executai comanda >javac ProgramSimplu.java; - executai comanda >java ProgramSimplu. 2.2 ELEMENTE DE BAZ ALE LIMBAJULUI JAVA

Sa consideram urmatorul program simplu in Java:


// /* Primul program in Java

Lipseste pachetul de importat */ class BunaTuturor { public static void main (String[] args){ BunaTuturor obiect = new BunaTuturor(); obiect.afiseazaMesaj(); } public void afiseazaMesaj() { int j = 10; System.out.println("Buna ziua, tuturor!"); } }

Acelasi program, de data aceasta cu explicatii ale constructiilor sintactice folosite se prezinta n figura urmatoare:

Luca Dan Serbanati-Programare orientata spre obiect

// /*

Primul program in Java

Comentariu

Cuvnt h i Modificator de acces Tip de date utilizator

Lipseste pachetul de importat */ class BunaTuturor

Identificator de clasa
{

Array

public static void main (String[] args){

Declaratie de variabila
BunaTuturor obiect = new BunaTuturor(); obiect.afiseazaMesaj(); Operator

Instruciune apel de metoda Declaraia de clasa

Variabil referin } Identificator Tipul nume de metoda rezultatului public void afiseazaMesaj() { Constanta int Tip de date int j = 10; numar intreg primitiv Instruciune - apel de metoda System.out.println("Buna ziua, tuturor!"); Identificator de variabila
} }

Constructor de obiecte

Declaratia metodei main

Corpul metodei afiseazaMesaj bloc de instructiuni

Constanta String sir de caractere

2.3

VARIABILE

O variabil este un element de program care refer un spaiu n memoria calculatorului unde se pot memora date n timpul execuiei programului. O valoare asignat unei variabile nlocuiete valoarea precedent. De exemplu, urmtoarele instruciuni de atribuire:
sold = 2500000; cf = SRBLDN44L15129J; suma = numar1 + numar2;

modific valoarea variabilelor sold, cf i suma. n schimb, citirea unei variabile nu modific valoarea memorat. In figura urmatoare se prezinta schematic executia instructiunii
suma = numar1 + numar2;

Memoria numar1 numar2 suma 14 + -8 6

Valorile extrase din variabilele numar1 si numar2 sunt insumate si rezultatul este apoi memorat in variabile suma. In Java toate variabilele trebuie declarate inainte primei lor utilizari. In declaratie se poate preciza si valoarea cu care variabila este initializata. Sintaxa declarrii variabilelor este urmtoarea:

Luca Dan Serbanati-Programare orientata spre obiect

Tip Identificator; Tip Identificator [=Expresie] {,Identificator [=Expresie]};

In lipsa initializarii, variabila ramane de regula neinitializata. Exista cazuri care vor fi prezentate in capitolul urmator, in care compilatorul Java initializeaza automat cu o valoare predefinita variabila, chiar daca programatorul nu a specificat o valoare de initializare. Exemple:
int imprumut; String mesaj, nume = Ion; boolean gata = true;

Atributele unei variabile sunt: - tipul de date:


int a; Persoana p; // variabil ntreag

// variabil Persoana
// variabil String privat // variabil boolean public // variabil ntreag static

vizibilitatea:
private String nume; public boolean esteVizibil;

2.4

zona de memorie unde este plasata variabila:


static int contor;

TIPURI DE DATE

Tipurile de date n Java se pot imparti n doua mari categorii: - Tipuri primitive, preexistente n (built-in) limbaj: tipuri ntregi, reale, caracter etc. - Tipuri construite ad hoc. Aceste tipuri reprezinta entitati complexe ce se pot construi folosind mecanisme oferite de limbajul Java si care pot fi array-uri, clase sau interfee. Aceste tipuri pot fi definite de utilizatorul limbajului Java (programator) sau definitia lor poate fi oferita de o librarie existenta de tipuri Java. In ultimul caz avem de-a face cu o reutilizare de tipuri Java. Dup categoria de tipuri cu care se declara, variabilele Java pot fi: 1. de tipuri primitive 2. de tipuri referin (reference) la un tip T. Un caz particular de valoare de tip reference este null. Ea indica, pentru orice tip reference, inexistenta unei entitati Java referita. Variabilele, dup vizibilitate pot fi: - Variabile ale unei instane, pe scurt variabile instan; - Variabile ale unei clase, pe scurt variabile clas; - Variabile locale. Tipuri de date primitive (intregi) byte short int long (reale) float double (alte tipuri) char boolean Nume tip boolean byte short char int long Byte-length integer Short integer Integer Long integer Single-precision floating point Double-precision floating point Un caracter Valoare logic (true sau false) Reprezentare intern 1 bit 1 byte 2 byte 2 byte 4 byte 8 byte 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement 32-bit IEEE 754 64-bit IEEE 754 16-bit Unicode character true sau false

Domeniu de valori true sau false -128 127 -32.768 32.767 \u0000 \uFFFF -2.147.483.648 2.147.438.647 -9.223.372.036.854.775.808L 9.223.372.036.854.775.807L

Luca Dan Serbanati-Programare orientata spre obiect

float double

4 byte 8 byte

3,40282347E+38F 1,79769313486231570E+308

Conversii de tipuri primitive: 1. Conversii automate. Java realizeaz conversia implicit a datelor de tip primitiv, adic schimb automat tipul valorii unei variabile sau expresii la un alt tip. Sensul conversiei automate este artat n urmtoarea figur: char int byte short long float double

Conversiile automate se includ de compilator n cazul atribuirilor, n cazul apelurilor de metode la efectuarea transmiterii parametrilor i n cazul calculului expresiilor aritmetice. Ideea de baz este c n aceste conversii nu trebuie sa se piarda informaii. Astfel, tipurile primitive de date convertibile (toate n afar de tipul boolean) sunt incluse din punctul de vedere al domeniului valorilor reprezentate in alte tipuri mai largi (de exemplu, toate valorile de tip short se regsesc n valori de tip int, toate valorile int se regasesc in domeniul valorilor long etc.). 2. Conversii explicite. Casting este o cerere explicit de realizare a unei conversii de tipuri de date:
short x = (short)75;

In asemenea cazuri compilatorul va efectua conversia ceruta doar daca aceasta conversie este posibila (inclusiv prin o eventuala pierdere de informatie ca in cazul conversiei de la float la int). In cazul unei conversii imposibile (de la boolean la int de exemplu), compilatorul semnaleaza eroare de compilare. 2.5 CONSTANTE Constant = Element textual (token) n program care reprezint o valoare fixa ce nu se poate modifica n cursul executiei programului.
static final int MAX_VAL = 14567;

De exemplu n instructiunea: int an=2001; 2001 este o constant. Constante simbolice = Variabile declarate cu modificatorul final. De obicei, constantele sunt declarate ca variabile clas ca MAX_VAL de mai sus: n funcie de tipul de date de care aparin, constantele pot fi: - constante numerice ntregi: 16547 654 987634872L 0777 0x5A67 - constante numerice reale: 2.25 -4556.43 3.1415927F 12.5e6 19E-65 - constante booleene: true false \u4323 - constante caractere: a # 5 \0377 xA Not. Caracterul special escape: \ poate fi folosit n urmtoarele secvene escape pentru formatarea informaiilor afiate la consol: \n Newline. Poziioneaz cursorul la nceputul liniei urmtoare. \t Tab orizontal. Aeaz cursorul la urmtorul tab. \r Carriage return. Aeaz cursorul la nceputul liniei curente, trecnd n modul suprascriere. \f Form feed. Avanseaz cu o pagin \\ Blackslash. Este folosit pentru a afia caracterul \. \ Apostrof. Este folosit pentru a afia caracterul apostrof. \ Ghilimele. Este folosit pentru a afia caracterul ghilimele. - constante ir: acesta este un sir. Exerciiul 2. S se compileze i s se execute urmtorul program care calculeaz suma a dou numere ntregi preluate din linia de comand. Observaie. Programul se va executa de la tastatura cu comanda: PROMPT>java Suma 12 34

Luca Dan Serbanati-Programare orientata spre obiect

public class Suma { public int int int

array de String-uri care memoreaz parametri liniei de comand declararea variabilelor cu nume i tip de date

static void main(String args[]) { numar1; // variabila pentru primul numar numar2; // variabila pentru al doilea numar suma; // variabila pentru suma

//converteste primul numar de la tipul String la tipul int primul argument al liniei numar1 = Integer.parseInt(args[0]);

de comand (12)
//converteste al doilea numar de la tipul String la tipul int numar2 = Integer.parseInt(args[1]); al doilea argument al

liniei de comand (34)


//calculeaza si memoreaza suma a doua numere in variabila suma suma = numar1 + numar2; //vizualizeaza rezultatul System.out.println("Suma este " + suma); } //sfarsitul metodei main } //sfarsitul clasei t

2.6

TIPURI DE DATE CONSTRUITE

Cu construcia class utilizatorul poate defini noi tipuri de date. Aceste tipuri reprezint instante de concepte din realitate precum: pisic, angajat, funcie, main etc. Conceptele respective se pot descrie att prin proprietati ct si prin actiunile pe care le pot efectua in lumea reala. Exemplu:
class Pisica{ String nume; // este o proprietate ce memoreaz numele pisicii void miaun() { //este o actiune ce reproduce comportamentul unei pisici System.out.println(Miau); } }

Deci o clas va conine fie informaii care reprezint proprieti ale tipului considerat: nume, vrst, culoare etc., fie descrieri ale actiunilor care privesc comportamentul instanelor clasei. O asemenea descriere furnizeaz un mecanism care permite simularea unui comportament al instanelor unei clase. Dac vrem s tim numele instantei de pisic memorat in variabila pisicaMea, folosim pisicaMea.nume. In aceasta situatie pisicaMea.miaun() va reproduce n program comportamentul pisicii pisicaMea. Memorarea datelor de ctre JVM JVM, Masina virtuala Java, dupa cum rezulta din denumirea ei, nu este un calculator fizic, ci este simulata prin software. In acest scop exista programul java.exe din kit-ul SDK care creaza mediul pentru executia unui program ce ii este furnizat ca argument. Executia programului se face prin analizarea, instructiune cu instructiune, a codului sau de catre un interpretor de bytecode si prin executia fiecarei instructiuni analizate folosind resursele JVM. O resursa importanta a JVM este memoria care este structurata in mai multe componente, fiecare cu specificul ei. Componentele de memorie utilizate de mediul de execuie Java sunt: - regitrii. Ei formeaz memoria cea mai rapid, dar din pcate, nu sunt accesibili n Java; - memoria Stack care conine de obicei, referinele obiectelor si este implementata in RAM;

Luca Dan Serbanati-Programare orientata spre obiect

memoria Heap care este un depozit n memoria RAM pentru toate obiectele si array-urile din program. Astfel, fiecare obiect creat cu new va fi adugat n memoria Heap; memoria static care este implementata n RAM. In ea se memoreaza toate elementele constante din program cum ar fi sirurile constante si care trebuie sa fie disponibile n timpul executrii progamului; memoria non-RAM. Sunt suporturi diferite utilizate pentru memorarea datelor care au asigurata persistenta independent de executia programului. Pe aceste suporturi datele sunt organizate ca: - fisiere de byte sau de caractere sau - fisiere de obiecte persistente, memorate pe disc i care i pstreaz starea dup terminarea executrii programului n care au fost folosite. Aceste fisiere pot fi convertite n fluxuri de bytes pentru a putea fi citite in memorie sau trimise unui alt calculator sau pot fi scrise convertind in bytes date din memorie.

Disc

Cod

Memoria static

Heap

Proceso r Regitri

Stiv
RAM

2.7

EXPRESII N JAVA

n general, o expresie este o descriere a unui calcul a crui evaluare produce o valoare unica, de un tip bine stabilit. O expresie este format din operanzi i operatori. n urmtorul tabel, pentru fiecare categorie de expresii, se prezinta cteva exemple, mpreun cu ntelesul lor: Expresie Expresii booleene
x > 3 x == z x != y b

Semnificaie x este strict mai mare dect 3 x este egal cu z x este diferit de y b este adevrat
(x + 7) y 2

Expresii numerice
(x+7)*y/2 2*a*3.14

2.a.3,14 x>3 i x este egal cu z a + d < c sau b

Expresii logice
x > 3 && x == z a + d < c || b

Apeluri de metode valoarea obinut prin executarea metodei getValue() este nmulit cu 77.4 amiculMeu.getPrenume() apeleaz metoda instan getPrenume() a variabilei instan amiculMeu. Crearea obiectelor i memorarea referinelor lor n variabile instan Mamifer m=new se creaz un obiect al clasei Mamifer i referina la el este Mamifer() memorat n varibila m de acelai tip: Mamifer Expresii cu operatori aritmetici i atribuiri x = y = z = 82; z=82; y=z; x=y s = Buna; se creaz un obiect de tip String cu valoarea Buna i referina la el este memorat n variabila de acelai tip s. x = 123.5/8.75f*y; noua valoare a lui x va fi valoarea expresiei: 123.5/8.75*y.rv
getValue()*77.4

Luca Dan Serbanati-Programare orientata spre obiect

Expresie Semnificaie Expresii cu operatorul de concatenare a irurilor s=s+ziua! noua valoare a lui s va fi o referin la obiectul cu valoarea Buna ziua! 2.8 OPERATORI N JAVA

n tabelul urmtor prezentm operatorii din Java, mpreun cu semnificaia lor, clasificati in mai multe categorii. Operator Semnificaie Operatori de comparaie
< <= > >= == != instanceof * / % + mai mic mai mic sau egal mai mare mai mare sau egal

Operator Semnificaie Operatori logici


&& || & |

Operator Semnificaie Operatori pe iruri


+ << >> >>> concatenare depl. la stnga depl. la dreapta cu extensie semn depl. la dreapta cu extensie 0

i (evaluare scurt) sau (evaluare scurt) i (evaluare complet) sau (evaluare complet) egal ^ sau exclusiv (evaluare complet) diferit ! not determin dac un obiect aparine unei clase ++ -+= -= *= <<= >>= incrementeaz cu 1 decrementeaz cu 1 incrementeaz cu valoarea specificat decrementeaz cu valoarea specificat multiplic cu valoarea specificat deplaseaz stnga cu valoarea specificat deplaseaz dreapta cu semn cu valoarea specificat

Operatori de deplasare

Operatori aritmetici
nmulire mprire modulo adunare scdere

Operatori multifuncionali
/= %= &= |= ^= >>>= (tip) mparte cu valoarea specificat modulo valoarea specificat i pe bii cu valoarea specificat sau pe bii cu valoarea specificat xor pe bii cu valoarea specificat deplaseaz dreapta fr semn cu valoarea specificat conversie explicit a operandului la tipul specificat

Ordinea de evaluare a expresiilor este dat de precedena i asociativitatea operatorilor componente: Tip operator
operatori postfixai operatori unari creare sau cast multiplicativi aditivi deplasare relaionali egalitate AND pe bii XOR pe bii OR pe bii AND logic OR logic condiional atribuiri

Operatori
[] . (parametri) expr++ expr-++expr --expr +expr -expr ~ ! new (tip)expr */% +<< >> >>> < > <= >= instanceof == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= >>>=

Asociativitate
dreapta dreapta dreapta stnga stnga stnga stnga stnga stnga stnga stnga stnga stnga stnga dreapta

Luca Dan Serbanati-Programare orientata spre obiect

2.9

INSTRUCIUNI N JAVA

Instruciuni-expresie
-

expresii de atribuire: oValoare = 8933.234;//instruciune-expresie utilizarea lui ++ sau -- : oValoare++; //instruciune-expresie: incrementare apeluri de metode: System.out.println(oValoare); //instruciune-expresie: apel expresii de creare a obiectelor: Integer obiect=new Integer(4);//creare obiect Exemple:
-

oValoare = 8933.234; //instruciune-expresie oValoare++; //instruciune-expresie: incrementare System.out.println(oValoare); //instruciune-expresie: apel de metod Integer obiectIntreg=new Integer(4); //creare obiect

Instruciune de declarare
double oValoare = 8933.234; //instruciune declaraie

Instruciunile de control sunt de trei tipuri si anume: structura secven, structura de selecie i structura repetitiv. Instructiunea secven Instructiunea secven este ncorporat n Java. Dac nu se specific altfel, compilatorul execut instruciunile n ordinea n care sunt scrise. Mai mult, instruciunile pot fi grupate. Un bloc de instruciuni este un grup format din zero sau mai multe instruciuni cuprinse ntre {}. Instruciunile de ramificare a controlului Instruciunile de decizie sunt instruciunile de decizie if cu una sau doua alternative i instruciunea de selectie switch. Sintaxa i schemele logice ale acestora sunt date n figura urmtoare: Instruciunea if-else cu o singur alternativ Instruciunea if-else cu dou alternative C I1

if (Condiie) Instruciune1

if (Condiie) Instruciune1 else Instruciune2

C I1 I2

Instruciunea multipl

if-else Instruciunea switch C1 I1 C2 I2 C3 I3 IE

if (Condiie1) Instruciune1 else if (Condiie2) Instruciune2 else if (Condiie3) Instruciune3 else InstruciuneElse

switch (E) { E=K1 case K1: ListaInstruciuni1 case K2: E=K2 ListaInstruciuni2 default: ListaInstruciuniDef }

LI1

LI2

LID

unde:

Luca Dan Serbanati-Programare orientata spre obiect

C, C1, sunt condiii, adica expresii logice, cu valoare boolean, I1, I2, sunt instruciuni, E este o expresie, LI1, LI2, LID sunt liste de instruciuni, K1, K2, sunt constante ntregi sau caractere. In conditiile utilizate de instruciunile ce trebuie sa decida asupra urmatoarei instructiuni de executat se pot folosi metode care ntorc valori booleene. De exemplu, n clasa Pisica putem avea o metod care s verifice dac o pisic este sau nu prietenoas cu copiii. Pentru aceasta, pisica ar trebui s fie prietenoas n general i sa fie dresat. Aceste dou caracteristici sunt memorate n variabilele instan: prietenoasa i dresata, si pe care le vom folosi n metoda prietenoasCuCopiii()care implementaeaza predicatul logic x este prietenoas i x este dresat. n acest caz, codul clasei Pisica se modific astfel:
class Pisica{ String nume; boolean prietenoasa=true; boolean dresata=false; . . . boolean prietenoasaCuCopiii() { if(prietenoasa==true&&dresata==true) return true; else return false; } }

Instruciunea switch realizeaz (selecteaz) o instructiune sau un grup de instruciuni n funcie de valoarea expresiei specificate n switch. Instruciunile repetitive Instruciunile repetitive sunt de trei tipuri: instruciunea while, instruciunea do-while i instruciunea for. Sintaxa i schemele lor logice sunt urmtoarele: Instruciunea while Instruciunea for C I for (ExpresieInitiala;Condiie; Increment) Instruciune Legend EI - ExpresieInitiala C - Condiie In - Increment I - Instruciune ntreruperea iteraiei ntreruperea execuiei repetitive/switch curente: continue; break; break eticheta; EI C I In C

while (Condiie)
Instruciune

Instruciunea do-while do Instruciune while (Condiie) I

Exerciiul 3. mbogim clasa Pisica cu o metod care afieaz de un numr de ori cuvntul Miau. Numrul este specificat ca parametru al metodei. Aceast metod va fi folosit ntr-o alt clas CorDePisici.

Luca Dan Serbanati-Programare orientata spre obiect

class Pisica{ . . . void miauna(int nr) { while (nr > 0) { System.out.println(Miau); nr --; } } }

public class CorDePisici{ public static void main(String[] args){ Pisica pufi=new Pisica(); Pisica fifi=new Pisica(); pufi.miauna(4); fifi.miauna(3); new Pisica().miauna(4); } }

Exerciiul 4. Vom scrie un program care calculeaz i afieaz suma numerelor ntregi de la 1 la 10. Pentru aceasta avem dou modaliti: 1. varianta 1: scriem ntregul cod n metoda main, 2. varianta 2: definim variabila instan suma: int i metoda instan aduna(int n) care adun numrul n la suma anterioar, n varianta 2. n metoda main, crem un obiect al clasei curente (Demo), referina la el o memorm ntr-o variabil local demo de acelai tip i adunm la suma fiecare numr de la 1 la 10, apelnd metoda aduna(numar). n continuare, prezentm codul celor dou variante, care au acelai rezultat: Suma = 55.
//Varianta 1 public class Demo{ public static void main(String[] args){ int suma = 0; //atribuire for(int contor=1; contor<=10; contor++){ //instruciune de control suma += contor; //atribuire } //apel de metoda System.out.println("Suma = " + suma); } }

//Varianta 2 public class Demo{ int suma; void aduna(int c) {suma+=c;} public static void main(String[] args){ Demo demo=new Demo();//initializare //instructiune de control for (int contor=1; contor<=10; contor++){ //apel de metoda demo.aduna(contor); }//for //apel de metoda System.out.println("Suma= " + demo.suma); } }

Probleme propuse.

Luca Dan Serbanati-Programare orientata spre obiect

1. S se implementeze un program care realizeaz operaii de schimb al monedelor. Programul are dou intrri: suma primit de la client i rata de schimb. S se calculeze diferena i numrul minim de restituit ca rest: 1, 2, 5, 10, 20 ceni i 1, 2 euro. 2. S se scrie un program care preia din linia de comand dou numere ntregi i apoi afieaz suma, diferena, produsul, media aritmetic, maximul i minimul dintre ele. 3. S se scrie un program care traduce numerele de la 1 la 12 n numele lunilor corespunztoare: Ianuarie, Februarie, , Decembrie. 4. S se scrie un program care implementeaz un cont bancar. Acesta din urm a fost deschis cu un sold de 10 000 euro. S se calculeze i afieze suma curent n cont dup doi ani, tiind c dobnda anual este de 5% din suma cu care a fost deschis contul. 2.10 METODE STATICE ALE CLASEI java.lang.Math Pachetul standard Java java.lang, unicul care este n mod automat inclus de catre compilator n procesul de compilare a programului nostru, contine o clasa Math care ofera metode ale clasei care realizeaza calcule matematice bine cunoscute. In tabelul urmator se prezinta cteva din aceste metode. Metoda
abs(x) exp(x) log(x) ceil(x) floor(x) round(x) max(x, y)

Valoarea returnat valoarea absolut ex ln x

Metoda
min(x, y) pow(x, y) sqrt(x)

Valoarea returnat minimul dintre x i y ridicarea la putere, xy

cel mai mic ntreg convertit la cos(x) double >=x cel mai mare intreg convertit la sin(x) double <=x tan(x) valoarea rotunjit a lui x random() maxim

numr aleator ntre 0.0 i 1.0, exclusiv

Exemple de apeluri de metode din clasa Math:


Math.abs(a-b) Math.pow(1+rata, ani)

Exemple. 1. Program care calculeaz i afieaz rdcinile unei ecuaii de gradul al doilea si a crei coeficieni sunt preluai din linia de comand.
public class Ecuatie{ public static void main (String args[]) { double a=Double.parseDouble(args[0]); double b=Double.parseDouble(args[1]); double c=Double.parseDouble(args[2]);

metod de conversie sir->double argumente- iruri din linia de comand

if ((b*b 4*a*c)<0) System.out.println(Solutii complexe); else if (b*b == 4*a*c) System.out.println(Solutii reale si egale); else System.out.println(Solutii reale); }//main }//clasa

Luca Dan Serbanati-Programare orientata spre obiect

2. Program care calculeaz valoarea dobnzii acordate pe 10 ani, la suma de 100000000 lei. tim c rata pe an este de 5% din suma iniial din cont.
public class Dobanda { public static void main (String args[]) { long sold=100000000, total=0; double rata=0.05; System.out.println(An\t\tTotal ); for (int an=1; an<=10; an++){ total=(long)(an*rata*sold); System.out.println(an+ \t\t+ total); }//for }//main }//clasa

3. Urmtorul program afieaz caracterele alfabetului, mpreun cu codurile Unicode asociate.


public class ListaCaractere{ public static void main (String args[]){ for(char c = 0; c<128; c++){ if (c!=26) //26 -> curata ecranul! System.out.println(valoare:+(int)c + caracter: +c); } } }

2.11 METODE Metod = Algoritm care se execut n mediul unui obiect sau al unei clase de obiecte. Sintaxa declaratiei de metod este urmatoarea: declaraie metod ::= ( public | private | ) (static | ) tip numeMetod (lista parametri) bloc numeMetod ::= identificator lista parametri ::= { parametru } parametru ::= tip identificator bloc ::= { lista instructiuni } De exemplu, declaraia metodei care caut o persoan dupa nume este: public int cautaPersoana(String nume){. . .} O metod declarat cu modificatorul static este o metod a clasei n vreme ce metodele declarate fara static sunt metode instanta. Executia algoritmului descris in metoda se realizeaza la apelul metodei dintr-o alta metoda. O metod poate va fi apelat n dou moduri: - cu o variabil referin care conine un obiect al clasei. Exemplu:
Persoana persoana = new Persoana(Popescu, Ion); . . . int v=persoana.getVarsta(); //variabila.numeMetoda()

- cu numele unei clase (metod static). Exemplu:


Math.pow(x, y)

Metodele care aparin unui obiect sau unei clase se pot apela ntre ele. Exemplu. Urmtorul program calculeaz i afieaz primele 100 de numere ntregi pozitive, mpreun cu ptratele lor. Pentru aceasta din metoda main se apeleaza o metod (static) calculeazPatrat() care returneaz ptratul numrului specificat ca parametru.

Luca Dan Serbanati-Programare orientata spre obiect

public class NumerePatrate{

apel al metodei patrat()

public static void main (String args[]) { for(int i = 0; i<=100; i++) System.out.println(patratul lui + i + = + patrat(i)); } private static int patrat(int x){ return x * x; } }

metod static i privat a clasei NumerePatrate

Instructiuni de intrerupere a executiei unei metode Ca i alte limbaje de programare, Java conine instruciuni care ntrerup execuia unei metode: return, throw i try-catch. Sintaxa acestora este prezentat n figura urmtoare: Ieirea dintr-o metod cu un rezultat
return E;

Instruciunea try-catch
try{ ListaInstruciuni }catch(TipExceptie1 var) { ListaInstruciuni } catch(TipExceptie2 var) { ListaInstruciuni } ...

Ieirea dintr-o metod fr nici un rezultat (void)


return;

Instruciunea try-catch-finally
try{ ListaInstruciuni }catch(TipExceptie1 var) { ListaInstruciuni } catch(TipExceptie2 var) { ListaInstruciuni } ... finally{ListaInstruciuni}

Lanseaz o excepie
throw E;

n metode putem folosi n instructiunea return expresii booleene pentru a returna o valoare logic. De exemplu, metoda ePrietenoasa() poate fi optimizat astfel:
//Varianta 1 class Pisica{ boolean prietenoasa=true; boolean dresata=false; . . . . boolean ePrietenoasa(){ return prietenoasa==true&&dresata==true; } } } //Varianta 2 class Pisica { boolean boolean . . . . boolean return } prietenoasa=true; dresata=false; ePrietenoasa(){ prietenoasa && dresata;

Exerciiul 6 (Magazin). S se gestioneze orarul unui magazin de cri i jocuri video. Se vor executa urmtorii pai: 1. Se creaz clasa Magazin cu variabilele oraDeschidere i oraInchidere, de tip int. 2. Se adaug 4 metode de acces pentru variabilele oraDeschidere i oraInchidere: getDeschidere, setDeschidere, getInchidere i setInchidere. 3. Se adaug o metod esteDeschis care ntoarce o valoare boolean- ce corespunde faptului c magazinul este deschis sau nchis. Utilizai metoda getOraInt de tip Data furnizat pe disc i prezentat pe pagina urmtoare. 4. Se adaug metoda getMesaj care ntoarce un ir i indic dac magazinul este deschis sau nchis la momentul apelrii metodei. 5. Se modific vizualizeazOrar pentru a raporta orarul magazinului specificat de variabileleinstan oraDeschidere i oraInchidere.

Luca Dan Serbanati-Programare orientata spre obiect

6. Se adaug funcionalitate clasei TestMagazin pentru a vizualiza Deschis! sau Inchis!. 7. Compilai Magazin.java, Data.java i TestMagazin.java. 8. Executai TestMagazin. Executarea programului va genera urmtoarea ieire: Deschis! Orarul magazinului: Toate zilele lucrtoare: 9:00 21:00. Proprietar: Popescu Ion 2.12 CLASA STRING n Java, irurile (secvene) de caractere sunt instane ale clasei String. Not. O alt clas a crei instane sunt iruri de caractere este StringBuffer. Diferena dintre cele dou clase este c irurile String sunt fixe, pe cnd cele de tip StringBuffer sunt dimensionabile dinamic. ntr-un context de iruri, Java convertete toate celelalte tipuri de date la iruri:
System.out.println(Suma= + suma);//unde + este operatorul de concatenare

Nota. Aceasta conversie este totdeauna posibile pentru ca toate obiectele Java au o metoda toString() care furnizeaza reprezentarea obiectului ca sir i este apelat implicit cnd se apeleaz o metod standard de afiare cu parametru un obiect. irurile pot fi create cu constructorul clasei String: String s = new String(a=) sau direct: String s=a = ; Sa consideram urmatorul exemplu. n clasa Pisica scriem metoda toString()care determina caracteristicile unei pisici: nume, ras, vrsta i mieunat si le sintetizeaza intr-un singur sir de caractere. Codul clasei Pisica devine urmtorul:
class Pisica{ String nume=niciUnul; String rasa=necunoscuta; String mieunat=new String(Miau); boolean prietenoasa=true; boolean dresata=false; int varsta=0; . . . . public String toString() { return [nume= + nume + , mieunat= + mieunat + , rasa= + rasa + , varsta= + varsta + ] ; } .... public static void main(String[] args){ System.out.println(new Pisica()); } }

Rezultatul ar putea arata asa:


[nume=Pufi, mieunat=Miau, rasa=persana, varsta=2]

Luca Dan Serbanati-Programare orientata spre obiect

Clasa String conine metodele prezentate n tabelul urmtor:


Semntura metodei char charAt(int index) int compareTo(String altSir) boolean equals(Object altObiect) Semnificaie -Valoarea returnat ntoarce caracterul de pe pozitia index din irul pe care este aplicat metoda compar lexicografic dou iruri i returneaz una din valorile: nrNegativ, 0, nrPozitiv compar (case sensitiv) irul cu obiectul specificat. ntoarce true numai dac altObiect este de tip String i conine acelai ir de caractere cu irul cu care se compar acelai efect ca mai sus, numai c nu ine cont de tipul literelor: mari sau mici. returneaz reprezentarea canonic a irului. n acest caz compararea a dou iruri n reprezentarea intern are acelai efect dac se folosete operatorul de egalitate = =, ca n cazul metodei equals(). verific dac irul se termin cu irul specificat ca parametru verific dac irul ncepe cu irul specificat ca parametru returneaz poziia n sir pe care se gsete prima apariie a caracterului car specificat prin codul Unicode. Aceast metod poate fi folosit pentru cutarea unui subir (dat ca parametru) ntr-un ir. acelai efect, doar c se va folosi indice-Start ca pozitie de la care se va ncepe cutarea. ntoarce poziia ultimei apariii a subirului str n ir. acelai efect, numai c se va folosi indice-Start ca poziie de la care se va ncepe cutarea. returneaz lungimea irului pe care este aplicat metoda returneaz un nou ir n care toate apariiile caracterului carVechi au fost nlocuite cu carNou. ntoarce un nou ir care este un subir extras din irul iniial, de la poziia indiceStart i pn la sfrit ntoarce un nou ir care este un subir extras din irul iniial, de la poziia indiceStart i pn la indiceStop, exclusiv convertete toate majusculele la litere mici convertete toate literele mici la litere mari terge spaiile din ambele capete ale irului

boolean equalsIgnoreCase(String altSir) String intern()

boolean endsWith(String sufix) boolean startsWith(String prefix) int indexOf(int car)

int indexOf(int car, int indiceStart) int lastIndexOf(String str) int lastIndexOf (String str, int indiceStart) int length() String replace(char carVechi, char carNou) String substring(int indiceStart) String substring(int indiceStart, int indiceStop)

String toLowerCase() String toUpperCase() String trim()

Exerciiul 7 (Magazin1). Modificati metoda vizualizeazaOrar a clasei Magazin pentru utilizarea valorilor efective data/ora i adugarea unei metode toString n clasa Magazin. Se execut paii urmatori: 1. Se copiaz n directorul Magazin1 fiierele .java din directorul Magazin. 2. Se modific metoda vizualizeazaOrar pentru memorarea orelor de deschidere i inchidere care sunt consistente cu valorile memorate n variabilele instan. 3. Se adaug metoda toString n clasa Magazin pentru concatenarea informaiilor ce privesc starea curent a magazinului. Metoda ntoarce un ir. 4. Se modific TestMagazin pentru testarea i vizualizarea metodei toString a clasei Magazin.

Luca Dan Serbanati-Programare orientata spre obiect

3 INTRODUCERE N PROGRAMAREA ORIENTAT SPRE OBIECTE


Dezvoltarea programelor pe obiecte Programarea intr-un limbaj procedural utilizeaza mparirea unei probleme ntr-un numr de pai mai simpli n care fiecare pas reprezinta rezolvarea unei subprobleme a problemei initiale. O aplicaie scris ntr-un limbaj procedural se inspira din modul n care calculatorul execut instruciunile. O aplicaie scris ntr-un limbaj orientat spre obiecte se concentreaz asupra problemei de rezolvat utiliznd o mulime de ageni, obiectele, care se angajeaz s o rezolve colabornd ntre ei. Programarea ntr-un limbaj orientat spre obiecte nseamn gsirea unor ageni adaptai problemei si care si ei si mpart ntreaga sarcin a rezolvarii, specializndu-se fiecare n sarcini mai mici. Deosebirea celor doua abordari bazata pe principiul divide et impera este aceea ca n timp ce abordarea procedurala identifica si rafineaza functiile aplicatiei, abordarea pe obiecte identific si rafineaza conceptele problemei de rezolvat, punndu-le sa colaboreze unul cu altul pe baza relatiilor semantice dintre concepte. De exemplu, ntr-un sistem stereo: - boxele se angajeaz sa reproduc sunete de frecvent medie i nalt, - subwoofer se oblig s reproduc sunete de frecven joas, - receptorul primete semnale radiofonice, - cititorul de CD citete semnale audio de pe CD. Componentele sunt proiectate pentru a interaciona ntre ele prin intermediul conexiunilor standard. Orice component poate fi schimbat cu o alta de alta marc dar care respect standardul legturilor cu celelalte componente. Reflectand asupra solutiei unei probleme in termeni de concepte favorizeaza reutilizarea obiectelor de la o aplicatie la alta atunci cand in cele doua aplicatii se folosesc aceleasi concepte. De aceea a programa pe obiecte nseamna a scrie un program n care se combina cu mecanisme standard furnizate de limbajul de programare obiecte create ad hoc cu obiecte preexistente. Fiecare obiect este specializat n furnizarea anumitor servicii legate de informatiile pe care le poseda si n acest fel servete rezolvarii unor sarcini n interiorul programului. 3.1 OBIECTE Obiect =un mod simplificat de a identifica un lucru din lumea real. Este o instan a unui concept. Din punct de vedere tehnic al abordrii pe obiecte, un obiect este o combinaie dintre: - o informatie de stare reprezentata de o multime de atribute sau proprietati ale obiectului i - o funcionalitate reprezentat de un set de operaii sau functii asupra acestor date. Membrii unui obiect sunt deci membrii-date i membrii-functii. Ei pot fi proiectati ca accesibili sau nu altor obiecte. Membrii accesibili din afara obiectului formeaz interfaa naturala a acestuia. Astfel, starea obiectului poate fi modificat numai prin intermediul interfeei acestuia. Principiul care st la baza definirii interfeei unui obiect este acela al ncapsulrii informaiilor Punct Stare local (information hiding). Conform acestui principiu x: read_x este recomandabil s ascundem in interiorul obiectului toate informatiile (date sau functii) y: read_y inutile altor obiecte i care reprezint detalii de implementare ale obiectului i sa lsm change_x Implementarea accesibile (vizibile) altor obiecte doar acele operaiilor informatii in care aceste obiecte sunt interesate. change_y read_x n figura alturat se prezint un obiect al clasei Interfa read_y Punct a crui stare este format din valorile change_x atributelor x i y, atribute care reprezint Implementare change_y coordonatele punctului i constituie starea obiectului. Proiectarea obiectelor Punct a decis c aceste atribute trebuie sa fie private. In acest fel, accesarea din afara obiectului a valorilor lui

Luca Dan Serbanati-Programare orientata spre obiect

x i y este imposibil. Cum aplicatia are nevoie sa controleze coordonatele punctelor, s-a decis ca accesul la variabilele de stare s se faca indirect, prin operatiile read_x, read_y, change_x i change_y, iar aceste operatii s formeze interfaa obiectelor Punct. n Java: - atributele unui obiect sunt implementate prin variabile instant, iar - operatiile unui obiect sunt implementate prin metode. Deci putem spune ca starea unui obiect in Java este dat de valorile variabilelor sale instant. 3.2 CLASE DE OBIECTE Clas = Descriere a unei mulimi de obiecte care au aceleai atribute, aceleai operaii, aceleai relaii cu alte clase i aceeai semantic. O clas trebuie vazuta n acelasi timp ca: - un tip de date sau un concept al aplicaiei, - o schem sau model pentru obiectele sale, - o fabric pentru obiectele sale. n UML reprezentm relaia (de instaniere) dintre o clas i un obiect al su ca n figura de mai jos: clas
instan a Persoana Ion: Persoana

obiect

n tabelul urmtor prezentm exemple de clase i instane ale lor: Clas Proiectul unei case Negativ fotografic Reet culinar Atribute, operaii i constrngeri Programarea pe obiecte necesit o faza preliminara de analiz a problemei de programat. In aceasta faz obiectele sunt identificate prin conceptele pe care le reprezint, iar colaborarea dintre obiecte prin relatiile stabilite ntre concepte. Descrierea problemei rezultat din procesul de analiza ia n general o forma grafic. Limbajul grafic utilizat pentru acest tip de descrieri este UML (Unified Modeling Language). In aceste descrieri un obiect este caracterizat de clasa sa. Pentru specificarea clasei, proiectantul aplicatiei trebuie s i specifice elementele sale componente care sunt atributele, operatiile si constrngerile. Un atribut este o abstractizare a unei proprieti a unui obiect n lumea real. Valorile acestor proprieti constituie starea obiectelor clasei. Nota. In general, strile difereniaz un obiect de un altul, desi identitatea unui obiect nu este data de unicitatea strii sale printre strile obiectelor de acelasi tip. Cu alte cuvinte, doua obiecte pot avea exact aceeasi stare, dar sa nu fie identice. Unicitatea obiectului n programarea pe obiecte este asigurat de mediul de executie. De exemplu, un obiect telefon celular intr-o aplicatie de e-commerce are ca atribute posibile: pre, dimensiuni, greutate i culoare. Aceste atribute descriu celularul din punct de vedere al aplicaiei care ne intereseaza. Fiecare atribut este caracterizat de un domeniu de valori n care atributul ia valori. Operaie = Algoritm privat al obiectului i opereaz asupra atributelor sale. Se mai numete i serviciu (nivelul conceptual i al specificrii) sau metod (la nivelul implementrii). Instan Casa construit Fotografie Mncare gtit dupa reet

Luca Dan Serbanati-Programare orientata spre obiect

Constrngeri = Condiii, cerine sau reguli pe care trebuie s le ndeplineasc un obiect. De exemplu, un element al unei comenzi este caracterizat prin cantitate i pre. O condiie pe care o impunem este ca, cantitatea s fie un numar pozitiv. Atunci pretul si cantitatea vor forma atributele clasei ElementComanda, iar condiia {cantitate>=0} va fi o constrngere. Metoda verificaStoc() verific dac exist n depozit cantitatea produsului respectiv pentru onorarea comenzii. Aceste elemente pot fi specficate n UML i implementate n Java astfel: Reprezentarea unei clase n UML valoare initiala constrngere Implementarea n Java
public class ElementComanda{ private int cantitate; private Valuta pret; . . . . public boolean verificaStoc(){...} . . . . }

ElementComanda
atribute operaii cantitate: integer=0 {cantitate>=0} pret:Valuta verificaStoc():boolean {isQuery} constrngere 3.2.1 Variabile-membru ale un ei clase

ntr-o clas Java, atributele obiectelor unei clase sunt definite ca variabile-instan sau variabileobiect in definitia clasei. Fiecarei variabile-instan i se aloca o zon de memorie n spatiul alocat obiectului i n care se memoreaza valoarea variabilei. ntregul spatiu alocat unui obiect este alcatuit din totalitatea spatiilor alocate variabilelor sale instan. Folosind terminologia UML, la codificarea n Java, unui atribut al clasei i va corespunde o variabil-instan. Exemplu. Fie o clas Avatar ntr-un joc interactiv. Clasa definete o variabil instanta viteza care permite avatarurilor (ageni care se deplaseaz pe ecran ndeplinind diverse roluri n joc) sa se poate deplasa cu diferite viteze, dup caracteristicile mediului n care se gsete. Modificnd variabila instan viteza a unui obiect Avatar, acesta se deplaseaz mai repede sau mai ncet. O variabil instan este o variabila global, la nivelul obiectului, cunoscut si accesibil din toate metodele obiectului. Variabil de clas = Variabil-membru a unei clase care are un unic spaiu alocat n memorie si a crui unic valoare este partajat de toate obiectele clasei. O variabil de clas definete un atribut al clasei si nu al obiectelor clasei. Reprezinta n Java o solutie pentru a avea, la nivelul programului, variabile globale tuturor obiectelor de acelasi tip. Exemplu. n clasa Avatar se definete o variabil a clasei, numit dataOra. Valoarea variabilei este partajat de toate obiectele Avatar. Dac aceast variabil ar fi fost o variabil instan, sincronizarea avatarilor ar fi fost mult mai dificil de realizat. Accesul la variabilele-membru Accesul la o variabila-instanta a unui obiect se face cu ajutorul operatorului binar .. Primul operand trebuie sa fie o variabila-reference sau o expresie a carui valoare sa fie de tip reference. Al doilea operand este chiar numele variabilei-instanta. Exemplu:
ElementComanda ec = new ElementComanda(Computer); ec.pret = new Valuta(147.35, USD); // atribuirea variabilei-instanta // pret a lui ec ec.cantitate = 25; // atribuirea variabilei-instanta cantitate a lui ec

Accesul la o variabila-clasa se face tot cu ajutorul operatorului binar ., doar ca primul operand trebuie sa fie in acest caz numele clasei. Al doilea operand este numele variabilei-clasa. Exemplu: Daca in clasa ElementComanda ar exista o variabila-clasa care sa memoreze numarul curent al articolului cumparat pe lista comenzii respective, codul clasei ei ar trebui modificat ca mai jos:

Luca Dan Serbanati-Programare orientata spre obiect

public class ElementComanda{ static int nrCurent=1; private int cantitate; private Valuta pret; . . . . public boolean verificaStoc(){...} . . . . }

La momentul stabilirii produselor care intra in comanda, se poate asocia fiecarui obiect ElementComanda valoarea lui nrCurent, dupa care variabila ar trebui incrementata. Obiectul care executa aceasta operatie ar trebui sa contina urmatorul cod:
Comanda c = new Comanda(); . . . . ElementComanda ec = new ElementComanda(); . . . . c.add(ec, ElementComanda.nrCurent++);

Exista situatii in care notatia cu punct pentru a accesa o varaibila-membru este inutila. Este cazul accesului din interiorul obiectului sau clasei care contine variabila-membru. Exemplu: Fie clasa:
public class ElementComanda{ private int cantitate; private Valuta pret; . . . . public boolean verificaStoc() { . . . . return cantitate <= stoc; } . . . . }

Se observa ca metoda verificaStoc foloseste variabila-instanta cantitate fara sa specifice carui obiect apartine varaibila si aceasta deoarece este o variabila a chiar obiectului metodei. Domeniul de vizibilitate i domeniul de existen Domeniul de vizibilitate (scope) = zon de program n care un nume este recunoscut peste tot cu o aceiasi semantica. Un domeniu de vizibilitate este si un spatiu de nume, adica un domeniu de identificatori unici. De exemplu, declaratia unei clase in Java este un domeniu de vizibilitate pentru identificatorii tuturor membrilor clasei. Domeniile de vizibilitate intr-un program pot fi incuibate, adica un domeniu de vizibilitate poate contine unul sau mai multe domenii de vizibiltate. In Java, in afara declaratiei de clasa, exista mai multe constructii sintactice care furnizeaza un domeniu de vizibilitate. De exemplu, fiecare bloc (instructiune compusa) din corpul unei metode formeaza un domeniu de vizibilitate in care sunt cunoscute cu o anumita semantica toate numele declarate in interiorul blocului. Cum corpul metodei este el insusi un bloc in care sunt cunoscuti atat parametrii metodei cat si toate variabilele declarate in acel bloc, el reprezinta un prim domeniu de vizibilitate in care pot fi incluse alte domenii de vizibilitate. Asa-numitele reguli de contur valabile in toate limbajele moderne, inspirate din programarea structurata, impun ca un domeniu de vizibilitate sa fie inclus in cel mult un alt domeniu de vizibilitate. Structura care cel mai bine descrie relatia de incuibare a domeniilor de vizibilitate este arborele. De aici ideea de ierarhie de domenii de vizibilitate. Un alt exemplu de domeniu de vizibilitate este instructiunea for. In header-ul instructiunii se pot declara variabile ale caror nume sunt cunoscute atat in header-ul ca si in corpul instructiunii. Din punct de vedere al domeniului de vizibilitate, variabilele pot fi: - globale, daca domeniul de vizibilitate se extinde la tot programul. Nota. Calificativul de global se poate utiliza si in mod relativ si cand se ia ca referinta un domeniu de vizibilitate care in interior contine alte domenii de vizibilitate. Atunci, despre variabilele domeniului extern putem spune ca sunt globale domeniilor interne. In acest sens o variabila instanta a unui obiect, chiar daca este declarata privata obiectului, deci

Luca Dan Serbanati-Programare orientata spre obiect

invizibila din exterior, ea este globala tuturor variabilelor locale declarate in metodele obiectului. locale, daca domeniul are o intindere limitata, cuprinsa intr-un alt domeniu de vizibilitate, mai larg. Toate variabilele declarate in metodele unei clase sunt locale corpului metodei care, fiind un bloc, formeaza un domeniu de vizibilitate. Trebuie precizat ca in Java declaratiile pot fi inserite oriune intr-un bloc, nu numai la inceputul acestuia. Unica restrictie este ca in cadrul domeniului declaratia sa preceada prima utilizare a identificatorului utilizat.

public class Mediu{ int x=0; // variabil instan, global la nivel de obiect void met1() { int y, x=1; // declaratie de variabile locale y=x; // OK, y=1 i nu y=0 } void met2() { int z=1; // declaratie de variabila locala x=y+z; // eroare! y nu este cunoscut in acest domeniu } void met3() { met1(); // apel al unei alte metode a obiectului int w=x*x; { // incepe un domeniu de vizibilitate inclus in domeniul lui met3 x+=2; float w=1.2*x; // variabila locala; declaratia precede utilizarea x=(int)(w2.2) } // se termina domeniul de vizibilitate inclus in domeniul lui met3 x*=w; } }

Diagrama de mai jos, numita si diagrama de contur, descrie relatiile intre domeniile de vizibilitate din programul precedent.
Mediu
int x met1 int y int x met2 int z met3 int w float w

Stabilit mecanismul domeniilor de vizibilitate se poate enunta regula care stabileste vizibilitatea componentelor programului (variabile, tipuri, constante simbolice sau metode) a caror semantica este stabilita prin declaratii. Regula. O componenta cu nume x este vizibila intr-un punct din program aflat intr-un domeniu de vizibilitate y, daca componenta a fost declarata in y cu o declaratie ce precede punctul din program considerat sau, in cazul ca lipseste aceasta declaratie, daca este vizibila in domeniul inconjurator lui y. Domeniul de existen (lifetime) = Perioada de timp n cursul execuiei programului n care o componenta a programului exist, adica are alocat un spatiu in memorie. Nota. Desi in cazul anumitor variabile domeniul de vizibilitate si cel de existenta sunt strans legate intre ele prin mecanisme dictate de regulile limbajului de programare, cele doua concepte sunt complet diferite intre ele. Domeniul de vizibilitate se refera la identificatori din program si de aceea este un concept static ce priveste momentul compilarii, atunci cand identificatorii conteaza. Domeniul de existenta se refera la entitatile din program prezente in memorie la executie (variabile, obiecte, array etc.) si de aceea este un concept dinamic, specific executiei. In exemplu de mai sus variabila intreaga w este vizibila in tot corpul metodei met3 mai putin in blocul interior acestuia in care cu numele w este vizibila o variabile float. In schimb, variabila intreaga w are domeniul de existenta extins pe toata durata de executie

Luca Dan Serbanati-Programare orientata spre obiect

a corpului functiei, incepand cu momentul executarii declaratiei sale. Deci ea exista si pe durata existentei variabilei float w, doar ca nu este accesibila. Daca pentru variabilele locale se poate stabili o relatie intre domeniul de vizibilitate si domeniul de existenta, pentru celelalte componente ale executiei, cum ar fi obiectele si array-urile, relatia nu exista deoarece acestea in Java au un domeniu de existenta, dar nu si un domeniu de vizibilitate. Vizibilitatea lor este data in mod indirect de variabilele care le memoreaza adresa in spatiul Heap. Metode Reluam pe scurt tema metodelor in Java aducand unele precizari fata de introducerea facuta in capitolul precedent. Metodele sunt folosite pentru a implementa serviciile pe care proiectantul programului le-a incredintat clasei si obiectelor sale. Aceste servicii alcatuiesc responsabilitatea clasei respective, ratiunea existentei ei. Declaratia de metod O metoda in Java trebuie sa fie declarata in cadrul clasei careia ii apartine. O metoda este specificata printr-un header urmat de corpul metodei. Header-ul unei metode contine: 1. un eventual modificator de vizibilitate (private, public sau protected), 2. un tip de date care este tipul valorii rezultatului intors de metoda. Daca metoda nu intoarce nici un rezultat, tipul care trebuie sa apara oricum este void, 3. numele metodei, un identificator, si 4. lista parametrilor formali intre paranteze. Lista parametrilor formali poate fi vida sau poate contine unul sau mai multi parametrii separati prin virgula. Fiecare parametru formal este specificat prin tip si numele parametrului. Corpul metodei este un bloc de instructiuni care implementeaza algoritmul calculului realizat de metoda. Corpul metodei reprezinta un domeniu de vizibilitate in care se pot declara variabile locale. Acest domeniu este initializat cu numele parametrilor formali care sunt cunoscuti in intreg corpul metodei. Ei se comporta ca niste variabile locale de tipul declarat in lista de parametri si initializate la fiecare apel al metodei. Exemplu:
Numele Parametru Modificator de Tipul rezultat metodei formal vizibilitate public int max(int a, int b) { if (a > b) return a; else return b; } Header-ul metodei

Corpul metodei

Metod a instanei = Metod care aparine fiecrui obiect al unei clase. Metod a clasei = Metod care aparine unei clase i la care au acces toate obiectele sale. Este o metoda declarata cu static. Comportamentul obiectelor unei clase = Aciuni pe care obiectele unei clase sunt capabile s le ndeplineasc. Acest comportament este dat de metodele non-static ale clasei. Exemplu: Comportamentul unui obiect Avatar ar putea fi urmtorul: - controleaz dac se va lovi de un obstacol, - semnaleaz propria poziie, - emite sunete. Comportamentul unei clase poate fi utilizat de alte obiecte pentru a cere obiectelor clasei: - sa le raporteze, prelucrate sau nu, informatii prezente in variabilele-instanta ale obiectelor clasei, - sa modifice valorile variabilelor-instanta ale obiectelor clasei.

Luca Dan Serbanati-Programare orientata spre obiect

In cursul rezolvarii propriilor sarcini, obiectele clasei pot ceara si sa primeasc informaii de la alte obiecte sau s trimit mesaje altor obiecte cerndu-le, la randul lor, s execute diverse sarcini in care aceste din urma obiecte sunt specializate. Apelul de metod Apel de metoda = Mecanism oferit de un limbaj de programare prin care o entitate din program (in cazul nostru un obiect) cere executia unei metode. Aceasta metoda poate sa apartina obiectului apelant (apel intern) sau, in cazul general, poate sa apartina unui alt obiect. Pentru a putea apela o metoda M a unui obiect B, un obiect A trebuie sa aiba acces la metoda M. Accesul la o metoda este stabilit de regulile de vizibilitate din Java care vor fi explicate intr-o sectiune urmatoare. De obicei un apel de metoda are loc in momentul in care se executa o metoda a obiectului apelant. Apelul metodei intrerupe executia metodei curente si trece controlul metodei apelate. La sfarsitul executiei metodei apelate, controlul revine la metoda intrerupta, exact in punctul de intrerupere. Daca metoda apelata restituie (intoarce) o valoare metodei apelante, aceasta valoare poate participa la calculul unei expresii, devenind un operand in acea expresie. Este cazul in care apelul de metoda apare in interiorul unei expresii sau in locul unei expresii. Apelul unei metode poate fi vazut si ca un mesaj pe care obiectul apelant il trimete obiectului apelat. In acest sens putem spune ca obiectele comunic ntre ele prin intermediul metodelor. Un obiect poate chema metodele altui obiect din mai multe motive: - comunic o modificare a propriei stari obiectului apelat, - avertizeaz un alt obiect de aparitia unui eveniment la care acel obiect probabil nu are acces, - cere unui alt obiect s execute o anumit operaie. Apelarea unei metode se face cu ajutorul operatorului binar .. Primul operand al apelului trebuie sa fie o variabila-reference sau o expresie a carui valoare sa fie de tip reference catre un obiect in memorie. Al doilea operand este chiar numele metodei urmat de lista parametrilor efectivi. De exemplu, metodele instan ale clasei Avatar ar putea fi urmtoarele:
public boolean lovesteObstacol(){...} public Punct semnaleazaPozitie(){...} public void emiteSunete(){...}

O metoda a unui alt obiect ar putea sa foloseasca un obiect Avatar utilizand un cod cum ar fi urmatorul:
Avatar av = new Avatar(); . . . if (av.lovesteObstacol()) { Punct p = av.semnaleazaPozitie(); . . . }

In cazul apelurilor de metode ale clasei (declarate static), regula de construire a apelului este aceiasi doar ca primul operand trebuie sa fie chiar numele clasei. De exemplu, clasa Avatar ar putea fi metoda statica:
public static Avatar creazaAvatar(){...}

care returneaz obiecte de tip Avatar. Un obiect are gestioneaza obiecte Avatar ar putea folosi aceasta metodo pentru a-si crea noi obiecte Avatar:
Avatar av = Avatar.creeazaAvatar();

Nota. Ca si in cazul variabilelor-membru, apelul unei metode apartinand unui obiect din interiorul unei metode che apartine aceluiasi obiect se face fara a utiliza operatorul . si fara a utiliza referinta la obiectul destinatie. Acest obiect este subinteles a fi obiectul curent in care ne aflam cu executia. Declararea unei clase O clasa in Java se declara utilizand un header ce contine un eventual modificator de vizibilitate, cuvantul cheie class si numele clasei. In corpul clasei delimitat de { } se declara toti membrii clasei: variabile si metode.

Luca Dan Serbanati-Programare orientata spre obiect

public class Persoana { // Declararea numelui clasei String nume; // Variabil instan de tip String String prenume; // Variabil instan de tip String int varsta= 29; // Variabil instan de tip int char sex = M; // Variabil instan de tip char public int getVarsta() { // Metod instan return varsta; } public void setNume(String n) { //Metod instan nume=n; } public void setPrenume(String p) { //Metod instan prenume=p; } public void afiseaza() { //Metod instan System.out.println(Persoana: +nume+ +prenume); } public static void main(String args[]) { //Metod clas . . . . } }

Semntura unei metode este, prin definiie, o combinaie dintre numele metodei i tipul parametrilor n ordinea declarrii lor n definirea metodei. De exemplu, semntura metodei setPrenume din clasa Persoana este: setPrenume + String. Limbajul Java admite suprancrcarea (overloading-ul) metodelor: metodele dintr-o clas pot avea acelai nume, este suficient sa difere prin semntur (adic, prin tipul i/sau numrul parametrilor). Se poate observa ca tipul rezultatului nu apare in semnatura deoarece se presupune ca toate metodele suprancrcate trebuie s aib acelai tip de rezultat. Exemplu: In clasa String metodele substring()i indexOf() sunt metode overloaded. 3.2.2 Construirea de obiecte Constructor al unei clase = o metod cu acelai nume ca i cel al clasei din care face parte si careia ii lipseste din declaratie tipul rezultatului. Un constructor descrie cum se iniializeaz variabilele instan ale noului obiect. Construtorii, ca orice alta metod, pot fi suprancrcati. In general, o clas poate avea mai muli constructori. De exemplu, clasa Persoana ar putea avea doi constructori ca mai jos:
public Persoana() { nume=; prenume=; varsta=0; } public Persoana(String n, String p){ nume=n; prenume=p; } //Constructor

//Constructor

In acest exemplu, constructorii clasei Persoana sunt suprancrcai, ei diferind prin numrul i tipul parametrilor. Unei clase ii pot lipsi constructorii. In acest caz, compilatorul creaz un constructor predefinit fr parametri care iniializeaz variabilele instan ale clasei astfel: variabilele primitive numerice cu zero, variabilele booleene cu false i cele referin cu null. Constructorul este chemat atunci cand dorim sa creem un obiect al clasei constructorului. Pentru aceasta trebuie s folosim operatorul new mpreun cu constructorul clasei:
new NumeClasa(parametri);

In exemplul urmator se creaza dou obiecte Persoana i se memoreaza referinele la ele n variabile de acelai tip, Persoana:

Luca Dan Serbanati-Programare orientata spre obiect

Persoana amiculTau = new Persoana(); Persoana amiculMeu = new Persoana(Ionescu,Pop);

Aceste variabile ar putea fi folosite pentru a apela metodele instan. Dup cum s-a menionat mai sus, avand o variabila care memoreaza un obiect, se poate utiliza notaia cu punct pentru apelarea unei metode instan a unui obiect (amiculMeu.afiseaza()) sau pentru accesarea variabilelor instan ale unui obiect (amiculMeu.varsta). Exemplu:
public static void main(String args[]) { Persoana amiculMeu = new Persoana(Ionescu, Pop); amiculMeu.varsta = 31; amiculMeu.afiseaza(); Persoana amiculTau = new Persoana(); amiculTau.setNume(Popescu); amiculTau.setPrenume(Ion); amiculTau.afiseaza(); System.out.println(Varsta: + amiculTau.getVarsta()); }

Intr-un constructor se poate apela un alt constructor al aceleai clase. Astfel, primul constructor al clasei Persoana ar putea fi scris aa:
public Persoana() { Persoana(, ); varsta=0; }

this = Cuvnt cheie care se utilizeaz n interiorul corpului unei metode a unei instane de clas i care furnizeaz referina la obiectul pentru care a fost apelat metoda. De exemplu, al doilea constructor al clasei Persoana poate fi scris aa:
public Persoana(String nume, String prenume){ this.nume=n; this.prenume=p; }

Exemplu. Vom scrie dou clase: Punct i Dreptunghi care reprezinta un punct si un dreptunghi pe ecran. Un punct este caracterizat prin coordonatele sale x i y care sunt valori ntregi. Atunci vom declara x i y ca variabile instan ale clasei Punct, iar constructorului acesteia le va iniializa cu valorile dorite. Similar, clasa Dreptunghi va avea ca variabile instan: lime i nlime de tip int i originea care este de tip Punct i care reprezint colul din stnga sus. Responsabilitatea clasei Dreptunghi este de a muta dreptunghiuri i de a le calcula aria. Aadar, vom avea metodele instan muta() i calculeazaAria(). A treia clas TestObiecte exemplific, n metoda main, crearea i utilizarea obiectelor de tip Punct i Dreptunghi. In metoda main() a acestei clase mai nti crem un punct i dou dreptunghiuri, unde punctul este originea primului dreptunghi, iar cel de-al doilea are originea punctul (0,0). Apoi, afim caracteristicile primului dreptunghi (limea i nlimea), precum i aria acestuia. Urmeaz schimbarea originii celui de-al doilea dreptunghi, astfel nct cele dou dreptunghiuri s aib aceeai origine i afiarea poziiei acesteia. Ultimele operaii efectuate este de a deplasa al doilea dreptunghi i de a afia noile coordonate ale originii acestuia. Implementarea celor trei clase este artat n programul urmtor.

Luca Dan Serbanati-Programare orientata spre obiect

public class Punct{ public int x; public int y; public Punct(int x, int y){//constructor this.x = x; this.y = y; } }//sfarsitul clasei Punct public class Dreptunghi{ public int latime, inaltime; public Punct origine; public Dreptunghi(){origine=new Punct(0, 0);}//constructor (overloaded) public Dreptunghi(Punct p){origine=p;} //constructor (overloaded) public Dreptunghi(int l, int i){this(new Punct(0, 0), l, i);}//constructor (overloaded) public Dreptunghi(Punct p, int l,int i){ //constructor (overloaded) origin=p; latime=l; inaltime=i; } public void muta(int x, int y){ origine.x = x; origine.y = y; } public int calculeazaAria(){return latime*inaltime;} }//sfarsitul clasei Dreptunghi public class TestObiecte{ public static void main(String[] args) { //cum cream un punct si doua dreptunghiuri Punct primaOrigine=new Punct(23, 94); Dreptunghi unu=new Dreptunghi(primaOrigine,100, 200); Dreptunghi doi=new Dreptunghi(50, 100); //afisam atributele unui dreptunghi System.out.println("Latimea primului dreptunghi: " + unu.latime); System.out.println("Inaltimea lui unu: " + unu.inaltime); //calculam aria unui dreptunghi System.out.println("Aria lui unu: " + unu.calculeazaAria()); //schimbam originea dreptunghiului doi.origine=primaOrigine; //afiseaza pozitia dreptunghiului System.out.println("Pozitia x a dreptunghiului doi: "+ doi.origine.x); System.out.println("Pozitia y dreptunghiului doi: "+ doi.origine.y); //mutam si apoi afisam dreptunghiul doi.muta(40, 72); System.out.println("Pozitia x a dreptunghiului doi: "+ doi.origine.x); System.out.println("Pozitia y dreptunghiului doi: "+ doi.origine.y); } }

3.2.3 Modificatori de acces Cnd am tratat conceptul de interfa a unui obiect, am vzut c un obiect separ dou universuri: cel extern, universul tuturor obiectelor i cel intern, al su, care trebuie protejat (prin ascunderea detaliilor de implementare). Vizibilitatea pentru o clas n Java ca si pentru membrii ei este stabilit cu ajutorul modificatorilor de acces: - public. Ofer o vizibilitate global, de oriunde din afara clasei. - protected. Vizibilitate acordata doar subclaselor clasei n care sunt definite elementele protejate, indiferent care sunt pachetele acstor subclase.

Luca Dan Serbanati-Programare orientata spre obiect

private. Elementele private nu sunt accesibile dect n interiorul clasei n care sunt definite. modificator nespecificat. Este cunoscut i ca modificator friendly i ofer acces liber claselor din interiorul aceluiasi pachet. Esista si alti modificatori ce pot fi inclusi in declaratii. Ei se refera la alte aspecte decat drepturile de acces: - static. Definete membrii classi: variabile sau metode. - final: - pentru variabile. Reprezint variabilele ale cror valori, odata initializate, nu se pot modifica in cursul executiei. De obicei ele trebuie iniializate n momentul declarrii:
final String numeFirma= SRL;

pentru metode. Astfel de metode nu pot fi redefinite n subclasele clasei din care fac parte. - pentru clase. O astfel de clas nu poate fi extins. Este o clas frunz n structura arborescent a claselor format pe baza relaiei de motenire dintre clase. synchronized. Cere ca in orice moment cel mult un fir de execuie (thread) sa poata executa acea metod sau sa acceseze acea data sincronizata. native. Reprezint o metod implementat ntr-un fiier extern, provenind dintr-un program scris ntr-un alt limbaj (de exemplu, limbajul C). abstract. Introduce o clas sau o metod abstract. Dac este vorba de o clas abstract, atunci ea trebuie s conin cel puin o metod abstract.

Modificatorul static Metodele i variabilele care nu sunt declarate statice sunt metode i variabile ale instanelor. Analog, metodele i variabilele declarate statice sunt metode i variabile ale claselor. n cele ce urmeaza se prezinta dou exemple care folosesc variabile i metode statice:
class Exemplu1 { static String text = Un program simplu!"; public static void main(String[] args){System.out.println(text);} } class Exemplu2 { String text = " Un program simplu!"; static String text2 = " Un program simplu!"; String getText(){return text;} String getStaticText(){return text2;} public static void main(String[] args){ Exemplu2 instanta=new Exemplu2(); String unText=instanta.getText(); String unTextStatic=instanta.getStaticText(); System.out.println(unText); System.out.println(unTextStatic); } }

Mai precis, primul exemplu evideniaz faptul c variabilele statice pot fi folosite direct de ctre metodele statice ale aceleai clase. Este cazul variabilei text, a crei valoare este afiat n metoda main a clasei Exemplu1. A doua clas, Exemplu2, conine dou variabile: text i text2. Prima este variabil instan iar a doua este declarata static, deci este variabila a clasei. Valorile acestor variabile sunt returnate de ctre metodele instan getText() i getStaticText() ale aceleai clase. Aceste metode vor fi apelate din metoda static main. Primul lucru pe care-l facem este s ne crem un obiect de tip Exemplu2 a crui referin este memorat n variabila instanta. irurile rezultate din apelarea metodelor instan sunt memorate n variabilele locale unText i unTextStatic, iar acestea din urm vor fi folosite n apelarea metodei println(). Aadar, al doilea exemplu pune n eviden faptul c variabilele statice pot fi folosite i n interiorul metodelor instan ale clasei n care au fost declarate. Observaie. Intr-o metod declarat cu static nu se poate folosi variabila this!!!

Luca Dan Serbanati-Programare orientata spre obiect

Membrii statici ai unei clase Variabilele statice ale unei clase, in cazul in care nu sunt declarate private, pot fi accesate direct, prin intermediul fie a clasei de care aparin fie a unei instante a clasei memorata intr-o variabil referin de tipul clasei respectiv. Exemplu: Definiie Acces
class Comanda { String ragioneSociale; String p_IVA; int nrComanda; Date data; static int totalComenzi=0; . . . } Comanda noua=new Comanda(, , ); noua.totalComenzi++;

Comanda.totalComenzi++;

La fel, metodele statice ale unei clase pot fi apelate direct, cu ajutorul clasei de care aparin sau prin intermediul variabilelor referin de tipul clasei respective. Continund exemplul anterior, adugm clasei Comanda metoda static anuleaza() care anuleaz valoarea variabilei statice totalComenzi: Definiie Acces
class Comanda{ String ragioneSociale; String p_IVA; int nrComanda; Date data; Comanda.anuleaza(); static int totalComenzi=0; static void anuleaza() { totalComenzi=0; } } Comanda noua=new Comanda(. . . . .); noua.anuleaza(); ...

Comanda.anuleaza();

3.2.4 Pachete Unitate de compilare = Un fiier de cod surs cu extensia .java care poate fi compilat. Un asemenea fisier poate contine una sau mai multe declaratii de clase si interfete. Doar una din clasele din fisier trebuie sa fie declarata public. Numele acestei clase da si numele fisierului. Pachet (package) = Un grup de clase i interfee grupate sub un nume. Reprezinta un spatiu de nume pentru toti identificatorii de clase si interfete declarati ca apartinandu-i. Amintim ca intr-un spatiu de nume numele declarate sunt unice. Apartenenta la un pachet se declara global pentru toate numele de clase si interfete unei unitati de compilare. Declararea apartenentei claselor dintr-o unitate de compilare la un pachet se face utiliznd cuvntul cheie package urmat de numele pachetului ca prima linie in unitatii de compilare respectiv:
package Identificator; package NumePachet;

n consecin, intr-un program Java putem gasi mai multe unitati de compilare declarate ca apartinand aceluiasi pachet, iar pentru fiecare pachet vom avea cel putin o unitate de compilare care sa declare clase si interfete din pachet. In lipsa declaratiei de pachet, o unitate de compilare va plasa toate clasele si interfetele sale intr-un pachet anonim, pachetul predefinit, care nu trebuie specificat daca dorim sa accesam componentele sale. Sintaxa unei uniti de compilare ce conine clase i interfee ce aparin unui pachet cu nume este urmatoarea:

Luca Dan Serbanati-Programare orientata spre obiect

package NumePachet; DeclaratiiImportPachete // declaratii ce folosesc cuvantul cheie import DeclaratiiDeClaseSiInterfete

Utilizarea numelor de pachete Un pachet poate fi declarat ca apartinand unui alt pachet. Aceasta face ca structura pachetelor n Java sa fie ierarhic. In cazul unei ierarhii cu mai multe niveluri, in locul numelui simplu al pachetului va trebui sa utilizam numele complet care folosete notaia cu punct ca in exemplul care identifica un pachet R:
P.Q.R

unde R este un pachet declarat ca apartinand lui Q, Q un pachet che apartine lui P, iar P este un pachet din care este alcatuit programul. Declaratia incluziunii unui pachet intr-un alt pachet se face simplu, specificand in declaratia package numele complet al pachetului. Ideea care sta la baza acestei organizari este evitarea conflictelor de nume. Intr-adevar exista clase in pachetele Java standard care au acelasi nume. Exista, de exemplu, o clasa cu numele Object in pachetul java.lang si o interfata cu acelasi nume in pachetul org.omg.CORBA. Ele se pot utiliza in cadrul aceluiasi program fara a intra in conflict intre ele doar daca folosim numele lor complet: java.lang.Object si org.omg.CORBA.Object. In cazul numelui Object se poate verifica si o alta regula. Daca utilizam in programul nostru numele simplu Object, acesta se va referi automat la clasa java.lang.Object deoarece java.lang este unicul pachet Java standard importat automat in programul nostru. Pentru a utiliza interfata Object din pachetul org.omg.CORBA va trebui sa utilizam numele complet al clasei: org.omg.CORBA.Object. Exemplu. Sa consideram o clas Document care este declarat n pachetul idd din structura de pachete ro.univ_ovidius (in cele ce urmeaza se va considera in locul adresei univ-ovidius.ro a domeniului Internet al universitatii Ovidiu adresa univ_ovidius.ro). Document folosete o clasa Vector care face parte din pachetul java.util. In program vom scrie atunci urmtoarele declaraii:
package ro.univ_ovidius.idd; import java.util.Vector; public class Document{ . . . }

Un program Java este format din continutul pachetului predefinit. Acesta, la randul sau, poate fi alcatuit din clase, interfete si alte pachete. Intr-un program complex, cu o ierarhie de pachete pe mai multe niveluri, pachetul anonim ar fi de dorit sa contina numai pachete. Dupa cum se poate constata, structura de pachete si clase se aseamana cu structura de directoare di fisiere dintr-un sistem de fisiere. Aceasta asemanare nu este doar de suprafata in Java. Ea ne conduce la modul de structurare a fisierelor de bytecode .class pe discul calculatorului. Regula este simpla: fiecarui pachet Java trebuie sa ii corespunda pe disc un director avand acelasi nume cu numele pachetului. In directorul respectiv se vor gasi fisierele .class ale tuturor claselor si interfetelor declarate in pachet plus directoarele pachetelor declarate in pachet. Deci daca pachetul Java respectiv este la randul sau inclus intr-un alt pachet, atunci directorul sau trebuie va fi inclus in directorul pachetului-tata. Aceasta ierarhie de directoare trebuie sa aiba un director radacina corespunzator pachetului predefinit. Pentru a putea executa un program structurat pe pachete, acest director trebuie sa apara in variabila CLASSPATH a sistemului. De aceea pentru a compila cu SDK clasa Document din pachetul idd de mai sus se poate utiliza comanda:
javac d C:\studenti\ionica Document.java

unde C:\studenti\ionica este numele unui director declarat n variabila CLASSPATH a sistemului. Aceasta comanda va memora fisierul (fisierele) .class rezultat (e) din compilarea lui Document.java in directorul C:\studenti\ionica\ro.univ_ovidius.idd . Nota. Pentru a reutiliza clasele Java scrise de noi in alte programe, trebuie sa fim siguri ca numele acestor clase sunt unice in orice program sunt importate. In acest scop Sun recomanda folosirea ca nume de pachete a unor nume compuse in stilul numelor

Luca Dan Serbanati-Programare orientata spre obiect

domeniile Internet. Este ideea folosita de declaratia de pachet de mai sus in care se utilizeaza un nume de domeniu internet unic care este univ_ovidius.ro pentru a crea un pachet ro.univ_ovidius.idd unic in lume. Se observa inversarea ordinii de aparitie in numele compus a numelor simple. Daca nu aveti un domeniu Internet la dispozitie puteti utiliza cu mare probabilitate de a avea nume unice pentru clase adresa voastra de e-mail. De exemplu, prefixul com.yahoo.popescu.ion ar putea fi o solutie pentru pachetele de clase Java ale lui Ion Popescu. Chiar si in aceasta situatie ramane valabila conventia folosita de Java pentru a mapa pachetele de clase pe disc. Pentru fisierele claselor unui pachet com.yahoo.popescu.ion.licenta , Ion Popescu va trebui sa isi creeze un subdirector pe disc com\yahoo\popescu\ion\licenta in care sa gazduiasca fisierele claselor pachetului. Daca acest pachet va fi folosit intr-un unic program, acest subdirector se poate include in directorul ce contine fisierele programului. Daca clasele pachetului com.yahoo.popescu.ion.licenta le vom utiliza in mai multe programe, in loc sa includem subdirectorul com\yahoo\popescu\ion\licenta in directoarele tuturor acestor programe, putem crea un director nou pe disc, sa zicem C:\studenti\ionica in care il vom memora o singura data. Pentru a accesa din toate programele Java clasele pachetului com.yahoo.popescu.ion.licenta este suficient sa includem in CLASSPATH sirul C:\studenti\ionica;. 3.2.5 Structura unui program Java Ca o concluzie la acest capitol, in cele ce urmeaza se prezinta un program Java care sa conina multe din elementele introduse in capitol. In program s-au evidentiat principalele constructii sintactice.
package ro.univ_ovidius.idd;//pachetul clasei import java.util.*; //clasele de importat import pachetulMeu.DataCalend; public class TestAngajati{ public static void main(String[] args) {//metoda main() a clasei Angajat[] personal = new Angajat[3]; personal[0]=new Angajat("Paul Enescu", 35000000, new DataCalend(1989,10,1)); personal[1]=new Angajat("Ion Popescu", 75000000,new DataCalend(1987,12,15)); personal[2]=new Angajat("Pop Ionescu", 38000000, new DataCalend(1990,3,15)); int i; for (i = 0; i < 3; i++) personal[i].maresteSalariu(5); for (i = 0; i < 3; i++) personal[i].print(); } } class Angajat{
Angajat( String n, double s, DataCalend d) { //constructorul de obiecte Angajat nume = n; salariu = s; dataCalendAngajare = d; }

public void print() { //metoda a obiectului System.out. println(nume + " " + salariu + " " + anAngajare()); } public void maresteSalariu( double procent) { //metoda a obiectului salariu*=1+ procent / 100;
}

public int anAngajare() { return dataCalendAngajare. getAn(); } private String nume; private double salariu; private DataCalend dataCalendAngajare; }

//metoda a obiectului

// variabile-instanta

Luca Dan Serbanati-Programare orientata spre obiect

3.3

RELAII NTRE CLASE I OBIECTE

Prin definiie, o relaie este o legtur logic sau fizic ntre dou clase sau ntre obiecte a dou clase implicate in relatie. Relaiile sunt de mai multe tipuri: 1. Generalizare/Specializare = Relaie logic ntre dou clase, reprezentand doua concepte A si B: B este o specializare a lui A cand despre cele doua concepte A si B se poate spune B este un A sau B este un tip de A sau B este o specie de A:: dulapul este o mobila, abonamentul TV este un tip de contract, delfinul este o specie de mamifer etc. 2. Asociere = Relaie fizic ntre obiectele a dou clase care indic faptul c instanele unei clase cunosc sau sunt conectate la instanele celeilalte clasei: un medic isi cunoaste pacientii si vice versa un pacient isi cunoaste medicii care il trateaza, un cont bancar isi cunoaste posesorul, un produs isi cunoaste furnizorul, un angajat isi cunoaste functia in intreprindere, un automobil Dacia este conform unei fise tehnice a modelului etc. 3. Agregare = Relaie fizic structural ntre obiectele a dou clase care indic faptul c instanele unei clase sunt compuse logic din instane ale celeilalte clase. 4. O compoziie este o form mai puternic de agregare ntre dou clase n care existenta obiectelor agregate depinde de existena obiectului care le conine. 5. Dependen = Relaie in general de tip utilizeaz n care se reprezint faptul c o modificare n specificaia unei componente ar putea influena componenta care o utilizeaz, dar nu invers. Iata cum se prezinta vizual in limbajul UML, relaiile dintre clasele: GestiuneComenzi, Comanda, ElementComanda, ComandaUrgenta si ContBancar.
GestiuneComenzi Agregare ElementComanda utilizeaza Dependen trece in Asociere

Comanda

ContBancar

*
Generalizare

ComandaUrgenta

Generalizare/Specializare Este o relaie cu intelesul . . .este o specie de. . . ntre dou concepte sau tipuri de date reprezentate de doua clase de obiecte: - Superclasa sau clasa de baz, - Subclasa sau clasa derivat. Exemplu. n figura urmtoare, se prezinta relaiile de generalizare dintre Client, ClientPrivat i ClientSocietate. Ultimele dou clase reprezint o specializare a primei clase:
Generalizare Subtip (subclasa) ClientPrivat ClientSocietate Client Supertip (superclasa)

Generalizare vs. motenire Implementarea direct a relaiei de generalizare/specializare se face prin intermediul motenirii, un mecanism specific limbajelor orientate spre obiecte.

Luca Dan Serbanati-Programare orientata spre obiect

Motenire = Clasa derivat motenete din clasa de baz toate atributele i toate operaiile neprivate. Prin intermediul motenirii, o clas obine imediat funcionalitatea unei clase existente. Exemplu. Presupunem c avem un editor grafic care foloseste clasele din urmtoarea diagram:
FiguraGeometrica x: integer y: integer vizibila: boolean sterge() redimensioneaza() vizualizeaza() setPozitie(a: int, b: int)

Dreptunghi a: float {a>0} b: float {b>0} setA(unA: int) setB(unB: int)

Triunghi a: float {c-b<a<c+b} b: float {a-c<b<a+c} c: float {a-b<c<a+b} setA(unA: int) setB(unB: int) setC(unC: int)

Cerc raza: float {raza>0} setRaza(r: float)

Patrat

Subclasele Dreptunghi, Triunghi i Cerc motenesc din superclasa FiguraGeometrica, atributele: - x, y care reprezint coordonatele punctelor ce formeaz un dreptunghi sau un triunghi, sau centrul cercului, dac forma geometric este un cerc, i - predicatul vizibila care determin dac figura exist sau nu n desenul construit de utilizator; i metodele: - sterge() care elimin din desen figura geometric respectiva, - redimensioneaza() care redimensioneaza figura respectiva n desen, - vizualizeaza() care visualizeaza figura respectiva in desen, - setPozitie(a: int, b: int) seteaz coordonatele unui punct (adic modific valorile atributelor x i y). Asociere O asociere intre doua clase este o multime de legaturi sau conexiuni intre obiecte a celor doua clase. O asemenea conexiune se chiama link. Un link se poate specifica ca o pereche de obiecte apartinand celor doua clase. Ordinea in cadrul perechii, pentru a nu fixa punctul de plecare a relatiei poate fi data de roluri. Un rol este un nume dat unuia din cei doi membrii ai perechii. Formal, o asociere este o relatie intre multimile de obiecte ale celor doua clase, adica o submultime a produsului cartezian al obiectelor celor dou clase. Exemplu. Fie multimile de entitati Spital si Persoana.
Spital = {Judetean, Municipal, Policlinica} Persoana = { George Sarbu, Nicu Enescu, Ion Popescu, Pop Ionescu }

Una din relaiile dintre o persoan i un spital poate fi relatia de conducere. Ea indica legatura dintre un spital si directorul sau. Ea poate fi definita ca o multime de perechi (spital, persoana):
conduce = {(Judetean, George Sarbu), (Municipal, Ion Popescu), (Policlinica, Pop Ionescu)}

Se vede ca:
conduce (Spital Persoana)

Sa consideram definitia a doua proiectii pr1 si pr2 asociate unei relatii R A B.

Luca Dan Serbanati-Programare orientata spre obiect

pr1 ( R ) [ { aA | bB, (a, b)R } pr2 ( R ) [ { bB | aA, (a, b)R }

Diagrama de mai jos sintetizeaza in UML aceasta relatie.


nume relaie

direcie

rol

Spital nume: String

conduce 0..1 asociere link

+ director

Persoana

1..1 nume: String multiplicitate

O1: Spital Judetean

director

P1:Persoana George Sarbu P2: Persoana Nicu Enescu

link O2: Spital Municipal O3: Spital Policlinica director link director

P3: Persoana Ion Popescu P4: Persoana Pop Ionescu

Utilizarea cardinalitatilor 1..1 si 0..1 indica numarul de obiecte dintr-o clasa care pot participa la conexiuni cu un acelasi obiect din cealalta clasa, deci se refera la existenta in relatia conduce a unor conditii de tipul:
1..1 0..1

In exemplul urmator se introduce intre aceleasi clase Spital si Persoana o alta relatie, aceea de angajare.
angajare (Spital Persoana)

pr1 (conduce) = Spital pr2 (conduce) Persoana

Un spital, dupa cum se stie, poate angaja mai multe persoane, de altfel nu poate functiona fara angajati. Cu alte cuvinte printre perechile (spital, persoana) va trebui gasim cel putin una pentru fiecare spital. Adica:
pr1 (angajare) = Spital

O persoana poate fi sau nu angajata unui spital, iar daca este angajata nu poate fi decat a unui spital. Cardinalitatea deci este 0..1 deoarece:
pr2 (angajare) Persoana

Am ajuns la aceleasi expresii pentru proiectii, desi cardinalitatea in partea Persoana a relatiei este diferita fata de exemplul precedent. ? Stim din pr1 ca orice spital are angajati, dar cum am putea stii care sunt acesti angajati? Ce lipseste din modelul matematic ca sa putem captura si multiplicitatea aparitiilor de conexiuni cu un acelasi obiect.
Spital nume: String 0..1 angajare
contine

Persoana Persoana angajat 1..n nume: String

Ar trebui sa utilizam conceptul de corespondenta (mapping) care ne da asocierile dintre obiectele celor doua clase. Echivalentul acestui concept in UML este jucat de catre rolul relatiei.

Luca Dan Serbanati-Programare orientata spre obiect

Intr-adevar, rolul angajat reprezinta numele unei functii care pentru fiecare spital ne restituie multimea angajatilor lui.
angajat(Municipal) = { Ana Velciu, Simona Nae, Maria Ionescu, . . . } Asa cum un rol patron plasat pe partea clasei Spital este o functie care pentru fiecare persoana

restituie o multime de spitale la care persoana este angajata. In cazul de fata aceasta este o multime vida sau cel mult cu un singur spital.
patron(Maria Ionescu) = { Municipal }

Probleme cu clase de obiecte 1. S se implementeze o clas Cerc, mpreun cu metodele getAria() pentru a obine aria i getCircumferinta(), care returneaz circumferina. n constructor indicai raza cercului. 2. S se implementeze o clas Student. Fiecare student are un nume i un punctaj total al examenelor. Furnizai un constructor corespunztor i metodele: getNume() pentru obinerea numelui; adaugaExamen(int nota) pentru a aduna punctajul fiecrui examen; getTotal() pentru a obine punctajul total; getMediaNote() pentru a returna media punctajului. 3. S se implementeze o clas Produs. Fiecare produs are un nume i un pret. Scriei constructorul i urmtoarele metode: afiseazaProdus(), getPret() i setPret(). S se scrie un program care creaz dou produse i le afiseaz, apoi s li se reduc preul cu 10000 lei i apoi s se afieze din nou. 4. S se scrie o clas numit Rational pentru realizarea operaiilor aritmetice cu numere raionale. Folosii variabile ntregi pentru a reprezenta variabilele instan private ale clasei: numrtor i numitor. Scriei un constructor care iniializeaz numrtorul cu 0, iar numitorul cu 1. Un alt constructor va stoca fracia n forma redus (de exp, fracia 2/4 ar trebui stocat n obiect ca 1/2). Clasa rational va furniza urmtoarele metode publice ce vor implementa urmtoarele operaii asupra numerelor raionale: - adunarea a dou numere raionale. Rezultatul va fi un numr raional stocat n forma redus. - scderea a dou numere raionale. Rezultatul va fi un numr raional stocat n forma redus. - nmulirea a dou raionale. Rezultatul va fi un numr raional stocat n forma redus. - mprirea a dou numere raionale. Rezultatul va fi un numr raional stocat n forma redus. - afiarea unui numr raional n forma numarator/numitor. - afiarea unui numr raional n format virgul flotant. S se scrie o alt clas Test care testeaz funcionalitatea clasei Rational. 5. S se scrie un program care verific dac data calendaristic introdus de utilizator este corect. Formatul datei introduse este zi/luna/an, air anul trebuie s fie ntre 1901 i 2099. Se vor folosi constructori suprancrcai. 6. S se scrie o clas Complex care realizeaz operaii aritmetice cu numere complexe. Numerele complexe au forma: parteaReala+i*parteaImaginara, unde i=sqrt(-1). Folosii variabile double pentru a memora datele private ale clasei. Furnizai 2 constructori, unul care iniializeaz variabilele clasei i un constructor care le iniializeaz cu valori implicite. Scriei metode publice pentru fiecare din urmtoarele operaii: - adunarea a dou numere complexe. Rezultatul este un numr complex nou. - scderea a dou numere complexe. Rezultatul este un numr complex nou. - afiarea unui numr complex sub forma (a,b) unde a este partea real, iar b partea imaginar a numrului complex. S se scrie o alt clas care testeaz funcionalitatea clasei Complex.

Luca Dan Serbanati-Programare orientata spre obiect

4 MOTENIRE I POLIMORFISM
Motenirea n Java este indicat prin cuvntul cheie extends n declaraia unei clase:
class Identificator extends NumeSuperClasa { CorpulClasei }

unde Identificator este subclasa, iar NumeSuperClasa este superclasa sa. De exemplu, clasa Femeie este o subclasa a clasei Persoana:
class Femeie extends Persoana{ ... }

n Java clasele formeaz o structur de arbore n care rdcina este clasa Object, a crei definiie apare n pachetul java.lang. Orice clas extinde direct (implicit sau explicit) sau indirect clasa Object. O subclas care doreste sa se deosebeasca de superclasa sa (pentru ca altfel ce rost ar avea sa o introducem?) are dou posibiliti: - s adauge membri noi si/sau - s redefineasc membrii superclasei. super = Cuvnt cheie care se utilizeaz n interiorul corpului unei metode a unei instane a unei clase pentru a indica obiectul superclasei ce intra in structura instantei curente. Nota. Un obiect al unei subclase este alocat in memorie intr-o zona care include atat spatiul alocat obiectului superclasei, cat si spatiul necesar variabilelor declarate in subclasa. Exemplu Reutilizand clasele Angajat i TestAngajat de mai sus, sa definim o clasa noua Manager ca un caz particular de Angajat. Stim ca un manager are o secretar cu un nume cunoscut.In fine, stim ca mrirea salariului unui obiect Manager se face ca si pentru un Angajat doar ca la fiecare mrire i se mai adaug un procent de 0.5% pentru fiecare an de vechime. Iata programul:
import java.util.*; . . . . public class TestAngajat{ public static void main(String[] args) { Angajat[] personal= new Angajat[3]; . . . . . } } class Angajat{ public void maresteSalariu(double procent){ . . . } class Manager extends Angajat{ public Manager(String n, double s, Date d, String nume) { super(n, s, d); numeSecretara = nume; } public void maresteSalariu(double procent) { //adauga o prima de 1/2% pentru fiecare an Zi azi=new Zi(); double prima=0.5*(azi.getAn()-anAngajare(); super.maresteSalariu(procent + prima); } public void setNumeSecretara(String n) { numeSecretara = n; } public String getNumeSecretara(){ return numeSecretara; } private String numeSecretara; }

Luca Dan Serbanati-Programare orientata spre obiect

S-a definit o clasa Manager ca subclas a lui Angajat. Manager are o variabila privat in plus numeSecretara pentru memorarea numelui secretarei. Aceasta informatie in plus ne obliga sa adaugam o pereche get/set pentru accesul la variabila privata. Setarea numelui secretarei se face apelnd o metoda inexistenta in clasa Angajat: setNumeSecretara(String s). Metoda care restituie numele secretarei este getNumeSecretara(). Trebuie sa rezolvam si initializarea unui obiect Manager. Pentru aceasta se defineste un constructor special pentru clasa Manager. In constructor se initializeaza mai nti partea obiectului care corespunde unui obiect Angajat (apelnd constructorul superclasei cu super) i apoi se initializeaza variabila numeSecretara cu sirul nume. In fine, mrirea salariului unui obiect Manager se face tot cu metoda maresteSalariu(double) ca si pentru un Angajat doar ca salariul se calculeaz altfel: la fiecare mrire i se mai adaug un procent (0.5) pentru fiecare an de vechime. Aadar, a trebuit s rescriem metoda maresteSalariu(double). Dat fiind ca dupa adaugarea premiului de vechime, unui Manager I se mareste salariul ca si unui Angajat, s-a reutilizat algoritmul maresteSalariu() al superclasei chemand:
super.maresteSalariu(procent + prima);

Clasa Object Dup cum s-a aratat toate obiectele din Java motenesc clasa Object. Orice clas redefinete metode motenite din clasa Object.
public class Object { public java.lang.Object(); // constructor public java.lang.String toString(); protected native java.lang.Object clone() throws CloneNotSupportedException; public boolean equals(java.lang.Object); public native int hashCode(); protected void finalize() throws Throwable; public final native java.lang.Class getClass(); public final native void notify(); public final native void notifyAll(); public final void wait() throws InterruptedException; public final native void wait(long) throws InterruptedException; public final native void wait(long, int) throws InterruptedException; }

Mecanismul apelarii metodelor


Definitia Clasa 4 Clasa 3 Clasa 3 Definitia initiala a metodei Clasa Metoda redefinita

Clasa

Clasa

Clasa

Clasa 2

Clasa

Clasa 2

Obiect

Obiect

Obiect

Obiect

Luca Dan Serbanati-Programare orientata spre obiect

O metod din superclas poate fi redefinit (suprascris) n subclas cu urmtoarele observaii: - metoda redefinit trebuie sa aib exact aceeai semntur; - metoda redefinit trebuie s aib acelai tip al rezultatului ntors; - dac metoda redefinit i schimb modificatorul de acces, acesta trebuie s acorde o vizibilitate mai mare fa de metoda din superclas. Dupa cum se vede din figura de mai jos, apelul unei metode a unui obiect apartinand unei subclase, daca metoda apelata nu este definita in subclasa, este transmis n sus n ierarhia de clase pn cnd este gsit o prima definiie a metodei apelate. Reutilizarea codului Reutilizarea codului in Java ofera mai multe posibilitati unui programator pentru a-si usura munca: 1. reutilizarea codului unei clase pentru crearea de noi obiecte, 2. reutilizarea claselor pentru scrierea de clase noi utilizand mecanismul motenirii, 3. reutilizarea obiectelor unor clase existente pentru implementarea functionalitii obiectelor unei clase noi (compoziie +delegare). Cum prima posibilitate este evidenta pentru ca nu putem programa cu obiecte daca nu o utilizam, celelalte doua necesita o analiza atenta din partea programatorului. Motenirea va fi utilizat doar n cazul in care intre noua clasa si o clasa din program exista o relaie de generalizare/specializare sintetizata prin este o specie de sau prin este un tip de (un manager este un tip de angajat, o fiinta umana este o specie de mamifer etc.). Cand decide pentru utilizarea mostenirii programatorul trebuie sa fie atent: - sa nu exagereze cu overriding-ul metodelor in subclase sau cu anularea membrilor superclasei. Nevoia utilizarii repetate a acestor operatii ar trebui sa ridice dubii asupra corectitudinii folosirii mostenirii; - sa nu confunde relatia este o tip de cu relatia este un rol dezvoltat de . Pentru aceasta din urma nu trebuie folosita mostenirea ci delegatia cu compozitie. Nota. Cand se utilizeaz motenirea trebuie s funcioneze principiul nlocuirii : Orice obiect al subclasei poate nlocui n program un obiect al superclasei fr s genereze mesaje de eroare la execuie. Compozitie cu delegare
FiguraGeometrica x: integer y: integer vizibila: boolean sterge() redimensioneaza() vizualizeaza() setPozitie(a, b)

Dreptunghi a: float {a>0} b: float {b>0} sterge() redimensioneaza() vizualizeaza() setA(unA) setB(unB) getA() getB()

Triunghi a: float {c-b<a<c+b} b: float {a-c<b<a+c} c: float {a-b<c<a+b} sterge() redimensioneaza() vizualizeaza() setA(unA) setB(unB) setC(unC) getA() getB() getC()

Cerc raza: float {raza>0} sterge() redimensioneaza() vizualizeaza() setRaza(r) getRaza()

Luca Dan Serbanati-Programare orientata spre obiect

Presupunem c avem un editor grafic cu trei figuri geometrice la dispoziie: dreptunghi, cerc i triunghi in relatie asa cum se vede in diagrama UML de mai sus. Ni se cere s adugm o figur geometric nou: CercPatrat format dintr-un cerc i un ptrat. Compozitia cu delegare ne da o solutie eleganta problemei in care nu trebuie sa rescriem nici o instructiune din codul deja existent. Mai mult, mecanismul il putem utiliza pentru implementarea noii functionalitati. Solutia este sintetizata in diagrama UML de mai jos
FiguraGeometrica x: integer y: integer vizibila: boolean sterge() redimensioneaza() vizualizeaza() setPozitie(a, b)

CercPatrat {2*c.raza=d.a=d.b} } sterge() redimensioneaza() vizualizeaza() setA(unA)

Dreptunghi a: float {a>0} b: float {b>0} sterge() redimensioneaza() vizualizeaza() setA(unA) setB(unB) getA() getB()

d
contine

1
contine

Triunghi a: float {c-b<a<c+b} b: float {a-c<b<a+c} c: float {a-b<c<a+b} sterge() redimensioneaza() vizualizeaza() setA(unA) setB(unB) setC(unC) getA() getB() getC()

Cerc raza: float {raza>0} sterge() redimensioneaza() vizualizeaza() setRaza(r) getRaza()

c 1

j t

Codul noii clase utilizeaza clasa FiguraGeometrica si obiectele clasele Dreptunghi si Cerc deja existente. Clasa extinde FiguraGeometrica si agrega un cerc si un dreptunghi. Metodele sale utilizeaza cele 2 obiecte agregate pentru a implementa functiunile impuse de FiguraGeometrica.
class CercPatrat extends FiguraGeometrica{ Cerc c; Dreptunghi r; public void redimensioneaza(float f) { int a; a=r.getA(); setA((int)(a*f)); } public void vizualizeaza(){ c.vizualizeaza(); r.vizualizeaza(); } public void sterge(){ c.sterge(); r.sterge(); } public void setA(int a){ c.setRaza(a/2); r.setA(a); r.setB(a); } }

Luca Dan Serbanati-Programare orientata spre obiect

Interaciuni ntre obiecte (UML) Cele diagrame de mai jos descriu colaborarea unui obiect CercPatrat cu obiectele Dreptunghi si Cerc r si c. Ele sunt diagrame de interactiuni UML.
: CercPatrat redimensioneaza(f) r : Dreptunghi c : Cerc 1.2: setA(a*f)

a=getA( ) setA(a*f)

redimensioneaza(f)

setRaza(unA/2) : CercPatrat a=getA( ) c : Cerc

unA = (int) (a*f)

setRaza(unA/2) setA(unA) setB(unA) r : Dreptunghi

Polimorfism n Java Fie cele patru clase cu relatiile dintre ele prezentate in urmatoarea diagrama UML.
Figura vizualizeaza() sterge()

Cerc vizualizeaza() sterge()

pPatrat vizualizeaza() sterge()

Triunghi vizualizeaza() sterge()

Codul Java care implementeaza aceasta diagrama este prezentat mai jos. In cod s-a adaugat o clasa Figuri care verifica functionarea polimorfismului in Java. Se observa ca se genereaza in maniera random 9 obiecte Cerc, Dreptunghi si Triunghi, promovate ca obiecte Figura, ceea ce este perfect corect deoarece obiectele unei subclase sunt si obiecte ale superclasei clasei respective. Lucrand cu cele 9 obiecte Figura, chemarea metodelor visualizeaza() si sterge(), produce nu un efect nul cum sunt implementate in clasa Figura ci efectul metodelor specializate din clasele Cerc, Dreptunghi si Triunghi. Acesta este polimorfismul! Intr-un limbaj de programare pe obiecte ce utilizeaza mostenirea claselor, apelul unei variabile a superclasei cu o metoda a acesteia lanseaza o metoda care este decisa la momentul executiei pe baza obiectului memorat in variabila si nu pe baza tipului variabilei utilizate in apel.
class Figura{ // clasa de baz void vizualizeaza(){} void sterge(){} } class Cerc extends Figura{ //clasa derivata void vizualizeaza(){ // redefinire System.out.println("Cerc. vizualizeaza()"); } void sterge(){ // redefinire System.out.println("Cerc.sterge()"); } }

Luca Dan Serbanati-Programare orientata spre obiect

class Patrat extends Figura{// derivata void vizualizeaza(){ //redefinire System.out.println("Patrat. vizualizeaza()"); } void sterge() { // redefinire System.out.println("Patrat.sterge()"); } } class Triunghi extends Figura {// derivata void vizualizeaza() { // redefinire System.out.println("Triunghi. vizualizeaza()"); } void sterge() { // redefinire System.out.println("Triunghi.sterge()"); } } public class Figuri{ public static Figura genereazaFigura() { switch((int)(Math.random() * 3)) { default: case 0: return new Cerc(); case 1: return new Patrat(); case 2: return new Triunghi(); } } public static void main(String[] args){ Figura[] s = new Figura[9]; for(int i = 0; i < s.length; i++) s[i] = genereazaFigura(); for(int i = 0; i < s.length; i++) s[i]. vizualizeaza(); } } Iesire: Cerc.vizualizeaza() Triunghi.vizualizeaza() Cerc.vizualizeaza() Cerc.vizualizeaza() Cerc.vizualizeaza() Patrat.vizualizeaza() Triunghi.vizualizeaza() Patrat.vizualizeaza() Patrat.vizualizeaza()

Overriding in Java
class Parinte{ int y=1; int oMetoda() { return y; } } class Fiu extends Parinte{ int y; int oMetoda(){ y=super.y+1; return super.oMetoda()+y; } } class Fruct { boolean coajaComestibila=false; } class Mar extends Fruct { boolean coajaComestibila=true; public static void main(String args[]) { Mar m = new Mar(); Fruct f = m; System.out.println(f.coajaComestibila); System.out.println(m.coajaComestibila); System.out.println(((Fruct)m).coajaComestibila); } } Iesire: false true false

Luca Dan Serbanati-Programare orientata spre obiect

Din exemplele de mai sus se constata ca variabilele si metodele suprascrise nu dispar din obiectele subclaselor! Constructori i mostenirea
public class Mamifer{ String numme; int varsta; char sex; public Mamifer(){ varsta = 0; } public int getVarsta(){ return varsta; } public void schimbaNume(String n){ nume=n; } } class Persoana extends Mamifer{ String prenume; public Persoana() { //este implicit Mamifer(); } public Persoana(String n, String p){ //este implicit super(); nume=n; prenume=p; } . . . . . . . public class Caine extends Mamifer{ boolean areCoada; public Caine() { //este implicit Mamifer(); nume=Lessi"; sex=F; areCoada=true; } . . . . . }

Clase abstracte Metoda abstract= O metod care nu definete algoritmul de implementare. Exemplu:
abstract void metoda(); public abstract int read() throws IOException; abstract class Message { public Message(String from){sender = from;} public abstract void play(); public String getSender() { return sender; } private String sender; } class TextMessage extends Message { public TextMessage(String from, String t) { super(from); text = t; } public void play(){System.out.println(text);} private String text; } class VoiceMessage extends Message { public VoiceMessage(String from, String f) { super(from); filename = f; } public void play() { AudioPlayer ap = AudioPlayer.player; try { AudioStream as = new AudioStream( new FileInputStream (filename)); ap.start(as); } catch(IOException e) {} } private String filename; }

Clasa abstracta = O clasa cu cel puin o metod abstract. Exemplu: abstract class ClasaAbstracta{ . . }

Luca Dan Serbanati-Programare orientata spre obiect

Dezvoltarea unei aplicatii pe obiecte Cont bancar Se considera definrea unei clase care descrie comportamentul unui cont bancar. 1. Definirea numelui clasei: ContBancar. 2. Determinarea proprietatilor clasei, care caracterizeaza obiectele clasei. Se insereaza variabila sold de tip long. 3. Intelegerea modului in care se comporta obiectele clasei. Care sunt operatiile care se pot face cu un cont bancar? ContBancar Responsabilitatea clasei ContBancar: - sold: long Depune bani depune Scoate bani scoate + depune(suma:long) + scoate(suma: long) Cere soldul curent getSold + getSold():long 4. Definirea modurilor in care vor fi create obiecte ContBancar. + ContBancar() Un cont bancar poate fi creat vid ContBancar() + ContBancar(depozit: long) Un cont bancar poate fi creat intializand soldul ContBancar(long s) Clasa ContBancar Responsabilitatea clasei ContBancar: - Depune bani - Scoate bani Cere soldul curent
public class ContBancar{ public void depune(long suma){ . . . . . } public void scoate(long suma){ . . . . . } public long getSold(){ . . . . . } }

Variabila instanta: private long sold; Constructori: - Construieste un cont cu un depozit vid - Construieste un cont cu un depozit specificat
public class ContBancar{ public ContBancar() { sold=0; } public ContBancar(long depozit) { sold = depozit; } . . . . }

Luca Dan Serbanati-Programare orientata spre obiect

Exercitiu(I). Sa se implementeze clasa ContBancar prezentata anterior. Considerati diagrama de clase:


ContBancar - sold: long + depoziteaza(suma:long) + scoate(suma: long) + getSold():long + ContBancar() + ContBancar(depozit: long)

ContEconomii - rataDobanda: double + ContEconomii(rata:double) + ContEconomii(d: long, rata: double) + adaugaDobanda()

ContCurent - nrTranzactii: int - TRANZACTIIGRATIS: int {final} - TRANZACTIIPLATITE: int {final} + ContCurent() + ContCurent(depozit: long) + scadeCheltuieli() + depune(suma: long) + scoate(suma: long)

Proiectati si implementati clasele ContEconomii (rata fixa de dobanda pe depozite) si ContCurent (ofera un numar de tranzactii gratuite; daca se termina aceste tranzactii, fiecare tranzactie se plateste cu o suma fixa la sfarsitul anului). Sa se scrie o clasa TestContBancar care creaza doua conturi de economii si un cont curent, sa se execute 2-3 tranzactii pentru fiecare cont si sa vizualizeze situatia, la inceput si dupa efectuarea tranzactiilor. Exercitiu (II). Sa se imbogateasca ierarhia clasei ContBancar cu o noua clasa ContDepozitTemporar, un tip particular de ContEconomii. In acest cont, titularul se obliga lase banii un anumit numar de luni, probabil in schimbul unei dobanzi mai mari. Odata ce s-a indeplinit termenul de scadenta a contului, nu exista nici o penalizare pentru il prilievo. In schimb, daca suma este scoasa inainte de scadenta, ea va fi eliberata fara dobanda. Sa se modifice clasa TestContBancar, modificand un cont de economii intr-un cont de perioada limitata (utilizati polimorfismul metodelor).
ContBancar

ContEconomii

ContCurent

ContDepozitTemporar

Luca Dan Serbanati-Programare orientata spre obiect

5 ARRAY-URI
Array = O colecie liniar de elemente n care fiecare element este accesibil prin intermediul unui indice. Un constructor array furnizeaz spaiu pentru valorile de tip primitiv sau referin la obiectele de un acelai tip. Un array va fi memorat ntr-o anumit variabil. Declararea unei variabile array conine [ ].
int[] numere; Persoana personal[];

Pentru a exista ntr-un program, un array trebuie s fie creat (alocat) cu new:
numere = new int[5]; personal = new Persoana[1000];

Dup creare, elementele array-ului se pot umple cu valori. Indexul unui array ncepe de la 0. Un array cu 10 elemente va avea indicele de la 0 la 9.
array-ul personal array-ul numere 101 837 -27 -99 5 4 0 1 2 999 obiecte Persoana

0 array unidimensional de 53 1 2 ntregi

array unidimensional de 1000 obiecte Persoana

Lungimea unui array =Numrul de elemente ale array-ului. Pentru fiecare array exist o variabil length care furnizeaz lungimea: personal.length Un array poate avea mai multe dimensiuni, adic mai muli indici prin intermediul crora elementele se ordoneaz ntre ele. 5.1 INIIALIZAREA UNUI ARRAY La momentul crerii unui array, elementelor sale le sunt atribuite valoarea zero (tipuri primitive) sau null (tipuri referin).
char[] text; //variabil-referin la un array de caractere long lista[][]; //[] se aeaz fie dup tip, fie dup numele variabilei float[][] coordonate=new float[10][15]; //cu alocare de memorie int valori = {11, 7, 89}; //array creat i iniializat int numere[5]={101, 837, -27, -99, 5};//array creat i iniializat String zile[]={"Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata, "Duminica"}; String luni[]={"Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie", "Iulie", "August", "Septembrie","Octombrie","Noiembrie", "Decembrie"}; int[] arrayDeInt = new int[100]; //creare i alocare array for (int i=0; i<arrayDeInt.length; i++) arrayDeInt[i]=i; //umplerea arrayului cu valori

Metod care permite copiarea unui numr de elemente consecutive ale unui array ntr-un alt array:
System.arraycopy(arraySurs, pozSurs, arrayDest, pozDest, nrElemente);

Luca Dan Serbanati-Programare orientata spre obiect

Lucrul cu array-uri
import java.util.*; public class Arrays { public static void main(String[] args){ int[] a1={1, 2, 3, 4, 5}; int[] a2; a2 = a1; for(int i = 0; i<a2.length; i++) a2[i]++; for(int i = 0; i<a1.length; i++) afiseaza("a1[" + i + "] = "+a1[i]); } static void afiseaza(String s){ System.out.println(s); } } import java.util.*; public class ArrayClassObj{ static Random aleator=new Random(); static int pRand(int mod){ return Math.abs(aleator.nextInt())%mod; } public static void main(String[] args){ Integer[] a = new Integer[pRand(20)]; afiseaza("length of a = "+a.length); for(int i = 0; i < a.length; i++){ a[i] = new Integer(pRand(500)); afiseaza("a[" + i + "] = "+a[i]); } }

Array n metode

class Pisica{ String nume=niciUnul; String rasa=necunoscuta; String mieunat= new String(Miau); boolean prietenoasa=true; boolean dresata=false; int varsta = 0; String[] dietaPeZi=null; . . . . void setDieta(String[] dieta) { dietaPeZi=new String[dieta.length]; for (int i = 0; i < dieta.length; i++) dietaPeZi[i] = dieta[i]; } String[] getDieta(){return dietaPeZi;} void afiseazaDieta(){ if (dietaPeZi==null) System.out.println(Lipseste dieta pentru pisica + getNume()); else{ System.out.println(Dieta pentru pisica + getNume() ); for (int i=0; i<dietaPeZi.length; i++) System.out.println(dietaPeZi[i]); } }

5.2

ARRAY-URI MULTIDIMENSIONALE

public class TestDietaPisica{ public static void main(String[] args) { Pisica ettore = new Pisica(); ettore.setNome(Ettore); String[][] dietaSaptamana={{50 grame carne,50 grame peste,100 grame apa}, {100 grame hrana din conserva,50 grame biscuii,150 grame apa}, . . .}; ettore.setDieta(dietaSaptamana[new Data().getDayWeak()]); ettore.afiseazaDieta(); } } import java.util.*; public class ArrayMultiDimensionale{ static Random aleator= new Random(); static int pRand(int mod) { return Math.abs(aleator.nextInt())%mod; } public static void main(String[] args){ //array 3-D cu dimensiuni fixe:

Luca Dan Serbanati-Programare orientata spre obiect

int[][][] a2 = new int[2][2][4]; for(int i = 0; i < a2.length; i++) for(int j = 0; j< a2[i].length; j++) for(int k=0; k<a2[i][j].length;k++) afiseaza("a2[ + i+"]["+j+"]["+k+"] = " + a2[i][j][k]); //array 3-D cu vectori de lungime diferit pentru cele trei dimensiuni int[][][] a3 = new int[pRand(7)][][]; for(int i = 0; i<a3.length; i++){ a3[i] = new int[pRand(5)][]; for(int j=0; j<a3[i].length; j++)a3[i][j] = new int[pRand(5)]; } for(int i=0; i<a3.length; i++) for(int j=0; j<a3[i].length; j++) for(int k=0; k<a3[i][j].length; k++) afiseaza("a3["+i+ "]["+j+"]["+k+"]= " +a3[i][j][k]); //array 3x2 de obiecte Integer Integer[][] a4={{new Integer(1), new Integer(2)}, {new Integer(3), new Integer(4)}, {new Integer(5), new Integer(6)}}; for(int i = 0; i < a4.length; i++) for(int j = 0; j < a4[i].length; j++) afiseaza("a4[" + i + "][" + j + "] = + a4[i][j]); } static void afiseaza(String s){ System.out.println(s); } }

Exerciiu: Magazin2. Adugai funcionalitatea programului Magazin pentru gestionarea titlurilor de cri i de jocuri video, adic memorarea, gsirea i vizualizarea titlurilor: - Copiai ntr-un director Magazin2 fiierele .java ale directorului Magazin1; - Creai un tip de date Titlu cu dou variabile-instan: titlu i autor, iniializate cu niciUnul i implementai metodele de acces get i set pentru cele dou variabile; - Adugai variabila titluri de tip Titlu tipului Magazin, iniializat cu null, i implementai metodele setTitluri() i getTitluri(); - Adugai metoda vizualizeazaTitluri() tipului Magazin care parcurge array-ul de titluri i vizualizeaz datele titlu-autor; - Modificai clasa TestMagazin pentru a ncorpora funcionalitatea metodei vizualizeazaTitluri(). Exerciii 1. S se scrie o metod predicat (ntoarce o valoare boolean): care verific dac dou array-uri au elemente comune, cu acelai numr de apariii. 2. S se scrie dou metode ale clasei Poligon:
public double calculeazaPerimetru() {. . .} public double calculeazaArie() {. . .}
i

public static boolean aceleaiElemente(int[] a, int[] b)

care calculeaz perimetrul i aria unui poligon. Pentru a calcula perimetrul, calculai distana dintre punctele adiacente i adunai aceste distane. Aria unui poligon cu punctele (x0, y0), , (xn-1, yn-1) este: |x0y1+x1y2+x2y3++xn-1y0-y0x1-y1x2--yn-1x0|/2 3. S se scrie un program care iniializeaz un array de numere ntregi pozitive i afiseaz histograma valorilor memorate n array: Element Valoare Histograma 1 3 *** 2 5 ***** 3 9 ********* 4 13 *************

Luca Dan Serbanati-Programare orientata spre obiect

6 CONVERSIA DATELOR
Wrapper de obiecte Wrapper = Un obiect care servete ca nveli al unui alt obiect sau dat primitiv, nlocuindu-l pe acesta. Exist clase wrapper pentru toate tipurile primitive: Integer, Long, Float, Double, Byte, Character, Void i Boolean. Obiectele acestor clase permit conversia ntre obiecte i tipuri primitive.
int x = Integer.parseInt(s)

Obiectele wrapper de tipuri primitive sunt utile pentru adugarea de noi funcionaliti tipurilor primitive. Integer are urmtoarele metode statice:
int parseInt(String) int parseInt(String, int) Integer decode(String) String toString(int) String toXXXString(int) // XXX este Binary, Hex, Octal String toString(int, int) Integer valueOf(String) Integer valueOf(String, int)

Obiectele Integer au urmtoarele metode:


XXX xxxValue() // xxx este byte, float, double etc.

Obiectele Integer au urmtoarele constante:


Integer.MIN_VALUE Integer.MAX_VALUE

Exemplu. Metoda gaseste() se poate utiliza fie pentru a gsi obiecte-Angajat, fie pentru a gsi obiecte-Double.
static int gaseste(Object[] a, Object cheie){ for (int i=0; i<a.length; i++) if (a[i].equals (cheie)) return i; return -1; } . . . Angajat[] personal; Angajat ion; Double[] valori; . . . int n=gaseste(personal, ion); int m=gaeste(valori, new Double(3.14));

Conversia automat a tipurilor reference Exist referine pentru trei categorii de tipuri de referine la obiecte: - tip de clasa (ca Button sau FileReader) - tip de interfa (ca LayoutManager sau Throwable) - tip de array (ca int[][] sau TextArea[]) Sunt trei contexte n care se folosesc conversii pentru valori reference: - atribuire - transmiterea parametrilor i rezultatul dintr-un apel de metod - casting Reguli de conversie automat:

Luca Dan Serbanati-Programare orientata spre obiect

tipNou

Clas Interfa Array

Clas tipVechi este o subclas a lui tipNou tipVechi implementeaz interfaa tipNou eroare de compilare

tipVechi Interfa tipNou trebuie s fie Object tipVechi este o subinterfa a lui tipNou eroare de compilare

Array tipNou trebuie s fie Object tipNou trebuie s fie Cloneable tipVechi trebuie s fie un array de un tip referin care admite o conversie la tipul elementelor de tip tipNou

Casting de reference la obiecte Reguli de conversie utiliznd operatorul de casting (tip): La compilare: 1. Cnd cele dou tipuri sunt clase, una trebuie s fie subclasa celeilalte. 2. Cnd cele dou tipuri sunt array-uri, ambele trebuie s conin tipuri reference la obiecte i trebuie s putem face cast ntre elementele unui array la elementele celuilalt array. 3. ntotdeauna se poate face casting ntre o interfa i un obiect nefinal. La execuie: 1. Dac tipNou este o clas, tipVechi trebuie s fie aceeai clas sau o subclas a acesteia. 2. Dac tipNou este o interfa, tipVechi trebuie s implementeze interfaa. Exemplu de conversie de reference
Automobil masina=new Automobil(); Autovehicul avehicul=masina; // OK Autovehicul avehicul=new Autovehicul(); Automobil masina=avehicul; // Eroare Autobuz abuz = new Autobuz(); Rifornibile rif = abuz; // OK Autobuz abuz2 = rif; // Eroare la
Object

Vehicul

Rifornibile

compilare

Autovehicul

Vehicul vehicul[]; Autocar acar[]; Autovehicul avehicul[]=new Autovehicul[10]; . . . . Autocar Vehicul=avehicul; // OK acar =avehicul; // Eroare compilare Autobuz ab, ab1; Autovehicul avehicul; Automobil masina; ab=new Autobuz(); // Clasa Autobuz avehicul=ab; // OK, cast-ul nu are nici un efect ab1 = (Autobuz)avehicul; // OK cast masina= (Automobil)avehicul;// Excepie! Autobuz ab, ab1; Rifornibile rif; ab = new Autobuz(); // Clasa Autobuz rif = ab; // Ok ab1 = rif;//Conversie interzis implicit! ab1 = (Autobuz)rif; //Ok la compilare

Automobil

Autobuz

Luca Dan Serbanati-Programare orientata spre obiect

7 APPLET
Comunicaii n Internet Fereastra ului browser-

Applet

Pagina HTML Codul applet-ului ListaPreturi.dat

Fiierul ListaPreturi.dat
# ListaPreturi # Sat 16 Nov 7:54:50 2002 Imprimant+HP650C=1490000; Inscriptioner+Philips3600=395000; CDROM+Pioneer+32xScsi=128000; CD+rescriptibil+TDK=2490;

Server

Client

Browser - vizualizeaz resursele codificate n HTML. - Suport pentru orice mecanisme de scripting. - Context pentru executarea applet-urilor Java. - Suport plug-ins. - Cere resurse de la server-ele din reea. - Utilizeaz protocolul HTTP. - Identific resursele utiliznd adrese unice - URI (Uniform Resource Identifier) sau URL. Cum funcioneaz browser-ul: 1. Utilizatorul d un click pe un link al unui site Web. 2. Browser-ul Web trimite un header al unei cereri HTTP. Header-ul conine: comanda, adresa documentului i numrul versiunii HTTP.
GET /index.htm HTTP/1.0

3. Header-ul poate fi nsoit de alte informaii: software-ul browser-ului i o list de tipuri de documente (GIF, JPEG etc.) care pot fi prelucrate de browser. 4. Server-ul primete cererea. 5. Server-ul localizeaz fiierul i l trimite clientului precedat de un header compus din mai multe linii care ncep cu un cuvnt cheie: numrul versiunii HTTP, numrul de cod al strii cu o descriere a codului i un header de rspuns cu informaii despre el i despre document:
HTTP/1.0 200 OK Date: Sun, 21 Sep 1997 12:15:00 GMT Server: NCSA/1.5.2 Last-modified: Sun, 21 Sep 1997 8:00:00 GMT Content-type: text/html Content-length: 3012 . . .coninutul documentului . . .

Pagini Web Pagin Web = Document de text cu extensia .html sau .htm al crui coninut va fi citit i interpretat de un browser.

Luca Dan Serbanati-Programare orientata spre obiect

Poate fi scris cu word processor oarecare, este de ajuns s fie salvat n format de text cu extensia .html sau .htm. Paginile Web sunt resurse Web care au o adres URL (Uniform Resource Locator). HTML = Limbaj de comenzi cu care va fi scris pagina Web. Utilizeaz tag-uri (comenzi ntre < i >) care au un neles bine precizat pentru browser. Structura unei pagini Web: Header + Corp
<HTML> <HEAD> Header </HEAD> <BODY> Corp </BODY> </HTML>

<HEAD>

Structura ului:

header-

Structura corpului:
<BODY TEXT= LINK= ALINK= VLINK= BACKGROUND= > tag-uri +text </BODY>

<TITLE>text </TITLE> </HEAD>

Un fiier HTML simplu Un tag poate avea modificatori. Orice modificatori sunt atributi, adic perechea nume=valoare: <BODY
<HTML> <!Acesta este un comentariu --> <HEAD> <TITLE>Arhitectura Internet</TITLE> </HEAD> <BODY BACKGROUND="" BGCOLOR="#ffffff" TEXT="#000000" LINK="#0000ff" VLINK="#800080" ALINK="#ff0000"> <P>Bine ati venit n site-ul nostru!</P> </BODY> </HTML>

BGCOLOR=yellow>

Tag-uri de formatare a textelor Titluri de seciune: <H1>text</H1>, <H2>text</H2>,. . ., <H6>text</H6> Alinearea textului: <CENTER>text</CENTER> sau ca atribut: <H1 ALIGN=CENTER>text</H1> Trecerea pe linia urmtoare n paragraful curent: <BR> A capo considerati letteralmente: <pre>text</pre> Separarea paragrafelor: <P>text</P> sau cu un atribut: <P ALIGN=LEFT> Liste ale cror elementele sunt prefixate de un punct:
<UL> <LI> text <LI> text </UL> <OL> <LI> text <LI> text </OL> introduce o lista introduce un element n list termin lista introduce un element n list termin lista

Liste ale cror elemente sunt numerotate:

Linie de separare: <HR>

Luca Dan Serbanati-Programare orientata spre obiect

Tag-ul APPLET <APPLET [ALT=TEXT] CODE=NUMEAPPLET.CLASS [CODEBASE=URL-UL FIIERULUI .CLASS] HEIGHT=NLIMEA N PIXELI [HSPACE=SPAIUL ORIZONTAL DINTRE APPLET I TEXTUL CARE-L NCONJOAR] WIDTH=LRGIMEA N PIXELI [VSPACE=SPAIUL VERTICAL NTRE APPLET I TEXTUL CARE-L NCONJOAR] [NAME=NUMELE APPLET-ULUI] > [<PARAM NAME=PARAMETRU1 VALUE=VALOARE PARAMETRU1>] [<PARAM NAME=PARAMETRU2 VALUE=VALOARE PARAMETRU2>] </APPLET> <APPLET NAME=BUNA CODE=BUNA.CLASS CODEBASE=C:/.JWS WIDTH=500 height=600 align=Top alt=Ar trebui sa vedei un applet aici > </APPLET> <OBJECT
NAME=BUNA CODE=BUNA.CLASS CODEBASE=C:/.JWS WIDTH=500 height=600 align=Top alt=Ar trebui sa vedeti un applet aici

> Clasa Applet Un applet este un obiect al unei clase definit de utilizator care specializeaz clasa Applet a pachetului java.applet sau clasa JApplet a pachetului javax.swing. Clasa Applet este un Container care utilizeaz metoda paint pentru vizualizarea desenelor i componentelor grafice (GUI) pe o suprafa dreptunghiular. Un applet are posibilitatea de a funciona ca parte integrant a unui browser i de a gestiona evenimente la fel cum este descarcata pagina Web. Un applet are posibilitatea de a prezenta utilizatorului o interfa grafic i de a gestiona intrarea utilizatorilor. Exemplu:
import java.awt.*; import java.applet.Applet; public class AppletPisica extends Applet { public void init(){setBackground(Color.magenta);} public void paint(Graphics g){g.drawString(Miau!,20,30);} }

n pagina HTML:
<applet name=Pisica" height="60> </applet> code=AppletPisica codebase=classes" width=100

Cnd ntlnete tag-ul APPLET, browser-ul execut urmtorii pai: 1. Incarc fiierul AppletPisica.class din directorul classes. 2. Aloc aria de vizualizare a applet-ului. 3. Instaniaz clasa AppletPisica. 4. Cere executarea metodelor standard implementate n applet: init, paint etc. Structura unui applet:

Luca Dan Serbanati-Programare orientata spre obiect

import public public public public public public }

java.applet.Applet; class NumeApplet extends Applet{ void init(){} void start(){} void stop(){} void destroy(){} void paint(Graphics g){}
Browser 1. Acceseaz pagina care conine un applet Applet

Cere ncrcarea applet-ului Applet-ul este ncrcat n sistem Pentru a-l iniializa, browser-ul cheam 2. Applet-ul a fost ncrcat n sistem i iniializat Browser-ul cheam

init()

start() applet-ul ruleaz paint()

apoi cheam 3. ... vizualizeaz ntreaga pagin

4. Browser-ul lanseaz pagina i cheam

stop() applet-ul se nchide

5. Browser-ul revine n pagina applet-ului sau browser-ul elibereaz definitiv pagina coninut 6. ... va fi apelat metoda destroy()

Desenarea cu paint() - paint(), repaint() i update() sunt utilizate pentru desenarea pe un Container, de aceea pe un applet vizualizat n pagina HTML. n aceste metode trebuie s descriem cum trasm n dreptunghiul applet-ului un text, o linie, un fond de o anumit culoare sau o imagine. - pentru a vizualiza orice lucru avem nevoie s redefinim metoda paint a clasei Applet:
public void paint(Graphics g){ //cod pentru desenat }

- parametrul g este o instan a clasei Graphics care este creata i transmis lui paint() de ctre browser. Obiectul Graphics g reprezint contextul grafic al applet-ului. Trebuie importat clasa Graphics din pachetul java.awt. - paint() va fi apelat automat de ctre browser cnd se deseneaz n applet. Cnd acelai applet trebuie s fie redesenat (de exemplu cnd am schimbat culoarea fundalului cu setBackground()), se utilizeaz repaint(). - tehnica de desenare i gestiune a textului n Java2D se bazeaz pe utilizarea unei subclase a lui Graphics: Graphics2D. Pentru a crea un Graphics2D se procedeaz astfel:

Luca Dan Serbanati-Programare orientata spre obiect

public void paint(Graphics g){ Graphics2D g2D = (Graphics2D) g; }

Un applet care deseneaz


import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class Dreptunghiuri extends Applet{ public void paint(Graphics g) { g.drawRect (10, 15, 20, 30); g.translate(20, 35); g.setColor(new Color(0, 0, 255)); g.fillRect (10, 15, 40, 65); } }

Graphics Graphics = Clas abstract, baz pentru toate contextele grafice care aparin unei aplicaii de desenat. Informaiile de stare necesare pentru desenarea n Java sunt: - obiectul Component pe care se deseneaz (un applet, de exemplu). - coordonatele originii translatrii pentru desenat i pentru operaia de clipping. - clip-ul curent. - culoare curent. - font-ul curent. - funcia logic curent a operaiei n pixeli (XOR sau Paint). Unde utilizm obiecte Graphics? Sunt necesare ca argumente n metodele care vizualizeaz sau afieaz componente grafice: paint(), paintAll(), print(), printAll(), paintComponents(), printComponents() i update(). Cine furnizeaz obiecte Graphics? Obiectele Graphics sunt ntoarse de metodele getGraphics() existente n clasele Component, Image i PrintJob. Metode ale clasei Graphics Metoda
dispose() getClip() getClipBounds() setClip(int, int, int, int)

getColor() setColor(Color) getFont() setFont(Font) getFontMetrics() getFontMetrics(Font) translate(int, int)

draw3DRect(int, int, int, boolean) drawArc(int, int, int, int, int, int) drawImage(Image, int, int, Color, ImgObs) drawLine(int, int, int, int)

Semnificaie Elimin contextul grafic. ntoarce aria de lucru curent. Intoarce dreptunghiul circumscris ariei de lucru. Seteaz clip-ul curent dreptunghiul specificat cu coordonatele date ca parametri actuali ai metodei. ntoarce culoarea curent. Seteaz culoarea curent ca fiind culoarea specificat. ntoarce font-ul curent. Seteaz font-ul contextului curent ca fiind fontul specificat. ntoarce dimensiunile tipului curent de font. ntoarce dimensiunilr tipului de font specificat. Pune originea contextului grafic n punctul (x, y) al sistemului curent de coordonate. int, Deseneaz un dreptunghi n 3-D. Deseneaz un arc nscris n dreptunghiul specificat. Deseneaz atta ct din imagine specificat este disponibil. Deseneaz o linie ntre dou puncte ale sistemului de coordonate al contextului grafic.

Luca Dan Serbanati-Programare orientata spre obiect

Metoda
drawOval(int, int, int, int) drawPolygon(int[], int[], int) drawPolyline(int[], int[], int) drawRect(int, int, int, int) drawRoundRect(int, int, int, int, int) drawString(String, int, int) fill3DRect(int, int, int, boolean) fillArc(int, int, int, int, int) fillOval(int, int, int, int) fillPolygon(int[], int[], int) fillRect(int, int, int, int) fillRoundRect(int, int, int) int, int, int,

int,

int, int,

Semnificaie Traseaz o elips n interiorul dreptunghiului specificat. Traseaz un poligon definit de doua arry-uri de puncte x i y. Traseaz o secven de linii conexe specificate de array-ul de coordonate x Traseaz dreptunghiul specificat. Traseaz un dreptunghi cu colurile rotunjite specificate. Deseneaz irul specificat cu culoarea contextului grafic curent. Coloreaz interiorul dreptunghiului 3D cu culoarea curent. Riempie un arco contenuto nel rettangolo specificato con il colore corrente. Umple cu culoarea curent o elips continut n dreptunghiul specificat. Umple cu culoarea curent un poligon definit de dou array-uri de coordonate x i y. Umple dreptunghiul specificat cu culoarea curent. Umple dreptunghiul cu coluri rotunde specificat cu culoarea curent.

Color Color este o clas care reprezint o culoare. Culorile pot fi construite cu constructori ca:
Color Color Color Color (xxx (xxx (int (int r, xxx g, xxx b) r, xxx g, xxx b, xxx alpha) rgb) rgb, boolean hasAlpha) Color.blue, xxx=int sau float

Clasa Color conine cmpuri constante iniializate cu culori fundamentale:


Color.red, Color.yellow, Color.magenta etc Color.cyan, Color.white, Color.green,

Font
static Font getFont(String nm) static Font getFont(String nm, Font f) String getName() int getSize() int getStyle() boolean isBold() boolean isItalic() boolean isPlain() static final int BOLD=1; static final int ITALIC=2; static final int PLAIN=0; Stilurile de font n JDK 1.2 sunt: Dialog, SansSerif, Serif, Monospaced, Helvetica, TimesRoman, DialogInput i ZapfDingbats.

Dimensiunile sunt specificate n puncte tipografice (1/72):


Font (String nume, int stil, int dim) Font f=new Font(SansSerif,Font.BOLD,12);

Se poate impune unui context grafic un font nou astfel:


void Graphics.setFont(Font f)

FontMetrics

Luca Dan Serbanati-Programare orientata spre obiect

FontMetrics Component.getFontMetrics(Font) FontMetrics Graphics.getFontMetrics() FontMetrics Graphics.getFontMetrics(Font) FontMetrics Toolkit.getFontMetrics(Font) int charsWidth(char data[],int off,int len) int bytesWidth(byte data[],int off,int len) int charWidth(char ch) int charWidth(int ch) int getAscent() getDescent() getLeading() getHeight() getMaxAscent() getMaxDescent() int stringWidth(String s)

Cum se determin lungimea unui ir pe ecran?


Font f=new Font(SansSerif, Font.BOLD+Font.ITALIC, 12); FontMetrics fm=g.getFontMetrics(f); cx=fm.stringWidth(Un ir lung de 31 de caractere.);

Programarea cu obiecte Font Problema. Cum s scriem textul: Acesta este un program pentru testarea font-urilor poziionat n mijlocul unui frame utiliznd dou font-uri diferite.
public class TestFont2 extends public void paint(Graphics g) { Frame{ setFonts(g); private Font f; String s1 = "Questo "; private Font fi; String s2 = "un programma per"; private FontMetrics fm; String s3 = " il test dei font."; private FontMetrics fim; int w1 = fm.stringWidth(s1); private boolean fontsSet = false; int w2 = fim.stringWidth(s2); public void setFonts(Graphics g){ int w3 = fm.stringWidth(s3); if (fontsSet) return; Dimension d = getSize(); f=new Font("SansSerif",Font.BOLD, Insets in = getInsets(); 14); int clientWidth=d.width-in.right-in.left; fi=new Font("SansSerif",Font.BOLD int clientHeight =d.height-in.bottom+ Font.ITALIC,14); in.top; fm=g.getFontMetrics(f); int cx=(clientWidth-w1-w2-w3)/2 + in.left; fim=g getFontMetri s(fi); int cy=clientHeight/2+in.top; g.drawRect(in.left,in.top,clientWidth-1, clientHeight1); g.setFont(f); g.drawString(s1, cx, cy); cx += w1; g.setFont(fi); g.drawString(s2, cx, cy); cx += w2; g.setFont(f); g.drawString(s3, cx, cy); } publi stati void main(String args[]){

Lucrul cu data/ora Calendar (n java.util)

Luca Dan Serbanati-Programare orientata spre obiect

public static Calendar getInstance() public final int get(int field) public final void set(int field, int value) public final void set(int year, int month, int date) public final void set(int year, int month, int date, int hour, int minute) public String toString() public final Date getTime()//Date este deprecated pentru marea majoritate a metodelor public final void setTime(Date date) field{Calendar.MONTH, Calendar.DAY_OF_MONTH MONTH, Calendar.WEEK_OF_MONTH, Calendar.DAY_OF_WEEK,Calendar.DAY_OF_WEEK_IN_MONTH,Calendar.YEAR, Calendar.JULY, Calendar.MONDAY, Calendar.HOUR, Calendar.MINUTE etc.}

GregorianCalendar (n java.util, extinde Calendar i este calendarul standard)


public GregorianCalendar( int year, int month, int date) public GregorianCalendar( int year, int month, int date, int hour,int minute, int second)

Exemplu:
Calendar calendar = new GregorianCalendar(); Date testTime = new Date(); calendar.setTime(testTime); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));

Applet pentru ora exact


import java.awt.*; import java.util.*; public class Ceas extends javax.swing.JApplet { private Color beige=new Color(255, 204, 102); private String oraPrec=; public void init() { setBackground(Color.black); } public void paint(Graphics g) { Graphics2D g2D = (Graphics2D) g; Font tip=new Font (Monospaced, Font.BOLD, 20); g2D.setFont(tip); GregorianCalendar azi=new GregorianCalendar(); String ora=azi.getTime().toString(); g2D.setColor(Color.black); g2D.drawString(oraPrec, 5, 25); g2D.setColor(beige); g2D.drawString(ora, 5, 25); try {Thread.sleep(1000); }catch(InterruptedException e){ } oraPrec = ora; repaint(); } }

Applet pentru ora exact cu parametri


import java.awt.*; import java.util.*; public class CeasNou extends javax.swing.JApplet { private Color beige = new Color(255, 204, 102); <html> private String oraPrec = ; <applet code="CeasNou" width=350 Color culoareFond; height=50> public void init() { <param name="fond" value="#996633"> </applet> String in=getParameter(fond); culoareFond=Color.black; /h l if (in != null) { try{

Luca Dan Serbanati-Programare orientata spre obiect

culoareFond=Color.decode(in); }catch(NumberFormatException e) {showStatus(Parametru eronat + in);} } setBackground(Color.black); } public void paint(Graphics g) { Graphics2D g2D=(Graphics2D) g; Font tip=new Font(Monospaced, Font.BOLD, 20); g2D.setFont(tip); GregorianCalendar azi=new GregorianCalendar(); String ora=azi.getTime().toString(); g2D.setColor(culoareFond); g2D.drawString(oraPrec, 5, 25); g2D.setColor(beige); g2D.drawString(ora, 5, 25); try {Thread.sleep(1000); }catch(InterruptedException e) {} oraPrec=ora; repaint(); } }

Plug-In Plug-In Java = Un interpretor (la nceput s-a numit Java Activator) care poate executa applet-ul n browser-ul Web n locul interpretorului integrat. A fost adugat cu ultima versiune a limbajului Java. Dou condiii pentru a putea utiliza Plug-in: - utilizatorul trebuie s instaleze Plug-In-ul; - pagina ce conine applet-ul trebuie s conin codul HTML care indic Plug-In-ul care va executa applet-ul. n cod trebuie s se in cont de diferenele dintre Netscape Navigator i Microsoft Explorer. Sun ofer o aplicaie Java HTMLConverter care convertete o pagin Web existent n modul n care toate applet-urile sale pot fi executate de Plug-In. HTMLCONVERTER este disponibil ca fiier .zip mpreun cu Plug-IN n site-ul java.sun.com. La instalare va fi creat un director Converter n C:\jdk1.x.x. Cu HTMLCONVERTER instalat se adaug calea C:\jdk1.x.x\converter n variabila CLASSPATH i pagina HTML se convertete astfel: java HTMLConverter TestCeas.html Pagina TestCeas.html va fi modificat pentru a putea fi executat de ctre Plug-In. HTMLConverter n aciune <OBJECT CLASSID=clasid:8AD9C840-044E-11D1-B3E9-00805F499D93 HEIGHT=50 WIDTH=350 CODEBASE=http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0> <PARAM NAME=CODE VALUE=Ceas.class> <PARAM NAME=type VALUE=application/x-java-applet;version=1.3> <PARAM NAME=scriptable VALUE=false> <PARAM NAME=fond VALUE=#996633> <COMMENT> <EMBED TYPE=application/x-java-applet;version=1.3 CODE=Ceas.class WIDTH=350 HEIGHT=50 fond=#996633 scriptable=false
pluginspace=http://java.sun.com/products/plugin/1.3/jinstall.html> </COMMENT> <NOEMBED> Acest program cere un browser pentru Java <NOEMBED> </OBJECT> <!-<APPLET CODE=CeasNou.class HEIGHT=50 WIDTH=350> <PARAM NAME = fond VALUE = #996633> Acest program cere un browser pentru Java </APPLET>

Luca Dan Serbanati-Programare orientata spre obiect

. . .

Luca Dan Serbanati-Programare orientata spre obiect

8 INTERFEE GRAFICE N JAVA


AWT-Abstract Window Toolkit Serie complet de componente ale interfeei grafice utilizator (GUI) Suport pntru container-e de componente grafice. Fiecare component are ciclul su de via, independent de al altora. Un mecanism de evenimente care gestioneaz evenimentele sistemului i evenimentele utilizatorului. Mecanisme pentru aranjare a componentelor ntr-un mod care permite obinerea unui GUI independent de platform. Gestioneaz ferestrele, menu-urile i ferestrele de dialog. Grafica - Deseneaz figuri n 2D - Controleaz culorile - Controleaz font-urile Java 2D API - Posibilitatea de grafic mai laborioas - Deseneaz figuri n 2D personalizate - Umple figurile cu culori i modele Container-e Ideea fundamental: O fereastr Java este un container care conine o colecie de componente ncuibate. Container-ele sunt gestori ai componentelor coninute. Ierarhia de container-e pot avea orice nivel de complexitate. Frame = Fereastra de nivel cel mai nalt ntr-o aplicaie. Applet = Container de componente grafice care poate fi executat de un browser. Ierarhia claselor AWT
Object Component

Canvas Container

List Button

TextComponent

CheckBox ScrollBar

Label

Choice

Panel

Window

TextField

TextArea

Applet Frame

Dialog FileDialog

java.awt.Component java.awt.Component = Clas abstract care generalizeaz toate componentele AWT, exceptnd menu-urile. Unei componente i se asociaz urmtoarele elemente: - un obiect Graphics - localizare - dimensiune - un peer nativ - un container printe - font i dimensiunile font-ului (font metrics) - culori pentru foreground i background - specific lingvistic

Luca Dan Serbanati-Programare orientata spre obiect

dimensiuni maxime i minime

ComponentContainer WindowFrame
java.awt.Component boolean isVisible() <<Interface>> void setVisible(boolean b) ImageObserver boolean isShowing() boolean isEnabled() void setEnabled(boolean b) Font getFont() void setFont(Font f) Font Point getLocation() void setLocation(int x, int 1 y) void setLocation(Point p) +fg, bg Color 2 Point getLocationOnScreen() Graphics getGraphics() void setBackground(Color c) Graphics 1 void setForeground(Color c) Dimension getSize() * void setSize(int w, int h) void setSize(Dimension d) java.awt.Container Component add(Component c) Component add(String name, Component c) Component getComponentAt(int x, int y) Component Window getComponentAt(Point p) Component[] getComponents() LayoutManager getLayout() void setLayout(LayoutManager mgr) Frame Insets getInsets() void paint(Graphics g) void print(Graphics g) java.awt.Window void toFront() void toBack() Toolkit getToolkit() void show() java.awt.Frame void setResizable(boolean b) void setTitle(String s)

<<Interface>> MenuContainer

<<Interface> Serializable

Component vizible : boolean enabled : boolean valid : boolean x : int y : int width : int height : int +peer ComponentPeer

+parinte Container 1 <<Interface>> LayoutManager +panelLayout

Panel

FlowLayout

Applet

Adugarea componentelor grafice


import java.applet.Applet; import java.awt.*;// importa toate clasele AWT public class Primul extends Applet { TextField text;//declara campul de text ca TextField Button buton1, buton2;//declara doua Button public void init(){ text = new TextField(20);//creaza un TextField add(text);//adauga TextField-ul la

Luca Dan Serbanati-Programare orientata spre obiect

fereastra buton1=new Button ("Apasa");//creaza un Button add(buton1);//adauga Button-ul la fereastra buton2=new Button("Cancel"); //creaza un Button add(buton2); //adauga Button-ul la fereastra } } import java.applet.Applet; import java.awt.*; public class Container extends Applet{ //declaratii/alocari de componente public void init() { //declaratii/alocari de componente //adaugarea componentelor in applet } import java.applet.Applet; import java.awt.*; public class Container1 extends Applet{ TextField text1; TextField text2; public void init() { text1=new TextField(20); add(text1); text2=new TextField(Buna,10); add(text2); } } import java.applet.Applet; import java.awt.*; public class Container2 extends Applet{ TextArea tArea; O arie de text public void init() { tArea=new TextArea(10,20); add(tArea); } import java.applet.Applet; import java.awt.*; public class Contenitore3 extends Applet{ un grup de CheckboxGroup cBG=new butoane CheckboxGroup(); Checkbox c1, c2: public void init() { c1=new Checkbox(Primul,cBG, true); add(c1); c2=new Checkbox(AlDoilea); c2.setCheckboxGroup(cBG); c2.setState(false);

TextArea, TextField i Checkbox List, Label, Scrollbar i Canvas


import java.applet.Applet; import java.awt.*; public class Container4 extends Applet{ Lista List list1; public void init(){ list1=new List(2, true); list1.addItem(Rosu); list1.addItem(Verde); list1.addItem(Albastru); add(list1); } } import java.applet.Applet; import java.awt.*; public class Container6 extends Applet{ Label etic=new Label(Nume si Prenume); Etichet text1=new TextField(Ion Pop,20); public void init(){ add(etic); add(text1); } import java.applet.Applet; import java.awt.*; public class Container5 extends Applet { Scrollbar hSB, vSB; Bare de defilare public void init(){ vertical i orizontal hSB=new Scrollbar(Scrollbar.HORIZONTAL,0,1, 1,100); add(hSB); vSB=new Scrollbar(Scrollbar.VERTICAL,0,1,1, import java.applet.Applet; import java.awt.*; public class Container7 extends Applet{ Canvas c; Canvas public void init() { c=new Canvas(); c.resize(40,40); c.setBackground(Color.black); add(c); } }

Grafica cu LayoutManager Layout Manager = Interfa utilizat pentru asezarea diferitelor componente ntr-un container dup un ablon de aranjare. LayoutManager2 extinde LayoutManager i este folosit pentru asocierea de constrngeri aezrii componentelor.

setLayout(new FlowLayout());
AppletViewer: GestoreLayout Applet

setLayout(new BorderLayout());
AppletViewer: GestoreLayout Applet

setLayout(new GridLayout(3,2));
AppletViewer: GestoreLayout Applet

Luca Dan Serbanati-Programare orientata spre obiect

North Center South E a s t

W e s t

Clasa GridBagLayout este un gestor flexibil care aliniaz componentele pe vertical i orizontal, fr s fie nevoie ca componetele s aib aceleai dimensiuni. Fiecare obiect GridBagLayout pstreaz o gril dreptunghiular dinamic de celule n care fiecare component ocup una sau mai multe celule, care formeaz aria de vizualizare a componentei.

CardLayout aeaz componentele (de obicei paneluri) n straturi, precum crile ntr-un pachet de crti. n orice moment, este vizibil numai o component, dar componentele pot fi rsfoite i s controlm care din ele s devin vizibil. Acest layout este util cn o aceeai suprafa trebuie partajat de mai multe paneluri care trebuie s fie vizualizate n momente diferite de timp.

Cele mai folosite clase de gestori de layout care implementeaz interfaa LayoutManager sunt: FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout. Exerciii cu applet 1. S se deseneze int ntr-un applet: o serie de cercuri concentrice, alternnd alb i negru, sau alte culori. 2. S se scrie un program grafic pentru desenarea cadranului unui ceas, care afieaz ora inserat de utilizator ntr-un cmp de text (utilizatorul trebuie s introduc ora n format hh:mm). 3. S se scrie un applet grafic care vizualizeaz o tabl de ah cu 64 de ptrate, alternativ albe i negre.

Luca Dan Serbanati-Programare orientata spre obiect

9 INTERFEE
Conceptul de interfa Probleme. 1. S se ordoneze conturile de economii dup dobnda pentru a decide care dintre ele este mai bun n care se gsete o sum de bani disponbila. 2. S se ordoneze angajaii unei ntreprinderi dup salariu pentru a putea face o statistic ce privete taxele de pltit. Dou soluii: 1. ContEconomii sau Angajat au obiecte care nu sunt comparabile. Ordonarea se poate face n mod personalizat, pentru fiecare clas. 2. Cele dou clase implementeaz interfaa Comparable care are o metod compareTo(Object) i implementeaz n mod personalizat metoda:
public class ContEconomii implements Comparable { . . . . public in compareTo(Object o) { return (this.dobanda > o.dobanda)?1:(this.dobanda < o.dobanda)?-1:0; } }

Atunci, se poate scrie simplu: if(cont122.compareTo(cont304)>0) then . . . Interfee n Java Interfa = List de metode publice i abstracte. O interfa este o colecie de comportamente abstracte care pot fi implementate de o clas pentru adugarea unui comportament care nu este furnizat de superclas. Interfeele reprezint, ca i clasele, tipuri de date, numai c aceste tipuri, n loc s prezinte date+servicii, prezint numai servicii. Interfaa n Java este o entitate distinct de clase i array-uri. O interfa poate conine i membri-date constante. O interfa poate moteni de la o alt interfa. Interfeele n Java trebuie s fie declarate. Declaraia unei interfee:
[Modificator] interface Identificator [extends NumeInterfata...] { Tip Identificator= . . . // date-membru [Modificator] SemnaturaMetoda; . . . // metode abstracte } Exemplu. public interface Comparable {public int compareTo (Comparable b);}

Pentru fiecare declaraie de interfa compilatorul creaz un fiier .class. Implementarea unei interfee O clas care decide s implementeze o interfa trebuie s declare acest lucru n definiie. Sintaxa:
class Identificator implements NumeInterfata,...{ CorpClasa }

O clas care dorete s implementeze o interfa, trebuie s implementeze toate metodele interfeei. Exemplu
public class Angajat implements Comparable { . . . . public int compareTo(Comparable b) { return (int)(getSalariu() ((Angajat)b).getSalariu()); } . . . . }

O clas poate implementa mai multe interfee. O interfa poate fi implementat de mai multe clase. Variabile-interfa Intr-un program se pot declara variabile de tip interfa: Comparable s;

Luca Dan Serbanati-Programare orientata spre obiect

O variabil interfa poate memora referina la o instan a oricrei clase care implementeaz acea interfa, la fel cum face i o variabil a unei clase.
s = new Angajat(. . . ); Angajat d = new Angajat(. . .);

O variabil interfa poate participa n calcule la fel ca orice variabil referin.


if (s.compareTo(d) < 0) . . .

Variabilele interfa sunt n special utilizate ca parametri n metode pentru a permite upcasting al obiectelor ce provin din clase diferite ntre ele.
if (s.compareTo(d) < 0) . . //Angajat promovat ca tip Sortable

O variabil interfa poate fi accesat numai cu metodele interfeei.


String nume = s.getNume(); // Eroare!!

Cum utilizm interfeele 1. Utilizai o interfa pentru a separa un comportament care este implementat n orice clasefurnizor ale claselor client care le utilizeaz. 2. Utilizai interfeele ca parametri ai metodelor. n acest caz: 2.1. n interiorul unei astfel de metode putem invoca orice metod a interfeei; 2.2. la execuie, se poate transmite ca argument orice obiect al unei clase care implementeaz interfaa 2.3. la invocarea unei metode pentru acel obiect determin executarea unei implementri particulare a metodei ce aparine clasei obiectului; 2.4. transmind unui alt apel un obiect al unei alte clase care implementeaz interfaa se detrmin o execuie care poate fi complet diferit de prima. Interfee Java standard Interfaa Cloneable trebuie s fie implementat de toate clasele care se cloneaz.
protected native Object clone() //clone restituie un Object generic throws CloneNotSupportedException; . . . . . . Vector v = new Vector(); Vector v2; //Pentru a-l putea utiliza, rezultatul v2 = (Vector) v.clone(); // va fi convertit la tipul dorit

Interfaa Serializable nu are metode:


package java.io; public interface Serializable {};

Motenirea multipl vs. interfee


import java.util.*; interface Alergator{ void alearga(); } interface Inotator{ void inoata(); } interface Biciclist{ void pedaleaza(); } class Dinamic{ public void alearga() {} } class Sportiv extends Dinamic implements Alergator, Inotator, Biciclist{ public void inoata(){} public void pedaleaza(){} Alergator Inotator Biciclist } Dinamic public class ViataSanatoasa{ static void c(Alergator x) { x.alearga(); } static void n(Inotator x) { x.inoata(); } static void v(Biciclist x) { x.pedaleaza(); } ViataSanatoasa Sportiv static void d(Dinamic x){ x.alearga();} public static void main(String[] args) { Sportiv i = new Sportiv(); c(i); // Sportiv considerat ca Alergator n(i); // Sportiv considerat ca Inotator

Luca Dan Serbanati-Programare orientata spre obiect

v(i); // Sportiv considerat ca Biciclist d(i); // Sportiv considerat ca Dinamic } }

Exerciiu.Adugai la aplicaia cu angajaii posibilitatea de a ordona i vizualiza angajaii dup salariu. Paii exerciiului sunt: 1. Definii o interfa Comparare cu o metod compareTo(Object). ?? 2. Utilizai metoda compareTo pentru a implementa ntr-o metod sort(Comparable []) algoritmul de ordonare. 3. n clasa TestAngajat utilizaia metoda sort pentru a ordona un array de angajai dup salariu. 4. Vizualizai cu o metod printAll(Angajat[]) angajaii n ordinea salariului. Fiecare angajat va fi afiat cu prenume, nume i salariu.

Luca Dan Serbanati-Programare orientata spre obiect

10 GESTIUNEA EVENIMENTELOR
Modelul evenimentelor Trei protagoniti: Surs de evenimente - surs de evenimente= orice component grafic; - eveniment=obiect lansat de o surs de evenimente; Eveniment - asculttor (listener)= obiect care implementeaz un gestor de evenimente (event handler - EH). Clasa trebuie s implementeze o interfa de tip Listener. Asculttor n programele care utilizeaz evenimente, sunt obligatorii trei seciuni de cod: - clasa asculttoare declar c implementeaz o interfa Listener:
public class clasaMea implements ActionListener {

- asculttorul de un anumit tip de evenimente se nregistreaz la surs. Codul se gsete de obicei ntr-o metod a unei instane a lui EH (deseori n constructor) sau ntr-o metod a unui alt obiect:
oComponenta.addActionListener(instantaClasaMea);

- asculttorul implementeaz metodele interfeei de ascultare. Cu aceste metode asculttorul va fi anunat de verificarea unui eveniment:
public void actionPerformed(ActionEvent e) { . . . }

Un exemplu simplu
import java.applet.Applet; import java.awt.*; // import toate clasele AWT import java.awt.event.*; public class AlDoilea extends Applet implements ActionListener { TextField text; //declar un cmp de text ca TextField Button buton1, buton2; //declar dou Button public void init(){ text = new TextField(20); //creaz un TextField add(text); //adaug la fereastr TextField-ul buton1 = new Button (Bine ati venit"); //creaz un Button add(buton1); //adaug la fereastr Button-ul buton1.addActionListener(this); // nregistrarea asculttorului!! buton2 = new Button (La revedere"); //creaz un Button add(buton2); //adaug la fereastr Button-ul buton2.addActionListener(this); // nregistrarea asculttorului!! } public void actionPerformed (ActionEvent evt) { //elaborarea evenimentului String arg = evt.getActionCommand(); String msg1 = Buna!, msg2 = Adio!; instanceof if (evt.getSource() Button){ if (arg.equals(Bine ati venit)) text.setText(msg1); else text.setText(msg2); } } }

Luca Dan Serbanati-Programare orientata spre obiect

Arborele claselor de evenimente standard


Evenimente de nivel jos Evenimente semantice

FocusEvent AWTEvent ComponentEvent InputEvent WindowEvent ContainerEvent PaintEvent

KeyEvent MouseEvent AWTEvent ActionEvent AdjustmentEvent ItemEvent TextEvent

Evenimente de nivel jos = rezultate din modificarea componentelor: - Evenimente ale componentelor raporteaz modificarea poziiilor, dimensiunilor i a vizibilitii componentelor; - Evenimente ale container-elor informeaz de adugarea sau eliminarea unui element dintrun container; - Evenimente ale focusului cnd o component primete sau pierde focusul de la tastatura; - Evenimente ale ferestrelor prezint starea fiecrui tip de fereastr. Evenimente semantice = rezultate de interaciunea utilizatorului cu componenta. - un utilizator face un clic asupra unui buton: ActionEvent; - un utilizator modific valoarea dintr-o bar de defilare: AdjustmentEvent; - un utilizator selecteaz un element dintr-un grup de elemente (dintr-o list): ItemEvent; - un utilizator modific textul dintr-o caset de text sau dintr-o arie de text.

Luca Dan Serbanati-Programare orientata spre obiect

Evenimente generate de componentele AWT Component Tipuri de evenimente generate AWT actio adjustme compone containe n nt nt r Button X X Canvas X Ceckbox X CeckboxMenuIte m Not: Nu este o subclas a lui Component Choice X Component X Container X X Dialog X X Frame X X Label X List X X MenuItem X Not: Nu este o subclas a lui Component Panel X X Scrollbar X X ScrollPane X X TextArea X TextComponent X TextField X X Window X X

focu s X X X

item

key X X X

X X

mous e X X X

mouse motion X X X

text

window

X X X X X X X

X X X X X X X

X X X X X X X

X X X X X X X

X X

X X X X X X X

X X X X X X X

X X X X X X X

X X X X X X X

X X X X

73

Luca Dan Serbanati-Programare orientata spre obiect

Interfee de ascultare i adaptori Interfa Listener ActionListener AdjustmentListener ComponentListener

Clas adapter nu exist nu exist ComponentAdapter

ContainerListener FocusListener ItemListener KeyListener MouseListener

ContainerAdapter FocusAdapter nu exist KeyAdapter MouseAdapter

Metode actionPerformed adjustmentValueChanged componentHidden componentMoved componenResized componentShown componentAdded componentRemoved focusGained focusLost itemStateChanged keyPressed keyReleased keyTyped mouseClicked mouseEntered mouseExited mousePressed mouseReleased mouseDragged mouseMoved textValueChanged windowActivated windowClosed windowClosing windowDeactivated windowDeiconified windowIconified windowOpened

Evenimente generate de: Button, List, MenuItem, TextField Scrollbar Component

Container Component Checkbox, Choice, List Component Component CheckboxMenuItem,

MouseMotionListener TextListener WindowListener

MouseMotionAdapter nu exist WindowAdapter

Component TextComponent Window

74

Luca Dan Serbanati-Programare orientata spre obiect

Cum crem un Frame care se nchide


import java.awt.*; Interfaa WindowListener import java.awt.event.*; public class FereastraCareSeInchide extends Frame public void windowClosed(WindowEvent e) ; implements WindowListener { public void windowIconified(WindowEvent e); public CloseableFrame() { public void windowOpened(WindowEvent e); setSize(300, 200); public void windowClosing(WindowEvent e); addWindowListener(this); public void windowDeiconified(WindowEvent e); } public void windowActivated(WindowEvent e); public void windowDeactivated(WindowEvent e); public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e){} public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { System.exit(0); Frame WindowListener } public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} FereastraCareSeInchide public static void main(String[] args) { Frame f = new FereastraCareSeInchide(); f.show(); } }

Gestiunea evenimentelor mouse-ului Un obiect MouseEvent poate executa 5 metode ale interfeei MouseListener. - dac evenimentul este de tip MOUSE_PRESSED, va fi apelat: mousePressed() - dac evenimentul este de tip MOUSE_RELEASED, va fi apelat: mouseReleased() - dac evenimentul este de tip MOUSE_CLICKED, va fi apelat: mouseClicked() - dac evenimentul este de tip MOUSE_ENTERED, va fi apelat: mouseEntered() - dac evenimentul este de tip MOUSE_EXITED, va fi apelat: mouseExited() Cnd utilizatorul face un clic cu mouse-ul, Java apeleaz metoda mouseClicked al obiectului asculttor. Utiliznd metodele getX() i getY() pe argumentul MouseEvent, se pot obine coordonatele x i y ale cursor-ului mouse-ului. Pentru a diferenia ntre un singur clic i dublu clic se utilizeaz getClickCount(). Dac se dorete testarea strii tastelor SHIFT, CONTROL etc. se pot utiliza metodele: isShiftDown(), isControlDown(), isAltDown() care funcioneaz pentru InputEvent. Ierarhia evenimentelor mouse-ului

75

Luca Dan Serbanati-Programare orientata spre obiect

java.lang.Object | +-java.util.EventObject(getSource()) | +-java.awt.AWTEvent | +-java.awt.event.ComponentEvent(getComponent()) | +-java.awt.event.InputEvent(getModifiers()) | +-java.awt.event.MouseEvent(getClickCount(), getX(), getY(), getPoint())

Clase anonime i adaptori Interfaa WindowListener are 7 metode care trebuie s fie implementate toate n clasa-asculttor:
void void void void windowActivated(WindowEvent) void windowDeiconified(WindowEvent) windowClosed(WindowEvent) void windowIconified(WindowEvent) windowClosing(WindowEvent) void windowOpened(WindowEvent) windowDeactivated(WindowEvent)

Se poate nregistra ca asculttor un obiect al oricrei clase care implementeaz interfaa WindowListener :
void addWindowListener(WindowListener)

Obiectul poate fi creat exclusiv pentru acest rol:


addWindowListener (new ClasseListener());

Orice interfa xxxxListener cu mai multe metode are o clas xxxxAdapter care introduce o implementare vid pentru metodele interfeei. Obiectul asculttor poate fi al unei subclase a adaptorului care redefinete numai metodele necesare. n practic se utilizeaz o clas intern anonim care este definit ca subclas a asculttorului.
addWindowListener(new WindowAdapter() { public void metodaRedefinit(WindowEvent e) { . . . . } });

Cum implementm gestori de evenimente


/* P1. Este necesar numai un clic de //P3. Utilizm clase interne ca adaptori mouse, dar trebuie s implementm public class ClasaMea extends Applet { toate metodele */ ... public class ClasaMea implements unObiect.addMouseListener(new AdapterMeu()); MouseListener{ ... ... unObiect.addMouseListener(this); class AdapterMeu extends MouseAdapter { ... public void mouseClicked(MouseEvent e) { /* Definiie vid. */ //Se insereaz cine este gestorul public void mousePressed(MouseEvent //evenimentelor e){} } /* Definiie vid. */ } public void mouseReleased(MouseEvent } e){} // P4.Utilizm clase interne anonime /* Definiie vid.*/ public class ClasaMea extends Applet { public void mouseEntered(MouseEvent ... e){} unObiect.addMouseListener(new /* Definiie vid.*/ MouseAdapter() public void mouseExited(MouseEvent { e){} public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent //Se insereaz cine este gestorul e){ //evenimentelor .../*Se insereaz cine este gestorul 76 } }); //Va fi creat o clas anonim!!! evenimentelor */ ... } } }

Luca Dan Serbanati-Programare orientata spre obiect

Frame care se nchide cu adaptori


import java.awt.*; import java.awt.event.*; public class FereastraCareSeInchide extends Frame{ public FereastraCareSeInchide() { WindowCloser wc = new WindowCloser(); addWindowListener(wc); setSize(300, 200); setTitle(getClass().getName()); } public static void main(String[] args){ Frame f = new FereastraCareSeInchide(); f.show(); } } class WindowCloser extends WindowAdapter( void windowClosing(WindowEvent e) { System.exit(0); } }

Utilizarea claselor interne anonime


import java.awt.*; import java.awt.event.*; public class FereastraCareSeInchide extends Frame{ public FereastraCareSeInchide () { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }}); setSize(300, 200); setTitle(getClass().getName()); } public static void main(String[] args){ Frame f = new FereastraCareSeInchide(); f.show(); } }

77

Luca Dan Serbanati-Programare orientata spre obiect

Menu
MenuComponent
fileMenu.add(fileNew); fileMenu.add(fileOpen); fileSave.setEnabled(false); fileMenu.add(fileSave); fileMenu.addSeparator(); fileMenu.add(fileExit); editUndo.setEnabled(false); editMenu.add(editUndo); editMenu.addSeparator(); editCut.setEnabled(false); editMenu.add(editCut); editCopy.setEnabled(false); editMenu.add(editCopy); editPaste.setEnabled(false); editMenu.add(editPaste); helpMenu.add(helpContents); helpMenu.addSeparator(); helpMenu.add(helpAbout); menubar.add(fileMenu); menubar.add(editMenu); menubar.add(helpMenu); menubar.setHelpMenu(helpMenu); setMenuBar(menubar); setSize(new Dimension(400,300)); show(); } public static void main(String[] args) {

MenuBar

MenuItem

CheckboxMenuItem Menu PopupMenu


import java.awt.*; public class MenuFrame extends Frame { MenuItem fileNew=new MenuItem(Nou); MenuItem fileOpen=new MenuItem(Deschide); MenuItem fileSave=new MenuItem(Salveaza); MenuItem fileExit=new MenuItem(Iesire); MenuItem editUndo=new MenuItem(Cancel); MenuItem editCut=new MenuItem(Cut); MenuItem editCopy=new MenuItem(Copy); MenuItem editPaste=new MenuItem(Paste); MenuItem helpContents=new MenuItem(Rezumat); MenuItem helpAbout new

Exerciii cu GUI i evenimente 1. S se scrie un applet grafic care cere utilizatorului s insereze un numr n i apoi afieaz n cercuri cu raza i centru la alegere. 2. S se scrie o aplicaie cu trei butoate cu eticheta Rou, Verde i Albastru, care schimb n rou, verde sau albastru culoarea fundalului unui panel din centrul ferestrei principale.

Exerciii 1. S se scrie o aplicaie cu tre butoane radio etichetate Rou, Verde i Albastru care schimb n rou, verde sau albastru fundalul unui panel aflat n centrul della lastra dei contenuti. 2. S se scrie o aplicaie cu trei cmpuri de text etichetate, unul pentru fiecare import iniial al contului de economii, dobnda anual i numrul de ani. S se adauge un buton calculeaza i un cmp de text pentru vizualizarea rezultatului (i acesta nu se poate modifica), n particular soldul contului de economii dup un numr de ani. 3. Adugai la exerciiul precedent o diagram pe coloane care vizualizeaz soldul la sfritul fiecrui an.

78

Luca Dan Serbanati-Programare orientata spre obiect

11 INPUT/OUTPUT N JAVA
Pachetul java.io Furnizeaz suport pentru citirea i scrierea datelor de la i la dispozitive diferite. Conine 4 categorii de clase: - clase de fluxuri de intrare i clase de citire - clase de fluxuri de ieire i clase de scriere - clase de gestiune a fiierelor - clasa StreamTokenizer 1. Clase de fluxuri de octei: BufferedInputStream, DataInputStream, FileInputStream i StringBufferInputStream. Derivate din clasa abstract InputStream. Clase de citire a caracterelor Unicode: Reader, BufferedReader, FileReader i StringReader sunt derivate din clasa abstract Reader. 2. Clase de fluxuri de ieire: OutputStream, FileOutputStream, BufferedOutputStream, PrintStream i StringBufferOutputStream. Sunt derivate din clasa OutputStream. Clase de scriere a caracterelor n Unicode: Writer, BufferedWriter, FileWriter i PrintWriter. Sunt derivate de clasa abstract Writer. 3. Claselor FileInputStream i FileOutputStream se adaug alte dou clase destinate gestiunii fiierelor: File i RandomAccessFile. 4. Clasa StreamTokenizer permite convertirea unui flux de intrare a datelor ntr-un flux de token-i i conine metode pentru definirea sintaxei token-ilor.

79

Luca Dan Serbanati-Programare orientata spre obiect

Ierarhia claselor I/O


DataInput Serializable Externalizable
InputStream

File FileDescriptor

ObjectInputValidation ObjectInput ObjectOutput

ByteArrayInputStream FileInputStream FilterInputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream

BufferedInputStream DataInputStream LineNumberInputStream

Object
OutputStream Reader

DataOutput Throwable RandomAccessFile


Writer

ByteArrayOutputStream FileOuptputStream FilterOutputStream ObjectOutputStream PipedOutputStream

BufferedReader CharArrayReader InputStreamReader FilterReader PipedReader StringReader BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter PipedWriter PrintWriter StringWriter

LineNumberReader FileReader PushbackReader BufferedOutputStream DataOutputStream PrintStream

FileWriter

FilenameFilter

StreamTokenizer

Exception ObjectInputValidation InvalidClassException InvalidObjectException NotActiveException NotSerializableException OptionalDataException StreamCorruptedException

IOException

ObjectStreamException

EOFException FileNotFoundException InterruptedIOException SyncFailedException UTFDataFormatException CharConversionException UnsupportedEncodingException WriteAbortedException

80

Luca Dan Serbanati-Programare orientata spre obiect

Clasa InputStream InputStream = clas abstract din care deriveaz toate clasele fluxului de intrare. Metode ale clasei InputStream:
abstract int read () throws IOEXception abstract int read(byte b[]) throws IOEXception abstract int read(byte b[], int off, int lun) throws IOEXception long skip(long n) int available() synchronized void mark(int lim) synchronized void reset() boolean markSupported() void close()

Aceeai structur are clasa abstract Reader, specializat n citirea caracterelor. Obiectul System.in = variabil static a clasei System care memoreaz o instan a clasei InputStream. Este setat cu System.setIn(InputStream):
FileInputStream fi = new FileInputStream(input.txt); System.setIn(fi);

Crearea unui flux de date de intrare Crearea unui flux de date de intrare respect modelul pipeline Unix: face parte dintr-o surs de date cu interfaa InputStream i se creaz succesiv cu filtri ai aceleai interfee. Caracteristicile citirii: - este un flux continuu. - cnd nu mai sunt date disponibile, instana clasei se blocheaz n ateptarea ca datele s devin disponibile. Pentru a citi date n Java procedura este ntotdeauna aceeai: 1. Se creaz o instan a unei clase de flux de intrare. 2. Se indic locul n care vor fi scrise datele citite.
FileInputStream BufferedInputStream DataInputStream

byte int File File system (Surs date) Bytes Buffer de bytes Date formatate char float long Memoria

Clase de flux de bytes de intrare 1. DataInputStream (InputStream in): - utilizat pentru citirea datelor primitive (int, char, long etc.); - motenete fie interfaa DataInput, fie clasa abstract FilterInputStream. - are metode furnizate de InputStream, se adaug metodele readxxx() (xxx = Boolean, Byte, Short, UnsignedShort, Char, Int, Long, Float sau Double). 2. BufferedInputStream (InputStream in): - furnizeaz un flux de intrare buffer-izat i atunci citirea este mult mai rapid; - include numai metodele furnizate de InputStream. - are unele cmpuri membru utile: byte buf[], int count, int pos, int markpos i int marklimit. 3. FileInputStream (String nume): - execut operaii de intrare simple aspura fiierelor (pentru operaii mai avansate se utilizeaz RandomAccessFile). - construiete fluxul chiar cu un obiect File sau FileDescriptor. - funcioneaz ca un InputStream, dar opereaz asupra unui fiier. 4. StringBufferInputStream 81

Luca Dan Serbanati-Programare orientata spre obiect

- utilizeaz un ir ca surs buffer-izat de intrare. - funcioneaz ca InputStream. 5. PushBackInputStream (InputStream in) - construiete un flux cu un caracter lookahead. - are o metod unread(int ch). - funcioneaz ca InputStream. Citirea cu clasele InputStream i Reader
import java.io.*; public class FluxDeIntrareIesire{ public static void main(String[] args) { try{ //1. Fisier buffer-izat de intrare BufferedReader in = new BufferedReader( new FileReader(args[0])); String s, s2 = new String(); while((s = in.readLine())!= null) s2 += s + "\n"; in.close(); //2. Intrarea din memorie StringBufferInputStream in2 = new StringBufferInputStream(s2); int c; while((c = in2.read() ) != -1) System.out.print((char)c); //3. Intrarea din memorie formatat try{ DataInputStream in3 = new DataInputStream(new StringBufferInputStream(s2)); while(true) System.out.print((char)in3.readByte()); }catch(EOFException e){System.out.println(Am ajuns la sfarsitul fisierului");} . . . . . }catch (FileNotFoundException e){System.out.println(Fisier inexistent);} }catch (IOException e){System.out.println(Exceptie IO);} }

ConsolaReader
public class ConsolaReader { private BufferedReader reader; public ConsolaReader (InputStream inStr) { reader = new BufferedReader(new InputStreamReader(inStr)); } public string readLine() { String inputLine = ; try { inputLine = reader.readLine(); }catch(IOException e){ System.out.println(e): System.exit(); } return inputLine; } public int readInt() { String inputString = readLine(); int n = Integer.parseInt(inputString); return n; } public double readDouble() { String inputString = readLine(); double x = Double.parseDouble(inputString);

82

Luca Dan Serbanati-Programare orientata spre obiect

return x; }

Clasa OutputStream OutputStream = clas abstract din care deriveaz toate clasele fluxului de ieire. Metode ale clasei OutputStream:
abstract void write (int b) void write (byte b[]) void write (byte b[], int offset, int lungime) void flush() void close()

Clasa Writer specializat n scrierea fluxurilor de caractere are o ierarhie similar cu ierarhia lui OutputStream. Obiectul System.out = variabil static a clasei System care memoreaz o instan a clasei PrintStream. Este setat cu System.setOut(OutputStream):
FileOutputStream fs = new FileOutputStream(log.txt); System.setOut(new printStream(fs));

Clase de fluxuri de ieire Caracteristicile scrierii: - este un flux continuu. - instana clasei de flux trimite date ct timp acestea sunt disponibile. Procedura de scriere a datelor cu o clas de fluxuri de ieire este ntotdeauna aceeai: 1. Se creaz o instan a clasei fluxului de ieire specificnd fluxul final, la destinaie. Instana se poate crea plecnd de la destinaie i compunnd fluxul din obiecte-flux ncuibate, deoarece obiectul obinut are caracteristicile dorite: buffer-izat, n stare s scrie date primitive etc. 2. Se indic locul de unde vor fi luate datele.
byte DataInputStream BufferedInputStream int char float long Memoria Buffer de bytes
FileInputStream

File Byte File system Flux de bytes (Surs date)

Date formatate

Clase de flux de caractere de ieire 1. PrintWriter - deriveaz din Writer - afieaz date-text (iruri sau numere). - metodele sale, altele dect cele furnizate de Write, include: print(tip) i println(tip) unde tip ia una din valorile: Object, String, boolean, char, char[], int, long, float i double.
PrintWriter out= PrintWriter(new FileWriter(personale.txt), true);

2. 3. -

BufferedWriter deriveaz din Writer, furnizeaz un flux de ieire buffer-izat, constructorul are ca argument un obiect Writer, nu conine alte metode, n afar de cele furnizate de Writer, are dou variabile membru utile: byte buf[] i int count. FileWriter execut operaii simple de ieire de caractere pe fiiere (pentru operaii mai avansate pe fiiere se utilizeaz RandomAccessFile), construiete un obiect numai cu un ir, un obiect File sau un FileDescriptor, funcioneaz ca Write, dar opereaz pe fiiere.

Scrierea cu clasele Output Stream i Writer 83

Luca Dan Serbanati-Programare orientata spre obiect

//Numararea liniilor si scrierea intr-un fisier try{ LineNumberReader li = new LineNumberReader(new StringReader(s2)); BufferedReader in4 = new BufferedReader(li); PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("StreamIO.out"))); while((s = in4.readLine()) != null) out1.println("Linia " + li.getLineNumber() + s); out1.close(); }catch(EOFException e){System.out.println("Fine file");} //Memorarea si restaurarea datelor try{ DataOutputStream out2=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt"))); out2.writeDouble(3.14159); out2.writeBytes("Valoarea lui PI"); out2.close(); DataInputStream in5 = new DataInputStream(new BufferedInputStream( new FileInputStream("Data.txt"))); BufferedReader in5br = new BufferedReader(new InputStreamReader(in5)); System.out.println(in5.readDouble()); System.out.println(in5br.readLine()); }catch(EOFException e) {System.out.println("Sfarsitul fluxului");} . . . . . .

Clasa File Constructori:


File(String cale) File(String cale, String nume) File(File dir, String nume)

Metode mai importante:


String getName() String getPath() String getAbsolutePath() String getParent() boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() long lastModified() long length() boolean mkdir() boolean mkdirs() boolean renameTo(File dest) boolean Delete() String[] list() String[] list(FileNameFilter filtru)

Exemplu cu obiecte File

84

Luca Dan Serbanati-Programare orientata spre obiect

import java.io.*: class FileInfo { public static void main (String args[] { System.out.println (Dati numele fisierului:); char c; StringBuffer buf = new StringBuffer(); try { Reader in = new InputStreamReader(System.in); while ((c = (char)in.read()) != \n); buf.append( c); }catch (Exception e){System.out.println(Eroare: +e.toString()); } File file = new File(buf.toString()); if (file.exists()) { System.out.println(Nume file:+file.getName()); System.out.println(Cale:+file.getPath()); System.out.println(Cale absoluta:+file.getAbsolutePath()); System.out.println(Scriere:+file.canWrite()); System.out.println(Citire:+file.canRead()); System.out.println(Dimensiune: + (file.length()/1024) + KB); } else System.out.println(Fisierul nu exista.); } }

85

Luca Dan Serbanati-Programare orientata spre obiect

12 BIBLIOGRAFIE
C.S. Horstmann, G. Cornell, Core Java 2, vol. 1, ed. 2, Java Series, Sun Microsystems Press, Prentice Hall, 2000. D. Geary, Graphic Java 1.2: Mastering the JFC, ed. 3, vol. 1 (AWT), vol. 2 (Swing). Prentice Hall Computer Book, 1998-99. A. Athanasiu i colectiv, Limbajul Java. O perspectiv pragmatic, Ed. Agora, 1996 B. Eckel, Thinking in Java, McGraw Hill, 1997. H. M. Deitel, P. J. Deitel, Java. How to program, Prentice Hall, 2000. P. Van der Linden, Just Java 2, Java Series, Prentice Hall, 1999. Site http://java.sun.com/

86

You might also like