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。
沒有留言:
張貼留言