什么是静态
static静态的,不变的,在某个类中只有一个,不会因实例化对象的不同而不同。static可以修饰类、字段、属性、方法 等。如一个方法前加上static修饰后要对其进行调用可以直接通过类名点出来,不用再对类进行实例化
静态类
- 只能包含静态成员(静态方法或静态变量),非静态成员是不能使用的,而非静态类可以包含静态的方法、字段、属性或事件,且无论对这个非静态类创建多少个实例,它的静态成员都只有一个。
- 不能对其实例化。
- 不能被继承,因为静态类本质是一个抽象的密封类。
- 不能包含实例构造函数。
静态变量
- static只能修饰成员变量,不能修饰局部变量。
- 表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值。
- 静态变量一直记录变量的值,一直到下次赋值时。
- 不同线程下访问的静态属性总是同一属性,如果某一线程更改了属性值,将造成其他线程访问属性值的错误。因此方法中访问同一静态属性就需要使用lock关键字,或创建互斥对象来保持静态属性在同一时间只能被某一对象的属性或方法 访问。
- 静态成员只被创建一次,所以静态成员只有一份,而实例成员有多少个对象,就有多少个成员。
静态方法
- 在方法(函数)前用static修饰,表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有。
- 在静态方法中只能直接调用同类中其他的静态成员(包括变量和方法), 而不能直接访问类中的非静态成员。
- 每一个线程在同一时间访问的静态方法都是不同的,因此静态方法在多线程调用中不会产生冲突。
- 在静态方法中不能直接调用实例成员,因为静态方法被调用时,对象还有可能不存在。
- this/base关键字在静态方法不能使用,因为有可能对象还不存在。
- 静态方法只能被重载,不能被重写,因为静态方法不属于类的实例成员。
静态构造函数
- 静态类可以有静态构造函数,静态构造函数不可继承。
- 可以用于静态类,也可用于非静态类。
- 无访问修饰符、无参数,只有一个static标志。
- 不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
什么时候适合用static修饰
1. 当变量需要被共享时可以将变量定义为静态变量。
2. 当方法需要被反复调用时可以将方法定义为静态方法。
3. 当一个类中包含的成员都是静态时可以将类定义为静态类。
使用static时需要注意的地方
- 静态类中的所有成员也必须是静态。
- 非静态类中的成员可以是静态也可以是非静态
- 一个静态的函数内部只能使用该函数外部的静态成员。
- 一个类中的公开静态成员,在另外一个类中通过直接使用类名点的形式调用这个成员。