Static靜態字段,靜態方法,靜態代碼塊
壹 簡介
一些場景下會要求一個類的多個實例共享一個成員變量;有時候想定義一些不和具體對象關聯、不需要new就調用的方法
舉例:Console類的WriteLine,MessageBox的Show。這個時候就要使用靜態。
所謂靜態方法、靜態成員是類的方法、類的成員,他不歸屬於任何一個對象。因此不用new出來,直接類型.靜態方法()就能用了。
貳 特征
1、static變量不需要new就可以直接通過類名調用。static變量是共享的內存空間,非static變量則是對象隔離的。
2、static 方法中無法使用this關鍵字,因為static獨立於對象存在,不是任何人的唯一。
3、static成員中只能訪問static成員,不能直接訪問非static成員。非static成員可以訪問static成員。
三 靜態代碼塊
1. 示例
class
MyTest
{
static
MyTest()
{
Console.WriteLine(
"靜態代碼塊"
);
}
public
MyTest()
{
Console.WriteLine(
"構造方法"
);
}
}
MyTest t1 =
new
MyTest();
MyTest t2 =
new
MyTest();
2. 說明
1.靜態代碼塊,在類第一次被使用的時候執行一次,只要用到類,哪怕沒new對象(比如只是聲明變量)也會被執行,且只執行一次。
2.靜態代碼塊,在構造函數執行之前執行。
3. 試題
public
class
MyJingTaiDaimaKuai
{
public
static
int
i = test1();
//最開始執行
public
int
age = test2();
//new的時候先執行成員變量的初始化,再執行構造函數
static
MyJingTaiDaimaKuai()
{
Console.WriteLine(
"靜態代碼塊"
);
//再執行
}
public
MyJingTaiDaimaKuai()
{
Console.WriteLine(
"構造函數"
);
}
public
static
int
test1()
{
Console.WriteLine(
"test1"
);
return
3;
}
public
static
int
test2()
{
Console.WriteLine(
"test2"
);
return
333;
}
}
MyJingTaiDaimaKuai a1 =
new
MyJingTaiDaimaKuai();
Console.WriteLine(a1.age);
MyJingTaiDaimaKuai a2 =
new
MyJingTaiDaimaKuai();
Console.WriteLine(a2.age);
/* 對以上代碼描述如下*/
/*
* 1.只要接觸類,最先執行的是類中的靜態的成員變量。
* 2.其次執行的是靜態代碼塊。
* 3.靜態成員變量的聲明和定義僅在首次加載的時候執行一次。
* 4.“動態”成員變量在構造函數之前執行。
* 5.“動態”成員變量在每次實例化對象時候都執行。
*/