《C#程序设计》课件第6章类和方法_第1页
《C#程序设计》课件第6章类和方法_第2页
《C#程序设计》课件第6章类和方法_第3页
《C#程序设计》课件第6章类和方法_第4页
《C#程序设计》课件第6章类和方法_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类和方法思政目标:

☞理论来源于实践,通过实践操作,激发对编程的兴趣

☞通过面向对象程序设计方法的学习,提高抽象思维能力技能要求:

☞掌握面向对象程序设计的基本概念

☞了解类与对象、字段、属性、方法的概念及用法

☞理解并掌握Main()函数和static方法的用法实践目标:

☞根据示例,对所学的概念进行验证

☞熟练应用面向对象方法实现编程设计

☞能够通过练习进一步认识面向对象设计方法第6章类与成员类方法类的派生类与成员01PART面向对象是一种软件开发方法,它的三大基本特征如下类与对象(1)封装。它将数据及对数据的操作封装为一个有机不可分割的整体,对外隐藏具体实现细节,从而实现可重用、易维护等优秀特性。(2)继承。子类从父类获得父类特征,同时也可以扩展自己新的特征。继承也能实现代码重用。(3)多态。多态性意味着有多重形式,往往表现为“一个接口,多个功能”。类是面向对象最基本、最重要的概念,它定义了数据及对数据所做的操作,带有一定的封闭性。类与成员类属于抽象概念,是对象的模板;对象属于具体概念,是类的具体化表示,对象会被分配物理内存。类一般的定义方式如图6-1所示。应注意的是,成员类型不同,则定义方式不相同。类与对象类与成员类的定义方式类与对象类与成员实例化的操作方式是:借助关键字new,从类中获得对象字段类与成员字段即类中的常量或者变量,它使类具备封装数据的能力。字段的声明方式即变量的声明方式,常用方法是将字段声明为private,然后通过属性、方法等来访问其内容。private声明的字段在该类或者该类的实例化对象外无法直接访问,若希望直接访问,可使用public声明的字段,其访问方式是在类名或者实例化对象名后面通过“.”来访问字段类与成员上面的示例可以看到字段的定义方式、字段修饰符(private和public)的作用、字段的使用以及类与对象的关系。同时,也可以使大家更深刻的理解类的抽象和对象的具体,以及类的封装特性和抽象特性。上面出现的star类实例化后得到不同的对象,但是对象在类的抽象层次上是一致的,即都包含姓名和年龄。属性类与成员常规属性常规属性需要具体的实现get(读访问器)或者set(写访问器),而且一般需要有一个字段与之相对应属性类与成员常规属性属性类型取决于get和set:get和set同时具备时,该属性是一个可读可写属性;只有get时称为只读属性;只有set时称为只写属性。可以根据实际情况决定这两个访问器的取舍。类与成员常规属性示例类与成员常规属性示例属性类与成员自动属性自动属性简化了封装数据字段的过程,减轻了定义私有返回字段和相关属性成员的工作,即在该方式下,无须定义一个相应的私有字段,也不必要写“return…”和“…=value;”这两个语句方法类与成员方法的定义与使用(1)访问修饰符可以取public、private、internal和protected等,常用的有public和private。当private修饰的方法在类或者对象外无法直接访问时,可使用public修饰(2)方法的返回值类型根据实际需要拟定,可通过return关键字实现,无须返回值时应使用void。(3)方法名是一个有意义的标识符,需要描述出方法的用途。(4)方法参数列表可为数组。(5)方法体包含了调用方法时实际执行的语句。方法类与成员方法类与成员上面方法虽然实现无返回值,但是其内部的输出方式并不合适。现在需要将它修改为有返回值的方法,下面的代码仅给出方法的定义和调用部分程序的执行结果不变。这个示例中,Introduce()方法有返回值,其返回值是字符串类型。此时Introduce()方法仅将信息准备好,然后由调用方完成信息的输出方法类与成员方法像是一个工厂,根据提供的原材料生产产品供外部使用。通过有参的方法来处理数据程序的运行结果同上例。这个例子中不需要属性,也可以完成对数据的处理,该程序还存在一个年龄非法的问题,只需在方法内部加入适当的检测代码即可。上面的例子演示了属性和方法一同完成程序的过程:先用属性存储基本数据,然后通过方法的操作把这些数据变得有价值,最后经过方法将加工后的产品送出,这就是封装。封装的优势是调用方不需要在意产品加工过程。封装是将数据和操作融为一个有机整体。类通过字段存储数据,通过属性完成对字段的访问,通过方法来对数据进行操作,然后将操作得到的结果交给调用方。方法类与成员方法的重载重载的构成需要方法满足如下条件:(1)方法名相同。(2)方法名之外的其他方法签名指标不能完全相同。(3)返回值不属于方法签名的内容,所以不能通过返回值的不同来实现重载。(4)不能通过static来实现重载,即若两个方法一样,仅一个为static,一个为非static,两个方法无法构成重载,也无法通过编译。方法类与成员方法的重载方法的重载可以将两个Introduce()方法都保留在star类中方法类与成员参数的个数不定问题——paramsparams可以用于方法参数个数不定的场合,且调用方式灵活从该例可以看出:params是应对参数不定问题的好方法。上面示例中定义了一个数组并且将数组作为参数传递。params关键字使用时,需要注意以下三点:(1)一个方法中最多只能出现一个params。(2)当参数为params修饰时,要防止外界传入非法参数,如null。(3)params只能放到所有参数的最后面,即params修饰的参数后面不能再有参数。方法类与成员this当参数与类的字段重名时,代码虽然没有错误,编辑器却会出现警告方法类与成员this显然,输出结果存在问题,此问题解决方法也很简单,使用this关键字即可,this关键字用于指示当前对象“自己”。将上面的代码用this进行改写方法类与成员this显然,输出结果存在问题,此问题解决方法也很简单,使用this关键字即可,this关键字用于指示当前对象“自己”。将上面的代码用this进行改写类方法02PARTMain()函数类方法Main()函数也称Main()方法,它是一种特殊的方法。其特殊之处如下:(1)Main()函数是可执行程序的入口点,且是唯一的入口点。(2)Main()函数可以带一个字符串数组参数,也可以不带参数。(3)Main()函数一般为void类型的,也可以声明为int类型。(4)Main()函数可以声明为static,也可以声明为非static类型。(5)应用程序的执行在Main()中开始,也在Main()中结束,对应的线程为主线程。参数传递演示Main()函数类方法编译上述程序为dll或者exe。本示例编译得到MainTest.exe(注意上述程序中要将类和Main()方法声明为public),然后新建一个标准项目,接着添加对刚刚生成的MainTest.exe的引用返回值演示Main()函数类方法将程序编译为MainTest.dll,注意当Main()方法为非static时,是无法编译为exe的,然后新建一个标准项目,引用MainTest.dll非静态Main()函数演示由于在MainTest中,Main()函数声明为非static的,故使用时需要先实例化Static类方法类的成员类型分为静态的和非静态的,因而方法也分为静态方法和非静态方法(即实例方法),使用static的方法是静态方法,没有使用的就是非静态方法。静态方法和非静态方法的区别是:静态方法属于类所有,非静态方法属于用该类定义的对象(实例)所有。是否使用static可以在访问方式上直观体现出来。除了构造函数外,其他成员的访问方式有如下特点:使用static时,通过类名和“.”即可访问;未使用static时,通过类的对象和“.”来访问。Static类方法static成员被类的所有实例对象共享,因此,它可以用于同一个类的多个对象之间通信。static变量(也常被称为类变量)的默认值规则为:数值类型的默认为0;布尔类型的默认值为false;引用类型的默认值为null。static修饰构造函数时,该构造函数称为静态构造函数。Static类方法Static类方法从执行结果可以看到:(1)静态构造函数在创建类的实例化对象之前执行且仅执行一次,而普通的构造函数需要实例化一次就执行一次。(2)程序两个属性的赋值初始化都是在构造函数中完成。(3)普通构造函数在实例化时才会执行,普通方法则需要在实例化之后才能通过实例化对象来调用。(4)静态属性及静态方法都需要用类名来访问,若用实例化对象,则访问无法成功。Static类方法使用static时还需要注意如下九点。(1)静态方法中不能直接使用非静态成员,因为非静态成员与实例相关,可以通过对象(即“对象.非静态成员”方式)间接使用,但非静态方法中可以使用静态成员。(2)静态构造函数一定是无参数。(3)静态构造函数不可继承,也不能被直接调用。(4)当静态构造函数和实例构造函数同时存在时,首先调用静态构造函数。(5)静态构造函数不能使用访问修饰符,如public、private都不能使用。(6)类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才会激发。(7)如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助自动生成一个静态构造函数来让自身调用。(8)如果类中包含程序入口的Main()函数,则该类的静态构造函数将在调用Main()函数之前执行。执行类的静态构造函数时,要按照代码顺序执行那些被初始化的静态字段。(9)一个类可以同时拥有实例构造函数和静态构造函数,这是唯一可以具有相同参数列表的同名方法共存的情况。构造函数与析构函数类方法构造函数(也叫构造方法)是一类特殊的方法,它与普通方法的不同之处体现在以下五个方面。(1)构造函数的函数名称必须与类名相同。(2)构造函数可以带参数,但不能有返回值。(3)构造函数可隐式匹配,不能显式调用。当有多个构造函数共存时,将由实例化时所传入的参数情况而自动匹配最佳的构造函数。(4)如果没有给类定义一个构造函数,系统就会自动生成一个无参构造函数。若有自行编写的构造函数,无论其是否带参数,系统都不会再自动生成。(5)构造函数是在实例化类时执行,即通过new来隐式调用,故常在构造函数中做初始化工作。构造函数构造函数的访问修饰符一般为public,根据需要,也可以选择其他访问修饰符。前面讲解方法和属性时,程序通过属性赋值指定类的实例化对象的信息,通过方法将信息做适当处理后输出。下面将使用构造函数来完成类似功能构造函数与析构函数类方法构造函数从上述内容可以看到,构造函数的执行时机是类被实例化时,此时,系统会自动根据用户实例化时的情况调用与之匹配的构造函数。构造函数与析构函数类方法析构函数用于程序的收尾和善后处理工作,从内存释放类实例所占用的资源;构造函数则用于程序的初始化工作。析构函数的特殊性表现在以下四个方面:(1)析构函数的名字与类名相同,但它前面需要加一个浪形符号,即“~”。(2)析构函数不能带参数,也没有返回值。(3)析构函数不能被继承,也不能被重载。

(4)撤销对象时,会自动调用析构函数。析构函数如果用户没有编写析构函数,编译系统会自动生成一个默认的析构函数,该析构函数没有任何操作,所以许多简单的类中并没有定义显式的析构函数。类的派生03PART继承类的派生继承是在现有类(父类)上建立新类(子类)的处理过程,它使子类自动的获得父类所具备的特性,这使得创建和维护应用程序变得更容易。声明一个star类,包含Name属性、Age属性和Introduce方法继承类的派生再声明一个singer类通过比较上面的两个类,可以看到,两个类虽然不一样,但却具有很多相同的代码,逻辑上两者也有一定的关系,singer类具备star类所有的特性,这正是继承的典型特性继承类的派生接下来就利用继承的特性来对singer类进行改写继承类的派生程序运行结果验证了singer类继承了star类的属性。程序虽然顺利执行,但忽略了一个问题:现在是singer类,一个singer的自我介绍还应包含一个代表歌曲。把这个介绍放到Introduce中的方法很简单,只需要把Introduce()方法按照自己的要求重新写一遍即可多态类的派生讲多态前,先来看个继承的例子。首先看基类该类派下衍生两个子类多态类的派生两个子类的输出很明显存在问题,其表达形式应该更贴切一些,如singer输出“我是一个歌星!”,而filmStar输出“我是一个影星!”多态类的派生从该上例中可以看到:如果子类和父类有同名成员,则子类成员将会隐藏从父类那里继承而来的同名成员。若期望子类的方法被执行,且父类的同名方法不被隐藏也得到执行,可以在子类方法中通过base关键字来调用父类同名方法多态类的派生警告的问题,解决方法是使用new关键字,此时的new关键字表示子类明确地声明它要隐藏继承过来的同名方法。改

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论