+ All Categories
Home > Documents > Limbajul de programare Java

Limbajul de programare Java

Date post: 14-Apr-2018
Category:
Upload: daniel-ghiulai
View: 279 times
Download: 3 times
Share this document with a friend

of 192

Transcript
  • 7/30/2019 Limbajul de programare Java

    1/192

    Ce este Java ?

    Limbajul de programare Java

    Java este un limbaj de programare de nivel nalt, dezvoltat de JavaSoft, companie n cadrul firmei Sun

    Microsystems.

    Dintre caracteristicile principale ale limbajului amintim:

    simplitate - elimina suprancarcarea operatorilor, mostenirea multipla si toate "facilitatile" cepot provoca scrierea unui cod confuz

    robustete - elimina sursele frecvente de erori ce apar in programare prin eliminareapointerilor, administrarea automata a memoriei si eliminarea fisurilor de memorie printr-oprocedura de colectare a 'gunoiului' care ruleaza n fundal. Un program Java care a trecut decompilare are proprietatea ca la executia sa nu "crape sistemul"

    complet orientat pe obiecte - elimina complet stilul de programare procedural usurinta in ceea ce priveste programarea in retea securitate - este cel mai sigur limbaj de programare disponibil n acest moment, asigurnd

    mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamica acodului pentru detectarea secventelor periculoase, impunerea unor reguli stricte pentru rulareaprogramelor lansate pe calculatoare aflate la distanta

    este neutru din punct de vedere arhitectural portabililtate - cu alte cuvinte Java este un limbaj independent de platforma de lucru,aceeasi aplicatie ruland, fara nici o modificare, pe sisteme diferite cum ar fi Windows, UNIX

    sau Macintosh, lucru care aduce economii substantiale firmelor care dezvolta aplicatii pentruInternet.

    compilat si interpretat asigura o performanta ridicata a codului de octeti permite programarea cufire de executie (multitheaded) dinamicitate este modelat dupa C si C++, trecerea de la C, C++ la Java facndu-se foarte usor. permite creearea unor documente Web mbunatatite cu animatie si multimedia.

    Java - un limbaj compilat si interpretat

    In functie de modul de executie al programelor, limbajele de programare se mpart n doua categorii :

    interpretate - instructiunile sunt citite linie cu linie de un program numit interpretor sitraduse n instructiuni masina; avantaj - simplitate; dezavantaj - viteza de executie redusa

  • 7/30/2019 Limbajul de programare Java

    2/192

    compilate - codul sursa al programelor este transformat de compilator ntr-un cod ce poate fiexecutat direct de procesor; avantaj - executie rapida; dezavantaj - lipsa portabilitatii, codulcompilat ntr-un format de nivel scazut nu poate fi rulat dect pe platforma pe care a fostcompilat.

    Programele Java pot fi att interpretate ct si compilate.

    Codul de octeti este diferit de codul masina. Codul masina este reprezentat de o succesiune de 0 si 1;codurile de octeti sunt seturi de instructiuni care seamana cu codul scris n limbaj de asamblare. Codulmasina este executat direct de catre procesor si poate fi folosit numai pe platforma pe care a fost creat;codul de octeti este interpretat de mediul Java si de aceea poate fi rulat pe orice platforma carefoloseste mediul de executie Java.

    Cod sursa Java -> (compilare) -> Cod de octeti ->(interpretare)

    Crearea unei aplicatii simple

    1. Scriererea codului sursaclass FirstApp {

    public static void main( String args[]) {System.out.println("Hello world");

    }}

    Toate aplicatiile Java contin o clasa principala (primara) n care trebuie sa se gaseasca metodamain.Clasele aplicatiei se pot gasi fie ntr-un singur fisier, fie n mai multe.

    2. Salvarea fisierelor sursaSe va face n fisiere cu extensia.java

    Fiserul care contine codul sursa al clasei primare trebuie sa aiba acelasi nume cu clasa primara a

    aplicatiei (clasa care contine metodamain)

    Obs: Java face distinctie ntre literele mari si mici.

    C:/java/FirstApp.java

    3. Compilarea aplicatieiSe foloseste compilatorul Java, javac

    Apelul compilatorului se face pentru fisierul ce contine clasa principala a aplicatiei.Compilatorul creeaza cte un fisier separat pentru fiecare clasa a programului; acestea auextensia .class si sunt plasate n acelasi director cu fisierele sursa.

    javac FirstApp.java -> FirstApp.class

    4. Rularea aplicatiei

  • 7/30/2019 Limbajul de programare Java

    3/192

    Se face cu interpretorul java, apelat pentru unitatea de compilare corespunzatoare clasei

    principale, fiind nsa omisa extensia.class asociata acesteia.

    java FirstApp

    Rularea unei aplicatii care nu foloseate interfata grafica, se va face ntr-o fereastra sistem.

    Crearea unui applet

    Crearea structurii de fisere si compilarea applet-urilor sunt identice ca n cazul aplicatiilor. Difera nschimb structura programului si modul de rulare al acestuia.

    1. Scrierea codului sursa si salvarea n fisierimport java.awt.* ;import java.applet.* ;public class FirstApplet extends Applet {

    Image img;public void init() {

    img = getImage(getCodeBase(), "taz.gif");}public void paint (Graphics g) {

    g.drawImage(img, 0, 0, this);g.drawOval(100,0,150,50);g.drawString("Hello! My name is Taz!", 110, 25);

    }

    }Salvarea se va face n fisierulFirstApplet.java

    2. Compilarea applet-uluijavac FirstApplet.java -> FirstApplet.class

    3. Rularea applet-uluiApplet-urile nu ruleaza independent. Ele pot fi rulate doar prin intermediul unui browser :Internet Explorer, Netscape sau printr-un program special cum ar fi appletviewer-ul din setulJDK.

    Crearea unui fisier HTML pentru miniaplicatie (exemplu.html)

    First Java Applet

  • 7/30/2019 Limbajul de programare Java

    4/192

    Vizualizarea appletului

    appletviewer exemplu.html

    Structura lexicala a limbajului

    Setul de caractere

    Limbajului Java lucreaza n mod nativ folosind setul de caractere Unicode.

    Acesta este un standard international care nlocuieste vechiul set de caractere ASCII si care folosestepentru reprezentarea caracterelor 2 octeti, ceea ce nseamna ca se pot reprezenta 65536 de semne, spredeosebire de ASCII, unde era posibila reprezentarea a 256 de caractere.

    Primele 256 caractere Unicode corespund celor din ASCII, referirea la celelate facndu-se prin

    \uxxxx, unde xxxx reprezinta codul caracterului.

    Ex:

    \u0030 - \u0039 : cifre ISO-Latin 0 - 9 \u0660 - \u0669 : cifre arabic-indic 0 - 9 \u4e00 - \u9fff : litere din alfabetul Han (Chinez, Japonez,

    Coreean)

    Cuvinte cheie

    Cuvintele rezervate n Java sunt cele din C++, cu cteva exceptii

    Identificatorii

    Sunt secvente nelimitate de litere si cifre Unicode, ncepand cu o litera. Identificatorii nu au voie safie identici cu cuvintele rezervate.

    Literalii (constantele)

    Literalii pot fi de urmatoarele tipuri

    literali ntregi - sunt acceptate 3 baze de numeratie : baza 10, baza 16 (ncep cu caracterele0x) si baza 8 (ncep cu cifra 0) si pot fi de doua tipuri:

    o normali, (se reprez pe 4 octeti - 32 biti)o lungi (8 octeti - 64 biti) : se termina cu caracterul L (sau l).

    literali flotanti - pentru ca un literal sa fie considerat flotant el trebuie sa aiba cel putin ozecimala dupa virgula, sa fie n notatie exponentiala sau sa aiba sufixul F sau f pentru valorilenormale (reprez. pe 32 biti), respectiv D sau d pentru valorile duble (reprez. pe 64 biti)

    literali logicitrue : valoarea booleana de adevarfalse : valoarea booleana de fals

    Atentie: spre deosebire de C++, literalii ntregi 1 si 0 nu mai au rolul de adevarat si false

  • 7/30/2019 Limbajul de programare Java

    5/192

    literali caracter - un literal de tip caracter este utilizat pentru a exprima caracterele coduluiUnicode. Reprezentarea se face fie folosind o litera, fie o secventa escape scrisa ntreapostrofuri. Secventele escape permit reprezentarea caracterelor care nu au reprezentaregrafica si reprezentarea unor caractere speciale precum backslash, caracterul apostrof, etc.

    Secvente escape predefinite n Java:

    Cod Secventa Escape Caracter

    \u0008 '\b' Backspace(BS)

    \u0009 '\t' Tab orizontal (HT)

    \u000a '\n' Linie noua - linefeed (LF)

    \u000c '\f' Pagina noua - formfeed (FF)

    \u000d '\r' Inceput de rand (CR)

    \u0022 '\"' Ghilimele

    \u0027 '\'' Apostrof

    \u005c '\\' Backslash

    literali siruri de caractere - un literal sir de caractere este format din zero sau mai multecaractere ntre ghilimele. Caracterele care formeaza sirul de caractere pot fi caractere graficesau secvente escape ca cele definite la literalii caracter. Daca sirul este prea lung el poate fiscris ca o concatenare de subsiruri de dimensiune mai mica. Concatenarea sirurilor se face cu

    operatorul + ("Ana " + " are " + " mere "). Sirul vid este "". Dupa cum vom

    vedea, orice sir este de fapt o instanta a claseiString, definita n pachetul java.lang.

    Separatori

    Un separator este un caracter care indica sfrsitul unei unitati lexicale si nceputul alteia. In Java

    separatorii sunt urmatorii: ( ) { } [ ] ; , .

    Instructiunile unui program se separa cu punct si virgula.

    Operatori

    atribuirea: = operatori matematici:+, -, *, /, %

    Este permisa notatia prescurtata de formalval op= rval (ex: n += 2)

    Exista operatorii pentru autoincrementare si autodecrementare (post si pre)ex: x++, ++x, n--, --n

    Observatie: evaluarea expresiilor logice se face prin metodascurtcircuitului (evaluarea seopreste n momentul n care valoarea de adevar a expresiei este sigur determinata)

    operatori logici: &&(and), ||(or), !(not) operatori relationali: > (shift la dreapta fara semn) operatorul if-else: expresie_logica ? val_pt_true : val_pt_false ; operatorul , (virgula) folosit pentru evaluarea secventiala a operatiilorint x=0, y=1,

    z=2; operatorul + pentru concatenarea sirurilor:

    String s="abcd"

  • 7/30/2019 Limbajul de programare Java

    6/192

    int x=100;System.out.println(s + " - " + x);

    operatori pentru conversii (cast) : (tip_de_data)

    int i = 200;long l = (long)i; //widening conversion - conversie prinextensielong l2 = (long)200;int i2 = (int)l2; //narrowing conversion - conversie princontractie

    Comentarii

    In Java exista trei feluri de comentarii:

    Comentarii pe mai multe linii, nchise ntre /* si */. Comentarii pe mai multe linii care tin de documentatie, nchise ntre /** si */. Textul dintre

    cele dou secvente este automat mutat n documentatia aplicatiei de catre generatorul automat

    de documentatie javadoc. comentarii pe o singura linie care ncep cu //.

    Observatii:

    1. nu putem sa scriem comentarii n interiorul altor comentarii.2. nu putem introduce comentarii n interiorul literalilor caracter sau sir de caractere.3. secventele /* si */ pot sa apara pe o linie dupa secventa // dar si pierd semnificatia; la fel se

    ntmpl cu secventa // n comentarii care ncep cu /* sau /**.

    Tipuri de date

    In Java tipurile de date se mpart n doua categorii: tipuri primitive de date si tipuri referinta. Javaporneste de la premiza ca "orice este un obiect". Asadar tipurile de date ar trebui sa fie de fapt definitede clase si toate variabilele ar trebui sa memoreze de fapt instante ale acestor clase (obiecte).

    In principiu acest lucru este adevarat, nsa, pentru usurinta programarii, mai exista si asa numiteletipurile primitive de date, care sunt cele uzuale :

    aritmeticeo ntregi: byte (1 octet), short (2), int (4), long (8)o reale: float (4 octeti), double (8)

    caracter -char (2 octeti) logic - boolean (true si false)

    In alte limbaje formatul si dimensiunea tipurilor primitive de date folosite ntr-un program potdepinde de platforma pe care ruleaza programul. In Java acest lucru nu mai este valabil, oricedependenta de o anumita platforma specifica fiind eliminata.

    Vectorii, clasele si interfetele sunt tipuri referinta. Valoarea unei variabile de acest tip este, ncontrast cu tipurile primitive, o referinta (adresa de memorie) catre valoarea sau multimea de valorireprezentata de variabila respectiva.

  • 7/30/2019 Limbajul de programare Java

    7/192

    Exista trei tipuri de date C care nu sunt suportate de limbajul Java. Acestea sunt: pointer,

    struct si union. Pointerii au fost eliminati din cauza ca erau o sursa constanta de erori, locul lorfiind luat de tipul referinta, iar struct si union nu si mai au rostul att timp ct tipurile compuse dedate sunt formate n Java prin intermediul claselor.

    Variabile

    Variabilele pot avea ca tip fie un tip primitiv de data, fie o referinta la un obiect.

    Declararea variabilelor Tip nume_variabila

    Initializarea variabilelorTip nume_variabila = valoare

    Declararea constantelor final Tip nume_variabila

    Conventia de notare a variabilelor in Java este data de urmatoarele criterii:

    variabilele finale (constante) se scriu cu majuscule variabilele normale se scriu astfel - prima litera cu litera mica, daca numele variabilei esteformat din mai multi atomi lexicali, atunci primele litere ale celorlalti atomi se scriu cumajuscule, de exemplu:

    final double PI = 3.14;int valoare = 100;long numarElemente = 12345678L;String bauturaMeaPreferata = "apa";

    In functie de locul n care sunt declarate variabile se mpart n urmatoatele categorii:

    variabile membre - declarate n interiorul unei clase, vizibile pentru toate metodele claseirespective si pentru alte clase n functie de nivelul lor de acces variabile locale - declarate ntr-o metoda sau ntr-un bloc de cod, vizibile doar n

    metoda/blocul respectiv

    Parametri metodelor - vizibili doar n metoda respectiva Parametrii de la tratarea exceptiilor

  • 7/30/2019 Limbajul de programare Java

    8/192

    Obs: variabilele declarate ntr-unfor pentru controlul ciclului, ramn locale corpului ciclului.

    for(int i=0; i

  • 7/30/2019 Limbajul de programare Java

    9/192

    Instructiuni de salt

    for

    for(initializare; exp_booleana; pas_iteratie)Ex: for(int i=0, j=100 ; i0; i++, j--)

    {/* ... /*}

    Obs: att la initializare ct si n pasul de iteratie pot fi mai multeinstructiuni despartite prin virgula.

    whilewhile (exp_booleana) {

    /*...*/}

    do-while

    do {/*...*/

    }while (exp_booleana) ;

    Instructiuni pentru tratarea exceptiilor

    try-catch-finally,throw

    -utilizate pentru tratarea exceptiilor

    Alte instructiuni

    break paraseste fortat corpul iteratiei curente

    continue termina fortat iteratia curenta

    returnreturn [valoare];

    Termina o metoda

    label: Defineste o eticheta

    Atentie: In Java nu exista goto. Se pot nsa defini etichete de forma nume_eticheta:, folosite n

    expresii de genul: break nume_eticheata sau continue nume_eticheta

    Exemplu:i=0;eticheta:while (i

  • 7/30/2019 Limbajul de programare Java

    10/192

    Tip[] numeVector; sau

    Tip numeVector[];

    Ex: int[] intregi;String adrese[];

    2. InstantiereaSe realizeaza prin intermediul operatorului new si are ca efect alocarea memoriei pentruvector, mai precis specificarea numarului maxim de elemente pe care l va avea vectorul;

    numeVector = new Tip[dimensiune];Ex: v = new int[10]; //se aloca spatiu pentru 10 intregi

    adrese = new String[100];

    Obs: declararea si instantierea unui vector pot fi facute simultan astfel:

    Tip[] numeVector = new Tip[dimensiune];

    3. Initializarea (optional)Dupa declararea unui vector, acesta poate fi initializat, adica elementele sale pot primi nistevalori initiale, evident daca este cazul pentru asa ceva. In acest caz instantierea lipseste,alocarea memoriei facndu-se automat n functie de numarul de elemente cu care seinitializeaza vectorul.

    Ex: String culori[] = {"Rosu", "Galben", "Verde"};int []factorial = {1, 1, 2, 6, 24, 120};

    Observatii:

    Primul indice al unui vector este 0, deci pozitiile unui vector cu n elemente vor fi cuprinse ntre 0si n-1

    Nu sunt permise constructii de genulTip numeVector[dimensiune], alocarea memorieifacndu-se doar prin intermediul opearatoruluinew.

    Ex: int v[10]; //ilegalint v[] = new int[10]; //corect

    Vectori multidimensionali

    In Java tablourile multidimensionale sunt de fapt vectori de vectori.

    Ex: int m[][]; //declararea unei matricim = new int[5][10]; //cu 5 linii, 10 coloane

    Obs: m[0], m[1], ..., m[5] sunt vectori de intregi cu 10 elemente

    Dimensiunea unui vector - cu ajutorul cuvntului cheie length se poate afla dimensiunea unuivector.

    int []a = new int[5];

  • 7/30/2019 Limbajul de programare Java

    11/192

    a.length are valoarea 5int m = new int[5][10];m[0].length are valoarea 10

    Copierea vectorilor - Copierea unui vector n alt vector se face cu ajutorul metodei

    System.arraycopy:

    int x[] = {1, 2, 3, 4};int y[] = new int[4];System.arraycopy(x,0,y,0,x.length);

    Vectori cu dimensiune variabila

    Implementarea vectorilor cu numar variabil de elemente este oferita de clasaVector din

    pachetul java.util. Un obiect de tip Vector contine numai elemente de tip Object.

    Siruri de caractere

    In Java, un sir de caractere poate fi reprezentat printr-un vector format din elemente de tipchar, un

    obiect de tip String sau un obiect de tip StringBuffer.

    Declararea unui sir

    Daca un sir de caractere este constant atunci el va fi declarat de tipulString, altfel va fi declarat cu

    StringBuffer. Exemple echivalente de declarare a unui sir:

    String str = "abc";char data[] = {'a', 'b', 'c'};String str = new String(data);String str = new String("abc");

    Concatenarea sirurilorConcatenarea sirurilor de caractere se face prin intermediul operatorului+.

    String str1 = "abc" + "xyz";String str2 = "123";String str3 = str1 + str2;

    In Java, operatorul de concatenare + este extrem de flexibil n sensul ca permite concatenarea sirurilorcu obiecte de orice tip care au o reprezentare de tip sir de caractere.

    System.out.print("Vectorul v are" + v.length + " elemente")

    Folosirea argumentelor de la linia de comanda

    O aplicatie Java poate primi oricte argumente de la linia de comanda n momentul lansarii ei. Acesteargumente sunt utile pentru a permite utilizatorului sa specifice diverse optiuni legate de functionareaaplicatiei sau sa furnizeze anumite date initiale programului.

    Atentie - Programele care folosesc argumente de la linia de comanda nu sunt 100% pure Java

    deoarece unele sisteme de operare cum ar fi Mac OS nu au n mod normal linie de comanda.

  • 7/30/2019 Limbajul de programare Java

    12/192

    Argumentele de la linia de comanda sunt introduse la lansarea unei aplicatii, fiind specificate dupa

    numele aplicatiei si separate prin spatiu. De exemplu, sa presupunem ca aplicatiaSort ordoneazalexicografic liniile unui fisier si primeste ca argument numele fisierului pe care sa l sorteze.

    Pentru a ordona fisierul "persoane.txt" lansarea aplicatiei se va face astfel:

    java Sort persoane.txt

    Asadar, formatul general pentru lansarea unei aplicatii care primeste argumente de la linia decomanda este:

    java NumeAplicatie [arg1 arg2 . . . argn]

    In cazul n care sunt mai multe, argumentele trebuie separate prin spatii iar daca unul dintreargumente contine spatii, atunci el trebuie pus ntre ghilimele. Evident, o aplicatie poate sa nuprimeasca nici un argument sau poate sa ignore argumentele primite de la linia de comanda.

    In momentul lansarii unei aplicatii interpretorul parcurge linia de comanda cu care a fost lansataaplicatia si, n cazul n care exista, transmite aplicatiei argumentele specificate sub forma unui vector

    de siruri. Acesta este primit de aplicatie ca parametru al metodeimain.

    Reamintesc ca formatul metodeimain din clasa principala este:

    public static void main ( String args[])

    Vectorul primit ca parametru de metoda main va contine toate argumentele transmise programului dela linia de comanda.

    In cazul apelului java Sort persoane.txt vectorul args va contine un singur element

    args[0]="persoane.txt".

    Numarul argumentelor primite de un program este dat deci de dimensiunea vectoruluiargs si acesta

    poate fi aflat prin intermediul atributuluilength al vectorilor:

    numarArgumente = args.length ;

    Spre deosebire ce C/C++ vectorul primit de metoda main nu contine pe prima pozitie numeleaplicatiei, ntruct n Java numele aplicatiei este numele clasei principale, adica a clasei n care segaseste metoda main.

    Exemplu: afisarea argumentelor primite la linia de comanda

    public class Echo {public static void main (String[] args) {for (int i = 0; i < args.length; i++)

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

    }

    Un apel de genul java Echo Drink Hot Java va produce urmatorul rezultat:

    Drink

    HotJava

  • 7/30/2019 Limbajul de programare Java

    13/192

    (aplicatia Echo a primit 3 argumente).

    Una apel de genul java Echo "Drink Hot Java" va produce urmatorul rezultat:Drink Hot Java

    (aplicatia Echo a primit un singur argument).

    Argumente numerice la linia de comanda

    Argumentele de la linia de comanda sunt primite sub forma unui vector de siruri (obiecte de tip

    String). In cazul n care unele dintre acestea reprezinta valori numerice ele vor trebui convertite din

    siruri n numere. Acest lucru se realizeaza cu metode de tipulparseXXX aflate n clasacorespunzatoare tipului n care vrem sa facem conversia:Integer, Float, Double,

    Sa consideram, de exemplu, ca aplicatiaPower ridica un numar real la o putere ntreaga, argumentelefiind trimise de la linia de comanda:

    java Power "12.1" "3" //ridica 12.1 la puterea 3

    Conversia celor doua argumente n numere se va face astfel:

    double numar;int putere;numar = Double.parseDouble(args[0]);putere = Integer.parseInt(args[1]);

    Metodele de tipul parseXXX pot produce exceptii (erori) de tipul NumberFormatException ncazul n care sirul primit ca parametru nu reprezinta un numar de tipul respectiv.

    Obiecte si clase in Java

    Ciclul de viata al unui obiect

    Crearea obiectelor

    In Java obiectele sunt create prin instantierea unei clase, cu alte cuvinte prin crearea unei instante aunei clase. Crearea unui obiect presupune trei lucruri:

    1. Declararea obiectuluiNumeClasa numeObiect;Ex: Rectangle patrat;

    2. InstantiereaSe realizeaza prin intermediul operatoruluinew si are ca efect crearea efectiva a obiectului cualocarea spatiului de memorie corespunzator.

    patrat = new Rectangle();

    3. InitializareaSe realizeaza prin intermediul constructorilor clasei respective.Rectangle() este un apel

  • 7/30/2019 Limbajul de programare Java

    14/192

    catre constructorul clasei Rectangle care este responsabil cu initializarea obiectului.Initializarea se poate face si cu anumiti parametri, cu conditia sa existe un constructor alclasei respective care sa accepte parametrii respectivi;

    patrat = new Rectangle(0, 0, 100, 200);

    Fiecare clasa are un set de constructori care se ocupa cu initializare obiectelor nou create. De

    exemplu clasa Rectangle are urmatorii constructori:

    public Rectangle(Point p)public Rectangle(int w, int h)public Rectangle(Point p, int w, int h)public Rectangle()

    Declararea, instantierea si initializarea obiectului pot aparea pe aceesi linie (cazul cel mai uzual):Rectangle patrat = new Rectangle(0, 0, 100, 200);

    Este posibila si crearea unor obiecte anonime care servesc doar pentru initializarea altor obiecte, cazn care etapa de declarare a obiectului nu mai este prezenta:

    patrat.origin = new Point(0, 0);//se creeaza un obiect anonim de tip Point care,//dupa executarea atribuirii este automat distrus de catre

    sistem

    AtentieSpatiul de memorie nu este pre-alocatDeclararea unui obiect nu implica alocarea de spatiu de memorie pentru acel obiect.

    Rectangle patrat;patrat.x = 10; //EROARE!

    Alocarea memoriei se face doar la apelul instructiunii new !

    Folosirea obiectelor

    Odata un obiect creat, el poate fi folosit n urmatoarele sensuri: aflarea unor informatii despre obiect,schimbarea starii sale sau executarea unor actiuni. Aceste lucruri se realizeaza prin:

    aflarea sau schimbarea valorilor variabilelor sale apelarea metodelor sale.

    Referirea valorii unei variabile se face prin obiect.variabila . De exemplu clasa Rectangle

    are variabilele publicex, y, width, height, origin.

    Aflarea valorilor acestor variabile sau schimbarea lor se face prin constructii de genul:

    Rectangle patrat = new Rectangle(0, 0, 100, 200);System.out.println(patrat.width); //afiseaza 100patrat.x = 10;patrat.y = 20; //schimba origineapatrat.origin = new Point(10, 20); //schimba originea

    Obs: Accesul la variabilele unui obiect se face n conformitate cu drepturile de acces pe care le oferavariabilele respective celorlalte clase.

    Apelul unei metode se face prinobiect.metoda([parametri])

  • 7/30/2019 Limbajul de programare Java

    15/192

    Rectangle patrat = new Rectangle(0, 0, 100, 200);patrat.setLocation(10, 20); //schimba origineapatrat.setSize(200, 300); //schimba dimensiunea

    Se observa ca valorile variabilelor pot fi modificate indirect prin intermediul metodelor.Programarea orientata obiect descurajeaza folosirea directa a variabilelor unui obiect deoarece acestapoate fi adus n stari inconsistente (ireale). In schimb, pentru fiecare variabila a obiectului trebui saexiste metode care sa permita aflarea/schimbarea valorilor variabilelor sale.

    patrat.width = -100; //stare inconsistentapatrat.setSize(-100, -200)//metoda setSize poate sa testeze daca valorile sunt corecte

    si sa//valideze sau nu schimbarea lor

    Distrugerea obiectelor

    Multe limbaje de programare impun ca programatorul sa tina evidenta obiectelor create si sa ledistruga n mod explicit atunci cnd nu mai este nevoie de ele, cu alte cuvinte sa administreze singurmemoria ocupata de obiectele sale. Practica a demonstart ca aceasta tehnica este una din principalafurnizoare de erori ce duc la functionarea defectuoasa a programelor.

    In Java programatorul nu mai are responsabilitatea distrugerii obiectelor sale ntruct, n momentulrularii unui program, simultan cu interpretorul Java ruleaza si un proces care se ocupa cu distrugereaobiectelor care nu mai sunt folosite. Acest proces pus la dispozitie de platforma Java de lucru senumeste garbage collector (colector de gunoi), prescurtat gc.Un obiect este elimnat din memorie de procesul de colectare atunci cnd nu mai exista nici o referintala acesta.

    Referintele (care sun de fapt variabile) sunt distruse n mod :

    natural, atunci cnd variabila respectiva iese din domeniul sau, de exemplu la terminarea uneimetode

    explicit, daca atribuim variabilei respective valoarenull.Cum functioneaza colectorul de gunoaie ?

    GC este un proces de prioritate scazuta care se executa periodic si care scaneaza dinamic memoriaocupata de programul Java aflat n executie si marcheaza acele obiecte care au referinte directe sau

    indirecte. Dupa ce toate obiectele au fost parcurse cele care au ramas nemarcate sunt eliminate dinmemorie. Procesul gc poate fi fortat sa se execute prin metodagc a clasei System.

    Finalizare

    Inainte ca un obiect sa fie eliminat din memorie, procesul gc da acelui obiect posibilitatea "sa curetedupa el", apelnd metoda de finalizare a obiectului respectiv. Uzual, n timpul finalizarii un obiect sinchide fisierele si socket-urile folosite, distruge referintele catre alte obiecte (pentru a usura sarcinacolectorului de gunoaie).

    Codul pentru finalizare unui obiect trebuie scris ntr-o metoda speciala numitafinalize a clasei cedescrie obiectul respectiv.

    De exemplu, clasa Rectangle are urmatorul cod pentru finalizarea obiectelor sale:

  • 7/30/2019 Limbajul de programare Java

    16/192

    class Rectangle {...

    protected void finalize() throws Throwable {origin = null;super.finalize();

    }}

    Crearea claselor

    Declararea claselor

    Declararea unei clase

    [public][abstract][final] class NumeClasa[extends NumeSuperclasa][implements Interfata1 [, Interfata2 ... ]]

    {//corpul clasei

    }

    Asadar, prima parte a declaratie o ocupa modificatorii clasei. Acestia sunt:

    Modificatorii unei clase

    public

    Implicit, o clasa poate fi folosita doar de clasele aflate n acelasi pachet cu clasarespectiva (daca nu se specifica un anume pachet, toate clasele din directorul curent suntconsiderate a fi n acelasi pachet).

    O class declarata cupublic poate fi folosita de orice clasa, indiferent de pachetul n

    care se gaseste.

    abstract Declara o clasa abstracta (sablon). O clasa abstracta nu poate fi instantiata, fiind folositadoar pentru a crea un model comun pentru o serie de subclase;

    final

    Declara ca respectiva clasa nu poate avea subclase. Declarare claselor finale are douascopuri:

    securitate : unele metode pot astepta ca parametru un obiect al unei anumiteclase si nu al unei subclasei, dar tipul exact al unui obiect nu poate fi aflat cuexactitate dect n momentul executiei; n felul acesta nu s-ar mai putea realizaobiectivul limbajului Java ca un program care a trecut compilarea nu mai estesusceptibil de nici o eroare (nu "crapa sistemul").

    programare n spririt orientat-obiect: "O clasa perfecta nu trebuie sa mai aibasubclase"

    Dupa numele clasei putem specifica, daca este cazul, faptul ca respectiva clasa este subclasa a uneialte clase cu numeleNumeSuperclasa sau/si ca implementeaza una sau mai multe interfete, ale carornume trebuie separate prin virgula.

    Se observa ca, spre deosebire de C++, Java permite doarmostenirea simpla, asadar o clasa poateavea un singur un singur parinte (superclasa). Evident o clasa poate avea oricti mostenitori(subclase). Extinderea unei clase se realizeaza deci astfel:

    class B extends A {...} //A este superclasa clasei B

  • 7/30/2019 Limbajul de programare Java

    17/192

    Corpul unei clase

    Urmeaza declararea clasei si este cuprins ntre acolade. Contine:

    declararea variabilelor de instanta si de clasa (cunoscute mpreuna ca variabile membre) declararea si implementarea metodelor de instanta si de clasa (cunoscute mpreuna ca metode

    membre)

    Spre deosebire de C++, nu este permisa doar declararea metodei n corpul clasei, urmnd caimplementare sa fie facuta n afara ei. Implementarea metodelor unei clase trebuie sa se faca "inline"in corpul clasei.

    C++ Java

    class A {void metoda1();int metoda2() {

    //implementare}

    }A::metoda1() {//implementare}

    class A {void metoda(){

    //implementare}

    }

    Obs: variabilele unei clase pot avea acelasi nume cu metodele clasei.

    Constructorii unei clase

    Constructorii unei clase sunt metode speciale care au acelasi nume cu cel al clasei, nu returneaza nicio valoare si sunt folositi pentru initializarea obiectelor acelei clase n momentul instantierii lor.

    class Dreptunghi {Dreptunghi() {

    //constructor}

    }

    O clasa poate avea unul sau mai multi constructori care trebuie nsa sa difere prin lista de argumenteprimite. In felul acesta sunt permise diverse tipuri de initializari ale obiectului la crearea sa, n functie

    de numarul parametrilor cu care este apelat constructorul.

    class Dreptunghi {double x, y, w, h;Dreptunghi(double x0, double y0, double wo, double h0)

    {x=x0; y=y0; w=w0; h=h0;

    }Dreptunghi(double x0, double y0) {

    this(x0, y0, 0, 0);}Dreptunghi() {

    //initializare implicitathis(0, 0, 100, 100);

  • 7/30/2019 Limbajul de programare Java

    18/192

    }}

    Constructorii sunt apelati automat la instantierea unui obiect. In cazul n care dorim sa apelam explicitconstructorul unei clase folosim metoda this( argumente ), care apeleaza constructorulcorespunzator (ca argumente) al clasei respective. Aceasta metoda este folosita atunci cnd suntimplementati mai multi constructori pentru o clasa pentru a nu repeta secventele de cod scrise laconstructorii cu mai putine argumente.

    Dintr-o subclasa putem apela si constructorii superclasei cu metodasuper( argumente ).

    class Patrat extends Dreptunghi {double size;Patrat(double x0, double y0, double s0) {

    super(x0, y0, s0, s0); //se apeleazaconstructorul superclasei

    size = s0;

    }}

    Constructorii sunt apelati automat la instantierea unui obiect. In cazul n care scrieti o clasa care nuare declarat nici un constructor, sistemul i creeaza automat un constructor implicit care nu primestenici un argument si care nu face nimic. Deci prezenta constructorilor n corpul unei clase nu esteobligatorie. Daca nsa ati scris un constructor pentru o clasa care are mai mult de un argument, atunciconstructorul implicit (fara nici un argument) nu va mai fi furnizat implicit de catre sistem.

    class Dreptunghi {//nici un constructor

    }

    ...Dreptunghi d;d=new Dreptunghi(); -> OK (a fost generat constructorul

    implicit)

    class Dreptunghi {double x, y, w, h;Dreptunghi(double x0, double y0, double wo, double h0)

    {x=x0; y=y0; w=w0; h=h0;

    }}...Dreptunghi d;d=new Dreptunghi(); -> Eroare la compilare

    Constructorii unei clase pot avea urmatorii specificatori de acces:

    Specificatorii de acces ai constructorilor

    private

    Nici o alta clasa nu poate instantia obiecte ale acestei clase. O astfel de clasa poatecontine metode publice (numite "factory methods") care sa-si creeze propriile obiecte si

    sa le returneze altor clase, controlnd n felul acesta diversi parametri legati de creareobiectelor sale.

  • 7/30/2019 Limbajul de programare Java

    19/192

    protected Doar subclasele pot crea obiecte de tipul clasei respective.

    public Orice clasa poate crea instante ale clasei respective

    implicit Doar clasele din acelasi pachet pot crea instante ale clasei respective

    Declararea variabilelor membre

    Variabilele se delara de obicei naintea metodelor, desi acest lucru nu este impus de compilator.

    class NumeClasa {//declararea variabilelor//declararea metodelor

    }

    Variabilele unei clase se declara n corpul clasei dar nu n corpul unei metode. Variabilele declarate ncadrul unei metode sunt locale metodei respective.Declararea unei variabile presupune specificarea urmatoarelor lucruri:

    numele variabilei tipul de date nivelul de acces la acea variabila de catre alte clase daca este constanta sau nu daca este variabila de instanta sau de clasa

    Generic, o variabila se declara astfel:

    Declararea variabilelor membre

    [modificatori] TipDeDate numeVariabila [ = valoareInitiala ] ;

    unde un modificator poate fi :

    un specificator de acces :public, protected, private unul din cuvintele rezervate:static, final, transient, volatile

    Ex: double x;protected static int n;public String s = "abcd";private Point p = new Point(10, 10);final long MAX = 100000L;

    static

    Declarareavariabilelor declasa

    Prezenta lui declara ca o variabila este variabila de clasa si nu de instanta:

    int x ; //variabila de instantastatic int nrDeObiecteCreate; //variabila declasa

    finalDeclarareaconstantelor

    Indica faptul ca valoarea variabilei nu mai poate fi schimbata, cu alte cuvinte estefolosit pentru declararea constantelor.final double PI = 3.14 ;...PI = 3.141 -> eroare la compilare

    Prin conventie numele variabilelor finale se scriu cu litere mari. Folosirea lui

    final aduce o flexibilitate sporita n lucrul cu constante, n sensul ca valoarea uneivariabile nu trebuie specificata neaparat la declararea ei (ca n exemplul de mai sus),ci poate fi specificata si ulterior, dupa care ea nu va mai putea fi modificata.

    class Test {final int MAX;

  • 7/30/2019 Limbajul de programare Java

    20/192

    Test() {MAX = 100; // legalMAX = 200; // ilegal -> eroare la

    compilare}

    }

    transient Este folosit la serializarea obiectelor, pentru a specifica ce variabile membre aleunui obiect nu participa la serializare

    volatile Este folosit pentru a semnala compilatorului sa nu execute anumite optimizariasupra membrilor unei clase. Este o facilitate avansata a limbajului Java.

    Implementarea metodelor

    Metodele sunt responsabile cu descrierea comportamentului unui obiect. Generic, o metoda se declaraastfel:

    Declararea metodelor membre

    [modificatori] TipReturnat numeMetoda ( [argumente] )[throws TipExceptie]

    {//corpul metodei

    }

    unde un modificator poate fi :

    un specificator de acces :public, protected, private unul din cuvintele rezervate:static, abstract, final, native,

    synchronized

    staticDeclarareametodelor de clasa

    Prezenta lui declara ca o metoda este metoda de clasa si nu de instanta:void metoda1() ; //metoda de instantastatic void metoda2(); //metoda de clasa

    abstractDeclarareametodelor abstracte

    O metoda abstracta este o metoda care nu are implementare si trebuie sa facaparte dintr-o clasa abstracta.

    final Specifica faptul ca acea metoda nu mai poate fi supradefinita n subclaseleclasei n care ea este definita ca fiind finala.

    nativeIn cazul n care aveti o librarie nsemnata de functii scrise n alt limaj deprogramare dect Java (C de exemplu), acestea pot fi refolosite din programeleJava.

    synchronized

    Este folosit n cazul n care se lucreaza cu mai multe fire de executie iar metodarespectiva se ocupa cu partajarea unei resurse comune. Are ca efect construireaunui semafor care nu permite executarea metodei la un moment dat dect unuisingur fir de executie.

    Tipul returnat de o metoda

  • 7/30/2019 Limbajul de programare Java

    21/192

    Metodele pot sau nu sa returneze o valoare (un obiect) la terminarea lor. Tipul returnat poate fi att untip primitiv de date (int, double, etc.) sau o referinta la un obiect al unei clase.

    In cazul n care o metoda nu returneaza nimic atunci la rubrica TipReturnat trebuie obligatoriu saapara cuvntul cheievoid. (Ex: void afisareRezultat() )

    Daca o metoda trebuie sa returneze o valoare acest lucru se realizeaza prin intermediul instructiunii

    return, care trebuie sa apara n toate situatiile de terminare a functiei.

    double radical(double x) {if (radical >= 0)

    return Math.sqrt(x);else

    System.out.println("Eroare - numar negativ!");//Eroare la compilare - lipseste return pe

    aceasta ramura}

    In cazul n care n declaratia functiei tipul returnat este un tip primitiv de date, valoarea returnata laterminarea functiei trebuie sa aiba obligatoriu acel tip, altfel va fi furnizata o eroare la compilare.Daca valoarea returnata este o referinta la un obiect al unei clase, atunci clasa obiectului returnatrebuie sa coincida sau sa fie o subclasa a clasei specificate la declararea metodei.

    De exemplu, fie clasa Poligon si subclasa acesteiaPatrat.

    Poligon metoda1( ) {Poligon p = new Poligon();Patrat t = new Patrat();if (...)

    return p; // legalelse

    return t; // legal}Patrat metoda2( ) {

    Poligon p = new Poligon();Patrat t = new Patrat();if (...)

    return p; // ilegalelse

    return t; // legal}

    Trimiterea parametrilor catre o metoda

    Signatura unei metode este data de numarul si tipul argumentelor primite de acea metoda:

    metoda([tip1 argument1] [, tip2 argument2] ... )

    Tipul de date al unui argument poate fi orice tip valid al limbajului, att tip primitiv de date ct sireferinta la un obiect.

    Ex: adaugarePersoana(String nume, int varsta, float salariu)String este tip referinta, int si float sunt tipuri primitive

  • 7/30/2019 Limbajul de programare Java

    22/192

    Spre deosebire de alte limbaje, n Java nu pot fi trimise ca parametri ai unei metode referinte la altemetode (functii), nsa pot fi trimise obiecte care sa contina implementarea acelor metode, pentru a fiapelate.

    De asemenea, n Java o metoda nu poat primi un numar variabil de argumente, ceea ce nseamna caapelul unei metode trebuie sa se faca cu specificarea exacta a numarului si tipurilor argumentelor.

    Numele argumentelor primite trebuie sa difere ntre ele si nu trebuie sa coincida cu numele nici uneiadin variabilele locale ale metodei. Pot nsa sa coincida cu numele variabilelor membre ale clasei caz ncare diferentierea se va face prin intermediul variabilethis.

    class Cerc {int x, y, raza;public Cerc(int x, int y, int raza) {

    this.x = x;this.y = y;this.raza = raza;

    }

    }

    Atentie - In Java argumentele sunt trimise doar prin valoare (pass-by-value)

    Acest lucru nsemna ca metoda receptioneaza doar valorile variabilelor primite ca parametri.

    Cnd argumentul are tip primitiv de date metoda nu-i poate schimba valoarea dect local (n cadrulmetodei); la revenirea din metoda variabila are aceeasi valoare ca la apelul inittial al metodei(modificarile facute n cadrul metodei sunt pierdute).

    Cnd argumentul este de tip referinta metoda nu poate schimba referinta obiectului nsa poate apelametodele acelui obiect si poate modifica orice variabila membra accesibila.

    Asadar, daca dorim ca o metoda sa schimbe starea(valoarea) unui argument primit, atunci el trebuie safie neaparat de tip referinta (trebuie sa fie un obiect!).

    De exemplu, sa consideram clasa Cerc descrisa anterior si dorim sa implementam o metoda care sareturneze parametrii cercului:

    Varianta incorecta

    . . .int x = -1, y = -1, r = -1;cerc.aflaParametri(x, y, r);System.out.println("x = " + x + ", y = " + y + ", raza = " +

    r);. . .

    In acest scop n clasa Cerc ar trebui sa avem o metoda de genul:

    class Cerc {int x, y, raza;...public void aflaParametri(int valx, int valy, int valr) {

    //metoda nu functioneaza cum ar trebui!

    valx = x;valy = y;valr = raza;

  • 7/30/2019 Limbajul de programare Java

    23/192

    }}

    Aceasta metoda nsa nu va realiza lucrul propus ntruct ea primeste doar valorile variabilelorx, y

    si r adica (-1, -1, -1) si nu referinte la ele (adresele lor de memorie) astfel nct sa le poata

    modifica valoarea.

    In concluzie, metoda nu realizeaza nimic pentru ca nu poate schimba valorile unor variabile aflate nafara corpului ei.

    Varianta corectaDefinim o clasa suplimentara care descrie parametrii pe care dorim sa-i aflam:

    class CParam {public int x, y, raza;

    }

    class Cerc {int x, y, raza;public void aflaParametri(CParam param) {

    param.x = x;param.y = y;param.raza = raza;

    }}

    ...CParam p = new CParam();cerc.aflaParametri(p);

    System.out.println("x = " + p.x + ", y = " + p.y + ", raza = " +p.raza);

    Suprancarcarea si supradefinirea metodelor

    Sunt doua concepte extrem de utile ale POO si se refera la:

    suprancarcarea (overloading) - n cadrul unei clase pot exista metode cu acelasi nume cuconditia ca signaturile lor sa fie diferite (lista de argumente primite sa difere fie prin numarulargumentelor, fie prin tipul lor) astfel nct la apelul functiei cu acel nume sa se poata stabilin mod unic care dintre ele se executa. Fenomenul de supradefinire a metodelor se mainumeste sipolimorfism.

    supradefinirea (overriding) - o subclasa a unei clase poate rescrie o metoda a clasei parinte,prin implementarea unei metode cu acelasi nume si aceeasi signatura ca ale superclasei.

    Exemplificare:

    class A {void metoda() {

    System.out.println("A: metoda fara parametru");}//supraincarcare - polimorfism

    void metoda(int arg) {System.out.println("A: metoda cu un parametru");}

  • 7/30/2019 Limbajul de programare Java

    24/192

    }

    class B extends A {//supradefinirevoid metoda() {

    System.out.println("B: metoda fara parametru");}

    }

    O metoda supradefinita poate sa:

    ignore complet codul metodei corespunzatoare din superclasa (cazul de mai sus)B b = new B();b.metoda(); -> afiseaza "B: metoda fara parametru"

    sa extinda codul metodei parinte, executnd nainte de codul propriu si functia parinte.

    class B extends A {//supradefinire prin extensievoid metoda() {

    super.metoda();System.out.println("B: metoda fara parametru");

    }}. . .B b = new B();b.metoda(); -> afiseaza :

    "A: metoda fara parametru""B: metoda fara parametru"

    Metode finale

    Specifica faptul ca acea metoda nu mai poate fi supradefinita n subclasele clasei n care ea estedefinita ca fiind finala. Acest lucru este util daca respectiva metoda are o implementare care nutrebuie schimbata sub nici o forma n subclasele ei, fiind critica pentru consistenta starii unui obiect.De exemplu studentilor unei universitati trebuie sa li se calculeze media finala n functie de noteleobtinute la examene n aceeasi maniera, indiferent de facultatea la care sunt.

    class Student {. . .final float calcMedie(int nrExamene, float note[], float

    ponderi[]) {...

    }. . .

    }

    class StudentInformatica extends Student{float calcMedie(int nrExamene, float note[], float ponderi[])

    { return 10.00;}

  • 7/30/2019 Limbajul de programare Java

    25/192

    }//eroare la compilare!

    Specificatori de acces pentru membrii unei clase

    Sunt cuvinte rezervate ce controleaza accesul celorlate clase la membrii unei clasei. Specificatorii de

    acces pentru variabilele si metodele unei clase sunt: public, protected, private si cel

    implicit (package), iar nivelul lor de acces este dat n tabelul de mai jos:

    Specificator Clasa Subclasa Pachet Toti

    private X

    protected X X** X

    public X X X X

    package* X X

    Exemple de declaratii:

    private int secretPersonal;proteceted String secretDeFamilie;public Vector elemente;long doarIntrePrieteni ; -> package

    private void metodaInterna();public double calculeazaRezultat();

    Obs1 - Daca nu este specificat nici un modificator de acces, implicit nivelul de acces este la nivelulpachetului (package). Asadar, modificatorul "package" nu apare explicit n declararea uneivariabile/metode (n cazul n care apare, compilatorul va furniza o eroare).

    Obs2 - In cazul n care declaram un membru "protected" atunci accesul la acel membru din subclaseleclasei n care a fost declarata variabila depinde si de pachetul n care se gaseste subclasa: daca sunt nacelasi pachet accesul este permis, daca nu sunt n acelasi pachet accesul nu este permis dect pentruobiecte de tipul subclasei.

    Membri de instanta si membri de clasa

    O clasa Java poate contine doua tipuri de variabile si metode :

    de instanta: declarate fara modificatorul static, specifice fiecarei instante si de clasa: declarate cu modificatorulstatic, specifice clasei

    Variabile

    Cnd declarati o variabila membra cum ar fix n exemplul de mai jos:class MyClass {

    int x ; //variabila de instanta

    }

  • 7/30/2019 Limbajul de programare Java

    26/192

    se declara de fapt o variabila de instanta, cee ce nsemna ca la fiecare creare a unei instante a clasei

    MyClass sistemul aloca o zona de memorie separata pentru memorarea valorii lui x.

    MyClass o1 = new MyClass();o1.x = 100;MyClass o2 = new MyClass();o2.x = 200;System.out.println(o1.x) -> afiseaza 100System.out.println(o2.x) -> afiseaza 200

    Asadar, fiecare obiect nou creat va putea memora valori diferite pentru variabilele sale de instanta.

    Pentru variabilele de clasa (statice) sistemul aloca o singura zona de memorie la care au acces toateinstantele clasei respective, ceea ce nseamna ca daca un obiect modifica valoarea unei variabilestatice ea se va modifica si pentru toate celelate obiecte.

    class MyClass {

    int x ; //variabila de instantastatic long n; //variabila de clasa}. . .MyClass o1 = new MyClass();MyClass o2 = new MyClass();o1.n = 100;System.out.println(o2.n) -> afiseaza 100o2.n = 200;System.out.println(o1.n) -> afiseaza 200

    Metode

    Similar ca la variabile, metodele declarate fara modificatorulstatic sunt metode de instanta iar cele

    declarate cu static sunt metode de clasa (statice). Diferenta ntre cele doua metode esteurmatoarea:

    metodele de instanta opereaza att pe variabilele de instanta ct si pe cele statice ale clasei metodele de clasa opereaza doar pe variabilele statice ale clasei

    class MyClass {int x ; //variabila de instantastatic long n; //variabila de clasavoid metodaDeInstanta() {

    n ++; //legalx --; //legal

    static void metodaStatica() {n ++; //legalx --; //ilegal

    }

    Intruct metodele de clasa nu depind de starea obiectelor clasei respective, apelul lor se poate faceastfel:

    MyClass.metodaStatica(); //legal, echivalent cu

    MyClass obj = new MyClass();obj.metodaStatica(); //legal

  • 7/30/2019 Limbajul de programare Java

    27/192

    spre deosebire de metodele de instanta care nu pot fi apelate dect unei instante a clasei respective:

    MyClass.metodaDeInstanta(), //ilegalMyClass obj = new MyClass();obj.metodaDeInstanta(); //legal

    Utilitatea membrilor de clasa (statici)

    Sunt folositi pentru a pune la dispozitie valori si metode independente de starea obiectelor dintr-oanumita clasa.

    1. Declararea constantelorclass MyClass {

    final double PI = 3.14; //variabila finala de instanta}

    La fiecare instantiere a clasei MyClass va fi rezervata zona de memorie pentru variabilelefinale ale obiectului respectiv, ceea ce este o risipa ntruct aceste constante au aceleasi valoripentru toate instantele clasei.

    Declararea corecta a constantelor trebuie asadar facuta cu modificatorii static sifinal, pentru a le rezerva o singura zona de memorie, comuna tuturor obiectelor:

    class MyClass {static final double PI = 3.14; //variabila finala de

    clasa}

    2. Numararea obiectelor unei claseclass MyClass {

    static long nrInstante = 0;MyClass() { //constructorul este apelat la fiecare

    instantierenrInstante ++;

    }}

    Folosind variabile statice putem controla diversi parametri legati de crearea obiectelor uneiclase

    3. Implementarea functiilor globaleSpre deosebire de C++, n Java nu putem avea functii globale definite ca atare, ntruct "oriceeste un obiect". Din acest motiv si metodele care au o functionalitate globala trebuie implementaten cadrul unei clase. Acest lucru se va face prin intermediul metodelor de clasa (globale),deoarece acestea nu depind de starea particulara a obiectelor din clasa respectiva. De exemplu, sa

    consideram functia globala sqrt care extrage radicalul unui numar si care se gaseste n clasa

    Math. Daca nu ar fi fost functie de clasa, apelul ei ar fi trebuit facut astfel (incorect, de altfel):

  • 7/30/2019 Limbajul de programare Java

    28/192

    Math obj = new Math();double rad121 = obj.sqrt(121);

    ceea ce ar fi fost extrem de neplacut pentru programatori. Fiind nsa functie statica ea poate fi

    apelata prin: Math.sqrt(121) .

    4. Initializarea variabilelor de clasaSe poate face n momentul declararii lor :

    class MyClass {static final double PI = 3.14;static long nrInstante = 0;static final double EPS = 0.01;

    }

    sau prin intermediul unui bloc static de initializare:

    class MyClass {static {

    final double PI = 3.14;long nrInstante = 0;final double EPS = 0.01;

    }}

    Clase imbricate

    O clasa imbricata este, prin definitie, o clasa membra a unei alte clase

    class ClasaDeAcoperire{. . .class ClasaImbricata {

    . . .}

    }

    Folosirea claselor imbricate se face atunci cnd o alta clasa are nevoie n implementarea ei deo alta clasa si nu exista nici un motiv pentru care clasa imbricata sa fie declarata de sinestatatoare (nu mai este folosita nicaieri).

    public class Pachet { //clasa de acoperireclass Continut { //clasa imbricata

    private String marfa;private float cantitate;Continut (String marfa, float cantitate) {

    this.marfa = marfa;this.cantitate = cantitate;

    }}class Destinatie { //clasa imbricata

    private String dest;

    private int termen;Destinatie(String undePleaca, int inCateZile) {

  • 7/30/2019 Limbajul de programare Java

    29/192

    dest = undePleaca;termen = inCateZile;}

    }

    public void trimite(String marfa, float cant, Stringdest, int termen) {

    Continut c = new Continut(marfa, cant);Destinatie d = new Destinatie(dest, termen);

    }

    public static void main(String[] args) {Pachet p = new Pachet();p.trimite("banane", 100, "Romania", 7);

    }}

    Ca membra a unei clase, o clasa imbricata are un privilegiu special fata de celelalte clase:acces nelimitat la variabilele clasei de acoperire, chiar daca acestea sunt private.

    Clase interne

    Ca orice alta clasa o clasa imbricata poate fi declarata statica sau nu. O clasa imbricatanestatica se numeste clasa interna.

    class ClasaDeAcoperire{. . .static class ClasaImbricataStatica {

    . . .

    }class ClasaInterna {. . .

    }}

    Diferentierea acestor denumiri se face deoarece:

    o "clasa imbricata" reflecta relatia sintactica a doua clase; codul unei clase aparen interiorul dodului altei clase;

    o "clasa interna" reflecta relatia dintre instantele a doua clase, n sensul ca oinstanta a unei clase interne nu poate exista dect n cadrul unei instante a clasei

    de acoperire.

    In general cele mai folosite clase imbricate sunt clasele interne Asadar, o clasa interna este oclasa imbricata ale carei instante nu pot exista dect n cadrul instantelor clasei de acoperire sicare are acces direct la toti membrii clasei sale de acoperire.

    Identificarea claselor imbricate

    Dupa cum stim orice clasa produce la compilare asa numitele "unitati de compilare", care sunt

    fisiere avnd numele clasei respective si extensia .class, si care contin toate informatiiledespre clasa respectiva.

  • 7/30/2019 Limbajul de programare Java

    30/192

    Pentru clasele imbricate aceste unitati de compilare sunt denumite astfel: numele clasei deacoperire, urmat de simbolul '$' apoi de numele clasei imbricate.

    class ClasaDeAcoperire{class ClasaInterna1 {}class ClasaInterna2 {}

    }

    Pentru exemplul de mai sus vor fi generate trei fisiere:

    ClasaDeAcoperire.classClasaDeAcoperire$ClasaInterna1.classClasaDeAcoperire$ClasaInterna2.class

    In cazul n care clasele imbricate au la rndul lor alte clase imbricate (situatie mai putinuzuala) denumirea lor se face dupa aceeasi metoda : adaugarea unui '$' si apoi numele claseiimbricate.

    Clase si metode abstracte

    Uneori n proiectarea unei aplicatii este necesar sa reprezentam cu ajutorul claselor concepteabstracte care sa nu poata fi instantiate si care sa foloseasca doar la dezvoltarea ulterioara aunor clase ce descriu obiecte concrete.

    De exemplu n pachetul java.lang exista clasa abstracta Number care modeleazaconceptul generic de "numar". Intr-un program nu avem nsa nevoie de numere generice ci denumere ntregi, reale.

    Clasa Number serveste ca superclasa pentru clase cum ar fi Byte, Double, Float,

    Integer, Long si Short ce implementeaza obiecte pentru descrierea numerelor de un

    anumit tip. Asadar clasa Number reprezinta un concept abstract si nu vom putea instantiaobiecte de acest tip:

    Number numarGeneric = new Number(); //eroare

    Declararea unei clase abstracte

    Se face folosind cuvntul rezervatabstract n declaratia clasei:

    abstract class ClasaAbstracta {. . .

    }

    Daca vom ncerca sa instantiem un obiect al claseiClasaAbstracta vom obtine o eroare

    la compilarea programului de genul:class ClasaAbstracta is an abstract

    class. It can't be instantiated.

    Metode abstracte

    Spre deosebire de clasele obisnuite care trebuie sa furnizeze implementari pentru toate

    metodele declarate o clasa abstracta poate contine metode fara nici o implementare. Metodelefara nici o implementare se numesc metode abstracte si pot aparea doar n clase abstracte.

  • 7/30/2019 Limbajul de programare Java

    31/192

    In fata unei metode abstracte trebuie sa apara cuvntul cheieabstract, altfel va fi furnizatao eroare de compilare.

    abstract void metodaAbstracta(); //corectvoid metoda(); //incorect

    (Method metoda requires a method body; otherwisw declare itabstract)

    In felul acesta o clasa abstracta poate pune la dispozitia subclaselor sale un model complet pecare trebuie sa-l implementeze, furniznd chiar implementarea unor metode comune tuturorclaselor sau lasnd explicitarea unor metode fiecarei subclase n parte.

    Un exemplu elocvent de folosire a claselor si metodelor abstracte este descrierea obiectelorgrafice ntr-o maniera orientata-obiect.

    o Obiecte grafice - linii, dreptunghiuri, cercuri, curbe Bezier, o Stari comune - pozitia(originea), dimensiunea,culoarea, o Comportament - mutare, redimensionare, desenare, colorare,

    Pentru a folosi starile si comportamentele comune acestor obiecte n avantajul nostru putem

    declara o clasa generica GraphicObject care sa fie superclasa pentru celelalte clase.

    Metodele abstracte vor fi folosite pentru implementarea comportamentului specific fiecaruiobiect, cum ar fi desenarea iar cele obisnuite pentru comportamentul comun tuturor, cum ar fischimbarea originii.

    Implementarea clasei abstracte GraphicObject:

    abstract class GraphicObject {int x, y;. . .void moveTo(int newX, int newY) { //metoda normala

    . . .}abstract void draw(); //metoda abstracta

    } //nici o implementare

    Atentie: Orice subclasa non-abstracta a unei clase abstracte trebui sa furnizeze implementariale metodelor abstracte din superclasa. Implementarea claselor pentru obiecte grafice ar fi:

    class Circle extends GraphicObject {void draw() {

    . . . //obligatoriu implementarea

    }}class Rectangle extends GraphicObject {

  • 7/30/2019 Limbajul de programare Java

    32/192

    void draw() {. . . //obligatoriu implementarea

    }}

    Observatii:

    O clasa abstracta poate sa nu aiba nici o metoda abstracta. O metoda abstracta nu poate aparea dect ntr-o clasa abstracta. Orice clasa care are o metoda abstracta trebuie declarata ca fiind abstracta.

    Clasa Object

    Orice clasa are o superclasa

    Dupa cum am vazut la crearea unei clase clauza "extends" specifica faptul ca acea clasa este o

    subclasa a altei clase, numita superclasa. O clasa poate avea o singura superclasa (Java nusuporta mostenirea multipla) si chiar daca nu specificati clauza "extends" la crearea unei claseea totusi va avea o superclasa. Cu alte cuvinte, in Java orice clasa are o superclasa si numaiuna.

    Superclasa tuturor celorlalte clase este clasaObject, care este radacina ierarhiei de clase nJava. Clasa Object este si superclasa implicita a claselor care nu specifica o alta superclasa.

    Declaratia class MyClass {} este echivalenta cu class MyClass extends

    Object {}.

    Clasa Object

    Este cea mai generala dintre clase, orice obiect fiind, direct sau indirect, descendent al acesteiclase. Defineste si implementeaza comportamentul comun al tuturor claselor Java cum ar fi:

    posibilitatea compararii obiectelor ntre ele specificarea unei reprezentari ca sir de caractere a unui obiect returnarea clasei din care face parte un obiect notificarea altor obiecte ca o variabila de conditie s-a schimbat, etc

    Fiind sublcasa a lui Object, orice clasa poate supradefini metodele claseiObject care nu

    sunt finale. Metode care pot fi supradefinite sunt: clone, equals/hashCode,finalize ,toString.

  • 7/30/2019 Limbajul de programare Java

    33/192

    cloneAcesasta metoda este folosita pentru duplicarea obiectelor (creearea unorclone). Clonarea unui obiect presupune crearea unui nou obiect de acelasi tip sicare sa aiba aceeassi stare (aceleasi valori pentru variabilele sale)

    equals,hashCode

    Aceste metode trebuie supradefinite mpreuna. In metodaequals este scriscodul pentru compararea a doua obiecte. Implicit (implementarea din clasa

    Object) aceasta metoda compara referintele obiectelor. Uzual este redefinitapentru a testa daca starile obiectelor coincid sau daca doar o parte dinvariabilele lor coincid.

    Metoda hashCode returneaza un cod ntreg pentru fiecare obiect pentru atesta consistenta obiectelor: acelasi obiect trebuie sa returneze acelasi cod pedurata executiei programului. Daca doua obiecte sunt egale conform metodei

    equals atunci apelul metodei hashCode pentru fiecare din cele doua obiectetrebuie sa returneze acelasi ntreg.

    finalize In aceasta metoda se scrie codul care "curata dupa un obiect" nainte de a fieliminat din memorie de colectorul de gunoaie.

    toString

    Este folosita pentru a returna o reprezentare ca sir de caractere a unui obiect.

    Este utila pentru concatenarea sirurilor cu diverse obiecte n vederea tiparirii.MyObject obj = new MyObject();System.ot.println("Obiect=" + obj);

    //echivalent cuSystem.ot.println("Obiect=" + obj.toString());

    Exemplu de supradefinire a metodelor clasei Object

    class MyObject extends Object {//clasa in care este supradefinita metoda equalspublic int x;

    public boolean equals(Object obj) {if (obj == null) return false;if (!(obj instanceof MyObject)) return false;if ( ((MyObject) obj).x == x)

    return true;else

    return false;}public synchronized Object clone() {

    MyObject m = new MyObject();m.x = x;return m;

    }public final synchronized String toString() {

    return "[" + x + "]";}public void finalize() {

    System.out.println("Finalizare");x = -1;

    }}

    class OtherObject {public int x;

    //clasa in care NU este supradefinita metoda equals}

  • 7/30/2019 Limbajul de programare Java

    34/192

    class TestObject { //clasa principala - contine metoda mainpublic static void main(String args[]) {

    OtherObject o1 = new OtherObject();OtherObject o2 = new OtherObject();o1.x = 1;o2.x = 1;if (o1.equals(o2))

    System.out.println("test1: o1 == o2");else

    System.out.println("test1: o1 != o2");//corect

    //Desi x=1 pt ambele obiecte egalitatea se obtine doarcand

    //adresele lor de memorie coincid deoarece nu esteimplementata

    //metoda equals

    o2 = o1;if (o1.equals(o2))

    System.out.println("test2: o1 == o2");//corect

    elseSystem.out.println("test2: o1 != o2");

    //////////////////////////////////////////////MyObject m1 = new MyObject();MyObject m2 = new MyObject();m1.x = 1;m2.x = 1;if (m1.equals(m2))

    System.out.println("test3: m1 == m2");//corect

    elseSystem.out.println("test3: m1 != m2");

    //x=1 pt ambele obiecte -> metoda equals returneazatrue

    MyObject m3;m3 = (MyObject) m1.clone();System.out.println("Obiectul clonat: " + m3);

    //echivalent cuSystem.out.println("Obiectul clonat: " +m3.toString());

    //Se tipareste: Obiectul clonat: [1]}

    }

    Fluxuri (Intrari / Iesiri)

    Ce sunt fluxurile?

    Adeseori programele necesita citirea unor informatii care se gasesc pe o sursa externa sau trimitereaunor informatii catre o destinatie externa. Informatia se poate gasi oriunde : ntr-un fisier pe disc, n

  • 7/30/2019 Limbajul de programare Java

    35/192

    retea, n memorie sau n alt program si poate fi de orice tip: date primitive, obiecte, imagini, sunete,etc. Pentru a aduce informatii dintr-un mediu extern, un progam Java trebui sa deschida un canal decomunicatie (flux) catre sursa informatiilor (fisier, memorie, socket,etc) si sa citeasca serialinformatiile respective:

    Similar, un program poate trimite informatii catre o destinatie externa deaschiznd un canal decomunicatie (flux) catre acea destinatie si scriind serial informatiile respective:

    Indiferent de tipul informatiilor, citirea/scrierea informatiilor de pe/catre un mediu extern respectaurmatorii algoritmi:

    Citirea Scrierea

    deschide canal comunicatie

    while (mai sunt informatii) {citeste informatie}inchide canal comunicati;

    deschide canal comunicatie

    while (mai sunt informatii) {scrie informatie}inchide canal comunicati;

    Pentru a generaliza, att sursa externa a unor informatii ct si destinatia lor sunt vazute ca fiind nisteprocese care produc, respectiv consuma informatii:

    Definitii Unflux este un canal de comunicatie unidirectional ntre doua procese. Un proces care descrie o sursa externa de date se numesteproces producator. Un proces care descrie o destinatie externa pentru date se numeste proces

    consumator. Un flux care citeste date se numesteflux de intrare. Un flux care scrie date se numesteflux de iesire.

    Observatii Fluxurile sunt canale de comunicatie seriale pe 8 sau 16 biti. Fluxurile sunt unidirectionale, de la producator la consumator Fiecare flux are un singur proces producator si un singur proces consumator Intre doua procese pot exista oricte fluxuri, orice proces putnd fi att

    producator si consumator n acelasi timp, dar pe fluxuri diferite Consumatorul si producatorul nu comunica direct printr-o interfata de flux ci prin

    intermediul codului Java de tratare a fluxurilor

  • 7/30/2019 Limbajul de programare Java

    36/192

    Clasele si intefetele standard pentru lucu cu fluxuri se gasesc n pachetul java.io. Deci oriceprogram care necesita operatii de intrare/iesire trebuie sa contina instructiunea de import a pachetuluijava.io: import java.io.*;

    Clasificarea fluxurilor

    Exista trei tipuri de clasificare a fluxurilor: Dupa "directia" canalului de comunicatie deschis fluxurile se mpart n:

    o fluxuri de intrare (pentru citirea datelor)o fluxuri de iesire (pentru scrierea datelor)

    Dupa tipul de date pe care opereaza:o fluxuri de octeti (comunicare seriala se realizeaza pe 8 biti)o fluxuri de caractere (comunicare seriala se realizeaza pe 16 biti)

    Dupa actiunea lor:o fluxuri primare de citire/scriere a datelor (se ocupa efectiv cu citirea/scrierea datelor)o fluxuri pentru procesarea datelor

    Ierarhia claselor pentru lucrul cu fluxuri

    Fluxuri de caractere

    Clasele radacina pentru ierarhia claselor ce se ocupa cu fluxurile de caractere sunt Reader (pentrufluxuri de intrare) si Writer (pentru fluxuri de iesire). Acestea sunt superclase abstracte pentru clase ceimplementeaza fluxuri specializate pentru citirea/scrierea datelor pe 16 biti. Ierarhia claselor pentru

    fluxuri de intrare pe caractere:

    Ierarhia claselor pentru fluxuri de iesire pe caractere:

  • 7/30/2019 Limbajul de programare Java

    37/192

    Au fost puse n evidenta (colorate cu gri) fluxurile care intra n categoria fluxurilor pentru procesareadatelor.

    Fluxuri de octeti

    Clasele radacina pentru ierarhia claselor ce se ocupa cu fluxurile de octeti sunt InputStream (pentrufluxuri de intrare) si OutputStream (pentru fluxuri de iesire). Acestea sunt superclase abstracte pentruclase ce implementeaza fluxuri specializate pentru citirea/scrierea datelor pe 8 biti.

    Ierarhia claselor pentru fluxuri de intrare pe octeti:

    Ierarhia claselor pentru fluxuri de iesire pe octeti:

  • 7/30/2019 Limbajul de programare Java

    38/192

    Au fost puse n evidenta (colorate cu gri) fluxurile care intra n categoria fluxurilor pentru procesareadatelor.

    Atentie - Pentru majoritatea programelor scrierea si citirea datelor se vor face prin intermediulfluxurilor de caractere deoarece acestea permit manipularea caracterelor Unicode (16-biti), n timp cefluxurile de octeti permit doar lucrul pe 8 biti - caractere ASCII.

    Metode comune fluxurilor

    Superclasele abstracte Reader si InputStream definesc metode similare pentru citirea datelor.

    Reader InputStream

    int read()

    int read(char buf[])int read(char buf[], intoffset,int length)

    int read()

    int read(byte buf[])int read(byte buf[], intoffset,int length)

    De asemenea ambele clase pun la dispozitie metode pentru marcarea unei locatii ntr-un flux, saltulpeste un numar de pozitii, resetarea pozitiei curente,

    Superclasele abstracte Writer si OutputStream sunt de asemenea paralele, definind metode similarepentru scrierea datelor.

    Writer OutputStream

    int write()int write(char buf[])int write(char buf[], intoffset,int length)

    int write()int write(byte buf[])int write(byte buf[], intoffset,int length)

    Inchiderea oricarui flux se realizeaza prin metodaclose. In cazul n care aceasta nu este apelataexplicit fluxul va fi automat nchis de catre colectorul de gunoaie atunci cnd nu va mai exista nici oreferinta la el.

    Metodele referitoare la fluxuri pot genera exceptii de tipulIOException.

    Folosirea fluxurilor

    Asa cum am vazut fluxurile pot fi mpartite n functie de activitatea lor, n fluxuri care se ocupaefectiv cu citirea/scrierea datelor si fluxuri pentru procesarea datelor. In continuare vom vedea caresunt cele mai importante clase din cele doua categorii si la ce folosesc acestea:

    Fluxuri pentru citirea/scrierea efectiva a datelor

    Clasele ce descriu fluxuri pentru citirea/scrierea efectiva a datelor pot fi mpartite n functie de tipulsursei datelor astfel:

    Tipsursa Fluxuri caractere Fluxuri octeti

  • 7/30/2019 Limbajul de programare Java

    39/192

    Memorie

    CharArrayReader,CharArrayWriter

    ByteArrayInputStream,ByteArrayOutputStream

    Aceste fluxuri folosesc pentru scrierea/citirea informatiilor n memorie si suntcreate pe un vector existent deja. Cu alte cuvinte permit tratarea vectorilor casursa/destinatie pentru crearea unor fluxuri de intrare/iesire.

    StringReader,StringWriter

    StringBufferInputStream

    Permit tratarea sirurilor de caractere aflate n memorie ca sursa/destinatie pentrucrearea unor fluxuri de intrare/iesire. StringReader si StringWriter sunt folosite cuobiecte de tip String iar StringBufferInputStream cu obiecte de tip StringBuffer.

    Pipe

    PipedReader,PipedWriter

    PipedInputStream,PipedOutputStream

    Implementeaza componentele de intrare/iesire ale unei conducte de date (pipe).Pipe-urile sunt folosite pentru a canaliza iesirea unui program sau fir de executiecatre intrarea altui program sau fir de executie

    Fisier

    FileReader, FileWriter FileInputStream,FileOutputStream

    Numite sifluxuri fisier, acestea sunt folosite pentru citirea datelor dintr-un fisier,respectiv scrierea datelor ntr-un fisier

    Fluxuri pentru procesarea datelor

    Clasele ce descriu fluxuri pentru procesarea datelor pot fi mpartite n functie de tipul de procesare pecare l efectueaza:

    Tip procesare Fluxuri caractere Fluxuri octeti

    "Bufferizare"

    BufferedReader,BufferedWriter

    BufferedInputStream,BufferedOutputStream

    Sunt folosite pentru a introduce un buffer n procesul de scriere/citire ainformatiilor, reducnd astfel numarul de accese la dispozitivul ce reprezinta sursaoriginala de date. Sunt mult mai eficiente dect fluxurile fara buffer si din acestmotiv se recomanda folosirea lor ori de cte ori eset posibil

    Filtrare

    FilterReader,FilterWriter

    FilterInputStream,FilterOutputStream

    Sunt clase abstracte ce definesc o interfata pentru fluxuri care filtreaza automatdatele citite sau scrise

    Conversieocteti-

    caractere

    InputStreamReader,OutputStreamWriter

    Formeaza o punte de legatura ntre fluxurile de caractere si fluxurile de octeti. Unflux InputStreamReader citeste octeti dintr-un flux InputStream ai i converteate lacaractere folosind codificarea standard a caracterelor sau o codificare specificatade program. Similar, un flux OutputStreamWriter converteste caractere n octeti sitrimite rezutatul catre un flux de tipul OutputStream.

    ConcatenareSequenceInputStream

    Concateneaza mai multe fluxuri de intrare ntr-unul singur

    Serializare

    ObjectInputStream,

    ObjectOutputStream

  • 7/30/2019 Limbajul de programare Java

    40/192

    Folosite pentru serializarea obiectelor

    Conversietipuri de date

    DataInputStream,DataOutputStream

    Folosite la scrierea/citirea datelor de tip primitiv ntr-un format independent demasina pe care se lucreaza

    NumarareLineNumberReader LineNumberInputStream

    Numara liniile citite de la un flux de intrare.

    Citire n avans

    PushbackReader PushbackInputStream

    Fluxuri de intrare care au un buffer de 1-caracter(octet) n care este citit n avanssi caracterul (octetul) care urmeaza celui curent citit.

    AfisarePrintWriter PrintStream

    Metode convenabile pentru afisarea informatiilor.

    Crearea unui flux

    Orice flux este un obiect al clasei ce implementeaza fluxul respectiv. Crearea unui flux se realizeazaasadar similar cu crearea obiectelor prin instructiuneanew().

    Exemple://crearea unui flux de intrare pe caractereFileReader in = new FileReader("fisier_intrare.txt");

    //crearea unui flux de iesire pe caractereFileWriter out = new FileWriter("fisier_iesire.txt");

    //crearea unui flux de intrare pe octetiFileInputStream in = newFileInputStream("fisier_intrare.txt");

    //crearea unui flux de iesire pe octetiFileOutputStrem out = new

    FileOutputStream("fisier_iesire.txt");

    Asadar, crearea unui flux primitiv de date care scrie/citeste informatii de la un dispozitiv extern areformatul general:

    FluxPrimitiv numeFlux = new FluxPrimitiv( dispozitiv extern )

    Fluxurile de procesare nu pot exista de sine statatoare ci se suprapun pe un flux primitiv decitire/scriere a datelor. Din acest motiv constructorii claselor pentru fluxurile de procesare nu primescca argument un dispozitiv extern de memorare a datelor ci o referinta la un flux primitiv responsabilcu citirea/scrierea efectiva a datelor:

    Exemple://crearea unui flux de intrare printr-un bufferBufferedReader in = new BufferedReader(new

    FileReader("fisier.in"));//echivalent cuFileReader fr = new FileReader("fisier.in");BufferedReader in = new BufferedReader(fr);

  • 7/30/2019 Limbajul de programare Java

    41/192

    //crearea unui flux de iesire printr-un bufferBufferedWriter out = new BufferedWriter(new

    FileWriter("fisier.out")));//echivalent cuFileWriter fo = new FileWriter("fisier.out");BufferedWriter out = new BufferedWriter(fo);

    Asadar, crearea unui flux pentru procesarea datelor are formatul general:

    FluxProcesare numeFlux = new FluxProcesare(referintaFluxPrimitiv )

    In general, fluxurile pot fi grupate n succesiuni orict de lungi:

    DataInputStream in =new DataInputStream(

    new BufferedInputStream(new FileInputStream("fisier.in")));

    Fluxuri pentru lucrul cu fisiere (fluxuri de tip "File")

    Fluxurile pentru lucrul cu fisiere sunt cele mai usor de nteles. Clasele care implementeaza acestefluxuri sunt urmatoarele:

    FileReader, FileWriter - caractereFileInputStream, FileOutputStream - octeti

    Constructorii acestor clase accepta ca argument un obiect care sa specifice un anume fisier. Acestapoate fi un sir de caractere, on obiect de tip File sau un obiect de tip FileDesciptor

    Constructorii clasei FileReader:

    public FileReader( String fileName ) throwsFileNotFoundExceptionpublic FileReader( File file ) throws FileNotFoundExceptionpublic FileReader( FileDescriptor fd )

    Constructorii clasei FileWriter:

    public FileWriter( String fileName ) throws IOExceptionpublic FileWriter( File file ) throws IOExceptionpublic FileWriter( FileDescriptor fd )public FileWriter( String fileName, boolean append ) throws

    IOException

    Cei mai uzuali constructori sunt cei care primesc ca argument numele fisierului. Acestia pot provoca

    exceptii de tipul FileNotFoundException n cazul n care fisierul cu numele specificat nu

    exista. Din acest motiv orice creare a unui flux de acest tip trebuie facuta ntr-un bloctry sau metodan care sunt create fluxurile respective trebuie sa arunce exceptiile de tipul

    FileNotFoundException sau de tipul superclasei IOException.

  • 7/30/2019 Limbajul de programare Java

    42/192

    Exemplu: un program care copie con]inutul unui fisier n alt fisier:

    import java.io.*;public class Copy {public static void main(String[] args) throws IOException {

    FileReader in = new FileReader("in.txt");FileWriter out = new FileWriter("out.txt");

    int c;while ((c = in.read()) != -1)

    out.write(c);

    in.close();out.close();

    }}

    Obs: metoda main arunca exceptii IOException care este superclasa pentru

    FileNotFoundException. Aceste exceptii nu vor "prinse" dect de interpretor si va fi afisat unmesaj de eroare la aparitia lor.

    Citirea si scrierea cu zona tampon

    Clasele pentru citirea/scrierea cu zona tampon sunt:

    BufferedReader, BufferedWriter -caractere

    BufferedInputStream, BufferedOutputStream - octeti

    Sunt folosite pentru a introduce un buffer n procesul de scriere/citire a informatiilor, reducnd astfelnumarul de accese la dispozitivul ce reprezinta sursa originala de date. Sunt mult mai eficiente dectfluxurile fara buffer si din acest motiv se recomanda folosirea lor ori de cte ori este posibil.

    Clasele BufferedReader si BufferedInputStream citesc n avans date si le memoreaza ntr-o zonatampon (buffer). Atunci cnd se executa o operatie read(), octetul citit va fi preluat din buffer. In cazuln care buffer-ul este gol citirea se face direct din flux si, odata cu citirea octetului, vor fi memorati nbuffer si octetii care i urmeaza.

    Similar, se lucreaza si cu clasele BufferedWriter si BufferedOutputStream. Fluxurile de citire/scrierecu buffer sunt fluxuri de procesare si sunt folosite prin suprapunere cu alte fluxuri.

    Exemplu:BufferedOutputStream out = new BufferedOutputStream(

    new FileOutputStream("out.dat"), 1024)

    Constructorii acestor clase sunt urmatorii:

    BufferedReader

    BufferedReader( Reader in )

    BufferedReader( Reader in, int dim_buffer)

    BufferedWriter BufferedWriter( Writer out )BufferedWriter( Writer out, int dim_buffer

  • 7/30/2019 Limbajul de programare Java

    43/192

    )

    BufferedInputStream

    BufferedInputStream( InputStream in )

    BufferedInputStream( InputStream in, intdim_buffer )

    BufferedOutputStreamBufferedOutputStream( OutputStream out )BufferedOutputStream( OutputStream out,int dim_buffer )

    In cazul constructorilor n care dimensiunea buffer-ului nu este specificata, aceasta primeste valoareaimplicita de 512 octeti.

    Metodele acestor clase sunt cele uzuale de tipul readsiwrite Pe lnga acestea, clasele pentruscriere prin buffer mai au si metoda flush care goleste explicit zona tampon chiar daca aceasta nueste plina.

    Exemplu:BufferedWriter out = new BufferedWriter(

    new FileWriter("out.dat"), 1024)//am creat un flux cu buffer de 1024 octetifor(int i=0; i in fisier nu s-a scris nimicout.flush();//bufferul este golit -> datele se scriu n fisier

    Metoda readLine

    BufferedReader br = new BufferedReader(new FileReader("in"))String input;while ((input = br.readLine()) != null) {. . .//readLine metoda specifica care citeste o linie

    }

    Metoda readLine permite citirea unui flux linie cu linie.

    Concatenarea fisierelor

    Clasa SequenceInputStreampermite unei aplicatii sa combine serial mai multe fluxuri deintrare astfel nct acestea sa apara ca un singur flux de intrare. Citirea datelor dintr-un astfel de fluxse face astfel: se citeste din primul flux de intrare specificat pna cnd se ajunge la sfrsitul acestuia,dupa care primul flux de intrare este nchis si se deschide automat urmatorul flux de intrare din care sevor citi n continuare datele, dupa care procesul se repeta pna la terminarea tuturor fluxurilor deintrare.

    Constructorii acestei clase sunt:

    SequenceInputStream(Enumeration e )

    Construieste un flux secvential dintr-o multime defluxuri de intrare. Fiecare obiect n enumerareaprimita ca parametru trebuie sa fie de tipul

    InputStream.

    SequenceInputStream( Construieste un flux de intrare care combina doua

  • 7/30/2019 Limbajul de programare Java

    44/192

    InputStream s1, InputStreams2 )

    fluxuri s1 si s2. Primul flux citit va fi s1.

    Exemplul cel mai elocvent de folosirea a acestei clase este concatenarea a doua fisiere:

    //Concatenarea a 2 fisiere ale caror nume sunt primite lalinia de comanda//Rezultatul concatenarii este afisat pe ecranimport java.io.*;public class Concatenare1 {

    public static void main(String args[]) throws IOException {FileInputStream f1 = new FileInputStream(args[0]);FileInputStream f2 = new FileInputStream(args[1]);

    SequenceInputStream s = new SequenceInputStream(f1,f2);

    int c;

    while ((c = s.read()) != -1)System.out.write(c);

    s.close();//f1 si f2 sunt nchise automat

    }//main}//class

    Pentru concatenarea mai multor fisiere exista doua varianteo folosirea unei enumerari - primul constructoro concatenarea pe rnd a acestora folosind al 2-lea constructor; concatenarea a 3 fisiere

    va construi un flux de intrare astfel:

    FileInputStream f1 = new FileInputStream(args[0]);FileInputStream f2 = new FileInputStream(args[1]);FileInputStream f3 = new FileInputStream(args[2]);SequenceInputStream s = new SequenceInputStream(

    f1, new SequenceInputStream(f2, f3));

    Fluxuri pentru filtrarea datelor

    Un flux de filtrare se ataseaza altui flux pentru a filtra datele care sunt citite/scrise de catre acel flux.Clasele pentru fluxuri de filtrare au ca superclase clasele abstracte FilterInputStream(pentrufiltrarea fluxurilor de intrare) si FilterOutputStream(pentru filtrarea fluxurilor de iesire).

    Clasele pentru filtrarea datelor sunt:DataInputStream, DataOutputStreamBufferedInputStream, BufferedOutputStreamLineNumberInputStreamPushbackInputStreamPrintStream (flux de iesire)

    Observati ca toate aceste clase descriu fluxuri de octeti. Filtrarea datelor nu trebuie vazuta ca ometoda de a elimina anumiti octeti dintr-un flux ci de transforma acesti octeti n date care sa poata fi

    interpretate sub alta forma. Asa cum am vazut la citirea/scrierea cu zona tampon clasele de filtrare

  • 7/30/2019 Limbajul de programare Java

    45/192

    BufferedInputStream si BufferedOutputStream grupeaza datele unui flux ntr-un buffer, urmnd cacitirea/scrierea sa se faca prin intermediu acelui buffer.

    Asadar fluxurile de filtrare nu elimina date citite sau scrise de un anumit flux, ci introduc o nouamodalitate de manipulare a lor. Din acest motiv fluxurile de filtrare vor contine anumite metodespecializate pentru citirea/scrierea datelor, altele dect cele comune tuturor fluxurilor (metode de tipread/write).

    Folosirea fluxurilor de filtrare se face prin atasarea lor de un flux care se ocupa efectiv decitirea/scrierea datelor:

    FluxFiltrare numeFlux = new FluxFiltrare ( referintaAltFlux )Cele mai importante clase din aceasta categorie sunt DataInputStream si DataOutputStream

    Clasele DataInputStream si DataOutputStream

    Aceste clase ofera metode prin care un flux nu mai este vazut ca o nsiruire de octeti, ci ca o sursa de

    date primitive. Prin urmare vor furniza metode pentru citirea si scrierea datelor la nivel de tip de datasi nu la nivel de octet. Constructorii si metodele cele mai importante (altele dect read/write) sunt daten tabelul de mai jos:

    DataInputStream DataOuputStream

    //ConstructorDataInputStream(InputStreamin)

    //ConstructorDataOutputStream(OutputStreamout)

    readBoolean( )readByte( )readChar( )

    readDouble( )readFloat( )readInt( )readLong( )readShort( )readUnsignedByte( )readUnsignedShort( )String readUTF( )

    writeBoolean( boolean v )writeByte( int v )writeChar( int v )

    writeDouble( double v )writeFloat( float v )writeInt( int v )writeLong( long v )writeShort( int v )writeBytes( String s )writeChars( String s )writeUTF( String str )

    Aceste metode au denumirile generice de readXXX siwriteXXX specificate de interfeteleDataInput si DataOutput. Pot provoca exceptii de tipul IOException.

    Atentie: Un fisier n care au fost scrise informatii folosind metode writeXXX nu va putea fi citit dectprin metode readXXX.

    Fluxuri standard de intrare/iesireMergnd pe linia introdusa de sistemul de operare UNIX orice program Java are :

    o o intrare standardo o iesire standardo o iesire standard pentru erori

    In general intrarea standard este tastatura iar iesirea standard este ecranul.Intrarea si iesirea standard sunt de fapt niste obiecte pre-create ce descriu fluxuri de date pentru citirea

    respectiv scrierea la dispozitivele standard ale sistemului. Aceste obiecte sunt definite publice n clasaSystem si sunt:

  • 7/30/2019 Limbajul de programare Java

    46/192

    Variabila Semnificatie Tip flux

    System.in flux standard de intrare InputStream

    System.out flux standard de iesire PrintStream

    System.err flux standard pentru afisarea erorilorPrintStream

    Afisarea informatiilor pe ecran

    Am vazut deja numeroase exemple de folosire a fluxului standard de iesire, el fiind folosit la afisarea

    oricaror rezultate pe ecran (n modul consola):System.out.println("mesaj"). Fluxulstandard pentru afisarea erorilor se foloseste similar:

    catch (IOException e) {System.err.println("Eroare de intrare/iesire!")

    }

    Fluxurile de iesire pot fi folosite asadar fara probleme deoarece tipul lor este PrintStream, clasaprimitiva pentru scrierea efectiva a datelor. In schimb fluxul standard de intrareSystem.out este de

    tip InputStream care este o clasa abstracta, deci pentru a-l putea utiliza va trebui sa-l folosimmpreuna cu un flux de procesare a datelor sau cu orice alt flux ce permite citirea efectiva a datelor.

    Citirea datelor de la tastatura

    Uzual vom dori sa folosim metoda readLine pentru citirea datelor de la tastatura si din acest motivvom folosi intrarea standard mpreuna cu o clasa de procesare care implementeaza metoda

    readLine. Exemplul tipic este:

    BufferedReader stdin = new BufferedReader(newInputStreamReader(System.in));System.out.print("Introduceti o linie:");String linie = stdin.readLine()System.out.println(linie);

    Exemplu: un program care afiseaza liniile introduse de la tastatura

    import java.io.*;public class Echo {

    public static void main(String[] args) {BufferedReader stdin = new BufferedReader(

    new InputStreamReader(System.in));String s;try {

    while((s = stdin.readLine()).length() != 0)System.out.println(s);

    //Programul se opreste cu o linie vida} catch(IOException e) {e.printStackTrace();}

    }}

    Observatie: Metoda readLine poate provoca exceptii de tipulIOException.

    Redirectarea intrarii/iesirii standard

  • 7/30/2019 Limbajul de programare Java

    47/192

    Incepnd cu Java 1.1 au fost introduse n clasa System metode statice pentru a redirecta fluxurile deintrare si iesire standard. Aceste metode sunt:

    setIn(InputStream) - redirectare intraresetOut(PrintStream) - redirectare iesiresetErr(PrintStream) - redirectare erori

    Redirectarea iesirii este utila n special atunci cnd sunt afisate foarte multe date pe ecran si acestea sederuleaza mai repede dect putem citi. Putem redirecta afisarea catre un fisier pe care sa-l citim dupaexecutia programului. Secventa clasica de redirectare a iesirii este:

    PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("rezultate.out")));

    System.setOut (out);

    Redirectarea erorilor ntr-un fisier poate fi de asemenea utila.

    PrintStream err = new PrintStream(new BufferedOutputStream(new FileOutputStream("erori.err")));

    System.setErr (err);

    Redirectarea intrarii poate fi utila pentru un program consola care primeste niste valori de intrare.Pentru a nu le scrie de la tastatura de fiecare data n timpul testarii programului ele pot fi puse ntr-unfisier, redirectnd intrarea standard. In momentul cnd testarea programului a luat sfrsit redirectareapoate fi eliminata, datele fiind cerute din nou de la tastatura.

    Exemplu de folosire a redirectarii:import java.io.*;class Redirectare {

    public static void main(String[] args) {try {

    BufferedInputStream in = newBufferedInputStream(

    newFileInputStream("Redirectare.java"));

    PrintStream out = new PrintStream(newBufferedOutputStream(

    new FileOutputStream("test.out")));System.setIn(in);System.setOut(out);System.setErr(out);

    BufferedReader br = new BufferedReader(new

    InputStreamReader(System.in));String s;while((s = br.readLine()) != null)

    System.out.println(s);out.close(); // Atentie!

    } catch(IOException e) {e.printStackTrace();

    }}

    }

  • 7/30/2019 Limbajul de programare Java

    48/192

    Analiza lexicala pe fluxuri (clasa StreamTokenizer)

    Clasa StreamTokenizer parcurge un flux de intrare de orice tip si l mparte n "atomi


Recommended