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.“動態”成員變量在每次實例化對象時候都執行。
*/