深入理解“类”

类成员

类的成员除了字段方法以外,还有很多。它们可以分为两类:

数据成员(保存数据)

字段、常量

函数成员(执行代码)

方法、属性、运算符、索引、事件、构造函数、析构函数

类成员修饰符的顺序

类成员的声明语句格式如下(无论字段还是方法):

[特性] [修饰符] 核心声明
  • 特性:特性必须放在修饰符和声明前面,可以有多个,任意顺序。
  • 修饰符:修饰符可以有多个,任意顺序。

方括号中这两部分是可选的。

例如下面代码:

1
2
3
4
5
[Serializable]
public class MyClass
{
    ...
}

方括号中的[Serializable]就是特性,public是修饰符。 例如,publicprivate都是修饰符,因此他们的顺序可以随意互换。

public static int MaxVal;
static public int MaxVal;

这两句都可以,完全一样。 所以,字段和方法这两种类成员的声明格式可以总结如下: 字段声明格式:

[特性] [修饰符] 类型 字段名称;

方法声明格式:

[特性] [修饰符] 返回类型 方法名称 (参数列表) { 方法体 }

实例类成员和静态类成员

类成员可以关联到一个类的实例,也可以关联到类的整体。前者称为实例类成员,后者称为静态类成员。

所谓实例类成员,就是将类实例化后,这个成员就只属于这个实例化,也就是说这个类的实例拥有每一个实例类成员的副本。

静态字段

静态字段被该类的所有实例共享,所有实例都访问同一内存位置,如果该内存的值被改变了,那么对所有实例中的该静态字段来说也都改变了。静态字段用static修饰符声明:

1
2
3
4
5
Class D
{
    int Val1; //实例类成员
    static int Val2; //静态类字段
}

对于静态成员来说,由于没有对应实例的副本,所以如果从类的外部访问,必须使用类名(而不是实例名)和点运算符。继续上面的代码:

1
2
3
4
5
6
7
D dealer = new D(); //创建一个D类的实例dealer

//如果要访问实例类成员Val1,那么
dealer.Val1 = 10;

//如果要访问静态字段Val2,那么
D.Val2 = 15;

静态成员的生存期

实例类成员一但实例销毁也就不存在了,而静态成员则会一直存在。

静态函数成员

静态函数主要是指静态方法,是执行代码。与静态字段一样,不需要实例化就可以调用。需要注意的是

静态方法不能访问实例成员,只能访问其他静态成员

其它静态成员

数据成员中的常量不能声明为static。

函数类成员中索引器不能声明为static。

<未完待续>

留言