物件初始化過程與單例設計模式(餓漢式與懶漢式)
阿新 • • 發佈:2019-02-09
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