Curs-3-PJ

15
Programare Java Curs 3 PROGRAMARE ORIENTATA OBIECT Object Oriented Programming (OOP) Programarea orientata obiect este un concept remarcabil chiar daca in realitate nu este foarte “modern”, el aparand ideatic inca din deceniul opt al mileniului trecut! Ideea centrala este destul de simpla si clara: sa organizam programele intr-un mod care sa oglindeasca modul cum sunt organizate obiectele din lumea reala. In mod normal prezentarea urmatoare ar trebui privita doar ca o recapitulare a principiilor OOP studiate deja in cadrul limbajului C++. Un program este privit in general ca o lista de instructiuni care ii spun calculatorului ce are de facut. Un program este considerat de OOP drept un set de obiecte care lucreaza impreuna cu scopul de a indeplini o sarcina. Ca exemplu sa luam un model practic extrem de intalnit in aceste zile - construirea unui PC din diferite componente separate (placa de baza, placa video, procesor, etc.). Intern, fiecare dintre aceste componente poate fi extrem de complicata si complexa dar cel ce asambleaza intregul nu are nevoie sa stie exact detaliile de functionare interna a fiecarei componente ci doar cateva date foarte concrete: - se vor potrivi aceste componente la nivel fizic? - vor putea lucra impreuna din punct de vedere functional aceste componente? Odata cunoscute interactiunile dintre componente realizarea sistemului final va fi destul de simpla. Programarea orientata obiect se muleaza perfect pe exemplul anterior; programul nostru final se compune din mai multe componente obiecte care trebuie sa interactioneze cu succes. Un obiect este un element independent al unui program, care reprezinta un set de caracteristici corelate si este proiectat pentru a realiza anumite sarcini. Obiectele mai sunt numite si instante. OBIECTE SI CLASE O clasa este un model (sablon) folosit pentru a crea mai multe obiecte cu aceeasi caracteristici. Clasele inglobeaza toate caracteristicile unui anumit set de obiecte. Atunci cand scriem un program intr-un limbaj OOP nu definim obiecte ci clase de obiecte. Clasele sunt folosite pentru a crea obiecte cu care vom lucra apoi direct in program.

description

fgdfgd

Transcript of Curs-3-PJ

  • Programare Java

    Curs 3

    PROGRAMARE ORIENTATA OBIECT Object Oriented Programming (OOP)

    Programarea orientata obiect este un concept remarcabil chiar daca in realitate nu este foarte modern, el aparand ideatic inca din deceniul opt al mileniului trecut! Ideea centrala este destul de simpla si clara: sa organizam programele intr-un mod

    care sa oglindeasca modul cum sunt organizate obiectele din lumea reala.

    In mod normal prezentarea urmatoare ar trebui privita doar ca o recapitulare a

    principiilor OOP studiate deja in cadrul limbajului C++.

    Un program este privit in general ca o lista de instructiuni care ii spun calculatorului

    ce are de facut. Un program este considerat de OOP drept un set de obiecte care

    lucreaza impreuna cu scopul de a indeplini o sarcina.

    Ca exemplu sa luam un model practic extrem de intalnit in aceste zile - construirea

    unui PC din diferite componente separate (placa de baza, placa video, procesor, etc.).

    Intern, fiecare dintre aceste componente poate fi extrem de complicata si complexa

    dar cel ce asambleaza intregul nu are nevoie sa stie exact detaliile de functionare

    interna a fiecarei componente ci doar cateva date foarte concrete:

    - se vor potrivi aceste componente la nivel fizic? - vor putea lucra impreuna din punct de vedere functional aceste componente?

    Odata cunoscute interactiunile dintre componente realizarea sistemului final va fi

    destul de simpla.

    Programarea orientata obiect se muleaza perfect pe exemplul anterior; programul

    nostru final se compune din mai multe componente obiecte care trebuie sa interactioneze cu succes.

    Un obiect este un element independent al unui program, care reprezinta un set de

    caracteristici corelate si este proiectat pentru a realiza anumite sarcini. Obiectele mai

    sunt numite si instante.

    OBIECTE SI CLASE

    O clasa este un model (sablon) folosit pentru a crea mai multe obiecte cu aceeasi

    caracteristici.

    Clasele inglobeaza toate caracteristicile unui anumit set de obiecte. Atunci cand

    scriem un program intr-un limbaj OOP nu definim obiecte ci clase de obiecte.

    Clasele sunt folosite pentru a crea obiecte cu care vom lucra apoi direct in program.

  • Cand scriem un program in Java proiectam si construim un set de clase. Atunci cand

    programul ruleaza din aceste clase sunt create obiecte si apoi acestea sunt folosite.

    Sarcina programatorului Java este de a crea seturile corecte de clase pentru ca

    programul sa se comporte corespunzator.

    In practica nici macar nu trebuie pornit de la zero cu constructia claselor. Fiecare

    versiune de Java contine un grup de clase care implementeaza caracteristicile de baza

    de care au in general nevoie programatorii. Aceste grupe de clase se numesc

    biblioteci.

    O biblioteca de clase este un grup de clase proiectate pentru a fi folosite impreuna cu

    alte programe. Biblioteca de clase Java standard contine mai multe zeci de clase

    (depinzand exact de versiunea limbajului).

    Biblioteca standard Java se ocupa de mai multe sarcini uzuale, cum ar fi functii

    matematice, lucru cu text, imagini, sunet, interactiune cu utilizatorul si lucru in retea.

    In multe cazuri bibliotecile Java sunt de ajuns pentru un program de nivel mediu. In

    acest caz programatorul are ca sarcina doar crearea unei singure clase, folosite pentru

    a crea obiecte pornind de la clasele Java standard si pentru a administra interactiunile

    dintre acestea.

    Odata cu avansarea in programarea Java se poate crea un set complet nou de clase

    care sa aiba definite anumite interactiuni intre ele; acestea pot fi folosite pentru a se

    alcatui eventual o biblioteca proprie de clase care poate fi reutilizata mai tarziu in alte

    programe. Aceasta capacitate de reutilizare este unul dintre avantajele majore ale

    programarii orientate obiect.

    ATRIBUTE SI COMPORTAMENT

    Atributele reprezinta parametrii individuali care diferentiaza o clasa de obiecte de o

    alta si care determina modul de prezentare, starea si alte calitati ale clasei.

    Intr-o clasa atributele sunt definite de variabile. Fiecare obiect poate avea valori

    diferite ale variabilelor sale; acestea se numesc variabile de instanta.

    O variabila de instanta este un element de informatie care defineste atributul unui

    anumit obiect. Clasa obiectului defineste ce fel de atribut este si fiecare instanta isi

    pastreaza propria sa valoare pentru acel atribut. Variabilele de instanta mai sunt

    denumite si variabilele obiectului.

    Fiecarui atribut al unei clase ii corespunde o singura variabila; putem schimba

    atributul unui obiect modificand aceasta variabila.

    Variabilele de instanta pot lua o valoare atunci cand se creeaza un obiect ce ramane

    neschimbat pe toata durata lui de existenta sau pot lua diferite valori pe masura ce

    obiectul este folosit.

    Un alt atribut este folosit pentru descrierea intregii clase de obiecte, nu numai a unui

    singur obiect al clasei. Aceste atribute sunt continute in variabile de clasa.

  • O variabila de clasa este un element de informatie care defineste atributul unei intregi

    clase. Variabila se aplica insasi clasei si tuturor instantelor ei, deci este stocata o

    singura valoare, indiferent cate obiecte ale clasei au fost create.

    COMPORTAMENTUL UNEI CLASE DE OBIECTE

    Comportamentul este modul in care clasele de obiecte pot face ceva cu ele insele sau

    cu alte obiecte. Comportamentul unei clase determina ce obiecte ale clasei isi

    modifica atributele, precum si ce fac ele atunci cand alte obiecte le cer sa faca ceva.

    Comportamentul unei clase de obiecte este determinat cu ajutorul metodelor.

    Metodele sunt grupuri de instructiuni dintr-o clasa de obiecte, care actioneaza asupra

    acesteia sau asupra altor clase sau obiecte. Ele sunt folosite pentru a realiza diferite

    sarcini, in acelasi fel in care in alte limbaje de programare se folosesc functiile.

    Obiectele comunica unele cu altele folosind metodele. O clasa sau un obiect poate

    apela metode dintr-o alta clasa sau obiect pentru mai multe motive:

    - pentru a raporta o modificare unui alt obiect - pentru a comunica altui obiect sa modifice ceva in legatura cu el - pentru a cere unui obiect sa faca ceva

    Asa cum exista variabile de instanta si de clasa, exista si metode de instanta si de

    clasa. Metodele de instanta, numite si simplu metode, actioneaza asupra unui obiect al

    clasei. Daca o metoda efectueaza schimbari doar asupra unui obiect individual ea

    trebuie sa fie o metoda de instanta. Metodele de clasa actioneaza asupra clasei insasi.

    CREAREA UNEI CLASE

    Primul pas este deschiderea editorului de text pe care il folosim pentru a crea

    programe java (fisiere sursa cu extensia.java). Cea mai simpla declaratie de clasa este:

    Class ClasaMea {}

    In continuare sa urmarim exemplul crearii unei clase Persoana.

    class Persoana {

    String culoare;

    String sex;

    boolean flamand; }

    Au fost definite mai sus trei variabile de instanta.

    Prin adaugarea de metode clasei i se poate defini un comportament. Aceste metode

    sunt lucruri pe care le-ar putea face o Persoana in exemplul nostru vor apare doar doua metode: una pentr a hrani persoana si alta pentru a-i verifica atributele.

    void hranescPersoana() {

    if (flamand==true) {

  • System.out.println(Bun foame!); Flamand=false;

    } else

    System.out.println(Nu merci am mancat!); }

    In continuare prezentam listingul celei de a doua metode pentru verificarea atributelor:

    void afisezAtribute() {

    System.out.println(Acesata e o persoana +sex+ +culoare); if (flamand==true) System.out.printl(Persoana este flamanda); else System.out.println(Persoana e satula); }

    In acest moment avem o clasa Persoana cu variabile si metode de instanta ce pot fi

    folosite pentru a afisa si modifica variabilele.

    Pentru a compila programul schimbam directorul curent in directorul care contine

    fisierul nostru sursa si folosim comanda:

    javac Persoana.java

    In cazul in care incercam sa rulam fisierul (cu comanda: java Persoana) vom obtine o

    eroare. Aceasta apare deoarece interpretorul Java presupune ca programul pe care

    incercam sa il executam din linia de comanda este o aplicatie. Atunci cand se executa

    o aplicatie punctul ei de lansare este metoda main(). Deoarece clasa noastra nu poseda

    o metoda main() avem probleme.

    Exista doua metode de a folosi clasa noastra:

    1. Cream, separat, un applet sau o aplicatie java care sa foloseasca aceasta clasa 2. adaugam metoda main() in listingul nostru

    Pentru a adauga metoda main() se introduc urmatoarele:

    public static void main(String argumente[]){ }

    Mai jos avem intregul listing al aplicatiei noastre:

    class Persoana {

    String culoare;

    String sex;

    boolean flamand;

    void hranescPersoana() {

    if (flamand==true) {

    System.out.println("Bun - vrea mancare");

    flamand=false; }

    else

  • System.out.println("Nu multumesc - am mancat deja");

    }

    void afisezAtribute () {

    System.out.println("Aceasta e o persoana de sex " + sex + " " + culoare + ".");

    if (flamand==true)

    System.out.println("Persoana este flamanda");

    else

    System.out.println("Persoana este satula");

    }

    public static void main (String argumente[]) {

    Persoana j=new Persoana();

    j.culoare="portocaliu";

    j.sex="mascul";

    j.flamand=true;

    System.out.println("Apelez afisezAtribute...");

    j.afisezAtribute();

    System.out.println("___");

    System.out.println("Hranesc Persoana...");

    j.hranescJabberwock();

    System.out.println("___");

    System.out.println("Apelez afisezAtribute...");

    j.afisezAtribute();

    System.out.println("---");

    System.out.println("Hranesc Persoana... ");

    j.hranescJabberwock();

    }

    }

    ORGANIZAREA CLASELOR SI COMPORTAMENTUL ACESTORA

    MOSTENIREA

    Mostenirea reprezinta unul dintre cele mai importante concepte ale programarii OOP,

    avand un efect direct asupra modului de proiectare si scriere a claselor noastre Java.

    Mostenirea este un mecanism care permite unei clase sa mosteneasca comportamentul

    si atributele unei alte clase.

    Prin mostenire, o clasa dobandeste imediat tot comportamentul unei clase existente.

    Din acest motiv, noua clasa poate fi creata prin simpla specificare a diferentelor fata

    de clasa existenta.

    Prin mostenire toate clasele sunt aranjate intr-o ierarhie stricta cele pe care le cream si cele provenite din biblioteca Java sau din alte biblioteci.

    O clasa care mosteneste alta clasa este denumita subclasa iar clasa care isi ofera

    mostenirea se numeste superclasa.

  • O clasa poate avea o singura superclasa, insa poate avea un numar nelimitat de

    subclase. Subclasele mostenesc toate atributele si comportamentul superclaselor lor.

    In varful ierarhiei de clase Java se afla clasa Object toate clasele mostenesc aceasta unica superclasa. Object reprezinta cea mai generica clasa din ierarhie, care defineste

    comportamentul si atributele mostenite de toate clasele din biblioteca Java. Fiecare

    clasa aflata mai jos in ierarhie devine din ce in ce mai adaptata unui scop precis. O

    ierarhie de clase defineste conceptele abstracte la varful ierarhiei; aceste concepte

    devin din ce in ce mai concrete odata cu coborarea spre subclase.

    In mod normal, cand cream o noua clasa Java dorim ca ea sa prezinte toate

    caracteristicile unei clase existente, cu unele modificari; de exemplu putem dori o

    versiune a butonului CommandButton care sa produca un zgomot la folosirea sa.

    Pentru a mosteni toate caracteristicile clasei CommandButton fara efort vom defini

    noua noastra clasa ca o subclasa a clasei CommandButton. Clasa noastra va mosteni

    automat comportamentul si atributele superclasei. Tot ceea ce trebuie sa facem este sa

    introducem diferenta fata de superclasa.

    Subclasarea reprezinta crearea unei noi clase, care mosteneste o clasa existenta.

    Singurul lucru care trebuie facut in subclasa este definirea diferentelor in

    comportament si atribute fata de superclasa.

    Cand clasa noastra defineste un comportament complet nou si nu este o subclasa

    atunci ea mosteneste direct clasa Object. Acest lucru ii permite acesteia sa se

    integreze corect in ierarhia claselor Java; in practica, daca definim o clasa care nu

    specifica o superclasa atunci Java presupune automat ca noua clasa mosteneste direct

    clasa Object.

    Atunci cand cream un nou obiect Java pastreaza urma fiecarei variabile definite

    pentru acel obiect si a fiecarei variabile definite pentru fiecare clasa a obiectului. In

    acest fel, toate clasele se combina pentru a forma un model al obiectului curent, iar

    fiecare obiect isi completeaza informatiile corespunzatoare acestei situatii.

    Metodele se comporta in acelasi fel: noile obiecte au acces la toate metodele clasei si

    superclaselor de care apartin. Acest lucru este determinat dinamic, atunci cand o

    metoda este folosita intr-un program aflat in executie. Daca apelam o metoda a unui

    anumit obiect, interpretorul Java verifica mai intai clasa obiectului, pentru a gasi acea

    metoda. Daca metoda nu este gasita interpretorul o cauta in superclasa clasei si asa

    mai departe pana la gasirea definitiei metodei.

    Problema se complica atunci cand o subclasa defineste o metoda cu acelasi nume, tip

    de rezultat si argumente care sunt definite si intr-o superclasa. In acest caz se foloseste

    definitia metodei care este gasita prima (incepand din partea de jos a ierarhiei si

    mergand in sus). Atfel intr-o subclasa putem crea o metoda cu acelasi nume, tip de

    rezultat si argumente ca ale metodei din superclasa; aceasta procedura se numeste

    anulare prin suprascriere sau simplu suprascriere.

    MOSTENIREA SIMPLA SI MULTIPLA

  • Forma de mostenire folosita in Java este denumita mostenire simpla deoarece fiecare

    clasa Java poate avea o singura superclasa.

    In alte limbaje de programare si in C++ - clasele pot avea mai multe superclase, mostenind variabile si metode combinate din toate aceste superclase. Aceasta forma

    de mostenire este denumita mostenire multipla si ofera mijloace de creare a unor clase

    care cuprind aproape orice comportament imaginabil. Totusi, acest lucru complica

    mult definitia clasei si a codului necesar pentru producerea acesteia. Java simplifica

    acest concept permitand doar mostenirea simpla.

    INTERFETE

    Mostenirea simpla face ca relatiile intre clase si comportamentul pe care aceste clase

    il implementeaza sa devina usor de inteles si de proiectat. Totusi ea poate fi restrictiva

    mai ales atunci cand avem un comportament similar care trebuie duplicat pe diferite ramuri ale ierarhiei de clase. Java rezolva aceasta problema a comportamentului

    partajat prin folosirea interfetelor.

    O interfata este o colectie de metode care indica faptul ca o clasa are un anumit

    comportament suplimentar fata de ceea ce mosteneste de la superclasele sale.

    Tehnic vorbind, o interfata Java nu contine nimic altceva decat definitii de metode

    abstracte si constante fara variabile de instanta sau implementari de metode (cuvantul cheie folosit pentru a semnala folosirea unei interfete este implements).

    PACHETE

    Pachetele in Java reprezinta o modalitate de a grupa clasele si interfetele inrudite.

    Pachetele permit grupurilor de clase sa fie disponibile doar daca este nevoie de ele,

    eliminand potentialele conflicte intre numele claselor din diferite grupuri de clase.

    Bibliotecile de clase Java sunt continute intr-un pachet denumit java. Clasele din

    pachetul Java sunt disponibile garantat in orice implementare Java si sunt singurele

    disponibile in diferite implementari. Pachetul Java contine pachete mai mici care

    definesc seturi specifice ale caracteristicilor limbajului Java, cum ar fi caracteristicile

    standard, manipularea fisierelor, multimedia, etc. Clasele din alte pachete, ca sun sau

    netscape, pot fi disponibile doar in anumite implementari.

    In mod prestabilit clasele noastre Java au acces doar la clasele din java.lang

    (caracteristicile de baza ale limbajului). Pentru a folosi clasele din alte pachete trebuie

    sa ne referim explicit la numele pachetului sau sa importam clasele in fisierul nostru

    sursa.

    Pentru a ne referi la o clasa din cadrul unui pachet trebuie sa introducem toate

    pachetele care contin clasa, urmate de numele clasei, elementele fiind separate prin

    puncte. De exemplu sa luam clasa Color. Ea este continuta in pachetul awt, care la

    randul lui este continut in pachetul java. Pentru a referi clasa Color in program trebuie

    folosita notatia java.awt.Color.

    CREAREA UNEI SUBCLASE

  • Cea mai uzuala folosire a subclasarii este la crearea de applet-uri. Crearea applet-

    urilor este diferita de crearea aplicatiilor; applet-urile Java ruleaza ca parte a unei

    pagini web, deci au reguli specifice privind comportamentul lor. Din cauza acestor

    reguli speciale aplicate applet-urilor, crearea unui applet simplu este mai complicata

    decat crearea unei aplicatii simple.

    Toate applet-urile reprezinta subclase ale clasei Applet (care face parte din pachetul

    java.applet). Prin crearea unei subclase a clasei Applet vom mosteni automat

    comportamentul si atributele care permit unui program Java sa ruleze ca parte a unei

    pagini web.

    In continuare vom prezenta un exemplu simplu de applet Java.

    Mai intai vom construi definitia clasei:

    public class Palindrom extends java.applet.Applet {

    . }

    Aceste instructiuni definesc o clasa Palindrom; singurul lucru nou aparut este textul

    extends java.applet.Applet.

    Clauza extends reprezinta modul prin care se declara o clasa ca fiind o subclasa a

    alteia. Clasa Palindrom este o subclasa a clasei Applet, care face parte din pachetul

    java.applet. Pentru a indica in program faptul ca intre cele doua clase exista o relatie

    se foloseste clauza extends.

    Cuvantul cheie public indica faptul ca aceasta clasa a noastra este accesibila altor

    clase care ar putea avea nevoie sa o foloseasca. In mod normal, singurul motiv pentru

    care am avea nevoie sa definim o clasa drept publica este atunci cand dorim ca ea sa

    fie accesata de catre alte clase din programul nostru. Totusi, in cazul applet-urilor

    trebuie sa folosim totdeauna declaratia public.

    Sa adaugam acum o noua instructiune in program:

    Font f=new Font(TimesRoman,Font.BOLD,36);

    Aceasta instructiune realizeaza doua lucruri:

    - se creaza un obiect de tip Font, numit f. Font, componenta a pachetului java.awt, este folosit pentru a reprezenta un font pe ecran. Clasa este folosita

    pentru a afisa un font si un stil diferite de cele folosite implicit de un applet.

    - obiectului Font i se atribuie o valoare de font de 36 de puncte, stil TimesRoman, cu litere aldine. Instructiunea new creaza un nou obiect de tip

    Font avand valorile specificate in paranteze si care este atribuit variabilei f.

    Prin crearea unei variabile de instanta care sa-l contina, am facut obiectul Font

    disponibil tuturor metodelor din clasa noastra. Urmatorul pas in proiectul nostru este

    de a crea o metoda care sa-l foloseasca.

  • Atunci cand scriem applet-uri, exista mai multe metode definite in superclasa Applet,

    care, de obicei, sunt anulate prin suprascriere. Printre acestea exista metode care

    configureaza applet-ul inainte de a fi lansat in executie, care lanseaza applet-ul, care

    raspund la evenimentele mouse-ului sau care elibereaza memoria cand applet-ul isi

    inceteaza executia.

    Una dintre aceste metode este paint(), care se ocupa de orice se intampla cand applet-

    ul este afisat pe pagina web. Metoda paint() mostenita de clasa Palindrom nu face

    nimic este o metoda goala. Prin suprascrierea metodei paint() vom indica ce anume dorim sa fie desenat in fereastra applet-ului, ori de cate ori este nevoie sa se afiseze

    ceva, atunci cand programul ruleaza.

    Sa adaugam la clasa noastra urmatoarele instructiuni:

    public void paint(Graphics ecran) {

    ecran.setFont(f);

    ecran.setColor(Color.red);

    ecran.drawString(Go hang a salami, Im a lasagna hog,5,40); }

    Metoda paint() este declarata public, ca si applet-ul; acest lucru apare deoarece

    metoda pe care o suprascrie este si ea publica. O metoda publica apartinand unei

    superclase nu poate fi suprascrisa decat de o metoda publica, altfel apar erori la

    compilare.

    Metoda paint() preia un singur argument: o instanta a clasei Graphics, denumita la noi

    ecran. Clasa Graphics se ocupa cu reprezentarea fonturilor, culorilor si desenarea

    liniilor si altor forme.

    In metoda paint() se realizeaza trei lucruri:

    - am indicat obiectului Graphics faptul ca fontul pe care vrem sa-l folosim este cel continut in variabila de instanta f

    - am indicat obiectului Graphics faptul ca, culoarea pe care dorim sa o folosim pentru text si alte operatii de desenare este o instanta a clasei Color pentru

    culoarea rosu (red).

    - in final am scris pe ecran un text la coordonatele x,y egale cu 5 si 40.

    La acest moment applet-ul nostru arata astfel:

    public class Palindrom extends java.applet.Applet {

    Font f=new Font("TimesRoman",Font.BOLD,36);

    public void paint(Graphics monitor) {

    monitor.setFont(f);

    monitor.setColor(Color.red);

    monitor.drawString("Go hang a salami, I'm a lasagna hog",5,40);

    }

    }

  • In cazul in care incercam sa compilam acest fisier sursa vom obtine o serie de erori

    de genul: Class not found

    Aceste erori apar deoarece clasele Graphics, Font si Color apartin pachetului java.awt,

    care nu este disponibil implicit. Am referit clasa Applet din prima linie a sursei prin

    numele sau complet incluzand si numele pachetului din care face parte. In restul programului am referit insa celelalte clase fara a folosi numele pachetului din care

    acestea fac parte.

    Exista doua metode pentru a rezolva problema:

    - referim toate clasele externe prin numele lor complet, cum ar fi java.awt.Graphics

    - folosim instructiunea import la inceputul programului pentru a face disponibile unul sau mai multe pachete si clase.

    Pentru o scriere mai usoara si mai rapida a codului sursa se foloseste de obicei a doua

    varianta, fapt tradus in programul nostru prin inserarea liniilor:

    import java.awt.Graphics;

    import java.awt.Color;

    import java.awt.Font;

    Pentru o si mai mare usurinta putem folosi simbolul * in locul unui anumit nume de clasa. Putem astfel folosi instructiunea:

    import java.awt.*;

    Deoarece fisierul sursa contine o clasa publica, Palindrom, numele fisierului trebuie sa

    fie identic cu numele clasei publice cu folosirea corecta a majusculelor si minusculelor.

    Pentru a putea vedea ce am realizat trebuie sa cream o pagina web care sa foloseasca

    applet-ul nostru.

    Vom crea o pagina web cu urmatorul continut:

    - atributul CODE indica numele clasei care contine applet-ul - atributele WIDTH si HEIGHT determina cat de mare va fi fereastra applet-

    ului in cadrul paginii web, exprimat in pixeli.

    In lipsa unui browser putem folosi pentru a vizualiza pagina noastra utilitarul

    appletviewer din pachetul JDK, cu sintaxa:

    appletviewer Palindrom.html

    Acest utilitar, spre deosebire de un browser, va afisa doar applet-urile incluse in

    pagina web, neafisand nimic altceva continut eventual in pagina.

  • OBIECTE

    CREAREA DE NOI OBIECTE

    Atunci cand scriem un program Java de fapt definim un set de clase; clasele sunt

    modele dupa care se genereaza obiecte.

    In cele mai multe situatii vom folosi clasele pentru a crea instante si vom lucra cu

    aceste instante.

    In cursurile anterioare am intalnit o instanta a clasei String creata prin folosirea unui

    literal sir (o serie de caractere incadrate intre ghilimele).

    Celelalte clase Java nu au aceasta posibilitate de creare a unui nou obiect. Crearea de

    noi instante ale acestora se face explicit cu operatorul new.

    Pentru a crea un nou obiect folosim operatorul new impreuna cu numele clasei dupa

    modelul careia dorim sa cream o instanta, urmata de paranteze:

    String numeEchipa=new String();

    Jabberwock j=new Jabberwock();

    Parantezele sunt foarte importante; in cazul in care acestea sunt goale se creaza cel

    mai simplu obiect in cazul in care exista argumente intre ele acestea determina valorile initiale ale variabilelor de instanta sau ale altor calitati initiale ale obiectului

    respectiv:

    Point pt=new Point(0,0);

    Numarul si tipul argumentelor pe care le folosim intre paranteze impreuna cu

    operatorul new sunt definite de clasa folosind o metoda speciala denumita constructor.

    Daca incercam sa cream o noua instanta a clasei folosind un numar gresit de

    argumente sau un tip eronat al acestora vom obtine erori la compilarea programului.

    La folosirea operatorului new se intampla mai multe lucruri: se creaza o noua instanta

    a clasei date, se aloca memorie pentru aceasta si se apeleaza o metoda speciala a

    clasei. Aceasta metoda speciala se numeste constructor.

    Constructorii reprezinta metode speciale pentru crearea si initializarea noilor instante

    ale claselor. Constructorii initializeaza noul obiect si variabilele sale, creaza orice alte

    obiecte de care are nevoie obiectul creat si realizeaza orice alte operatii de care

    obiectul are nevoie la initializarea sa.

    Intr-o clasa pot exista mai multe definitii de constructori, fiecare avand un numar

    diferit de argumente sau tipuri. Atunci cand folosim operatorul new putem specifica

    diferite argumente in lista de argumente si va fi apelat constructorul corespunzator

    pentru acele argumente. La crearea unei clase putem defini oricati constructori avem

    nevoie pentru implementarea comportamentului clasei.

  • GESTIONAREA MEMORIEI

    Gestionarea memoriei in Java se face dinamic si automat. Atunci cand cream un

    obiect nou Java aloca automat o zona de memorie de dimensiunea corespunzatoare

    obiectului. Nu trebuie sa alocam explicit memorie pentru obiecte.

    Deoarece gestionarea memoriei se face automat nu este nevoie sa dezalocam memoria

    ocupata de obiect atunci cand am terminat de lucrat cu acesta. Atunci cand am

    terminat lucrul cu obiectul acesta nu mai poseda nici o referinta activa catre el (nu va

    mai fi atribuit nici unei variabile pe care o folosim sau nu va mai fi stocat in vreun

    tablou). Java poseda un garbage collector care cauta obiectele nefolosite si recupereaza memoria ocupata de acestea. Nu trebuie sa eliberam explicit acea zona de

    memorie.

    ACCESAREA SI STABILIREA VARIABILELOR DE CLASA SI DE INSTANTA

    Variabilele de clasa si de instanta se comporta in acelasi fel ca si variabilele locale.

    Trebuie doar sa ne referim la ele intr-o modalitate usor diferita.

    OBTINEREA VALORILOR

    Pentru a obtine valoarea unei variabile de instanta vom folosi notatia cu punct. In

    aceasta notatie variabila de instanta sau de clasa este formata din doua parti: obiectul,

    in partea stanga a punctului si variabila, in partea dreapta.

    De exemplu, daca avem un obiect atribuit variabilei clientulMeu si acel obiect poseda

    o variabila denumita totalFactura atunci ne vom referi la aceasta variabila astfel:

    clientulMeu.totalFactura;

    Aceasta forma de accesare a variabilelor este o expresie (deoarece intoarce o valoare)

    in care de ambele parti ale punctului se afla tot expresii. Acest lucru inseamna ca

    putem insera mai multe variabile de instanta. Daca variabila totalFactura refera ea

    insasi un obiect care poseda propria variabila de instanta numita rezervat, putem sa ne

    referim la aceasta astfel:

    clientulMeu.totalFactura.rezervat;

    Expresiile cu punct sunt evaluate de la stanga spre dreapta, asa incat se va incepe cu

    variabila din clientulMeu, totalFactura, care refera un alt obiect cu variabila rezervat.

    In final vom obtine valoarea variabilei rezervat.

    MODIFICAREA VALORILOR

    Atribuirea unei valori acelei variabile se face pur si simplu prin utilizarea operatorului

    de atribuire:

  • clientulMeu.totalFactura.rezervat=true;

    In continuare avem un exemplu simplu de accesare a variabilelor prin notatia cu

    punct:

    import java.awt.Point;

    class DefinirePuncte {

    public static void main(String argumente[]) {

    Point pozitie=new Point(4,13);

    System.out.println(Pozitia de inceput:); System.out.println(X egal +pozitie.x); System.out.println(Y egal +pozitie.y); System.out.println(\nSe muta in (7,6)); pozitie.x=7;

    pozitie.y=6;

    System.out.println(Pozitia finala:); System.out.println(X egal +pozitie.x); System.out.println(Y egal +pozitie.y); }

    }

    VARIABILE DE CLASA

    Dupa cum am vazut o variabila de clasa este definita si memorata chiar in clasa

    respectiva. Valorile variabilelor de clasa se aplica clasei si tuturor instantelor sale.

    In cazul variabilelor de instanta fiecare noua instanta primea o copie a variabilelor de

    instanta definite in clasa. Fiecare instanta poate modifica apoi valorile acestor

    variabile fara a afecta alte instante. In cazul variabilelor de clasa exista o singura copie

    a acesteia. Modificarea valorii sale este vizibila in toate instantele clasei.

    Variabilele de clasa se definesc prin inserarea cuvantului cheie static inaintea numelui

    variabilei. De exemplu, sa luam urmatoarea definitie de clasa:

    class MembruFamilie {

    static String numeFamilie=Popescu; String prenume;

    int varsta;

    }

    Instantele clasei noastre poseda propriile valori pentru prenume si varsta insa variabila

    de clasa numeFamilie are o valoare comuna pentru toti membrii familiei. Daca se

    modifica valoarea acestei variabile toate instantele clasei MembruFamilie vor fi

    afectate.

    Pentru accesarea acestor variabile de clasa se foloseste aceeasi notatie cu punct.

    Pentru a obtine sau modifica valoarea unei variabile de clasa in partea stanga a

    punctului putem folosi atat numele instantei cat si al clasei. Ambele linii urmatoare

    vor afisa aceeasi valoare:

  • MembruFamilie tata=new MembruFamilie();

    System.out.println(Numele +tata.numeFamilie); System.out.println(Numele +MembruFamilie.numeFamilie);

    In practica este recomandabil sa folosim numele de clasa in stanga punctului cand ne

    referim la o variabila de clasa. Astfel codul va fi mai usor de citit si depanat.

    APELAREA METODELOR

    Apelarea unei metode a unui obiect este asemanatoare referirii variabilelor de

    instanta: folosim notatia cu punct. Obiectul a carui metoda o apelam este in stanga

    punctului iar numele metodei si ale argumentelor sale in dreapta:

    clientulMeu.adaugInFactura(codProdus,pret);

    Mentionez din nou ca toate metodele sunt obligatoriu urmate de paranteze cu sau fara argumente.

    Daca metoda apelata returneaza un obiect care poseda la randul lui metode putem

    imbrica metodele la fel ca la variabile. Urmatorul exemplu apeleaza metoda

    discutaCuDirectorul(), care este definita in obiectul returnat de metoda

    anuleazaToateComenzile(), care a fost definita in obiectul clientulMeu:

    clientulMeu.anuleazaToateComenzile().discutaCuDirectorul();

    System.out.println() metoda cea mai folosita pana acum este un exemplu de imbricare a variabilelor si metodelor. Clasa System, parte a pachetului java.lang,

    descrie comportamentul specific sistemului pe care ruleaza Java.

    System.out este o variabila de clasa care contine o instanta a clasei PrintStream. Acest

    obiect PrintStream reprezinta iesirea standard a sistemului, care in mod normal este

    ecranul. Obiectele PrintStream poseda o metoda println() care trimite un sir catre

    fluxul de iesire.

    In exemplul de mai jos vom putea vedea cele mai utilizate metode definite in clasa

    String:

    class VerificareSir {

    public static void main(String argumente[]) {

    String str=In viata mea urmatoare, voi crede in reincarnare; System.out.println(Sirul este: +str); System.out.println(Lungimea sirului este:+str.length()); System.out.println(Caracterul din pozitia 7: +str.charAt(7)); System.out.println(Subsirul de la 9 la 11: +str.substring(9,11)); System.out.println(Indexul caracterului u: +str.indexOf(u)); System.out.println(Indexul inceputului +subsirului \voi\: +str.indexOf(voi)); System.out.println(Sirul scris cu litere mari: +str.toUpperCase()); }

  • }

    METODE DE CLASA

    Metodele de clasa, ca si variabilele de clasa, se aplica unei clase in intregul sau si nu

    instantelor sale. Metodele de clasa sunt utilizate de obicei drept metode de uz general,

    care nu pot opera direct asupra unei instante a clasei, dar se potrivesc conceptual in

    cadrul clasei. De exemplu, clasa String contine o metoda numita valueOf(), care poate

    prelua mai multe tipuri de argumente (intregi, booleeni, alte obiecte s.a.m.d.). Metoda

    valueOf() intoarce o noua instanta a clasei String, care contine valoarea argumentului

    sub forma de sir. Aceasta metoda nu opereaza direct asupra unei instante String insa

    obtinerea unui sir dintr-un alt tip de data este in mod clar o operatie apartinand clasei

    String si are deci sens sa fie definita in clasa String.

    Metodele de clase pot fi de asemenea folositoare pentru adunarea unor metode

    generale intr-un singur loc (o clasa). De exemplu, clasa Math, definita in java.lang,

    contine un set larg de operatii matematice definite ca metode de clase nu exista instante ale clasei Math si totusi putem folosi metodele sale impreuna cu argumente

    booleene sau numerice. De exemplu sa luam metoda de clasa Math.max:

    Int pretMaxim=Math.max(primulPret,alDoileaPret);

    Ca si in cazul variabilelor de clasa accesarea metodelor de clasa se poate face folosind

    in stanga punctului fie numele clasei fie numele de instanta.

    Exemplul de mai jos va produce acelasi rezultat in ultimele sale doua linii:

    String s,s2;

    s=articol; s2=s.valueOf(5);

    s2=String.valueOf(5);