版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教育部普通高等教育十二五国家级规划教材
《C#程序设计及应用教程》第3版
(包括简化版:《C#程序设计教程》第3版)
第3章类和结构2Ch3类和结构3.1自定义类(class)和结构(struct)3.2属性和方法3.3类的继承与多态性3.4常用结构和类的用法(课后自学)
3.1自定义类(class)和结构(struct)
3.1.1类的定义和成员组织3.1.2访问修饰符3.1.3静态成员和实例成员3.1.4构造函数和析构函数3.1.5字段和局部变量3.1.6结构的定义和成员组织343.1.1类的定义和成员组织类:定义对象具有的特征(字段、属性等)和可执行的操作(方法、事件等)。例如:某单位的员工是一个类,则该单位的张三、李四和王五等都是对象(员工的实例).
自定义类的常用形式:
[访问修饰符][static]class类名[:基类[,接口序列]]{[类成员]}类成员:包括字段、属性、构造函数、方法、事件、运算符、索引器、析构函数等。53.1.2访问修饰符类和类的成员都可以使用下面的访问修饰符。public:类的内部和外部代码都可以访问。private:类的内部可访问,类的外部无法访问。如果省略类成员的访问修饰符,默认为private。(Java语言默认为protected)internal:同一个程序集中的代码都可以访问,程序集外的其他代码无法访问。如果省略类的访问修饰符,默认为internal。(Java中无此关键字)protected:类的内部或者从该类继承的子类可以访问。protectedinternal:从该类继承的子类或者从另一个程序集中继承的类都可以访问。请大家看书P69页下方Person类的例子6partial修饰符:包含partial修饰符的类称为分部类。可将类的定义分布在多个文件中,编译器编译带有partial修饰符的类时,会自动将这些文件合并在一起。可隔离自动生成的代码和人工书写的代码。(在Win窗体应用程序和WPF中有应用)例如:可将一个类(类名为:MyClass)的编写工作同时分配给3个人,每人负责写一个文件,文件名可以分别为MyClassP1.cs、MyClassP2.cs和MyClassP3.cs,每个文件内都用下面的形式定义MyClass类:这样就可让多个人同时在一个类中分别实现自己的代码,而且还能相互看到其他文件中MyClass类定义的成员(属性、方法等)。
3.1.2访问修饰符publicpartialclassMyClass{ //……}3.1.2访问修饰符【例3-1】演示如何声明类、字段、构造函数和方法,同时说明如何实例化对象、如何使用分部类以及如何输出实例数据7请大家看书P71页下方Student类的例子83.1.3静态成员和实例成员通过类名调用静态成员,通过实例名调用实例成员。1.static关键字表示类或成员加载到内存中只有一份,而不是有多个实例。当垃圾回收器检测到不再使用该静态成员时,会自动释放其占用的内存。可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或者类以外的类型。静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。静态方法可以被重载但不能被重写,因为它们属于类,而不属于类的任何实例。93.1.3静态成员和实例成员2.静态类声明自定义类时如果加上static关键字,则该类就是静态类。静态类的主要特点:仅包含静态成员。无法实例化。这与在非静态类中定义私有构造函数可阻止类被实例化的机制相似。是密封的,因此不能被继承。不能包含实例构造函数,但可以包含静态构造函数。如果非静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函数。103.1.4构造函数和析构函数构造函数:是创建对象时自动调用的函数。一般在构造函数中做一些初始化工作,或者做一些仅需执行一次的特定操作。构造函数没有返回类型,并且它的名称与其所属的类的名称相同。C#支持两种构造函数:实例构造函数和静态构造函数。1.实例构造函数每创建一个对象,都会先通过new关键字指明调用的构造函数,这种构造函数称为实例构造函数。例如:Childchild=newChild();这条语句的Child()就是被调用的实例构造函数。113.1.4构造函数和析构函数2.静态构造函数(了解即可)如果构造函数声明包含static修饰符,则为静态构造函数,否则为实例构造函数。创建第一个实例或引用任何静态成员之前,CLR会自动调用静态构造函数。例如: classSimpleClass { staticreadonlylongbaseline; staticSimpleClass() { baseline=DateTime.Now.Ticks; } }123.1.4构造函数和析构函数静态构造函数的特点:静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,CLR会自动调用静态构造函数来初始化类。换言之,静态构造函数是在实例构造函数之前执行的。程序员无法直接调用静态构造函数,也无法控制何时执行静态构造函数静态构造函数仅调用一次。如果静态构造函数引发异常,在程序运行所在的应用程序域的生存期内,类型将一直保持未初始化的状态。133.1.3构造函数和析构函数3.默认构造函数和私有构造函数每个类要求必须至少有一个构造函数。如果代码中没有声明构造函数,则系统会自动为该类提供一个不带参数的空的构造函数,这种自动提供的构造函数称为默认构造函数。构造函数一般用public修饰符,但也可以用private创建私有构造函数。私有构造函数是一种特殊的构造函数,通常用在只包含静态成员的类中,用来阻止该类被实例化。如果不指定构造函数的访问修饰符,默认是private。但是,一般都显式地使用private修饰符来清楚地表明该类不能被实例化。4.重载构造函数构造函数可以被重载(Overloading),但不能被继承。请看书P74页中间部分的说明143.1.4构造函数和析构函数5.析构函数和自动内存管理(了解即可)析构函数析构函数是一种用于实现销毁类实例所需操作的成员。析构函数不能带参数,也不能包含访问修饰符。析构函数是自动调用的,不能显式调用析构函数。自动内存管理由C#使用垃圾回收器实现,即自动决定何时释放和销毁内存。如果声明了析构函数,开发人员也可通过System.GC的静态方法在一定程度上控制垃圾回收器的行为。该类可用于请求执行一次回收操作、并自动判断是否应该执行析构函数。153.1.5字段和局部变量字段是类的成员,局部变量是块的成员。1.字段(即:私有的类成员属性)字段是指在类或结构中声明的“类级别”的变量。或者说,字段是整个类内部的所有方法和事件中都可以访问的变量。2.只读字段(readonly)readonly关键字用于声明可以在程序运行期间只能初始化“一次”的字段。初始化的方法有两种,一种是在声明语句中初始化该字段,另一种是在构造函数中初始化该字段。3.局部变量局部变量是相对于字段来说的。可以将局部变量理解为“块”级别的变量。请看P76页上方的小例子请看P76页中间的小例子163.1.6结构的定义和成员组织结构是值类型,它和类的主要区别是结构中的数据保存在堆栈(Stack)中而不是保存在堆(Heap)中。另外,所有结构都隐式地从Object继承,但自定义结构时,不能从其他结构继承。结构成员和类成员相同,包括字段、属性、构造函数、方法、事件、运算符、索引器、析构函数等。【例3-2】分别用类和结构定义具有x、y坐标的点,然后在主程序中各创建并初始化一个含有10个点的数组。结构对于具有值语义的小型数据尤为有用17183.2属性和方法3.2.1属性(Property)3.2.2方法193.2.1属性(Property)属性(property)是字段的扩展,用于提供对字段读写的手段。属性和字段的区别是:属性通过get访问器和set访问器指定读写字段的值时需要执行的语句,具体地: i.对外公开某字段的访问权限(“读”方法:“get”) ii.对字段的修改进行验证(“写”方法:“set”)1.常规属性声明如果需要对外公开某些字段,并对字段的值进行验证,可以利用属性的get和set访问器来实现。2.自动实现的属性自动实现的属性是指开发人员只需要声明属性,而与该属性对应的字段则由系统自动提供。自动实现的属性必须同时声明get和set访问器。请看书P79页上方例子和中间的三段说明!203.2.2方法方法是类或结构的一种成员,是一组程序代码的集合,用于完成指定的功能。每个方法都有一个方法名,便于识别和让其他方法调用。1.方法的声明和参数传递定义方法的一般形式为
[访问修饰符]返回值类型
方法名([参数序列]) { [语句序列] }方法声明中的参数用于向方法传递值或变量引用。方法的参数从调用该方法时指定的实参获取实际值。有四类参数:值参数、引用参数、输出参数和参数数组。213.2.2方法(1)值参数值参数(valueparameter)用于传递输入参数。一个值参数相当于一个局部变量,只是它的初始值来自为该形参传递的实参。【例3-3】演示值参数的基本用法。看书P80页下方例子,注意指定参数默认值的情况223.2.2方法(2)引用参数
引用参数(referenceparameter)用于传递输入和输出参数。为引用参数传递的实参必须是变量,并且在方法执行期间,引用参数与实参变量表示同一存储位置。引用参数使用ref修饰符声明。【例3-4】演示引用参数的基本用法。当将值类型作为引用参数传递时,必须使用ref关键字。对于引用类型来说,可省略ref关键字233.2.2方法(3)输出参数输出参数(outputparameter)用于传递返回的参数,用out关键字声明。格式为
out参数类型
参数名【例3-5】演示out关键字的用法。请看书P82页上方的例子,注意out关键字的用法243.2.2方法(4)参数数组
参数数组用于向方法传递可变数目的实参,用params关键字声明。如果方法有多个参数,只有最后一个参数才可以用参数数组声明,并且参数数组的类型必须是一维数组类型。【例3-6】演示params关键字的基本用法。当需要传递的参数的个数不确定时使用。253.2.2方法2.方法重载
***方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。这种技术非常有用,在项目开发过程中,我们会发现很多方法都需要使用方法重载来实现。请看书P83页下方的例子263.3类的继承与多态性3.3.1封装(简单复习)3.3.2继承(简单复习)3.3.3多态(new、virtual、override)273.3.1封装封装一个类时,既可以像定义一个普通的类一样,也可以将类声明为抽象类或者密封类。1.抽象类(abstractclass)抽象类使用abstract修饰符来描述,用于表示该类中的成员(例如方法)不一定实现,即可以只有声明部分而没有实现部分。抽象类只能用做其他类的基类,而且无法直接实例化抽象类。2.密封类(sealed)密封类是指不能被其他类继承的类。在C#语言中,用sealed修饰符声明密封类。由于密封类不能被其他类继承,因此系统就可以在运行时对密封类中的内容进行优化,从而提高系统的性能。283.3.2继承继承用于简化类的设计工作量,同时还能避免设计的不一致性。一般将公共的、相同的部分放在被继承的类中,非公共的、不相同的部分放在继承的类中。1.类继承的一般形式在C#中,用冒号(“:”)表示继承。被继承的类叫基类或者父类,从基类继承的类叫扩充类,又叫派生类或者子类。继承意味着一个类隐式地将它的基类的所有成员当作自已的成员,而且派生类还能够在继承基类的基础上继续添加新的成员。但是,基类的实例构造函数、静态构造函数和析构函数除外。扩充类不能继承基类中所定义的private成员,只能继承基类的public成员或protected成员。293.3.2继承2.继承过程中构造函数的处理扩充类可继承基类中声明为public或protected的成员。构造函数在扩充类中不会被继承下来。如果让构造函数也能继承,由于扩充类中无法访问基类的私有成员,从而导致程序运行失败。C#在内部按照下列顺序处理构造函数:从扩充类依次向上寻找其基类,直到找到最初的基类,然后开始执行最初的基类的构造函数,再依次向下执行扩充类的构造函数,直至执行完最终的扩充类的构造函数为止。(了解即可)【例3-7】演示继承的基本用法。30313.3.3多态(new、virtual、override)
多态性的定义是:同一操作可分别作用于不同的类的实例,此时不同的类将进行不同的解释,最后产生不同的执行结果。也就是说,具有不同功能的方法可以用一个方法名。
在面向对象方法中这样描述多态性:向不同的对象发送同一个消息,它们接收后会产生不同的行为(即方法)。消息是指对类的成员函数的调用;不同的行为是指不同的实现,也就是调用了不同的函数。
请从P89页开始逐行划重点!
函数的重载、运算符重载都是多态现象。
从系统实现的观点看,多态性分为两类:静态多态和动态多态性。以前学过的函数重载和运算符重载属于静态多态性,在编译程序时系统就可以确定调用哪个函数,因此静态多态性又称编译时的多态性。静态多态性是通过函数重载实现的。
动态多态性是在程序运行中才能确定所针对的操作对象。它又称运行时的多态性。动态多态性是通过虚函数实现的。3.3.3多态(new、virtual、override)
例如:设类B是类A的子类,即:类B继承自类A。如果子类B和父类A中都定义有同名的方法,当使用B类的对象调用该方法时,定义这个对象的类,也就是父类A中的同名方法将被调用。
如果在父类A中的该方法前加上virtual关键字,并且在子类B中的同名方法前面加override关键字(即:在子类中重写基类的方法),那么子类B中的同名方法将被调用!333.3.3多态(new、virtual、override)有以下几种实现多态性的方式:i.通过继承实现多态性:多个类可以继承自同一个类,每个扩充类中又可根据需要重写基类成员以提供不同的功能。ii.通过抽象类实现多态性:抽象类本身不能被实例化,只能在扩充类中通过继承使用。抽象类的部分或全部成员不一定都要实现,但是要在继承类中全部实现。抽象类中已实现的成员仍可以被重写,并且继承类仍可以实现其他功能。iii.通过接口实现多态性:多个类可以实现相同的“接口”,并且一个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口仅声明类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,而这些成员的特定实现则留给实现类去完成。34请看书P89页下方的例子举例:
定义一个抽象类:北京菜
类中的纯虚函数包括:{
宫保鸡丁做法
酱爆鸡丁做法
鱼香肉丝做法
糖醋里脊做法 }但是每道菜都没有具体的实现,而是要根据派生类的不同,定义具体的不同的详细的炒菜(实现)方法因为不同的人,做同一道菜的炒法和“实现”会有所不同。比如大厨(类)和普通人(类)的做法就不同;儿子(类)从爸爸(类)那里学来基本做法,更可能有自己的做法(重写:override)3.3.3多态(new、virtual、override)1.虚拟(virtual)和重写(override)使用虚拟方法与重写方法时,需要注意下面几个方面。虚拟方法不能声明为静态(static)的。因为静态的方法是应用在类这一层次的,而面向对象的多态性只能通过对象进行操作,所以无法通过类名直接调用。virtual不能和private一起使用。声明为private就无法在扩充类中重写了。重写方法的名称、参数个数、参数类型以及返回类型都必须和虚拟方法的一致。36请看书P90页中间的例子373.3.3多态(new、virtual、override)2.隐藏(new)编写方法时,如果希望扩充类重写基类的方法,需要在扩充类中用override声明;如果希望隐藏基类的方法,在扩充类中需要用new声明,这就是C#语言进行版本控制的依据。除了重写基类的方法外,还可以在扩充类中使用new修饰符来隐藏基类中同名的方法。与方法重写不同的是,使用new关键字时并不要求基类中的方法声明为virtual,只要在扩充类的方法前声明为new,就可以隐藏基类的方法。383.3.3多态(new、virtual、override)3.在扩充类中直接调用基类的方法可以在扩充类中通过base关键字直接调用基类的方法,例如:classMyBaseClass{publicvirtualintMyMethod(){return5;}}classMyDerivedClass:MyBaseClass{publicoverrideintMyMethod(){returnbase.MyMethod()*4;}}39403.4常用结构和类的用法3.4.1Math类3.4.2DateTime结构和TimeSpan结构3.4.3秒表和计时器3.4.4随机数413.4.1Math类Math类定义了各种常用的数学运算,该类位于System命名空间下,其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理研究生中文文献汇报
- 中风病恢复期的护理
- 2025年沙河口区数学四下期中模拟试题含答案解析
- 中职专用《最后一片叶子》语文基础模块上册(高教版)B卷(解析版)
- 2025年木结构建筑可再生能源整合设计
- 安全b类基础试题及答案呈现
- DB44-T 2892-2026企业商业秘密保护合规管理规范
- 2025-2026年江苏省苏教版七年级英语下册第12单元课后习题
- 2025年西安交通大学钱学森班(能源与动力)入学考试试题及答案
- 公共基础管理 大纲 -
- 核心素养下的小学数学计算讲座
- 中医药健康知识讲座课件版
- 加盟招商合同协议模板
- 储备主管竞选述职报告
- 《眼科解剖及生理》课件
- 《三七总皂苷对ApoE-小鼠动脉粥样硬化炎症反应的影响及其机制研究》
- 《租赁厂房和仓库消防安全管理办法(试行)》专题培训
- JGJ52-2006 普通混凝土用砂、石质量及检验方法标准
- 房颤导管消融的适应症课件
- 经济思想史讲义兰州大学
- 房产测量作业指导书
评论
0/150
提交评论