静态

一、静态成员

目前人类都生活在地球上,所以如果给人加个居住星球这个属性的话,每个国家的人都是相同的。所以我们在实例化每个类的时候,都要重复的设置,这很麻烦,我们完全可以在父类中统一设置。如代码:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //Chinese c = new Chinese();
 6             //c.LivePlanet = "地球";
 7             //Japanese j = new Japanese();
 8             //c.LivePlanet = "地球";
 9             Person.LivePlanet = "地球";
10         }
11     }
12 
13     public class Person
14     {
15         public static string LivePlanet { get; set; }
16     }
17 
18     public class Chinese:Person
19     {
20         public string Name { get; set; }
21         //public string LivePlanet { get; set; }
22     }
23 
24     public class Japanese:Person
25     {
26         public string Name { get; set; }
27         //public string LivePlanet { get; set; }
28     }
View Code

注意:

1.非静态类中可以有静态成员,也可以有实例成员。但是静态类中所有的成员都是静态的。

2.静态成员中必须是静态的,比如静态方法中的变量也必须是静态的,因为静态成员在使用的时候,没有实例化,所以静态成员的中实例变量无法调用。

3.静态类可以直接调用里面的成员,因此静态类实例化没有实际意义。所以设计时规定静态类不能实例化。

4.静态和多态是相反的。不能继承。

难点:静态类构造函数

1.静态构造函数的特点:

  • 静态构造函数只能被调用一次,并且是在第一次使用静态类之前调用(先初始化再试用)。
  • 没有访问修饰符(因为它是自动调用的。)
  • 没有参数,不能重载(没有参数自然不能重载)。(因为是自动调用的,所以不能重载。)
  • 实例类中如果有静态成员,并且初始化了,就会自动生成静态构造函数。静态类中不管有没有初始化静态成员,都会自动生成。

2.实例类中有静态构造函数,实例构造函数的执行过程

因为静态成员在第一次使用的时候先要初始化,所以先执行类中的静态成员(先字段后构造函数),然后执行实例类的构造函数。例子如下:

 1   class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //TestStaticClass.SayHi();
 6             //TestStaticClass.Name = "张三";
 7 
 8             //Chinese.age = 1;
 9             Console.WriteLine(Chinese.age);
10 
11             Chinese.Calc1();
12             Console.WriteLine(Chinese.age);
13 
14             Chinese c = new Chinese();
15             c.Calc2();
16             Console.WriteLine(Chinese.age);
17 
18             Console.ReadKey();
19         }
20     }
21 
22     
23     public class Person
24     {
25         //public static string LivePlanet { get; set; }
26     }
27 
28     public class Chinese
29     {
30         public static int age = 12;
31         public string Name { get; set; }
32         //public string LivePlanet { get; set; }
33 
34         static Chinese()
35         {
36             age++;
37         }
38 
39         public Chinese()
40         {
41             age++;
42         }
43 
44         public void Show()
45         {
46             Console.WriteLine("我是中国人!");
47         }
48 
49         public static void Calc1()
50         {
51             age++;
52         }
53 
54         public void Calc2()
55         {
56             age++;
57         }
58     }
View Code

上面的代码输出的结果依次是13,14,16.  因为前面在输出13,14的时候,已经运行过静态构造函数,所以最后一个结果是16,而不是15.单独运行14行到16行的代码,输出的结果是15.

当实例类中有静态字段,静态构造函数和实例构造函数,在创建实例类的对象的时候,由于有静态字段,会自动调用静态构造函数,接下来才会调用实例构造函数。并且一定要注意,静态成员只执行一次。

原文地址:https://www.cnblogs.com/wesley168/p/6383461.html