CH11_静态


本章目标

  • 掌握静态类的使用

  • 掌握静态字段、属性的使用

  • 掌握静态方法的使用

  • 掌握静态构造函数的使用

静态类

概述

静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。

主要特性

1.仅包含静态成员。

2.无法实例化。

3.静态类的本质,是一个抽象的密封类,所以不能被继承,也不能被实例化。

4.不能包含实例构造函数。

5.如果一个类下面的所有成员,都需要被共享,那么可以把这个类定义为静态类。

6.使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员,编译器将保证不会创建此 类的实例。

7.C#编译器会自动把它标记为sealed。这个关键字将类指定为不可扩展;换言之,不能从它派生出其他类。

静态类与私有构造函数的区别

1.私有构造器方式仍然可以从类的内部对类进行实例化,而静态类禁止从任何地方实例化类,其中包括从类自身内部。
2.使用私有构造器的类中,是允许有实例成员的,编译器不允许静态类有任何实例成员。

案例1:静态类的定义与使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static class StaticClass
{

//public int num1; //报错

public static int num2;

//public void Fun1() { } //报错

public static void Fun2() {
Console.WriteLine("调用了Fun2()");
}

//StaticClass() { } //报错

static StaticClass()
{
Console.WriteLine("调用了静态构造函数StaticClass()");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
class Program
{
static void Main(string[] args)
{

StaticClass.num2 = 5;
StaticClass.Fun2();


Console.ReadLine();
}
}

静态字段、属性

概述

静态字段既可以属于静态类,也可以输入非静态类。

主要特性

1、通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。

2、静态成员只被创建一次,所以静态成员只有一份,实例成员有多少个对象,就有多少份。

3、类加载的时候,所有的静态成员就会被创建在“静态存储区”里面,一旦创建直到程序退出,才会被回收。

4、变量需要被共享的时候,方法需要被反复调用的时候,就可以把这些成员定义为静态成员。

5、非静态类可以包含静态的方法、字段、属性或事件;

6、无论对一个类创建多少个实例,它的静态成员都只有一个副本;

7、虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。这样的字段属于类,不属于类的实例。

静态类中

1
2
3
4
5
6
7
8
9
static class StaticClass
{
public static int num1;

public const int num2 = 5;

public static int num3 { get; set; }

}

非静态类中

1
2
3
4
5
6
7
8
class EntityClass
{
public static int num1;

public const int num2 = 5;

public static int num3 { get; set; }
}

静态方法

概述

静态字段既可以属于静态类,也可以输入非静态类。

主要特性

1.静态方法是不属于特定对象的方法,

2.静态方法可以访问静态成员变量,

3.静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变 量做为参数传给静态方法。

4.静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。

5、在静态方法中,不能直接调用实例成员,因为静态方法被调用的时候,对象还有可能不存在。

6、this/base 关键字在静态方法中不能使用,因为有可能对象还不存在。

7、在实例方法中,可以调用静态成员,因为这个时候静态成员肯定存在。

8、静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量;

9、静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;

案例2:测试静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class EntityClass
{
public static int num1;

public const int num2 = 5;

public static int num3 { get; set; }

public int num4 = 10;


/// <summary>
/// 实例方法
/// </summary>
public void Fun1()
{
Console.WriteLine(num1);//实例方法能访问静态成员
Console.WriteLine(num2);//实例方法能访问常量成员(默认是静态)
Console.WriteLine(num4);//实例方法能访问实例成员
}

/// <summary>
/// 静态方法
/// </summary>
public static void Fun2()
{
Console.WriteLine(num1);//静态方法能访问静态成员
Console.WriteLine(num2);//静态方法能访问常量成员(默认是静态)
//Console.WriteLine(num4);//静态方法不能访问实例成员
}
}

静态构造函数

概述

使用static修饰的构造函数。

主要特性

1.静态类可以有静态构造函数,静态构造函数不可继承;

2.静态构造函数可以用于静态类,也可用于非静态类;

3.静态构造函数无访问修饰符、无参数,只有一个 static 标志;

4.静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。

案例3:静态构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static class StaticClass
{
public static int num1;

public const int num2 = 5;

public static int num3 { get; set; }


static StaticClass()
{
Console.WriteLine("调用了静态构造函数");
}

public static void Fun1()
{
Console.WriteLine("静态方法Fun1()");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
class Program
{
static void Main(string[] args)
{

StaticClass.num1 = 5;
StaticClass.Fun1();


Console.ReadLine();
}
}

课后作业

1.略