curs poo no restriction

Upload: cristian-nia

Post on 06-Apr-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 Curs Poo No Restriction

    1/86

    Luca Dan Serbanati-Programare orientata spre obiect

    PROGRAMARE ORIENTAT SPRE OBIECT

    (Limbajul Java)

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

  • 8/3/2019 Curs Poo No Restriction

    2/86

    Luca Dan Serbanati-Programare orientata spre obiect

  • 8/3/2019 Curs Poo No Restriction

    3/86

    Luca Dan Serbanati-Programare orientata spre obiect

    1 CARACTERISTICILE LIMBAJULUI JAVALimbajul 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, pachetede clase i interfee standard, precum i un mediu rudimentar de programare constituit dincteva instrumente de suport al programrii.SDK 1.x.x se pot descrca din site-ul www.java.sun.com. Pentru platforme Windows sunt fiiereexecutabile (.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 JDKbin - compilator+alte instrumente

    demo - programe demonstrativeappletsjfc

    include - fiiere pentru metode nativewin32

    jrebin

    liblib - fiiere de bibliotec

    ...In directorul \jdk1.x.x \bin se gasesc programele executabile ale kit-ului de instalare. Cele maiimportante programe sunt:

    java interpretorul de execuie (run time)javac compilator Java -> bytecodeappletviewer vizualizeaz applet-urilejdb debuggerjavap deasamblor bytecode -> Javajavah generator de fisiere .h n Cjavadoc generator de documentaiejar instrument de arhivarepolicytool interfa pentru politicile de securitatermi, rmid, rmiregistry 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-af C \

    http://www.java.sun.com/http://www.java.sun.com/http://www.java.sun.com/
  • 8/3/2019 Curs Poo No Restriction

    4/86

    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 ncare se gsesc programele executabile.

    2. Opional, se creaz o variabil CLASSPATH astfel:SET CLASSPATH =C:\jdk1.x.x\lib\tools.jar;.;C:\DirectorulMeu

    undex.xeste versiunea utilizat de JDK i DirectorulMeueste 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-inProgram n Java = una sau mai multe clase care definesc date i comportamente ale obiectelorcare reprezint instane de concepte.Un program Java trebuie s fie compilat cu compilatorul Java (javac.exe). Programul compilateste o secven de bytecode care va fi memorat n una sau mai multe fisiere .class. Operaiiledin bytecode stream vor fi interpretate de o Main Virtual Java (JVM). Fiierele class suntportabile pe toate platformele hardware i software.

    1.3 APLICAII VS. APPLET

    1.4 MEDIUL DE EXECUIE

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

    contine

    angajat------------- -----

    Programul(file .java)

    +(import)

    Bibliotec(FIIERE.java)

    javac

    COMPILARE

    Programe n bytecode(fiiere .class)

    java

    EXECUIE(Interpretare)

    browser

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

    Pagina HTML

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

    -------

    Pagina We

    Applet

    Aplicaie Monitor

    Execuie(Interpretare)editor

    EDITARE

  • 8/3/2019 Curs Poo No Restriction

    5/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Faza 1Programul este creat cu editoruli este memorat pe disc

    CompilatorCompilatorul creaz bytecode-urilei le memoreaz pe disc

    Clasa loader ncarcbytecode-ul n memorie

    Memoria principal

    Verificatorul de bytecode confirm cntregul program este corect i nucontrazice legturile de siguran

    Interpretorul citete bytecode-ul il traduce n limbajul calculatorului,memornd valorile datelor pncnd programul va fi executat

    Faza 2

    Faza 3

    Editor

    Clasa Loader

    Bytecode

    Bytecode

    Faza 4

    Faza 5

    Memoria principal

    Memoria principal

  • 8/3/2019 Curs Poo No Restriction

    6/86

    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 Javapublic 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:

  • 8/3/2019 Curs Poo No Restriction

    7/86

    Luca Dan Serbanati-Programare orientata spre obiect

    2.3 VARIABILE

    O variabil este un element de program care refer un spaiu n memoria calculatorului unde sepot 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 modificvaloarea memorat.

    In figura urmatoare se prezinta schematic executia instructiunii

    suma = numar1 + numar2;

    Valorile extrase din variabilele numar1 si numar2 sunt insumate si rezultatul este apoi memoratin 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:

    Memoria

    14

    -8

    6

    numar1

    numar2

    suma

    +

    // 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!");

    }

    }

    Declaraiade clasa

    Identificator

    de clasaModificatorde acces

    Cuvnt

    Tip de date utilizator

    Array

    Declaratie de variabila

    Instruciune - apel de metoda

    Declaratiametodeimain

    Identificator -nume de metoda

    Identificatorde variabila

    Tip de date

    primitiv

    Tipulrezultatului

    Constanta String-sir de caractere

    Constanta int-numar intreg

    Corpul metodeiafiseazaMesajbloc de instructi

    Operator

    Comentariu

    Constructorde obiecteVariabil referin

    Instruciune apel de metoda

  • 8/3/2019 Curs Poo No Restriction

    8/86

    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 prezentatein capitolul urmator, in care compilatorul Java initializeaza automat cu o valoare predefinitavariabila, 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; // variabil ntreag

    Persoana p; // variabil Persoana

    - vizibilitatea:private String nume; // variabil String privat

    public boolean esteVizibil; // variabil boolean public

    - zona de memorie unde este plasata variabila:static int contor; // variabil ntreag static

    2.4 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 tipuripot fi definite de utilizatorul limbajului Java (programator) sau definitia lor poate fi oferita deo librarie existenta de tipuri Java. In ultimul caz avem de-a face cu o reutilizare de tipuriJava.

    Dup categoria de tipuri cu care se declara, variabilele Java pot fi:1. de tipuri primitive2. 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 Byte-length integer 8-bit two's complementshort Short integer 16-bit two's complementint Integer 32-bit two's complementlong Long integer 64-bit two's complement

    (reale)float Single-precision floating point 32-bit IEEE 754double Double-precision floating point 64-bit IEEE 754

    (alte tipuri)char Un caracter 16-bit Unicode characterboolean Valoare logic (true sau false) true sau false

    Nume tip Reprezentare intern Domeniu de valoriboolean 1 bit true sau falsebyte 1 byte -128 127short 2 byte -32.768 32.767

    char 2 byte \u0000 \uFFFFint 4 byte -2.147.483.648 2.147.438.647long 8 byte -9.223.372.036.854.775.808L

  • 8/3/2019 Curs Poo No Restriction

    9/86

    Luca Dan Serbanati-Programare orientata spre obiect

    float 4 byte 3,40282347E+38Fdouble 8 byte 1,79769313486231570E+308

    Conversii de tipuri primitive:1. Conversii automate. Java realizeaz conversia implicit a datelor de tip primitiv, adicschimb automat tipul valorii unei variabile sau expresii la un alt tip. Sensul conversiei automateeste artat n urmtoarea figur:

    Conversiile automate se includ de compilator n cazul atribuirilor, n cazul apelurilor de metodela efectuarea transmiterii parametrilori n cazul calculului expresiilor aritmetice. Ideea de bazeste c n aceste conversii nu trebuie sa se piarda informaii. Astfel, tipurile primitive de dateconvertibile (toate n afar de tipul boolean) sunt incluse din punctul de vedere al domeniuluivalorilor 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 dedate:

    short x = (short)75;

    In asemenea cazuri compilatorul va efectua conversia ceruta doar daca aceasta conversie esteposibila (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 semnaleazaeroare de compilare.

    2.5 CONSTANTE

    Constant = Element textual (token) n program care reprezint o valoare fixa ce nu se poatemodifica 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 suntdeclarate 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- constante caractere: a # 5 \0377 xA \u4323

    Not. Caracterul special escape: \ poate fi folosit n urmtoarele secvene escapepentru 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 modulsuprascriere.\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 dounumere ntregi preluate din linia de comand.Observaie. Programul se va executa de la tastatura cu comanda:

    byte short

    char

    int long float double

  • 8/3/2019 Curs Poo No Restriction

    10/86

    Luca Dan Serbanati-Programare orientata spre obiect

    2.6 TIPURI DE DATE CONSTRUITE

    Cu construcia class utilizatorul poate defini noi tipuri de date. Aceste tipuri reprezint instantede concepte din realitate precum: pisic, angajat, funcie, main etc. Conceptele respective sepot 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. Oasemenea descriere furnizeaz un mecanism care permite simularea unui comportament alinstanelor unei clase.

    Dac vrem s tim numele instantei de pisic memorat in variabila pisicaMea, folosimpisicaMea.nume. In aceasta situatie pisicaMea.miaun() va reproduce n programcomportamentul pisicii pisicaMea.

    Memorarea datelor de ctre JVM

    JVM, Masina virtuala Java, dupa cum rezulta din denumirea ei, nu este un calculator fizic, cieste simulata prin software. In acest scop exista programul java.exe din kit-ul SDK carecreaza mediul pentru executia unui program ce ii este furnizat ca argument. Executiaprogramului se face prin analizarea, instructiune cu instructiune, a codului sau de catre uninterpretor de bytecode si prin executia fiecarei instructiuni analizate folosind resursele JVM. Oresursa importanta a JVM este memoria care este structurata in mai multe componente, fiecarecu 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;

    public class Suma {

    public static void main(String args[]) {

    int numar1; // variabila pentru primul numar

    int numar2; // variabila pentru al doilea numarint suma; // variabila pentru suma

    //converteste primul numar de la tipul String la tipul int

    numar1 = Integer.parseInt(args[0]);

    //converteste al doilea numar de la tipul String la tipul int

    numar2 = Integer.parseInt(args[1]);

    //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

    declararea variabilelor cu

    nume i tip de date

    array de String-uri care memoreazparametri liniei de comand

    primul argument al linieide comand(12)

    al doilea argument alliniei de comand(34)

  • 8/3/2019 Curs Poo No Restriction

    11/86

    Luca Dan Serbanati-Programare orientata spre obiect

    - memoria Heap care este un depozit n memoria RAM pentru toate obiectele si array-uriledin 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 elementeleconstante din program cum ar fi sirurile constante si care trebuie sa fie disponibile n timpulexecutrii progamului;

    - memoria non-RAM. Sunt suporturi diferite utilizate pentru memorarea datelor care auasigurata persistenta independent de executia programului. Pe aceste suporturi datele suntorganizate 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 sautrimise unui alt calculator sau pot fi scrise convertind in bytes date din memorie.

    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, mpreuncu ntelesul lor:

    Expresie SemnificaieExpresii booleenex > 3 x este strict mai mare dect 3x = = z x este egal cu zx ! = y x este diferit de yb b este adevratExpresii numerice(x+7)*y/2

    2

    y7)(x +

    2*a*3.14 2.a.3,14Expresii logicex > 3 && x == z

    x>3 i x este egal cu za + d < c || b a + d < c sau bApeluri de metodegetValue()*77.4 valoarea obinut prin executarea metodei getValue() este

    nmulit cu 77.4amiculMeu.getPrenume() apeleaz metoda instangetPrenume() a variabilei instan

    amiculMeu.Crearea obiectelori memorarea referinelor lor n variabile instanMamifer m=new

    Mamifer()se creaz un obiect al clasei Mamifer i referina la el estememorat n varibila m de acelai tip: Mamifer

    Expresii cu operatori aritmetici i atribuirix = y = z = 82; z=82; y=z; x=ys = Buna; se creaz un obiect de tip String cu valoarea Buna i referina

    la el este memorat n variabila de acelai tip s.

    Proceso

    Stiv

    HeapMemoria

    static

    RAMRegitri

    Cod

    Disc

  • 8/3/2019 Curs Poo No Restriction

    12/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Expresie SemnificaieExpresii cu operatorul de concatenare a irurilors=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 maimulte categorii.

    Operator Semnificaie Operator Semnificaie Operator SemnificaieOperatori de comparaie Operatori logici Operatori pe iruri< mai mic && i (evaluare scurt) + concatenare mai mare & i (evaluare complet) = mai mare sau egal | sau (evaluare

    complet)>> depl. la dreapta

    cu extensie semn== egal ^ sau exclusiv

    (evaluare complet)>>> depl. la dreapta

    cu extensie 0

    != diferit ! notinstanceof determin dac un obiect aparine unei claseOperatori aritmetici Operatori multifuncionali* nmulire ++ incrementeaz cu 1 /= mparte cu valoarea

    specificat/ mprire -- decrementeaz cu 1 %= modulo valoarea

    specificat% modulo += incrementeaz cu

    valoarea specificat&= i pe bii cu valoarea

    specificat+ adunare -= decrementeaz cu

    valoarea specificat|= sau pe bii cu

    valoarea specificat- scdere *= multiplic cu

    valoarea specificat^= xor pe bii cu

    valoarea specificat>= deplaseaz dreaptafr semn cu valoareaspecificat

    >>= deplaseaz dreaptacu semn cu valoareaspecificat

    (tip) conversie explicit aoperandului la tipulspecificat

    Ordinea de evaluare a expresiilor este dat de precedena i asociativitatea operatorilorcomponente:

    Tip operator Operatori Asociativitateoperatori postfixai [] . (parametri) expr++ expr-- dreaptaoperatori unari ++expr --expr +expr -expr ~ ! dreaptacreare sau cast new (tip)expr dreaptamultiplicativi * / % stngaaditivi + - stngadeplasare > >>> stngarelaionali < > = instanceof stngaegalitate == != stngaAND pe bii & stngaXOR pe bii ^ stngaOR pe bii | stngaAND logic && stngaOR logic || stngacondiional ?: stngaatribuiri = += -= *= /= %= &= = |= = >>>= dreapta

  • 8/3/2019 Curs Poo No Restriction

    13/86

    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 obiectExemple: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 declararedouble oValoare = 8933.234; //instruciune declaraie

    Instruciunile de controlsunt de trei tipuri si anume: structura secven, structura de selecie istructura repetitiv.

    Instructiunea secven

    Instructiunea secven este ncorporat n Java. Dac nu se specific altfel, compilatorulexecut instruciunile n ordinea n care sunt scrise. Mai mult, instruciunile pot fi grupate. Unbloc 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 iinstruciunea de selectie switch. Sintaxa i schemele logice ale acestora sunt date n figuraurmtoare:

    unde:

    if(Condiie) Instruciune1else Instruciune2

    Instruciunea if-elsecu dou alternative

    C

    I2I1

    if(Condiie) Instruciune1

    Instruciunea if-else cu osingur alternativ

    C

    I1

    if(Condiie1) Instruciune1else if(Condiie2) Instruciune2else if(Condiie3)

    Instruciune3else InstruciuneElse

    Instruciunea if-elsemultipl

    C1

    I1

    C2

    I2

    C3

    I3

    IE

    switch (E) {case K1:

    ListaInstruciuni1case K2:

    ListaInstruciuni2default:

    ListaInstruciuniDef}

    Instruciunea switch

    E=K1 LI1

    LID

    E=K2 LI2

  • 8/3/2019 Curs Poo No Restriction

    14/86

    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 putemavea 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 suntmemorate n variabilele instan: prietenoasai dresata, si pe care le vom folosi n metodaprietenoasCuCopiii()care implementaeaza predicatul logic x este prietenoas i x estedresat. 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 funciede valoarea expresiei specificate n switch.

    Instruciunile repetitive

    Instruciunile repetitive sunt de trei tipuri: instruciunea while, instruciunea do-while iinstruciunea for.Sintaxa i schemele lor logice sunt urmtoarele:

    Exerciiul 3. mbogim clasa Pisica cu o metod care afieaz de un numr de ori cuvntulMiau. Numrul este specificat ca parametru al metodei. Aceast metod va fi folosit ntr-oalt clasCorDePisici.

    ntreruperea execu ieirepetitive/switchbreak;break eticheta;

    for(ExpresieInitiala;Condiie; Increment) Instruciune

    LegendEI - ExpresieInitialaC - CondiieIn - IncrementI - Instruciune

    InstruciuneaforEI

    C

    I

    In

    ntreruperea iteraieicurente: continue;

    while (Condiie) Instruciune

    Instruciunea while

    I

    C

    doInstruciune

    while (Condiie)

    Instruciunea do-whileI

    C

  • 8/3/2019 Curs Poo No Restriction

    15/86

    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 calculeazi afieaz suma numerelor ntregi de la 1 la10. Pentru aceasta avem dou modaliti:1. varianta 1: scriem ntregul cod n metoda main,2. varianta 2: definim variabila instansuma: inti metoda instanaduna(int n) care

    adun numrul n la suma anterioar, n varianta 2. n metoda main, crem un obiect alclasei curente (Demo), referina la el o memorm ntr-o variabil localdemo de acelai tip iadunm la suma fiecare numrde 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

  • 8/3/2019 Curs Poo No Restriction

    16/86

    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 calculezediferena 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 apoiafieaz 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 lunilorcorespunztoare: Ianuarie, Februarie, , Decembrie.

    4. S se scrie un program care implementeaz un cont bancar. Acesta din urm a fost deschiscu 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 CLASEIjava.lang.Math

    Pachetul standard Java java.lang, unicul care este n mod automat inclus de catrecompilator n procesul de compilare a programului nostru, contine o clasa Math care oferametode ale clasei care realizeaza calcule matematice bine cunoscute. In tabelul urmator seprezinta cteva din aceste metode.

    Metoda Valoarea returnat Metoda Valoarea returnatabs(x) valoarea absolut min(x, y) minimul dintre x i yexp(x) ex pow(x, y) ridicarea la putere, xy

    log(x) ln x sqrt(x) xceil(x) cel mai mic ntreg convertit la

    double >=xcos(x)

    floor(x) cel mai mare intreg convertit ladouble

  • 8/3/2019 Curs Poo No Restriction

    17/86

    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.

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

    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) blocnumeMetod::= identificatorlista parametri::= {parametru}parametru::=tipidentificatorbloc::= { 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 metodeledeclarate fara static sunt metode instanta.

    Executia algoritmului descris in metoda se realizeaza la apelul metodei dintr-o alta metoda. Ometod 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 calculeazi afieaz primele 100 de numere ntregi pozitive, mpreun cuptratele lor. Pentru aceasta din metoda main se apeleaza o metod (static)calculeazPatrat() care returneaz ptratul numrului specificat ca parametru

    public class ListaCaractere{

    public static void main (String args[]){

    for(char c = 0; c curata ecranul!

    System.out.println(valoare:+(int)c + caracter: +c);

    }

    }

    }

    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

  • 8/3/2019 Curs Poo No Restriction

    18/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Instructiuni de intrerupere a executiei unei metodeCa 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:

    n metode putem folosi n instructiunea return expresii booleene pentru a returna o valoarelogic. 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 prietenoasa=true;

    boolean dresata=false;

    . . . .

    boolean ePrietenoasa(){

    return prietenoasa && dresata;}

    }

    Exerciiul 6 (Magazin). S se gestioneze orarul unui magazin de cri i jocuri video. Se vorexecuta 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 pedisc i prezentat pe pagina urmtoare.

    4. Se adaug metoda getMesaj care ntoarce un iri indic dac magazinul este deschis sau

    nchis la momentul apelrii metodei.5. Se modific vizualizeazOrar pentru a raporta orarul magazinului specificat de variabilele-

    instan oraDeschidere i oraInchidere

    public class NumerePatrate{

    public static void main (String args[]) {

    for(int i = 0; i

  • 8/3/2019 Curs Poo No Restriction

    19/86

    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. Diferenadintre cele dou clase este cirurile String sunt fixe, pe cnd cele de tip StringBuffersunt 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 ometoda toString() care furnizeaza reprezentarea obiectului ca sir i este apelatimplicit 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 Pisicadevine 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]

  • 8/3/2019 Curs Poo No Restriction

    20/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Clasa String conine metodele prezentate n tabelul urmtor:

    Semntura metodei Semnificaie -Valoarea returnatchar charAt(int index) ntoarce caracterul de pe pozitia index din irul pe

    care este aplicat metoda

    int compareTo(String altSir) compar lexicografic douiruri i returneaz unadin valorile: nrNegativ, 0, nrPozitiv

    boolean equals(Object altObiect) compar (case sensitiv) irul cu obiectul specificat. ntoarce true numai dac altObiect este de tipString i conine acelai ir de caractere cu irul cucare se compar

    boolean equalsIgnoreCase(String altSir) acelai efect ca mai sus, numai c nu ine cont detipul literelor: mari sau mici.

    String intern() returneaz reprezentarea canonic a irului. nacest caz compararea a dou iruri nreprezentarea intern are acelai efect dac sefolosete operatorul de egalitate = =, ca n cazulmetodei equals().

    boolean endsWith(String sufix) verific dacirul se termin cu irul specificat ca

    parametruboolean startsWith(String prefix) verific dac irul ncepe cu irul specificat ca

    parametru

    int indexOf(int car) returneaz poziia n sir pe care se gsete primaapariie a caracterului car specificat prin codulUnicode. Aceast metod poate fi folosit pentrucutarea unui subir (dat ca parametru) ntr-un ir.

    int indexOf(int car, int indiceStart) acelai efect, doar c se va folosi indice-Start capozitie de la care se va ncepe cutarea.

    int lastIndexOf(String str) ntoarce poziia ultimei apariii a subirului str n ir.

    int lastIndexOf (String str, int indiceStart) acelai efect, numai c se va folosi indice-Start capoziie de la care se va ncepe cutarea.

    int length() returneaz lungimea irului pe care este aplicatmetoda

    String replace(char carVechi, char carNou) returneaz un nou ir n care toate apariiilecaracterului carVechi au fost nlocuite cu carNou.

    String substring(int indiceStart) ntoarce un nou ir care este un subir extras dinirul iniial, de la poziia indiceStart i pn la sfrit

    String substring(int indiceStart, int indiceStop) ntoarce un nou ir care este un subir extras dinirul iniial, de la poziia indiceStart i pn laindiceStop, exclusiv

    String toLowerCase() convertete toate majusculele la litere mici

    String toUpperCase() convertete toate literele mici la litere mari

    String trim() terge spaiile din ambele capete ale irului

    Exerciiul 7 (Magazin1). Modificati metoda vizualizeazaOrar a clasei Magazin pentruutilizarea 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.

  • 8/3/2019 Curs Poo No Restriction

    21/86

    Luca Dan Serbanati-Programare orientata spre obiect

    3 INTRODUCERE N PROGRAMAREA ORIENTAT SPRE OBIECTE

    Dezvoltarea programelor pe obiecteProgramarea intr-un limbaj procedural utilizeaza mparirea unei probleme ntr-un numr de paimai simpli n care fiecare pas reprezinta rezolvarea unei subprobleme a problemei initiale. Oaplicaie scris ntr-un limbaj procedural se inspira din modul n care calculatorul executinstruciunile.O aplicaie scris ntr-un limbaj orientat spre obiecte se concentreaz asupra problemei derezolvat utiliznd o mulime de ageni, obiectele, care se angajeaz s o rezolve colaborndntre ei. Programarea ntr-un limbaj orientat spre obiecte nseamn gsirea unor ageni adaptaiproblemei si care si ei si mpart ntreaga sarcin a rezolvarii, specializndu-se fiecare n sarcinimai mici.Deosebirea celor doua abordari bazata pe principiul divide et impera este aceea ca n timp ceabordarea procedurala identifica si rafineaza functiile aplicatiei, abordarea pe obiecte identificsi rafineaza conceptele problemei de rezolvat, punndu-le sa colaboreze unul cu altul pe bazarelatiilor 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 conexiunilorstandard. Orice component poate fi schimbat cu o alta de alta marc dar care respectstandardul legturilor cu celelalte componente.Reflectand asupra solutiei unei probleme in termeni de concepte favorizeaza reutilizareaobiectelor de la o aplicatie la alta atunci cand in cele doua aplicatii se folosesc aceleasiconcepte.De aceea a programa pe obiecte nseamna a scrie un program n care se combina cumecanisme standard furnizate de limbajul de programare obiecte create ad hoc cu obiecte

    preexistente. Fiecare obiect este specializat n furnizarea anumitor servicii legate de informatiilepe 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 unuiconcept.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 functiiasupra acestor date.Membrii unui obiect sunt deci membrii-date i membrii-functii. Ei pot fi proiectati ca accesibilisau nu altor obiecte. Membrii accesibili din afara obiectului formeaz interfaa naturala aacestuia. Astfel, starea obiectului poate fi modificat numai prin intermediul interfeei acestuia.

    Principiul care st la baza definirii interfeei unuiobiect este acela al ncapsulrii informaiilor(information hiding). Conform acestui principiueste recomandabil s ascundem in interiorulobiectului toate informatiile (date sau functii)inutile altor obiecte i care reprezint detalii deimplementare ale obiectului i sa lsmaccesibile (vizibile) altor obiecte doar aceleinformatii in care aceste obiecte sunt interesate.n figura alturat se prezint un obiect al claseiPunct a crui stare este format din valorileatributelor x

    i y, atribute care reprezint

    coordonatele punctului i constituie stareaobiectului. Proiectarea obiectelor Punct a decis

    Interfa

    Implementare

    Implementarea

    Stare local

    x:

    y:

    read_x

    read_y

    change_x

    Punct

    change_yoperaiilor

    read_xread_ychange_x

    change_y

  • 8/3/2019 Curs Poo No Restriction

    22/86

    Luca Dan Serbanati-Programare orientata spre obiect

    x i y este imposibil. Cum aplicatia are nevoie sa controleze coordonatele punctelor, s-adecis 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 obiectelorPunct.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, aceleairelaii 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 clasi un obiect al su ca n figura de maijos:

    n tabelul urmtor prezentm exemple de clase i instane ale lor:

    Clas Instan

    Proiectul unei case Casa construit

    Negativ fotografic Fotografie

    Reet culinar Mncare gtit dupa reet

    Atribute, operaii i constrngeri

    Programarea pe obiecte necesit o faza preliminara de analiz a problemei de programat. Inaceasta faz obiectele sunt identificate prin conceptele pe care le reprezint, iar colaborareadintre obiecte prin relatiile stabilite ntre concepte. Descrierea problemei rezultat din procesulde 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 salecomponente care sunt atributele, operatiile si constrngerile.Un atribut este o abstractizare a unei proprieti a unui obiect n lumea real. Valorile acestorproprieti constituie starea obiectelor clasei.

    Nota. In general, strile difereniaz un obiect de un altul, desi identitatea unui obiect nueste 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 nprogramarea 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 alaplicaiei 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 iserviciu (nivelul conceptual i al specificrii) sau metod (la nivelul implementrii)

    Persoana Ion: Persoana

    instan a

    obiectclas

  • 8/3/2019 Curs Poo No Restriction

    23/86

    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 pecare o impunem este ca, cantitatea s fie un numar pozitiv. Atunci pretul si cantitatea vor formaatributele clasei ElementComanda, iar condiia {cantitate>=0} va fi o constrngere. MetodaverificaStoc() verific dac exist n depozit cantitatea produsului respectiv pentru onorareacomenzii. Aceste elemente pot fi specficate n UML i implementate n Java astfel:

    3.2.1 Variabile-membru ale unei clase

    ntr-o clas Java, atributele obiectelor unei clase sunt definite ca variabile-instan sau variabile-obiect in definitia clasei. Fiecarei variabile-instan i se aloca o zon de memorie n spatiulalocat obiectului i n care se memoreaza valoarea variabilei. ntregul spatiu alocat unui obiecteste alcatuit din totalitatea spatiilor alocate variabilelor sale instan.Folosind terminologia UML, la codificarea n Java, unui atribut al clasei i va corespunde ovariabil-instan.Exemplu. Fie o clasAvatar ntr-un joc interactiv. Clasa definete o variabil instanta vitezacare 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 instanviteza a unui obiect Avatar, acesta se deplaseaz mai repedesau mai ncet.O variabil instan este o variabila global, la nivelul obiectului, cunoscut si accesibil dintoate metodele obiectului.Variabil de clas = Variabil-membru a unei clase care are un unic spaiu alocat n memorie sia crui unic valoare este partajat de toate obiectele clasei. O variabil de clas definete unatribut al clasei si nu al obiectelor clasei. Reprezinta n Java o solutie pentru a avea, la nivelulprogramului, variabile globale tuturor obiectelor de acelasi tip.Exemplu. n clasa Avatar se definete o variabil a clasei, numit dataOra. Valoareavariabilei este partajat de toate obiectele Avatar. Dac aceast variabil ar fi fost o variabilinstan, sincronizarea avatarilor ar fi fost mult mai dificil de realizat.

    Accesul la variabilele-membruAccesul la o variabila-instanta a unui obiect se face cu ajutorul operatorului binar .. Primuloperand trebuie sa fie o variabila-reference sau o expresie a carui valoare sa fie de tipreference. 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 operandtrebuie 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 curental articolului cumparat pe lista comenzii respective, codul clasei ei ar trebui modificat ca mai jos:

    Implementarea n Java

    public class ElementComanda{

    private int cantitate;

    private Valuta pret;

    . . . .

    public boolean verificaStoc(){...}

    . . . .}

    Reprezentarea unei clase n UML

    ElementComanda

    cantitate: integer=0 {cantitate>=0}

    pret:Valuta

    verificaStoc():boolean {isQuery}

    atribute

    operaii

    constrngere

    valoare initiala constrngere

  • 8/3/2019 Curs Poo No Restriction

    24/86

    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 obiectElementComanda valoarea lui nrCurent, dupa care variabila ar trebui incrementata. Obiectulcare 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. Estecazul 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

  • 8/3/2019 Curs Poo No Restriction

    25/86

    Luca Dan Serbanati-Programare orientata spre obiect

    invizibila din exterior, ea este globala tuturor variabilelor locale declarate in metodeleobiectului.

    - locale, daca domeniul are o intindere limitata, cuprinsa intr-un alt domeniu de vizibilitate, mailarg. 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 potfi inserite oriune intr-un bloc, nu numai la inceputul acestuia. Unica restrictie este ca incadrul 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 devizibilitate din programul precedent.

    Stabilit mecanismul domeniilor de vizibilitate se poate enunta regula care stabileste vizibilitateacomponentelor programului (variabile, tipuri, constante simbolice sau metode) a carorsemantica este stabilita prin declaratii.

    Regula. O componenta cu nume x este vizibila intr-un punct din program aflat intr-undomeniu 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, dacaeste vizibila in domeniul inconjurator lui y.

    Domeniul de existen (lifetime) = Perioada de timp n cursul execuiei programului n care ocomponenta a programului exist, adica are alocat un spatiu in memorie.

    Nota. Desi in cazul anumitor variabile domeniul de vizibilitate si cel de existenta suntstrans legate intre ele prin mecanisme dictate de regulile limbajului de programare, celedoua concepte sunt complet diferite intre ele. Domeniul de vizibilitate se refera laidentificatori din program si de aceea este un concept static ce priveste momentulcompilarii, atunci cand identificatorii conteaza. Domeniul de existenta se refera la entitatiledin program prezente in memorie la executie (variabile, obiecte, array etc.) si de aceeaeste un concept dinamic, specific executiei.In exemplu de mai sus variabila intreaga w este vizibila in tot corpul metodei met3 maiputin in blocul interior acestuia in care cu numele w este vizibila o variabile float. Inschimb, variabila intreaga w are domeniul de existenta extins pe toata durata de executie

    Mediu

    met1 met2 met3int x

    int z

    float w

    int wint y

    int x

  • 8/3/2019 Curs Poo No Restriction

    26/86

    Luca Dan Serbanati-Programare orientata spre obiect

    a corpului functiei, incepand cu momentul executarii declaratiei sale. Deci ea exista si pedurata existentei variabilei float w, doar ca nu este accesibila.Daca pentru variabilele locale se poate stabili o relatie intre domeniul de vizibilitate sidomeniul de existenta, pentru celelalte componente ale executiei, cum ar fi obiectele siarray-urile, relatia nu exista deoarece acestea in Java au un domeniu de existenta, dar nusi un domeniu de vizibilitate. Vizibilitatea lor este data in mod indirect de variabilele care lememoreaza adresa in spatiul Heap.

    Metode

    Reluam pe scurt tema metodelor in Java aducand unele precizari fata de introducerea facuta incapitolul precedent.Metodele sunt folosite pentru a implementa serviciile pe care proiectantul programului le-aincredintat clasei si obiectelor sale. Aceste servicii alcatuiesc responsabilitatea claseirespective, ratiunea existentei ei.

    Declaratia de metodO metoda in Java trebuie sa fie declarata in cadrul clasei careia ii apartine. O metoda estespecificata 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, si4. lista parametrilor formali intre paranteze.

    Lista parametrilor formali poate fi vida sau poate contine unul sau mai multi parametrii separatiprin virgula.Fiecare parametru formal este specificat prin tip si numele parametrului.Corpul metodei este un bloc de instructiuni care implementeaza algoritmul calculului realizat demetoda. Corpul metodei reprezinta un domeniu de vizibilitate in care se pot declara variabilelocale. Acest domeniu este initializat cu numele parametrilor formali care sunt cunoscuti inintreg corpul metodei. Ei se comporta ca niste variabile locale de tipul declarat in lista deparametri si initializate la fiecare apel al metodei.Exemplu:

    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. Esteo metoda declarata cu static.Comportamentul obiectelor unei clase = Aciuni pe care obiectele unei clase sunt capabile s lendeplineasc. Acest comportament este dat de metodele non-staticale 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 obiectelorclasei,

    public int max(int a, int b)

    {

    i f ( a > b )

    return a;

    else

    return b;

    }

    Corpul metodei

    Modificator devizibilitate

    Tipulrezultat

    Parametruformal

    Numelemetodei

    Header-ul metodei

  • 8/3/2019 Curs Poo No Restriction

    27/86

    Luca Dan Serbanati-Programare orientata spre obiect

    In cursul rezolvarii propriilor sarcini, obiectele clasei pot ceara si sa primeasc informaii de laalte obiecte sau s trimit mesaje altor obiecte cerndu-le, la randul lor, s execute diversesarcini in care aceste din urma obiecte sunt specializate.

    Apelul de metodApel 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 aputea 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-osectiune urmatoare.De obicei un apel de metoda are loc in momentul in care se executa o metoda a obiectuluiapelant. Apelul metodei intrerupe executia metodei curente si trece controlul metodei apelate.La sfarsitul executiei metodei apelate, controlul revine la metoda intrerupta, exact in punctul deintrerupere.Daca metoda apelata restituie (intoarce) o valoare metodei apelante, aceasta valoare poateparticipa la calculul unei expresii, devenind un operand in acea expresie. Este cazul in careapelul 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 apeluluitrebuie sa fie o variabila-reference sau o expresie a carui valoare sa fie de tip reference catreun obiect in memorie. Al doilea operand este chiar numele metodei urmat de lista parametrilorefectivi.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 fiurmatorul:

    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 esteaceiasi 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 noiobiecte Avatar:

    Avatar av = Avatar.creeazaAvatar();

    Nota. Ca si in cazul variabilelor-membru, apelul unei metode apartinand unui obiect dininteriorul unei metode che apartine aceluiasi obiect se face fara a utiliza operatorul . sifara a utiliza referinta la obiectul destinatie. Acest obiect este subinteles a fi obiectul curentin 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 membriiclasei: variabile si metode

  • 8/3/2019 Curs Poo No Restriction

    28/86

    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 tipulparametrilor n ordinea declarrii lor n definirea metodei. De exemplu, semntura metodeisetPrenume din clasa Persoana este: setPrenume + String.Limbajul Java admite suprancrcarea (overloading-ul) metodelor: metodele dintr-o clas potavea acelai nume, este suficient sa difere prin semntur (adic, prin tipul i/sau numrulparametrilor). Se poate observa ca tipul rezultatului nu apare in semnatura deoarece sepresupune 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

    Constructoral unei clase = o metod cu acelai nume ca i cel al clasei din care face parte sicareia 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 muliconstructori. De exemplu, clasa Persoana ar putea avea doi constructori ca mai jos:

    public Persoana() { //Constructor

    nume=;

    prenume=;

    varsta=0;

    }

    public Persoana(String n, String p){ //Constructor

    nume=n;

    prenume=p;}

    In acest exemplu, constructorii clasei Persoana sunt suprancrcai, ei diferind prin numrul itipul parametrilor.Unei clase ii pot lipsi constructorii. In acest caz, compilatorul creaz un constructor predefinitfr parametri care iniializeaz variabilele instan ale clasei astfel: variabilele primitivenumerice 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 nvariabile de acelai tip, Persoana:

  • 8/3/2019 Curs Poo No Restriction

    29/86

    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 menionatmai sus, avand o variabila care memoreaza un obiect, se poate utiliza notaia cu punct pentruapelarea unei metode instan a unui obiect (amiculMeu.afiseaza()) sau pentru accesareavariabilelor 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 constructoral 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 clasi 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 peecran. Un punct este caracterizat prin coordonatele sale x i y care sunt valori ntregi. Atuncivom declara x i y ca variabile instan ale clasei Punct, iar constructorului acesteia le vainiializa cu valorile dorite. Similar, clasa Dreptunghi va avea ca variabile instan: lime inlime 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 clasTestObiecte exemplific, n metoda main, crearea i utilizarea obiectelor de tip Punct iDreptunghi. In metoda main() a acestei clase mai nti crem un punct i doudreptunghiuri, unde punctul este originea primului dreptunghi, iar cel de-al doilea are origineapunctul (0,0). Apoi, afim caracteristicile primului dreptunghi (limea i nlimea), precum iaria acestuia. Urmeaz

    schimbarea originii celui de-al doilea dreptunghi, astfel nct cele dou

    dreptunghiuri s aib aceeai origine i afiarea poziiei acesteia. Ultimele operaii efectuateeste de a deplasa al doilea dreptunghi i de a afia noile coordonate ale originii acestuia.Implementarea celor trei clase este artat n programul urmtor.

  • 8/3/2019 Curs Poo No Restriction

    30/86

  • 8/3/2019 Curs Poo No Restriction

    31/86

    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 drepturilede acces:- static. Definete membrii classi: variabile sau metode.- final:

    - pentru variabile. Reprezint variabilele ale cror valori, odata initializate, nu se potmodifica 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 facparte.

    - pentru clase. O astfel de clas nu poate fi extins. Este o clas frunz n structuraarborescent a claselor format pe baza relaiei de motenire dintre clase.

    - synchronized. Cere ca in orice moment cel mult un fir de execu ie (thread) sa poataexecuta acea metod sau sa acceseze acea data sincronizata.

    - native. Reprezint o metod implementat ntr-un fiier extern, provenind dintr-un programscris 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 staticMetodele 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 ctremetodele statice ale aceleai clase. Este cazul variabilei text, a crei valoare este afiat nmetoda main a clasei Exemplu1.A doua clas, Exemplu2, conine dou variabile: texti text2. Prima este variabil instaniar a doua este declarata static, deci este variabila a clasei. Valorile acestor variabile suntreturnate de ctre metodele instan getText() i getStaticText() ale aceleai clase.Aceste metode vor fi apelate din metoda staticmain. Primul lucru pe care-l facem este s necrem 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 iunTextStatic, 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 interiorulmetodelor instan ale clasei n care au fost declarate.Observaie. Intr-o metod declarat cu staticnu se poate folosi variabila this!!!

  • 8/3/2019 Curs Poo No Restriction

    32/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Membrii statici ai unei claseVariabilele statice ale unei clase, in cazul in care nu sunt declarate private, pot fi accesatedirect, prin intermediul fie a clasei de care aparin fie a unei instante a clasei memorata intr-ovariabil referin de tipul clasei respectiv.Exemplu:Definiie

    class Comanda {String ragioneSociale;

    String p_IVA;

    int nrComanda;

    Date data;

    static int totalComenzi=0;

    . . .

    }

    Acces

    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 sauprin intermediul variabilelor referin de tipul clasei respective. Continund exemplul anterior,adugm clasei Comanda metoda static anuleaza() care anuleaz valoarea variabileistatice totalComenzi:

    Definiieclass Comanda{

    String ragioneSociale;

    String p_IVA;

    int nrComanda;

    Date data;

    Comanda.anuleaza();

    static int totalComenzi=0;

    static void anuleaza() {

    totalComenzi=0;

    }

    }

    AccesComanda 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. Unasemenea fisier poate contine una sau mai multe declaratii de clase si interfete. Doar una dinclasele 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 denume pentru toti identificatorii de clase si interfete declarati ca apartinandu-i. Amintim ca intr-unspatiu de nume numele declarate sunt unice.Apartenenta la un pachet se declara global pentru toate numele de clase si interfete unei unitatide 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 decompilare respectiv:package Identificator;

    package NumePachet;

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

  • 8/3/2019 Curs Poo No Restriction

    33/86

    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 pachetelorn 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 exemplulcare 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 esteun pachet din care este alcatuit programul. Declaratia incluziunii unui pachet intr-un alt pachetse face simplu, specificand in declaratia package numele complet al pachetului.Ideea care sta la baza acestei organizari este evitarea conflictelor de nume. Intr-adevar existaclase in pachetele Java standard care au acelasi nume. Exista, de exemplu, o clasa cu numeleObject in pachetul java.lang si o interfata cu acelasi nume in pachetul org.omg.CORBA. Elese pot utiliza in cadrul aceluiasi program fara a intra in conflict intre ele doar daca folosimnumele lor complet: java.lang.Object si org.omg.CORBA.Object. In cazul numeluiObject se poate verifica si o alta regula. Daca utilizam in programul nostru numele simpluObject, acesta se va referi automat la clasa java.lang.Object deoarece java.lang esteunicul pachet Java standard importat automat in programul nostru. Pentru a utiliza interfataObject din pachetul org.omg.CORBA va trebui sa utilizam numele complet al clasei:org.omg.CORBA.Object.Exemplu.Sa consideram o clasDocument care este declarat n pachetul idd din structura de pachetero.univ_ovidius (in cele ce urmeaza se va considera in locul adresei univ-ovidius.ro adomeniului Internet al universitatii Ovidiu adresa univ_ovidius.ro). Document folosete oclasa Vector care face parte din pachetul java.util. In program vom scrie atunci urmtoareledeclaraii:

    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 fialcatuit din clase, interfete si alte pachete. Intr-un program complex, cu o ierarhie de pachetepe 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 dedirectoare di fisiere dintr-un sistem de fisiere. Aceasta asemanare nu este doar de suprafata inJava. Ea ne conduce la modul de structurare a fisierelor de bytecode .class pe disculcalculatorului. Regula este simpla: fiecarui pachet Java trebuie sa ii corespunda pe disc undirector avand acelasi nume cu numele pachetului. In directorul respectiv se vor gasi fisierele.class ale tuturor claselor si interfetelor declarate in pachet plus directoarele pachetelordeclarate in pachet. Deci daca pachetul Java respectiv este la randul sau inclus intr-un altpachet, atunci directorul sau trebuie va fi inclus in directorul pachetului-tata. Aceasta ierarhie dedirectoare trebuie sa aiba un director radacina corespunzator pachetului predefinit. Pentru aputea executa un program structurat pe pachete, acest director trebuie sa apara in variabilaCLASSPATH a sistemului.De aceea pentru a compila cu SDK clasa Document din pachetul idd de mai sus se poateutiliza comanda:

    javac d C:\studenti\ionica Document.java

    unde C:\studenti\ionica este numele unui director declarat n variabila CLASSPATH asistemului. 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 canumele acestor clase sunt unice in orice program sunt importate. In acest scop Sun

  • 8/3/2019 Curs Poo No Restriction

    34/86

    Luca Dan Serbanati-Programare orientata spre obiect

    domeniile Internet. Este ideea folosita de declaratia de pachet de mai sus in care seutilizeaza un nume de domeniu internet unic care este univ_ovidius.ro pentru a creaun pachet ro.univ_ovidius.idd unic in lume. Se observa inversarea ordinii de aparitiein numele compus a numelor simple. Daca nu aveti un domeniu Internet la dispozitieputeti utiliza cu mare probabilitate de a avea nume unice pentru clase adresa voastra dee-mail. De exemplu, prefixul com.yahoo.popescu.ion ar putea fi o solutie pentrupachetele de clase Java ale lui Ion Popescu. Chiar si in aceasta situatie ramane valabilaconventia folosita de Java pentru a mapa pachetele de clase pe disc. Pentru fisiereleclaselor unui pachet com.yahoo.popescu.ion.licenta , Ion Popescu va trebui sa isicreeze un subdirector pe disc com\yahoo\popescu\ion\licenta in care sagazduiasca fisierele claselor pachetului.Daca acest pachet va fi folosit intr-un unic program, acest subdirector se poate include indirectorul ce contine fisierele programului.Daca clasele pachetului com.yahoo.popescu.ion.licenta le vom utiliza in maimulte programe, in loc sa includem subdirectorul com\yahoo\popescu\ion\licentain directoarele tuturor acestor programe, putem crea un director nou pe disc, sa zicemC:\studenti\ionica in care il vom memora o singura data. Pentru a accesa din toateprogramele 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 coninamulte din elementele introduse in capitol. In program s-au evidentiat principalele constructiisintactice.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) {nume = n;salariu = s;

    dataCalendAngajare = d;}

    public void print() {System.out.println(nume + " " + salariu + " " + anAngajare());

    }

    public void maresteSalariu( double procent) {salariu*=1+ procent / 100;

    }

    public int anAngajare() {return dataCalendAngajare. getAn();

    }

    private String nume;private double salariu;private DataCalend dataCalendAngajare;

    }

    //constructorul de obiecte Angajat

    //metoda a obiectului

    //metoda a obiectului

    //metoda a obiectului

    // variabile-instanta

  • 8/3/2019 Curs Poo No Restriction

    35/86

    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 douclase 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 Beste 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 uneiclase cunosc sau sunt conectate la instanele celeilalte clasei:

    un medic isi cunoaste pacientii si vice versa un pacient isi cunoaste medicii care iltrateaza,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.

    Generalizare/SpecializareEste o relaie cu intelesul . . .este o specie de. . . ntre dou concepte sau tipuri de datereprezentate 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 iClientSocietate. Ultimele dou clase reprezint o specializare a primei clase:

    Generalizare vs. motenireImplementarea direct a relaiei de generalizare/specializare se face prin intermediul motenirii,

    Client

    ClientPrivat ClientSocietate

    Generalizare

    Subtip(subclasa)

    Supertip(superclasa)

    Comanda

    ComandaUrgenta

    ElementComanda ContBancartrece in

    utilizeaza

    *

    GestiuneComenzi

    *Generalizare

    AsociereDependenAgregare

  • 8/3/2019 Curs Poo No Restriction

    36/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Motenire = Clasa derivat motenete din clasa de baz toate atributele i toate operaiileneprivate. Prin intermediul motenirii, o clas obine imediat funcionalitatea unei claseexistente.Exemplu.Presupunem c avem un editor grafic care foloseste clasele din urmtoarea diagram:

    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 atributelorx

    i y).

    AsociereO asociere intre doua clase este o multime de legaturi sau conexiuni intre obiecte a celor douaclase. O asemenea conexiune se chiama link.Un link se poate specifica ca o pereche de obiecte apartinand celor doua clase. Ordinea incadrul perechii, pentru a nu fixa punctul de plecare a relatiei poate fi data de roluri. Un rol esteun nume dat unuia din cei doi membrii ai perechii.Formal, o asociere este o relatie intre multimile de obiecte ale celor doua clase, adica osubmultime 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 persoani un spital poate fi relatia de conducere. Ea indica legaturadintre 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)S id d fi iti d i tii i i t i l tii

    FiguraGeometricax: integery: integervizibila: 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

  • 8/3/2019 Curs Poo No Restriction

    37/86

    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.

    Utilizarea cardinalitatilor1..1 si 0..1 indica numarul de obiecte dintr-o clasa care pot participa laconexiuni cu un acelasi obiect din cealalta clasa, deci se refera la existenta in relatia conduce aunor conditii de tipul:1..1 pr1(conduce) = Spital0..1 pr2 (conduce) PersoanaIn exemplul urmator se introduce intre aceleasi clase Spital si Persoana o alta relatie, aceea deangajare.angajare (Spital Persoana)Un spital, dupa cum se stie, poate angaja mai multe persoane, de altfel nu poate functiona faraangajati. Cu alte cuvinte printre perechile (spital, persoana) va trebui gasim cel putin una pentrufiecare spital. Adica:pr1(angajare) = SpitalO persoana poate fi sau nu angajata unui spital, iar daca este angajata nu poate fi decat a unuispital. Cardinalitatea deci este 0..1 deoarece:pr2 (angajare) PersoanaAm ajuns la aceleasi expresii pentru proiectii, desi cardinalitatea in partea Persoana a relatieieste diferita fata de exemplul precedent. ? Stim din pr1 ca orice spital are angajati, dar cum amputea stii care sunt acesti angajati? Ce lipseste din modelul matematic ca sa putem captura simultiplicitatea aparitiilor de conexiuni cu un acelasi obiect.

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

    Spital

    nume: StringPersoana

    nume: String

    conduce

    0..1 1..1

    + director

    rolnumerelaiedirecie

    asociere multiplicitate

    O1: Spital

    Judetean

    P1:Persoana

    George Sarbu

    director

    link

    O2: Spital

    Municipal

    P3: Persoana

    Ion Popescu

    director

    link

    O3: Spital

    Policlinica

    P4: Persoana

    Pop Ionescu

    director

    link

    P2: Persoana

    Nicu Enescu

    PersoanaSpital

    nume: String nume: String

    angajare

    0..1 1..n

    Persoanacontine

  • 8/3/2019 Curs Poo No Restriction

    38/86

    Luca Dan Serbanati-Programare orientata spre obiect

    Intr-adevar, rolul angajat reprezinta numele unei functii care pentru fiecare spital ne restituiemultimea 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 persoanarestituie o multime de spitale la care persoana este angajata. In cazul de fata aceasta este omultime vida sau cel mult cu un singur spital.patron(Maria Ionescu) = { Municipal }

    Probleme cu clase de obiecte1. 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 alexamenelor. Furnizai un constructor corespunztor i metodele: getNume() pentruobinerea 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. Scrieiconstructorul i urmtoarele metode: afiseazaProdus(), getPret() i setPret(). S se scrie unprogram 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:numrtori numitor. Scriei un constructor care iniializeaz numrtorul cu 0, iar numitorulcu 1. Un alt constructor va stoca fracia n forma redus (de exp, fracia 2/4 ar trebui stocatn obiect ca 1/2). Clasa rational va furniza urmtoarele metode publice ce vor implementaurmtoarele 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.- nmul

    irea a dou

    raionale. Rezultatul va fi un num

    r ra

    ional stocat n forma redus

    .

    - mprirea a dou numere raionale. Rezultatul va fi un numr raional stocat n formaredus.

    - 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 estecorect. Formatul datei introduse este zi/luna/an, air anul trebuie s fie ntre 1901i 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, unulcare 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.

  • 8/3/2019 Curs Poo No Restriction

    39/86

    Luca Dan Serbanati-Programare orientata spre obiect

    4 MOTENIRE I POLIMORFISMMotenirea n Java este indicat prin cuvntul cheie extends n declaraia unei clase:

    class Identificator extends NumeSuperClasa {

    CorpulClasei

    }

    unde Identificatoreste subclasa, iarNumeSupe