[C#學習筆記] 靜態成員和例項成員
前言:類是物件的抽象,物件是類的例項,物件有自己的屬性和方法,萬物皆物件,不可避免的,類也是一種物件,也有它自己的方法和屬性,類的成員稱為靜態成員,包括靜態資料和靜態方法,而類例項化出的物件的成員稱為例項成員。
靜態成員(static member):又叫類成員,指的是在成員型別或返回值型別前用static關鍵字修飾的變數或方法,包括靜態資料和靜態方法,靜態成員儲存線上程堆疊中,在類被載入到記憶體中時; 例項成員(instance member):又稱非靜態成員、物件成員,是沒有用static修飾的變數或方法,包括例項資料和例項方法,引用存線上程堆疊中,物件存在託管堆中。 不同點:表面看就是有沒有被static修飾,其次是在記憶體分配上,類載入時,靜態成員只只分配一次,有且只有一份儲存空間。而對於例項成員,每產生一個例項都要重新分配一個儲存空間。
特點之靜態成員:
1)靜態成員(包括靜態資料和靜態方法)必須由類名呼叫,不能使用物件呼叫(靜態資料可以由例項方法呼叫)。
2)靜態資料屬於類的級別,當類載入時,一個靜態資料在記憶體只分配一個儲存空間,無論new出多少個例項,它也只是有那一個空間。
3)靜態方法只能呼叫靜態資料,不能呼叫物件。
特點之例項成員:
1)例項成員(包括例項資料和例項方法)必須通過物件來呼叫,不能使用類名呼叫。
2)類的例項資料屬於類的例項級別,每新建立一個物件,都會在記憶體中為例項成員開闢一塊新的儲存空間。
3)例項方法可以呼叫例項資料和靜態資料。
附:我們在C#中經常使用的WriteLine等方法都是靜態成員,是直接呼叫類名Console來使用的。
讓我們來用程式碼來說明方法對資料的呼叫情況:
1. class Demo
2.
3. {
4. int a; // 例項資料
5. static int b; // 靜態資料
6. void A() // 例項方法
7.
8. {
9. a = 1; // 正確:例項方法可以呼叫例項資料
10. b = 1; // 正確:例項方法可以呼叫靜態資料
11. }
12.
13. static void B() // 靜態方法
14.
15. {
16. a = 1; // 錯誤:靜態方法不能呼叫例項資料
17. b = 1; // 正確:靜態方法可以呼叫靜態資料
18. }
19.
20. static void Main() // 靜態方法
21. {
22. Demo d = new Demo(); // 例項化物件
23. d.a = 1; // 正確:例項可以呼叫例項資料
24. d.b = 1; // 錯誤:例項不能呼叫靜態資料
25. Demo.a = 1; // 錯誤:類名不能呼叫例項資料
26. Demo.b = 1; // 正確:類名可以呼叫靜態資料
27. d.A(); // 正確:例項可以呼叫例項方法
28. d.B(); // 錯誤:例項不能呼叫靜態方法
29. Demo.A(); // 錯誤:類名不能呼叫例項方法
30. Demo.B(); // 正確:類名可以呼叫靜態方法
31. }
32. }
另外,讓我們來用程式碼說明一下,靜態資料只使用一塊記憶體空間:
1. public class Demo
2.
3. {
4. static int count=0; //定義靜態資料count
5. int number=0; //定義例項資料number
6. public Demo()
7. {
8. number =number+ 1;
9. count = count + 1;
10. }
11.
12. public void show()
13. {
14. Console.WriteLine(“number={0} : count={1}”, number, count);
15. }
16. }
17.
18. class Test
19. {
20. public static void Main()
21. {
22. Demo a = new Demo();
23. a.show();
24. Console.WriteLine(“*****
輸出結果為: number=1 : count=1 ********** number=1 : count=2 ********** number=1 : count=3 可以看出:靜態資料的值是隨著例項化出的物件數目而改變的,每增加一個例項化物件都會使靜態資料值+1,所以所有的物件都是使用的同一個靜態資料,即證明了靜態資料公用一塊記憶體空間,而每個物件的例項資料都相同,說明每例項化一次都會開闢一塊新的記憶體空間。
文章部分資料來源於網路上,謝謝作者的無私奉獻.