C# 静态成员

C# 静态成员  
 
关于实例成员
       没有被static修饰的成员叫做实例成员。实例成员是属于对象的。通过对象名去访问实例成员。
  • 在创建对象的时候,实例成员跟随着对象一起创建在堆中。
  • 跟着对象一起创建在堆空间中。
  • 有多少个对象,实例成员就有多少份。
  • 对象被回收,这个对象中的实例成员就跟随着一起回收。
 
关于静态成员
  被static修饰的成员,叫做静态成员。静态成员是属于类的。通过类名直接访问。
  • 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当中。
  • 静态成员既不在栈也不在堆中。创建在静态存储区。
  • 静态成员只创建一次,在类第一次被访问的时候创建。
  • 静态成员一旦被创建在静态存储区,那么就不会被回收,直到程序结束。
 1  class Person
 2     {
 3         //静态成员
 4         public static int Age;
 5         //实例成员
 6         public string Name;
 7     }
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             //静态成员属于类,直接通过 类名.静态成员 来访问
13             int age = Person.Age;
14 
15             //实例成员属于对象,需要通过 对象名.实例成员 来访问
16             Person p = new Person();
17             p.Name = "Jack";
18 
19         }
20     }

 

 
 
静态成员的特点
  • 只有一份。变量唯一,无论在什么地方访问都是可以访问的
  • 一旦创建在静态存储区,就不会被回收,直到程序结束。
当类第一次被访问的时候,该类下面的所有静态的成员都会被加载。实例成员有多少对象,就会创建多少对象。而静态成员只会在静态存储区中创建一次,直到程序退出时才会被释放。看如下代码:
 1     class Person
 2     {
 3         //静态成员
 4         public static int Age;
 5         //实例成员
 6         public string Name;
 7 
 8         public Person()
 9         {
10             Age++;
11         }
12     }
13     class Program
14     {
15         static void Main(string[] args)
16         {
17             Person p1 = new Person();
18 
19             Person p2 = new Person();
20 
21             Console.WriteLine(Person.Age);
22         }
23     }

Person类中有静态成员Age,实例成员Name,构造函数中为静态成员Age做自增操作。Main函数里面创建了2个Person对象,最后打印Person的Age的值。这时候Age的值会是多少呢?结果为2,因为静态成员被共享,所以创建的2个对象都同享同一个静态成员,实例化person对象的时候调用构造函数,而构造函数里面为静态成员Age做自增操作,Main函数创建了2个对象,所以Age为2。我们来看下这时候内存里面的情况。

 
  • 在静态方法中不能直接访问实例成员。因为当静态方法执行的时候,实例成员完全有可能还没有存在。如果一定要访问,那么我们就创建一个对象,让实例成员存在,然后访问这个对象的实例成员。
  • this关键字不能在静态方法中使用:因为静态方法不存在对象中,那么自然也就代表不了对象。
  • 静态成员总是优先于对象而存在的。
  • 实例方法中可以直接访问静态成员,因为当实例方法存在的时候,静态成员一定存在了。
 
静态类
  • 类如果被static修饰,那么这个类就叫做静态类。
  • 静态类中的所有成员要求都是静态成员
  • 静态类不能创建对象。因为没有实例成员,就算可以创建对象,也没有任何的实际意义。
  • 静态类不能有构造函数
 
静态构造函数(也是用来实例化静态成员)
     a、任何类都可以有静态构造函数。
     b、语法:
           static  类名()
          {
           
           }
     静态构造函数不能有访问修饰符,不能带参数。
     c、静态构造函数不能被手动调用。
          类的成员第一次被访问的时候,自动执行。
          静态构造函数只执行一次,在类的成员第一次被访问的时候自动执行。
      
     
posted @ 2015-08-09 23:06  Chen_Weifeng  阅读(2468)  评论(0编辑  收藏  举报