靜態建構函式是在建構函式方法前面新增了static關鍵字之後形成的,並且沒有修飾符(public,private),沒有引數。
######靜態建構函式有哪些特點:
1、靜態建構函式沒有修飾符修飾(public、private),因為靜態建構函式不是我們程式設計師呼叫的,是由.net框架在合適的時機呼叫的。
2、靜態建構函式沒有引數,因為框架不可能知道我們需要在函式中新增什麼引數,所以規定不能使用引數。
3、靜態建構函式前面必須是static關鍵字,如果不加這個關鍵字,那就是普通的建構函式了。
4、靜態建構函式中不能例項化變數。(變數可以分為類級別的和例項級別的變數,其中類級別的有static關鍵字修飾)。
5、靜態函式的呼叫機制,是在類被例項化或者靜態成員被呼叫的時候進行呼叫,並且是由.net框架來呼叫靜態建構函式來初始化靜態成員變數。
6、乙個類中只能有乙個靜態構造變數。
7、無引數的靜態建構函式和無引數的建構函式是可以並存的。因為他們乙個屬於類級別,乙個屬於例項級別,並不衝突。
8、靜態建構函式只能被呼叫一次。並且是在特點5中的呼叫時機進行呼叫。
9、就像如果沒有在類中寫建構函式,那麼框架會為我們生成乙個建構函式,那麼如果我們在類中定義了靜態變數,但是又沒有定義靜態建構函式,那麼框架也會幫助我們來生成乙個靜態建構函式來讓框架自身來呼叫。
######現在我們來做乙個有意思的事情,驗證靜態建構函式的呼叫時機:
1 class program
2
10 }
11 public class a
12
19 public a()
20
23 }
24 public class b:a
25
30 public b()
31
34 }
輸出結果均為:aaa
我們來分析一下出現這個情況的原因所在,當顯示a.strtext的時候,因為strtext是靜態變數,所以框架會呼叫a的靜態建構函式,此時strtext的值為aaa.正確當顯示b.strtext的時候,因為b繼承自a,所以會首先呼叫a的靜態建構函式,但是因為靜態建構函式只會呼叫一次,所以不會呼叫a的靜態建構函式,但是又因為strtext屬於類a,而不是b,所以b得靜態建構函式不會執行,故輸出的均為aaa。
呼叫的先後順序:只呼叫static a()
######但是如果我們把輸出更改一下,輸出結果就大不一樣了。
class program
2
13 }
14 public class a
15
22 public a()
23
26 }
27 public class b:a
28
33 public b()
34
37 }
輸出結果:都是bbb
請注意我在開始部分對類進行了例項化,那麼此時的輸出結果就是均為bbb。為什麼會有這樣的情況出現呢,其實還是要從靜態建構函式的呼叫時機入手。
首先我們例項化了b,此時會呼叫b的靜態建構函式,但是因為strtext是a的靜態變數,所以首先會先呼叫a的靜態建構函式將strtext賦值為aaa,此時又會呼叫b的靜態建構函式將strtext賦值為bbb,所以此時strtext的值應該為bbb,所以輸出均為bbb。
呼叫的先後順序:例項化b時(b b=new b())
static b()——static a()——static b()——public a()——public b()
例項化a時(a a = new a())
public a()
靜態建構函式與靜態變數
靜態建構函式 c 物件初始化1.先變數後建構函式。變數先被初始化 然後建構函式被執行 2.先靜態化後例項化。當 乙個類被訪問時 靜態變數和建構函式最先被初始化 接著是物件的例項化變數和建構函式被初始化 3.先派生類後基類。對於變數和靜態建構函式 派生物件在基物件之前被初始化 比如 c類派生自 b類 ...
靜態變數 靜態屬性 靜態建構函式
靜態屬性不屬於任何例項,也是屬於類的,和靜態變數不同的是,只用在呼叫它的時候,才會初始化,而且每次呼叫都會重新賦值。靜態建構函式需用static修飾,但不能用public或private等關鍵字修飾,因為靜態建構函式不能直接呼叫,無論是直接例項化還是通過class.method的方式。下面我們看看在...
靜態變數和非靜態變數的區別
記憶體分配 靜態變數在應用程式初始化 被裝載 時,就存在於記憶體當中,直到它所在的類的程式執行結束時才消亡 而非靜態變數需要被例項化後才會分配記憶體。生存週期 靜態變數生存週期為應用程式的存在週期 非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能通過 類.靜態變數名 呼叫,類的...