背景
靜態字段
靜態函數
靜態方法
疑問解答
static來源
在編寫類的時候,有時候需要類裡面的某個成員具有唯一性,也就是,對所有的對象都保持只有一個的狀態。比如創建個人信息,我們都是中國人,但總不能每個人都要保存一個中國人字段吧,用一個就夠了。
static作用
MSDN說:使用 static 修飾符聲明屬於類型本身而不是屬於特定對象的靜態成員。也就是說,用static修改的對象是一個類的全部成員,不屬於某個類特有的。比如,轎車有四個輪子,而不是某種轎車有四個輪子。
static特性
1、訪問不需要聲明類對象。比如
Console.Write();//Write()這就是一個靜態方法,不需要new Consolo();
2、 static對象具有唯一性,無論是否產生了對象或無論產生了多少對象的情況下,某些特定的數據在內存空間裡只有一份。也就是說,你無論new多少類成員,靜態變量只有一個,要變都變。
所謂靜態字段,也就是有static修改的字段啦(對,就是廢話o(∩_∩)o )。
作用
無論創建多少對象,靜態字段代表的數據在內存空間中只有一個。比如說系統時間,無論你安裝了多少軟件,想知道現在幾點了,都只有一個參考值,如果你改變了這個時間,那麼其他軟件獲取的時間也都改變了。(當然,只是舉例,具體咋訪問時間的,俺不管)。
操作順序
靜態字段是在類操作(實例化、調用靜態方法等)的時候第一個被實例化的對象。第二個是靜態構造函數,而且他倆都只能被調用一次。
特性
·如上圖,每次創建實例的時候,構造函數對兩個字段進行+1,但是結果不一樣,這就是static修飾的字段的唯一性
靜態構造函數一般用來初始化靜態變量,不會初始化非靜態變量;但是因為非靜態構造函數也能操作靜態變量,所以就比較少用靜態構造函數了。
無論對類進行何種操作,靜態構造函數總是除了靜態字段以外第一個被操作的方法,比非靜態參數、非靜態構造函數都要提前。
class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X +1; static B() { } static void Main(string[] args) { Console.WriteLine(string.Format("Y={0}, X={1}", B.Y, A.X));//Y=2, X=1; Console.ReadLine(); } }
這是網上一個很有名的static的例子,如果不看答案,能夠算出來才是本事。
能夠將完整的順序描述出來,static一般的面試題都難不住你了(我的意思是我很牛掰)
應用
靜態方法一般用於頻繁調用又不經常修改的地方。比如連接數據庫的基本語句。當然,這個特性也是因為靜態方法無法被繼承,無法進行擴展有關。
操作順序
靜態方法會在靜態字段、靜態構造函數都操作後才能被調用。
特性
靜態變量與非靜態變量最大的區別是什麼?
最大的區別在於內存的位置。靜態變量的內存是在程序開始執時變量就占用了內存,直到整個程序結束時變量才釋放內存. 非靜態變量是在程序運行到該步的時候分配內存,並在執行完後自動銷毀。所以:靜態變量的值只會初始化一次,後面每次訪問,都是上次處理過的值。
為什麼靜態變量不需要實例化就能訪問。
因為類在初始化的時候,就已經為靜態變量分配好了內存空間,不需要實例化就能准確找到它們的位置;而非靜態成員必須在實例化類對象以後,才能確定它們的內存位置;因此也有這樣的說法,靜態成員是屬於類,而非靜態成員屬於類的對象
為什麼靜態方法裡面不能訪問非靜態變量,也不能創建非靜態變量?
因為非靜態變量需要實例化才能確認其內存中的位置,才能調用,而靜態函數是不需要實例化的,所以靜態方法不能使用
為什麼方法內部不能聲明靜態變量?
因為靜態變量是類所有實例的共用變量,也就是在該類的范疇內是個全局變量。而如果在方法內部定義靜態變量,則會導致定義的靜態變量是一個局部變量,如此定義自然會出錯。
靜態成員的生命周期
靜態成員的生命周期是整個應用程序域的生存周期.也就是從操作含有靜態成員的類開始,一直到整個應用程序結束。
以上信息都是我參考無數資料自己整理的,當然有可能出現一些錯誤,歡迎大嬸們指正,我會努力修改好,讓這篇文章作為一篇優秀的static參考資料。