文档介绍:第7章类和对象
类的声明
类由类头和类体两部分组成。声明一个类的格式为:
attributes 类修饰符 class 类名: 基类类体
其中attribute、基类、类体是可选的。
类的概念
特性(attribute):是C#新的成分,,如类型、字段、方法和属性,并附加新的特征。.NET Framework的MSIL和CLR支持attribute。
类的声明
类修饰符有:abstract、public、protected、internal、private、new、sealed。一个类声明可以包含多个类修饰符,但是不能重复。类修饰符:abstract用来指示该类是抽象类,抽象类是一种没有完全实现的类,它不能产生对象,只能被继承;修饰符public、protected、private、internal是访问控制符,用来规定外界调用该类成员权限;new用作类修饰符只能修饰嵌套的类,具有隐藏同名成员的作用;sealed修饰符指出该类是最终类,即,不能被继承。
class:是关键字,是声明类的必须的符号。
类名:是类设计者指定的标识符。
基类:如果正在定义的类需要从另一个类中继承所有的成员,被继承的类就是基类,引入基类时,在类名和基类之间加上冒号运算符“:”,接口也是一种基类。
类体:包括类的数据成员、表现这些成员行为的方法、以及成员的修饰符,类体中的所有内容置于一对大括号“{”和“}”之间。
类的成员(1)
常量
用const关键字声明常量的形式为:
修饰符 const 类型常量名= 常量表达式;
常量字段有如下特点:
常量必须在声明的同时初始化,所以常量表达式必须是能够在编译时计算确定的值
常量只能一次赋值,以后不能改变
常量的类型可以是简单类型、枚举类型、string类型和非string的其它引用类型(但是值只能是null),结构不能是常量
常量是隐式的静态成员(但不能用static修饰),也就是说,常量字段属于类而不属于对象,使用常量需要用“”这样的形式
类的成员(2)
实例字段和静态字段
C#中有两种字段,属于具体对象的实例字段和属于类的静态字段。字段默认为实例字段。
假设有一个类X,X中有一个实例字段t,一个静态字段s;从X产生100个对象,那么每个对象都有一个字段t,存储器中有100个t,但是100个对象共享1个静态字段s,存储器中只有1个s。
静态字段要用关键字static声明,例如:static int Total;
静态字段属于类,所以使用静态字段要用“”这样的形式。
C#中还有其它静态成员,例如静态方法,static修饰的成分的作用和用法.
静态字段能被静态方法和实例方法所访问。
类的成员(3)
只读字段
只读字段用关键字readonly声明,顾名思义,这样的字段是只可读出,不可写入的,这一点和常量相同。
对只读字段赋值只能在如下情况下进行:
声明只读字段的同时初始化
在构造函数和静态构造函数中初始化
在上述的情况下甚至可以多次赋值,除此以外,只读字段只能读出不能修改了。也不能将它们用作out参数或者ref参数。如果只读字段没有初始化,就自动赋以默认值。
只读字段和常量的差别:
只读字段不具备static特征,只读字段属于实例。
只读字段可以在运行阶段确定值,常量是在编译阶段确定值,因此可以用变量表达式对只读字段赋值。
只读字段可以是任何类型。
const可以修饰局部变量,但readonly不能修饰局部变量。
对象
类中除了常量以外,其它数据成员只有类型,但没有具体的数据,表现这些数据的行为的方法,也没有用武之地。当类中的数据有了具体的值以后,就形成了对象,类中的方法也有了运行的基本条件,所以对象是类的实例。不同的对象具有不同的对象名和仅仅属于自己的数据。
逻辑上,对象拥有自己定义的数据成员和方法以及所有继承得到数据成员和方法,但是物理上:对象名是存储在栈中的,对象的数据是在堆中的,而方法是存放在代码区中的,类的方法和类在一起,为该类的所有对象共享,这样保证了一个类的所有对象的行为的一致性。一个对象必须拥有自己的对象名和数据,但是完全没有必要拥有一份代码的拷贝。
一个类可以产生许多对象,类的生命期和对象的生命期是不同的,不同的对象可能有不同的生命期。
调用对象的成员的形式为:
构造函数
构造函数又称构造方法,C#的构造函数有两种:实例构造函数和静态构造函数,实例构造函数初始化对象