單例設計模型:
static修飾符:
①:static靜态隻有一份(同一個虛拟機中) (節省資源),類代碼被裝載記憶體時,靜态代碼配置設定記憶體,并執行,并且常駐記憶體。
②:static修飾成員變量,成為"類變量",屬于整個類,類的共享變量。注:不能修飾局部變量。
static是一塊為整個類共有一塊存儲區域,靜态變量隻有一份,值變化後,所有通路值變化生效。
java中用類名調用static變量和方法(對象調用也可以):類名.變量(方法名)
③:static修飾類方法,屬于類方法,繼承中子類可以定義相同方法,靜态不支援覆寫,此時不存在繼承間的多态。
④:static靜态塊(定義和方法平行),在類加載時執行一次,以後不再執行,一般用于初始化靜态成員。
④:類的方法繼承與否取決于4大通路修飾符,和static修飾符無關(static不會發生繼承多态)。
注:main()主方法定義成static,是因為加載類代碼入記憶體的時候還沒有對象這個概念。
類a:
類b繼承a:
輸出結果為:
b static print method
a static print method
b instance display method
2
5
8
3
initial xxxxx
initial c field
static繼承:
從上面執行結果,可以反映出:
①:靜态屬于所有它的類,不會被繼承。
②:類的繼承層次模型下的多态隻發生在方法(成員方法)上。
③:類的成員屬性,以及靜态變量,靜态方法,靜态塊,都不發生繼承。
singleton模型:
static通常用于單例設計,singleton是一種設計模式,高于文法,可以保證一個類在整個系統中(同一個虛拟機中)僅有一個對象。
在計算機系統中,線程池、緩存、日志對象、對話框、列印機、顯示卡的驅動程式對象常被設計成單例,具有資料總管功能。
單例類原則: ①隻有一個執行個體對象; ②自己建立自己的這一個對象; ③通過方法提供僅有的對象給其他對象使用。
綜之: 單例模式確定某個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。
實作的三種方式:
1:餓漢式單例
2:懶漢式單例類
3:登記式單例類
singletond繼承singletonc:
測試類:
輸出結果為:
1&2 t
3&4 t
name is null,name to ca.singleton.singletonc
5&6 t
hello,i am a schematic of the commercial method
7&8 t
5&7 f
使用“==”比較,基本類型,引用存儲空間直接存儲的真實值,是以比較的值;
對于其他類類型,在任何時候“==”比較的都是位址,這種比較永遠不會被覆寫。
可以看出上邊的單例都存在一個對象。
如果想讓高并發下多線程在單例中生效,就要保證單例對象操作的方法為線程同步(對象鎖)。