Documente Academic
Documente Profesional
Documente Cultură
5.1. Introducere
Obiectele sînt scurte secvenţe de cod care conţin declaraţii şi expresii care determină
realizarea unor acţiuni utile necesare realizării unei aplicaţii. Specificul limbajului
Java şi al tuturor limbajelor orientate pe obiecte, este modul special în care sînt
utilizate corect şi eficient aceste secvenţe. Obiectul poate fi considerat cea mai mică
unitate logică a limbajului Java.
Clasele sînt formate din obiecte. Obiectele care compun o clasă pot să nu fie identice,
dar au suficient de multe caracteristici comune pentru a fi grupate împreună.
Clasele sînt formate din mai multe elemente diferite, cum ar fi metodele şi
variabilele. Clasa este un şablon pentru informaţii despre un grup de elemente, chiar
dacă acestea diferă în unele privinţe. De asemenea, clasele conţin metode pentru
obţinerea informaţiilor despre starea unui membru. Fiecare membru real al unei clase
se numeşte instanţă.
Metodele sînt funcţii care raportează o stare. Ele pot returna o valoare (un număr
întreg, o valoare de tip boolean, etc). Metodele pot fi apelate şi de către clase diferite
de cea din care fac parte. O superclasă este clasa de pe nivelul cel mai înalt al unei
aplicaţii. În Java, aceasta este întotdeauna clasa Object. Prin urmare, dacă pentru o
clasă este declarată superclasa sau clasa de nivel imediat superior, atunci aceasta este
în mod automat o subclasă a clasei Object. Fiecare instanţă a unei clase
reimplementează logica şi definiţiile create de superclasă. Subclasele extind
superclasa şi creează o noua variabilă a acesteia. Subclasele moştenesc toate
caracteristicile clasei părinte.
Fiecare clasă trebuie să aibă un nume de identificare valid. Acest nume poate începe
cu o literă, cu liniuţa de subliniere sau cu simbolul dolar.
5.2 – Clase şi obiecte în Java 103
… //corpul clasei
}
Corpul clasei este declarat între acolade. Numele clasei, NumeClasa, este precedat de
numele superclasei, NumeSuperClasa, şi de caracterul punct. Aceasta permite
compilatorului să afle unde găseşte informaţii despre clasa respectivă.
Numele asociat unei clase trebuie să respecte aceleaşi condiţii ca şi orice identificator:
să înceapă cu o literă, cu liniuţa de subliniere sau cu simbolul dolar. Prin convenţie (se
recomandă), numele claselor încep cu literă mare. În acest fel, clasele pot fi deosebite
cu uşurinţă de metode, variabile şi alţi identificatori.
Toate aplicaţiile Java trebuie să definească o metodă denumită main. Cînd se lansează
în execuţie o aplicaţie Java aceasta începe de la metoda main. Aceasta trebuie
declarată publică.
Acesta este codul prin care se declară clasa cu numele Punct, care defineşte
coordonatele unui punct în plan. Clasa Punct conţine două variabile de tip întreg: x şi
y. Faptul că cele două variabile sînt declarate publice (prin cuvîntul cheie public)
implică posibilitatea ca orice clasă să aibă acces la aceşti doi membri ai clasei Punct.
Un obiect al clasei Punct este creat atunci cînd se face o instanţiere (Fig. 5.1.).
Atunci cînd este creat un nou obiect al clasei Punct se alocă spaţiu de memorie pentru
acest obiect şi pentru componentele sale (în acest caz x şi y). În plus, cei doi membri,
x şi y, sînt iniţializaţi cu valoarea zero ca urmare instrucţiunilor de atribuire din
definiţiile acestora.
Aceasta conţine doi membri de tip întreg, lungime şi latime, şi un al treilea membru,
origine, de tipul Punct. Se poate deci folosi numele clasei şi într-o declaraţie de tip
pentru o variabilă (în acest caz variabila origine). Numele unei clase poate fi utilizat în
orice loc în care poate fi utilizat şi un tip primitiv. Latime este un întreg, lungime este
un întreg, iar origine este un Punct. Dreptunghi are un Punct. Discriminarea între
este un şi are un este destul de sensibilă deoarece doar un obiect care este un Punct
poate fi utilizat acolo unde este apelat un Punct.
obiect
Dreptunghi în
relaţie cu un
obiect Punct
În desenul anterior (Fig. 5.2) se poate observa diferenţa între tipurile primitive şi cele
referinţă. Lungime şi latime sînt de tip întreg şi sînt conţinute în Dreptunghi, iar
origine indică doar către un obiect Punct.
Clasele Punct şi Dreptunghi sînt implementări simpliste ale unor clase care definesc
un punct sau un dreptunghi în plan. Amîndouă ar trebui să furnizeze şi mecanisme
care să permită iniţializarea componentelor lor cu alte valori decît zero. În plus,
Dreptunghi ar putea furniza o metodă pentru calculul ariei sale. Ca urmare, se poate
scrie o nouă variantă pentru Punct, care să conţină un constructor care dă posibilitatea
iniţializării unui Punct nou cu o valoare diferită de zero.
Dacă se foloseşte această variantă, atunci cînd se creează un Punct1 se pot transmite
valori iniţiale, altele decît zero, astfel:
// urmează 4 constructori
public Dreptunghi1() {
origine = new Punct1(0, 0);
}
public Dreptunghi1(Punct1 p) {
origine = p;
}
public Dreptunghi1(int lu, int la) {
În această secţiune se vor prezenta etapele prin care se creează un obiect dintr-o clasă
şi modul în care se poate utiliza acesta şi apoi cum procedează sistemul cînd obiectul
nu mai este folositor.
În mod natural, un program Java creează multe obiecte dintr-o varietate de clase,
obiecte care vor interacţiona permiţînd crearea şi implementarea interfeţelor GUI,
execuţia unei animaţii, transmiterea informaţiilor prin reţea, etc. După ce un obiect a
încheiat sarcina pentru care a fost construit este dus la gunoi (garbage-collected) şi
resursele sale sînt reciclate pentru a fi utilizate de alte obiecte. Acestea sînt etapele de
viaţă ale unui obiect: crearea, utilizarea, distrugerea.
În Java un obiect este creat prin crearea unei instanţe a unei clase, deci prin
instanţierea unei clase. Foarte des se creează un obiect Java utilizînd o comandă de
genul:
Prin această comandă se creează un obiect nou Dreptunghi1 din clasa Dreptunghi1
declarată în paragraful anterior. Această comandă determină următoarele 3 acţiuni:
declararea : Dreptunghi1 dreptun este o declaraţie de variabilă care arată
compilatorului că numele dreptun este folosit pentru a referi un obiect
Dreptunghi1. De observat că numele clasei este folosit ca un tip de variabilă.
instanţierea: new este un operator Java care creează un obiect nou, adică
alocă spaţiu de memorie pentru el.
iniţializarea: Dreptunghi1() este un apel către constructorul Dreptunghi1 care
iniţializează obiectul.
Declararea unui obiect nu este în mod necesar parte din procesul de creare a
obiectului chiar dacă apare frecvent în acest context. Ca şi alte declaraţii de variabile,
declaraţiile de obiecte pot să apară şi de sine stătătoare:
Dreptunghi1()dreptun;
Declararea unui obiect se face ca şi declararea variabilelor în general, prin tip şi nume.
În Java clasele şi interfeţele pot fi utilizate ca şi tipuri de date, deci un tip poate fi
numele unei clase (cum este clasa Dreptunghi1) sau al unei interfeţe. Clasele şi
interfeţele sînt tipuri referinţă, adică valoarea variabilei este de fapt o referinţă către
valoarea sau mulţimea de valori reprezentate de variabilă. De observat că declaraţiile
nu creează noi obiecte ci doar arată compilatorului că o anumită variabilă va fi referită
5.2 – Clase şi obiecte în Java 109
Instanţierea unui obiect se face cu operatorul new. Acesta instanţiază o clasă alocînd
memorie pentru un obiect nou de tipul dat în declaraţie. new necesită un singur
argument de tip postfix care este un apel către un constructor. Fiecare clasă Java
fumizează o mulţime de constructori folosiţi pentru a iniţializa noile obiecte de tipul
declarat. Operatorul new creează obiectul, iar constructorul îl iniţializează.
După această comandă, dreptun face referinţă către un obiect Dreptunghi1 a cărui
origine este în (0,0) şi are lungimea 200 şi lăţimea 100.
După cum s-a arătat anterior clasele pot avea unul sau mai mulţi constructori cu care
iniţializează un obiect nou. Un constructor este uşor de recunoscut deoarece are
acelaşi nume ca şi clasa de care aparţine şi nu returnează nici un tip.
public Dreptunghi1(Punct1 p)
public Dreptunghi1(int lu, int la)
public Dreptunghi1(Punct1 p, int lu, int la)
public Dreptunghi1()
Dacă o clasă are mai mulţi constructori toţi vor avea acelaşi nume, dar un număr
diferit de argumente sau tipuri de argumente diferite. Compilatorul diferenţiază
constructorii în funcţie de argumentele fiecăruia. Cînd compilatorul întîlneşte codul
110 Obiecte şi clase în Java – 5
va şti să facă apel către constructorul care necesită două argumente întregi (care
iniţializează lungimea şi lăţimea noului dreptunghi cu valorile furnizate de
argumente). Cînd compilatorul întîlneşte următoarea linie de cod va apela
constructorul care necesită un Punct1 (care furnizează valoarea iniţială pentru originea
noului dreptunghi):
Ultima linie prezintă cazul unui constructor fără argumente. Dacă unele clase simple
(cum au fost spre exemplu primele două clase definite anterior, Punct şi Dreptunghi)
nu definesc explicit un constructor, Java furnizează automat un constructor fără
argumente, numit constructor implicit, care nu are nici un efect. Deci, toate clasele au
cel puţin un constructor.
În mod normal, după ce fost creat, un obiect va fi utilizat pentru a îndeplini un anumit
scop, pentru a rezolva o problemă. El va furniza o anumită informaţie, va trebui să îşi
modifice starea sau să realizeze o anumită acţiune. Aceste lucruri pot fi făcute în două
moduri:
Membrul origine al obiectului Dreptunghi1 este accesibil şi altor clase prin declararea
lui publică. Se poate presupune astfel că manipularea sa directă este sigură.
Clasa Dreptunghi1 mai are două variabile publice, deci accesibile şi ele din exterior:
lu, la. Se poate utiliza aceeaşi modalitate pentru a le accesa spre exemplu pentru a
calcula aria dreptunghiului:
referinta_obiect .variabila
lu = new Dreptunghi1().lu;
dreptun.deplasare (333,222)
Această instrucţiune face apel la metoda deplasare care are doi parametri întregi (333,
222). Va deplasa noul dreptunghi deoarece metoda lui dreptun atribuie valori noi
pentru origine.x şi origine.y, lucru echivalent cu instrucţiunea de atribuie anterioară
(dreptun.origine = new Punct1(333,222);).
Notaţia folosită pentru a apela o metodă a unui obiect este similară cu cea folosită la
referirea către variabile: cuplarea numelui metodei cu referinţa la obiect prin
separatorul punct (.). De asemenea, se furnizează toate argumentele metodei, dacă e
cazul, dacă nu, se pun doar parantezele.
referinta_obiect.numele_metodei(ListaArgumente);
sau
referinta_obiect.numele_metodei();
new Dreptunghi1(200,100).aria()
Metoda aria returnează o valoare. Se poate face apel în expresii la astfel de metode
care returnează o valoare. Această valoare poate fi atribuită unei variabile, folosită
pentru a lua decizii sau în bucle.
int aria_dreptunghiului = new Dreptunghi1 (200,100).aria();
Codul anterior atribuie valoarea returnată de către metoda aria, unei variabile numite
aria_dreptunghiului.
Invocarea unei metode pentru un anumit obiect este identică cu transmiterea unui
mesaj către acel obiect. În exemplul anterior obiectul este dreptunghiul numit dreptun.
Probabil, se va obţine un răspuns diferit dacă acelaşi mesaj este transmis unui alt
obiect, de exemplu, figura.
5.2 – Clase şi obiecte în Java 113
Platforma Java are un colector de gunoaie care eliberează periodic memoria utilizată
de obiecte care nu mai sînt folosite.
return ob;
}
public boolean StivaGoala()
if (its.marime() == 0)
return true;
else
return false;
}
}
Implementarea unei stive în acest mod utilizează un obiect Vector în care se vor
memora elementele stivei. Vector este o zonă de obiecte, care se extinde pe măsură ce
este necesar spaţiu pentru noi obiecte.
Declararea clasei Stiva este relativ simplă, ea indicînd clasa publică cu numele Stiva.
Acesta este şi modul în care apare de obicei declarată o clasă. Declararea clasei mai
poate cuprinde mai multe informaţii despre clasă, cum ar fi numele superclasei sau
dacă poate avea subclase.
În faţa cuvîntului cheie class urmat de numele clasei, care sînt obligatorii, pot să apară
cuvintele:
După numele clasei poate fi specificată superclasa clasei care se declară (de exemplu,
extends Superclasa) sau interfaţa implementată de clasă (de exemplu, implements
Interfata).
appleturi Java
lucrul cu moştenirea
implementarea şi crearea interefeţelor.
Corpul clasei urmează declaraţiei clasei şi este poziţionat între acolade, {}. Acesta
conţine
Corpul clasei conţine codul necesar derulării ciclului de viaţă al obiectelor pe care le
creează: constructori pentru iniţializarea noilor obiecte, declaraţii ale variabilelor care
indică starea clasei şi obiectelor sale, metode care implementează comportamentul
clasei şi al obiectelor sale şi mai rar, o metoda de final care "face curăţenie" după ce
obiectul şi-a încheiat funcţia pentru care a fost creat.
Clasa Stiva defineşte în corpul său o variabilă membru Vector în care se vor păstra
elementele stivei. De asemenea, se mai definesc un constructor fără argumente şi trei
metode: push, pop, StivaGoala.
O clasă poate conţine unul sau mai mulţi constructori pentru iniţializarea noilor
obiecte ale clasei. Constructorul are acelaşi nume ca şi clasa. Constructorul clasei
Stiva are acelaşi nume, Stiva:
public Stiva() {
its = new Vector (10);
}
Într-o clasă pot exista mai mulţi constructori cu acelaşi nume, dar cu număr diferit de
parametri. De exemplu, pentru Stiva se mai poate defini un constructor care
iniţializează mărimea stivei în conformitate cu parametrul său:
Starea unei clase este reprezentată prin variabilele membre. În general variabilele se
declară înaintea metodelor, în corpul clasei, deşi nu este neapărat necesar.
DeclarareaClasei {
declararea variabilelor membre
declararea metodelor
}
Variabilele membre se declară în corpul clasei, dar nu trebuie să fie conţinute într-o
metodă. Variabilele declarate în corpul unei metode sînt variabilele locale ale
respectivei metode.
Codul pentru metoda push din clasa Stiva implementează acţiunea prin care un
element este pus în vîrful stivei (push) şi apoi returnat:
O clasă Java poate conţine două tipuri diferite de membri: instanţe şi clase.
class Exemplu {
float varfloat;
}
Ori de cîte ori este creată o instanţă a unei clase, sistemul creează o copie pentru
fiecare variabilă instanţă.
În mod similar cu variabilele, clasele pot avea metode instanţe şi metode ale clasei.
Metodele instanţe operează cu variabilele instanţe ale obiectului curent, dar au şi acces
la variabilele clasei. Metodele clasei, pe de altă parte, nu au acces la variabilele
instanţe, decît dacă creează un nou obiect şi le accesează prin acesta.
Implicit, un membru declarat într-o clasă este un membru instanţă. Clasa următoare,
UnIntregX, are o variabilă instanţă, un întreg x, şi două metode instanţe, x şi setX, care
permit altor obiecte să seteze şi să verifice valoarea lui x.
class UnIntregX {
int x;
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
De fiecare dată cînd este instanţiat un nou obiect al clasei, se formează o copie a
variabilelor instanţe ale clasei. Aceste copii sînt asociate cu noile obiecte. De fiecare
dată cînd este instanţiat un nou obiect UnIntregX al clasei se va forma o copie nouă a
lui x care este asociată cu obiectul UnIntregX.
Una din facilităţile care fac din Java un limbaj atractiv este aceea prin care o pagină
statică Web este transformată într-o prezentare multimedia interactivă. Acest lucru se
realizează cu aşa numitele miniaplicaţii Java (după P. Norton). Acestea se bazează pe
programe externe care le asigură interfaţa cu utilizatorul, ele neputînd fi rulate
independent. Două exemple de programe externe în sensul precizat anterior sînt
browser-ul Web care recunoaşte limbajul Java şi programul de vizualizare -
appletviewer - din setul JDK (Java Development Kit).
Miniaplicaţiile sînt extensii ale clasei java.applet.Applet. Ele sînt de fapt exemple de
subclase.
class este cuvîntul cheie prin care se indică faptul că se declară o clasă, Nume_clasă
este numele particular al clasei, iar modificatorul extends semnalează compilatorului
că miniaplicaţia este o subclasă, în acest caz a clasei java.applet.Applet.
Exemplu:
import java.awt.*;
import java.awt.image;
import java.applet.*;
După ce s-a compilat codul miniaplicaţiei, trebuie creat un document HTML care să
fie folosit de programul extern (browser-ul Web sau appletviewer).
Exemplu:
<HTML>
<HEAD>
<TITLE>SalutApplet</TITLE>
</HEAD>
<BODY>
<APPLETCODE = "SalutApplet" WIDTH = 300 HEIGTH
= 300> </APPLET>
</BODY>
</HTML>
Miniaplicaţiile nu conţin metoda main (), ele folosesc metodele init() şi start(). Cînd
miniaplicaţia este lansată în execuţie browser-ul apelează întîi metoda init() şi apoi
metoda start(), metode care pot fi declarate explicit în cadrul miniaplicaţiei sau pot fi
considerate variantele implicite. În cadrul metodei start() este apelată implicit metoda
repaint() care conţine un apel la metoda paint() care nu afişează nimic pe ecran decît
dacă este redefinită.
Metoda init() este apelată numai atunci cînd miniaplicaţia este încărcată pentru prima
dată într-un program de vizualizare. În cadrul metodei init(), iniţializările se fac o
singură dată. Acesta este locul potrivit pentru preluarea argumentelor din linia de
120 Obiecte şi clase în Java – 5
comandă, transmise de pagina HTML din care a fost apelată miniaplicaţia. Metoda
init() are un format fix: trebuie să fie întotdeauna numită init(), să returneze tipul void
(să nu returneze nici o valoare), să fie declarată publică şi să nu aibă argumente.
Metoda start() este apelată după metoda init(), atunci cînd miniaplicaţia este
încărcată pentru prima dată într-un program de vizualizare sau cînd execuţia
miniaplicaţiei este suspendată şi trebuie reluată. În cazul în care compilatorul nu
găseşte o metodă start() declarată explicit în cadrul miniaplicaţiei, va apela în mod
prestabilit metoda start() din java.applet.Applet.
Exemplu:
Metoda start() din exemplul de mai sus atribuie variabilei run valoarea true, apoi intră
într-o buclă while care este executată atît timp cît variabila run are valoarea true.
Bucla while incrementează variabila contor, a cărei valoare 0 a fost stabilită în metoda
init(). Apelul metodei repaint() determină redesenarea ecranului la fiecare
incrementare a variabilei contor. Instrucţiunile try şi catch determină o pauză de 1000
milisecunde în execuţia programului după fiecare incrementare a variabilei contor.
Metoda stop() este apelată de fiecare dată cînd o miniaplicaţie trebuie să fie oprită sau
suspendată. Fără această metodă, miniaplicaţia ar continua să ruleze, consumînd
resursele sistemului, chiar după ce utilizatorul a părăsit pagina miniaplicaţiei.
Exemplu:
public void stop() {
run = false;
5.2 – Clase şi obiecte în Java 121
}
Metoda atribuie variabilei run valoarea false. Această valoare determină ieşirea din
bucla while a metodei start() prezentate în exemplul anterior, ajungîndu-se astfel la
sfîrşitul metodei. Rezultatul este faptul că execuţia miniaplicaţiei încetează. Ca şi în
cazul metodelor init() şi start(), declararea metodei stop() nu este necesară. Metoda
redefineşte metoda stop() prestabilită din java.applet.Applet şi are un format fix.
Metoda paint() este folosită pentru desenarea sau redesenarea ecranului. Ea este
apelată automat de metoda repaint(), dar poate fi apelată şi explicit de miniaplicaţie.
Aceasta se întîmplă de fiecare dată cînd browser-ul cere redesenarea ecranului, de
exemplu atunci cînd o miniaplicaţie care a fost acoperită de o altă fereastră este adusă
în prim-plan.
Metoda paint() are un format fix şi trebuie să fie întotdeauna numită paint, să
returneze tipul void (să nu returneze nici o valoare) şi să fie declarată publică. Spre
deosebire de metodele init() şi start(), are un argument de tip Graphics. Acesta este un
tip predefinit în Java, care conţine mai multe metode pentru desenarea imaginilor şi a
textului pe ecran.
Exemplu:
public void paint (Graphics g) {
g.drawstring(“contor = ” + contor, 15, 15);
}
import java.awt.Graphics;
}
}
REZUMAT
class NumeSuperClasa.NumeClasa {
//corpul clasei
}