1第5章面向对象编程基础主讲:陈有志2/21教学目标面向对象程序设计(ObjectOrientedProgramming,简称OOP)采用面向对象的程序分析和设计技术开发的软件系统,稳定性、可重用性和可维护性都很好。本章首先介绍OOP的基础知识,进而引导学生踏入面向对象程序设计的殿堂3/21教学重点面向对象编程接口与继承多态性引用类型和值类型4/21什么是面向对象编程(OOP)面向对象编程是创建计算机应用程序的一种相当新的方法,它解决了传统编程技巧带来的问题。以前我们使用C语言或其他语言编写的应用程序是所谓的单一应用程序,即所有的功能都包含在一个代码模块中。而使用面向对象编程,常常要使用许多代码模块,每个模块都提供特定的功能,每个代码模块都是独立的。这种模块化编程方法提供了非常大的多样性,大大增加了代码的重用机会。举个例子说明,假定一个应用程序是一辆一流赛车,如果使用传统的编程技巧,这辆赛车就是一个整体,如果要升级赛车,我们需要把车返厂,换一个不同型号的赛车;而如果使用面向对象编程技术,我们只需要向厂家订购需要升级部分的零件,即用更高级的零件替换掉原有的零件就可以了。我们刚才所说的代码模块,就是C#中的类,在C#中我们把每个代码模块创建成一个类。整个应用程序由许多类组成的。5/21面向对象概述在客观世界中,可以把具有相似特征的事物归为一类,也就是把具有相同属性的对象看成一个类(class)。在面向对象的程序设计中,“类”就是对具有相同属性和相同操作的一组对象的定义。从另一个角度来看,对象就是类的一个实例。6/21类和对象类:相对对象而言,类似于蓝图包含方法和数据对象:是类的实例使用关键字new创建对象类厨房起居室浴室书房饭厅储藏室门廊7/21关于对象和类的举例人Mary抽象类共同的特征:姓名、身高、体重、嘴……共同的行为:吃饭、说话、思考……Tom实例8/21类和对象的通俗说法类:平时我们说话经常说的,“这一类”,“那一类”,“物以类聚,人以群分”中提到的类基本没有区别。你去查汉语词典中“类”的解释,与计算机中对“类”的定义基本上如出一辙。所以就按照你平时生活中的理解去理解类就行了。对象:其实是因为这个词儿是从英文翻译过来的,如果翻译成中文可以翻译成一个更贴切的词“东西”。其实面向对象中的对象就是日常中指的东西。这样就好理解了,一类东西,这些东西是一类的。就相当于面向对象语言中通过类定义对象一样。一类里会有多个东西。每个东西都有属于自己的特征(即C#中不同对象都有属于自己的数据)。9/21类的声明类由类头和类体两部分组成,类声明的格式为:类修饰符class类名//类头{//类体}类修饰符有:public(类是公有的,可以在任何地方访问它)internal(类只在本项目内有效,其他项目不可以访问它,如果声明类时不指定任何修饰符,默认为internal)类名应该满足标示符的命名规则,建议使用PASSCAL命名方法。类体内包含类的所有成员:字段、属性、方法等。10/21类和对象相关概念字段是一个代表和某对象或类相关的变量的成员属性是提供对对象或类的特性进行访问的成员方法是一个执行可以由对象或类完成的计算或行为的成员,相当于其他语言中的函数。11/21声明类和创建对象publicclassStudent{publicstringname;publicinthight;publicintweight;}声明类将类实例化为对象//类在使用时必须进行实例化为对象(此时的实例化就是指对类中的成员进行初始化,为类中的每个成员进行赋初值。)Studentstu1=newStudent();类成员的访问//想要使用类中的成员必须用对象名调用stu1.name=李丽;12/21字段是一个代表和某对象或类相关的变量的成员。classMyClass{publicintMyInt;publicstringMyString;}如何定义字段成员13/21如何编写方法成员方法:一个执行可以由对象或类完成的计算或行为的成员,相当于其他语言的函数[访问修饰符]返回值类型方法名([参数列表]){方法体}例:publicintaddMethod(intx,inty){returnx+y;}14/21定义成员的可访问性和作用域使用访问修饰符,可以定义应用程序中类成员的作用域声明定义public不限制访问private只能从包含的类中访问protected包含的类或继承的子类可以访问15/21示例classClassMain{publicclassCat{publicintage;privateintweight;}staticvoidMain(string[]args){CatzooCat=newCat();zooCat.age=7;zooCat.weight=200;}}16/21构造方法构造方法:是一种特殊的方法,用来实现对象的初始化特点:与类同名没有返回值类型publicclassLion{}publicLion(){……}17/21如何使用构造函数publicclassLion{}publicLion(){Console.WriteLine(“构造Lion);}staticvoidMain(string[]args){}LionbabyLion=newLion();Console.WriteLine(“创建一个新的Lion对象);结果:构造Lion创建一个新的Lion对象18/21注意:构造方法与类名相同构造方法不声明返回类型如果没有编写构造方法,C#自动提供一个缺省的构造方法构造方法19/21当对象创建时,其成员被隐式地初始化类初始化publicclassZoo{}publicstringzooName;publicZoo(){zooName=“开心Zoo;}staticvoidMain(string[]args){}ZoolocalZoo=newZoo();Console.WriteLine(localZoo.zooName);结果:开心Zoo20/21publicclassLion{privatestringname;}带有参数的构造方法publicLion(stringnewLionName){this.name=newLionName;}staticvoidMain(string[]args){}LionbabyLion=newLion(“Tom);Console.WriteLine(babyLion.name);结果:Tom21/21如何重载构造方法创建多个构造方法,使用相同的名字和不同的签名classLion{privatestringname;privateintage;}publicLion(stringtheName,inttheAge){name=theName;age=theAge;}publicLion(stringtheName){name=theName;}publicLion(inttheAge){age=theAge;}实例化类时,根据调用的构造方法的参数个数,决定使用的是哪个构造方法。