65
Alexandru Ene Cosmin $tirbu fu9ftffinm{e o nrieffitetd ps o6de€t& teorie fn ep{it*{iitie Save Editura llniversititii din Pitegfi 2008

Programare Orientata Pe Obiecte Alexandru Ene

Embed Size (px)

Citation preview

  • Alexandru Ene Cosmin $tirbu

    fu9ftffinm{eo

    nrieffitetd ps o6det&teorie fn ep{it*{iitie Save

    Editura llniversititii din Pitegfi2008

  • Alexandru Eneo Cosmin $tirbu

    Programare orient*n pe obiecteteorie pi aplica{ii in Java

    o Introducereo Aplica{ii elementare in Javao Claseo Vectori. Matricio Stringurio Mo$tenireao Clase abstracte. Interfeteo Polimorfismo Grafica in Java

    Editura Universitn{ii din Pitegti

  • fiffir*1., iirau, ':,i

    =i ,o'.. ,,:

    (ffriurrgit&tii itnStr. I6rgu din Vale, nr.l,

    I 10040, Pitetti, jud. Aigeq

    teVfax: 40 248 2l.64-48''

    liiiillttr i-t::il i:=.ll.iiii iL$i. 'li , "=*$ rir

    ilr

    Copyright O 2008 - Editura Universitifii din PitegtiToate drepturile asupra acestei edilii sunt rczewate

    Editurii Universitilii din pitegti.Nici o parte din acest volum nu poate fi reprodusd

    sub nicio form6, ftrd permisiunea scrisd a autorului.

    Editor: Lector univ.dr. Sorin FIANURedactor gef: Conf.univ.dr. Constantin TIBRIANBun de tipar: 08.1 1.2007; tiraj:150

    Referenfi gtiinfifici:- prof. univ. dr. ing. Ioan Li!5- prof. univ. dr. ing. Gheorghe Gawiloaia

    Descrierea CIP a Bibliotecii Na{ionale a RomflnieiENE, ALEXANDRU

    Programare orientati pe obiecte. Teorie giaplicafii in Java / Alexandru Ene, Cosmin $tirbu. - PitegtiEditura Universiti{ii din Pitegti, 2008

    Bibliogr.IndexrsBN 97 8-97 3-690-845-3

    I. $tirbu, Cosmin

    004.43 JAVA004.42.045

    PREFATA

    Datoritd dezvoltdrii hard-ului (procesoare si memorii maiperformante), programele au putut deveni din ce in ce mai mari (canumdr de linii de cod). Programele mari, confin mai multe erori , ceeace implici un cost de fabricalie mare. programarea orientata peobiecte (Poo) este o nour metodologie de programare care conducela dezvoltarea unor aplicafii mari, mai fiabile gilntr-un timp mai scurt,decdt progra matea structuratf, .

    Java este un limbaj de Poo, aparut in anul 1995, foarte utilizatin dezvoltarea de aplicatii dishibuite. Acest limbaj este de asemeneafoarte frecvent folosit, datoriti claritd{ii gi simplitilii lui, in studiereaconceptelor specifice de programare orientatd pe obiecte.

    caftea se adreseaza studenlilor de la facultdfi tehnice, in scopulinv6!6rii notiunilor de baza ale programdrii orientate pe obiecte, inlimbajul Java. Se presupune cunoscut limbajul C.

    Piteqti,2008 prof. dr. ing. Alexandru EneUniversitatea din Pitegti

  • CUPRINS

    PrefafiCap. l IntroducereCap.2 Aplicagii elementare in JavaCap.3 ClaseCap. 4 Vectori. MatriciCap.5 StringuriCap.6 MogtenireaCap.7 Clase abstracte. InterfefeCap.8 PolimorfismCap.9 ExcepfiiCap. 10 FigiereCap. 11 Grafica in JavaBibliografie

    5

    711

    t737556375798995105125

  • Introducere

    Capitolul 1fntroducere

    1. Ce este programarea orientati pe obiecte?2. Ce este un obiect?3. Ce este o clasi?4. De ce a apirut?5. Istoric limbaje POO.6. Limbajul Java. Istoric. Avantaje. Dezavantaje.

    1. Ce este programarea orientati pe obiecte?

    Programarea orientatd pe obiecte (prescurtat: POO) este un stilde programare in care descompunerea aplica{iei se face plecdnd de laobiecte gi nu de la funcfii, a$a cum se fdcea in programarea structurati.Proiectarea unei program ce folosegte metodologia POO incepe cugdsirea obiectelor ce intervin in aplicafie, gdsirea operaliilor ce se facasupra acestor obiecte, gf,sirea claselor gi a relafiilor dintre clase.

    2. Ce este un obiect?

    Un obiect este un lucru (o entitate soft) caractefizatprininsugiri qi comportament. insugirile sunt modelate prin variabile(variabile de instan{i), iar comportamentul prin func1ii. interminologia POO, funcfiile sunt denumite metode.

    Un obiect este mai mult decdt o structur[ de date, este oentitate ce are o stare gi este saracterizat de operalii ce pot fi executateasupra lui.

    Exemplu:Obiectul cerc poate sI aibd ca gi insugiri caracteristice:- coordonatele cercului: (x0,y0)- culoarea cu care se deseneaz[- taza.Ca operafii (metode), ce-i determini comportamentul:- calculArie$- calculPerimetru0- getRaza0 - returneazd"raza- getxOQ- getYo0- setRaza$ * seteaz[ raza

  • lntroducere

    - setXO0- setYO03. Ce este o clasi?

    Orice obiect se instanliazd, (se creazd) dintr-o clasd.O clasd poate fi vdzutd ca un gablon din care se instanliazi

    obiecte sau ca o "fabric5" de obiecte.Clasa poate fi interpretatd qi ca o generalizare a noliunii de tip

    de date.in general, o clasd conline variabile de instanf[ gi metode.Existi clase particulare care nu au decdt variabile de instanli gi

    clase particulare care nu au decdt metode.Clasele particulare ce contin doar variabile de instanf5 sunt

    echivalentul structurilor (din limbajul C) .in limbajul Java, ca qi in limbajul C+t, crearea unui obiect

    (instan{iere) se face cu ajutorul operatorului new.Se recomandi ca numele unei clase sd inceapf, cu literd mare,

    iar numele unui obiect (instanfiat dintr-o clasd) sd inceapd cu literdmici.

    Exemplu:Avem clasa Cerc gi obiectul cl din aceasti clas6.

    Cerc cl; l/ declarafiaunui obiect cl de tipul Cerc.De fapt, cl este numele unei variabile care va line adresa

    (referin{a) unui obiect de tipul Cerc. Obiectul propriu-zis va fi creat inzona de memorie denumitd heap.

    Declara{ia unui obiect nu creazd obiectul. Obiectul esteinstanfiat cu ajutorul operatorului new.

    Exemple:cl:new Cerc( );c2:new Cerc(0,0,20);

    4. De ce a apirut POO ?

    Datoritl dezvoltirii hard-ului (procesoare si memorii maiperformante), programele au putut deveni din ce ?n ce mai mari (canumlr de linii de cod). Programele mari au mai multe erori latente,ceea ce implic[ un cost de fabricafie mare. POO este un nou stil deprogramare care conduce la dezvoltarea unor aplicafii mari, maifiabile (mai pufine erori) 9i intr-un timp mai scurt.

    I 'Xmlr--

    I ntroducere

    De asemenea, cu tehnologia POO se modeleazd mai bineaplicatria ( realitatea ).

    5. Istoric limbaje POO"

    ln anii '60, la nivel de cercetare este dezvoltat limbajul deprogramare Simula, prirnul limbaj ce introduce nofiunea de clasd.

    In anii '80 apar dciu6 tendinle in limbajele de POO:1) crearea unor limbaje pur orientate pe obiect2) adbugarea la limbajele procedurale existente, a suportului

    pentru POO"Ca limbaje pur orientate pe obiecr:

    clasS de la Simula qi adaugd noi concepte debazd,pentruPOO, cum ar fi:

    - rnogtenire-legare dinarnicd ( polimorfism)Este un limbaj mai ales pentru cercetbtori.

    Limbajul C**, apbrut la inceputul anilor '80, urmeazd, cea de-a doua tendinld i,"r limbajele de POO. Este veohiul limbaj C, lacare s-a addugat suportul pentru POO.

    6. Limba.futr Java" fstoric" Avantaje. Dezavantaje.

    Limbajul .Iar.'a este urr limbaj pur orientat pe obiecte gi a apdrutin anii'90.

    Istoric: O echipa de la firma Sun Microsystems, a dezvoltat unlimbaj de programare nou, portabil, pentru microcontrolere (pentruprogramal ea unor dispozitive inteligente : telecomenzi inteligente,cl i spozitive electrocasnice inteligente, etc. ).

    Fortabilitatea este caracteristica programului de a fi executatpe mai rr'rulte platforme diferite (sisteme de operare diferite qi/sauprocesoare diferite). Avern portabilitate la nivel sursd sau la nivelbinar. Fortabilitatea la nivel sursa este realizatl,in mdsura in careprogramul sursd conline instrucliunile qi frmcliile standardizate alelimbajului respectiv. Frogramul sursd trebuie sa fie recompilat pe nouaplatbrm6 cle lurcru,

    Portabilitatea la nivr:i binar a prrrgramului Java se obline princonrpilarea programului in chrrrii otflpe, tr)clripa de programatori de la

  • t0 Introducere

    firma Sun a realizatportabilitatea la nivel binar realizAnd compilareade la limbajul sursd (.java) pentru un procesor virtual denumif maginavirtuali Java (wM * Java virtuar Machine). Figierul compilatpentru acest procesor virtual are extensia.class, iar codul rezultat secheamd cod de octe{i.

    Fste o compilare la nivel maqini pentru o maqinr virtuald .In dispozitivul in care se doregte execulia aplicafiei trebuie s6

    fie implementat[ magina virtuald Java gi aceastd maqin6, existentd indispozitivul unde se execut5 aplicalia, interpreteazd codul de octefi(executd cate o instrucfiune, pe rand) sau codul de octeli (fiqierul.class) poate fi compilat mai departe pentru procesorul real din sistem(compilare just-in-time). Execulia interpretatd este mai lentd, acestafiind principalul dezavartaj al limbajului Java, comparativ cu c++.

    Proiectul a reugit, dar echipa a fost desfiinlata pe motiv cdcererea de dispozitive inteligente a scdzut. Directorul echipei soft nu arenunlat, vdzdnd ca o utllizare deosebitd pentru Java dezvoltarea deaplicalii pentru Intemet. Astfel ch, in 1995 afdcut o demonstrafiepublicd qi a dezvoltat un browser scris in Java (Hot Java) care aveacapacitatea sd descarce dintr-o pagind web gi sd execule pe maqinaclient, mici aplicalii scrise in Java denumite applet-uri. Aceste applet-uri erau inglobate ca qi fiqiere .class (figiere de octefi) in pagina web.Astfel, pentru prima datd in istoria Internet-ului, paginileweb audevenit dinamice (cu animafie).

    $i astdzi, limbajul Java este foarte utilizatpenrru dezvoltareade aplicalii distribuire.

    Avantaje:- portabilitate la nivel binar- are sintaxa Nirnbajului C (SA% - 9A%I- este pur orientat pe obiecte- are aspecte de securitate mai bine puse la punct dec6t

    limbaiul C- a eliminat din limbajul c nofiunile controversate (lucrul cu

    . pointeri)- a eliminat moqtenirea multipld- suportd lucrul cu fire de executie.- verificd indexarea tablourilor.- este distribuit gratuit de firma Sun.

    Aplicafii elementare in Java

    Capitolul2Apticafii elementare in Java

    1. Prima aplicafie Java.2. Ce sunt parametrii din linia de comandi?3. Cum se face citirea de la tastaturi?4. Pachete de clase.

    1. Prima aplica{ie Java

    Orice aplica{ie Java trebuie si confind o clas6 ce are definitdmetoda main( ).

    Cel mai simplu program Java: vom afiqa un text pe ecran.Aplicafia va consta dintr-o singuri clas6, iar aceasti clas6 nu arevariabile de instan{6, numai o singurd metodd ( metoda main( )).

    Si afigim pe ecran urmatorul text, care se gdseqte in Biblie:"Cdutafi mai int6i impdrd{ia lui Dumnezeu!".

    class Mailntai{

    public static void main(String argsIJ ){

    System. out.println("Cautati mai intai Imparatia lui Dumnezeu!,) ;]

    II

    2. Ce sunt parametrii din linia de comandi?

    Exemplul IScriem o clas[ in care pentru un numdr natural dat caparametru inlinia de comandd ii vom afiga divizorii. Dezvolt[m clasaAfigareDivizori.

    Compilarea este operafia de traducere din limbajul surs[(java) ?n limbajul maqinl al maginii virtuale Java. in urma compilirii> figierul.class.

    javac AfiqareDivizori.java Execufia programului se face folosind interpretorul java

    ( i nterpretea zd" pr o gr amul instrucf iune cu instrucf iune).Exemplu:

    java AfigareDivizori 6

    ll

  • 12 Aplicafii elementare in Java

    - In urna execufiei, se afrgeazd: 12J

    6Parametrii din linia de comandd sunt in mod automat memora{i

    ca String-uri in vectorul args[ ], ce e dat ca parametru in metodamain( ).

    Astfel, primul argument din linia de comand[ este memorat inargs[0].

    Numele clasei trebuie si corespund[ cu numele fiqieruluisursa.

    class AfisareDivizori{

    public static void main(String args[ J ){

    // in args[0J s-a memorat numdrul tastat, ca String!// convertesc numdrul de la String la int:

    int nr: Inte ger. parse Int (args [0] ) ;int i;for (i:1; i

  • l4 Aplica{ii elementare in Java

    "nr3: ")) iint max:nrl;if (nr2>max) max:nr2;if (nr3>max) max:nr3;System. out. println( " Maxim: " * max) ;

    It

    Operatorul 'o*" este un operator de concatenarc qirealizeazdconcatenarea intr-un gir a unui gir gi a altui operand(tot qir sau numdrintreg, real, etc.).

    in privinla compildrii acestui program:javac Maximjavajava Maximnrl:7nrZ:10nr3:6Maxim:l0

    Exemplul2Se citesc de la tastaturd trei numere intregi a, b gi c. SI se ordonezeaceste numere crescf,toare, astfel inc0t a va fi minimul, iar in c va fimaximul. Citirea de la tastaturd se va face cu metodashowlnputDialog$ din clasa JOptionPane.

    import javax.swing.*;class Ordonare3

    {public static void main(String args[J){

    int a:Inte ger.parselnt (JOptionP ane. show InputDialo g(" a: ")) ;int b : Inte ger.parselnt (JOptionP ane. show InputDialo g(" b : "11,int c :Inte ger. parselnt (JOptionP ane. show InputDialog(" c : ")) ;f(a>b){

    // le comutam:int aux:a; a:b; b:aux;]f(a>c){

    //le comutam:int aux:a; a:c; c:awc;

    Aplica{ii elementare in Java

    ]f(brc){

    //le comutam:int aux:b;b:c; c:aux;

    ]System.out.println(a-t " " + fi + " " *c) ;

    Exemplul3Se citesc doui numere a qi b. S[ se afigeze dacd cele doud

    numere au acelagi numdr total de divizori.

    import javax.swing.*:class Comparare

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

    int a: Inte ger.parselnt (JOptionP ane. show InputDialo g('t a: I t11 ;int b : Inte ger.parse Int (JOptionPane. show InputDialog(" b : ")) ;int na:2; // numarul de divizori ai lui a// orice numar are ca diviyori pe I si el insusifor(int i: 2 ; i

  • 16 Aplica{ii elementare in Java

    conflictului de nume de clase. Numele complet al unei clase este datde numePachet.numeClasi.o Exemple de pachete de clase:- javax.swing (clasele pentru grafica)- java.lang (clasele debazdale limbajului: String, Integer, System,

    etc.)- java.util (clasa Random)- java.io (pentru figiere: FileOutputStream)- java.sql (pentru baze de date)- java.net (pentru clase de comunica{ii in refea)

    Intr-o aplica{ie hebuie folosit numele complet al clasei, adiciPachet.nume.

    o Exemplu:String nume:javax.swing. JOptionPane.showlnputDialog

    ( "dafi un nume:");Pentru a evita folosirea numelui complet al clasei de fiecare

    datd cdnd se folosegte intr-o aplicalie (deoarece este dificil de scris unnume a$a de lung), trebuie ca pachetul din care face parte clasarespectivd sd fie in mod explicit importat la inceputul programului.Exemplu:

    import javax.swing.*sau se poate importa in mod explicit doar clasa respectiv[:

    import javax.swing.JOptionPane;Pachetul java.lang este in mod implicit importat in orice

    aplicafie java.

    Clase

    Capitolul3Clase

    1. Specificatori de acces.2. Modul de accesare a membrilor publici ai unei clase3. Tipuri primare de date.4. Cum se definesc constantele?5. Exemplu de clasi ce are numai date.6. Exemplu de clasi ce are numai metode.7. Polimorfism parametric.8. Exemplu de clasi ce are qi variabile de instan{i gi metode.9. Constructori.

    1. Specificatori de acces.

    Prin membrii unei clase infelegem variabile de instanfi gi metode.Accesul la aceqti membrii este controlat prin intermediul unorspecificatori i modificatori de acces.

    Avem urmltorii patru specificatori de acces ( trei cuvintecheie):

    1) private2) public3) protected4) default (implicit).

    t Specificatorul de acces private:Exemplu:- pentru o variabild de instan{d: private int- pentru o metodd: private int calcul( )

    O variabild de instanfi privatd nu poate fi accesatd decdt dinmetode ale clasei respective.

    O metodi privatd nu poate fi apelati decdt de o altd metodl dinclasa respectivd.

    Deci, membrii private ai unei clase nu pot fi accesa[i dinafarcclasei respective.

  • l8 Clase

    o Specificatorul de acces public:Membrii public ai unei clase pot fi accesafi atdt din clasa

    respectivd, cdt gi din orice altd clasd.I Specificatorul de acces protected:

    Este legat de relalia de mogtenire intre clase. Va fi studiatulterior.t Specificatorul de acces implicit (atunci cdnd in fala declaraliei unuimembru nu este scris nici unul dintre cei trei specificatori de accesanteriori).

    Exemplu:intraza:

    - membrii implicili pot fi accesa{i din clasa respectivd, dar qi dinorice alti clasl care face parte din acelagi pachet cu clasarespectivd.

    - membrii cu accesul implicit nu pot fi accesali din alte clase ce facparte din alte pachete, diferite de pachetul clasei respective.

    2. Modul de accesare a membrilor publici ai unei clase.

    Din afara clasei respective, membrii publici sau cu accesul implicit aiclasei, se acceseazd in doi paqi, astfel:

    f . instanfiez obiect din clasa respectiv[:2. accesezmembrul clasei cu sintaxa:obiect.numeMembruDeAccesat.

    Exemplul 1Cerc c:new Cerc( );int r:c.getRuaO;

    Exemplul2Fie clasele A si B:class A

    {public int x;

    ]class B

    {public static void main(String argsI J){

    Clase

    // Vrem sa introducem in x (din clasa A) valoarea 7: x+- 7r71 + GRE$ITA a:new AO;a.x:7;

    ]]

    A doua posibilitate de accesare este valabild pentru membriideclarafi statici. Declararea se face cu ajutorul cuvintului cheie static

    Membrii statici pot fi accesafi, pe l6ng[ prima modalitate gi astfel:- nu se mai instanfiazd obiect din clasa respectivd, ci se acceseazd

    folosind sintaxa:NumeClasd. numeMembruDeAccesat.

    o Exemplu:Metoda parselnt( ) din clasa Integer, are semndtura:

    public static int parselnt(String)int nr:Integer.parselnt(" I2");

    Se recomand[ ca variabilele de instan{i ale unei clase sd fiedeclarate private, iar accesul la ele sd se facd prin metode public detipul:

    set( ) - pentru a scrie in elegetO-pentruacitiDeqi se scrie mai mult cod, folosind nigte metode verificate,

    programul este mai fiabil.F. Brooks dd urm[toarea secvenf5 de timpi consumafi inrealizarea

    unor programe mari (cu mii de linii sursl):I/, ai"timpul total, pentru designI/u codare

    If testare componente (testarea modulard)

    f testarcansamblu (testarea de integrare)

    3. Tipuri primare de date

    in Java existd urmdtoarele tipuri primare de date:a. int: numere intregi cu semn, reprezentate pe 4 octe{i.

  • Clase

    Spre deosebire de limbajul C, in Java nu existl modificatorul de tipunsigned.b. char pentru date de tip caracter.

    O variabild de tip char ocupd 2 octeli.Constantele caracter in Java sunt reprezentate cu ajutorul coduluiUnicode.c. boolean pentru date ce au doud valori: true qi false.d. byte numere intregi intre - I 28 qi +t27 , ocupl un octet.e. float pentru reprezentarea numerelor reale.f. double pentru reprezentarea numerelor reale (precizie mai mare catipul float).

    La instanfierea unui obiect dintr-o clasd, dac[ variabilele deinstanfi ale clasei nu sunt in mod explicit ini{ializate (princonstructori), ele sunt in mod automat inilializate astfel:int--+0byte--+0char---+'\0' (cu caracterul al c6rui cod Unicode este 0)boolean---+falsefloat-+0.0double-r0.0

    4. Cum se definesc constantele?

    Constantele sunt variabile care au un con{inut fix.Constantele se declarf, in Java cu ajutorul cuvdntului cheie final.Exemplu:

    final int NR*ELEVI:3O;XtEffVeb eroare de compilare

    Valoarea unei constante nu se modificl pe parcursul programului.Se recomandi ca numele constantelor sd fie scris cu litere mari.

    5. Exemplu de clasi ce are numai date.

    class NumaiDate

    {public int x;public double y;

    ]

    Clase

    Compilarea:javac NumaiDatejava = fiqierul NumaiDate.class

    Pentru a putea sa executam aplica[ia, trebuie sa scriem o clas[ cecontine metoda main$:class Test

    {public static void main(String argsI J){

    // x

  • Clase

    return (x+y+z)/3.0;]

    ]

    7. Polimorfism parametric.

    Prin polimorfism se infelege: acelagi nume - mai multe forme.Polimorfismul este o noliune specificd pentru POO.Polimorfismul poate sd aparl la compilare sau la execufie.Polimorfismul parametric este un polimorfism la compilare.

    Acesta se referd la faptul cd intr-o clasi putem avea mai multe metodece au acelagi nume, dar definilii (implement[ri) diferite. Metodele careau acelaqi nume diferf, intre ele prin lista de parametrii (9i evident 9iprin implementare). Compilatorul gtie inc6 dinfaza de compilare ceversiune de metodd sd apeleze, pebazanum[rului diferit de parametrii

    sau pe baza tipurilor diferite de parametrii. Acest mecanism se maicheaml overloading (supraincdrcare).Exemplucitim de la tastatura trei numere. calculati cmmdc al primelor dou[

    numere qi cmmdc pentru toate trei.

    import jwax.swing.*;class CalculeCmmdc

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

    //citim trei numere tntregi:int a:Inte ger.parselnt (JOptionP ane. show InputDialog( " a: " ) )'int b:Integer.parse Int (JOptionP ane. show InputDialog(" b : " )) ;int c:Inte ger.parse Int (JOptionP ane. showlnputDialog( " c : " )) ;int rezl:cmmdc(a,b);Sy s tem. ouL println(re z I ) ;int re z2 : cmmdc (a, b, c) ;Sy s t e m. o ut. pr intln(re z 2 ) ;

    )

    private static int cmmdc(int a, int b)

    Clase

    {while (a!:b)

    f (a>b) a:a-b;else b:b-a;

    return a;)private static int cmmdc(int a, int b, int c){

    while (a!:b)f (a>b) a:a-b;else b:b-a;

    while (a!:c)f (a>c) a:a-c;else c:c-a;

    return a;)

    )

    8. Exemplu de clasi ce are gi variabile de instan{i gi metode

    Scriem clasa Cerc ce are ca variabile de instan{i raza cercului gicoordonatele lui, gi ca metode:setRaza( )getRaza( );setXO( );setYO( )getX0( )getY0( );arie( ).

    class Cerc

    {private int raza;private int x0,y0;public void setRaza(int raza){

    this.raza:raza;j/* cuvdntul cheie "this" este o refertnyd cdtre obiectul

    curent(obleclul inslanyiat din clasa in care apare this).

  • Clase

    */public int getRaza( ){

    return raza;

    ]public void setX}(int x){

    x0:x;)public void setY?(int y){

    y0:y;]

    public int getX0( ){

    return x0;]public int getY0( ){

    returny0;]public double arie){

    re turn Math. P I * raza* raz a ;]

    )class TestCerc

    {public static void main(String argsI J){

    Cerc c:new Cerc( );c.setRaza(10);double a:c.arieO;Sy stem. out. println ( " arie : " * a) ;

    )]

    Clase

    9. Constructori.

    Defini{ie: Constructorul este o metodi specialI a unei clase care areacelagi nume cu clasa, nu are in semn[turi cdmpul pentru tipul valoriiretumate gi este apelat[ in mod automat (implicit) la instanlierea unuiobiect din clasa respectivi.

    O clasi poate sd aib[ in mod explicit definili zero, unul saumai mulli constructori.

    In mod tipic, un constructor face ini{ializdrile variabilelor deinstanf6.

    Exemplul IRescriem clasa Cerc in care definim explicit doi constructori: primulinilializeazdrazaSi coordonatele centrului cu (0,0) gi al doileainilializeazdraza gi coordonatele centrului cu trei numere date caparametrii.

    class CercrI

    private int raza;private int x0,y0;// primul constructor:public Cerc(int r){

    raza:r;x0:0;y0:0;

    )// al doilea constructor:public Cerc(int r, int x, int y){

    raza:r;x0:x;y0:y;

    ]public double arie( ){

    return Math. P l*raza*raza ;]

    It

    25

  • 26 Clase

    Exemplu de utilizare pentru clasa Cerc:class TestCerc

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

    Cerc c I :new Cerc(I 0, 5,7) ;System. out. println( " arie : " + c I . arie ( )) ;Cerc c2:new Cerc(3);Sy stem. ouL println(c2. ar ie ( ) ) ;

    ]]

    Constructorii au fost introduqi in POO pentru a nu uita sifacem inifializlrile variabilelor de instanp.

    Exemplul2Scriem clasa Numar ce are ca variabild de instan{i privatd un num6r

    intreg nr, qi ca metode:- constructorul,ceinilializeazdvatiabilanr;- getNrQ, ce returneazl valoarea variabilei private nr;- metoda estePatratPerfect0 ce returneazd true dac[ nr estepitrat perfect qifalse \n caz contrar;- metoda estePrimQ ce returneazd true dacd nr este prim qifalsein caz contrar;- metoda afisareDivizori0 ce afryazd divizorii numlrului nr.Scriem gi o clas[ de test pentru clasa Numar.class Numar

    {private int nr;public Numar(int x)

    {nr:x;

    )public int getNrQ

    {return nr;

    )publ ic v o id afi s are D iv izor i QrI

    //nr. I, este sigur divizor:

    Clase

    Syste m. out. println(" 1 ") ;//Cautam divizorii intre 2 si jumatatea numarului:for(int i:2 ; i

  • Clase

    Exemplul3Construim clasa Dreptunghi, ce are ca variabile de instanfd private,doud numere intregi a gi b, ce reprezinti lungimile laturilor unuidreptunghi. in aceastd clasd avem ca metode:- constructorul, ce face inilializdrile;- metoda calculPerimetruQ, ce returneazd perimetruldreptunghiului;- metodacalculArieQ,cereturneazl,ariadreptunghiului;- metoda estePatratQ, ce returneazi true dacd dreptunghiul estepdtrat;- metoda suntEgale0, ce are ca parametru un dreptunghi d 9iscoate ca rezultat true dacd dreptunghiul curent (cel pentru care seapeleazdmetoda) este egal cu dreptunghiul d.Scriem gi o clasd de test pentru clasa Dreptunghi.class Dreptunghi

    {private int a;private int b;public Dreptunghi(int x,int y)

    {a:x;b:y;

    ]public int c alcul P e rime tru 0{return 2*(a+b);

    )public int calculArie){return a*b;

    ]pub I ic b oole an e s te P atrat Q{

    f(a::b)return true;else returnfalse;

    ]public boole an sunt Egale (Dreptunghi d){

    Clase

    f ((this. a: --d. a) & & (this.b : : d. b))re turn true ;else returnfalse;

    ))class TestDreptunghi/Ipublic static void main (String argsfl){Dreptunghi d:new Dreptunghi (5, 7) ;Sy stem. out.println(" Primetrul e ste " -l d.calculP erimetru)) ;System. out.println("Aria este " * d.calculArie Q) ;System. out.println("Dreptunghiul este patrat: tt + d.este P atratQ) ;Dreptunghi d I :new Dreptunghi (5,7) ;Sy s te m. o ut. pr int ln ( " S unt e gal e : " -l d. s unt E gal e (d I ) ) ;]

    )

    Ce trebuie adiugat in clasa Dreptunghi astfel incdt pentru un obiectDreptunghi s[-i putem afiqa lungimile laturilor? Vom prezenta treisolutii.Solutia l: Addugdm metodele publice getX( ) qi getY( ) in clasaDreptunghi.public inr getX( ){return x;

    ]

    public int getY( )tI

    return y;)

    fn main( ):System. out.println( " x: " + d. getX( )) ;System. out.println( " y: " + d. geYX( )) ;

    Solutia 2: Scriem metoda publici afigare0 in clasa Dreptunghi.public void afisare( ){

    Sy s te m. ouL println( " x : " + x) ;

    29

  • Clase

    Sy st em. out println( " y : " +r1,jin main( ):

    d.afiqare( );

    solutia 3: (nerecomandat[) Facem variabilele x qi y publice in clasaDreptunghi gi le accesdm direct din main0 cu: d.x qi d.y.

    Exemplul4Dezvoltam clasa DouaNumere, ce are variabile de instanli doudnumere intregi a gi b, gi ca metode:- constructorul ce face ini{ializdrile;- metoda maxim0, ce retumeazd maximul dintre a 9i b;- metoda cmmdco, ce returneazd cel mai mare divizor comun alcelor dou[ numere.Scriem qi o clasd de test pentru clasa DouaNumere'

    class DouaNumere

    {private int a,b;public DouaNumere(int nl, int n2){a:nl;b:n2;

    ]public int maximQ{

    if(a>b)return a;else return b;

    ]public int cmmdcQ{int A:a; int B:b;while(A!:B)if(A>B)A:A-B;else B:B-A;

    return A;j

    )class

    {Test2Numere

    Clase

    public static void main(String args[J){DouaNumere d:new DouaNumere (l 2, I 8) ;System.out.println("mmimul este : " +d.maximQ) ;Sys tem. ouL print ln(" cmmdc e s te : " + d. cmmdc Q) ;j

    )

    Exemplul5Scriem clasa TreiNumere, ce are variabile de instanfdlntregi a,b qi c, gi ca metode:

    numere

    - constructorul ce face inilializ[rile;- metoda maximQ, ce retumeazl maximul dintre a, b gi c;- metoda suntPitagorice0, ce retumeazd true, dacd a, b, c suntnumere pitagorice.Scriem qi o clasd de test pentru clasa TreiNumere.class TreiNumereIIprivate int a,b,c;public TreiNumere(int nl, int n2, int n3){a:nl;b:n2;c:n3;

    )public int maimQ{

    int mec:a;f(b>mac)mm:b;if(c>max)ma)c:c;return mqx;

    )pub I ic b oole an sunt P itagoric e QI

    if((a* a: : b * b + c * c) ll (b * b : : a* a+ c * c) ll (c * c : : a* a+ b *b) )return(true);

    else return(false);l

    lclass Tbst3Numere

  • 32 Clase

    {public static void main(String args[J){

    Tre iNumere t:new Tre iNumere (3, 5, 4) ;Sy s t e m. o ut. pr intln (" max i mul e s t e : " + t. max im Q ) ;if(t. s unt P it ago r ic e Q ) Sy s t e m. o ut. pr int I n ( " Sunt nume r e p it a go r i c e " ) ;else System. out.println("Nu sunt numere pitagorice ") ;

    ])

    Exemplul6SI se dezvolte clasa Complex, ce are variabile de instan!5 private douinumere intregi re gi im (partea realS gi partea imaginari a unui numlrcomplex) gi ca metode:- constructorul ce face inilializdrile;- modul0, ce retumeazdmodulul numlrului complex;- suma0, ce are ca parametru un numdr complex c, prin care lanumdrul oomplex curent se adun[ numbrul complex c (rezultaful sedepune in numIrul curent);- produs0, ce are ca parametru un numdr complex c, prin care innumdrul complex curent se depune rezultatul inmul{irii dintre numIrulcomplex curent gi num[ru] complex c;- getReQ,cereturneazdpartearealhanumiruluicomplex;- getlm0, ce retumeazdpartea imaginard a numf,rului complex;- equals0, ce redefinegte metoda equals0 din clasa Object, princare se compard din punct de vedere al confinutului, doud obiecteComplex: obiectul curent gi obiectul dat ca parametru;- toString0, ce redefinegte metoda toString0 din clasa Object,prin care se dd o reprezentare sub formd de String a unui numdrcomplex;Scriem gi o clasa de test pentru clasa Complex.class Complex

    {private double re;private double im;public Complex(double x, double y)

    {re:x;i*:y']

    Clase

    public double getReQ{return re;

    )public double getlmQ{return im;

    )public double modulQ{re turn Math. s qrt (re *re * im* im) ;

    )//adunarea nr. complex curent, cu un alt nr. complex, cu depunerea//rezultatului in numarul complex curent:public void suma(Complex c){re:re-lc.re;im:imic.im;

    ]//inmultirea nr. complex curent, cu un alt nr. complex, cu depunerea//rezultatului in numarul complex curent:public void produs(Complex c){re:re*c.re-im*c.im,'im:re*c.im+im*c.re;]

    //redefinirea metodei equalsQ din clasa parinte Object://(trebuie sa se pastreze aceeasi semnatura:)public boolean equals(Object obj){

    C omplex c : (Complex) obj ;iftc!:null)f((re : : c. re) & & (im: : c. im)) return true ;

    returnfalse;)//redefinirea metodei toString) din clasa parinte Object:public String toStringQ{String s : " (" * re + ", " + im* ") " ;

  • ]]

    Clase

    return s;

    ]]class TestComplex

    {public static void main(String args[])

    {Complex c I :new ComPlex( I, I ) ;Sy st e m. out. pr intln(" Modulul e ste : " + c I . mo dul Q ) ;Complex c2 :new ComPlex(l, I ) ;cl.suma(c2);System. out.println(" suma : " + c I . toStringfi ;Complex c 3 :new ComPlex( 1, I ) ;Sy s t e m. out. pr intln ( " s unt e gal e : " + c 2. e qual s (c 3 ) ) ;

    Exemplul TS.ri.. clasa Unghi, ce are ca variabilS de instan{d privatl un numdrintreg x, mdsura in grade a unui unghi' qi ca metode:- constructorul;- suntComplementareQ, ce ate ca parametru un alt unghi u, qicare refurneazd true dacf, unghiul u este complementar cu unghiulcurent;- conversieRadiani0, ce returneazd valoarea exprimat[ inradiani a unghiului curent x.Scriem qi o clasl de test pentru clasa Unghi'class Unghi

    {private int x;public Unghi(int x){this.x:x;

    )public boole an suntComplementare (Jnghi u)

    {if(thi s. x + u. x : : 9 0) re turn true ;else returnfalse;

    )

    I

    classII

    Clase

    pub I ic doub I e c onv er sie Radiani ()

    t

    return (Math. P I*x)/ I 8A ;II

    TestUnghi

    public static void main (String argsIJ){Unghi a:new Unghi(3?);System. out.println(" Radiani: " + a. conversieRadiarci Q) ;Sy s te m. out. pr int ln ( u's unt c ornpl e ment a/' e : " -

    a. swntC o mpl e me nt ar e (new Un glhi (6 0) ) ) ;]

    I

    llxemplul 8Sd se dezvolte ciasa Timp ce are ca variabile de insianfd.intregi: h, min, sec (ore, rninute, secunde). Ca metode:- constructorul;- conversielnSecundeQ ce returneazi timpul curent, exprimat insecunde;- oomparaQ, ce are ca pararnetru un 'fimp t, gi care l'eturneazS I dacdtimpul curent este mai mare ca t, 0 dacd cei doi timpi sunt egali , gi -1in caz contrar.Scriem gi o clasS de test.class Timp

    l

    private int h; /ioreprivare int min,'private int sec;

    public Timp(int ore,int m, int s)I

    h.--.ore,'

    min:n1,'(CCr":ir1,9,'

    I

    numere

  • IJ

    ]

    return 3 60A *h+ 6 0 *min+ s e c ;)public int compara(Timp t)//returneaza A daca cei d"oi timpi sunt egali//returneaza I daca timpwl curent > timpul t clat ca argument//returneaza -l daca timpul curnt < tiwrpul t{int s e c I : thi s. c onv er s i e S e cunde 0 ; / I t iwpul cu r ent, i n s e cundeint s e c : t. c onv e r s i e S e cwnde {) ; //timpul t, in s e cundeif(secI>sec)return i;else if(sec 1 ::sec)return A,'else return -l;

    class TesfTimp/I

    public static void main(Sn'ing args{J)rI

    Timp t 1 :new Timp(l, 5, 6) ;Timp t2 :new 7'imp(1, 5, 6) ;int r ezultat :t l . com.p ar a (t 2),'if(r e zult at : : I ) Sy s t em. o ut. pr int lrc ( " t I > t 2 ") :el s e if(r e zul t at : : 0) Sy s t em. o ut. pr intln ( " t I :t 2 " ) iel s e System. out. pr intln (" t I < t 2 ") ;jj

    Vectori. Matrici.

    Capitolul4Vectori. Matrici.

    1. Vectori intrinseci.2. Exemplu de metode ce au ca parametrii vectori intrinseci.3. Matrici.

    l. Vectori intrinseciVectorii intrinseci sunt tablouri unidimensionale.Spre deosebire de limbajul C, in limbajul Java, vectorii

    sunt obiecte, instanfe ale unei clase intrinsec[ limbajului.Fiind obiecte, vectorii intrinseci (pe scurt ii vom numi vectori) se

    instanliazd cu ajutorul operatorului new.Numele vectorului, ca gi in limbajul C, este o referinfi cdtre zona

    de memorie unde se memorcazdobiectul vector.Componentele vectorului se acceseazdprin indexare, ca gi in C.Un vector, cu ajutorul operatorului new, se instan{iazd conform

    sintaxei:tip numeVector[ ]:new tip[dimensiune] ;

    Exemplu: int a[ ]:new int[10];Componentele vectorului sunt:a[0], a[1], ...,afgf

    Un vector poate fi creat si prin listarea directa a valorilor luiinitiale.

    Exemplu:int b[]:{1,5,-1};Aceasta instructiune, putea fr rcalizata echivalent, astfel:int b[]:new int[3];b[o]:l;b[1]:s;bl2l:-1;

    OBS: 1. Spre deosebire de limbajul C, in Java, se verifici indexareain afara granitelor gi dac[ se face aceastd indexare, avem eroare laexecufie.

    2. Spre deosebire de limbajul C, dimensiunea vectorului poates[ fie gi o variabilI, ce a fost initializatd,

  • 38 Vectori. Matrici.

    Exemplu:C-in+dinrl& Java: int dim:10;

    iqt a[dirn]; int a[ ]:new int[dim]; //da!3. Atentrie la diferenfa inhe declararea unui vector 9i definirea

    sau crearea sau instanfierea lui.Exemplu:double bll; ll declarare vectorb:new double ll0l; I I Crearea obiectului vector:

    Vectorii pot contine ca elemente ,nu numai date primitive, ci si

    obiecte. Exemplu:Integer v 1 []:new Integer[3];

    Sau:Integer v2[]:{new Integer(l), new Integer(3), new Integer(4)};in clasa din care se instanfiazS vectorii, este definita variabila

    de instanf5 publicalength de tip read-only (poate fi doar cititl, nu 9imodificatd) in care, in mod automat, la instanfierea vectorului, se

    memoreazl dimensiunea vectorului.Pentru a modela vectori a cdror dimensiune poate fi

    modificat[, vectori dinamici, se foloseqte clasa Vector ce este

    definit6 in iava.util.Accesarea componentelor unui vector din clasa Vector nu se

    mai face prin indexare, ci prin metode: get( ), add( )' etc..

    Exemplul 1Citim un numdr natural N. Citim N numere intregi intr-un

    vector a. Sd calculdm qi afig5m maximul din vector.

    class CalculMaxim

    {public static void main(String args[ ]){int N: Integer.parse Int (JOptionP ane. show InputDialo g( " N: " )1'int a[ ]:new intNl;int i;for (i:0; i

  • ]]

    Vectori. Matrici.

    Exemplul 3Se citegte de la tastaturi un numdr natural N; se instan\iazd, un

    vector de N numere intregi. Si se completeze acest vector cu numerealeatoare in gama 0..N-1, cu condilia ca fiecare numdr din aceastdgamd sd apari o singur6 datd. (Problema anterioarS, dar un altalgoritm: vom introduce pe rdnd in vector, cdte un numdr aleatoro cucondilia ca sd fie diferit de numerele anterioare introduse).import java.util.*;class Aleatoare

    {public static void main(String args[J){

    Jinal int N--10;int a[J:new int[NJ;Random r:new RandomQ;int i;int nr;for(i:0;i

  • Vectori. Matrici.

    2. Exemplu de metode ce au ca parametrii vectori intrinseci.

    Spre deosebire de limbajul C, unde intr-o funcfie ce avea caparametru un vector, trebuia dat ca parametru gi dimensiuneavectorului, in Java, dimensiunea vectorului nu mai este necesard caparametru, deoarece dimensiunea vectorului este memoratd invariabila publicd length.

    Exemplul 1Citim de la tastaturd doi vectori a qi b ce au aceeagi dimensiune N.

    Sd afiqdm dac6:a) vectorul a are toate elementele diferite intre ele.b) vectorul a este egal cu vectorul b.Vom folosi doui metode separate: metoda suntDiferite( ) qi metodacompard( ).class Compara{public static void main(String args[ J){//dimensiunea comund:int N: Integer.parselnt (JoptionP ane. show InputDialo g( " nA: " 11'int i;int a[ ]:new int[NJ;// citire a[ ]:for (i:0; i

  • Vectori. Matrici.

    for(i:0;i :0 ; i-)

    a[i+1J:afiJ;a[0]:aux;

    )]

    )

    Exemplul4Scriefi o aplica{ie in care se implementeazd algoritmul de

    clutare binard a prezentpi unui num[r x citit de la tastaturd intr-unvector sortat cresc[tor.class CautareBinara{public static void main(String args[J){int a[J : {1, 5,7,9, I 2, 30} ;int x:l;//Este prezent x in vectorul a[J ?if(estePrezent(x,a,0,a.length-1)system.out.println("Este prezent.,,);e I se Sy s te m. ouL println(" Nu e s te pre zent. ") ;

    )

    private static boolean estePrezent(int x,int a[J,int s,int d){if(s>d) returnfalse;if(s::d){

    if(x : : a [sJ ) re lurn |rue ; e I se re turn fal se ; ]int m,'

  • Vectori. Matrici.

    m:(s+d)/2;f(x : -- a [m] ) re t urn t rue ;e t s e if(x < a I mJ ) re turn e st e P r e z e nt (x, a, s, m- I ) ;else return e stePrezent (x,a,m* 1,d) ;

    ]//estePrezent]Exemplul5

    -s''ie{ioaplica!ieJavaincareseimplementez5algoritmulde

    sortare prin metoda selecfiei maximului.import jwm.swing.*;class SelectieMaxim{public static void main(String args[]){final int N:5;int A[]:new intfN];int i;//citire vector A[]:for(i:0;i

  • Vectori. Matrici.

    afisareVector(v);System.outprintlnQ;

    )private static void afisareVector(Vector v)

    {int n:v. s ize Q ; // dimens iune a o b ie ctului Ve ct or :for(int i:0;i

  • Vectori. Matrici.

    for(i:0;i

  • Vectori. Matrici.

    nL: Inte ger.parselnt (JOptionP ane. show InputDialog("nr. linii: ") ) ;int nC;//numar coloane matricenC:Integer.parselnt(

    JOptionP ane. show InputDialog("nr. coloane - ")) ;int a[] IJ :new int[nLJ [nCJ ;//citire matrice:int ij;for(i:0;i

  • Vectori. Matrici.

    //Se compara toate elementele vectorului, cu primul:

    .for (int i: I ; i

  • Stringuri

    in limbajul Java, nu existd nofiunea de destructor, eliberareaspaliului de memorie dinamicd atunci cdnd un obiect nu mai estenecesar, se face automat de cdtre un proces (fir de execu{ie) denumitgarbage collector (colectorul de gunoi). Acest garbage collectorsesizeazdcdnd un obiect nu mai este necesar gi dezalocd in modautomat spa{iul de memorie ocupat de acesta.

    in cazul stringurilor asupra clrora trebuie ftcute multe modificdri,se recomand6 sd se foloseasc[ in loc de clasa String, clasaStringBuffer din pachetul java.util, stringurile instanliate din aceast6clasd fiind mutabile (pot fi modificate).

    2. Metode debaza din clasa String.

    1. Cea mai importantd metod[ este metoda length( ) cu semndtura:public int length( )

    care returneazd lungimea qirului.2. metoda charAt( ) cu semndtura:

    public char charAt(int index)care returneazd caracterul de la pozilia index.

    ATENTIE: in limbajul C: s[i]In limbajul Java: s.charAt(i)

    OBS: Pentru a citi girul de la tastaturd se folosegte metodashowlnputDialog( ) din clasa JoptionPane care face parte dinpachetul javax.swing.

    ExempluCitim un gir de la tastaturd. Si afigdm de cdte ori apare caracterul a ingir.( pentru'ocasa" - 2).import javax.swing.*;class Sl{public static void main(String argsI J){String s :JOptionP ane. show InputDialog( " Sir : " ) ;int contor:0;int i;for (i:0; i

  • Stringuri

    Exemplul3SI scriem o metodi ce stabileqte dacd toate caracterele unui ;ir

    sunt diferite intre ele.pr iv at e s t at ic b o ol e an t o at e D ifer it e (S tr ing s)

    {for (int i:0; i

  • Stringuri

    mai mic decdt girul dat ca parametru, metoda scoate un rezultat maimic ca 0.Exemplu:String sl:"Abc";String s2:"Aa"iint rez:sl.compareTo(s2); / / >0

    5. Vectori de qiruri.

    Vectorii se giruri se declar[ la fel ca si vectorii de primitive.Exemolu

    Se citesc N nume de la tastaturi intr-un vector de stringuri. Sdse sorteze vectorul de stringuri in ordine alfabeticl.class VectorS

    {public static void main(Sning args[ J){int N:Inte ger. parse Int (JOptionP ane. show InputDialog( " N: " ) ) ;String nume[ ]:new String[NJ;for (int i:0; i

  • ("timpl (hh:mm:ss) : ");String t imp2 :JOptionP ane. show Input Di alo g

    ("timp2 (hh:mm:ss) : ");//Extragem dinfiecare timp, orele, minutele si secundele.// Folosim clasa StringTokenizer pentru a extrage acesti atomi.StringTo lrenize r tk:new StringTokenizer (timp 1, " : " ) ;int ore I : Inte ger. p ar se Int (tk. nextToke "0 )

    ;int min I : Inte ge r. par se Int (tk. nextTofu ,0 ;int s e c I : Inte ger. par s e Int (t k.nextToke"Q ) ;//Calculam primul timp, in secunde:int T I : 3 600*ore I + 60*minl * sec I ;//Similar, pentru timp2 :tk: new StringToke nizer (t imp2, " : " ) ;int ore 2 : Inte ge r. p ar se Int (tk.nextTofu ,0 ;int min2 : Inte ger. parse Int (tk.nextTofunD ;int se c2 :Inte ger. parselnt (tk.nextTokenQ) ;int T2 : 3 600*ore2 + 60*min2 * sec2 ;ifQ I > T2) Sy s tem. out. println(' t imp I > t imp 2 ") ;e t s e ifQ 1 : : T2 ) Sy s t em. out. println(" timp I : t imp2 " ) ;else System. out.println("timp I < timp2 ") ;]]

    Mogtenirea

    Capitolul6Mogtenirea

    1. Generaliti{i.2. Exemple.

    1. Generalitl{i.Mogtenirea este capacitatea prin care dezvoltlm o noud clas[

    plecAnd de la o clasd existentd. Noua clasd oblinutd prin moqtenire dela clasa existent5, se cheamd clasl derivati ( sau clasi fiu sausubclasi). Clasa existentd din care prin mogtenire derivdm subclasa secheami clasi de bazl (sau clasi pirinte sau supraclasi).

    Mogtenirea este o trisltur[ fundamentald in POO. Ea permitesd dezvoltdm mai rapid noi clase pe baza claselor existente. Astfel, inloc sI proiectf,m de la zero o nou[ clas[, cdutdm intre clasele existenteo clas[ asemdnitoare gi noua clasd o derivdm din aceasta. Acest stil deprogramare se cheam[ programare prin diferen{e ( in noua clas[programam doar diferenfele fafn de clasa existent[ ).

    Subclasarea unor clase existente se face pentru a nu"reinventa" cod deja creat.

    in biblioteca grafrcd in pachetul javax.swing exist[ clasaJFrame, ce modeleazi o fereastrd grafrca (cu bara de titlu, cu cele treibutoane tipice si cu comportament de fereastri). Dac[ vrem sd facemo aplica{ie in care intr-o fereastrd avem mai multe componentegrafice, atunci clasa necesard in aceastd aplica{ie va subclasa (vamogteni) clasa JFrame.

    Pentru a implementa moqtenirea se folosegte cuvdntul cheieextends.Exemplu

    clas s FereastraTe stGrild extends JFrameLegat de moqtenire existd un specificator de acces ce se aplici

    membrilor unei clase (variabile de instanfd, constructori, metode) gianume specificatorul de acces protected.

    Membrii unei superclase declarafi protected pot fi accesa{idoar de subclasele ei. Aceste subclase pot face parte din alte package-uri de clase decdt package-ul clasei de baz[.

    Clasele ce fac parte din acelagi package ca qi superclas4 chiardac[ nu o subclaseazd (nu o moqtenesc) au acces gi la membriiprotected.

  • Moqtenirea

    in mod evident, la membrii private nu au acces nicisubclasele.

    in Java, spre deosebire de limbajul C#, nu existd moqteniremultipli-, adicd in Java o subclasd nu poate avea decdt un singurpdrinte. in Java, o clasd extinde o singurd clasl (nu mogteneqte decdtde la o singurd clasd), dar poate sd implementeze mai multe interfele.

    Subclasa mogtenegte de la superclasl membrii protected saupublic ai superclasei.

    In subclasd pot fi adf,ugate noi variabile de instan!6(care nuexistd in superclas[) gi noi metode sau subclasa poate sd redefineascdanumite metode mogtenite de la superclasS.

    Constructorii nu sunt mogtenili de la superclasd la subclas[.Din subclasi se poate apela constructorul clasei de bazd,

    folosind cuvdntul cheie super(...), cu parametrii necesari.in cazul in care se apeleaz[ iu super(...) constructorul clasei

    de baz6, aceastd instrucfiune hebuie sd fie prima instrucfiune dinmetoda respectivi (ce confine apelul cu super).

    Str[mogul tuturor claselor din Java este clasa Object.Chiar dacl o clasf, nu extinde in mod explicit o altd clasd (nu

    folosegte cuvdntul cheie extends), ea mogtenegte in mod implicit clasaObject.^

    In clasa Object sunt definite metode ce sunt mogtenite de toateclasele din Java. Iata cateva din acestea:r metoda equals( )

    public boolean equals(Object o)Se folosegte pentru a compara doui obiecte din punct de

    vedere al egalitdfii referinfelor.Multe clase Java, redefinesc metoda equals0 mogteniti de la

    clasa Object, pentru a compara doud obiecte din punct de vedere alconfinutului. Astfel, in clasa String, metoda equalsQ este redefiniti.Ea returneazd true, dacf, cele doud giruri comparate au acelagiconfinut.

    Exemplu:String sl:"abc";String s2:new String(s l) ;if(s I . e quals (s2)) System. out.println( " s I si s 2 au acelas i continut. ") ;else System.out.println("sI si s2 nu au acelasi continut.");//Se va afisa:// sl si s2 au acelasi continut.

    Moqtenirea

    o metoda toString( )public string toString( )Se folosegte pentru a da o reprezentare sub formd de String

    unui obiect.

    2. Exemple.

    Exemplul ISE se construiascd clasa ContBancar, folosit[ pentru a modela

    un cont bancar, ce are ca variabild de instanfd privat6, variabila suma,(suma de bani din cont). Ca metode:- constructorul;- adauga0, ce arc ca parametru un numdr real x, valoarea ce seadaugdin cont;- extrage0, ce are ca parametru un numdr real xo valoarea ce seextrage din cont, qi care scoate ca rezultat true, dacd se poate faceextragerea (suma ;': X), Sifalse in caz contrar;- getSuma0, ce returneazi valoarea variabilei private suma;- afisare0, ce afigeazi valoarea sumei de bani din cont.Pe baza clasei ContBancar se va dezvolta prin derivare (mogtenire)clasa ContBancarExtins, in care se va adduga o nou6 variabilf, deinstanfd: ruta dobdnzii anuale gi o noui metodS:adaugaDobandalunaraQ, ce adaugd in cont dobdnda calculatd dupdtrecerea unei luni. in clasa ContBancarExtins se va redefini gi metodaafisareQ, astfel incdt si se afiqeze qi rata dobdnzii. De asemenea, inaceastl noud clasi se va defini constructorul, prin care se inilializeazdsuma de bani din cont qi rata dobdnzii.Sd se scrie gi o clasl de test pentru clasa ContBancarExtins.class ContBancar/I

    private double suma;public C ontBancar (double S)/I

    suma:5,')public void adauga(double S){

    suma:suma*S;]public boolean extrage(double S)

    65

  • Moqtenirea

    {if(S> s uma) re t urn fal s e ;suma:suma-s;return true;

    ]public double getSumaQ{

    return surna;]public void aJisare0{

    System. out. println(" suma: " I suma) ;)]

    c I as s C ont B ancarExtins exte nds C ont B anc ar{private double rd;//rata dobanzii anualepub I ic C o nt B anc ar Ext ins (do ub I e S, do ub I e r at a){ ffi

    super(S);rd:rata;

    )p ub I ic v o i d adaugaD o b andalunar a Q{

    doubl e S : thi s. ge t Suma Q ;double dob anda: S*rd/ I 2 ;t hi s. adauga (do b anda) ;

    ]public void afisareQ{

    Sy stem. out. pr intln(" suma: " -t this. ge t Suma Q ) ;Sy s tem. out. pr intln(" rata dob anzi i: " + rd) ;

    ))

    class TestCont

    {public static void nain(String args[J)

    ]]

    Mogtenirea

    ContBancarExtins c:new ContBancarExtins(L000,0. t 2) ;c.adauga(1000);c. adaugaD o b and alunar a 0 ;c.afisareQ;

    Exemplul2Si se construiasc[ clasa Cerco ce are c& variabild de instan{[

    privati, un num[r intreg r, ce reptezintd, raza unui cerc. in aceast[clasd avem ca metode:

    constructorul, ce face initrializarea rczei;getRaza0, ce r etumeazd r aza;calculArie0,ce returne azd aria cercului ;suntEgale0, ce are ca parametru un Cerc c, gi care retumeazd

    true dacd cercul curent este egal cu cercul c (au aceeagirczFl.- afisareQ,ceafiqeazdruzacercului.Din clasa Cerc se va deriva clasa CercExtins, in care se vor adiuga cavariabile de instanfi x gi y: coordonatele centrului qi se vor redefinimetodele suntEgale0 (cercurile sunt egale cdnd au aceeagi razd qiaceleagi coordonate ale centrului), qi afisare0 (pe ldng[ razd, va afrsaqi coordonatele centrului)Scriem qi o clasi de test pentru clasa CercExtins.class Cerc

    {private int raza;public Cerc(int x){raza--x;)public int getRazaQ{return raza;]public double calculArie Q{re turn Mat h. P I * raz a* raz a ;]

  • Mogtenirea

    public boolean suntEgale(Cerc c){if(thi s. r az a: : c. raza) re turn true ;else returnfalse;]

    public void afisareQ{

    System. out. println(" raza: " + raza) i]

    ]class CercExtins extends Cerc

    {private int x;private int y;public CercExtins(int r,int x0, int y0 ){super(r);x:x0;!:y0;

    )pub lic b o ole an sunt E gale (C e rc Ext ins c){if((t his. ge t Raz a Q : : c. ge t Raza 0) & & (thi s. x : : c. x) & & (thi s.y : : c.y))return true;else returnfalse;]public void afisare0{System. out.println("raza: " * this. get RazaQ) ;Sy ste m. out. pr intln("x: " + x)'Sy s te m. out. pr intln(t'y : " sr| t)]

    class TestCercExtins

    {public static void main (String argsfl)fI

    CercExtins c:new CercExtins (3, 0, I ) :

    Mogtenirea

    Sys te m. out. println(" Aria: " + c. c alculArie Q ) ;CercExtins c I :new CercExtins (3, 0, I 0) ;Sy s te m. o ut. pr int ln (" Sunt e gal e : " + c. s unt E gal e (c I ) ) ;]

    )

    Exemplul3Sd se construiascd clasa Punct3D, folositd pentru a modela un

    punct in spafiu, ce are ca variabile de instanfd x, y, z, coordonateleunui punct in spafiu. Ca metode:- constructorul'- muta0, ce are trei parametrii dx, dy gi dz, pe baza cdroracoordonate ale punctului devin: 1*dx, yrdy, z-tdz;- compara0, ce are ca parametru un punct p, gi caretrue, dacd" punctul curent (cel referit prin this ) este egal cuqifalse in caz contrar;- distanta0, ce are ca parametru un punct p, gi caredistanfa intre punctul curent gi punctul p;- getXQ ce returneazdvaloarca coordonatei x;- getY0 ce returneazdvaloarca coordonatei y;- getz0 ce returneazdvaloarea coordonatei z;- afisare0 ce afigeaz[ coordonatele punctului.Pebaza clasei Punct3D, se va dezvolta clasa Punct3DColor,va ad[uga o nou[ variabild de instanfl de tipul String:punctului gi o noud metodd getCuloareQ ce returneazd

    retumeazd"punctul p,

    reirneazd"

    in care seculoareaculoarea

    punctului. Se vor redefini metodele comparaQ qi afigare0 qi noulconstructor.S[ se scrie gi o clas[ de test pentru clasa Punct3DColor.class Punct3D{private int x;//coordonata x a punctuluiprivate int y;private int z;public Punct3D(int x,int y, int z ){

    this.x:x;this.y:y;this.z:z;

    jpubltc int getX)

  • 70 Moqtenirea

    {return x;

    ]public int getYQ

    {return Y;

    )public int getZ){

    return z;

    ]public void afisareQ

    Sy stem. out. Println("x: " + x) ;Sy st em. out. Println ("Y : " +r1 tSy stem. out. Println(" z : " + z)'

    ]public void muta(int dx, int dy, int dz)

    {x:x+dx;y:y+dy;z:z*dz;

    ]public boolean compara(Punct3D p)

    if( (x : -- p. x) & & (y : -- p. y ) & & (z : : p' z) )retum true;

    else returnfalse;

    )public double distanta(Punct3D p)

    {double dx:this.x-p.x;double dY:this.Y-P.Y;double dz:this.z-P.z;double dist : Math. sqrt (dx * dx+ dy* dy + dz

    * dz) ;

    return dist;

    ))

    Mogtenirea

    class Punct3 DColor extends Punct 3D{private String culoare ;public Punct3DColor(int x, int y, int z, String culoare){super(x,y,z);this. culo are : culo are ;

    )public String getCuloare){

    return culoare;]public void aJisareQ{

    System. out.println("x: " + getX()) ;System. out.println(t'y: " + getY Q) ;Sy ste m. out. pr intln(" z : " + getZ) ) ;Sy ste m. out. println(" culo are : " + culo are) ;

    jpublic boolean compara(P unct 3 DColor p){

    tf((this. ge tXQ : :p. ge tX| & &(this. ge tYQ : :p. ge tY| & &(this. getZQ : :p. getZ| & &(t his. cul o ar e : : p. c ul o are) )

    return true;else returnfalse;

    class TestPulrcte

    {public static void main (String argsfl){

    P unct 3 DC o lor p :new P unct 3 DC olor (0, l, 2, " ne gru") ;p.muta(I,1,1);p.aJisareQ;

    7t

    )]

    ))

  • 72 Mogtenirea

    Exemplul456 se dezvolte clasa Persoana ce are ca variabile de instan!5

    numele qi prenumele unei persoane 9i vdrsta ei' qi ca metode:- constructorul ce face initializirile;- getNume0, ce returneaz[ numele;- getPrenumeQ, ce refurneazd prenumele;- afisare0, ce afiqeazd informaliile despre persoanl.Din clasa Persoana Se va deriva clasa Studento ce are in plus cavariabile de instanfi, numele facultaJii pe care o urmeazd qi numdrul

    matricol. in clasa Student se va dezvolta un nou constructor qi se varedefini metoda afisareQ. Se vor adiuga in plus metodele:- getFacultate0;- getNumdrMatricol0.Se va dizvolta o aplica{ie in care se vor citi de la tastaturl N: l0studenfi, ce Se vof memora intr-un vector. Se vor afiqa cdfi studenfi auprenumele 'olon".import jovax.swing.*;class Persoana

    {private String nume;private String prenume ;private int varsta;public Persoana(String n, String p, int v)

    {nume:n;prenume:p;varsta:v;]public String getNumeQ

    {return nume;

    )public String getP renume Q{return prenume;

    )public void afisareQ{System. out.println(nums + " " * prenume * " : " +varsta) ;

    Moqtenirea

    ]class Student extends Persoana{priv ate String nume Facultate ;private int nrMatricol ;public Student(String n, String p,{super(n,p,v);nume F ac ult ate :fac ul t ;nrMatricol:nrMatr']

    String facult, int nrMatr)

    public String getFacultate Q{return numeFacultate;]public int getNumarMatricol Q{return nrMatricol;)

    ]class TestStudenti

    {public static void main(String args[]){final int N:2;int i;Student s [J :new Student [NJ ;for(i:0;i

  • 74 Moqtenirea Clase abstracte. Interfete.

    Capitolul TClase abstracte. Interfete

    1. Clase abstracte.2. Interfe{e

    1. Clase abstracte.

    O clasi abstracti este o clasl din care nu se pot instan{iaobiecte. Din ea se pot ins6 deriva noi clase (poate fi subclasatd). Eaeste folositoare ca gi qablon mogtenit de alte clase.

    Clasa abstractd poate s[ confind doud feluri de metode: metodecare au definilia completi (metode care au gi implementare) gi metodecare nu sunt implementate(nu au corp, au doar antet). Metodele carenu sunt implementate se definesc cu ajutorul cuvdntului cheieabstract. In general, aceste metode abstracte sunt implementate decdtre clasele derivate din clasa abstractd.

    String prenume Crt : s [iJ. ge tP re nume Q ;if(pre nume C rt. c ompareTo (" Ion") : : 91 contor _ion't * ;]Sy s t e m. o ut. pr int ln (c ont o r _i o n) ;]]

    O clasl abstractd se definegte cuabstract.Exempluabstract class A{

    cheie

    )Ito\iaew*g lleroarc de sintax6!!!

    ExempluDefinim clasa abstractd A ce are doui

    implementatd gi alta care nu este implementati.metoda abstractd calcul0;metoda durataCalculQ ce retumeazd durata exprimatl in

    milisecunde, a execufiei metodei calcul$;Din clasa abstract[ Ao se va deriva clasa B ce confine implementareametodei calculQ. Se va dezvolta gi o clas6 de test, pentru clasaderivatd B.import javm.swing.*;import java.util.*;abstract class AII

  • Clase abstracte. Interfele.

    abstract public void calcul(int N);public long durataCalcul(int N){long t 1 :System.currentTimeMillis 0 ;calculQ'{);long t 2 : Sy s te m. cutentTime Mill is 0 ;return (t2tl);]]class B extends A

    {public void calcul(int N){//C alcule az a N *N * N pro duseint ij,k;long rezultat;

    for(i:I;i

  • 78 Clase abstracte. Interfete. Polimorfism

    Capitolul SPolimorfism

    Generalitifi.Exemple de polimorfism la execu{ie.

    1. Generaliti{i.Polimorfismul este de doul tipuri:

    - polimorfism la compilare (polimorfism parametric)- polimorfism la execu{ie.

    in cazul polimorfismului parametric (in aceeaqi clasi mai multemetode cu acelagi nume, dar cu num[r diferit de parametrii sau cutipuri diferite de parametrii) legarea codului metodei adecvate se facein faza de compilare (early-binding).

    Exempluc I as s Exe mpluP o I imorfi smP arame tric{public static void main(String args[ J){int a: Inte ger.parse Int (JOptionP ane. showlnputDialo g( " a: " y'int b :Integer.parse Int (JOptionP ane. show InputDialog( " b : "11'int c :Inte ger. parse Int (JOptionP ane. show InputDialo g( " c: ")) ;int mail:maxim(a,b);System.out.println("maxI : " +maxI) ;int mec2 :maxim(a,b,c) ;Sy stem. out.println( " max2 : " + max2) ;]private static int maxim(int a, int b){f (a>b) return a;else return b;]private static int maxim(int a, int b, int c){int rez:a;if (b>rez) rez:b;f (c>rez) rez:c;return rez;

    )

    ]

    clas s P aralelipiped implements Forma{private double x;private double y;private double z;

    public Paralelipiped(int a, int b, int c){x:a;y:b;z:c;

    )public double arieTotald( ){

    re turn 2 * (x *y + x * 2 +y* z) ;]public double volum( ){

    return x*y*z;)

    ]

    1.

    2.

  • Polimorfism

    ]

    Nofiunea de polimorfism in faza de execu{ie este legat[ inprimul rand de noliunea de mogtenire.

    in cazul unei metode prezentdin clasa debazd 9i redefinitd inclasa derivati (acelagi nume, doud forme: o forml in clasa debazd, oforml in clasa derivat[) in anumite situafii, numai infaza de execufiese poate qti care formd de metodl se va apela. Altfel spus, numai laexecufie se poate gti care cod va fi folosit(va fi "legat") de aplicafie.

    Codul metodei adecvate va fi "legat" la execufie 9i aceasta secheam[ late-binding (legare tfurzie), spre deosebire de legarea coduluidin faza de compilare (early-binding).

    2. Exemple de polimorfism la executie.

    Exemplul IS[ se construiascd clasa Punct ce are ca variabile de instanf[

    dou[ numere intregi x $i y - coordonatele unui punct in plan, 9i cametode:- Constructorul ce face inilializdrile;- getX0 ce rctumeazdvaloarea coordonatei x- getYQ ce returneazdvaloarea coordonatei y- afisare0 in care se afrqeazd coordonatele punctului din clasaPunctDin clasa Punct se deriveazd dou[ clase: PunctColor 9i Punct3D.Clasa PunctColor fafi de clasa Punct are in plus o variabil5 de instanflin care este memorat[ culoarea punctului, un nou constructor in car6este inilializatd gi culoareao metoda getCuloare0 ce returneaz[culoare4 gi redefineqte metoda clasei de bazd, afiqare0, afiqdnd pol6ng6 coordonatele x qi y qi culoarea.Clasa Punct3D, ce reprezintl un punct in spafiu, fafi de clasa Punotare in plus o variabil[ de instan{6 z, un nou constructor in care suntinilializate toate cele trei coordonate, metoda getZ0 ce returneazlvaloarea coordonatei z, gi redefineqte metoda clasei de bazF+ afigare0,afigdnd pe l6ng[ coordonatele x qi y gi coordonata z.Foiosind aceste trei clase se va dezvolta o aplica{ie in care se vor citlde la tastaturl N puncte (N- citit anterior), de tipul PunctColor sauPunct3D. Pentru fiecare punct, in momentul citirii utilizatorulaplicaliei va specifica dacd va introduce un PunctColor sau unPunct3D. Cele N puncte se vor memora intr-un vector de obiecte de

    Polimorfism

    tipul Punct (clasa de bazd). tn final se vor afiga pentru fiecare punctdin cele N informafiile memorate (pentru fiecare punct se va apelametoda afiqare0).Aceasti aplicafie ilustreazd conceptul de polimorfism. Compilatorulqtie la rulare ce versiune de metodl afigare0 sd apeleze.import javm.swing.*;class PunctIlprivate int x;//coordonata x a punctuluiprivate int y;public Punct(int x0, int y0){x--x0;!:v0;

    )public int getXQ{return x;]public int getYQ{return y;]public void afisareQ{Sy ste m. out. pr intln("x : " + y)'Sy s te m. out. pr intln(' ty : t t 4r;'))

    class PunctColor extends Punct{private String culoare ;public PunctColor(int x, int y, String culoare){super(x,y);this. culo are : culoare ;

    )public String getCuloare0{

    8l

  • Polimorfism

    return culoare;

    ]public void afisareQ{//System.out.println("x:t'+x);GRESIT! x - este var. privata !System. out. println("x: " + getXQ) ;System. out.println("y: " + ge tY 0) ; )System. out.println(" culoare : " * culoare) ;)]class Punct3D extends Punct

    {private int z;public Punct3D(int x,int y, int z ){super(x,y);this.z:z;]public int getZ){return z;

    )public void afisare0{Syste m. out. pr int ln ("v : " + ge tXQ ) ;Sy s tem. out. pr intln("y : " + ge tY Q ) ;Sy s te m. out.pr intln ( " z : " + z)']]

    class AfisarePuncte

    {public static void main (String args[J){int N;//numarul de puncteN : Inte ger. pars e Int (J Opt ionP ane. show InputD ialo g(" N : "))'Punct p[J:new Punct[NJ;//vectorul de obiecte Punct (clasa de//baza)

    int i;for(i:0;i

  • ]]

    Polimorfism

    import java.util.*;import javax.swing.*;class Numar{private int a;public Numar(int x){a:x;

    )public void aJisare0{

    Sy stem. out. println(" a: " -t a) ;

    class DouaNumere extends Numar

    {private int b;public DouaNumere(int a,int b ){super(a);this.b:b;

    ]public void afisare(){//afisare a:super.afisare);//Cu cuvantul cheie super se apeleaza metoda

    //clasei de baza//afisare b:Sy stem. out.println(" b : " * b) ;

    class AJisareNumere

    {public static void main (Strtng args[J){Numar n;Random r:new Random0;int caz:r.nextlnt(2);

    Polimorfism

    f(caz::0){//citeste un numar:

    int a: Inte ger.parse Int(JOptionP ane. show InputDialog('t a: "11 tn:new Numar(a);

    jelse

    {//citeste doua numere:int a: Inte ger. parse Int (JOpt ionP ane. s how InputD ialo g(" a: ") ) ;int b :Integer.parselnt (JOptionP ane. show InputDialog("b : "11 tn:new DouaNumere (a,b) ;

    ]//Afisare:n. afisareQ;//Numai la executie se stie care versiune de metoda

    // afisareQ se va apela]

    )

    Exemplul3Folosind cele doud clase anterioare, Cerc qi CercExtins create

    in capitolul 6, sd se dezvolte o aplica{ie in care se vor citi N cercuri(de tipul Cerc sau CercExtins), ce se memoreazd intr-un vector.Citirea unui obiect de tip Cerc sau CercExtins este dat[ de valoarea 0sau I a unui numdr aleator generat.import java.util.*;import javax.swing.*;class Cerc

    {private int raza;public Cerc(int x){raza:x;]

    public void afisareQ{

    Sys te m. out. print ln(' raza: " + raza) ;

    class CercExtins extends Cerc

    {

    )]

    ]

    )

  • Polimorfism

    private int x;private int y;public CercExtins(int r,int x0, int y0 ){super(r);x:x0;!:v0;

    ]public void afisareQ{Sy stem. out. println(" raz a: " * this. ge t Raz a 0 ) ;Sy s tem. out. println("x: " + x)'Sys tem. out. println ("y : " +r1,])

    class AJisareCercuri

    {public static void main (String args[J){final int N:3;//numarul de cercuriCerc c[J:new Cerc[NJ;//vectorul de obiecte Cerc (clasa de

    //bazo)Random r--new RandomQ;int i;for(i:0;i

  • Polimorfism

    return l*w*h;])

    c las s ExempluP olimorfi smC ulnterfeye{public static void main(String args[ J){Formaf[ ]:{new Cub(L0), new Paralelipiped(I ,2,7)};for (int i : 0 ; i

  • Excep{ii

    Astfel, in programarea clasic[, la fiqiere, compilatorul nu ne forteazd

    s6 tratdm cazul in care nu existi figierul ce trebuie prelucrat'in Java, erorile ce apar in execulia unei metode sunt denumite

    excepfii. Excepliile sunt obiecte derivate (care moqtenesc) dintr-una

    din clasele de bibliotecd:a) Exceptionb) RunTimeException

    Excepliile din clasa RunTimeException nu sunt obligatoriu

    de tratat. Cele din clasa Exception sunt obligatoriu de tratat'Tratarea excepfiilor se face in blocuri try...catch'Atunci cand in executarea metodei apare o situalie anormala

    (eroarea), oose arunc[o' un obiect excepfie, de tipul declarat in definirea

    metodei. o metod[ in care se genereazd o exceplie qi care "arunc[" oexceplie, trebuie sI aibd in antetul ei cuvdntul cheie "throws" urmatde tipul excepfiei.Exemplu

    Metoda parselnt( ) din clasa Integer, poate sd genereze o

    excepfie de tipul NumberFormatException (subclasd a luiRuntimeException), exceplie care nu este obligatoriu de tratat.Strings:"I23";int nr:Integer.parselnt(s);//Aici, nu este nici o exceptie'int nr2 : Inte ger. p arse Int ( " 1 2 AB " ) ; //Aic i, e ste except ie'in acest cati,se arunc[" o excepfie de tip NumberFormatException,

    neobligatoriu de tratat. Dacd ea nu a fost tratatA de programator cu

    blocul1ry...catch se intrerupe anormal execulia programului'

    Avem urm[toarele categorii de excep{ii:- exceplii aritmetice (nu sunt obligatoriu de tratat)

    f . imp[rlirea cu 02. radical dintr-un numdr negativ3. depigirea pentru un anumit tip de date

    Exemplu: bYte x;x:1000; lleroarc de dep6gire

    - excepfii de adresareExemolu: apelarea unei metode folosind un obiect neinstanfiat, un

    obiect null.Shing s:null;

    int L:s.length( ); //eroare la execu{ieNu este o eroare obligatoriu de tratat.

    - excep{ii in cazul vectorilor, indexare in afara granifelor

    Excep!ii

    Nu este obligatoriu de tratat.Se aruncd o exceplie de tip ArraylndexOutOfBoundsException.Exemplu:int a[ ]:new intf10];

    al20l:7; //nu este eroare la compilare. Eroarea apare la execulie.Se opreqte programul forlat in acest punct, aruncdndu-se oexcepfie de tipul ArraylndexOutofBoundsException.

    In general, nu se recomandd,tratarea excepliilor care nu suntobligatoriu de tratat pentru a nu incdrca suplimentar codulprogramului cu blocuri try...catch.- excep{ii legate de opera{iile de intrare-ieqire (lucrul cu figiere,

    operafiile care se fac in refea, lucrul cubaze de date).Aceste exceplii sunt exceplii obligatoriu de tratat.Dacd nu le tratdm (in blocuri try...catch), programul nu se

    compileazd.ln cazul figierelor, cea mai des intAlniti exceplie este exceplia

    de tipul lOException, exceplie obligatoriu de tratat.

    Exempl_u:

    In cazul programdrii ?n C, pentru deschiderea unui fiqier text,avem urmdtoarele instrucliuni :FILE* fp:fopen(" tlate.txt ", " rt ") ;//tr at are ev entual d er oar e :tf (fp::NULL) {

    exit(]); ]OBS: Aceastd tratare nu este obligatorie.

    in Java secvenfa corespunzdtoare este urmdtoarea:FileReader "fr:null;trv{

    fr : new Fil e Re ader ( " dat e. txt " ) ;

    )catch(IoException e) {Syste m. out. println(e) ;Syslem.exit(l );

    II

    in Java este obligatoriu blocul try...catch.

  • 2. Blocuri try-catch.

    Sintaxa tipicd pentru blocurile try...catch este urmdtoarea:

    trv{// instrucliuni ce pot genera excep{ii.

    )catch(tipExcepfie numeDeVariabila) {// instrucliuni pentru tratarea excepliei.

    )Exemplu

    FileReader fr:null;try{

    fr -- new Fil e Re ade r ( " dat e. txt " ) ;

    ) catch (IOException e) {Sys tem. out. pr intln (e) ;System.exit(I);

    )

    Cazul general de bloc try...catch este urmdtorul:trv{

    // instrucfiuni)catch(tipExcep{ie e) { lltratare excepfie e1 }

    catch(tipExcepfie en) { lltratare excepfie en }finally { //instrucfiuni }

    Dacd apare o excepJie, se executd blocul try doar p6n6 inunde apare excepfia, se executd blocul catch corespunzdtor

    "*rr1

    Dacd in blocul try...catch nu apare nici o excepfie, se exectot blocul try, nu se executd nici o instrucliune din blocul catch giapoi se continud cu execufia normald a prclgramului (dup6 blocuitry...catch).

    Dacd, apare o excepfie, se pdrdseqte execulia blocului try inlocul unde a apdntt exceplia qi se executd blocul catch coresounzdtr

    instrucfiunile din blocul finally se executd in mod oblila finalul blocuiui try...catch, indiferent dacd afost sau nu a fostexceplie. Dacd nu apare nici o excepfie, se executd tot blocul try piapoi instrucliunile din blocul finally.

    apdrute qi apoi se executd blocul finally.

    Exceotii ot

    ExempluMetoda parselnt( ) din clasa Integer genereazdo excepfiecare nu este obligatolil d: tratat de tiputttumi"rF;"t;;;;ption,

    atunci cOnd argumentur ei este un string ce nu poate fi convertit la unnumlr intreg.int nI :Integer.parselnt(,, I 23,,) ; //nu este exceptie !int n 2 : Int e ge r,n a1s e

    lryt !,, r t tr i,,

    1 ; //a i c i e s t e " i,

    iii i,Exceptia este de tipul NumberF,ormatException, excep{iecare nu este obligatoriu de tratat.Definitia metodei parselnt( ) in clasa Integer este urmdtorul:public static int parselnt(String r)-th"o*.

    {//codul metodei:

    NumberFormatException

    //-in caz de imposibilitate de a converti pe s la intreg:throw new NumberFormatExceptioni );

    )Desi nu este obligatoriu, se poate trataexcepfiaNum berFormatException, astfel :StriyS s :JOptionp ane. showlnputDialo g(,, nr:,,) ;try{

    int nr : Inte ger.pars e Int (s) ;. System.out.println(n4,

    ) catchQ{umberFormat Exception e) {Sy s te m. out. pr int I n (e) ;System.exit(l),.

    )o altd posibilitate de tratare a acestei excepfii, ftr6 a iegi dinprogram' ciin eaz de excepfie vom repeta citirea o.'ru turtutura,

    "for(;,) {Itriryg s

    :Joptionp ane. show InputDialog(,, nr:,,) .boolean stop:true;try{

    int nr : Inte ge r.parselnt (s) ;Sy s tem. out. pr intln(nr) ;// afiSare divizori nr:for(int i : I ; i< :rr; ;* *,

    if(nr%i : = 0) System. out.println(i) ;

  • ] c atc hQ{umb e rFormat Except ion e){stop:false;)f$top::true) break;

    ]//for;;

    Figiere

    Capitolul 10Fiqiere

    1. Generalititi.2. Clase pentru figiere text.

    1. Generalitifi.

    Figierele sunt de doul tipuri:- fiqiere text- figiere binare

    Diferenfa principald dinhe ele este dati de modul de codificarea informafiei.Exemplu:

    Fie un fisier text ce contine ca informatie valoarea numerica :259

    Informafia din figierul text este codificatd binar pebazacodurilor Unicode ale celor 3 caractere: '2', o5' si '9'.Codul caracterului o2'este 50p:2s*r+*2r:0 01 1.0 0 I 0Deci, in binar: 00110010 .Asemanator sunt codate si celelalte doua caractere:

    Fie un figier binar de numere intregi, ce con{ine aceeasiinformafie:259

    Informatia va fi reprezentat[ ca num[r intreg pe 4 octefi,corespulzitor reprezentdriiinbaza 2 a numdrului intreg 259:259r':2t*rr*rsDeci in baza2:00000000 00000000 00000001 0000001 I

    O alti diferenfa intre figierele text gi figierele binare este aceeaca figierele text au inregistrdri (linii) de lungime variabild iar figierelebinare au inregistrdri de lungime fixi. Astfel, intr-un figier binar denumere intregi, fiecare inregistrare ocupd 4 octefi.

    Putem totugi interpreta un figier text ca un figier binar, ce areca inreg^istrare de bazd octetul.

    In Java, clasele care prelucreaz[ fiqiere se gdsesc in pachetuljava.io.

  • Figiere

    in cazultuturor prelucrdrilor de fiqiere, se pot genera excep{iicare sunt obligatoriu de tratat. Cea mai des intdlnitd excepfie faceparte din clasa IOException, excep{ie obligatoriu de tratat.

    in Jav4 clasele ce prelucreazd figiere sunt specializate, atdtpentru tipurile de figiere (text sau binar), cdt gi pentru operafiile ce sefac asupra figierelor.

    2. Clase pentru fisiere text.

    a) Clasa FileReader.Este o clasl folositl pentru a citi un figier text caracter cu

    Constructorul:public FileReader(String numeFisier)

    a) public int read( ) - citegte gi returneazd codul caracteruluipe pozilia curent6.Determind avansarea in mod automat pe urmdtoareapoziliegapului de citire.In caz de sfhrgit de fiqier returneazd -1.

    b) public void close( ) - este folositi pentru a inchide fiqierul.

    Exemplu: Se citegte de la tastaturd numele unui fiqier text. Sd afigtrmdaci este prezent caracterul a in figier.class FI{public static void main(String args[ | I{

    St r ing nume F : J Op t i o nP ane. s how Inp ut D i al o g ( " nume fi S ie r : " ) ; IFileReaderfr:null;boolean este_a:false;w{fr : new F ile Re ader (nume F) ;//citesc fisierul caracter cu caracter:

    int codd.readof (cod:: l) break;if ((char) cod: :'a') { este _a:true ;

    break; )]

    Figiere

    fr.close( );] c atch(IOException e) {System. out.println(e) ;System.exit(1); ]f (e s te _a: : true) Sy ste m. o ut. println (,, E ste pre ze nt a,, ) ;e I se Sys te m. out. println( " Nu e s te pre ze nt a, ) ;]

    ]

    b) Clasa FileWriter.Constructorul

    public FileWriter(String numeFisier)Metode:

    public void write(char ch)Este folositd pentru a scrie in fiqier, pe pozilia curentd, caracterul datca parametru.Exemplu: citim de la tastaturi o linie de text. Sd copiem caractereledin acest text in fiqierul "linie.txt" cdte un caracter pe fiecare linie afigierului text.

    Exemplu: mdr =

    class F2{public static void main(String args[ J)Ta

    Slring text:JOptionP ane. showlnputDialo g(,, text:',) ;FileWriterfw:null;try{

    fw : new F ile Writer ( " l ini e. txt " ) ;for(int i:0; i

  • Fiqiere

    c) Clasa BufferedReader.Este folositd pentru a citi un fiqier text linie cu linie.

    Constructorul:public BufferedReader(FileReader fr)

    Metode:public String readline( )

    Returneazd sub formd de String, linia curentd cilir1ddin fiqier. in caz d'sfrrgit de figier, returneazi null.

    l

    Exemplul 1 ,1,Sd se calculeze qi afigeze care este cea mai lungd linie din fiqierul

    text "scrisoare.txt".Algoritmul:Inilializ[m maximul(lungimea celei mai lungi din figier) cu 0.Citim pe rdnd fiecare linie gi compar[m lungimea ei cu maximul.Dacd este mai mare, schimbdm maximul.

    class F3

    {public static void main(String args[ J){FileReader fr:null;B uffe r e d Re a de r bfr : nu I I ;int lMax:0;String linie Max: " " ; //stringul v idtrv{fr :new F ile Re ader ( " scr is o are. txt " ) ;bfr : new Buffe r e dRe ade r (fr) ;for(;;) {

    String s :bfr. re adline ( ) ;if (s: : null) break;int l:s.lengthO;if (>lMax) { IMax:l;

    linieMax:s; ]]//frr;;

    bfr.close( );fr.close( );) c atch(IO Except ion e) {

    Syste m. out. println(e) ;System.exit(l); ]

    Figiere

    Sy s te m. out.println ( inie Max) ;]//main

    ]//classExemplul2

    S[ se afigeze care este cel mai lung cuvdnt dintr-un figier textdat. Se considerf, cd in fiqier nu se afl6 cuvinte despi(ite in silabe, lacap de rdnd.import java.io.*;import java.util.*;c I as s C e I Mai LungC uv ant{public static void main(String args[J){FileReaderfr:null;B uffe r e d Re a de r bfr : nul I ;//initializari:String cuvantMax:"";int lungimeMax:0;//initializare pt. dimensiunea celui mai lung

    //cuvanttry{fr:new File Re ader ("referat. txt") ;bfr : n ew B uffe r e d Re a d e r (fr) ;"for(;;){

    Str ing linie : bfr. re adline 0 ;if(inie : :null) bre ak; //s-a terminat fisierul//Extragem cwintele din aceasta linie:StringToknnizer tk:new StringTokenizer(inie) ;int n:tk countTokensQ;for(int i:0;i I ungime Max) {

    lungimeMax:lungime;cuvantMax:cuvant;

    ]bfr.close0;

    fr.close0;] catch(IoExce ption e) {

    ])

  • Sy s te m. o ut. pr i ntln (e ) ;System.exit(I ) ;]

    Sy s te m. o ut. pr int I n (" C e I mai lung c uv ant e s t e : " * c r,w ant Max) ;]//main)

    Exemplul3Se citeqte numele unui fiqier text ce confine

    se afiqeze dacd toate liniile sunt diferite intre ele saumulte

    import jova.io.*;import jrnm.swing.*;class LiniiDiferite{public static void main(String args[J){S tring nume F : JOp t i onP ane. s how Input D i al o g ( " num e fi s ie r : " ) ;FileReader fr:null;B uffe re dRe ade r bfr : null ;//Vom copia toate liniile dinfisier, intr-unvector de Stringuri:S t r ing s [J : new S t ring F 0 0 0 J ; // dime ns iurrc ac ope r it o are//initializare pt. numarul de linii dinfisier:int N:0;trv{-f,

    : new F ile Re ade r (nume F ) ;bfr : new B uffe re dRe ade r (fr) ;for(;;){String I inie :bfr. re adline 0 ;if(inie : :null) bre ak; //s- a terminat fisierul//copiem linia invectorul s[]:s[NJ:linie;N++;)bfr.close0;

    fr.close0;) carch(IOException e) {

    System. out.println(e) ;System.exit(I);]

    //Verificam dacavectorul s[J are toate elementele diferite:

    for(int i:0 ; i

  • t03t02 Figiere

    ]bfw.close0;fw.close0;

    ) catch(IOException e) {System.out.println("Eroare scriere Jisier") ;System.exit(l);

    ]]//main)

    Exemplul2Se da un fisier text de cuvinte (fiecare cuvant se afla pe o

    linie). Sa se construiasca un alt fisier text, ce contine cuvintele dinprimul fisier, sortate in ordine alfabetica.import java.io.*;clas s Scrie Fis ierSortat

    {public static void main(Stringf] args)

    {FileReader fr:null;B uffere dRe ade r bfr : null ;//Copiem toate ctnintele (iniile) intr-un vector de Sninguri:String s t [] : new String I I 0 0] ; //dimens iune acope rito areint nL:0;//numarul de linii dinJisiertry{fr:new F ile Re ader (" cuv inte. txt " ) ;bfr : n ew B uffe r e d Re ade r (r) ;

    "for (;;)

    {String s :bfr. re adline 0 ;if (s::null)break;else st[nlJ:s;nlr*i

    )bfr.closeQ;

    fr.closeQ;] catch(IOException e) {

    System. out.println(e) ;System.exit(l);]

    Figiere

    //sortare bubblesort pentru vectorut st[J:.for (;;){boolean gata:true;for (int i:0 ; i 0){String aw:st[iJ;st[iJ:st[i+1J;st[i+IJ:aw;gata:false;]

    )if (gata)break;

    )//copiere vector st[J inJisier:FileWriterfw:null;B uffe re dWr i t e r bfw : nul I ;try{fw :new FileWriter(" cuvinte Sortate. txt,,) ;bfw : new B uffe re dl4rr it e r fu ) ;for(int i:0 ; i

  • 104 Fiqiere

    99...9in fiecare linie din fiqier sunt cate 10 numere separate prin spa{ii'import jasta.io.*;class ScrieFisier

    {public static void main(String[] args)

    {final int N:10; //numarul de linii dinfisierFileWriter fw:null;B uffi re dWr it e r bfw : null ;try{fw :new F ile Write r ("numere. txt ") ;bfw : new B uffe r e dWr i t e r (w ) ;for(int i:0;i

  • 106 Grafica in Java

    in aceasti clas[ de ascultare se defineqte metoda de tratare a

    Grafica in Java

    Mai sunt si alte layout-uri posibile pe ldngd Borderlayout.De exemplu:r Flowlayout - in care componentele grafice sunt aranjate in linie,de la stdnga la dreapta. Obiectele de tip JPanel, au implicit acestlayout.o Gridlayout - in care componentele grafice sunt aranjate intr-omatrice, specificatd prin numdrul de linii gi numf,rul de coloane.

    Layout-ul implicit al unui container poate fi modificat la unnou layout, folosind metoda setlayout( ) care are caparametru unobiect instanfiat din noul layout.

    2. Exemple.

    Exemplul IScriem o aplicatie graficl, pentru calculul maximului dintre douanumere, ce con{ine urmltoarele componente grafice:

    JTextField

    import java.owL*;import j ava. aw t. eve nt.import javax.swing.*;class CalculMaxim{

    O componentd grafic[ este desemnatl de programator ca o

    sursi de evenimente, prin ataqarea de acea componentd a unui obiect

    de ascultare a evenimentului.Ataqarea obiectului de ascultare a evenimentului se face printr-

    o metod[ specifica. In cazul unui buton de tip JButton, ataqarea unui

    obiect de ascultare se face prin metoda addActionlistener( )'Butonul respectiv devine astfel sursd de eveniment.

    Nu orice componenta grafica poate fi surs[ de evenimente. Unobiectdetipu1JLabelnupoates6fiesurs[deeveniment.Deasemenea, nu toate componentele grafice care aupoten{ialul de a fi ,lsurse de evenimente, sunt desemnate de programator ca fiind surse de

    evenimente.Progtamatorul trebuie s6 defineasca clasa din care se creazd"

    obiectul deiscultare (obiect ce se ataqeazd sursei de evenimente).

    Mediul de execulie Java este cel care detecteazd evenimentele

    gi apeleazd in mod automat, la detectarea evenimentului respectiv,

    metoda corespunzltoare de ttatate a evenimentului (metodd scrisb de

    programator in clasa de ascultare). in plus, mediul de execulie Java

    Lste-cel care impune numele metodei de tratare a evenimentului, dar

    programatorul este cel care ii dI codul.Astfel, pentru tratarcaevenimentului, click cu mouse-ul pe un

    butono numele impus de metoda de tratare este actionPerformed( ) .

    Fereastra aplicafiei extinde clasa de biblioteca Jf,'rame. De la

    aceasta mogteneqte forma( bard de titlu, cele 3 butoane:minimizare,maximizarc gi inchidere) qi comportamentul de fereastrd (m[rirea,

    micgorarea dimensiunilor ferestrei, mutarea ferestrei). Componentele

    g.uft.r, in cazul utilizarii ferestrei de tip JFrame (definita in pachetuljlvax.swing), nu se adaugl direct pe suprafala ferestrei, ci intr-unLontainer r*t u, din fereastrd cu ajutorul metodei getContentPane( ).

    Din considerente de portabilitate nu se fecomandd pozifionarea

    componentelor grafice la coordonate absolute.Pozi{ionit"u co*ponentelor se face cu ajutorul unor clase

    denumite layout manager(clase ce fac gestionarea modului de

    pozi{ionare).Astfel, containerul extras din Jf,'rame are ca qi layout, mod de

    aranjare implicit al componentelor, layout-ul de tip Borderlayout.- Componentele pot fi aranjate in 5 direcfii (cele patru puncte

    cardinale si centrul ): North, South, East, West, Center'

    15

    17

    1'l

    JButton

    puhlic static void main(String ar4sI J)

  • Grafica in Java Grafica in Java

    In continuare tn clasa Fereastra definim ca Si clasd interioard,clasa de ascultare a butoanelor: clasa AscultdButoane. O clasdinterioard a unei alte clase ore acces in mod direct la toate variabilelede instanld a unei clase private.*/

    // clasa interioard:class AscultdButoane implement s Actionlistener{

    pub I ic v o id act ionP e rforme d (Act ionEv e nt ev){

    Obj e ct surs a: ev. get Sourc e ( ) ;if (sursa: :jbExit) System.exit(0) ;else if (sursa: :jbCalcul){

    String s I :j tfl. getText( ) ;int nr I : Inte ger. p ars e Int (s I ) ;int nr 2 : Inte ger. p ars e Int (j t/2. getText ( )) ;int mm;f (nrL>nr2) max:nrl;else max:nr2;j tJ3. setText (" " +max) ; ]

    j//actionPedormed

    ])

    Exemplul2SI se scrie o aplicalie ce confine patru componente grafice:

    JTextField pentru afigare gi trei butoane JButton, notate cu "unu","doi" gi "trei". Cele trei butoane vor fi aqezate in linie. La apdsarcaunui buton se va afiga in componenta JTextField numele butonuluiapdsat.import java.atvt.*;import j av a. awt. eve nt. * ;import javax.swing.*;class ScrieNumeButon

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

    Fe re as tra f: new F ere as tra Q ;f,setTitle ("Te st de butoane") ;f,setVisible(true);

    109

    Fereastra f:new Fereastra( ) ;f.setVisible (true);

    jclass Fereastra extends JFrame{

    priv ate JButton, j b C al cul, j b Exit ;private JTextField jrfl, jtJ'2, jt/3;public Fereastra( ){

    this. s etTitle ( " C alcul maxim " ) ;this. setSize (60 0, 4 00) ;Jlabel j I 1 :new Jlabel(" nr I :j tfl : new JText Fie ld (4 0) ;JPanel jp 1 :new JPanel( ) ;j p t . add(j I I ) ; j pd. add(j tft ) ;Jlabel j 12 :new Jlabel ( " nr2 :j t/2 :new JText F i e ld (4 0) ;JPanel jp2:new JPanel( ) ;jp2. add(j 12) ; j p2. add( tJ2) ;Jlabe I j I 3 :new JLabel ( " maxim :j tJ'3 : new JText F i e I d (4 0) ;j tJ3. se tEditable (fal s e) ;JPanel jp3:new JPanel( ) ;j p 3. add(j t 3) ; j pd. add(j tJ3) ;AscultdButoane ab :new AscultdButoane ( ) ;j b C alcul : new JB utt on ( " C al cul " ) ;j bC alcul. addAc t i onlistene r (ab) ;j b Exit:new JButton( " Exit " ) ;j b Exit. addActi onli ste ne r (ab) ;JPanel jp4:new JPanel ( ) ;jp4.add(jbCalcul);jp4.add(jbExit);JPanel jp:new JPanel( ) ;j p. s e t Layout (new Gridlqtout (4, I ) ) ;Container cFinal :this. getContent P ane ( ) ;cFinal.add(jp, " South") ;

    ]// end constructor

  • 110 Grafica in Java

    ]]class Fereastra extends JFrame{priv ate JTextF ie I d j tf;private JButton jbl, jb2, jb3;//constructorpublic FereastraQ{setSize(300,300);addWindow Listener (new Fere astralistener Q) ;//construie ste componente :jtf:new JTextFieldQ;//doar pt. afisare:j tf. s et E dit able (fal s e) ;//Construim cele trei butoane:j b I :new JButton("unu") ;j b2 :new JButton("doi") ;jb3 :new JButton("trei") ;//Le plasez intr-un container intermediar Jpanel:JPanel jp:new JPanelQ;jp. add( b 1 ) jp. add(j b 2) jp. add(j b 3) ;//Atasam fiecarui buton, obiectul de ascultare, pentru o putea//tratate evenimentele de apasare a acestor butoane:Clas aButoane Listene r listener:new C las aButoane Listener\ ;j b 1 . addActionlistener (istener) ;j b 2. addAct ionli s tene r ( istener) ;j b 3. addAct ionli ste ne r ( is tene r) ;//adaugam componentele in containerul /inal, ce se extrage//fereasta:C ontainer cont ainerFinal:this. getContentp ane Q ;c o nt a ine r F inal. add (j tf, " C e nte r " ) ; // dac a I ip s e s t e, nu de s e ne az a//in centrucontainerFinal.add(jp,"South");//le aseoza in partea fu jos//ferestrei

    )/ /clasa interioara:priv ate class Fere astralistener extends WindowAdapter{pub I ic v o id w indow C lo s ing (LYindow Eve nt eu)

    Grafica in Java

    {System.exit(0);

    ]]private clas s ClasaButoane Listener implements Actionlistener{//Intedata Actionlistener are o singura metoda:pub lic v o id act ionP edorme d(Ac t ionEv ent ev){

    O bj e c t surs a: ev. ge t Sourc e Q ;if(sur s a: :j b I )j tf,s e rText (" unu") ;else if(surs a: :j b2)jtf,setText ("doi") ;e I se if(sursa: :j b 3)j tf,setText (" tre i") ;

    Exemplul3SI se scrie o aplica{ie in care se afigeazd o fereastrd ce confine

    patru componente grcfice: JTextField pentru introducerea unui numdrintreg, JTextField pentru afigare gi doud componente JButton. Atuncicdnd este apisat primul buton, se vor afiga toli divizorii numIruluiintrodus. Cdnd se apasd cel de-al doilea, se iese din program.import jova.awt.*;import j av a. qw t. eve nt.import javac.swing.*;c I as s Gr afi cAfi s are D iv i z ori{public static void main(String args[J){Fereastra f:new Fereastra() ;f. se tTit le (" C alcul diviz or i ") ;f,setVisible(true);])class Fereastra extends JFrame{private JTextF ie ld j tJDate, j tJAfi s are ;private JButton jbCalcul, jbExit;//constructorpublic FereastraQ

    )))

    *.

  • r12

    {setSize(600,400);addWindow Li s t e ner (new F e re a s tr aL i s te ne r Q ) ;//c onstruie st e c omponent e :

    JLabel jl I :new Jlabel ("Numar:")'j tJD at e : new JText F ie I d ( 5 ) ; //pt. inno duc e re numarJPanel jp 1 :new JPanelQ ;j p 1. add(j I 1 ) ; i p L add(i tJDate) ;

    JLabe I j I 2 : new J Label (" D ivizorii :j tfAfi s are : new JT ext F ie H (a U ;j tfAfisare. set Editable (false) ;JP anel j p 2 :new J P anel 0 ;j p2. add (j 12) ; j p2. add(i tfAfi s are) ;

    j b C alcul :new JButt on(" C alcul ") ;j b Exit : new JB utton(" Exit " ) ;JP anel j p 3 :new JP anel 0 ;j p 3. add(j b C alcul) ; j p 3. add (i b Exit) ;

    ClasaButoaneListener bL:new ClasaButoane Listener Q ;j b C al cul. addActionli ste ner (b L) ;j b Exit. addActi onLi stener @ L) ;//Containerulfinal:Container c:this. getContentP ane Q ;c.add(jp,"South");

    //inner class:priv ate clas s F ere as tr ali s tener exte nds Window Adapter

    {public void w indow Clo sing(Window Event ev)

    {System.exit(0);

    )]//end inner class

    Grafica in Java

    //inner class:private class clasaButoanelistener implements ActionlistenerfI

    public void actionPedormed(ActionEvent ev){Obj e c t surs a: ev. ge t Sourc e Q ;tf(s urs a: :i b Exit) Sys tem. ex it (0) ;tf(sursq::ibCalcul){int nr :Inte ger.parse Int (j t/Date. getText Q) ;String rezultat:,,1 , ,, ;//primul divizorfor(int i:2 ; i

  • Grafica in Java Grafica in Java

    ]//inner class:private class Fere astralistener extends WindowAdapter{publ ic vo id w indow C lo s ing(lTindow Ev e nt ev){System.exit(0);

    ))//end inner class//inner class:private class ClasaButoaneListener implements Actionlistener{pub I ic vo i d actionP erforme d (ActionEv ent ev){

    Obj e ct sur s a: ev. get Sourc e Q ;if(surs a: :j b Exit) Sy ste m. ex it (0) ;if( s ur s a -- :j b C a I c ul ) {

    //preluarea elementelor vectorului, din JTextField:String s :j tJDate. ge tText Q ;StringTokenizer tk:new StringTokenizer(s) ;int N:tk. countTokens Q ; //nr. de elemente