În programul din fișierul Referinte.java
se dă un exemplu de situație în care unele obiecte rămân fără referințe.
Dacă, după ce s-a ajuns în situația din Figura 2, se execută
instrucțiunile:
e=b;
a="Sir nou";
c=new String(a);
se ajunge în situația din Figura 3.
- Figura 3 -
S-au făcut, față de situația din Figura 2, următoarele
transformări:
- referinței e i s-a atribuit aceeași valoare ca
referinței b;
- s-a construit un obiect cu conținutul "Șir nou", iar variabila aa
primit ca valoare referința la acest obiect;
- s-a construit un obiect cu același continut ca cel indicat de a,
iar variabila c indică acum acest nou obiect.
În consecință, două din obiectele "un șir" construite initial au rămas
fără referințe. Nu mai există nici o cale în program de a folosi aceste
obiecte, deci ele trebuie să fie eliminate. Acest rol este îndeplinit de colectorul
de reziduuri. Programatorul nu are însă posibilitatea de a decide
în ce moment se va produce eliminarea efectivă a acestor obiecte,
decizia aparținand numai colectorului de reziduuri.
Metoda finalizeÎn clasa Object exista metodaprotected void finalize() throws Throwable Aceasta metodă este invocată de colectorul de reziduuri, atunci când acesta determină că nu mai există referințe către obiectul respectiv. În clasa Object, această metodă nu efectuează nimic. Metoda finalize poate fi redefinită în orice altă clasă, pentru a elibera resurse sau a efectua orice alte acțiuni necesare înainte de distrugerea obiectului respectiv. De exemplu, dacă obiectul respectiv a deschis anumite fișiere sau conexiuni externe, în metoda finalize se poate efectua închiderea lor. Metoda finalize nu este apelată explicit în programul de aplicație. Apelarea metodei finalize se face numai de către colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rămas fără referință, ci abia atinci când acest obiect a "intrat în atenția" colectorului. Este posibil ca executarea aplicației să se incheie înainte ca "finalizarea" unor obiecte să aibă loc. Exemplu |