引言
java中一切對象的建立都在堆,由gc自動回收。而局部變量的存儲都在堆棧上會随着方法的運作結束彈棧而銷毀。那Object提供的finalize有什麼用呢?
finalize的用處
java有一種可以調用本地其他語言的方法native,例如調用C++,而C++程式對象的銷毀必須手動的調用析構函數進行銷毀。如果我們目前調用了這個本地方法建立了C++對象,那麼就必須對這個C++對象進行銷毀,這就使finalize有了用武之地。
而finalize方法不是總是執行的,而是在gc準備釋放對象占用的存儲空間,将首先調用其finilize方法。(誤區:調用finilize方法對該對象占用的記憶體進行釋放)
finalize不是一定執行
由于垃圾回收也有開銷,是以程式沒有瀕臨存儲空間用完的那一刻,對象占用的空間就總也得不到釋放。如果執行程式結束并且垃圾回收器一直沒有釋放你建立的任何對象的存儲空間,則随着程式的退出,這些占用的資源也還給了作業系統。
模拟對象銷毀
1. 獨立對象的銷毀
//要被組合的對象
public classOtherObj{publicOtherObj() {
System.out.println("Other對象的建立");
}
public voiddispose(){
System.out.println("Other對象的銷毀");
}
}//父類
public classParent {publicParent() {
System.out.println("父類構造的調用");
}public voiddispose(){
System.out.println("父類中銷毀方法的調用,用來銷毀父類中的屬性");
}
}//子類
public class Sub extendsParent {private OtherObj otherObj = newOtherObj();publicSub() {
System.out.println("子類對象的建立");
}
@Overridepublic voiddispose() {this.otherObj.dispose();//System.out.println(super); 編譯報錯,根本就不存在super對象隻是可以調用父類的方法(子類調用)
super.dispose();
System.out.println("子類對象的銷毀");
}public static voidmain(String[] args) {
Sub sub= newSub();
sub.dispose();
}//運作結果
父類構造的調用
Other對象的建立
子類對象的建立
Other對象的銷毀
父類中銷毀方法的調用,用來銷毀父類中的屬性
子類對象的銷毀
2. 共享對象的銷毀,通過引用計數來跟蹤共享對象的數量
public classOtherObj {private static int counter = 0;private final int id = counter++;
private int refCount = 0;publicOtherObj() {
System.out.println("Other對象的建立");
}
public voiddispose(){if (--refCount==0){
System.out.println("Other對象的銷毀");
}
}
public intaddRef() {return refCount++;
}
@OverridepublicString toString() {return "OtherObj的對象,id=" +id;
}
}//父類
packagetop.liuzhihong.polymorphic.c;
public classParent {publicParent() {
System.out.println("父類構造的調用");
}public voiddispose(){
System.out.println("銷毀父類的屬性");
}
}//子類
public class Sub extendsParent {privateOtherObj otherObj;publicSub(OtherObj otherObj) {
System.out.println("子類對象的建立");this.otherObj =otherObj;this.otherObj.addRef();
}
@Overridepublic voiddispose() {this.otherObj.dispose();//System.out.println(super); 編譯報錯,根本就不存在super對象隻是可以調用父類的方法(子類調用)
super.dispose();
System.out.println("子類對象的銷毀");
}public static voidmain(String[] args) {
OtherObj otherObj= newOtherObj();
Sub[] subs= newSub[]{newSub(otherObj),newSub(otherObj),newSub(otherObj),
};for(Sub sub : subs) {
sub.dispose();
}
}
}//運作結果
Other對象的建立
父類構造的調用
子類對象的建立
父類構造的調用
子類對象的建立
父類構造的調用
子類對象的建立
銷毀父類的屬性
子類對象的銷毀
銷毀父類的屬性
子類對象的銷毀
Other對象的銷毀
銷毀父類的屬性
子類對象的銷毀