Sunteți pe pagina 1din 47

Zoltan Hascsi

Programare orientat pe obiecte - J ava


cursul 6
Constructori
Programare Orientat pe Obiecte cursul 6 2 Zoltan Hascsi
Rolul constructorilor
Constructorii construiesc obiectele.
Constructorul este folosit numai la crearea unui obiect.
Este locul recomandat al iniializrilor.
Permite iniializarea personalizat a obiectelor.
Programare Orientat pe Obiecte cursul 6 3 Zoltan Hascsi
Instaniere i construcie
Constructorul este folosit numai la crearea unui obiect:
new Student( ) ;
Instanierea unui obiect presupune "construirea" lui.
Operatorul de instaniere, new, aloc memorie pentru
obiect i iniializeaz toate cmpurile obiectului cu
valorile implicite i, dac este cazul, cu cele specificate
n declaraiile cmpurilor i blocurile de iniializare.
Se execut apoi constructorul specificat care poate face
iniializri suplimentare sau personalizate.
constructor
operatorul
de instaniere
Programare Orientat pe Obiecte cursul 6 4 Zoltan Hascsi
Instaniere i construcie
Orice instaniere cu new are ataat un constructor:
new Student( ) ;
Pentru a putea aloca memoria necesar crerii unui
obiect operatorul new trebuie s cunoasc tipul acestuia,
de aceea orice constructor are numele identic cu al
clasei obiectului pe care l construiete.
Constructorul are astfel i rol de a declara la instaniere
clasa obiectului ce urmeaz a fi creat.
constructor
operatorul
de instaniere
Programare Orientat pe Obiecte cursul 6 5 Zoltan Hascsi
Instaniere i construcie
Orice instaniere cu new are ataat un constructor:
new Student[ 3] ;
Fornd puin imaginaia am putea spune c este valabil
i pentru instanierea tablourilor:
"Constructorul"

unui tablou are ca argument lungimea


acestuia, n lipsa cruia nu se poate aloca memoria
necesar (motiv pentru care specificarea lungimii este
obligatorie).
Mai multe despre instanierea tablourilor n cursul 5.
"constructor"
de tablou
operatorul
de instaniere
Clasele tablourilor nu au constructori.
Programare Orientat pe Obiecte cursul 6 6 Zoltan Hascsi
Declararea constructorului
Un constructor are (obligatoriu) numele clasei.
Exemplu de constructor pentru clasa St udent :
St udent ( ) {
/ *cor pul const r uct or ul ui */
}
Programare Orientat pe Obiecte cursul 6 7 Zoltan Hascsi
Declararea constructorului
Un constructor are (obligatoriu) numele clasei.
Nu are tip returnat specificat, nici mcar void.
Exemplu de constructor pentru clasa St udent :
St udent ( ) {
/ *cor pul const r uct or ul ui */
}
Programare Orientat pe Obiecte cursul 6 8 Zoltan Hascsi
Declararea constructorului
Un constructor are (obligatoriu) numele clasei.
Nu are tip returnat specificat, nici mcar void.
Poate avea argumente.
Exemplu de constructor pentru clasa St udent :
St udent ( String st r , int nr ) {
/ *cor pul const r uct or ul ui */
}
Programare Orientat pe Obiecte cursul 6 9 Zoltan Hascsi
Declararea constructorului
Un constructor are (obligatoriu) numele clasei.
Nu are tip returnat specificat, nici mcar void.
Poate avea argumente.
Poate avea un modificator de acces.
Exemplu de constructor pentru clasa St udent :
public St udent ( String st r , int nr ) {
/ *cor pul const r uct or ul ui */
}
Programare Orientat pe Obiecte cursul 6 10 Zoltan Hascsi
Declararea constructorului
Un constructor are (obligatoriu) numele clasei.
Nu are tip returnat specificat, nici mcar void.
Poate avea argumente.
Poate avea un modificator de acces.
Nu poate avea ali modificatori (static, final, etc).
Exemplu de constructor pentru clasa St udent :
final public St udent ( String st r , int nr ) {
/ *cor pul const r uct or ul ui */
}
Programare Orientat pe Obiecte cursul 6 11 Zoltan Hascsi
Implementarea constructorului
Exemplu:
class St udent {
int nr _cr edi t e;
CarnetNote car net ;
St udent ( ) {
}
}
Programare Orientat pe Obiecte cursul 6 12 Zoltan Hascsi
Implementarea constructorului
Nicieri nu apare return n corpul constructorului.
Exemplu:
class St udent {
int nr _cr edi t e;
CarnetNote car net ;
St udent ( ) {
}
}
Programare Orientat pe Obiecte cursul 6 13 Zoltan Hascsi
Implementarea constructorului
Nicieri nu apare return n corpul constructorului.
Poate folosi orice cmp de tip primar al clasei.
Exemplu:
class St udent {
int nr _cr edi t e;
CarnetNote car net ;
St udent ( ) {
nr _cr edi t e = 60;
}
}
Programare Orientat pe Obiecte cursul 6 14 Zoltan Hascsi
Implementarea constructorului
Nicieri nu apare return n corpul constructorului.
Poate folosi orice cmp de tip primar al clasei.
Poate folosi cmpurile de tip referin
Exemplu:
class St udent {
int nr _cr edi t e;
CarnetNote car net ;
St udent ( ) {
nr _cr edi t e = 60;
car net . n_POO = 10;
}
}
OOPS!
referin
nul
Programare Orientat pe Obiecte cursul 6 15 Zoltan Hascsi
Implementarea constructorului
Nicieri nu apare return n corpul constructorului.
Poate folosi orice cmp de tip primar al clasei.
Poate folosi cmpurile de tip referin numai dac au fost
iniializate anterior.
Exemplu:
class St udent {
int nr _cr edi t e;
CarnetNote car net ;
St udent ( ) {
nr _cr edi t e = 60;
car net = new Car net Not e( ) ;
car net . n_POO = 10;
}
}
Programare Orientat pe Obiecte cursul 6 16 Zoltan Hascsi
Constructorul implicit
Nu are argumente.
Nu face nimic

.
Folosit atunci cnd clasa nu are declarat niciun
constructor.
Dac am avea o clas St udent fr constructor,
instanierea unui obiect de acest tip s-ar face ca i cum
am folosi un constructor fr argumente:
new Student( ) ;
constructor
implicit
Face totui ceva: apeleaz constructorul implicit al clasei de baz.
Programare Orientat pe Obiecte cursul 6 17 Zoltan Hascsi
Constructorul implicit
Putem fi mulumii cu constructorul implicit dac ne sunt
suficiente iniializrile din declaraiile cmpurilor clasei
sau din blocurile de iniializare din implementarea clasei.
Ne putem baza pe constructorul implicit numai dac
superclasa clasei obiectului construit are la rndul ei un
constructor implicit sau are implementat un constructor
fr argumente.
Programare Orientat pe Obiecte cursul 6 18 Zoltan Hascsi
Constructorul fr argumente
Are sens s-l scriem doar dac dorim iniializri diferite
de cele implicite i nu vrem s le facem n declaraiile de
cmpuri sau n blocuri de iniializare.
La instaniere cele dou variante ale clasei St udent se
comport identic:
class St udent {
int nr _cr edi t e;
String nume;
St udent ( ) {
nume = "Popescu" ;
nr _cr edi t e = 60;
}
}
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = "Popescu" ; }
}
Clas fr constructor declarat.
La instaniere se folosete
constructorul implicit
Programare Orientat pe Obiecte cursul 6 19 Zoltan Hascsi
Iniializri comune
Iniializrile din declaraiile cmpurilor sau din blocurile
de iniializare sunt generale, aceleai pentru orice
instaniere.
Exemplu:
class St udent {
int nr _cr edi t e = 60; / / i ni i al i zar e l a decl ar ai e
String nume;
{nume = " Popescu" ; } / / bl oc de i ni i al i zar e
}
La fiecare instaniere a unui obiect de tipul St udent se vor
face aceleai iniializri pentru cmpurile acestuia, cele
prescrise n declaraia clasei.
Programare Orientat pe Obiecte cursul 6 20 Zoltan Hascsi
Iniializri comune
Toate obiectele St udent vor avea dup instaniere
acelai numr de credite (aceeai valoare pentru
nr _cr edi t e) i acelai nume:
Student st udent _1 = new Student( ) ;
Student st udent _2 = new Student( ) ;


st udent _1
Popescu
60
st udent _2
Popescu
60
Programare Orientat pe Obiecte cursul 6 21 Zoltan Hascsi
Iniializri personalizate
Se fac n corpul constructorilor.

Valorile dorite pentru iniializarea cmpurilor obiectului


se pot da la instaniere ca argumente ale constructorului.
Pentru aceasta este nevoie de implementarea unui
constructor cu argumente.
Dac adugm clasei St udent anterioare constructorul:
St udent ( String st r , int nr ) {
nume = st r ; nr _cr edi t e = nr ;
}
cmpurile nume i nr _cr edi t e ale unui obiect din clasa
St udent vor primi la instaniere valorile argumentelor
constructorului.
Se pot face iniializri personalizate i n declaraiile cmpurilor de instan atribuindu-le valori ale cmpurilor statice.
Programare Orientat pe Obiecte cursul 6 22 Zoltan Hascsi
Iniializri personalizate
Fiecare obiect St udent nou creat va avea la iniializare
valori diferite ale cmpurilor membre:
Student st udent _1 = new Student( " Popescu" , 60) ;
Student st udent _2 = new Student( " I onescu" , 66) ;


st udent _1
Popescu
60
st udent _2
I onescu
66
Programare Orientat pe Obiecte cursul 6 23 Zoltan Hascsi
Iniializri generale sau personalizate?
class St udent {
int nr _cr edi t e;
String nume;
St udent ( String st r , int nr ) {
nume = st r ;
nr _cr edi t e = nr ;
}
}
iniializri personalizate
(constructor cu argumente):
Student st 1, st 2;
st 1 = new Student( " Popescu" , 60) ;
st 2 = new Student( " I onescu" , 66) ;
class St udent {
/ / i ni i al i zar e l a decl ar ai e
int nr _cr edi t e = 60;
String nume;
/ / bl oc de i ni i al i zar e
{nume = " Popescu" ; }
}
iniializri generale
(constructor implicit):
Student st 1, st 2;
st 1 = new Student( ) ;
st 2 = new Student( ) ;
Programare Orientat pe Obiecte cursul 6 24 Zoltan Hascsi
Iniializri generale sau personalizate?
class St udent {
int nr _cr edi t e;
String nume;
St udent ( String st r , int nr ) {
nume = st r ;
nr _cr edi t e = nr ;
}
}
iniializri personalizate
(constructor cu argumente):
Student st 1, st 2;
st 1 = new Student( " Popescu" , 60) ;
st 2 = new Student( " I onescu" , 66) ;
class St udent {
int nr _cr edi t e;
String nume;
St udent ( ) {
nume = " Popescu" ;
nr _cr edi t e = 60;
}
}
iniializri generale
(constructor fr argumente):
Student st 1, st 2;
st 1 = new Student( ) ;
st 2 = new Student( ) ;
Programare Orientat pe Obiecte cursul 6 25 Zoltan Hascsi
Constructor cu argumente
Sintax:
NumeClas( Tip1 arg1, Tip2 arg2, . . . ) {
/ / i mpl ement ar e
}
Exemple:
St udent ( String st r ) {
nume = st r ; / / i ni t i al i zar ea numel ui
}
St udent ( String st r , int nr ) {
nume = st r ; / / i ni t i al i zar ea numel ui
nr _cr edi t e = nr ; / / i ni t i al i zar ea cr edi t el or
}
Programare Orientat pe Obiecte cursul 6 26 Zoltan Hascsi
Constructor cu argumente
Sintax:
NumeClas( Tip1 arg1, Tip2 arg2, . . . ) {
/ / i mpl ement ar e
}
Semntura constructorului (subliniat mai sus) este dat
de numele lui i de lista ordonat a tipurilor
argumentelor.
Exemplele anterioare au semnturile:
St udent ( String)
respectiv
St udent ( String, int)
Programare Orientat pe Obiecte cursul 6 27 Zoltan Hascsi
Suprancrcarea
overloading = suprancrcare
Un constructor este suprancrcat dac sunt definite mai
multe variante.
Mai muli constructori = mai multe posibiliti de
instaniere.
O clas poate avea orici constructori.
Toi constructorii au acelai nume.
Variantele constructorului difer prin numrul i/sau tipul
argumentelor.
Programare Orientat pe Obiecte cursul 6 28 Zoltan Hascsi
Suprancrcarea
Alegerea constructorului la instaniere se face dup
semntur.
Exemple
Student st 1, st 2;
st 1 = new Student( 60, " Popescu" ) ;
st 2 = new Student( ) ;
n primul caz J VM va alege constructorul cu dou
argumente, n al doilea, constructorul fr argumente.
Dac o clasa are (cel puin) un constructor cu
argumente, ca n acest exemplu, instanierea fr
argumente este permis numai dac este implementat
constructorul fr argumente. Compilatorul va semnala
eroare dac nu-l gsete.
Programare Orientat pe Obiecte cursul 6 29 Zoltan Hascsi
Ordinea argumentelor
Ordinea tipurilor argumentelor conteaz. Dac avem un
constructor cu dou argumente de acelai tip, s zicem
Car net Not e( int not a1, int not a2) , nu este permis
declararea unui constructor cu aceleai argumente n
alt ordine, Car net Not e( int not a2, int not a1) , cci
semntura ar fi tot Car net Not e( int, int) .
n schimb semnturile St udent ( String, int) i
St udent ( int, String) , fiind diferite, definesc doi
constructori diferii pentru clasa St udent , de exemplu:
St udent ( String st r , int nr )
{nume = st r ; nr _cr edi t e = nr ; }
St udent ( int nr , String st r )
{nume = st r ; nr _cr edi t e = nr + 60; }
Programare Orientat pe Obiecte cursul 6 30 Zoltan Hascsi
Ordinea argumentelor
n aceast ultim situaie la instaniere vom avea obiecte
iniializate diferit dac folosim aceleai argumente dar n
ordine invers:
Student st udent _1 = new Student( " Popescu" , 60) ;
Student st udent _2 = new Student( 60, " I onescu" ) ;


st udent _1
Popescu
60
st udent _2
I onescu
120
se apeleaz constructorul cu
semntura St udent ( int, String)
se apeleaz constructorul cu
semntura St udent ( String, int)
Programare Orientat pe Obiecte cursul 6 31 Zoltan Hascsi
nlnuirea constructorilor
La instanierea unui obiect un singur constructor este
ataat operatorului new. Totui, un constructor poate
apela alt constructor.
Mai muli constructori pot conine aceeai secven de
instruciuni. Are sens atunci reutilizarea codului unui
constructor de ctre un alt constructor.
Constructorii mai generali pot apela constructorii cu mai
multe argumente.
Nu este permis apelul unui constructor din corpul
aceluiai constructor. Regresie infinit.
Nu este permis apelul constructorului apelant din corpul
apelatului. Bucle infinite.
Programare Orientat pe Obiecte cursul 6 32 Zoltan Hascsi
nlnuirea constructorilor
Nu este permis apelul unui constructor din corpul
aceluiai constructor (regresie infinit).
Nu este permis apelul constructorului apelant din corpul
apelatului (bucle infinite).
Un constructor poate apela un singur constructor.
Apelul unui constructor, dac se face, este prima
instruciune din corpul constructorului apelant:
St udent ( int nr ) {
if( nr > 60)
this( "Popescu" , nr ) ;
}
St udent ( int nr ) {
this( "Popescu", nr ) ;
i f ( nr < 60)
nr = 0;
}
Programare Orientat pe Obiecte cursul 6 33 Zoltan Hascsi
nlnuirea constructorilor
Permite reutilizarea i compactarea codului:
class St udent {
int nr _cr edi t e;
String nume;
St udent ( ) {
nume = "Popescu" ;
nr _cr edi t e = 60;
}
St udent ( String st r , int nr ) {
nume = st r ;
nr _cr edi t e = i nt ;
}
}
class
int
String
St udent ( ) {
}
St udent (
}
}
St udent {
nr _cr edi t e;
nume;
this( "Popescu", 60) ;
String st r , int nr ) {
nume = st r ;
nr _cr edi t e = i nt ;
Programare Orientat pe Obiecte cursul 6 34 Zoltan Hascsi
nlnuirea constructorilor
folosete apelul unui constructor prin this(...).
class St udent {
int nr _cr edi t e;
String nume;
St udent ( ) {
this( "Popescu", 60) ;
}
St udent ( String st r , int nr ) {
nume = st r ;
nr _cr edi t e = i nt ;
}
}
this = aceasta, aceast
clas.
this n combinaie cu o
lista de argumente (care
poate fi vid) reprezint
un apel de constructor din
aceeai clas.
Este apelat constructorul
ai crui parametri coincid
cu tipurile argumentelor
din lista ataat de this .
Programare Orientat pe Obiecte cursul 6 35 Zoltan Hascsi
nlnuirea constructorilor
Exemple:
this( " Popescu" , 60) ;
this( ) ;
Instruciunea this( ) apeleaz constructorul fr
argumente, dac este implementat bineneles. n niciun
caz nu se poate apela constructorul implicit
(Implementarea oricrui constructor duce la anularea
constructorului implicit).
Programare Orientat pe Obiecte cursul 6 36 Zoltan Hascsi
nlnuirea constructorilor
ntruct apelul unui constructor este obligatoriu prima
instruciune din corpul constructorului apelant,
constructorul apelat va fi executat naintea
constructorului apelant.
Altfel spus iniializrile constructorului apelat sunt
executate naintea oricrei iniializri din constructorul
apelant.
Programare Orientat pe Obiecte cursul 6 37 Zoltan Hascsi
Instaniere: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre

Programare Orientat pe Obiecte cursul 6 38 Zoltan Hascsi
Instaniere: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite

Programare Orientat pe Obiecte cursul 6 39 Zoltan Hascsi
Instaniere: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii

Programare Orientat pe Obiecte cursul 6 40 Zoltan Hascsi
Instaniere: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare

Programare Orientat pe Obiecte cursul 6 41 Zoltan Hascsi
Instaniere: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului

Programare Orientat pe Obiecte cursul 6 42 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

new St udent ( 66)
Programare Orientat pe Obiecte cursul 6 43 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

s$#x5r e
- 19
new St udent ( 66)
Programare Orientat pe Obiecte cursul 6 44 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

null
0
new St udent ( 66)
Programare Orientat pe Obiecte cursul 6 45 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

nul l
60
new St udent ( 66)
Programare Orientat pe Obiecte cursul 6 46 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

Popescu
60
new St udent ( 66)
Programare Orientat pe Obiecte cursul 6 47 Zoltan Hascsi
Exemplu: ordinea iniializrilor
alocarea spaiului de memorie pentru cmpurile membre
iniializri implicite
iniilizri din declaraii
blocuri de iniilizare
execuia instruciunilor din corpul constructorului
class St udent {
int nr _cr edi t e = 60;
String nume;
{nume = " Popescu" ; }
St udent ( int nr ) {
nr _cr edi t e = nr _cr edi t e + nr ;
}
}

Popescu
126
new St udent ( 66)