任何項目中都會使用到靜態類、靜態方法、靜態成員和實例成員了。那麼這幾個名詞到底有哪些區別呢? 1、靜態成員和實例成員 靜態成員:靜態成員通常和類是相關聯的。它可以作為類中公有的變數,不依賴特定對象的存在。通常我們在訪問它們的時候很簡單,直接通過類名加點操作符再加變數名來進行操作。 實例成員:實例成員 ...
任何項目中都會使用到靜態類、靜態方法、靜態成員和實例成員了。那麼這幾個名詞到底有哪些區別呢?
1、靜態成員和實例成員
靜態成員:靜態成員通常和類是相關聯的。它可以作為類中公有的變數,不依賴特定對象的存在。通常我們在訪問它們的時候很簡單,直接通過類名加點操作符再加變數名來進行操作。
實例成員:實例成員通過和對象是相關聯的。一般情況下,我們都是對類的實例化來進行訪問操作。如果實例不存在,那麼也就無法訪問實例成員對象。
所以實例成員的存在必須要有對象實例的存在,如果對象實例都不存在了,那麼就將無法訪問;而靜態成員只是依賴於類的存在與否,也就無需聲明和實例化對象了。
如下方這段示例:
class Program
{
static void Main(string[] args)
{
MyStaticText.MyStaticMethod(); //靜態方法調用
MyStaticText myStaticText = new MyStaticText();
myStaticText.MyExampleMethod(); //實例方法調用
Console.ReadKey();
}
}
class MyStaticText
{
private int exampleInt = 5;
private static int staticInt = 6;
public static void MyStaticMethod()
{
Console.WriteLine("開始調用靜態方法:");
MyStaticText myStaticText = new MyStaticText();
myStaticText.MyExampleMethod();
Console.WriteLine(staticInt);
Console.WriteLine("結束調用靜態方法:");
}
public void MyExampleMethod()
{
Console.WriteLine(exampleInt);
}
}
static class MyStaticClassText
{
public static int GetStuNo()
{
return 1;
}
public static string GetStuName()
{
return "Jim";
}
}
最後的輸出結果為:
2、靜態類
我們知道,對於類有很多修飾符,如public
,同時,類也可以聲明為static
,表示它僅可以包含靜態成員。不能實例化來創造類的實例。比方說,在有些特定業務中,不需要操作實例數據也不與代碼中特定對象關聯。那麼此時,就需要使用靜態類來包含特定的方法。
靜態類的主要功能如下:
- 類中僅包含靜態成員和靜態方法。並且必須被
static
修飾。 - 它們不能被實例化。
- 它們是密封的。那麼此時編譯器編譯時會自動生成
sealed
標記。
項目中使用靜態類的優點在於,對於靜態類的創建,編譯器能夠執行檢查以確保不會偶然的添加實例成員。同時,靜態類時密封的,因此也不允許被繼承。
如下方代碼示例:
static class MyStaticClassText
{
public static int GetStuNo()
{
return 1;
}
public static string GetStuName()
{
return "Jim";
}
}
3、類的靜態成員和非靜態成員
對於一個類中的靜態成員和非靜態成員到底有哪些區別呢?
- 語法區別:靜態成員需要
static
關鍵字修飾,而非靜態成員可以不需要。 - 存儲區別:對於靜態成員而言,它是存儲在程式中全局變數存儲區中,並且在整個程式運行期間只在記憶體中有一個位置,既不會拷貝也不會複製。
- 歸屬區別:靜態成員屬於類的成員變數,無論對一個類實例化多少次,這個類的靜態成員都只有一個副本,程式中各個地方對它的調用都會改變它的值;而非靜態成員屬於他的對象,各自對象對自身實例的改變不會各自影響。
- 初始化順序的區別:初始化時首先初始化類的靜態成員,然後才是非靜態成員。
根據上述內容,下麵示例代碼的輸出是多少呢?
class Program
{
private static int i = GetNum();
private static int num = 10;
int j = GetNum();
private static int GetNum()
{
return num;
}
static void Main(string[] args)
{
Console.WriteLine("i={0}", i);
Program program = new Program();
Console.WriteLine("j={0}", program.j);
Console.WriteLine("i={0}", i);
Console.ReadKey();
}
}
輸出結果為:
以上就是對靜態方法、靜態成員、靜態類和實例成員的比較。有不對的地方請大家指正或者一起交流。