一、实例成员与静态成员
在上一篇文章中,将成员按照作用,分为数据成员和函数成员。从另一个角度——成员的生存期(或者说作用域、存在性),可以将成员分为实例成员与静态成员。
1.实例成员
实例成员是和类的实例关联的,类的每个实例都拥有自己的各个类成员的复制。实例成员随着实例的创建而创建,随着实例的销毁而销毁。默认情况下,成员都是实例成员,被关联到一个实例。实例成员使用"实例名.成员名”访问。
2.静态成员
静态成员是和类本身相关联的类成员,他们被类的所有实例共享,所有实例都访问同一内存位置。静态成员的生存期也是与类本身相关的,只要类声明完成就可以访问,它的存在性与实例无关。要声明一个静态成员,需要在成员类型之前使用static修饰符。静态成员使用“类名.成员名”的方式访问。
二、实例字段
1.实例字段的声明与访问
我们常说的字段,默认的就是实例字段。实例字段就是声明在类中、隶属于类的变量。
下面是一个实例字段的例子,注意:实例d2.Member的值的改变对d1.Member的值没有影响,因为他们属于不同的实例,d1和d2都有类字段Member的复制。
1 class D 2 { 3 // 声明一个整型实例字段 4 public int Member; 5 } 6 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 D d1 = new D(); 12 D d2 = new D(); 13 d1.Member = 1; 14 d2.Member = 2; 15 Console.WriteLine("d1.Member = {0},d2.Member = {1}", d1.Member, d2.Member); 16 } 17 }
2.字段的初始化
1).显式初始化
显式初始化就是在字段声明的同时使用初始化语句(求值表达式)为字段赋初值,而且该初始值必须是编译器可以确定的。
1 class D 2 { 3 // 显式初始化 4 public int Member = 10; 5 public string Member1 = "haha"; 6 7 }
2).隐式初始化
如果在字段声明的时候没有初始化语句,那么字段的值就是编译器为它根据字段的类型分配的默认值。值类型的默认值都是0,bool类型的默认值是false,引用类型的默认值是null。
1 class D 2 { 3 4 // 隐式初始化 5 public int x; // x = 0 6 public Person p; // p = null 7 8 9 }
三、静态字段
1.静态字段的声明与访问
静态字段与实例字段的主要区别主要在于存储位置与作用域方面,而声明方式相差不大。使用static关键字作为修饰符就可以声明一个静态字段。
1 class D 2 { 3 // 实例字段 4 public int M1; 5 //静态字段 6 public static int M2; 7 }
2.静态字段示例
1 class D 2 { 3 public int Member; 4 // 实例字段 5 public int M1; 6 // 静态字段 7 public static int M2; 8 9 public void OutPut() 10 { 11 // 在类的内部,访问静态成员与访问实例成员一样 12 Console.WriteLine("M1={0},M2={1}", M1, M2); 13 } 14 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 // 创建类的一个实例 7 D d3 = new D(); 8 9 // 实例字段通过"实例名.字段名"进行访问 10 d3.M1 = 5; 11 // 静态字段通过“类名.成员名”进行访问 12 D.M2 = 10; 13 d3.OutPut(); 14 15 16 } 17 }