-
C#教程之.NET中的静态与非静态的区别分析
静态类 vs 普通类
静态类与普通类的区别有以下几点:
1)静态类无法实例化而普通类可以;
2)静态类只能从System.Object基类继承;普通可以继承其它任何非static和非sealed类,但也只能继承一个类;
3)静态类不能继承接口;普通类可以继承多个接口;
4)静态类只能包含静态成员;普通类可以包含静态和非静态成员;
5)静态类不能作为字段,方法参数和局部变量使用;普通类可以;
静态类的意义:
可以用静态类封装一组不与任何对象相关联的方法,如Math类,Console类。
静态构造函数 vs 实例构造函数
静态构造函数与实例构造函数的区别有以下几点:
1)静态构造函数属于类,在第一次用到该类时执行且只执行一次;实例构造函数属于对象,在每次初始化一个新对象的时候都会执行;
2)静态构造函数只能定义一次,且不能包含参数;实例构造函数可以定义重载,且可以包含参数;
3)静态构造函数只能访问类型的静态字段;实例构造函数可以访问类型的静态和非静态字段;
4)静态类不能包含访问修饰符,默认为private.
静态构造函数的意义:
设置类型的初始化,例如初始化类型需要的实例对象,为类型的静态字段赋值等。
静态方法 vs 实例方法
静态方法与实例方法的区别有以下几点:
1)静态方法属于类,通过类来调用;实例方法属于对象,通过对象来调用;
2)静态方法不能访问类的非静态成员;
静态方法的意义:
完成一个与特定对象无关的功能。
静态字段 vs 非静态字段
静态字段与非静态字段的区别:
静态字段属于类,通过类来调用;非静态字段属于对象,通过对象来调用。
静态字段的意义:
可以用静态字段来记录一些属于类本身的信息。
代码演示
public class Test
{
public int i = 10;
public static int j = 20;
public int k;
public Test()
{
Console.WriteLine("i is a non-static field, its value is {0}", i);
Console.WriteLine("j is a static field, its value is {0}", j);
}
public Test(int k)
{
this.k = k;
Console.WriteLine("i is a non-static field, its value is {0}", i);
Console.WriteLine("j is a static field, its value is {0}", j);
Console.WriteLine("k is a non-static field, its value is {0}", k);
}
static Test()
{
Console.WriteLine("I am a static constructor, I couldn't contain any parameters!");
Console.WriteLine("I couldn't access to the non-static field i, I can only access to the static field j, the value of j is {0}", j);
}
public void Print()
{
Console.WriteLine("I am a instance method, I can access both the non-static field and the static field!");
Console.WriteLine("The value of i is {0} and the value of j is {1}", i, j);
}
public static void StaticPrint()
{
Console.WriteLine("I am a static method, I couldnt access to the non-static field i, I can only access to the static field j, the value of j is {0}", j);
}
}
运行结果
从运行结果可以看出,在Main方法中创建了两个Test对象,静态构造函数只执行了一次,且先于实例构造函数执行,实例构造函数在两次实例化过程中各执行了一次。同时可以看到我们是通过Test.j来调用的j字段,而i字段和k字段的调用则通过Test的两个对象t1和t2调用。同样的,静态方法StaticPrint也是用Test类来调用,而实例方法Print通过Test类的对象来调用。
Fighting like Allen Iverson! Never never give up!