看過了一本Java入門的教材后再來看Thinking in Java感覺真好
初始化與清理
1. 涉及進本類型的重載
如果某個方法f1有參數為char, byte, short, int, long, float, double的重載方法(注意類型是從小到大排列的),調用時自左往右套用。如f1(5)調用了f1(int),f1((long)5)調用了f1(long)
2. 一個對象,如果沒有寫任何構造方法,編譯器會自動創建一個無參構造器。但是如果已經定義了一個構造器(無論是否含參),編譯器不會自動創建缺省的無參構造器。
3. Banana a = new Banana();
a.f(1);
編譯器執行a.f(1)時其實相當于執行了Banana.f(a,1);
把a的引用傳遞給了f,當然并不能這樣書寫代碼,在f中要訪問a就使用this關鍵字。
4. 同一個類中,方法f2調用方法f2時可以寫this.f2(),但為了更直觀和易讀,通常寫成f2()
5. static關鍵字,有人認為它具有全局函數的語義,并不是“面向對象”的。如果代碼中出現了大量的static方法,就的確該重新考慮自己的設計了。
6. finalize()并不是析構函數。
三點重要概念:
1)對象可能不被垃圾回收。
2)垃圾回收并不等于“析構”
3)垃圾回收只與內存有關。
無論對象是如何創建的,垃圾回收器都會負責釋放對象占據的所有內存。因此之所以要有finalize(),是由于在分配內存時可能采用了類此C語言中的做法,即native方法。
由此可見,垃圾回收器并不能完全代替析構函數,而且絕對不能直接調用finalize()。
finalize()的另一價值在于發現清理對象時一些隱晦的錯誤。如
class Book {
boolean checkedOut = false;
Book(boolean checkOut) {
checkedOut = checkOut;
}
void checkIn() {
checkedOut = false;
}
public void finalize() {
if (checkedOut)
System.out.println("Error: checked out");
}
}
在Book對象終結時檢查是否已被簽入,如果發生未被簽入的錯誤,則在回收時報錯。
System.gc()用于強制進行終結動作,在寫程序時可以加速調試過程。
7. 垃圾回收器的工作方式
1)引用計數
2)自適應