Sunteți pe pagina 1din 10

Laborator 4:

Continuare Programare Orientat pe Obiecte

ntocmit de: Adina Neculai


ndrumtor: Asist. Drd. Gabriel Danciu
29 octombrie 2011

I.

NOIUNI TEORETICE

A.

Suprascrierea metodelor

O clas derivat poate declara o metod cu aceeai semntur cu a unei metode din clasa
de baz. Metoda din clasa derivat substituie astfel metoda din clasa de baz. Aceast tehnic
se numete suprascriere. Cu alte cuvinte, la apelul metodei suprascrise din clasa derivat se va
executa metoda declarat n clasa derivat. Dac se dorete apelul metodei ce aparine clasei de
baz, atunci n metoda din clasa descendent se folosete cuvntul cheie super urmat de operatorul
. i numele metodei suprascrise.
Sunt cazuri n care suprascrierea unei metode nu este dorit. Acest lucru se poate realiza prin
adugarea cuvntului cheie final. Astfel c, o metod declarat final n superclas nu poate fi
suprascris n subclas.
Diferena ntre o metod suprascris i una suprancrcat este c n cazul celei suprascrise
semntura este identic(att numrul parametrilor ct i tipul acestora).

B.

Clasa Object

n Java, toate clasele formeaz o anumit structur arborescent, care are ca rdcin clasa
Object. Implicit, aceasta este superclasa tuturor claselor i nu are o clas printe.
Metodele principale ale clasei Object sunt:
clone
Semntura aceste metode este: protected Object clone() i returneaz o clon a obiectului
cruia i se aplic, deci un obiect cu aceeai stare i acelai comportament. Cu toate acestea,
obiectul rezultat nu este tocmai identic deoarece adresa de memorie ctre care face referin
este diferit de cea a obiectului original.
Dup ce se execut instruciunea b=a.clone(), n care a i b sunt referine la obiecte, expresia
a==b va avea valoarea false, deoarece valorile variabilelor referin a si b sunt diferite, n
timp ce expresia a.equals(b) va ntoarce valoarea true, deoarece cele dou obiecte comparate
au coninuturi identice.

equals
Semntura metodei este public boolean equals(Object obj) i returneaz valoarea true dac
i numai dac obiectele comparate sunt ntr-adevr identice; adic obiectele au acelai coninut i aceeai adres de memorie.
hashCode
Semntura metodei este public int hashCode() i returneaz un ntreg care este folosit de
Java pentru a diferenia dou obiecte. Se recomand ca atunci cnd se dorete suprascrierea
metodei equals(), s se suprascrie i metoda hashcode(). Este important ca dou obiecte egale
conform metodei equals() s aib aceleai hashcode-uri.
toString
Semntura metodei este public String toString() i returneaz un ir de caractere de forma
java.lang.Object@hashCode n care hashCode este exprimat n hexazecimal. Acest ir de
caractere reprezint obiectul cruia i se aplic. De aceea, se recomand suprascrierea metodei
toString() n toate subclasele clasei Object pentru ca mesajul s poat fi neles cu mai mult
uurin.
Pentru mai multe informaii se recomand citirea API-ului.

C.

Clase i metode abstracte

Forma general a unei clase abstracte este:


[modificator_acces] abstract class NumeClasa{
}

O clas abstract este utilizat pentru modelarea unor concepte abstracte i poate reprezenta
doar clasa de baz n procesul de motenire. Un lucru important de reinut atunci cnd se lucreaz
cu clase abstracte este acela c o clas abstract nu poate fi instaniat.
Alte caracterisitici ale unor clase de acest fel sunt urmtoarele:
pot implementa constructori;
pot avea atribute ce suport modificri;

pot avea metode abstracte. O metod abstract este o metod ce nu are corp (instruciuni) i
care ntr-o clas descendent a clasei abstracte trebuie implementat. Dac metoda declarat
abstract n clasa de baz nu este implementat n subclas, atunci trebuie declarat din nou
abstract. Astfel i subclasa devine una abstract.
pot avea i metode clasice (corpul acestora este implementat n clasa abstract);
dei clasele abstracte nu pot fi instaniate, se pot declara obiecte de tipul claselor abstracte
i s fie instaniate de clasele derivate.

D.

Interfee

Forma general a unei interfee este:


[modificator_acces] interface NumeInterfata [extends lista_interfete] {
}

O interfa este un fel de clas abstract cu diferena c ntr-o interfa nici o metod declarat
nu are voie s aib corp. Interfeele sunt utilizate pentru a separa implementarea de definiia
metodelor.
Spre deosebire de o clas abstract, o interfa nu poate defini un constructor, iar atributele
existente sunt implicit declarate ca fiind statice i finale, acestea devenind constante. Iar spre
deosebire de o clas obinuit, o interfa poate moteni mai multe interfee (intervine ideea de
motenire multipl).
Forma general a unei clase care motenete o interfa sau o list de interfee este:
[modificator_acces] class NumeClasa [extends NumeSuperclasa] implements lista_interfete{
}

De aici se poate trage concluzia c o clas poate implementa una sau mai multe interfee.
De asemenea, se pstreaz regula de la clasele abstracte cum c o clas care motenete o
interfa trebuie s i implementeze toate metodele. Dac acest lucru un se ntmpl, atunci n
clas metodele devin abstracte.

II.

PREZENTAREA LUCRRII DE LABORATOR


A.

Suprascrierea metodelor

Se d clasa Superclasa care conine o singur metod. Clasa Subclasa motenete Superclasa i
suprascrie metoda afiseazaDescriere. Observai semnturile metodelor; sunt identice.
1 public c l a s s
2

Superclasa {

public void a f i s e a z a D e s c r i e r e ( ) {

System . o u t . p r i n t l n ( " a p e l a r e a f i s e a z a D e s c r i e r e d i n s u p e r c l a s a . . . " ) ;

5 }

1 public c l a s s
2

S u b c l a s a extends S u p e r c l a s a {

public void a f i s e a z a D e s c r i e r e ( ) {

// a p e l a r e

// s u p e r . a f i s e a z a D e s c r i e r e ( ) ;

e x p l i c i t a a metodei din

c l a s a de baza

System . o u t . p r i n t l n ( " a p e l a r e a f i s e a z a D e s c r i e r e d i n s u b c l a s a . . . " ) ;

7 }

n clasa descendent, n metoda suprascris se poate apela metoda original (din clasa de baz)
folosind cuvntul cheie super. Decomentai linia de cod numrul 4 din Subclasa i observai ce se
afieaz la urmtoarea rulare.
1 public c l a s s
2

TestSuprascriere {

public s t a t i c void main ( S t r i n g [ ]

args ){

Superclasa

s u p e r C l a s a = new S u p e r c l a s a ( ) ;

S u b c l a s a s u b C l a s a = new S u b c l a s a ( ) ;

superClasa . a f i s e a z a D e s c r i e r e () ;

subClasa . a f i s e a z a D e s c r i e r e ( ) ;

superClasa = subClasa ;

System . o u t . p r i n t l n ( ) ;

System . o u t . p r i n t l n ( ) ;

superClasa . a f i s e a z a D e s c r i e r e () ;

10 }

B.

Clasa Object

Clasa Point are dou atribute de tipul double i suprascrie metodele clone, equals, hashCode i
toString ale clasei Object. Observai n linia de cod 1 cuvintele implements Cloneable. Orice clas
care extinde clasa Object i care i suprascrie metodele trebuie s implementeze interfaa Cloneable.
Despre interfee se discut pe larg n seciunile I D i II D.
Pentru a respecta proprietile metodei hasCode, de a returna un numr ntreg care s diferenieze dou obiecte diferite, se implementeaz un algoritm care produce un astfel de numr. n
5

exemplul prezentat (linia de cod 30), algoritmul const n nmulirea cu un numr prim i nsumarea membrilor obiectului. Cu ct algoritmul matematic este mai complex cu att regulile hashCode
sunt respectate n mai multe cazuri.
1 public c l a s s
2

P o i n t implements C l o n e a b l e {

p r i v a t e double x , y ;

3
4

public void s e t X ( double x ) {

5
6

this . x = x ;
}

7
8

public void s e t Y ( double y ) {

9
10

this . y = y ;
}

11
12

protected P o i n t

clone () {

13

P o i n t pObj = new P o i n t ( ) ;

14

pObj . x = t h i s . x ;

15

pObj . y = t h i s . y ;

16
17

return pObj ;

// o b i e c t u l pObj a r e membrii

identici

cu

cei

ai

obiectului

curent

18
19

public boolean e q u a l s ( O b j e c t o b j ) {

20

if

21

( o b j == t h i s )
return true ;

22

if

23

// r e f e r i n t e

return f a l s e ;

// o b j nu e s t e de

24

Point p = ( Point ) obj ;

25

if

26

28

( t h i s . x != p . x
return f a l s e ;

27

egale

( ! ( obj instanceof Point ) )

||

// s e

tipul

Point

f a c e un d o w n c a s t i n g ,

adica

obj

este

convertit

la

tipul

Point

t h i s . y != p . y )

// c o o r d o n a t a x s a u y e s t e

diferita

return true ;
}

29
30

public i n t hashCode ( ) {

31

double r e s u l t = 1 7 ;

32

r e s u l t = 37 r e s u l t + t h i s . x ;

33

r e s u l t = 37 r e s u l t + t h i s . y ;

34

return ( i n t ) r e s u l t ; / s e

35

de t i p

36

double ,

f a c e un c a s t
iar

la

tipul

int ,

intrucat

variabila

f u n t i a hashCode r e t u r n e a z a o v a l o a r e de t i p

result

e s t e una

i n t /

37
38

public S t r i n g

39
40

toString (){

return " x= "+x+" ; y= "+y ;


}

41 }

Clasa TestObject creeaz un obiect de tipul Point, i seteaz proprietile i i apeleaz metodele.
1 public c l a s s
2

TestObject {

public s t a t i c void main ( S t r i n g [ ]

P o i n t p1 = new P o i n t ( ) ;

p1 . s e t X ( 3 ) ;

p1 . s e t Y ( 4 ) ;

args ){

P o i n t p1Clone = p1 . c l o n e ( ) ;

System . o u t . p r i n t l n ( " P1 : "+p1 . t o S t r i n g ( ) ) ;

System . o u t . p r i n t l n ( " Clona l u i P1 : "+p1Clone . t o S t r i n g ( ) ) ;

if

( p1 . e q u a l s ( p1Clone ) )

10

System . o u t . p r i n t l n ( " O b i e c t e l e s u n t i d e n t i c e ! " ) ;

11

e l s e System . o u t . p r i n t l n ( " O b i e c t e l e nu s u n t i d e n t i c e ! " ) ;

12

System . o u t . p r i n t l n ( " Hashcodeu l l u i P1 e s t e : "+p1 . hashCode ( ) ) ;

13

System . o u t . p r i n t l n ( " Hashcodeu l c l o n e i l u i P1 e s t e : "+p1Clone . hashCode ( ) ) ;

14

15 }

C.

Clase i metode abstracte

Pentru a exemplifica utilizarea claselor i metodelor abstracte vom folosi clasa Produs. S presupunem c vrem s derivm un numr mai mare de clase din Produs: Carte, RamaFoto, etc. Se
observ c acestea au n comun preul, o descriere i eventual o reducere a preului n funcie de
anumite proprieti ale fiecrui produs n parte.
n acest caz, obiecte de genul Carte sau RamaFoto trebuie s fac parte din clase care motenesc
o superclas comun, Produs. Mai mult, ar trebui ca Produs s implementeze metodele afiseazaDescriere i calculeazaReducere. Pentru c implementarea metodelor depinde de tipul obiectului i
proprietilor acestuia, metodele se declar abstracte n clasa Produs.
1 public a b s t r a c t c l a s s Produs {
2

p r i v a t e double p r e t U n i t a r ;

3
4

Produs ( double p r e t U n i t a r ) {

this . pretUnitar = pretUnitar ;

7
8

public double g e t P r e t U n i t a r ( ) {

return p r e t U n i t a r ;

10

11
12

// m e t o d e l e

13

// e l e

14

public a b s t r a c t void a f i s e a z a D e s c r i e r e ( ) ;

15

public a b s t r a c t double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) ;

vor

a b s t r a c t e nu au c o r p
fi

implementate in

clasele

copil

ale

clasei

Produs

16 }

Clasa Carte extinde clasa Produs i implementeaz metodele abstracte ale acesteia n modul ei
propriu. La fel se ntmpl i pentru clasa RamaFoto.
1 public c l a s s C a r t e extends Produs {
2

private S t r i n g

titlu ,

autor ;

3
4

public C a r t e ( double p r e t U n i t a r ,

super ( p r e t U n i t a r ) ;

this . t i t l u = t i t l u ;

7
8

String

titlu ,

String

this . autor = autor ;


}

autor ) {

10

// metoda a f i s e a z a D e s c r i e r e

11

public void a f i s e a z a D e s c r i e r e ( ) {

12

este

implementata i n

sublclasa

System . o u t . p r i n t l n ( " T i t l u c a r t i i e s t e : "+t h i s . t i t l u +" , i a r a u t o r u l e s t e : "+t h i s . a u t o r ) ;

13

14
15

// metoda c a l c u l e a z a R e d u c e r e

16

public double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) {

este

implementata i n

sublclasa

17

System . o u t . p r i n t l n ( " C a l c u l e a z a r e d u c e r e d i n C a r t e . . . " ) ;

18

return

19

0.0;

20 }

1 public c l a s s RamaFoto extends Produs {


2

private int lungime ,

latime ;

3
4

public RamaFoto ( double p r e t U n i t a r ,

super ( p r e t U n i t a r ) ;

this . lungime = lungime ;

int lungime ,

int

latime ) {

this . latime = latime ;

9
10

// metoda a f i s e a z a D e s c r i e r e

11

public void a f i s e a z a D e s c r i e r e ( ) {

12

este

implementata i n

sublclasa

System . o u t . p r i n t l n ( " Lungimea r a m e i e s t e : "+t h i s . l u n g i m e+" , i a r l a t i m e a e s t e : "+t h i s . l a t i m e ) ;

13

14
15

// metoda c a l c u l e a z a R e d u c e r e

16

public double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) {

este

implementata i n

sublclasa

17

System . o u t . p r i n t l n ( " C a l c u l e a z a r e d u c e r e i n RamaFoto i n f u n c t i e de l a t i m e s i l u n g i m e . . . " ) ;

18

return

19

0.0;

20 }

Clasa TestProdus creeaz un vector de obiecte de tipul Produs i calculeaz preul total al
tuturor produselor declarate. Cum un obiect dintr-o clas abstract nu poate fi instaniat cu tipul
clasei abstracte, se instaniaz cu tipul subclaselor, n acest caz Carte i RamaFoto.
1 public c l a s s T e s t P r o d u s {
2

public s t a t i c void main ( S t r i n g [ ]

Produs [ ]

for ( int

if

args ) {

l i s t a P r o d u s e = new Produs [ 4 ] ;
i =0; i <l i s t a P r o d u s e . l e n g t h ;

( i % 2 == 0 ) { // daca

este

i ++){

par a t u n c i

l i s t a P r o d u s e [ i ] = new C a r t e ( 1 2 . 3 ,

} e l s e { // daca

e s t e impar a t u n c i

se

se

c r e e a z a un o b i e c t de

" F u n d a t i a "+i ,

tipul

Carte

" I s a a c Asimov " ) ;

c r e e a z a un o b i e c t de

t i p u l RamaFoto

l i s t a P r o d u s e [ i ] = new RamaFoto ( 5 . 5 , 20 i , 15 i ) ;

10

11

double p r e t T o t a l = 0 . 0 ;

12

for ( int

i =0; i <l i s t a P r o d u s e . l e n g t h ;

i ++){

13

// putem a v e a a c c e s

14

double p r e t P r o d u s O r i g i n a l = l i s t a P r o d u s e [ i ] . g e t P r e t U n i t a r ( ) ;

15

double r e d u c e r e = l i s t a P r o d u s e [ i ] . c a l c u l e a z a R e d u c e r e ( i ) ;

16

p r e t T o t a l += p r e t P r o d u s O r i g i n a l r e d u c e r e ;

17

l a metoda g e t P r e t U n i t a r ( )

pentru ca a c e a s t a

listaProduse [ i ] . afiseazaDescriere () ;

18

19

System . o u t . p r i n t l n ( " P r e t u l t o t a l a l p r o d u s e l o r e s t e : "+p r e t T o t a l ) ;

se

afla

in

clasa

parinte .

20

21 }

D.

Interfee

Avem interfaa IPersoana n care se afl definiia unei metode.


1 public i n t e r f a c e I P e r s o a n a {
2

public S t r i n g

returneazaNumePersoana ( ) ;

3 }

Interfaa IStudent motenete interfaa IPersoana, implicit i metoda unic a acesteia.


1 public i n t e r f a c e
2

I S t u d e n t extends I P e r s o a n a {

public boolean v e r i f i c a S t u d e n t I n t e g r a l i s t ( ) ;

3 }

Clasa Student implementeaz interfaa IStudent, deci implementeaz att metodele acesteia, ct
i pe cele ale interfeei pe care IStudent o motenete.
1 public c l a s s S t u d e n t implements I S t u d e n t {
2

S t r i n g nume ;

double medieNote ;

4
5

public S t u d e n t ( S t r i n g nume , double medieNote ) {

t h i s . nume = nume ;

t h i s . medieNote = medieNote ;

9
10

// s e i m p l e m e n t e a z a metoda d i n I S t u d e n t

11

public boolean v e r i f i c a S t u d e n t I n t e g r a l i s t ( ) {

12

if

13

( t h i s . medieNote >= 5 ) {
return true ;

14

15

return f a l s e ;

16

17
18

// s e i m p l e m e n t e a z a metoda m o s t e n i t a de I S t u d e n t d i n I P e r s o a n a

19

public S t r i n g

20

returneazaNumePersoana ( ) {

return t h i s . nume ;

21

22 }

Clasa TestStudent creeaz un obiect de tipul Student i verific dac studentul este integralist
sau nu, afind un mesaj corespunztor.
1 public c l a s s
2

TestStudent {

public s t a t i c void main ( S t r i n g [ ]

args ) {

S t u d e n t s t u d e n t = new S t u d e n t ( " I o n e s c u Radu " ,

if

5
6

6.3) ;

( student . v e r i f i c a S t u d e n t I n t e g r a l i s t () )
System . o u t . p r i n t l n ( s t u d e n t . r e t u r n e a z a N u m e P e r s o a n a ( )+" e s t e i n t e g r a l i s t " ) ;

else

7
8

System . o u t . p r i n t l n ( s t u d e n t . r e t u r n e a z a N u m e P e r s o a n a ( )+" nu e s t e i n t e g r a l i s t " ) ;


}

9 }

III.

TEM

1. Folosind conceptul de clase i metode abstracte creai o aplicaie care calculeaz pentru un
cub i pentru o sfera:
aria totala;
volumul;
centrul de greutate.
Pentru acestea vei avea nevoie de:
cub (reprezentat de 8 puncte);
sfer (reprezentat de 2 puncte: centrul i un punct de pe margine);
punct (reprezentat de cele 3 coordonate n spatiu: x, y i z);
metoda care calculeaz distana dintre 2 puncte aflate n spaiu. Aceasta este necesar
pentru aflarea lungimii unei laturi.

10