如果類成員有private修飾符,就不允許在類范圍以外訪問這個類成員。對類構造函數應用private修飾符時,則禁止外部類創建該類的實例。盡管看上去有些不好理解(既然不能實例化,那麼這個類還有什麼用處?),但實際上這是一個功能極其強大的特性。
最明顯的是,如果類只通過靜態方法和字段來提供功能,那麼就常常使用私有構造函數。框架類庫FCL中System.Math類就是一個很經典的例子。
System.Math類有兩個靜態字段:pi和e(自然對數底數),還有一些返回三角函數值的方法。這些方法都作為內置函數,所以,程序沒有必要為使用這些字段和方法而創建Math類的實例。
現在可能會很自然地出現這樣一個問題:要避免實例化,使用私有構造函數好呢,還是使用抽象類更好一些?答案在於要理解這二者的區別。首先來考慮繼承,雖然抽象類不能實例化,但其真正的目的是用於作為基類,以便派生類(可實例化)創建自己的實現。使用私有構造函數的類不會被繼承,而且也不能被繼承。其次,私有構造函數只能禁止外部類對該類進行實例化,卻不能禁止在該類內部創建實例。
私有構造函數的特性也可以用於管理對象的創建。雖然私有構造函數不允許外部方法實例化這個類,但卻允許此類中的公共方法(有時也稱為工廠方法,factory method)創建對象。也就是說,類可以創建自身的實例、控制外界對它的訪問,以及控制創建的實例個數
注:本文來自51CTO.COM
a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010
b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011
^異或運算符,位值相同為0,不同為1,見上示例.
//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010
b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011
^異或運算符,位值相同為0,不同為1,見上示例.
//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].