1. 程式人生 > >物件初始化過程與單例設計模式(餓漢式與懶漢式)

物件初始化過程與單例設計模式(餓漢式與懶漢式)

1.物件初始化過程:(先載入類到記憶體,然後載入類屬性,成員方法)
定義一個類Person,  在new Person("zhangsan",20);
初始化過程:
1.因為new 用到Person.class檔案,所以會先找到Person.class檔案並載入到記憶體中.
2.執行該類中的static靜態程式碼塊,如果有的話,給Person.class類進行初始化.
3.在對記憶體中開闢空間,分配記憶體地址.
4.在對記憶體中建立物件的特有屬性,並進行預設初始化.
5.對屬性進行顯示初始化.
6.對物件進行對應的構造程式碼塊初始化.
7.對物件中建構函式進行初始化.,
8.將記憶體地址付給棧記憶體中的p變數.
注意: 靜態只能在棧記憶體裡,非靜態變數在堆裡.


2.單例設計模式:解決一個類在記憶體中只存在一個物件(保證物件唯一).
1.禁止其他程式建立該類物件.
2.在本類自定義一個物件.
3.為了提供其他程式使用該類物件,對外提供一些訪問方法.
解決問題:
1.將建構函式私有化.(私有化無參建構函式,這樣外界就不能直接訪問該類物件.)
2.在類中建立一個本類物件.(靜態類)
3.提供一個方法可以獲取到該物件(靜態方法).
(一開始就建立)單例餓漢式(初始化時候建立物件):(開發常用)
class  Single{
private static Single s=new Single();;
private Single(){  //私有化
} 
public static getInstance(){
return s;
}
}







(建立後用)單例懶漢式(物件被呼叫時才建立物件):
class Single{
private Single(){}
private Single s=null;
public static Single getInstance(){
if(s==null){ 
synchronized(Single.class){
if(s==null){  //排除執行緒同時進入,當第三者進入時,已不為空.
a=new Single();
}
}
}
return s;
}
}


注意:1.常用餓漢式.
     2.在使用懶漢式時,會出現執行緒衝突(多程式同時建立),這是後要加上synchronized