2017年8月12日 星期六

Chapter 05: 初始化和清理

Cleanup
  • 當garbage collector打算開始釋放物件所占的空間時,會先呼叫其finalize(),並且在下一次的garbage collect動作發生時回收該物件所占的空間。
  • 觀念:
    • 物件有可能不被garbage collector回收(程式執行到結束中間沒有發生memory不夠)
    • garbage collection並非deconstruction
    • garbage collection只回收memory
  • finalize()存在的意義:
    • free以new物件之外的方式配置某個儲存空間(例如呼叫C/C++的native function)
    • termination condition的檢查(協助debug)

Garbage collector的運作方式
  • Java從heap配置物件的速度逼近其他語言從stack挖掘空間的速度。
    • C++之類的heap在配置時需要時間去做"搜尋可用空間"之類的大動作。
    • Java heap像是輸送帶,配置物件時,heap指標只是單純的前往還沒配置的下一個區域。
    • 這是因為garbage collection會重新安排heap內的物件,讓它們緊密排列,避免page fault發生。

物件生成的過程(以名為Dog的class為例)
  • constructor實際上是static method,所以當Dog物件首次被產生,或是Dog的static member/method首次被存取,JAVA interpreter會找出Dog.class。
  • 當Dog.class首次被載入後,它所有的static初始化動作會被執行。
  • 從heap上配置Dog物件的空間。
  • 把這塊空間清為0,將物件的基本型別成為設成預設值,reference成員設成null。
  • 執行各成員在定義處的初始化動作。
  • 執行constructor。

static明確初始化
  • JAVA允許將多個static初始化動作置於static block中。
public class Spoon {
     static int i;
     static {
         i = 47;
     }
}

Variable Argument List
public class NewVarArgs {
     static void printArray(Object... args) {
         for(Object obj : args)
             System.out.print(obj + " ");
         System.out.println();
     }
     public static void main(String[] args) {
         // Can take individual elements:
         printArray(47, 3.14F, 11.11);
         printArray("one", "two", "three");
         printArray(new A(), new A(), new A());
         // Or an array:
         printArray((Object[])new Integer[]{ 1, 2, 3, 4 });
         printArray(); // Empty list is OK
     }
} /* Output: (75% match)
47 3.14 11.11
one two three
A@1bab50a A@c3c749 A@150bd4d
1 2 3 4
  • 可使用省略符號(...)來定義可變引數列,也可以用foreach來做iteration。

沒有留言:

張貼留言