我们知道,一个类的方法从调用方式上可以分为“静态方法”与“非静态方法”(实例方法)。在.net框架中,也有很多这种公共静态方法。现在我想讨论一下,一个类为什么要提供静态方法以及在什么时候应该提供静态方法。 静态方法与非静态方法最明显的区别就是如果某个方法是公共静态的,那么可以直接 通过类名.方法名的方法来调用,而公共实例方法则需要事先实例化对象,然后才能调用。很多人认为静态方法来速度上、在内存占用比值上要比实例方法快和多, 这一点我不认同。方法执行的快与慢在同等条件下主要决定于所要进行的操作,而静态方法要比实例方法占用更多的内存这一点更是毫无根据。一个类型加载的时 候,该类的所有的方法都会被加载,不管是不是静态的,所以如果你认为静态方法要比实例方法占用更久的内存,这一点也是不对的。 一个类为什么会提供静态方法呢?我们知道静态的东西是与类相关的,非静态的东西 是与具体的类实例相关的。这两者有什么差别?差别在于“静态方法”更通用,而“实例方法”是受限制的。为什么这样说?假设有一个会员类,该类要有删除会员 的功能,那么你可能最少也要提供两上删除方法,一个是删除当前实例所对应的会员,一个是删除指定的会员。前者是与具体实例相关的,后者则不与具体实例发生 关系。问题就在这里(为什么要提供两个删除会员的方法)。你当然可以用这个删除方法既删除当前实例所对应的会员,也可以用这个方法删除任一指的会员。可是 如果从面向对象的设计方法上考虑,会员张三有权利去删除会员李四吗?你高兴时可以将自己的笔记本送给别人,你能把我的笔记本送给别人吗?当然不行,因为我 的笔记本是我的,不是你的,你没有权利这样做。会员张三可以调用自己的删除方法把自己删除,而要删除会员李四的时候,要不将会员李四实例化了后让李四调用 李四自己的删除方法,要不,就由会员类来删除会员李四,反正张三是不能把李四给删除掉,在现实世界中,这是符合逻辑的。所以一个类里就有了与类相关的静态 方法,别认为静态方法什么速度快、调用方便就提供了静态方法,不是这样子的。 我的例子可能不是很合适,但我相信我要表达的意思已经很清楚了。在什么时候要提供静态方法,有这么一个原则(是我总结的),那就是如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的。 以上文字纯属个人见解,误导不负责 静态字段一旦赋值就要等到程序关闭才释放...... |
静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。
探究
public static class StaticTestClass
{
public static int n = 0;
public static void Add()
{
n++;
}
}
- 网页 P1.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
- 网页 P2.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
- 访问者 V1 从客户端 C1 访问 P1.aspx,此时输出为 1。
- 访问者 V2 从客户端 C2 访问 P2.aspx,此时输出为 2。
- 访问者 V1 关闭浏览器,重新打开访问 P1.aspx,此时输出为 3。
只要 StaticTestClass 没有被重新编译,即使 P1.aspx、P2.aspx 被重新编译,每当调用 StaticTestClass.Add(),n 都会在前一个次的基础上加 1。
原则
- 静态类中的所有成员必须是静态的。
静态构造函数
- 静态类可以有静态构造函数,静态构造函数不可继承。
- 静态构造函数可以用于静态类,也可用于非静态类。
- 静态构造函数无访问修饰符、无参数,只有一个 static 标志。
- 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。