Sunteți pe pagina 1din 15

10/6/2014

1
CreareaobiectelorJAVA.Initializarispecifice
Crearea i distrugerea obiectelor
Iniializareacorectavariabileloriobiectelor,precum p
itergereaacestoraatuncicndmisiunealorafost
ndeplinitreprezintdouelementecheiealeunei
implementrisigure.
Programarea orientat obiect acord oatenie
deosebit acestor dou probleme.
n acest sens C++introduceconceptul deconstructor,
implementat subformaunei metode apelate automatla
crearea unui obiect.
JAVAapreluat metoda constructor.
Platforma conine i ungarbagecollector,ce elibereaz
automatresursele dememorie deobiectele ieite dinuz.
2
10/6/2014
2
Metodaconstructor
Determin iniializarea oricrui obiect ce aparine clasei n p
careafost definit
Poart numele clasei
seevit confuzia denume cuoricare altmembru alclasei
compilatorul ova recunoate n vederea apelului automatla
crearea oricrui obiect
Constructorul este primul mesaj trimis unui obiect.
Caorice metod,constructorul:
poate avea sau nuargumente deapel;
acestea permitidentificarea diferitelor instane aleunei clase unice
Nureturneaz nimic i,spre deosebire deometod detip
void,programatorului nui sepermite nici unfel deopiune
pentru ovaloare deieire.
3
Supraincarcarea constructorilor
JAVAatrebuit s soluioneze prin elemente delimbaj
bl i i i li ii bi l i l i problema iniializrii obiectelor unei clase n maniere
diferite,dar folosind unsingur nume deapel pentru
constructor(numele clasei)
Astfel,sadezvoltat conceptul desuprancrcare anumelui
constructorului (overloading).
Implementarea acestuia ducelaapelul,cuacelai
mnemonic(nume)aunor metode diferite
Suprancrcarea permite,n JAVA,crearea n moduri
diferite aobiectelor ce aparin unei clase unice
4
10/6/2014
3
importjava.util.*;
classDispozitiv{
int pozitie;
Dispozitiv()//primametoda constructor
//(nusunt argumente deapel) //( g p )
prt("Achizitie dispozitiv nou");
pozitie=0;}
Dispozitiv(int i){//adoua metoda constructor(exista argumente deapel)
prt("Dispozitiv plasat pe pozitia "+i);pozitie =i;}
voidinfo(){//primadefinitie ametodei info
prt("Dispozitiv nou:ocupa pozitia "+pozitie+"insistem");}
voidinfo(Strings){//adoua definitie ametodei info
prt (s+Sistemul arepozitia "+pozitie+"completata");}
staticvoidprt (Strings){System.out.println(s);}
}}
publicclassConstructor{
publicstaticvoidmain(String[]args){
for(int i=0;i<5;i++){
Dispozitiv d=newDispozitiv (i);
d.info();
d.info("Supraincarcare metoda:");}//supraincarcare metoda
newDispozitiv();}//supraincarcare constructor
}
5
Metodeledetipconstructorimplicit nuauargumente
deapel. p
Dupcumsaobservatncazuldefiniiilormetodei
info(),procesuldesuprancrcarepoatefiaplicati
metodelorobinuite;elpermiterealizareaunoraciuni
diferitesubunnumeunicdeapel.
JAVAdeosebetemetodelesuprancrcateprinlistade
argumentedeapel.Direcionareactreo
implementareanumeserealizeazprinrespectarea
numrului
ordonriicatipaargumentelordeapel.
6
10/6/2014
4
Cuvntulcheiethis
Prin mesaj validsenelege unapel demetod pentru oinstan
specificat aunei clase.
acelai mesaj poate fi transmis mai multor obiecte de acelai tip Pentru fiecare acelai mesaj poate fi transmis mai multor obiecte deacelai tip.Pentru fiecare
dintre acestea,compilatorul va realiza oconexiune intern obiect metod.
n acest momentseridic onou problem:cumsepoate referi un
obiect dininteriorul unei metode ce afost apelat chiar pentru
acel obiect?
Soluia rezid n folosirea cuvntului cheie this;acesta acceseaz
referina obiectului pentru careafost apelat metoda.n acest
contextthis va fi tratat caorice referin launobiect.
Folosirea lui this este permis doar pentru aaccedelaobiectul
pentru caresaapelat metoda;deci this este,undeva,n codul de
definiie almetodei.
Outilizare frecvent alui this este n cazurile n carevaloarea de
retur ametodei este referina obiectului pentru careafost apelat
metoda:
7
Cuvntulcheiethis
publicclassFolosireThis{
privateint i=0;
F l i Thi i (){ FolosireThis increment(){
i++;
returnthis;}
voidprint(){System.out.println("i="+i);}
publicstaticvoidmain(String[]args){
FolosireThis x=newFolosireThis();
x.increment().increment().increment().print();}}
Iesirea:i=3
Deoarece increment() returneaz referina laobiectul curent,se
poate realiza aceeai operaie asupra acestuia demai multe ori.
8
10/6/2014
5
Cuvntulcheiethis
Un caz practic de apel al lui this este atunci cnd se Uncaz practic deapel allui this este atunci cnd se
definesc clase cumai multe metode constructor
Sepoate apela unconstructordininteriorul altuia,
evitnduseastfel duplicarea codului.
Folosirea lui this n interiorul unui constructorsepoate
realiza:
l f i bi l i ( hi f ) pentruacceslareferinaobiectuluicurent(this frargumente);
pentruaapelaunanumitconstructor(this cuargumente;se
apeleazaceametodconstructorpentrucarelistadeargumente
dinthis estevalid):
9
publicclassConstructoriSiThis {
privateint notajava=0;
privateStringnume=newString("null");
ConstructoriSiThis (int nota){
notajava=nota;
System.out.println("constructorcuarg.intreg "+nota);
}
constructorcuarg.intreg 7
constructorcuargumente:intreg
si sir
Constructorimplicit(fara arg.)
constructor cu arg intreg 7
ConstructoriSiThis(Stringsir){
System.out.println("constructorcuargumentul sir"+sir);
nume=sir;
}
ConstructoriSiThis(Stringnume,int sir){
this(sir);
//this(nume); thisnupoate fi apelat de2ori
this.nume=nume; //Oalta maniera deafolosi "this"
System.out.println("constructorcuargumente:intreg si sir");
}
ConstructoriSiThis(){
this("Ionescu" 7);
constructorcuarg.intreg 7
constructorcuargumente:intreg
si sir
Constructorimplicit(fara arg.)
notajava=7nume:Ionescu
this( Ionescu ,7);
System.out.println("Constructorimplicit(fara arg.)");
}
voidprint(){
System.out.println("notajava="+notajava+"nume:"+nume);
}
publicstaticvoidmain(String[]args){
ConstructoriSiThis student=newConstructoriSiThis();
student.print();}}
10
10/6/2014
6
Codul surs scoate n eviden urmatoarele:
atunci cnd se folosete this ntro metod de tip constructor atunci cnd sefolosete this ntr ometod detipconstructor,
apelul su este primul lucru realizat n metod (n caz contrar
apare oeroare decompilare);
nume apare i cadat detipir dinclas i caargumentdetip
ir alunui constructor;thiseste folosit,n acest caz,pentru a
rezolva ambiguitatea (this.nume serefer launmembru al
clasei) clasei).
Observaie: apelul unei metode constructornueste
permis dect numai dintrometod constructorsi
numai osingura data.
11
Iniializareavariabileloruneiclase
nJAVAvariabilelepotfimembriaiuneiclasesauai
uneimetode.
Dacovariabilestedefinitcafiindlocalntro
metod, ea va trebui iniializat, n mod obligatoriu, metod,eavatrebuiiniializat,nmodobligatoriu,
deutilizator.
ncazcontrarvaapreaunmesajdeeroarenfazade
compilare.
12
10/6/2014
7
Dac,ns,aceeaivariabilestemembrualuneiclase,ea
poatefiiniializatsaudoarfolositdeoricemetoddin
respectivaclas.
Deieapoatefiiniializatdeprogramator,nuesteindicats
serealizezeacestprocesnaintedeutilizareaefectiva
acesteia.
Pedealtparte,esteriscantsfielsatovaloareoarecaren
locaiarezervatvariabilei;dinacestmotivJAVAfolosete
iniializareaimplicitpentrutoatetipurileprimitivepe
urmtoarelevalori:
13 14
10/6/2014
8
ObiecteleJavaseiniializeazcuajutorulcuvntului
cheienew:
NonPrimitiva=newNonPrimitiv();
Dacobiectula nuafostiniializatisencearc
ulteriorfolosirealuivaapreaoeroarenfazade
rulare(oexcepie).
Observaie: ncazulapelurilordemetode,argumentele
acestora,dacexist,trebuiesfienumaimembriiniializai
aiclaseicreiaiaparin.
15
Moduldeiniializaredescrispnacumestesimplui
permiteaceeaiiniializarepentrutoateobiectelenou
create ce aparin unei clase createceaparinuneiclase.
Dac,ns,sedoretesporireaflexibilitiiprin
iniializareadiferitpentruobiectedeacelaitip,seva
folosimetodaconstructor.
Aceastanuexcludeiniializareaimplicitce,oricum,se
realizeaznainteaactivitiiconstructorului.
Ordineadeiniializare,ninterioruluneiclase,depinde
deordineancaresuntdefinitevariabilele.nacest
modsegaranteaziniializareanainteaapelului
oricreimetode(inclusivametodeiconstructor):
16
10/6/2014
9
classIndicator{
Indicator(int marker){
System.out.println("Indicator("+marker+")");
}
}
class Cartela { classCartela {
Indicatorind1=newIndicator(1);//inainte deconstructor
Cartela(){
System.out.println("Cartela()");//amintrat inconstructor
ind3=newIndicator(33);//reinitializare ind3
}
Indicatorind2=newIndicator(2); //dupa constructor
voidf(){
System.out.println("metoda f()apelata");
}
Indicator(1)
Indicator(2)
Indicator(1)
Indicator(2)
}
Indicatorind3=newIndicator(3); //lasfarsit
}
publicclassOrdineInitializare {
publicstaticvoidmain(String[]args){
Cartela c=newCartela();
c.f(); //iesirea dinconstructor
}
}
( )
Indicator(3)
Cartela()
Indicator(33)
metoda f()apelata
( )
Indicator(3)
Cartela()
Indicator(33)
metoda f()apelata
17
ndefiniiaclaseiCartela,nmodintenionat
iniializareaobiectelorIndicator estedispersat.Se p
demonstreaz,astfel,ciniializareaesteefectuat
naintedeintrareaconstructoruluisauaoricrei
metodenaciune.
Referinaind3 esteiniializatde2ori,odatnaintei
odatntimpulapeluluiconstructorului.Primulobiect
ind3 varmne,astfel,frreferiniulteriorvafi
tersdectregarbagecollector.
18
10/6/2014
10
Referitorlainiializareadatelor(variabileiobiecte)
statice,aceastaestesimilarcucelenestatice,dac , ,
esteplasatlaloculdedefiniie.Efectuleste,ns,
diferit,deoarecespaiuldememorareestefix
(indiferentdenumruldeobiectecreate):
19
classJucator {
Jucator (int numar){System.out.println("Jucatorul ("+numar+")");}
voidf(int numar){System.out.println("functia("+numar+")");}}
classEchipa {
staticJucator j1=newJucator(1);
Echipa(){System.out.println("Echipa()");j1.f(1);}
id f2 (i t ){S t t i tl ("f ti 2("+ +")") }
Jucatorul (1)
Jucatorul (2)
Echipa()
functia(1)
Jucatorul (4)
voidf2(int numar){System.out.println("functia2("+numar+")");}
staticJucator j2=newJucator(2);}
classClub{
Jucator j3=newJucator(3);
staticJucator j4=newJucator(4);
Club(){System.out.println("Club()");j4.f(2);}
voidf3(int numar){System.out.println("functia 3("+numar+")");}
staticJucator j5=newJucator(5);}
publicclassInitializareStatica {
public static void main (String[] args){
( )
Jucatorul (5)
Jucatorul (3)
Club()
functia(2)
Creare new
Echipa()inmain
Echipa()
functia(1)
publicstaticvoidmain(String[]args){
System.out.println("Creare newEchipa()inmain");
newEchipa();
System.out.println("Creare newEchipa()inmain");
newEchipa();
e2.f2(1);
c3.f3(1);}
staticEchipa e2=newEchipa();
staticClubc3=newClub();}
functia(1)
Creare new
Echipa()inmain
Echipa()
functia(1)
functia2(1)
functia 3(1)
20
10/6/2014
11
Dinieirea programului seobserv c iniializarea static
este efectuat doar atunci cnd este necesar.
Astfel dac nu se creaz un obiect de tip Echipa i Astfel,dac nusecreaz unobiect detipEchipa i
niciodat nusefac referiri detipul Echipa.j1 sau Echipa.j2,
obiectele statice j1 i j2 nuvor fi create.
Dac,ns,sunt create,acest proces arelocosingur dat
(laprimacreare deobiect detipEchipa sau laprimul acces
laobiectul static)
Ulterior,unobiect staticnumai este reiniializat
ntrunproces deiniializare JAVAserespect urmtoarea
ordine:
1. obiectelestatice(dacnuaufostiniializatentrunproces
anteriordecrearedeobiect)
2. obiectelenestatice
21
Iniializareamasivelordedate
Un masiv este o secven de date de tip primitiv sau de Unmasiv este osecven dedatedetipprimitiv sau de
obiecte,deacelai tipi reunitesubunidentificator unic.
Operatorul deindexare ntrunmasiv este [ ],numrul
su deapariii fiind egal cudimensiunea masivului (int
a[ ] este unmasiv unidimensional,n timp ce int b[ ][ ]
este bidimensional).
f f Pentru adefini unmasiv este suficient precizarea
tipului,numelui i aoperatorului deindexare (exemplu:
int[ ]a1;sau int a1[ ];).
Observatie: Primul tipsintactic este mai sugestiv,elindicnd un
masiv dentregi denumit a1.
22
10/6/2014
12
nmomentuldefiniriiunuimasiv,compilatorulnusolicit
specificareadimensiuniiacestuia secreazdoaro
referinlamasivinusealocmemorie.
Dei la prima vedere par lipsite de sens instruciunile de Deilaprimavedereparlipsitedesens,instruciunilede
definireamasivelorncarenuserealizeaziniializarea,
permitoserientreagdeatribuiricenuimplicdect
manipularedereferine.
Rezervareazoneidestocareamasivuluiserealizeaz
printroexpresiedeiniializareplasat,nprincipiu,
oriundencodulsurs.
Iniializareasimultancudefinireaesteefectuatprin
precizarea,ntreacolade,aunuisetdevalori:
int[]masiv1={1,2,3,4,5};
23
publicclassMasive{
a1[0]=2
a1[1]=3
a1[2]=4
publicstaticvoidmain(String[]args){
int[]a1={1,2,3,4,5};
int[]a2;
a2=a1;
for(inti=0;i<a2.length;i++)a2[i]++;
a1[2]=4
a1[3]=5
a1[4]=6
for(inti=0;i<a1.length;i++)prt("a1["+i+"]="+a1[i]);}
staticvoidprt(Strings){System.out.println(s);}
}
24
10/6/2014
13
Masiveledeprimitivesauobiecteauunmembru
intrinsec(nupoatefimodificatdeprogramator),ce
cuantific numrul de elemente din masiv: length cuantificnumruldeelementedinmasiv:length.
ContorizareaelementelornJAVA(cainCiC++)
ncepecupoziia0 i,inevitabil,mergepnlalength1.
Depireaacestorlimitegenereazoexcepie(eroaren
fazaderulare).
Atuncicndelementeleunuimasivsuntdetipneprimitiv
(obiecte)iniializareaserealizeazntotdeaunacu
ajutorulcuvntuluicheienew;rezultatulvafigenerarea
unuimasivdereferine:
25
importjava.util.*;
publicclassMasiveObiecte{
staticRandomaleator=newRandom();
static int pRand(int mod){
numaruldeelemente
al masivului a=10
staticintpRand(intmod){
returnMath.abs(aleator.nextInt())%mod;}
publicstaticvoidmain(String[]args){
Integer[]a=newInteger[pRand(20)];
prt("numaruldeelementealmasivuluia="+a.length);
for(inti=0;i<a.length;i++){
a[i]=newInteger(pRand(500));
prt("a["+i+"]="+a[i]);}
almasivuluia 10
a[0]=103
a[1]=259
a[2]=42
a[3]=17
a[4]=407
a[5]=68
prt( a[ +i+ ]= +a[i]);}
}
staticvoidprt(Strings){System.out.println(s);}
}
a[6]=228
a[7]=419
a[8]=324
a[9]=343
26
10/6/2014
14
Primulapelcunew:
Integer[ ] a=new Integer[pRand(20)]; Integer[]a newInteger[pRand(20)];
creazdoarunmasivdereferine.
Obiectelemasivuluisuntcreateprintronou
instruciunedeiniializare:
a[i]=newInteger(pRand(500));
Dacseignorfazadeiniializare,tentativadeaciti
coninutulunorlocaiigoalevageneraoexcepie,n
fazaderulare.
27
Iniializareaobiectelormaipoatefirealizaticu
ajutorulseturilordevaloricuprinsentre{} i j p {}
separatecu, :
Integer[]b=newInteger[]{
newInteger(1),
newInteger(2),
newInteger(3), g ( ),
};
Acesttipdeiniializarepoatefirealizatipentru
masivelecunumrnecunoscutdeobiecte,eventual
detipnecunoscut
28
10/6/2014
15
Observaie: JAVAextindeadecvatdefiniiamasivelor
unidimensionalepentrumasivelemultidimensionale.
Deexemplu,omatricepoatefidefinitprinurmtoarea
instruciune:
int[][]matrice={{1,2,3},{4,5,6}};
29
SUMAR CURS 1: SUMARCURS1:
Metodaconstructor
Cuvantulcheiethis
Initializarivariabile(nestaticesistatice)in
interioruluneiclase
Initializareamasivelordedate
30

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