一、静态成员
目前人类都生活在地球上,所以如果给人加个居住星球这个属性的话,每个国家的人都是相同的。所以我们在实例化每个类的时候,都要重复的设置,这很麻烦,我们完全可以在父类中统一设置。如代码:
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 }
注意:
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 }
上面的代码输出的结果依次是13,14,16. 因为前面在输出13,14的时候,已经运行过静态构造函数,所以最后一个结果是16,而不是15.单独运行14行到16行的代码,输出的结果是15.
当实例类中有静态字段,静态构造函数和实例构造函数,在创建实例类的对象的时候,由于有静态字段,会自动调用静态构造函数,接下来才会调用实例构造函数。并且一定要注意,静态成员只执行一次。