靜態 static
什麼是靜態:會一直佔用內存
什麼是非靜態:實例化后擦會佔用內存
程序配置數據部分時使用靜態類
1.靜態類
-
只包含靜態成員
-
無法實例化
-
本質是一個抽象的密封類,不能被繼承和實例化
-
不能包含實例構造函數
-
如果一個類下面的所有成員都需要被共享,那麼可以把這個類定義為靜態類
2.靜態成員
-
屬於類,通過“類名.靜態成員”方式訪問,在類第一次加載時,類下面的所有靜態成員都會被加載
-
只被創建一次,所以靜態成員只有一份
-
靜態成員會被創建到“靜態存儲區”裡面,一旦創建知道程序退出再會被回收
-
無論對一個類創建多少個實例,它的靜態成員都只有一個副本
3.靜態方法
-
不屬於特定對象的方法
-
可以訪問靜態成員
-
不能直接訪問實例成員,可以在實例函數調用的情況下,實例成員作為參數傳給靜態方法
class A { private static A instance = new A(); public static void F() //靜態 { A.G(); } } public void G();//非靜態 { }
- 不能直接調用實例方法,可以間接調用,創建一個類的實例,通過這一特定對象去調用
類成員訪問聲明(public private internal)
1.public: 共有的 訪問沒有限制
2.private: 私有的 聲明他們的類和結構中才能訪問
3.internal: 內部的 同一個程序集(命名空間)中的所有類都能訪問,可跨類
4.protected: 受保護的 只能在它的類和它的派生類(繼承的子類)中訪問,可跨程序集
5.protected internal: 只能在本类,派生类或者包含该类的程序集中访问
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Statements1 { public class Class1 { internal String strInternal = null; public String strPublic; internal pretected String strInternalProtected = null; } } using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Statements1 { class Class2 { private String tmpStr = new Class1().strInternal; private String tmpStr = new Class1().strInternalProtected; private String tmpStr = new Class1().strPublic; } } /* class2類可以訪問到Class1的三個成員,因為他們在同一個程序集statement1里 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Statements2 { class Program { class Class3:Class1 { public Class3() { base.StrInternalProtected; base.StrPublic; } } } } /* class3類無法訪問到class1的strInternal成員,因為他們不是同一個程序集,但是可以訪問到strInternalProtected,因為Class3是class1 的繼承類 */