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、静态构造函数不能被手动调用。
类的成员第一次被访问的时候,自动执行。
静态构造函数只执行一次,在类的成员第一次被访问的时候自动执行。