Sunteți pe pagina 1din 30

Capitolul V.

Obiecte şi clase în Java

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.

5.2. Clase şi obiecte în Java

5.2.1. Noţiuni introductive despre clase în Java

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

Sintaxa pentru declararea unei clase este următoarea:


class NumeSuperClasa.NumeClasa {

… //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ă.

Metoda main este similară funcţiei main din C şi C++.

Declaraţia unei metode main () are următorul format:

public static void main (String args[]) {


… //corpul metodei main
}

public - permite accesul programelor externe la metoda main();


static - indică faptul că această metodă nu poate fi modificată de către
subclase;
void - semnifică faptul că metoda nu returnează nici o valoare;
main() - numele obligatoriu al metodei;
String args[] - indică faptul că metoda main() acceptă ca argument în linia de
comandă un tablou (matrice) de obiecte de tip String. Matricea va conţine
argumentele specificate în linia de comandă la lansarea aplicaţiei.

O aplicaţie simplă care va afişa mesajul "Salut Java!":

public class Salut {


public static void main (String args[]) {
System.out.println("Salut Java!")
}
104 Obiecte şi clase în Java – 5

În continuare, se prezintă un exemplu simplu de declarare şi utilare a unor clase,


urmărind toate componentele implicate.

public class Punct {


public int x = 0;
public int y = 0;
}

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.).

Fig. 5.1. Un obiect Punct

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.

Clasa Dreptunghi declară un dreptunghi în plan:

public class Dreptunghi {


public int latime = 0;
public int lungime = 0;
public Punct origine = new Punct()
}
5.2 – Clase şi obiecte în Java 105

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.

Ca şi în cazul obiectului Punct, atunci cînd se creează un obiect nou Dreptunghi, se


alocă spaţiu pentru obiect şi componentele sale şi acestea sînt iniţializate conform
declaraţiilor respective. Iniţializarea pentru componenta origine creează un obiect
Punct folosind cuvîntul cheie new urmat de Punct().
Fig. 5.2. Un

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.

public class Punct1 {


public int x = 0;
106 Obiecte şi clase în Java – 5

public int y = 0; // constructor!


public Punct(int x, int y) {
this.x = x;
this.y = y;
}
}

Dacă se foloseşte această variantă, atunci cînd se creează un Punct1 se pot transmite
valori iniţiale, altele decît zero, astfel:

new Punct1 (33,55)

Valorile 33 şi 55 sînt transmise - pasate - constructorului şi apoi atribuite membrilor x


şi y ai noului obiect Punct1.

Fig. 5.3. Noul obiect Punct1

În consecinţă, se poate scrie o nouă clasă, Dreptunghi1 care conţine 4 constructori, o


metodă prin care dreptunghiul este deplasat, deplasare() şi o metodă prin care este
calculată suprafaţa dreptunghiului, aria().
5.2 – Clase şi obiecte în Java 107

public class Dreptunghi1 {


public int lungime = 0;
public int latime = 0;
public Punct1 origine;

// urmează 4 constructori
public Dreptunghi1() {
origine = new Punct1(0, 0);
}

public Dreptunghi1(Punct1 p) {
origine = p;
}
public Dreptunghi1(int lu, int la) {

this(new Punct1(0, 0), lu, la);


}

public Dreptunghi1(Punct1 p, int lu, int la) {


origine = p;
lungime = lu;
latime = la;
}

// o metodă pentru deplasarea dreptunghiului


public void deplasare(int x, int y) {
origine.x = x;
origine.y = y;
}

// o metodă pentru calculul ariei dreptunghiului


public int aria() {
return lungime * latime;
}
}

Cei 4 constructori permit 4 tipuri diferite de iniţializări. Se poate crea un Dreptunghi1


nou
 cu valori implicite pentru toate variabilele;
 cu specificarea valorilor iniţiale pentru origine, lungime şi lăţime, respectiv.

5.2.2. Obiectele în Java


108 Obiecte şi clase în Java – 5

Î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.

A.) Crearea obiectelor în Java

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

Dreptunghi1 dreptun = new Dreptunghi1();

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

prin numele din declaraţie. Declaraţia Dreptunghi1() dreptun; nu creează un nou


obiect ci doar o variabilă numită dretpun în care sa va găsi apoi un obiect
Dreptunghi1. Pentru a crea un obiect Dreptunghi1, sau oricare altul se foloseşte
operatorul new.

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ă.

new Dreptunghi1 (200,100)

creează un obiect Dreptunghi1. Dreptunghi1 (200,100) este argumentul lui new.


Operatorul new returnează o referinţă către obiectul nou creat. Această referinţă poate
fi atribuită unei variabile de tip corespunzător, ca în exemplul următor:

Dreptunghi1 dreptun = new Dreptunghi1 (200,100)

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.

Iniţializarea unui obiect

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.

Declaraţiile constructorilor Dreptunghi1 din exemplul anterior sînt:

public Dreptunghi1(Punct1 p)
public Dreptunghi1(int lu, int la)
public Dreptunghi1(Punct1 p, int lu, int la)
public Dreptunghi1()

Fiecare dintre aceşti constructori permit utilizatorului să precizeze valori iniţiale


pentru diverse caracteristici ale dreptunghiului: origine, lungime, lăţime, toate trei sau
nici una.

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

Dreptunghi1 dreptun = new Dreptunghi1 (200,100)

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

Dreptunghi1 dreptun = new Dreptunghi1(new Punct1(44,55))

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.

B.) Utilizarea obiectelor în Java

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

 prin manipularea sau inspectarea variabilelor obiectului;


 prin apel la metodele obiectului.

POO descurajează manipularea directă a variabilelor unui obiect. Un obiect bine


construit va furniza metodele prin care starea acestuia să poată fi inspectată şi eventual
modificată. Există însă şi cazuri în care se pot manipula direct variabilele.

Dacă pentru exemplul cu dreptunghiul se presupune că acesta reprezintă un obiect


dreptunghiular desenat pe ecran şi acesta a fost mutat într-o poziţie nouă trebuie ca
punctul de origine al obiectului Dreptunghi1 să fie modificat. Clasa Dreptunghi1
furnizează două modalităţi prin care se poate face acest lucru:

 manipularea directă a variabilelor care reprezintă originea;


 apelul către metoda de mutare a dreptunghiului.
5.2 – Clase şi obiecte în Java 111

Membrul origine al obiectului Dreptunghi1 este accesibil şi altor clase prin declararea
lui publică. Se poate presupune astfel că manipularea sa directă este sigură.

 Manipularea directă a variabilelor care reprezintă originea

Pentru a muta un dreptunghi desenat anterior se poate scrie comanda:

dreptun.origine = new Punct1(222,333)

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:

aria = dreptun.lu * dreptun.la;

În general, pentru a face referinţe la variabilele unui obiect, se va realiza cuplarea


numelui variabilei cu referinţa la obiect prin separatorul punct (.):

referinta_obiect .variabila

referinta_obiect trebuie să fie o referinţă la un obiect. Se poate folosi numele


obiectului (ca în exemplul precedent cu dreptun) sau orice altă expresie care
returnează o referinţă la un obiect. Se poate folosi valoarea returnată de new pentru
a accesa variabilele unui nou obiect:

lu = new Dreptunghi1().lu;

Această comandă creează un nou obiect Dreptunghi1 şi imediat preia lungimea sa


(calculează lungimea dreptunghiului). De observat că, după ce a fost executată această
instrucţiune programul nu mai are o referinţă la Dreptunghi1 care a fost creat pentru
că programul nu a memorat niciodată referinţa într-o variabilă.

Toate obiectele de acelaşi tip au aceleaşi variabile. Toate obiectele Dreptunghi1 au


variabilele origine, lungime şi laţime preluate de la clasa Dreptunghi1. Cînd se
accesează o variabilă printr-o referinţă la obiect accesul se face la variabilele
particulare ale obiectului. Dacă există un alt dreptunghi figura în programul de
desenare a dreptunghiurilor şi acesta are altă lungime şi lăţime decît dreptun aria se va
calcula cu comanda:

aria = figura.lu * figura.la;

 Apelul la metodele obiectului


112 Obiecte şi clase în Java – 5

Un dreptunghi poate fi mutat, făcînd apel la metodele sale, astfel:

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();

referinta_obiect trebuie să fie o referinţă la un obiect. Se poate scrie numele unei


variabile, dar şi orice altă expresie care returnează o referinţă la un obiect. Operatorul
new returnează o referinţă la un obiect, deci se poate utiliza valoarea returnată de new
pentru a face apel la metodele noului obiect:

new Dreptunghi1(200,100).aria()

Expresia new Dreptunghi1(200,100) returnează o referinţă la un obiect care se referă


la obiectul Dreptunghi1. Se poate folosi notaţia cu punct pentru a face apel la metoda
aria a noului Dreptunghi1 pentru a calcula aria noului dreptunghi.

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

C.) Degajarea obiectelor care nu se mai folosesc

În general, limbajele OO necesită urmărirea obiectelor create şi distrugerea lor


explicită atunci cînd nu mai sînt necesare. Această tehnică de manipulare a memoriei
este destul de des originea unor erori. Limbajul Java oferă posibilitatea creării unui
număr de obiecte limitat doar de posibilităţile sistemului pe care se lucrează, fără a
mai fi necesară distrugerea lor cînd nu se mai folosesc. Mediul runtime Java şterge
obiectele atunci cînd determină că nu mai sînt utilizate. Acesta este procesul de
colectare a gunoaielor. Un obiect este trecut în lada de gunoi în momentul în care se
observă că nu mai există referinţe la el. Referinţele care sînt în variabile sînt în mod
natural evacuate cînd variabila nu mai e folosită sau pot fi evacuate explicit punînd
variabila pe null.

Platforma Java are un colector de gunoaie care eliberează periodic memoria utilizată
de obiecte care nu mai sînt folosite.

5.2.3. Crearea claselor în Java

După ce se cunoaşte modul de creare şi utilizare a obiectelor urmează cunoaşterea


modului de scriere a claselor din care se creează obiectele. Exemplul prin care se
prezintă acest lucru se referă la implementarea unei stive LIFO (Last In First Out -
ultimul intrat primul ieşit). O stivă este o zonă de memorie care conţine informaţie
memorată într-o anumită ordine. În continuare se prezintă clasa şi structura codului.

public class Stiva { // declararea clasei


//corpul clasei
privateVector its; // variabila
public Stiva() { // constructor
its = new Vector (10);
}
public Obiect push(Obiect it) {
it.adaugaElement(it); Corpul
return it; clasei
}
public synchronized Obiect pop() {
Metode int lungime = its.marime();
Obiect ob = null;
if (lungime = = 0)
throw new EmptyStackException()
ob = its.elementLa(lungime-1);
its.afaraElemenLa(lungime-1);
114 Obiecte şi clase în Java – 5

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.

5.2.3.1. Declararea clasei

În programul anterior se observă că implementarea clasei implică existenţa a două


componente de bază:
 declararea clasei - se declară numele clasei împreună cu diverse atribute;
 corpul clasei.

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:

 public - clasa este accesibilă public


 abstract - clasa nu poate fi instanţiată
 final - clasa nu poate avea subclase.

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).

În legătură cu aceste componente ale declaraţiei unei clase se va detalia în pachetele


anexă modul de

 creare şi utilizare a pachetelor;


 scriere a claselor şi metodelor abstracte;
 scrierea claselor şi metodelor finale;
5.2 – Clase şi obiecte în Java 115

 appleturi Java
 lucrul cu moştenirea
 implementarea şi crearea interefeţelor.

5.2.3.2. Corpul clasei

Corpul clasei urmează declaraţiei clasei şi este poziţionat între acolade, {}. Acesta
conţine

 declaraţiile variabilelor instanţe şi clase (variabile membre) pentru clasa curentă;


 declaraţiile şi implementarea metodelor instanţe şi clase (metode, în general).

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.

5.2.3.3 Constructorii clasei

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:

public Stiva(int MarimeInitiala) {


its = new Vector(10);
}

Cînd se declară constructorii unei clase se utilizează următorii specificatori de acces


prin care se precizează ce alte obiecte pot crea instanţe ale clasei:
116 Obiecte şi clase în Java – 5

 private - nici o altă clasă nu poate instanţia clasa curentă;


 protected - numai subclasele clasei pot crea instanţe ale acesteia;
 public - orice clasă poate crea o instanţă a clasei curente;
 package - numai clasele din cadrul aceluiaşi pachet ca şi clasa curentă pot construi
o instanţă a acesteia.

5.2.3.4. Declararea variabilelor membre

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.

5.2.3.5 Implementarea metodelor

Metodele implementează comportarea obiectelor. Un obiect oarecare poate cere altui


obiect să realizeze ceva prin invocarea metodelor acestuia. Metoda unei clase se
defineşte în corpul clasei pentru care metoda implementează o anumită funcţie. În
general, metoda clasei se defineşte după declararea variabilelor, dar nu neapărat.

Codul pentru metoda push din clasa Stiva implementează acţiunea prin care un
element este pus în vîrful stivei (push) şi apoi returnat:

Declaraţia metodei public Obiect push(Obiect it)


{
its.adaugaElement(it);
Corpul metodei return it;
}

Se observă că metoda, ca şi clasa, are două componente principale: declararea metodei


şi corpul metodei. Declararea metodei cuprinde definiţiile atributelor metodei (nivelul
de acces, tipul returnat, nume, argumente).
5.2 – Clase şi obiecte în Java 117

Tipul Numele Argumente


returnat metodei
Nivel de
acces

public Obiect push (Obiect it)


Corpul metodei implementează acţiunile care trebuie efectuate. Acesta conţine
instrucţiunile Java care implementează metoda.

5.2.3.6. Controlul accesului la membrii unei clase

Variabilele membre şi metodele portă denumirea de membrii ai unei clase. Cînd se


declară membrii unei clase Java este posibil ca să se permită sau nu obiectelor de alte
tipuri accesul la membrii clasei prin intermediul specificatorilor de acces. Detalii se
vor da în materialele anexe.

5.2.3.7. Membrii instanţe şi membrii clase

O clasă Java poate conţine două tipuri diferite de membri: instanţe şi clase.

Atunci cînd se declară o variabilă membru într-o clasă, se declară o variabilă-instanţă.


De exemplu, variabila varfloat din clasa Exemplu:

class Exemplu {
float varfloat;
}

Ori de cîte ori este creată o instanţă a unei clase, sistemul creează o copie pentru
fiecare variabilă instanţă.

Variabilele instanţe diferă de variabilele clasei (care se declară cu modificatorul


static). Sistemul alocă variabilele clasei o dată pe clasă indiferent de numărul
instanţelor create pentru clasa respectivă. Acesta alocă memorie pentru variabilele
clasei prima dată cînd întîlneşte clasa. Toate instanţele împart aceeaşi copie a
variabilelor clasei. Accesul la variabilele clasei poate fi făcut prin instanţe sau direct
de către clasă.
118 Obiecte şi clase în Java – 5

Î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.

5.3. Clase pentru miniaplicaţii în Java

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.

Declaraţia unei miniaplicaţii are următorul format:

class Nume_clasa extends Applet {


….
5.2 – Clase şi obiecte în Java 119

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.*;

public class SalutApplet extends Applet {


public void paint (Graphics g) {
g.drawString ("Salut Java!", 15, 15);
}
}

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.

Exemplu: punerea pe zero a unei variabile numite contor:

public void init () {


contor = 0;
}

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:

public void start() {


run = true;

while (run == true) {


contor += 1;
repaint(); //apel explicit al metodei repaint()
try {Thread.sleep(1000);}
catch(InterruptedException e) {}
}
}

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);
}

Efectul aplicării metodei este afişarea valorii variabilei contor.

Exemplu de folosire a metodelor start(), init(), paint() şi stop():

import java.awt.Graphics;

public class Contor extends java.applet.Applet {


int contor;
boolean run;
public void init() {
contor = 0;
}
public void start() {
run = true;
while(run == true){
contor ++;
repaint();
try{Thread.sleep(1000);}
catch(InterruptedException e) {}
122 Obiecte şi clase în Java – 5

}
}

public void stop() {


run = false;
}
public void paint(Graphics g) {
g.drawString(“counter = ” + counter, 10, 10);
}
}

REZUMAT

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.

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.

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.
5.2 – Clase şi obiecte în Java 123

O superclasă este clasa de pe nivelul cel mai înalt al


unei aplicaţii. În Java, aceasta este întotdeauna
clasa Object.

Subclasele extind superclasa şi creează o noua


variabilă a acesteia. Subclasele moştenesc toate
caracteristicile clasei părinte.

Sintaxa pentru declararea unei clase este


următoarea:

class NumeSuperClasa.NumeClasa {
//corpul clasei
}

Corpul clasei este declarat între acolade. Numele


clasei, NumeClasa, este precedat de numele
superclasei, NumeSuperClasa, şi de caracterul
punct.

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ă.

Declaraţia unei metode main () are următorul


format:
124 Obiecte şi clase în Java – 5

public static void main (String args[]) {


//corpul metodei main
}

public - permite accesul programelor externe la


metoda main();
static - indică faptul că această metodă nu
poate fi
modificată de către subclase;
void - semnifică faptul că metoda nu
returnează nici o valoare;
main() - numele obligatoriu al metodei;
String args[] - indică faptul că metoda main()
acceptă ca argument în linia de comandă un tablou
(matrice) de obiecte de tip String. Matricea va
conţine argumentele specificate în linia de comandă
la lansarea aplicaţiei.

În Java un obiect este creat prin crearea unei


instanţe a unei clase, deci prin instanţierea unei
clase.

Declararea unui obiect se face ca şi declararea


variabilelor în general, prin tip şi nume.

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.
5.2 – Clase şi obiecte în Java 125

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:

 prin manipularea sau inspectarea variabilelor


obiectului;
 prin apel la metodele obiectului.

Mediul runtime Java şterge obiectele atunci cînd


determină că nu mai sînt utilizate. Acesta este
procesul de colectare a gunoaielor. Un obiect este
trecut în lada de gunoi în momentul în care se
observă că nu mai există referinţe la el.

Implementarea unei clase implică existenţa a două


componente de bază:
 declararea clasei - se declară numele clasei
împreună cu diverse atribute;
 corpul clasei.

Declaraţia unei clase cuprinde cuvîntul cheie class


urmat de numele clasei (obligatorii) după care pot
să apară cuvintele:
 public - clasa este accesibilă public
 abstract - clasa nu poate fi instanţiată
 final - clasa nu poate avea subclase.
126 Obiecte şi clase în Java – 5

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).

Corpul clasei urmează declaraţiei clasei şi este


poziţionat între acolade, {}. Acesta conţine
 declaraţiile variabilelor instanţe şi clase
(variabile membre) pentru clasa curentă;
 declaraţiile şi implementarea metodelor instanţe
şi clase (metode, în general).

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.

Cînd se declară constructorii unei clase se


utilizează următorii specificatori de acces prin care
se precizează ce alte obiecte pot crea instanţe ale
clasei:

 private - nici o altă clasă nu poate instanţia clas


curentă;
 protected - numai subclasele clasei pot crea
instanţe ale acesteia;
 public - orice clasă poate crea o instanţă a clasei
curente;
 package - numai clasele din cadrul aceluiaşi
pachet ca şi clasa curentă pot construi o instanţă
a acesteia.
5.2 – Clase şi obiecte în Java 127

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.

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.

Metodele implementează comportarea obiectelor.


Un obiect oarecare poate cere altui obiect să
realizeze ceva prin invocarea metodelor acestuia.
Metoda unei clase se defineşte în corpul clasei
pentru care metoda implementează o anumită
funcţie. În general, metoda clasei se defineşte după
declararea variabilelor, dar nu neapărat.

Metoda, ca şi clasa, are două componente


principale: declararea metodei şi corpul metodei.

Declararea metodei cuprinde definiţiile atributelor


metodei (nivelul de acces, tipul returnat, nume,
argumente).

Corpul metodei implementează acţiunile care


trebuie efectuate. Acesta conţine instrucţiunile Java
care implementează metoda.
128 Obiecte şi clase în Java – 5

Variabilele membre şi metodele portă denumirea de


membrii ai unei clase. Cînd se declară membrii unei
clase Java este posibil ca să se permită sau nu
obiectelor de alte tipuri accesul la membrii clasei
prin intermediul specificatorilor de acces.

O clasă Java poate conţine două tipuri diferite de


membri: instanţe şi clase.

Atunci cînd se declară o variabilă membru într-o


clasă, se declară o variabilă-instanţă.

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.

O pagină statică Web poate fi transformată într-o


prezentare multimedia interactivă folosind
miniaplicaţii Java. Acestea se bazează pe programe
externe care le asigură interfaţa cu utilizatorul, ele
neputînd fi rulate independent.

Miniaplicaţiile sînt extensii ale clasei


java.applet.Applet (ele sînt de fapt exemple de
subclase).
5.2 – Clase şi obiecte în Java 129

Întrebări pentru Capitolul V

Care este relaţia între obiecte şi metode în Java?

Ce rol au variabilele în Java? Dar metodele?

Ce sînt şi care este utilitatea superclaselor şi


subclaselor?

Precizaţi care este utilitatea cuvîntului cheie main şi


ce sînt specificatorii de acces.

Folosind obiectul Punct creaţi o clasă Triunghi care


să reprezinte triunghiurile din plan.

Pentru clasa Triunghi construiţi trei constructori


pentru iniţializarea obiectelor.

Declaraţi şi implementaţi două metode pentru clasa


Triunghi declarată anterior.

Indicaţi cele două modalităţi prin care puteţi utiliza


obiectele unei clase.

Exemplificaţi, folosind clasa triunghi definită


anterior, cele două moduri de utilizare a obiectelor
în Java.

Ce se întîmplă cu un obiect în Java atunci cînd nu


mai este folosit? Ce înseamnă că nu mai este folosit?

Cum se creează o clasă în Java?


130 Obiecte şi clase în Java – 5

Ce semnificaţii au cuvintele cheie public, abstract,


final?

Care sînt cuvintele cheie din Java care apar lîngă


constructori şi ce semnificaţie au ele?

Enumeraţi şi descrieţi componentele unei metode


implementate în Java.

Care este diferenţa între membri instanţe şi membri


clase în Java? Dar între metode instanţe şi metode
ale clasei?

Care este utilitatea miniaplicaţiilor Java?

Care sînt componentele unei miniaplicaţii Java?

Indicaţi metodele utilizate de miniaplicaţiile Java şi


precizaţi utilitatea fiecăreia.
5.2 – Clase şi obiecte în Java 131

S-ar putea să vă placă și