• 静态


    一、静态成员

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

     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.

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

  • 相关阅读:
    [USACO08JAN]牛大赛Cow Contest
    [USACO07NOV]牛栏Cow Hurdles
    [USACO09JAN]最好的地方Best Spot
    [USACO08OPEN]寻宝之路Clear And Present Danger
    [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)
    bzoj4009: [HNOI2015]接水果(整体二分)
    【bzoj2141】排队 [国家集训队2011]排队(树套树)
    洛谷P4689 [Ynoi2016]这是我自己的发明(树上莫队+树链剖分)
    【bzoj3083】遥远的国度(树链剖分+线段树)
    CF311B Cats Transport(斜率优化)
  • 原文地址:https://www.cnblogs.com/wesley168/p/6383461.html
Copyright © 2020-2023  润新知