天天看點

java的單例、static修飾符及static的繼承

單例設計模型:

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

使用“==”比較,基本類型,引用存儲空間直接存儲的真實值,是以比較的值;

對于其他類類型,在任何時候“==”比較的都是位址,這種比較永遠不會被覆寫。

可以看出上邊的單例都存在一個對象。

如果想讓高并發下多線程在單例中生效,就要保證單例對象操作的方法為線程同步(對象鎖)。