Java不具備象C++的
垃圾收集器大多數時候都能很好地工作
下面介紹的是一個計算機輔助設計系統的例子
//: CADSystem
// Ensuring proper cleanup
import java
class Shape {
Shape(int i) {
System
}
void cleanup() {
System
}
}
class Circle extends Shape {
Circle(int i) {
super(i);
System
}
void cleanup() {
System
super
}
}
class Triangle extends Shape {
Triangle(int i) {
super(i);
System
}
void cleanup() {
System
super
}
}
class Line extends Shape {
private int start
Line(int start
super(start);
this
this
System
start +
}
void cleanup() {
System
start +
super
}
}
public class CADSystem extends Shape {
private Circle c;
private Triangle t;
private Line[] lines = new Line[
CADSystem(int i) {
super(i +
for(int j =
lines[j] = new Line(j, j*j);
c = new Circle(1);
t = new Triangle(1);
System.out.println("Combined constructor");
}
void cleanup() {
System.out.println("CADSystem.cleanup()");
t.cleanup();
c.cleanup();
for(int i = 0; i < lines.length; i++)
lines[i].cleanup();
super.cleanup();
}
public static void main(String[] args) {
CADSystem x = new CADSystem(47);
try {
// Code and exception handling...
} finally {
x.cleanup();
}
}
} ///:~
這個系統中的所有東西都屬於某種Shape(幾何形狀)。TW.WInGWIT.cOmShape本身是一種Object(對象),因為它是從根類明確繼承的。每個類都重新定義了Shape的cleanup()方法,同時還要用super調用那個方法的基礎類版本。盡管對象存在期間調用的所有方法都可負責做一些要求清除的工作,但對於特定的Shape類——Circle(圓)、Triangle(三角形)以及Line(直線),它們都擁有自己的構建器,能完成“作圖”(draw)任務。每個類都有它們自己的cleanup()方法,用於將非內存的東西恢復回對象存在之前的景象。
在main()中,可看到兩個新關鍵字:try和finally。我們要到第9章才會向大家正式引薦它們。其中,try關鍵字指出後面跟隨的塊(由花括號定界)是一個“警戒區”。也就是說,它會受到特別的待遇。其中一種待遇就是:該警戒區後面跟隨的finally從句的代碼肯定會得以執行——不管try塊到底存不存在(通過違例控制技術,try塊可有多種不尋常的應用)。在這裡,finally從句的意思是“總是為x調用cleanup(),無論會發生什麼事情”。這些關鍵字將在第9章進行全面、完整的解釋。
在自己的清除方法中,必須注意對基礎類以及成員對象清除方法的調用順序——假若一個子對象要以另一個為基礎。通常,應采取與C++編譯器對它的“破壞器”采取的同樣的形式:首先完成與類有關的所有特殊工作(可能要求基礎類元素仍然可見),然後調用基礎類清除方法,就象這兒演示的那樣。
許多情況下,清除可能並不是個問題;只需讓垃圾收集器盡它的職責即可。但一旦必須由自己明確清除,就必須特別謹慎,並要求周全的考慮。
1. 垃圾收集的順序
不能指望自己能確切知道何時會開始垃圾收集。垃圾收集器可能永遠不會得到調用。即使得到調用,它也可能以自己願意的任何順序回收對象。除此以外,Java 1.0實現的垃圾收集器機制通常不會調用finalize()方法。除內存的回收以外,其他任何東西都最好不要依賴垃圾收集器進行回收。若想明確地清除什麼,請制作自己的清除方法,而且不要依賴finalize()。然而正如以前指出的那樣,可強迫Java1.1調用所有收尾模塊(Finalizer)。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19773.html