第7章类和对象 集,, ■7.1类的概念 711类的声明 类由类头和类体两部分组成。声明一个类的格式为: attributes类修饰符clas类名:基类类体 其中 attribute、基类、类体是可选的 ■特性( attribute):是C井新的成分,程序员可以通过系统提供的 System Attributes类来创建类似关键字的描述性声明来解释编程元素,如类型 字段、方法和属性,并附加新的特征。 NET Framework的MS和CLR支持 attribute
第7章 类和对象 7.1.1 类的声明 类由类头和类体两部分组成。声明一个类的格式为: attributes 类修饰符 class 类名 : 基类 类体 其中attribute、基类、类体是可选的。 ◼ 7.1 类的概念 ◼ 特性(attribute):是C#新的成分,程序员可以通过系统提供的 System.Attribute类来创建类似关键字的描述性声明来解释编程元素,如类型、 字段、方法和属性,并附加新的特征。.NET Framework的MSIL和CLR支持 attribute
71.1类的声明 ■类修饰符有: abstract、 public、 protected、 internal、 private、new、 sealed一个类声明可以包含多个类修饰符,但是不能重复 类修饰符: abstract用来指示该类是抽象类,抽象类是一种没有完全实现的 类,它不能产生对象,只能被继承;修饰符 public、 protected、 private、 internal是访问控制符,用来规定外界调用该类成员权限;new用作类修饰 符只能修饰嵌套的类,具有隐藏同名成员的作用; sealed修饰符指出该类 是最终类,即,不能被继承。 class:是关键字,是声明类的必须的符号。 类名:是类设计者指定的标识符。 基类:如果正在定义的类需要从另一个类中继承所有的成员,被继承的 类就是基类,引入基类时,在类名和基类之间加上冒号运算符“:”,接 口也是一种基类。 类体:包括类的数据成员、表现这些成员行为的方法、以及成员的修饰 符,类体中的所有内容置于一对大括号“{”和“}”之间
7.1.1 类的声明 ◼ 类修饰符有:abstract、public、protected、internal、private、new、 sealed。一个类声明可以包含多个类修饰符,但是不能重复。 类修饰符:abstract用来指示该类是抽象类,抽象类是一种没有完全实现的 类,它不能产生对象,只能被继承;修饰符public、protected、private、 internal是访问控制符,用来规定外界调用该类成员权限;new用作类修饰 符只能修饰嵌套的类,具有隐藏同名成员的作用;sealed修饰符指出该类 是最终类,即,不能被继承。 ◼ class:是关键字,是声明类的必须的符号。 ◼ 类名:是类设计者指定的标识符。 ◼ 基类:如果正在定义的类需要从另一个类中继承所有的成员,被继承的 类就是基类,引入基类时,在类名和基类之间加上冒号运算符“:”,接 口也是一种基类。 ◼ 类体:包括类的数据成员、表现这些成员行为的方法、以及成员的修饰 符,类体中的所有内容置于一对大括号“{”和“}”之间
7.12类的成员(1) 集,如 7.1.2.1常量 用 const关键字声明常量的形式为: 修饰符 const类型常量名=常量表达式; 常量字段有如下特点 常量必须在声明的同时初始化,所以常量表达式必须是能 够在编译时计算确定的值 ■常量只能一次赋值,以后不能改变 ■常量的类型可以是简单类型、枚举类型、 string类型和非 string的其它引用类型(但是值只能是nu),结构不能是常 量 常量是隐式的静态成员(但不能用 I static修饰),也就是说, 常量字段属于类而不属于对象,使用常量需要用“类名常量 名”这样的形式
7.1.2 类的成员(1) ◼ 7.1.2.1 常量 用const关键字声明常量的形式为: 修饰符 const 类型 常量名 = 常量表达式; 常量字段有如下特点: ◼ 常量必须在声明的同时初始化,所以常量表达式必须是能 够在编译时计算确定的值 ◼ 常量只能一次赋值,以后不能改变 ◼ 常量的类型可以是简单类型、枚举类型、string类型和非 string的其它引用类型(但是值只能是null),结构不能是常 量 ◼ 常量是隐式的静态成员(但不能用static修饰),也就是说, 常量字段属于类而不属于对象,使用常量需要用“类名.常量 名”这样的形式
7.12类的成员(2) ■7.1.22实例字段和静态字段 C#中有两种字段,属于具体对象的实例字段和属于类的静态字段。 字段默认为实例字段。 假设有一个类X,X中有一个实例字段t,一个静态字段s;从X产 生100个对象,那么每个对象都有一个字段t,存储器中有100个t, 但是100个对象共享1个静态字段s,存储器中只有1个s。 静态字段要用关键字 static声明,例如: static int Tota; 静态字段属于类,所以使用静态字段要用“类名静态字段”这样 的形式。 C#中还有其它静态成员,例如静态方法, static修饰的成分的作用 和用法 静态字段能被静态方法和实例方法所访问
7.1.2 类的成员(2) ◼ 7.1.2.2 实例字段和静态字段 C#中有两种字段,属于具体对象的实例字段和属于类的静态字段。 字段默认为实例字段。 假设有一个类X,X中有一个实例字段t,一个静态字段s;从X产 生100个对象,那么每个对象都有一个字段t,存储器中有100个t, 但是100个对象共享1个静态字段s,存储器中只有1个s。 静态字段要用关键字static声明,例如:static int Total; 静态字段属于类,所以使用静态字段要用“类名.静态字段”这样 的形式。 C#中还有其它静态成员,例如静态方法,static修饰的成分的作用 和用法. 静态字段能被静态方法和实例方法所访问
7.12类的成员(3) ■7.1.2.3只读字段 只读字段用关键字 readonly声明,顾名思义,这样的字段是只可读出,不 可写入的,这一点和常量相同。 对只读字段赋值只能在如下情况下进行: 声明只读字段的同时初始化 ■在构造函数和静态构造函数中初始化 在上述的情况下甚至可以多次赋值,除此以外,只读字段只能读出不能 修改了。也不能将它们用作out参数或者re惨参数。如果只读字段没有初始 化,就自动赋以默认值。 只读字段和常量的差别 只读字段不具备 static特征,只读字段属于实例。 只读字段可以在运行阶段确定值,常量是在编译阶段确定值,因此可以 用变量表达式对只读字段赋值 只读字段可以是任何类型。 const可以修饰局部变量,但 readonly不能修饰局部变量
7.1.2 类的成员(3) ◼ 7.1.2.3 只读字段 只读字段用关键字readonly声明,顾名思义,这样的字段是只可读出,不 可写入的,这一点和常量相同。 对只读字段赋值只能在如下情况下进行: ◼ 声明只读字段的同时初始化 ◼ 在构造函数和静态构造函数中初始化 在上述的情况下甚至可以多次赋值,除此以外,只读字段只能读出不能 修改了。也不能将它们用作out参数或者ref参数。如果只读字段没有初始 化,就自动赋以默认值。 只读字段和常量的差别: ◼ 只读字段不具备static特征,只读字段属于实例。 ◼ 只读字段可以在运行阶段确定值,常量是在编译阶段确定值,因此可以 用变量表达式对只读字段赋值。 ◼ 只读字段可以是任何类型。 ◼ const可以修饰局部变量,但readonly不能修饰局部变量