第4章_面向对象基础_第1页
第4章_面向对象基础_第2页
第4章_面向对象基础_第3页
第4章_面向对象基础_第4页
第4章_面向对象基础_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

第4章面向对象基础 目标 什么是面向对象编程OOP的特征 接口 封装 继承和多态类声明 以及类中的字段 属性和方法构造函数和析构函数索引器 面向对象的基本思想 面向对象方法的基本思想是 从现实世界中客观存在的事物 即对象 出发来构造软件系统 并在系统构造中尽可能运用人类的自然思维方式 直接以问题中的事物为中心 抽象为对象 作为系统的基本构成单位 以人类自然的思维方式来思考问题 面向对象的基本思想 AlanKay这样来说明面向对象 程序便是成堆的对象 彼此通过消息的传递 请求其他对象进行工作 万事万物皆对象 每个对象皆由其他对象构成 每个对象都有类型 同一类型的对象所能接收的消息相同 封装 把对象的属性和服务结合成一个独立的系统单位 并尽可能隐蔽对象的内部细节 使用private 构造函数 作用 1 把对象全部属性和全部服务结合在一起 形成一个不可分割的独立单位 对象 2 尽可能隐蔽对象的内部细节 对外形成一个边界 只保留有限的对外接口使之与外部发生联系 1 面向对象基本概念 封装性 encapsulation 每个驾驶员都不需要知道变速箱是如何变速的 发动机是如何把汽油转变为动力的 他只要操纵变速杆就可以让汽车变速 踩下油门就可以使汽车行驶 录音机 电视机都是只要按下播放键就可以 不需要知道工作原理 2 面向对象基本概念 类 面向对象方法的基本思想是把现实世界中的一切事物进行抽象 以形成计算机能够处理的对象 类 类是对现实世界中一切事物的抽象 类描述事物的特性和行为 现实世界中的任何事物都能用类进行描述 3 面向对象基本概念 对象 什么是对象类是对现实世界中同类事物所拥有的特性和服务的一组描述 就像是一个模板 而对象则是指类的一个实例 是类的具体化 一个类可以有多个实例 每个实例都是不同的 它们都有各自不同的状态 类与对象 对象是类的实例 C 中类的定义方法 在C 中 类的定义方法同结构体类似 但类使用class关键字进行定义 类修饰符class 类型名成员名1 类型名成员名2 返回值类型成员函数名 参数列表 类的访问级别 类的访问级别 在默认情况下 类声明为内部的 即只有当前项目中的代码才能访问它 可以在类定义中指定继承 即在类名的后面加上一个冒号 其后是基类名 派生类不能访问基类的私有成员 但可以访问其公共成员 派生类和外部代码都可以访问公共成员 protected成员 创建C 中类的对象 类的使用对象遵循先创建后使用的原则 在C 中 我们使用new运算符来创建类的对象 然后使用 来访问对象中的成员 类名对象名 new类名 对象名 数据成员对象名 成员函数 构造函数和析构函数 构造函数 构造函数是指在创建类的对象时自动执行的函数 由它负责对类的对象进行初始化 析构函数 析构函数是指在类的对象销毁时自动执行的函数 由它负责对类的对象进行销毁 构造函数 构造函数的定义 构造函数是一类特殊的成员函数 它主要用于为对象分配空间 完成初始化工作 构造函数是一种强制性的约定 在创建类的对象时必须调用它 构造函数 语法格式 构造函数的调用 类的构造函数是在创建类的对象时自动被调用的 访问修饰符类名 形参列表 函数体 构造函数 注意 构造函数的名字必须与类名相同 构造函数可以带参数 但没有返回值 构造函数通常是公有的 使用public访问限制符声明 构造函数在对象定义时被自动调用 如果没有给类定义构造函数 则编译系统会自动生成一个缺省的构造函数构造函数可以被重载 但不可以被继承 AsimpleconstructorusingSystem classConstructorDemo publicintx publicConstructorDemo x 10 classTest publicstaticvoidMain ConstructorDemocd newConstructorDemo Console WriteLine cd x 调用构造函数 此时cd x的值为10 创建对象时 由new调用此构造函数 构造函数 带参数构造函数只要在构造函数名之后的圆括号中声明参数即可 publicclassStudent privatestringClassName privatestringName publicStudent stringname stringclassName Name name ClassName className classProgram staticvoidMain string args Demod newDemo d D2 Demod1 newDemo 4 5 d1 D2 Demod2 newDemo 1 2 3 d2 D3 Console ReadLine 构造函数 classDemo intx y z publicDemo x 0 y 0 publicDemo intx inty this x x this y y publicDemo intx inty intz this x y this z z publicvoidD2 Console WriteLine x 0 y 1 x y publicvoidD3 Console WriteLine x 0 y 1 z 2 x y z 静态构造函数 静态构造函数主要用于初始化一些静态的变量 静态构造函数只会执行一次 而且是在创建此类的第一个实例或引用任何静态成员之前 由 NET自动调用 例4 10 classProgram staticvoidMain string args Console WriteLine a 0 Test a Console ReadLine classTest publicstaticinta 9 staticTest a 1 静态构造函数没有修饰符 静态构造函数没有参数 一个类中只能有一个静态构造函数 静态构造函数只能运行一次 静态构造函数不能被继承 若没有写静态构造函数 而类中包含带有初始值设定的静态成员 则编译器会生成默认的静态构造函数 静态构造函数与无参的实例构造函数不冲突 可同时出现 无用单元收集和析构函数 无用单元收集 garbagecollection 在许多程序设计语言中 分配内存的释放是手动处理的 例如C 中 使用delete运算符来释放被分配的内存 但是 C 使用一种更简单的方式 无用单元收集C 的无用单元收集系统自动回收对象 不需要任何程序设计人员的介入就能在后台随时进行 工作步骤如下 不存在对象的引用时 就认为该对象不再需要 而且释放它所占用的内存 然后 这些回收的内存能用于随后的再分配 无用单元收集和析构函数 析构函数虽然有垃圾回收机制的存在 但是在释放对象使用的非托管资源时 必须使用析构函数 destructor 它可以用来确保对象完全结束 基本形式 class name destructorcode 析构函数是在无用单元收集的紧前面调用 析构函数的名称与类名相同但在名称前面加了一个符号 析构函数不能接受任何参数 也不返回任何值析构函数不能使用任何访问限制修饰符析构函数的代码中通常只进行销毁对象的工作 而不应该执行其他的操作析构函数不能被继承 也不能被显示地调用 析构函数特征 类的成员 在类中 成员定义包括字段 方法和属性的定义 所有的成员都有自己的访问级别 详见下表 成员访问修饰符 字段 方法和属性都可以使用关键字static来声明 表明它们是类的静态成员 而不是对象实例的成员 字段和属性 C 提供了两种用于保存类的实例的数据信息方法 字段和属性 字段定义 字段表示与对象或类相关联的变量 即在定义时声明的变量 字段可以是值类型 也可以引用类型 语法 字段修饰符 类型变量声明列表publicclassEmployee privatestring name 字段privateuint age 字段 字段修饰符除可加前面讲的那些以外 加static表该字段为静态字段 对静态字段的访问只与类关联 使用时使用类名 字段 字段还可以加关键字readonly 表该字段为只读字段 对只读字段的赋值只能在声明的同时进行或在类的构造函数中赋值 展示例4 1 classProgram 下面程序是否正确 staticvoidMain string args Testt newTest t d 0 Console WriteLine a 0 t a Console WriteLine b 0 t b Console WriteLine c 0 Test c Console WriteLine d 0 t d Console ReadLine classTest publicinta 5 privateintb 10 publicstaticintc 110 publicreadonlyintd 120 属性 属性是对现实世界中实体特征的抽象 它提供了灵活的机制来读取 编写或计算对象性质或类中私有字段值的访问 C 中的属性更充分地体现了对象的封装性 不直接操作类的数据内容 而是通过属性中的方法 即访问器来进行访问 它借助于get和set对属性的值进行读写 通过属性实现了良好的数据封装和数据隐藏 例4 11 classProgram staticvoidMain string args Testt newTest Console WriteLine 请输入性别 strings Console ReadLine t SetSex s Console WriteLine 性别是 t GetSex Console ReadLine classTest privatestringsex publicvoidSetSex strings if s male s female sex s elseConsole WriteLine 性别不正确 publicstringGetSex returnsex 属性的声明 语法 访问修饰符 static 数据类型属性名 set get 当对变量进行赋值运算时自动调用set访问器 其他时候调用get以读取数据 例4 12 classProgram staticvoidMain string args Demod newDemo Console WriteLine 请输入姓名 d Name Console ReadLine Console WriteLine 请输入性别 d Sex Console ReadLine Console WriteLine 姓名是 0 d Name if d Sex null Console WriteLine 性别是 0 d Sex classDemo privatestringname privatestringsex publicstringName get returnname set name value publicstringSex get returnsex set if value male value female sex value elseConsole WriteLine 性别不对 属性 属性结合了字段和方法的多个方面例 publicclassEmployee privatestring name 字段privateuint age 字段 publicstringName 属性 可读写 set name value value关键字 传递所赋值get return name publicuintAge 属性 只写 set age value 属性特征 属性可以只有一个访问器 只有set访问器的属性被视为只写属性 只有get访问器的属性被视为只读属性 同时具有这两个访问器的属性是读写属性 get属性访问器用于返回属性值 而set访问器用于分配新值 访问器可以使有的访问级别取决于属性的可访问性 访问器的可访问性不能高于它所属的属性 属性的get访问器通过return来读取属性的值 即必须有一个属性类型的返回值 set访问器通过value来设置属性的值 方法 接听 响铃 挂断 PickUp 用于传送和接收信号的代码 Ring 用于显示主叫号码的代码 Hang 用于结束会话的代码 对象的行为 声明方法 语法 访问修饰符 返回类型 参数列表 方法主体 方法只能在类或结构中声明 声明方法 classPoint intx inty voidAssign System Console WriteLine 输入点的值 x int Parse System Console ReadLine y int Parse System Console ReadLine 方法Assign 的定义 不返回任何值 void 不接收任何值 Assign Assign 方法 它是一个私有的方法 是不允许外部类访问的 只能在类内部起作用 方法使用标准函数格式 可访问性和可选的static修饰符来声明 如果使用了static关键字 这个方法就只能通过类来访问 不能通过对象实例来访问 方法的修饰符 默认情况下为private返回类型 如果不需要返回任何值 方法可能返回void数据类型 默认情况下为void 方法名 同变量命名规则 建议方法的每个单词的首字母要大写 明确见名知义 形参列表 多个参数时用逗号进行隔开 没有参数时 括号也不能省略 方法体用花括号括起来的语句块 方法的参数 参数的功效就是能使信息在方法中传入或传出 当声明一个方法时 包含的参数说明是形式参数 形参 当调用一个方法时 给出的对应实际参数是实参 传入或传出就是在实参与形参之间发生的 在C 中实参与形参的传递方式有 值参数 不含任何修饰符 引用型参数 以ref修饰符声明 输出参数 以out修饰符声明 数组型参数 以params修饰符声明 值参数 当利用值向方法传递参数时 编译程序给实参的值做一份拷贝 并且将此拷贝传递给该方法 被调用的方法不会修改内存中实参的值 所以使用值参数时 可以保证实际值是安全的 示例4 2 classProgram staticvoidMain string args Testt newTest intn 10 t Add n Console WriteLine n 0 n Console ReadLine classTest publicvoidAdd intnum num 10 引用型参数 ref 引用型参数和值参不同 引用型参数并不会开辟新的内存区域 当利用引用型参数向方法传递形参时 编译程序将把实际值在内存中的地址传递给方法 引用型参数分为以下两种情况 方法的形参本身就是引用类型 示例4 3通过声明ref关键字使参数按引用传递示例4 4 classProgram staticvoidMain string args Testt newTest StringBuilderbuilder newStringBuilder hello t Add builder Console WriteLine builder Console ReadLine classTest publicvoidAdd StringBuilders s Append World classProgram staticvoidMain string args Testt newTest intn 10 t Add refn Console WriteLine n 0 n Console ReadLine classTest publicvoidAdd refintnum num 10 在值类型参数前加上关键字ref 表明实参与形参的传递方式是引用的 对形参的修改会影响实参的值 ref要求变量在作为参数传递之前必须进行初始化 在使用ref时 无论是在定义形参还是在方法调用时 都需要在参数前添加相应的ref 试一试 定义两个整型变量i 1 j 2 通过调用swap intx inty 来交换这两个变量的值 使得在主函数中输出交换后的值 i 2 j 1 classSample staticvoidSwap refintx refinty inttemp x x y y temp staticvoidMain inti 1 j 2 Swap refi refj Console WriteLine i 0 j 1 i j 输出参数 out 与引用型参数类似 输出型参数也不开辟新的内存区域 与引用型参数的差别在于 调用方法前无需对变量进行初始化 当希望方法返回多个值时 声明out方法很有用 示例4 5 classProgram staticvoidMain string args int s 95 98 89 69 100 78 60 68 49 Demod newDemo intm n d MaxMinScore s outm outn Console WriteLine 最高分为 0 m Console WriteLine 最低分为 0 n classDemo publicvoidMaxMinScore int s outintmax outintmin max s 0 min s 0 for inti 1 is i min s i 使用out关键字的实参变量不必进行初始化 ref的实参变量必须初始化 out只能用于从方法中传出值 而不能从方法调用处接受实参数据 在方法内out参数被认为是未赋过值的 所以在方法结束之前应该对out参数赋值 和使用ref一样 无论是在定义形参还是在方法调用时 都需要在参数前添加相应的out 试一试 已知文件路径为 c Windows System hello txt 试编程实现通过调用SplitPath stringpath outstringdir outstringname 方法 在主函数中输出文件的位置 c Windows System 和文件名 hello txt classOutSample staticvoidSplitPath stringpath outstringdir outstringname inti path Length while i 0 charch path i 1 if ch ch ch break i dir path Substring 0 i name path Substring i staticvoidMain stringdir name SplitPath c Windows System hello txt outdir outname Console WriteLine dir Console WriteLine name 数组型参数 params 参数数组可以使用个数不定的参数调用函数 使用params关键字来定义 参数数组可以简化代码 因为它不必从调用代码中传递数组 而是传递可在函数中使用的一个数组中相同类型的几个参数 例4 6 classProgram staticvoidMain string args Demod newDemo int a 1 3 4 5 6 7 intsum d Params a Console WriteLine sum 0 sum sum d Params 1 3 5 Console WriteLine sum 0 sum sum d Params Console WriteLine sum 0 sum classDemo publicintParams paramsint p intsum 0 foreach intsinp sum s returnsum 一个方法中只能声明一个params参数 Params参数必须放在所有参数的后面 即params关键字之后不允许有任何其他参数 Params参数所定义的数组必须是一维数组 Params参数不能同时与ref或out使用 试一试 已知整型数组a 1 2 3 要求调用函数F 输出a的长度以及a中的各个元素 当整型数组变为b 10 20 30 40 再次调用函数F 输出b的长度以及b中的各个元素 classParamsSample staticvoidF paramsint args Console Write Arraycontains 0 elements args Length foreach intiinargs Console Write 0 i Console WriteLine publicstaticvoidMain int a 1 2 3 F a F 10 20 30 40 F 方法重载 方法签名是由方法名称和一个参数列表 方法的参数顺序和类型 组成 同一类中的方法可以有相同的方法名 同名方法的参数不能完全相同 即参数类型不同 或者参数个数不同 这被称为方法的重载 重载方法有两种方式指定不同个数的参数指定不同类型的参数例4 7 不同参数个数的方法重载 publicclassArea privateintareaVal publicvoidAreaCal intradius areaVal 22 7 radius radius publicvoidAreaCal intlength intbreadth areaVal length breadth publicvoidAreaCal intlength intbreadth intheight areaVal length breadth height 参数的类型相同参数个数不同 不同参数类型的方法重载 publicvoidAreaCal intradius areaVal 22 7 radius radius publicvoidAreaCal stringshapeName Console WriteLine 0 的面积没有计算 shapeName 方法中参数个数相等 参数类型不同 classProgram staticvoidMain string args intx 1 y 2 z 3 doublea 1 1 b 2 2 Demod newDemo ints d Add x y Console WriteLine 和为 0 s s d Add x y z Console WriteLine 和为 0 s doubless d Add a b Console WriteLine 和为 0 ss Console ReadLine classDemo publicintAdd intx inty returnx y publicdoubleAdd doublex doubley returnx y publicintAdd intx inty intz returnAdd x y z Main函数 Main函数是C 应用程序的入口点 在执行过程开始时 会执行Main函数 在Main函数执行完毕时 执行过程就结束了 Main函数必须是类或结构的静态方法 且返回值必须是int或void Main 的可选参数args是从应用程序的外部接受信息的方法 这些信息在运行期间指定 其形式是命令行参数 例4 8 classProgram staticvoidMain string args Console WriteLine 0 commandlineargumentswerespecified args Length foreach stringarginargs Console WriteLine arg Console ReadKey 静态成员 静态成员包括静态方法 静态属性或静态字段 静态成员可以在类的实例之间共享 可以将它们看作是类的全局对象 静态属性和静态字段可以访问独立于任何对象实例的数据 静态方法也可以执行与对象类型相关 但与对象实例无关的命令 在使用静态成员时 甚至不需要实例化对象 Console类和Convert类不需要实例化就可以直接使用 静态成员 静态类只能包含静态成员 不能包含实例成员 但可以有常量成员 静态类不能有实例构造函数 系统也不会为它提供默认构造函数 但它可以包含静态构造函数 静态类既不能实例化 也不能被继承 类与结构类型的区别例4 13 结构和类非常相似 但类是引用类型 结构是值类型 staticvoidMain string args MyClassobjectA newMyClass MyClassobjectB objectA objectA val 10 objectB val 20 MyStructstructA newMyStruct MyStructstructB structA structA val 30 structB val 40 Console WriteLine objectA val 0 objectA val Console WriteLine objectB val 0 objectB val Console WriteLine structA val 0 structA val Console WriteLine structB val 0 structB val classMyClass publicintval structMyStruct publicintval this关键字 this关键字用于引用类的当前实例 由于静态成员函数存在于类中 并且不是对象的一部分 因此静态成员函数没有this指针 this关键字可用于从构造函数 实例方法和实例访问器中访问成员 this关键字 在成员函数内部引用被具有相似名称的局部变量隐藏的成员 如 publicCircle intx inty this x x this y y 此时若不使用this 则不能访问同名的数据成员x y 把对象作为参数传递到其它方法 如 CalcTax this 声明索引器 索引器 索引器是C 的简单组件 它可以像访问数组一样访问类中的数组型对象 通过对对象元素的下标进行索引 就可以访问指定的对象 语法 public数据类型this 参数类型参数名 set get classStudentNameList publicstring StudentName newstring 10 publicstringthis inti get returnStudentName i set StudentName i value StudentNameList i 用于获取第几个学生的名字 有了索引器只要先实例化类然后对象名 i 就可以了而不需要再对象名 StudentName i 且还能验证i的有效性 例4 14 classProgram staticvoidMain string args Testt newTest t 0 小红 t 1 小黑 t 2 小绿 t 3 小桃 for inti 0 i 4 i Console WriteLine t i classTest publicstring myData newstring 4 publicstringthis intindex get returnmyData index set myData index value 索引器的设计原则 考虑使用索引器提供对存储在内部数组中的数据的访问 避免使用具有多个参数的索引属性 必须指定至少一个索引器参数 且应当为索引器参数赋值 避免为索引器设置除System Int32 System Int64 System String System Object 枚举或泛型类型参数之外的其他参数类型 不要同时提供在语义上等效的索引器和方法 试一试 classMyClass publicstring FriendName newstring 4 publicstringthis intn get returnFriendName n set FriendName n value 索引器与数组 索引器不指向内存位置索引器可以有非整数的下标而数组不能有 索引器可以重载 一个类可以有多个索引器但必须通过指定不同的索引类型重载索引器 再次强调一下应避免使用多参数索引器 索引器可以有非整数下标 classStrIndex publicHashtablestudentList newHashtable publicintthis stringname get return int studentList name set studentList name value classTest staticvoidMain StrIndexobjIndex newStrIndex objIndex Sam 232676 objIndex Tom 455464 System Console Wri

温馨提示

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

评论

0/150

提交评论