前言
由于好多次都遇到了这个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();
}
}
小结
上面的东西,其实很简单,但是由于个人傻傻分不清楚,所以总结了一下,希望有其他观点的同胞们一起交流。
感谢您的宝贵时间···