1. 程式人生 > >[C#學習筆記] 靜態成員和例項成員

[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(“*****

”); 25. Demo b = new Demo(); 26. b.show(); 27. Console.WriteLine(“*****”); 28. Demo c = new Demo(); 29. c.show(); 30. } 31. }

  輸出結果為:     number=1 : count=1     **********     number=1 : count=2     **********     number=1 : count=3   可以看出:靜態資料的值是隨著例項化出的物件數目而改變的,每增加一個例項化物件都會使靜態資料值+1,所以所有的物件都是使用的同一個靜態資料,即證明了靜態資料公用一塊記憶體空間,而每個物件的例項資料都相同,說明每例項化一次都會開闢一塊新的記憶體空間。

文章部分資料來源於網路上,謝謝作者的無私奉獻.