为断根一个对象,阿谁对象的用户必需在但愿进行断根的地址挪用一个断根体例。这听起来似乎很轻易做到,但饶暌闺C++“破损器”的概念稍有抵触。在C++中,所有对象城市破损。若但愿执行除释放存储空间之外的其他某种形式的断根工作,仍然必需挪用Java中的一个体例。它等价于C++的破损器,只是没后者便利。
! z' i7 d3 }1 f0 @; n1 k* B finalize()最有用处的处所之一是不雅察看垃收受接管集的过程。下面这个例子向巨匠展示了垃收受接管集所履历的过程,并对前面的陈述进行了总结。//: Garbage.java' l3 I" w$ j& K3 ~! g/ [" N% w6 ^+ m
// Demonstration of the garbage
. l K3 i4 M, c0 S9 I // collector and finalizationclass Chair {- n: F2 j, R3 G' m! b
static boolean gcrun = false;$ J$ ?8 ?6 v2 Z
static boolean f = false;
7 Q4 q% u5 A% H8 M- U E! u! M5 Q static int created = 0;% {4 p [ j! A, T8 {7 }
static int finalized = 0;
& @' [4 [1 z) D* L* s- s& L1 _ int i;
7 b1 F( w- s4 q% L Chair() { z; i# w- @+ c0 N+ B, o# {! R
i = ++created;- e1 k4 n# g4 ?, ?4 C0 R+ O k
if(created == 47)# t. | c7 h/ \4 J L6 i
System.out.println("Created 47");) h* B8 e q) k) d. W$ J( ^
}
$ U* s; M. Q' r protected void finalize() {+ Z8 X8 N7 i, Y N
if(!gcrun) {0 B% J0 q2 _, m$ b
gcrun = true;' p6 m0 {5 D" @+ _6 b
System.out.println(' T* ?9 Q5 E# s' ]: P- S" r2 r# ]$ i
"Beginning to finalize after " +
/ c" M( A1 s1 V4 m9 I1 P+ }, W created + " Chairs have been created");
. N& N: e# D) k/ z }
6 `3 P& W4 w1 r+ P+ k3 o+ b8 E if(i == 47) {
& X6 r, L( q' j5 p+ ^% } @( k System.out.println(* ~! c U! c6 b! |8 ?
"Finalizing Chair #47, " +9 ]* m/ ?% m9 ] A
"Setting flag to stop Chair creation");# i( p" L: `8 V
f = true;
1 } P8 \ F7 R2 ]" Z$ g/ [0 N }7 h( B6 J) Z; O' a% W1 @
finalized++;3 m! i# d9 |: G$ g* G8 k) S
if(finalized >= created)
, c; A/ x1 j: l# w+ }* y9 j) f% e System.out.println(
. j- t- f" R4 R0 \! f "All " + finalized + " finalized");
' a9 A3 f% q; J ]1 j6 ]) n+ G: j6 U4 w+ g }
( o v$ _* k8 ^$ D0 Q5 s }public class Garbage {
6 {) ?5 X8 _- k+ Q0 G0 x" M/ O public static void main(String[] args) {) t6 w3 m) t( W! t4 h
if(args.length == 0) {
, T. i* Y" C' }. x% o) l0 J System.err.println("Usage: n" +6 t$ c6 v, m) u
"java Garbage beforenor:n" +
+ a) k) n% T/ I) R "java Garbage after");* R0 {1 Y. I4 C: N5 O! E% v
return;
) ]# U# Z |! R) `2 I }
4 e2 [5 q. l+ C2 |9 n" s while(!Chair.f) {& t# D( Y# T9 b# P; O
new Chair();
5 S0 i* t6 v6 B% j1 f9 q. W ~: u3 ~ new String("To take up space");
$ C l4 Q+ G2 _$ t, K } |