为断根一个对象,阿谁对象的用户必需在但愿进行断根的地址挪用一个断根体例。这听起来似乎很轻易做到,但饶暌闺C++“破损器”的概念稍有抵触。在C++中,所有对象城市破损。若但愿执行除释放存储空间之外的其他某种形式的断根工作,仍然必需挪用Java中的一个体例。它等价于C++的破损器,只是没后者便利。
7 w' z( e4 D! j8 e$ V/ C finalize()最有用处的处所之一是不雅察看垃收受接管集的过程。下面这个例子向巨匠展示了垃收受接管集所履历的过程,并对前面的陈述进行了总结。//: Garbage.java- J% ]. l$ R* |( Z& G; V. U
// Demonstration of the garbage
$ H$ [7 @" u Y' j/ R // collector and finalizationclass Chair {
; Z% q) T, J- [" h/ j static boolean gcrun = false;- l( W8 q. j" f b+ a
static boolean f = false;$ _% r/ H% [! H7 V( I
static int created = 0;
' `; d2 L+ N* c$ G! w3 U static int finalized = 0;
8 z0 c/ G G/ k3 x( U( b+ e- T int i;
: A1 ~: L/ T+ P3 C! k+ N u Chair() {' ^3 I3 Y; Q2 i( r z, X5 {, T
i = ++created;# m$ n. {6 L1 M( E a x" I6 X
if(created == 47)
+ K4 f+ y4 \ k System.out.println("Created 47");6 Y" Y1 ^9 U* L6 \7 L/ d- _
}
- B7 @% C; S0 T t |! z5 U, a. u protected void finalize() {
5 V0 m3 }8 Z6 L O) W" N if(!gcrun) {( t! I k l1 ?8 k4 h$ U, q$ w
gcrun = true;
: @- S3 ~; _+ Z4 ^6 y @ v$ ` System.out.println(2 r, S4 y" I* b( Y" C
"Beginning to finalize after " +
7 k9 g3 t1 v( |) Z/ D2 h( Q created + " Chairs have been created");1 r- u& {% X# Z, k
}
+ h7 I$ x1 C: v+ H/ r if(i == 47) {
3 v- N. `! O# @! @& x& Q+ b4 W System.out.println(
' ^" n4 F+ W3 H& _" R "Finalizing Chair #47, " +8 R" y4 |; V2 b8 D5 r; v
"Setting flag to stop Chair creation");+ J: l# Z4 r- c* u
f = true;4 v9 ~& H! V$ N' p( W# k1 C; ?
}
6 o% Y4 w$ F' X7 F b* U+ U finalized++;
5 q* G! k d4 ~% y if(finalized >= created)7 F' `2 e3 U: i7 Z, t6 P* r
System.out.println(6 E9 a! _ v+ J% o o; }, j% }
"All " + finalized + " finalized");) x. F4 @/ P2 Q! h
}2 z$ a6 E$ c+ f5 p1 f$ m- }
}public class Garbage {
( B8 S; A) Y3 K: W. q public static void main(String[] args) {6 y% y2 R8 _ J
if(args.length == 0) {9 l, |6 I; v% k& `- S
System.err.println("Usage: n" +, G$ w4 W/ z# p9 T2 d; \' r. M9 x
"java Garbage beforenor:n" +
/ ?$ N) r: w* T) G% N4 U6 D( b "java Garbage after");* `) S2 a0 ^- `3 _! t" |+ r
return;
3 Y; q# o5 c8 U2 `8 h! H6 o3 Y. E }
# q# E3 B S& V- I5 h, d- c# G while(!Chair.f) {- [, c5 o( E' w `7 X g
new Chair();
7 {' Q6 c* |. J8 m& | new String("To take up space");% S: W9 u- u! R( _+ z( E% Y% E
}
Q# A5 k' u$ `' O8 f8 h System.out.println(# l* u! P( n: ]
"After all Chairs have been created:n" +4 A# L- d5 K9 \4 K p( I
"total created = " + Chair.created + U( K. C5 @, r
", total finalized = " + Chair.finalized);7 q: I' ~' p _5 ]: g- R% r) U/ W
if(args[0].equals("before")) {
- F" v( P& v5 a. f- T7 I3 ~ System.out.println("gc():");
* ~: ~* w3 y& P4 ^ System.gc();( a0 T, ^ N8 \
System.out.println("runFinalization():");& B; D/ S, C9 f0 G6 H5 c( i) C
System.runFinalization();3 r' a- R+ v. ^6 ^5 ?! {
}
; k+ K9 ~3 S/ Q System.out.println("bye!");( A( f+ }; m- t$ _& m
if(args[0].equals("after"))5 V0 V# y; E. ?4 O
System.runFinalizersOnExit(true); |