靜態與非靜態的區別

2022-02-23 07:07:46 字數 1652 閱讀 1544

最近一直在看《你必須知道的.net>>一書,感覺挺不錯,現在把一些內容記錄如下:

內容:1.靜態類與非靜態類

●.靜態類中只能包含靜態成員和靜態方法,否則會丟擲編譯錯誤;

而非靜態類中可以包含非靜態成員和非靜態方法,也可以包含

靜態成員和靜態方法;

●.靜態類不可以例項化;非靜態類可以例項化。不管是靜態類還是

非靜態類,對於靜態成員和靜態方法的呼叫都必須通過類來實現;

●.如果乙個類只包含靜態成員和靜態方法,應該將該類標記為static,

並提供私有的建構函式來避免例項建立,其實這個也是單件模擬的體現;

2靜態建構函式與例項建構函式

靜態建構函式,使用者初始化類中的靜態成員,包括靜態欄位和靜態屬性。

靜態建構函式不能參引數、不能有訪問修飾符也不能為呼叫,通常由.net

執行庫在第一次呼叫類成員之前執行。

●.靜態建構函式,可以和無引數的例項建構函式同存。雖然引數列表相同,

但是二者執行的時間不同,靜態建構函式在執行庫載入類時執行;而例項構造

函式則在例項建立時執行。

●.靜態建構函式,只能對靜態成員進行初始化操作,不能用與非靜態成員;

而例項建構函式,可以初始化例項成員,也可以初始化靜態成員,但是靜態

唯讀字段除外;

●.靜態建構函式只被執行一次,而且.net執行庫也無法確定靜態建構函式什

麼時候被執行;而例項建構函式可以在多次例項建立時被執行多次;

●.乙個類只能有乙個靜態建構函式;而乙個類可以有多個例項建構函式;

●.靜態成員可以在宣告時初始化,也可以通過靜態建構函式進行初始化,

這兩種初始化都只能被執行一次。一般來說,簡單的靜態成員在宣告時初

始化即可,而複雜的靜態成員則選擇在靜態建構函式中進行初始化較佳;

●.建構函式的大體執行順序:分配靜態成員的記憶體空間----執行靜態成員初

始化----執行靜態建構函式----分配物件例項的記憶體空間----執行例項成員

初始化----執行例項建構函式;

3.靜態成員與例項成員

●.靜態成員包含靜態欄位和靜態屬性,靜態字段實現為private,而靜態屬性

一般實現為public,以體現類的封裝原則;

●.靜態成員和類相關聯,不依賴於物件而存在,只能由類訪問;例項成員和

具體物件相關聯,只能由物件例項訪問,而不能由類訪問;

●.靜態成員屬於類所有,無論建立多少例項物件,靜態成員在記憶體中只有乙份;

例項成員屬於類的例項所有,每建立乙個例項物件,例項成員都會在記憶體中分配

一塊記憶體區域;

4靜態方法和例項方法

●.效能上,二者都差不多;

●.靜態方法只能訪問靜態成員和靜態方法,可以間接通過建立例項物件來訪

問例項成員和例項方法;而例項方法可以直接訪問例項成員和例項方法,也可以

直接訪問靜態成員和靜態方法;

●.靜態方法只能由類訪問,例項方法只能有物件例項訪問;

●.靜態方法中不能引用this關鍵字,而例項方法可以;

●.靜態方法不能被標記為virtual、abstract或者override,靜態方法可以被派生

類訪問,但是不能被派生類覆寫。

●.main方法為靜態的,因此main方法中不能直接訪問main所在類的例項方法和例項

成員。●.靜態狀態必須是執行緒安全的。

靜態與非靜態的區別

1.靜態類與非靜態類 靜態類中只能包含靜態成員和靜態方法,否則會丟擲編譯錯誤 而非靜態類中可以包含非靜態成員和非靜態方法,也可以包含 靜態成員和靜態方法 靜態類不可以例項化 非靜態類可以例項化。不管是靜態類還是 非靜態類,對於靜態成員和靜態方法的呼叫都必須通過類來實現 如果乙個類只包含靜態成員和靜態...

靜態與非靜態的區別

1.靜態成員優先於物件存在,所以靜態方法不能呼叫非靜態成員,非靜態方法能呼叫靜態與非靜態成員。2.靜態成員屬於類,被物件所共享,可被類和物件直接呼叫,非靜態只屬於當前物件,只能被類的物件呼叫。3.載入時間不同 靜態成員隨類的載入而載入,非靜態只能在物件愛那個被建立後才能載入。4.記憶體儲存區域不同 ...

靜態與非靜態的區別

1.靜態類與非靜態類 靜態類中只能包含靜態成員和靜態方法,否則會丟擲編譯錯誤 而非靜態類中可以包含非靜態成員和非靜態方法,也可以包含 靜態成員和靜態方法 靜態類不可以例項化 非靜態類可以例項化。不管是靜態類還是 非靜態類,對於靜態成員和靜態方法的呼叫都必須通過類來實現 如果乙個類只包含靜態成員和靜態...