《Chs03C的面向对象特性1》由会员分享,可在线阅读,更多相关《Chs03C的面向对象特性1(127页珍藏版)》请在金锄头文库上搜索。
1、Web应用开发技术 第 3 章 C#的面向对象特性1 1第第3 3章章C#C#的面向对象特性的面向对象特性类的定义与C#修饰符1创建对象与构造方法32访问控制符4类的成员及其修饰符3C#语言中的多态与实现6C#的继承及其实现5接口及其实现7异常处理38计算机学院Web应用开发技术 第 3 章 C#的面向对象特性2 23.1 3.1 类的定义与类的定义与C#C#修饰符修饰符在在前前一一章章的的例例子子中中,我我们们已已经经定定义义了了一一些些简简单单的的类类,如如Hello Hello 类。类。程序程序 3.1: Hello.csusing System;namespace mynamespac
2、e class myclass static void Main()() Console.WriteLine(Hello, Wellcome to C# World !); 可以看出,一个类的实现包含两部分的内容,即类声明和可以看出,一个类的实现包含两部分的内容,即类声明和类体类体类的定义类的定义计算机学院Web应用开发技术 第 3 章 C#的面向对象特性3 33.1 3.1 类的定义与类的定义与C#C#修饰符修饰符类的定义其基本格式如下:类的定义其基本格式如下:class 类名类名 /类声明部分类声明部分/类体部分类体部分 类体内容类体内容例如:例如:class Book /class Bo
3、ok /这个类定义一本书这个类定义一本书 / /类体类体 其中,其中,classclass是关键字,用来标识类定义的开始,是关键字,用来标识类定义的开始,classclass关键关键字后面跟着用户定义的类的名称字后面跟着用户定义的类的名称计算机学院Web应用开发技术 第 3 章 C#的面向对象特性4 43.1 3.1 类的定义与类的定义与C#C#修饰符修饰符v类声明类声明 类是通过关键字类是通过关键字classclass来声明的,以下是类声明的两个例子:来声明的,以下是类声明的两个例子:class Studentclass Student public class BankCardpublic
4、 class BankCard “class Student”, “public class BankCard”是类声明,Student,BankCard是类的名称,通常类名的第一个字母大写,但这并不一定是必须的。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性5 53.1 3.1 类的定义与类的定义与C#C#修饰符修饰符v类体类体 类的定义中,类体用一对大括号括起来类的定义中,类体用一对大括号括起来类体由成员变量(简称变量,又称为域)定义类体由成员变量(简称变量,又称为域)定义和成员方法(简称方法)定义两部分组成,其和成员方法(简称方法)定义两部分组成,其中变量对应类的静态属性,
5、方法对应类的动态中变量对应类的静态属性,方法对应类的动态属性,即类的行为和操作。属性,即类的行为和操作。通常变量在方法定义前定义(并不一定要求通常变量在方法定义前定义(并不一定要求) )计算机学院Web应用开发技术 第 3 章 C#的面向对象特性6 63.1 3.1 类的定义与类的定义与C#C#修饰符修饰符v类体类体 class ClassNameclass ClassName member Varible Declarations / member Varible Declarations /成员变量声明成员变量声明 method Declarations method Declaratio
6、ns()() /成员方法声明成员方法声明 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性7 73.1 3.1 类的定义与类的定义与C#C#修饰符修饰符类体的定义见例子程序 3.2。 程序 3.2:Student.csusing System;using System;namespace mynamespace namespace mynamespace class Studentclass Student/变量定义部分变量定义部分public public string s_id, s_name, s_sexstring s_id, s_name, s_sex;public pu
7、blic float english, mathfloat english, math; /方法定义部分方法定义部分public public void Naturalvoid Natural(string x, string y, string x, string y, string zstring z) /方法方法1 1 显示学生的基显示学生的基/本信息本信息 s_id = s_id = x x; s_name=y; s_sex=z; s_name=y; s_sex=z; Console.WriteLine Console.WriteLine(s_id+s_name+s_sexs_id+s
8、_name+s_sex); ; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性8 83.1 3.1 类的定义与类的定义与C#C#修饰符修饰符类体的定义见例子程序类体的定义见例子程序 3.2 3.2。 程序程序 3.23.2:Student.csStudent.cspublic public float Gradefloat Grade(float x, float yfloat x, float y) /方方法法2 2 计计 / /算学生的成绩算学生的成绩 float sum float sum; english = x;english = x; math = y; math =
9、 y; sum = english + math ; sum = english + math ; return sum; return sum; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性9 93.1 3.1 类的定义与类的定义与C#C#修饰符修饰符修修饰饰符符用用于于限限定定类类以以及及类类的的成成员员变变量量和和方方法法的的声声明明。C#C#中中有有十十余余种种修修饰饰符符,按按功功能能可可分分为为三三部部分分:访访问问修修饰饰符符,类类修修饰符和成员修饰符。饰符和成员修饰符。l访问修饰符访问修饰符 访问修饰符用于控制类及其成员被访问的范围,有四种访访问修饰符用于控制类
10、及其成员被访问的范围,有四种访问修饰符:问修饰符:publicpublic:存取不受限制;:存取不受限制;privateprivate:只有包含该成员的类可以存取;:只有包含该成员的类可以存取;internalinternal:只有当前工程可以存取;:只有当前工程可以存取;protectedprotected:只有包含该成员的类以及继承的类可以存:只有包含该成员的类以及继承的类可以存取。取。C#C#修饰符修饰符 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性10103.1 3.1 类的定义与类的定义与C#C#修饰符修饰符l类修饰符类修饰符 类修饰符用于表示类的特殊属性,有两种类修
11、饰类修饰符用于表示类的特殊属性,有两种类修饰符:符:abstractabstract:指定一个类只能作为其它类的基类;:指定一个类只能作为其它类的基类;sealedsealed:表示一个类不能被继承。:表示一个类不能被继承。C#C#修饰符修饰符 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性11113.1 3.1 类的定义与类的定义与C#C#修饰符修饰符l成员修饰符成员修饰符成员修饰符用于对类成员变量或成员方法进行声明,成员修饰符用于对类成员变量或成员方法进行声明,有八种成员修饰符:有八种成员修饰符:abstractabstract:表示该方法没有实现,即没有定义:表示该方法没有
12、实现,即没有定义方法体;方法体;constconst:指定域或局部变量的值不能被改动,:指定域或局部变量的值不能被改动,用于定义常量;用于定义常量;eventevent:声明一个事件;:声明一个事件;externextern:指该方法在外部实现;:指该方法在外部实现;计算机学院Web应用开发技术 第 3 章 C#的面向对象特性12123.1 3.1 类的定义与类的定义与C#C#修饰符修饰符l成员修饰符成员修饰符overrideoverride:对由基类继承成员的新实现;:对由基类继承成员的新实现;readonlyreadonly:指示一个域只能在声明时以及相同:指示一个域只能在声明时以及相同类
13、的内部被赋值;类的内部被赋值;staticstatic:指示一个成员属于类型本身:指示一个成员属于类型本身, ,而不是而不是属于特定的对象;属于特定的对象;virtualvirtual:指示一个方法或存取器的实现可以:指示一个方法或存取器的实现可以在继承类中被覆盖。在继承类中被覆盖。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性13133.2 3.2 创建对象与构造方法创建对象与构造方法创建一个对象包括对象的声明、为对象分配内存空间创建一个对象包括对象的声明、为对象分配内存空间与初始化两个步骤。与初始化两个步骤。v声明对象与声明基本数据类型的变量类似,首先说声明对象与声明基本数据
14、类型的变量类似,首先说明新建对象所属的类名,然后说明新建对象的名字。明新建对象所属的类名,然后说明新建对象的名字。对象声明的一般格式如下:对象声明的一般格式如下: 类名类名 对象名;对象名; 例如例如 Student student1; Student student1; 创建对象创建对象计算机学院Web应用开发技术 第 3 章 C#的面向对象特性14143.2 3.2 创建对象与构造方法创建对象与构造方法v下面语句为声明的对象分配内存与初始化:下面语句为声明的对象分配内存与初始化: 对象名对象名 = new = new 构造方法()构造方法(); ; 例如:例如: student1 = ne
15、w Studentstudent1 = new Student()(); ;创建对象创建对象计算机学院Web应用开发技术 第 3 章 C#的面向对象特性15153.2 3.2 创建对象与构造方法创建对象与构造方法l声明对象和分配内存空间一步完成:声明对象和分配内存空间一步完成: 类名类名 新建对象名新建对象名 = new= new构造方法()构造方法(); ; 例如:例如: Student student1 = new Student Student student1 = new Student()(); ;注意:注意:如果创建了一个类的多个对象,则每个对象将如果创建了一个类的多个对象,则每个
16、对象将在内存中拥有自己的与其他对象无关的变量和方法,在内存中拥有自己的与其他对象无关的变量和方法,并由自己的方法来操纵自己的变量,这就是面向对象并由自己的方法来操纵自己的变量,这就是面向对象的封装特性的体现。的封装特性的体现。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性16163.2 3.2 创建对象与构造方法创建对象与构造方法 要访问或调用一个对象的变量或方法需要首先访问要访问或调用一个对象的变量或方法需要首先访问这个对象,然后用算符这个对象,然后用算符“.”.”连接这个对象的某个变量连接这个对象的某个变量或方法,从而实现对变量的访问和方法的调用。或方法,从而实现对变量的访问
17、和方法的调用。 例如:例如: x = student1.english; x = student1.english; y = student1.math; y = student1.math; student1.grade student1.grade(x,yx,y); ;访问对象成员访问对象成员计算机学院Web应用开发技术 第 3 章 C#的面向对象特性17173.2 3.2 创建对象与构造方法创建对象与构造方法v构造方法的特殊性构造方法的特殊性构造方法的方法名与类名相同,除了使用类名构造方法的方法名与类名相同,除了使用类名作为构造方法的名称外,与普通方法的声明类作为构造方法的名称外,与普通
18、方法的声明类似。似。构造方法没有返回类型。构造方法没有返回类型。构造方法的主要作用是完成对类的对象的初始构造方法的主要作用是完成对类的对象的初始化工作。化工作。构造方法由系统调用来创建对象。除了可以由构造方法由系统调用来创建对象。除了可以由类的另一个构造方法或子类的构造方法调用外,类的另一个构造方法或子类的构造方法调用外,不能显式地直接调用构造方法。不能显式地直接调用构造方法。构造方法构造方法计算机学院Web应用开发技术 第 3 章 C#的面向对象特性18183.2 3.2 创建对象与构造方法创建对象与构造方法v构造方法的特殊性构造方法的特殊性在创建一个类的新对象的同时,系统会调用该在创建一个
19、类的新对象的同时,系统会调用该类的构造方法为新对象初始化。类的构造方法为新对象初始化。例如例如:public class myclass public myclass()() /构造方法构造方法 /初始化代码初始化代码 构造方法构造方法计算机学院Web应用开发技术 第 3 章 C#的面向对象特性19193.2 3.2 创建对象与构造方法创建对象与构造方法如果没有为类定义构造方法,系统将自动生成一如果没有为类定义构造方法,系统将自动生成一个默认的无参数的构造方法,并使用默认值初始个默认的无参数的构造方法,并使用默认值初始化对象的成员变量,化对象的成员变量, 构造方法可以带有参数。例如:构造方法可
20、以带有参数。例如:public class myclasspublic myclass(int i) /构造方法构造方法 /初始化代码初始化代码计算机学院Web应用开发技术 第 3 章 C#的面向对象特性20203.2 3.2 创建对象与构造方法创建对象与构造方法在对象实例化时,使用下面的语句格式:在对象实例化时,使用下面的语句格式:myclass mytest = new myclassmyclass mytest = new myclass(1515); ;计算机学院Web应用开发技术 第 3 章 C#的面向对象特性21213.2 3.2 创建对象与构造方法创建对象与构造方法构造方法可以被
21、重载。一个类中可以定义参数个数不同或参数数据类型不同的同名构造方法(与类同名)。例如:public class myclasspublic class myclass private string p_name;private string p_name; public myclass public myclass()() / /构造方法构造方法1 1,无参数,无参数 p_name = p_name = 匿名匿名; public myclass public myclass(string strstring str) / /构造方法构造方法2 2,有参数,有参数 p_name = str; p
22、_name = str; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性2222class Point class Point int x, y; int x, y; Point Point()() / /构造方法构造方法1 1 x=60; y=100; x=60; y=100; Point Point(int x, int yint x, int y) / /构造方法构造方法2 2 this.x = x; this.x = x; this.y = y; this.y = y; 3.2 3.2 创建对象与构造方法创建对象与构造方法v构造方法应用举例构造方法应用举例 例如,假设有一
23、个类Point用来描述平面上的一个点,可以为Point类定义如下的构造方法,初始化它的域变量x、y:其中构造方法2定义了两个形式参数,创建对象的语句在调用构造方法时就应该提供几个类型顺序一致的实际参数,指明新建对象各变量的初始值。利用这种机制就可以创建不同初始特性的同类对象。这里,在一个类中定义了两个同名但参数不同的构造方法,使用了方法重载的概念(关于重载以后再详细论述)。定义了构造方法之后,就可以用如下的语句创建并初始化Point对象:Point Point1 = new Point(); Point Point2 = new Point(60,90);计算机学院Web应用开发技术 第 3
24、章 C#的面向对象特性23233.2 3.2 创建对象与构造方法创建对象与构造方法析构方法用来当对象被使用完了或者不再需要时,释析构方法用来当对象被使用完了或者不再需要时,释放被对象所占有的系统资源。放被对象所占有的系统资源。关于析构方法,需要说明的是:关于析构方法,需要说明的是:v 一个类只能有一个析构方法。一个类只能有一个析构方法。v 析构方法不能被继承或重载。析构方法不能被继承或重载。析构方法析构方法计算机学院Web应用开发技术 第 3 章 C#的面向对象特性24243.2 3.2 创建对象与构造方法创建对象与构造方法v 无法显式调用析构方法,它们是被自动调用的。无法显式调用析构方法,它
25、们是被自动调用的。v 析构方法既没有修饰,也没有参数,使用析构方法既没有修饰,也没有参数,使用“类名类名”来命名。来命名。例如:例如: myclassmyclass()() / /清理代码清理代码 析构方法析构方法计算机学院Web应用开发技术 第 3 章 C#的面向对象特性25253.2 3.2 创建对象与构造方法创建对象与构造方法vabstract abstract 修饰符修饰符 凡是用凡是用abstractabstract修饰符修饰的类被称为抽象类。修饰符修饰的类被称为抽象类。 abstractabstract类必须是某一类的父类,它无法直接使用类必须是某一类的父类,它无法直接使用 。抽象
26、类的作用在。抽象类的作用在于给所有子类提供一个统一的接口。于给所有子类提供一个统一的接口。如果属于下列情况,则该类必须被声明为如果属于下列情况,则该类必须被声明为abstractabstract类。类。v该类中由一个或多个该类中由一个或多个abstractabstract方法(声明但没有定义的方法(声明但没有定义的方法,方法, abstractabstract修饰的方法将在下节介绍);修饰的方法将在下节介绍);v该类继承了一个该类继承了一个abstractabstract类的一个或多个类的一个或多个abstractabstract方法,方法,但并没有提供这些方法的方法体;但并没有提供这些方法的
27、方法体;v该类使用了一个接口,但并没有将该接口的所有方法加该类使用了一个接口,但并没有将该接口的所有方法加以实现。以实现。类的修饰符类的修饰符计算机学院Web应用开发技术 第 3 章 C#的面向对象特性26263.2 3.2 创建对象与构造方法创建对象与构造方法v定义一个抽象类的格式如下:定义一个抽象类的格式如下:abstractclass类名类名类的修饰符类的修饰符计算机学院Web应用开发技术 第 3 章 C#的面向对象特性27273.2 3.2 创建对象与构造方法创建对象与构造方法v sealed sealed 修饰符修饰符 由由sealedsealed修饰的类叫密封类。如果一个类被修饰的
28、类叫密封类。如果一个类被sealedsealed修饰符所修饰和限定,说明这个类不可能有子类。修饰符所修饰和限定,说明这个类不可能有子类。 v通常,两种情况下需要建立密封类:通常,两种情况下需要建立密封类: 没有必要建立类的派生类(子类);没有必要建立类的派生类(子类); 类中只定义了静态变量和静态方法。类中只定义了静态变量和静态方法。 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性28283.2 3.2 创建对象与构造方法创建对象与构造方法 定义一个密封类的格式如下:定义一个密封类的格式如下:sealed class sealed class 类名类名 注意:注意:abstrac
29、tabstract和和sealedsealed修饰符不能同时修饰一个类修饰符不能同时修饰一个类 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性29293.2 3.2 创建对象与构造方法创建对象与构造方法 在一个类的定义中可以嵌套另一个类的定义。在一个类的定义中可以嵌套另一个类的定义。内层类被看作是外层类的一个成员,内层类的内层类被看作是外层类的一个成员,内层类的方法可以访问外层类的私有成员。当需要访问方法可以访问外层类的私有成员。当需要访问内层类时,可以使用内层类时,可以使用“.”.”符号符号类的嵌套类的嵌套计算机学院Web应用开发技术 第 3 章 C#的面向对象特性30303.
30、2 3.2 创建对象与构造方法创建对象与构造方法using System;using System;public class Vehiclespublic class Vehicles private string stext = private string stext = 交通工具交通工具; ; /私有成员私有成员 public class Autocar public class Autocar /嵌套类嵌套类 public void Run public void Run()() Vehicles Av = new Vehicles Vehicles Av = new Vehicles
31、()(); ; Console.WriteLine Console.WriteLine(Av.stextAv.stext); ; Console.WriteLine Console.WriteLine(car run very fastcar run very fast); ; 类的嵌套类的嵌套计算机学院Web应用开发技术 第 3 章 C#的面向对象特性31313.2 3.2 创建对象与构造方法创建对象与构造方法 static void Main static void Main()() Autocar acar= new Autocar Autocar acar= new Autocar()
32、(); ; acar.Run acar.Run()(); ; /当需要在当需要在VehiclesVehicles类之外访问内层类时,则使用下面的类之外访问内层类时,则使用下面的语句:语句:class testclass test static void Main static void Main()() Vehicles.Autocar acar= new Vehicles.Autocar acar= new Vehicles.AutocarVehicles.Autocar()(); ; acar.Run acar.Run()(); ; 尽管类可以嵌套任意多层,但通常不要使用多层嵌套,以免造成
33、阅读困难。 例子程序 3.4:Distance.cs计算机学院Web应用开发技术 第 3 章 C#的面向对象特性32323.3 3.3 类的成员及其修饰符类的成员及其修饰符v 变量及其分类变量及其分类 C#C#类类中中的的变变量量按按照照定定义义的的位位置置不不同同,可可分分为为成成员员变变量量和和局部变量局部变量。 在在类类体体中中定定义义变变量量部部分分(方方法法体体外外)定定义义的的变变量量称称为为类类的的成成员员变变量量(简简称称类类变变量量),在在方方法法体体内内定定义义的的变变量量和方法的参数称为局部变量。和方法的参数称为局部变量。变量及其修饰符变量及其修饰符 计算机学院Web应用
34、开发技术 第 3 章 C#的面向对象特性33333.3 3.3 类的成员及其修饰符类的成员及其修饰符v 变量及其分类变量及其分类 成成员员变变量量的的作作用用域域是是整整个个类类,在在整整个个类类内内部部有有效效,如如果果一一个个类类中中包包含含多多个个方方法法,那那么么这这些些方方法法都都可可以以访访问所在类的成员变量;问所在类的成员变量;局部变量则只在它定义的方法内部有效。局部变量则只在它定义的方法内部有效。成成员员变变量量是是类类的的静静态态属属性性,可可以以通通过过类类名名. .变变量量名名或或对对象象名名. .变变量量名名访访问问,而而局局部部变变量量则则不不可可由由其其他他的的类类
35、或或对象访问。对象访问。变量及其修饰符变量及其修饰符 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性34343.3 3.3 类的成员及其修饰符类的成员及其修饰符v 成员变量的修饰符成员变量的修饰符 static static 修饰符修饰符n常数或者类型声明隐式地是静态成员。常数或者类型声明隐式地是静态成员。n尽尽管管类类的的实实例例包包含含该该类类所所有有实实例例字字段段的的单单独独副副本本,但但每每个个静态字段只有一个副本静态字段只有一个副本n不不能能通通过过实实例例引引用用静静态态成成员员。然然而而,可可以以通通过过类类型型名名称称引引用它。用它。n不可以使用不可以使用 th
36、is this 来引用静态方法或属性访问器来引用静态方法或属性访问器n如如果果对对类类应应用用 static static 关关键键字字,则则该该类类的的所所有有成成员员都都必必须须是静态的。是静态的。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性35353.3 3.3 类的成员及其修饰符类的成员及其修饰符v 成员变量的修饰符成员变量的修饰符 static static 修饰符修饰符用用staticstatic修饰符修饰的变量是仅属于类的静态变量修饰符修饰的变量是仅属于类的静态变量 。例如:要定义一个类来描述一个班级的所有学生,可例如:要定义一个类来描述一个班级的所有学生,可以在
37、类的定义中用两个静态变量以在类的定义中用两个静态变量major major 和和 gradegrade来描来描述专业和年级,我们把每个学生看作是这个类的一个述专业和年级,我们把每个学生看作是这个类的一个对象时,每个学生的专业和年级是相同的,不会因对对象时,每个学生的专业和年级是相同的,不会因对象的改变而变化。象的改变而变化。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性36363.3 3.3 类的成员及其修饰符类的成员及其修饰符v 成员变量的修饰符成员变量的修饰符 static static 修饰符修饰符class computer2006class computer2006 s
38、tatic string major =“Computer” static string major =“Computer”; static int grade=2006 static int grade=2006; string student_ID string student_ID; string student_Name string student_Name; int student_Age int student_Age; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性37373.3 3.3 类的成员及其修饰符类的成员及其修饰符/下面的程序片断定义了两个静态变量来反映
39、某一类卡的共同下面的程序片断定义了两个静态变量来反映某一类卡的共同属性。属性。Class BankCard_BC Class BankCard_BC /定义一个类表示中国银行的中行卡定义一个类表示中国银行的中行卡 static string BankName = “BC”; static string BankName = “BC”; static double poundage ; static double poundage ; long cardNumber; long cardNumber; int password; int password; double balance; dou
40、ble balance; 上面程序定义的中国银行的中行卡的属性上面程序定义的中国银行的中行卡的属性中,每张卡的名称是一样的,都是中行卡,中,每张卡的名称是一样的,都是中行卡,其手续费也是相同的,所以用静态变量表其手续费也是相同的,所以用静态变量表示;但每张卡的卡号、密码和存款余额是示;但每张卡的卡号、密码和存款余额是不同的,所以用实例变量表示。不同的,所以用实例变量表示。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性38383.3 3.3 类的成员及其修饰符类的成员及其修饰符class BankCard_BCstatic String BankName = BC; /静态/变量初
41、值static double poundage;long cardNumber;int password;double balance;计算机学院Web应用开发技术 第 3 章 C#的面向对象特性39393.3 3.3 类的成员及其修饰符类的成员及其修饰符下面的程序 3.5 将验证静态变量是类中每个对象的共享变量。程序 3.5:TestStaticField.cs public class TestStaticFieldpublic static void Main()BankCard_BC myBC_1 = new BankCard_BC();BankCard_BC myBC_2 = new
42、 BankCard_BC();myBC_1.poundage = 0.1; /错误 Console.WriteLine(第二张BC卡的手续费: + Convert.ToString(myBC_2.poundage); Console.WriteLine(BC卡的手续费: + Convert.String(BankCard_BC.poundage);计算机学院Web应用开发技术 第 3 章 C#的面向对象特性40403.3 3.3 类的成员及其修饰符类的成员及其修饰符 实例变量和类变量的区别实例变量和类变量的区别v不不同同的的对对象象的的实实例例变变量量将将被被分分配配不不同同的的内内存存空间。
43、空间。v如如果果类类的的成成员员变变量量中中有有类类变变量量,那那么么这这个个类类所所产产生生的的所所有有对对象象都都使使用用同同一一个个类类变变量量,共共享享相相同同的的一一处处内内存存,改改变变其其中中一一个个对对象象的的类类变变量量的的值值会会直直接接影影响响到到其其他他对对象象的的类类变变量量。即同一个类的不同对象共享类变量。例如即同一个类的不同对象共享类变量。例如:计算机学院Web应用开发技术 第 3 章 C#的面向对象特性41413.3 3.3 类的成员及其修饰符类的成员及其修饰符class Point public static int x = 10; int y; class
44、z Point p1 = new Point();(); Point p2 = new Point();(); P1.x =15; Console.WriteLine(p2.x);/输出为输出为15 这里,我们在类Point中声明了一个类变量 x, 在另一个类中创建了类Point的两个对象p1和p2,如果在程序中使用了p1.x =18;那么这时p1.x和p2.x的值都是18。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性42423.3 3.3 类的成员及其修饰符类的成员及其修饰符readonly readonly 修饰符修饰符 用用readonlyreadonly修饰的变量是只读
45、变量。修饰的变量是只读变量。 例如例如 readonly float pai = 31.4;readonly float pai = 31.4;计算机学院Web应用开发技术 第 3 章 C#的面向对象特性43433.3 3.3 类的成员及其修饰符类的成员及其修饰符readonly readonly 修饰符修饰符 using System;using System;public class Class1public class Class1 public readonly string str1=public readonly string str1=我是我是 readonly readonly
46、 变量变量;static void Main()static void Main() Class1 c=new Class1(); Class1 c=new Class1(); Console.WriteLine(c.str1); Console.WriteLine(c.str1); 执行程序的输出结果如下:我是 readonly 变量计算机学院Web应用开发技术 第 3 章 C#的面向对象特性44443.3 3.3 类的成员及其修饰符类的成员及其修饰符更改更改readonlyreadonly的值的值如果在类的定义中显式地定义了一个构造方法,就可以在构造如果在类的定义中显式地定义了一个构造方法
47、,就可以在构造方法中改变方法中改变readonly readonly 变量的值。变量的值。public class Class1public class Class1 public readonly string str1 = ”public readonly string str1 = ”我是我是 readonly readonly 变量变量”; ;public Class1public Class1()() str1 =”str1 =”我的值被构造方法修改我的值被构造方法修改”; ; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性45453.3 3.3 类的成员及其修饰符类的
48、成员及其修饰符lconstconst修饰符修饰符 vconst const 关键字用于修改字段或局部变量的声明。关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值是常数,不能被修改。它指定字段或局部变量的值是常数,不能被修改。例如:例如: const int x = 0; const int x = 0; public const double gravitationalConstant = public const double gravitationalConstant = 6.673e-11; 6.673e-11; private const string productNam
49、e = Visual C#;private const string productName = Visual C#;v常数声明语句中可以声明多个常数,例如:常数声明语句中可以声明多个常数,例如: public const double x = 1.0, y = 2.0, z = 3.0; public const double x = 1.0, y = 2.0, z = 3.0;计算机学院Web应用开发技术 第 3 章 C#的面向对象特性46463.3 3.3 类的成员及其修饰符类的成员及其修饰符constconst修饰符修饰符 常数可以参与常数表达式,例如:常数可以参与常数表达式,例如:p
50、ublic const int c1 = 5;public const int c1 = 5;public const int c2 = c1 + 100;public const int c2 = c1 + 100;注意:注意:不允许在常数声明中使用不允许在常数声明中使用 static static 修饰符。修饰符。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性47473.3 3.3 类的成员及其修饰符类的成员及其修饰符程序程序3.63.6:const_keyword.csconst_keyword.cs using System; public class ConstTest
51、 class SampleClass public int x; public int y; public const int c1 = 5; public const int c2 = c1 + 5; public SampleClass(int p1, int p2) x = p1; y = p2; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性48483.3 3.3 类的成员及其修饰符类的成员及其修饰符程序程序3.63.6:const_keyword.csconst_keyword.cs static void Main() SampleClass mC = new Sam
52、pleClass(11, 22); Console.WriteLine(x = 0, y = 1, mC.x, mC.y); Console.WriteLine(c1 = 0, c2 = 1, SampleClass.c1, SampleClass.c2 ); 输出输出x = 11, y = 22 c1 = 5, c2 = 10计算机学院Web应用开发技术 第 3 章 C#的面向对象特性49493.3 3.3 类的成员及其修饰符类的成员及其修饰符该示例说明,如何将常数用作局部变量。该示例说明,如何将常数用作局部变量。const_keyword_2.cs const_keyword_2.cs u
53、sing System; using System; public class MainClass public class MainClass static void Main() static void Main() const int c = 707; const int c = 707; Console.WriteLine(My local constant = 0, c); Console.WriteLine(My local constant = 0, c); 输出结果如下:输出结果如下:My local constant = 707My local constant = 707计
54、算机学院Web应用开发技术 第 3 章 C#的面向对象特性50503.3 3.3 类的成员及其修饰符类的成员及其修饰符l 属性访问器属性访问器 属性是聪明的字段属性是聪明的字段 属性即类的成员变量,用来描述对象的状态,对于属性即类的成员变量,用来描述对象的状态,对于publicpublic修饰的变量,对外是透明的,可以用修饰的变量,对外是透明的,可以用“对象名对象名. .变量名变量名”访问(静态变量可以用访问(静态变量可以用“类名类名. .变量名变量名”访问)访问),对于用对于用privateprivate修饰的变量,在类内部则是通过类的修饰的变量,在类内部则是通过类的方法方法属性访问器来访问
55、的,从而实现面向对象的属性访问器来访问的,从而实现面向对象的数据隐藏。数据隐藏。 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性51513.3 3.3 类的成员及其修饰符类的成员及其修饰符l 属性访问器属性访问器 为什么需要属性为什么需要属性? ?class People class People private string name;private string name; public People(string name) public People(string name) this.name = name; this.name = name; static void
56、Main()static void Main()People p = new People(zhangsan);People p = new People(zhangsan); Console.WriteLine(p.name); Console.WriteLine(p.name); 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性52523.3 3.3 类的成员及其修饰符类的成员及其修饰符 属性访问器属性访问器 属性访问器的声明格式如下: 访问修饰符访问修饰符 类型名类型名 属性名属性名 getget return return 私有变量;私有变量; setset 私有变量私有变
57、量 = value= value; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性53533.3 3.3 类的成员及其修饰符类的成员及其修饰符用用privateprivate修饰的私有变量的值不能被外界直接修改。修饰的私有变量的值不能被外界直接修改。我们可以为某个类建立一个私有变量及其访问器如我们可以为某个类建立一个私有变量及其访问器如下:下:private string p_name; private string p_name; /声明一个私有变量声明一个私有变量public string name public string name /声明一个属性访问器声明一个属性访问器
58、 getget return p_namereturn p_name; setset p_name = valuep_name = value; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性54543.3 3.3 类的成员及其修饰符类的成员及其修饰符 方法是类的动态属性,描述了类所具有的功能和操作,即描方法是类的动态属性,描述了类所具有的功能和操作,即描述类能述类能“做什么做什么”。C C方法的定义包括两部分:包括方法的声方法的定义包括两部分:包括方法的声明和方法体。一般格式如下:明和方法体。一般格式如下:Method Declaration Method Declaratio
59、n /方法声明部分方法声明部分 MethodBody MethodBody /方法体方法体 方法及其修饰符方法及其修饰符 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性55553.3 3.3 类的成员及其修饰符类的成员及其修饰符v方法声明方法声明最基本的方法声明包括返回类型、方法名和参数列表,最基本的方法声明包括返回类型、方法名和参数列表,格式如下:格式如下:返回值类型返回值类型 方法名(方法名( 参数列表参数列表)例如:例如:float sumfloat sum(float x, float yfloat x, float y) /方法声明方法声明部分部分 计算机学院Web应用
60、开发技术 第 3 章 C#的面向对象特性56563.3 3.3 类的成员及其修饰符类的成员及其修饰符v方法体方法体方法体中包括局部变量的声明和合法的方法体中包括局部变量的声明和合法的C#C#语句块。语句块。例如:例如:int Timesint Times(int x, int yint x, int y) int s; int s; s = x*y; s = x*y; return s; return s; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性57573.3 3.3 类的成员及其修饰符类的成员及其修饰符在声明一个方法时,除包括返回值类型、方法名和参数在声明一个方法时,除
61、包括返回值类型、方法名和参数外,还可以指定方法的修饰符。方法定义的完整结构外,还可以指定方法的修饰符。方法定义的完整结构如下:如下: 修饰符修饰符 返回类型返回类型 方法名称(方法名称( 参数列表参数列表 ) throwthrow异常列表异常列表 / /局部变量声明局部变量声明 / /C#C#语句语句 示例示例3.73.7其中,其中,throwthrow异常列表异常列表 将在后面程序异常处理中介绍。将在后面程序异常处理中介绍。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性58583.3 3.3 类的成员及其修饰符类的成员及其修饰符修修饰饰符符描述描述abstract仅仅用于虚方法
62、,派生用于虚方法,派生类类必必须须提供和提供和该该抽象方抽象方法匹配的法匹配的实现实现,含有抽象方法的,含有抽象方法的类类型型为为抽象抽象类类型型Static类类型方法,不能型方法,不能访问实访问实例字段或方法,只能例字段或方法,只能访问类访问类型方法或型方法或类类型字段型字段默默认认(称(称为为Instance)实实例方法,可以例方法,可以访问实访问实例方法或字段,也可例方法或字段,也可以以访问类访问类型方法或字段型方法或字段Virtual多多态态的的实现实现,总调总调用用继继承承链链最末端的最末端的实现实现override仅仅用于虚方法,用于虚方法,显显示声明重写基示声明重写基类类型方法型
63、方法sealed仅仅用于虚方法,派生用于虚方法,派生类类不能重写不能重写该该方法方法v 3. 3.方法的修饰符方法的修饰符计算机学院Web应用开发技术 第 3 章 C#的面向对象特性59593.3 3.3 类的成员及其修饰符类的成员及其修饰符 abstract abstract修饰修饰 abstract abstract修饰的方法叫抽象方法。抽象方法是一种只修饰的方法叫抽象方法。抽象方法是一种只有方法头,没有具体的方法体,其方法体是在继承该有方法头,没有具体的方法体,其方法体是在继承该方法所在类的子类中实现的。定义抽象方法的目的是方法所在类的子类中实现的。定义抽象方法的目的是给所有子类提供一个
64、统一的接口。例如可以定义一个给所有子类提供一个统一的接口。例如可以定义一个如下的抽象方法:如下的抽象方法:abstract void printabstract void print();();计算机学院Web应用开发技术 第 3 章 C#的面向对象特性60603.3 3.3 类的成员及其修饰符类的成员及其修饰符 static static 修饰符修饰符用用staticstatic修饰符修饰的方法称为静态方法,与静态变修饰符修饰的方法称为静态方法,与静态变量类似,静态方法是属于整个类的类方法;而不用量类似,静态方法是属于整个类的类方法;而不用staticstatic修饰符限定的方法是类的某个具
65、体实例(对象)修饰符限定的方法是类的某个具体实例(对象)的方法,又称实例方法。的方法,又称实例方法。例子程序例子程序 3.8 3.8 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性61613.3 3.3 类的成员及其修饰符类的成员及其修饰符 实例方法和类方法的区别实例方法和类方法的区别 类方法类方法不仅可以由对象调用不仅可以由对象调用而且还可以用类名直接调而且还可以用类名直接调用,而实例方法只能由对象名调用。用,而实例方法只能由对象名调用。 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性62623.3 3.3 类的成员及其修饰符类的成员及其修饰符 实例方法和类方法的
66、区别实例方法和类方法的区别例如:例如:class Aclass A int x, y; int x, y; static float f static float f(int x1, x2int x1, x2) float g float g(int x1, int x2int x1, int x2) 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性63633.3 3.3 类的成员及其修饰符类的成员及其修饰符 class Bclass B public void Main public void Main()() A a1=new A A a1=new A()(); ; A.f A
67、.f(2,32,3); ; /由类名调用静态方法,合法由类名调用静态方法,合法 a1.f a1.f(1,21,2); ; /由对象名调用静态方法,由对象名调用静态方法,不合法不合法 a1.g a1.g(3,43,4); ; /由对象名调用,合法由对象名调用,合法 A.g A.g(4,54,5);); /由类名调用,不合法由类名调用,不合法 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性64643.3 3.3 类的成员及其修饰符类的成员及其修饰符 virtualvirtual和和overrideoverride修饰符修饰符将一个类中的方法声明为将一个类中的方法声明为virtualv
68、irtual,该方法则可以,该方法则可以在该类的子类中被重写。例如:在该类的子类中被重写。例如:class Baseclassclass Baseclass public public virtualvirtual string func1() string func1() return This is in Baseclass.; return This is in Baseclass.; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性65653.3 3.3 类的成员及其修饰符类的成员及其修饰符 virtualvirtual和和overrideoverride修饰符修饰符当一个
69、子类的方法要重写父类的方法时,要使用当一个子类的方法要重写父类的方法时,要使用overrideoverride关键字声明。例如:关键字声明。例如:class Subclass : Baseclassclass Subclass : Baseclass public public override override string func1()string func1() return This is in Subclass.; return This is in Subclass.; 注意:注意:由于由于virtualvirtual只能对类中的实例方法加以定义,只能对类中的实例方法加以定义,因
70、此不能用因此不能用virtualvirtual声明静态的域变量和静态方法。声明静态的域变量和静态方法。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性66663.3 3.3 类的成员及其修饰符类的成员及其修饰符 sealed sealed修饰符修饰符 用用sealedsealed修修饰饰的的类类是是最最终终类类,不不能能被被继继承承;用用sealedsealed修饰的方法不能被子类重写修饰的方法不能被子类重写using System;using System;class Baseclassclass Baseclass public public virtualvirtual vo
71、id Final() void Final() Console.WriteLine(This is a base Console.WriteLine(This is a base function);function); 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性67673.3 3.3 类的成员及其修饰符类的成员及其修饰符 sealed sealed修饰符修饰符class Myclass : Baseclassclass Myclass : Baseclass public public sealed overridesealed override void Final()
72、void Final() Console.WriteLine(This is a final Console.WriteLine(This is a final function);function); 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性68683.3 3.3 类的成员及其修饰符类的成员及其修饰符class SubMyclassclass SubMyclass:MyclassMyclass public public overrideoverride void Final() void Final() Console.WriteLine(“This is a over
73、ride Console.WriteLine(“This is a override final function”); final function”); /编编 译错误译错误 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性69693.3 3.3 类的成员及其修饰符类的成员及其修饰符上例中的上例中的FinalFinal方法必须是另一个类中的方法的重写形方法必须是另一个类中的方法的重写形式,也就是式,也就是sealed sealed 必须和必须和overrideoverride一起定义方法。一起定义方法。如果继承父类中的某个方法希望子类中重写的方法是如果继承父类中的某个方法希望子
74、类中重写的方法是最终的版本,就需要使用最终的版本,就需要使用sealedsealed定义,这样的方法就定义,这样的方法就不能再被重写了。不能再被重写了。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性70703.4 3.4 访问控制符访问控制符n访问控制符是一组限定类、变量或方法是否可以被程访问控制符是一组限定类、变量或方法是否可以被程序里的其他部分访问和调用的修饰符。序里的其他部分访问和调用的修饰符。 n类的访问控制符类的访问控制符为为publicpublic 或者或者internal internal n变量和方法的访问控制符有变量和方法的访问控制符有五五个,分别为个,分别为
75、public public,protectedprotected,internalinternal,p private rivate ,protected protected internalinternaln 这些访问控制符在修饰类、变量和方法时,其含是这些访问控制符在修饰类、变量和方法时,其含是不同的,下面分别讨论这些访问控制符的作用及控不同的,下面分别讨论这些访问控制符的作用及控制范围。制范围。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性71713.4 3.4 访问控制符访问控制符n一个类被声明为公共类,表明它可以被所有的其他类一个类被声明为公共类,表明它可以被所有的其他
76、类所访问和引用,这里的访问和引用是指这个类作为整所访问和引用,这里的访问和引用是指这个类作为整体是可见和可使用的,程序的其他部分可以创建这个体是可见和可使用的,程序的其他部分可以创建这个类的对象、访问这个类内部可见的成员变量和调用它类的对象、访问这个类内部可见的成员变量和调用它的可见的方法的可见的方法。n如果要访问类中的域或方法,还应将这些域和方法自如果要访问类中的域或方法,还应将这些域和方法自己的访问控制符也声明为己的访问控制符也声明为publicpublic。 npublicpublic修饰符会造成安全性和数据封装性下降,所以修饰符会造成安全性和数据封装性下降,所以一般应控制一般应控制pu
77、blicpublic的使用。的使用。 公共访问控制符公共访问控制符publicpublic计算机学院Web应用开发技术 第 3 章 C#的面向对象特性72723.4 3.4 访问控制符访问控制符n假如一个类没有访问控制符,说明它具有默认的访问控制特性。这种默认的访问控制权规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。n类内的域和方法如果没有访问控制符来限定,也可以被同一个命名空间中的其他类所访问和调用。 默认访问控制符默认访问控制符 计算机学院Web应用开发技术 第 3 章 C#的面向对象特
78、性73733.4 3.4 访问控制符访问控制符用用protectedprotected修饰的成员变量可以被修饰的成员变量可以被3 3种类所引用:该类自身、种类所引用:该类自身、该类的嵌套类及该类的子类。该类的嵌套类及该类的子类。使用使用protectedprotected修饰符的主要作用是允许其他命名空间中的它的修饰符的主要作用是允许其他命名空间中的它的子类来访问父类的特定属性。子类来访问父类的特定属性。protected protected 标识符使类的成员仅在该类以及当前类的所有派生标识符使类的成员仅在该类以及当前类的所有派生类中可见,当前类之外的代码无法访问类中可见,当前类之外的代码无法
79、访问 protected protected 成员。成员。类(包括嵌套类)的任何成员都可以使用类(包括嵌套类)的任何成员都可以使用 protected protected 修饰符来修饰符来标记。标记。不能将不能将 protected protected 修饰符与其他任何可见性修饰符(修饰符与其他任何可见性修饰符(publicpublic、privateprivate)组合。组合。 保护访问控制符保护访问控制符protected protected 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性74743.4 3.4 访问控制符访问控制符用用privateprivate修饰的域或方
80、法只能被该类自己访问和修改,修饰的域或方法只能被该类自己访问和修改,而不能被任何其他类(包括该类的子类)来获取和引而不能被任何其他类(包括该类的子类)来获取和引用。用。privateprivate修饰符用来声明那些类的私有成员,它提供了修饰符用来声明那些类的私有成员,它提供了最高的保护级别。最高的保护级别。私有访问控制符私有访问控制符private private 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性75753.4 3.4 访问控制符访问控制符AE的含义如下:A代表所有的类。B代表当前类所在的命名空间(也包括当前类)。C代表当前类的所有子类,它们有的与当前类在同一个命名
81、空间中,有的与当前类在不同的命名空间中。D代表当前类本身;E代表当前命名空间中的当前类的子类。综上所述,类、变量和方法的访问控制可以综上所述,类、变量和方法的访问控制可以归纳为表归纳为表3.3错误众多错误众多计算机学院Web应用开发技术 第 3 章 C#的面向对象特性76763.5 C#3.5 C#的继承及其实现的继承及其实现n继继承承实实际际上上是是存存在在于于面面向向对对象象程程序序中中的的两两个个类类之之间间的的一一种种关关系系。当当一一个个类类拥拥有有另另一一个个类类的的所所有有数数据据和和操操作作时,就称这两个类之间具有继承关系。时,就称这两个类之间具有继承关系。n被被继继承承的的类
82、类称称为为父父类类或或超超类类、基基类类,继继承承了了父父类类或或超超类的所有数据和操作的类称为子类。类的所有数据和操作的类称为子类。n在在大大多多数数面面向向对对象象语语言言中中,如如果果类类P P是是子子类类S S的的一一个个父父辈,则子类辈,则子类S S的一个对象的一个对象s s也是也是父类父类P P的一个对象。的一个对象。继承的定义继承的定义 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性77773.5 C#3.5 C#的继承及其实现的继承及其实现n继继承承还还有有传传递递性性,即即如如果果M1M1继继承承M2M2,M2M2继继承承M3M3,则则M1M1(间接)继承(间接
83、)继承M3M3。 M3M2M1继承的定义继承的定义 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性78783.5 C#3.5 C#的继承及其实现的继承及其实现n 当当一一个个子子类类具具有有多多个个父父类类时时,它它可可以以继继承承它它们们的的结结构构和和方方法法,这这称称为为多多重重继继承承。如如图图3.23.2中中,M1M1有有父父类类M2M2、M3M3、M4M4。由由此此构构成成的的新新类类具具有有多多个个父父类类的的特特性性与与功功能能,其方法也是所有父类方法的其方法也是所有父类方法的“超集超集”。M3M2M1M4计算机学院Web应用开发技术 第 3 章 C#的面向对象特
84、性79793.5 C#3.5 C#的继承及其实现的继承及其实现n 类的继承类的继承 在在类类的的声声明明中中,通通过过使使用用关关键键字字“:”来来创创建建一一个个子类,其格式如下:子类,其格式如下:class class S SonClass onClass : F FatherClassatherClass 继承的实现继承的实现 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性80803.5 C#3.5 C#的继承及其实现的继承及其实现n 类的继承类的继承 如如果果一一个个类类没没有有显显式式地地声声明明继继承承的的父父类类,那那么么这这个个类就默认类就默认System.Obj
85、ectSystem.Object为父类。为父类。 继承的实现继承的实现 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性81813.5 C#3.5 C#的继承及其实现的继承及其实现n 类的继承类的继承 using System;using System;class class Myclass Myclass : : Object Object /如如果果不不写写ObjectObject,也也默默认认MyclassMyclass的的/父类是父类是ObjectObject public void Func() public void Func() Console.WriteLine(T
86、his Console.WriteLine(This is is a a subclass subclass of of Object);Object); 继承的实现继承的实现 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性82823.5 C#3.5 C#的继承及其实现的继承及其实现nC#C#中的继承符合下列规则:中的继承符合下列规则: 继继承承是是可可传传递递的的。如如果果C C从从B B中中派派生生,B B又又从从A A中中派派生生,那那么么C C不不仅仅继继承承了了B B中中声声明明的的成成员员,同同样样也也继继承承了了A A中中的的成成员员。Object Object 类
87、类作作为为所所有有类类的的基类。基类。 派派生生类类应应当当是是对对基基类类的的扩扩展展。派派生生类类可可以以添添加加新的成员,但不能除去已经继承的成员的定义。新的成员,但不能除去已经继承的成员的定义。 构构造造函函数数和和析析构构函函数数不不能能被被继继承承。除除此此以以外外的的其其他他成成员员,不不论论对对它它们们定定义义了了怎怎样样的的访访问问方方式式,都都能能被被继继承承。基基类类中中成成员员的的访访问问方方式式只只能能决决定定派生类能否访问它们。派生类能否访问它们。 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性83833.5 C#3.5 C#的继承及其实现的继承及其实
88、现 派派生生类类如如果果定定义义了了与与继继承承而而来来的的成成员员同同名名的的新新成成员员,就就可可以以覆覆盖盖已已继继承承的的成成员员。但但派派生生类类并并没没有有删删除除这这些些成员,只是不能访问这些成员。成员,只是不能访问这些成员。 类类可可以以定定义义虚虚方方法法、虚虚属属性性以以及及虚虚索索引引指指示示器器,它它的的派派生生类类能能够够重重载载这这些些成成员员,从从而而实实现现类类可可以以展展示示出出多态性。多态性。 派派生生类类只只能能从从一一个个类类中中继继承承,可可以以通通过过接接口口实实现现多多重继承。重继承。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性84
89、843.5 C#3.5 C#的继承及其实现的继承及其实现n 变量的继承与隐藏变量的继承与隐藏 v 如如果果子子类类重重新新定定义义一一个个与与从从父父类类那那里里继继承承来来的的域域变变量量完完全全相相同同的的变变量量,称称为为变变量量的的隐隐藏藏。这这时时,子子类类中中定定义义了了与与父父类类同同名名的的变变量量,即即出出现现了了子子类类变量对同名父类变量的隐藏。变量对同名父类变量的隐藏。 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性85853.5 C#3.5 C#的继承及其实现的继承及其实现n变量的继承与隐藏变量的继承与隐藏 这这里里所所谓谓隐隐藏藏是是指指子子类类拥拥有有
90、了了两两个个相相同同名名字字的的变变量量,一一个个继继承承自自父父类类,另另一一个个由由自自己己定定义义;当当子子类类执执行行继继承承自自父父类类的的操操作作时时,处处理理的的是是继继承承自自父父类类的的变变量量;而而当当子子类类执执行行它它自自己己定定义义的的方方法法时时,所所操操作作的的就就是是它它自自己己定定义义的的变变量量,而而把把继继承承自自父父类的变量类的变量“隐藏隐藏”起来。起来。 new new 关键字可以显式隐藏从基类继承的成员关键字可以显式隐藏从基类继承的成员计算机学院Web应用开发技术 第 3 章 C#的面向对象特性86863.5 C#3.5 C#的继承及其实现的继承及其
91、实现n变量的继承与隐藏变量的继承与隐藏public class BaseC public class BaseC public int x; public int x; public void Invoke() public void Invoke() public class DerivedC : BaseCpublic class DerivedC : BaseC new public new public int xint x; 完整示例完整示例计算机学院Web应用开发技术 第 3 章 C#的面向对象特性87873.5 C#3.5 C#的继承及其实现的继承及其实现n 方法的继承与覆盖方法
92、的继承与覆盖 父父类类的的非非私私有有方方法法作作为为类类的的非非私私有有成成员员可可以以被被子子类所继承。类所继承。 子子类类也也可可以以重重新新定定义义与与父父类类同同名名的的方方法法,实实现现对对父类方法的覆盖。父类方法的覆盖。 子子类类还还可可以以定定义义一一些些父父类类中中没没有有的的方方法法,以以扩扩展展父类的功能。父类的功能。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性88883.5 C#3.5 C#的继承及其实现的继承及其实现n 方法的继承与覆盖方法的继承与覆盖 方方法法的的覆覆盖盖与与变变量量的的隐隐藏藏的的不不同同之之处处在在于于:子子类类隐隐藏藏父父类类的
93、的变变量量只只是是使使之之不不可可见见,父父类类的的同同名名变变量量在在子子类类对对象象中中仍仍然然占占有有自自己己的的独独立立的的内内存存空空间间;而而子子类类方方法法对对父父类类同同名名方方法法的的覆覆盖盖将将清清除除父父类类方方法法占占用用的的内内存存,从从而而使使父父类类方方法法在在子子类类对对象象中中不不复存在。复存在。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性89893.5 C#3.5 C#的继承及其实现的继承及其实现n 方法的继承与覆盖方法的继承与覆盖 using System;using System;class BaseClassclass BaseClas
94、s public void Draw() public void Draw() Console.WriteLine(“this is in the Base”); Console.WriteLine(“this is in the Base”); class SubClass : BaseClassclass SubClass : BaseClass public new void Draw() public new void Draw() Console.WriteLine(“this is in the Sub”); Console.WriteLine(“this is in the Su
95、b”); 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性90903.6 C#3.6 C#语言中的多态与实现语言中的多态与实现n基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都可由其子类继承。n构造方法是类的一种特殊方法,子类调用自己的构造方法时,将追朔到最根部的父类构造方法开始一级一级地调用,基类的构造方法最先调用。 构造方法的继承构造方法的继承计算机学院Web应用开发技术 第 3 章 C#的面向对象特性91913.6 C#3.6 C#语言中的多态与实现语言中的多态与实现using System ;using System ;public class Personpu
96、blic class Person public Person( ) public Person( ) Console.WriteLine(person Constructor.) ; Console.WriteLine(person Constructor.) ; 构造方法的继承构造方法的继承计算机学院Web应用开发技术 第 3 章 C#的面向对象特性92923.6 C#3.6 C#语言中的多态与实现语言中的多态与实现public class Student : Personpublic class Student : Person public Student( ) public Stud
97、ent( ) Console.WriteLine(Student Constructor.) ; Console.WriteLine(Student Constructor.) ; public class MBA : Studentpublic class MBA : Student public MBA( ) public MBA( ) Console.WriteLine(MBA Constructor.) ; Console.WriteLine(MBA Constructor.) ; 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性93933.6 C#3.6 C#语言中的多态
98、与实现语言中的多态与实现public static void Main( )public static void Main( ) MBA c = new MBA( ) ; MBA c = new MBA( ) ; 运行结果如下:person Constructor.Student Constructor.MBA Constructor.计算机学院Web应用开发技术 第 3 章 C#的面向对象特性94943.6 C#3.6 C#语言中的多态与实现语言中的多态与实现子类的构造方法可以有如下几种设计方法。子类的构造方法可以有如下几种设计方法。n 不专门定义自己的构造方法。在这种情况下,每当不专门定义
99、自己的构造方法。在这种情况下,每当创建子类对象时,系统自动调用的实际是父类的无创建子类对象时,系统自动调用的实际是父类的无参数的构造方法。参数的构造方法。n 定义自己的构造方法并调用父类的含参数构造方法。定义自己的构造方法并调用父类的含参数构造方法。在这种情况下,子类在父类构造方法定义的初始化在这种情况下,子类在父类构造方法定义的初始化操作的基础之上,定义子类自己的初始化操作。操作的基础之上,定义子类自己的初始化操作。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性95953.5 C#3.5 C#的继承及其实现的继承及其实现n thisthis与与base base C#C#系系统
100、统默默认认,每每个个类类都都默默认认具具有有nullnull、thisthis和和basebase3 3个成员变量。个成员变量。其其中中nullnull代代表表“空空”,代代表表一一个个什什么么也也没没有有的的“空空”值值。在在定定义义一一个个对对象象但但尚尚未未为为其其开开辟辟内内存存单单元时,可以指定这个对象为元时,可以指定这个对象为nullnull。thisthis和和basebase则则与与继继承承有有密密切切关关系系,thisthis和和basebase常常用来指代当前对象和父类对象。用来指代当前对象和父类对象。 更多的情况下,this用来把当前对象的引用作为参数传递给其他的对象或方
101、法。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性96963.5 C#3.5 C#的继承及其实现的继承及其实现n thisthis thisthis表表示示的的是是当当前前对对象象本本身身,更更准准确确地地说说,thisthis代代表表了了当当前前对对象象的的一一个个引引用用。利利用用thisthis可可以以调调用用当当前前对对象象的方法或使用当前对象的成员变量。例如。的方法或使用当前对象的成员变量。例如。Class Point Class Point int x, y; int x, y; Point Point(int x, int yint x, int y) this.x
102、 = x; this.x = x; this.y = y; this.y = y; 更多的情况下,this用来把当前对象的引用作为参数传递给其他的对象或方法。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性97973.5 C#3.5 C#的继承及其实现的继承及其实现n thisthis public Employee(int weeklySalary, int numberOfWeeks)public Employee(int weeklySalary, int numberOfWeeks) : this(weeklySalary * numberOfWeeks) : this(w
103、eeklySalary * numberOfWeeks) 更多的情况下,this用来把当前对象的引用作为参数传递给其他的对象或方法。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性98983.5 C#3.5 C#的继承及其实现的继承及其实现n basebase basebase表表示示的的是是当当前前对对象象的的直直接接父父类类对对象象,是是当当前前对对象象的的直直接接父父类类对对象象的的引引用用。所所谓谓直直接接父父类类是是相相对于当前对象的其他对于当前对象的其他“祖先祖先”类而言的。类而言的。需需要要注注意意的的是是:thisthis和和basebase是是属属于于类类的的有有
104、特特指指的的成成员员变变量量,只只能能用用来来代代表表当当前前对对象象和和当当前前对对象象的的父父对对象象,而而不不能能像像其其他他类类的的属属性性一一样样随随意意引引用用。下面语句中的用法都是错误的。下面语句中的用法都是错误的。Point p1 = new PointPoint p1 = new Point();();p1.this.getxp1.this.getx();(); /错误错误p2.base.getyp2.base.gety();();/错误错误计算机学院Web应用开发技术 第 3 章 C#的面向对象特性99993.6 C#3.6 C#语言中的多态与实现语言中的多态与实现n所谓多
105、态,是指一个程序中同名的不同方法共存的情所谓多态,是指一个程序中同名的不同方法共存的情况,指同名函数具有不同的行为。况,指同名函数具有不同的行为。nC#C#中多态的实现可以通过方法的重载和类的继承来实中多态的实现可以通过方法的重载和类的继承来实现现 什么是多态什么是多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1001003.6 C#3.6 C#语言中的多态与实现语言中的多态与实现n重载则是在同一个类中定义多个同名方法的情况。重载则是在同一个类中定义多个同名方法的情况。n方法签名由方法名称和一个参数列表(方法的参数方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成
106、。只要签名不同,就可以在一种的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。多种具有相同名称的方法时,就称作重载。n构成重载的条件:参数类型不同,参数个数不同,构成重载的条件:参数类型不同,参数个数不同,参数顺序不同参数顺序不同在上面这个例子中,在同一个类MyClass中,定义了3个同名的方法Print,方法的参数名称与个数也一样都是x,但其参数的类型不同,在主方法Main()中调用该方法时所使用的实参类型不同,来区别不同的方法。使用方法重载实现多态使用方法重载实现多
107、态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1011013.6 C#3.6 C#语言中的多态与实现语言中的多态与实现using System;using System;class MyClassclass MyClass public void Print(int x) public void Print(int x) Console.WriteLine(this is +x);Console.WriteLine(this is +x); public void Print(float x) public void Print(float x) Console.WriteLi
108、ne(this is +x);Console.WriteLine(this is +x); public void Print(string x) public void Print(string x) Console.WriteLine(this is +x);Console.WriteLine(this is +x); static void Main() static void Main() MyClass m=new MyClass(); MyClass m=new MyClass(); m.Print(5); m.Print(2.3f); m.Print(name); m.Print
109、(5); m.Print(2.3f); m.Print(name); 在上面这个例子中,在同一个类在上面这个例子中,在同一个类MyClassMyClass中,定义了中,定义了3 3个个同名的方法同名的方法PrintPrint,方法的参数名称与个数也一样都是方法的参数名称与个数也一样都是x x,但其参数的类型不同,在主方法但其参数的类型不同,在主方法Main()Main()中调用该方法中调用该方法时所使用的实参类型不同,来区别不同的方法。时所使用的实参类型不同,来区别不同的方法。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1021023.6 C#3.6 C#语言中的多态与实现语言
110、中的多态与实现class Point class Point int x, y; int x, y; Point Point()() /构造方法构造方法1 1,没有形式参数的构造方法,没有形式参数的构造方法 x=60; x=60; y=100; y=100; Point Point(int x, int yint x, int y)/构造方法构造方法2 2,两个参数的构造方,两个参数的构造方、/法,初始化法,初始化x x、y y this.x = x; this.x = x; this.y = y; this.y = y; 下面两个语句分别利用两个不同的构造方法来创建Point类的对象。 Po
111、int p1 = new Point(); /调用没有参数的构造方法Point p2 = new Point(60,100);/调用两个参数的构造方法 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1031033.6 C#3.6 C#语言中的多态与实现语言中的多态与实现n 通过在子类中覆盖父类定义的方法实现多态n 通过虚方法实现多态使用继承实现多态使用继承实现多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1041043.6 C#3.6 C#语言中的多态与实现语言中的多态与实现using System;using System;class BaseClasscla
112、ss BaseClass public void Draw() public void Draw() Console.WriteLine(“this is in the Base”); Console.WriteLine(“this is in the Base”); class SubClass : BaseClassclass SubClass : BaseClass public new void Draw() public new void Draw() Console.WriteLine(“this is in the Sub”); Console.WriteLine(“this i
113、s in the Sub”); 方法覆盖实现多态方法覆盖实现多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1051053.6 C#3.6 C#语言中的多态与实现语言中的多态与实现class TestClassclass TestClass static void Main() static void Main() BaseClass drb=new BaseClass(); BaseClass drb=new BaseClass(); SubClass drs=new SubClass(); SubClass drs=new SubClass(); drb.Draw(); d
114、rb.Draw(); / / 调用调用BaseClassBaseClass中的中的DrawDraw方法方法 drs.Draw(); drs.Draw(); / / 调用调用SubClassSubClass中的中的DrawDraw方法方法 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1061063.6 C#3.6 C#语言中的多态与实现语言中的多态与实现n通过虚方法实现多态可以通过两步实现:将父类中的方法用virtual声明为虚方法在子类中用override关键字重写父类的虚方法使用继承实现多态使用继承实现多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性10710
115、73.6 C#3.6 C#语言中的多态与实现语言中的多态与实现public class BaseClasspublic class BaseClass public virtual void DoWork() public virtual void DoWork() public virtual int WorkProperty public virtual int WorkProperty get return 0; get return 0; 使用继承实现多态使用继承实现多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1081083.6 C#3.6 C#语言中的多态与实现语
116、言中的多态与实现public class DerivedClass : BaseClasspublic class DerivedClass : BaseClass public override void DoWork() public override void DoWork() public override int WorkProperty public override int WorkProperty get return 0; get return 0; 使用继承实现多态使用继承实现多态计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1091093.6 C#3.6 C
117、#语言中的多态与实现语言中的多态与实现 在面向对象编程领域中,多态性是方法根据对象的在面向对象编程领域中,多态性是方法根据对象的不同而作出不同行为的能力。在下面这个例子中,抽不同而作出不同行为的能力。在下面这个例子中,抽象类象类ShapeShape有一个有一个CalculateCalculateAreaArea()方法用于计算区()方法用于计算区域面积,但针对不同的形状(圆形、正方形或者长方域面积,但针对不同的形状(圆形、正方形或者长方形)它具有不同的功能。形)它具有不同的功能。 使用多态机制计算不同图形面积使用多态机制计算不同图形面积计算机学院Web应用开发技术 第 3 章 C#的面向对象特
118、性1101103.6 C#3.6 C#语言中的多态与实现语言中的多态与实现使用多态机制计算不同图形面积使用多态机制计算不同图形面积完整代码完整代码计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1111113.7 3.7 接口及其实现接口及其实现n单重继承是指一个子类只能有一个直接父类;单重继承是指一个子类只能有一个直接父类;n多重继承则是指一个子类可以有一个以上的直接父类,多重继承则是指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。该子类可以继承它所有直接父类的成员。n由于由于C#C#只支持单重继承,所以只支持单重继承,所以C#C#程序中的类层次结构程序中
119、的类层次结构是树状结构,这种树状结构在处理某些复杂问题时会是树状结构,这种树状结构在处理某些复杂问题时会显得力不从心。显得力不从心。 单重继承与多重继承单重继承与多重继承 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1121123.7 3.7 接口及其实现接口及其实现n为了使为了使C#C#程序的类层次结构更加合理,更符合实际问程序的类层次结构更加合理,更符合实际问题的本质,编程者可以把用于完成特定功能的若干属题的本质,编程者可以把用于完成特定功能的若干属性组织成相对独立的属性集合;凡是需要实现这种特性组织成相对独立的属性集合;凡是需要实现这种特定功能的类,都可以继承这个属性集合
120、并在类内使用定功能的类,都可以继承这个属性集合并在类内使用它,这种属性集合就是接口。它,这种属性集合就是接口。单重继承与多重继承单重继承与多重继承 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1131133.7 3.7 接口及其实现接口及其实现n接口描述可属于任何类或结构的一组相关行为。接口描述可属于任何类或结构的一组相关行为。 n接口可由方法、属性、事件、索引器或这接口可由方法、属性、事件、索引器或这4 4种成员类种成员类型的任何组合构成。型的任何组合构成。 n接口是用来实现类间多重继承功能的结构。接口是用来实现类间多重继承功能的结构。 C#C#接口概述接口概述计算机学院We
121、b应用开发技术 第 3 章 C#的面向对象特性1141143.7 3.7 接口及其实现接口及其实现n接口是方法定义和常量值的集合。它的主要作用如下接口是方法定义和常量值的集合。它的主要作用如下. .(1 1)通过接口可以实现不相关类的相关行为,而不需要考虑这)通过接口可以实现不相关类的相关行为,而不需要考虑这些类之间的层次关系。些类之间的层次关系。(2 2)通过接口可以指明多个类需要实现的方法。)通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互,而不需要了解对象所对应的类。通过接口可以了解对象的交互,而不需要了解对象所对应的类。 注意:注意:接口定义的仅仅是实现某一特定要求的一
122、组功接口定义的仅仅是实现某一特定要求的一组功能的对外接口和规范,而并没有真正地实现这个功能,能的对外接口和规范,而并没有真正地实现这个功能,这个功能的真正实现是在这个功能的真正实现是在“继承继承”这个接口的各个类这个接口的各个类中完成的,中完成的, C#C#接口概述接口概述计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1151153.7 3.7 接口及其实现接口及其实现 C#C#中使用关键字中使用关键字interfaceinterface来定义一个接口,接口的定来定义一个接口,接口的定义和类的定义很类似,分为接口的声明和接口体。义和类的定义很类似,分为接口的声明和接口体。Inte
123、rface Interface 接口名接口名 接口体接口体 接口的定义接口的定义计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1161163.7 3.7 接口及其实现接口及其实现 n和类的定义相同,一个接口可以通过和类的定义相同,一个接口可以通过“:”来继承来继承其他接口其他接口。n不同的是,由于接口支持多重继承,因此可以在不同的是,由于接口支持多重继承,因此可以在“:”后加上多个接口,这些接口名之间用逗号分隔后加上多个接口,这些接口名之间用逗号分隔。public interface myinterfac public interface myinterfac : interfa
124、ce1, interface1, interface2interface2 接口的定义接口的定义计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1171173.7 3.7 接口及其实现接口及其实现类要实现接口时,请注意以下问题。类要实现接口时,请注意以下问题。1 1) 在类的声明部分,用在类的声明部分,用“:”关键字声明该类将要关键字声明该类将要实现哪些接口。实现哪些接口。2 2) 如果实现某接口的类不是如果实现某接口的类不是abstractabstract的抽象类,则的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽
125、象方法定义方法体,而且方法头部分应即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回该与接口中的定义完全一致,即有完全相同的返回值和参数列表。值和参数列表。3 3) 如果实现某接口的类是如果实现某接口的类是abstractabstract的抽象类,则它的抽象类,则它可以不实现该接口所有的方法。可以不实现该接口所有的方法。接口的实现接口的实现计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1181183.7 3.7 接口及其实现接口及其实现类要实现接口时,请注意以下问题。类要实现接口时,请注意以下问题。4 4) 一个类在实现某接口的抽象方法时,必
126、须使用完一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。全相同的方法头。5 5)接口的抽象方法的访问限制符都已指定为)接口的抽象方法的访问限制符都已指定为publicpublic,所以类在实现方法时,必须显式地使用所以类在实现方法时,必须显式地使用publicpublic修饰修饰符,否则将被系统警告为缩小了接口中定义的方法符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。的访问控制范围。接口的实现接口的实现计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1191193.7 3.7 接口及其实现接口及其实现在一个类中实现多个接口时,如果各接口包含有相同在一个类中实
127、现多个接口时,如果各接口包含有相同名称的成员,那么在这个类中对该成员的实现只能名称的成员,那么在这个类中对该成员的实现只能有一个,就有一个,就是是多个接口都是用同一个方法来实现。多个接口都是用同一个方法来实现。例如:例如:interface Idriverinterface Idriver void run();void run(); 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1201203.7 3.7 接口及其实现接口及其实现interface Ipowerinterface Ipower void run(); void run(); class car: Idriver
128、, Ipowerclass car: Idriver, Ipower public void run()public void run() 计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1211213.8 3.8 异常处理异常处理程序错误按其发生的时间分为两种:程序错误按其发生的时间分为两种:n一种是语法错误,在程序编译的时候就可以被发现、一种是语法错误,在程序编译的时候就可以被发现、被修改;被修改;n另外一种错误在程序编译时是看不到的,直到程序另外一种错误在程序编译时是看不到的,直到程序运行时才发生,这些错误是随机的、多变的,称之运行时才发生,这些错误是随机的、多变的,称之为异
129、常。为异常。 异常产生的原因异常产生的原因计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1221223.8 3.8 异常处理异常处理n异常是指程序运行时产生的错误,导致不完善或者异常是指程序运行时产生的错误,导致不完善或者不需要的结果,使程序不能继续执行。比如,不需要的结果,使程序不能继续执行。比如,1.1.算数运算中的除零操作会产生溢出;算数运算中的除零操作会产生溢出;2.2.读取磁盘文件时找不到文件引起读错误。读取磁盘文件时找不到文件引起读错误。n在在C#C#中异常处理是通过中异常处理是通过ExceptionException基类进行的。基类进行的。 异常产生异常产生的的原因
130、原因计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1231233.8 3.8 异常处理异常处理 n 捕获异常捕获异常 在在C#C#中捕获异常的方法是采用中捕获异常的方法是采用try-catch-finallytry-catch-finally语语句,可能出现异常的语句放在句,可能出现异常的语句放在trytry语句块中,每个语句块中,每个catchcatch语句处理一种类型的异常对象,语句处理一种类型的异常对象,finallyfinally语句语句是所有是所有try-catchtry-catch过程的统一出口,不论是否执行过程的统一出口,不论是否执行catchcatch语句,或执行
131、某一个语句,或执行某一个catchcatch语句,程序最终必语句,程序最终必须执行须执行finallyfinally语句块。其语句结构如下:语句块。其语句结构如下:捕获异常与抛弃异常捕获异常与抛弃异常计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1241243.8 3.8 异常处理异常处理 trytry / /可能出现异常的语句可能出现异常的语句catchcatch(异常类(异常类1 1 引用)引用) / /对异常类对异常类1 1的处的处 catchcatch(异常类(异常类2 2 引用)引用) / /对异常类对异常类2 2的处理的处理 finally /try-catchfin
132、ally /try-catch语句的统一出口语句的统一出口 捕获异常与抛弃异常捕获异常与抛弃异常计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1251253.8 3.8 异常处理异常处理n 创建自己的异常类创建自己的异常类如果发生的异常属于系统已定义的异常,可以直接通如果发生的异常属于系统已定义的异常,可以直接通过过ExceptionException基类处理,如果发生的异常不是系统已定基类处理,如果发生的异常不是系统已定义的异常,那么就需要我们自己定义一个异常处理类,义的异常,那么就需要我们自己定义一个异常处理类,当然这个类是继承自当然这个类是继承自ExceptionExcep
133、tion基类的子类。基类的子类。计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1261263.8 3.8 异常处理异常处理using System;using System;public class MyException:Exceptionpublic class MyException:Exception public string s;public string s;public MyException(string public MyException(string message):base()s=message.ToString();message):base()s=
134、message.ToString();public static void Test()public static void Test() throw new MyException(something wrong);throw new MyException(something wrong);计算机学院Web应用开发技术 第 3 章 C#的面向对象特性1271273.8 3.8 异常处理异常处理public static void Main()public static void Main() Try Test();Try Test();catch(MyException e) catch(MyException e) Console.WriteLine(e.s);Console.WriteLine(e.s); 计算机学院