java物件的初始化和清理
阿新 • • 發佈:2019-02-14
初始化和清理
對於初始化和清理(cleanup),C++引入了構造器(constructor)的概念,這是一個在建立物件時被自動呼叫的特殊方法,Java也採用了構造器,並額外提供了“垃圾回收器”; 1、使用構造器確保初始化 (1)Java中每個類都會有一個initialize()初始化方法:提醒在使用該類物件前,先呼叫initialize方法;即構造器方法,Java中構造器方法採用與類相同的名稱; (2)從概念上來講,“初始化”和“建立”是相互獨立的, 但在Java中,這兩個過程是捆綁在一起的; (3)在類的內部,變數定義的順序決定了初始化的順序,即使變數定義散佈在方法之間,它們仍舊會在任何方法(包括構造器)被呼叫前初始化; 初始化的順序是,先靜態物件,再非靜態物件;
Java允許將多個靜態初始化動作組織為一個特殊的“靜態子句”(“靜態塊”),如:
public class example{
static i;
static Cup cup1;
static {
i = 47;
cup1 = new cup1( );
}
}
2、清理:確保處理和垃圾回收
Java允許在類中定義一個finalize()方法:一旦垃圾回收器準備好釋放物件佔用的儲存空間,會首先呼叫finalize方法,並在下一個垃圾回收動作發生時,才會真正回收物件佔用的記憶體;
①物件可能不被垃圾回收;
②垃圾回收不等於“析構”;垃圾回收通常會大量發生在記憶體瀕臨溢位的時間,以節省垃圾回收本身的開銷;
③垃圾回收只與記憶體有關;
※在每次物件的生存週期要對記憶體進行管理,可以在finalize方法中使用Java的本地方法(支援C/C++);
3、垃圾回收器的工作方式
(1)Java垃圾回收器將物件重新排列,實現一種高速地,有無限空間可分配的堆模型;
(2)Java垃圾回收器的工作方式:自適應的、分代的 停止-複製(stop-and-copy)方式 + 標記-清掃(mark-and-sweep)方式;
①停止-複製(stop-and-copy)方式:
先暫停程式的執行(不屬於後臺回收模式),將所有存活的物件從當前堆複製到另一個堆,沒有被複制的全部都是垃圾。當物件被複制到新堆時,它們的排列方式是一個挨一個的緊密排列;
這種方式的效率比較低,原因為:a.空間:需要兩個堆,所以需要維護比實際多一倍的空間;
b.複製:程式在進入穩定狀態後,可能產生很少的垃圾,這種方式會很浪費資源;
②標記-清掃(mark-and-sweep)方式:
檢查是否有新垃圾產生,如果沒有,就會轉到這種工作方式;
從堆疊和靜態儲存區出發,遍歷所有的引用,找出所有存活的物件,當找到一個存活物件時,會給該物件進行標記,當所有標記完成後,再進行清理;
這種方式的速度很慢;
對於初始化和清理(cleanup),C++引入了構造器(constructor)的概念,這是一個在建立物件時被自動呼叫的特殊方法,Java也採用了構造器,並額外提供了“垃圾回收器”; 1、使用構造器確保初始化 (1)Java中每個類都會有一個initialize()初始化方法:提醒在使用該類物件前,先呼叫initialize方法;即構造器方法,Java中構造器方法採用與類相同的名稱; (2)從概念上來講,“初始化”和“建立”是相互獨立的, 但在Java中,這兩個過程是捆綁在一起的; (3)在類的內部,變數定義的順序決定了初始化的順序,即使變數定義散佈在方法之間,它們仍舊會在任何方法(包括構造器)被呼叫前初始化; 初始化的順序是,先靜態物件,再非靜態物件;