C#关键字static如何使用,在什么情况下使用?
C#中static关键字如何使用,在什么情况下使用?一个月以前在上java课程的时候,老师讲到了static的基础用法,但是后来忘了,昨天突然想到了,就查阅了大量的资料,发现有些资料讲的就特别啰嗦,所以就讲各种各样的说法试了一下,总结出了这篇含金量比较高的文章,希望会对您有一些帮助。一、先来了解static的中文意思从上图可以看出,static是静止的,不动的意思二、在C#中的意思static是
C#中static关键字如何使用,在什么情况下使用?
一个月以前在上java课程的时候,老师讲到了static的基础用法,但是后来忘了,昨天突然想到了,就查阅了大量的资料,发现有些资料讲的就特别啰嗦,所以就讲各种各样的说法试了一下,总结出了这篇含金量比较高的文章,希望会对您有一些帮助。
一、先来了解static的中文意思
从上图可以看出,static是静止的,不动的意思
二、在C#中的意思
static是静态的的意思,既然是静态的,就是不变的意思,而不变就是它不会因为类中实例化对象的不同而不同,它在类中永远只有一份就像中国人有许多,但是我们这么多人只有一个国家——中国。
static可以修饰类、字段、属性以及方法。标记为static的就不用创建实例来调用了,如果外部要对其进行调用,可以直接通过(类名.方法名)来调用,内部就可以直接通过方法名调用。
三、由static修饰的归属问题
被static修饰的不管是变量还是方法,都属于类直接管理,所以类中所有的方法(静态和实例的方法)都可以调用他们。举个例子吧,就不如:一个公司的打印机,它是属于公司公共的物品,而不是说属于哪个部门哪个人的,公司里的所有人员(实例)都有权去使用这个公共的打印机。
例如:
class Program1
{
static int i;
static void main() { //被static修饰的方法,被称为静态方法
Console.WriteLine(i);
}
public void Ak() { //Ak是实例方法
Console.WriteLine("aaaaa");
main();//实例方法可以调用静态方法main();
}
}
四、static修饰的范围
1、类
static可以修饰类,使类成为静态类。这样在此类中只能定义静态的方法和静态的变量
(1)静态类和非静态类的区别
静态类和非静态类最重要的区别在于静态类不能被实例化,也就是说不能使用new关键字创建静态类类型的变量。
在声明一个类时使用static关键字,具有两方面的意义:第一:它防止程序员写代码来实例化该静态类;第二,它防止在类的内部声明任何实例字段或方法,也就是说静态类中的字段方法必须为静态的而不是实例的。
(2)静态类的特征
- 静态类中只能包含静态成员,其他实例成员一律不行
- 静态类无法通过new关键字的方法实例化
- 静态类的本质,是一个抽象的密封类,所以不能作为基类用来继承
- 不能包含实例构造函数
- 如果一个类下的所有成员都需要被共享,就是供其他类使用,那么就可以把这个类定义为静态类
2、变量
static可以修饰变量,注意:这个变量只能是成员变量,而不能是局部变量
静态成员变量的特点:
- 静态成员变量是属于类的,类被加载时初始化,并且有默认初始值(实例成员变量属于对象,在每个对象被创建时初始化,每个对象一份)
- 存在优先于对象,被所有对象所共享,常驻内存
3、方法
static可以修饰方法,Main方法必须用static修饰,因为它是与程序共存亡的,是程序的入口和程序的大门
静态方法的特点:
- 静态方法是不属于特定对象的方法
- 静态方法可以直接访问静态成员(包括静态字段、静态方法)
- 静态方法不可以直接访问实例成员,并且静态方法也不能直接调用实例方法
例子1:
class Program1
{
int i;//正确,成员变量有默认初始值
public void Bb(/*tatic string str */)//错误,形式参数不能使用static修饰
{
// int c;//错误,局部变量需要手动赋值,才能使用
//static int a;//错误,局部变量不能使用static修饰
}
}
例子2:
static class Program1
{
int i;//错误,静态类中只能定义静态成员变量
public void Bb()//错误,静态类中只能定义静态成员方法
{
}
}
4、构造函数
static可以修饰,使构造函数成为静态构造函数。并且不能在再使用其他修饰符,并且不能是实例构造函数
静态构造函数的特点:
- 静态类可以有静态构造函数,也就是说静态类中的构造函数只能是静态的,并且不可继承
- 静态构造函数没有访问修饰符,没有参数,只有一个static修饰符
- 在非静态类中也可以有静态构造函数,并且,静态构造函数在,非静态类在实例化之前要被自动执行,并且速度要比实例化后调用的构造函数要快
- 静态构造函数只执行一次
例子:
class Program1
{
static Program1()//静态构造函数
{
Console.WriteLine("静态构造函数被执行");
}
public Program1()//非静态构造函数
{
Console.WriteLine("非态构造函数被执行");
}
}
//外部调用
static void Main(string[] args)
{
Program1 p = new Program1();
Console.ReadLine();
}
输出结果:
五、static修饰的调用
1、在本类里调用由static修饰的方法和变量,可以直接使用
class Program1
{
static int i;//定义静态成员变量
static public void Bb()//定义静态成员方法
{
Console.WriteLine(i);
main();
}
static void main()
{
Console.WriteLine("我是成员方法main");
}
}
2、在外部类中调用static修饰的方法和变量,需要(类名.方法名或变量名)
//本类中
class Program1
{
static public int i;//定义静态成员变量
static public void Bb()//定义静态成员方法
{
Console.WriteLine(i);
}
static public void main()
{
Console.WriteLine("我是成员方法main");
}
}
//外部类调用
class Program
{
static int i;
static void Main(string[] args)
{
//直接类名.方法名或者变量名调用
Console.WriteLine(Program1.i);
Program1.main();
Program1.Bb();
}
}
六、什么情况下使用static修饰
- 当变量需要共享时,可以将变量定义为静态变量
- 当方法需要被反复调用时,可以将方法定义为静态方法
- 当一个类中包含的成员都是静态时,可以将类定义为静态类
本篇文章详细讲解了static修饰符的用法,希望对各位朋友有所帮助。也许有些朋友会觉得我总结的不太完善或者有不对的地方,还请各位朋友能够指点迷津,指出我的错误,不要让我恶性循环了,哈哈哈,就跟大家说到这里吧,我会不定时更新博文的,还请各位朋友能多多支持,谢谢大家!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)