前言
由于好多次都遇到了这个static关键字,概念还是模糊的不行不行的,终于还是有勇气从头到尾去理清一下下。这个关键字我第一次见它是在大话设计上那个单例模式里面,主要应用了一个类里面有一个静态方法,设置这个方法为静态的原因,就是为了保证全局只有一个实例访问点。下面我要说的是一些特别简单的不能再简单的,但是保证你看了你就懂了,它到底有什么作用。
内容
Static
首先静态的东西,在内存中的存放是在data segment里面的。也就是说,这里面的内存块和程序的声明周期是一样的,也就是说程序结束的时候,这部分的内存才会得到释放。
静态成员变量
程序刚刚开始运行的时候或者刚刚开始调用它的时候,进行第一次的初始化,而后直到程序结束都不在进行初始化了。
静态方法
这个不用通过实例化对象来调用这个方法,该方法可以通过方法外面的类名直接调用得到。不用实例化一个对象,增加堆区的内存负担,而且减少了类与类之间的耦合依赖。
静态类
这个和静态方法其实原理是一样的,一般我们不需要将类进行static修饰,因为静态类下面的每个方法都是static的(需要自行在方法前面加上static关键字)。
实践
下面我写了一个小的demo来说明这些会用什么不同:
- 静态成员变量和普通变量:
public class Class1 { static int a;//静态成员变量,程序调用的时候进行初始化,生命周期等同于程序运行周期 public void BackNum0() { //普通变量,调用方法的时候进行初始化 int b = 0; for (b = 0; b < 3; b++) { a = a + 1; Console.WriteLine(a); } } public void BackNum1() { //普通变量,调用方法的时候进行初始化 int d = 0; int c = 0; for (c = 0; c < 3; c++) { d = d + 1; Console.WriteLine(d); } } }
- 采用多线程进调用:
class Program { static void Main(string[] args) { //由于类里面的方法不是静态的,所以调用类里面的方法需要进行实例化操作。 Class1 ob1 = new Class1(); //调用方法中,调用了静态成员变量 Thread thread1 = new Thread(ob1.BackNum0);//采用了委托原理,将要执行的方法作为参数赋给了其他线程 Thread thread2 = new Thread(ob1.BackNum0); //运行结果对静态成员变量进行了叠加,由于有两个线程运行,则很可能会出现多种情况 thread1.Start(); thread2.Start(); //调用方法中,未调用静态成员变量 ob1.BackNum1();//运行结果为:123 ob1.BackNum1();//运行结果为:123 Console.ReadLine(); } }
- 多线程运行效果(以后用到多线程的时候,需要考虑static效果)
- 静态方法
class Class2 { public static void BackNum2() { int n = 0; int m = 0; for (n = 0; n < 3; n++) { m = m + 1; Console.WriteLine(m); } } }
- 调用结果
class Program { static void Main(string[] args) { //不用实例化类,即可用类名直接调用静态成员方法; //调用方法中,未调用静态成员变量 Class2.BackNum2();//运行结果为123 Class2.BackNum2();//运行结果为123 Console.ReadLine(); } }
- 静态类
//这里需要注意,当一个类是静态类的时候,需要对其里面的方法添加static修饰符 public static class Class3 { public static void BackNum3() { int j = 0;//普通变量 int i = 0;//普通变量 for (i = 0; i < 3; i++) { j = j + 1; Console.WriteLine(j); } } }
- 调用
class Program { static void Main(string[] args) { //调用静态类中的静态方法,不用实例化 Class3.BackNum3();//运行结果为123 Class3.BackNum3();//运行结果为123 Console.ReadLine(); } }
小结
上面的东西,其实很简单,但是由于个人傻傻分不清楚,所以总结了一下,希望有其他观点的同胞们一起交流。
感谢您的宝贵时间···