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

下载本文档

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

文档简介

第5章面向对象 回顾 简单计算机器随机计算 系统随机生成两个数 并随机生成四则运算中的一种 想一想 你知道我国的四大发明吗 哪一个发明只是技术上的改进 第一 要改 只需更改要改之字 此为可维护 第二 这些字并非用完这次就无用 完全可以在后来的印刷中重复使用 此乃可复用 第三 此诗若要加字 只需另刻字加入即可 这是可扩展 第四 字的排列其实有可能是竖有可能是横排 此时只需将活字移动就可做到满足排列需求 此是灵活性好 四大发明之活字印刷 面向对象思想的胜利 面向对象 面向对象的优点和特征类的声明和实例化类成员构造函数和析构函数封装 属性继承多态抽象 面向对象的优点和特征 面向对象编程的优点 可维护性高可复用好可扩展好灵活性高面向对象的特点 抽象封装继承多态 类的声明和实例化 类是对象的模板 对象时类的实例 使用对象前必须先创建类 访问修饰符 class类名 父类名 字段 描述对象的状态属性 用于设置或获取类中相关的数据值方法 实现对象的行为构造函数 初始化对象 privateclassPeople privatestringname 类的声明和实例化 对象是类的实例 是具体的 要使用对象 必须使用关键字new实例化类的一个对象 new Peopleobject1 newPeople 类成员 成员变量成员方法 成员变量 常量 在类中声明的常量 代表与类相关的常数值 字段 在类中声明的变量 用于存储属性的值 类型 属于类的局部类型 索引器 又称下标指示器 通过索引器访问类的多个实例 成员方法 方法 完成类中的各种操作 是封装在类内部的 用于执行一定操作的过程或函数 属性 用于设置或获取类中相关的数据值 如定义字段的值并对它们进行读 写操作 事件 由类产生的通知 用于说明发生了什么 是一种触发机制 是类对外界的响应 使对象具有与外界进行交互的能力 当某个事件发生时 就调用了与该事件相关联的方法 构造函数 析构函数 定义类的字段 字段是用来描述一个类的对象的状态和特征的 如人的名字 性别 年龄等语法 示例 访问修饰符 数据类型字段名 缺省值 classPeople publicstringname 姓名字段publicstringsex 性别字段 实例 定义一个圆形 Circle 类 并计算圆的面积和周长 classCircle privatedoubler 定义私有成员变量 字段privateconstdoublePI 3 14 publicvoidgetR 定义共有成员方法 用于输出矩形长 宽 Console WriteLine 半径 r publicfloatgetArea 定义共有成员方法 用于计算矩形面积 returnPI r r publicvoidsetR doublecur r 设置长宽的值 r cur r staticvoidMain string args doubler1 Circlec1 newCircle Console Write 输入原型的半径 r1 float Parse Console ReadLine c1 setR r1 Console WriteLine 圆形的面积为 c1 getArea c1 getR Console ReadLine 构造函数和析构函数 构造函数构造函数特点 1 具有和类相同的名称 2 没有返回值构造函数功能 1 为对象分配内存空间 2 成员变量的初始化析构函数特点 与类名相同 前面多一个 功能 收回对象占用的内存空间 构造函数 构造函数分为无参构造函数和带参构造函数 一个类可以有多个构造函数 类在实例化时根据其携带参数自动选择对应的构造函数 实例 定义一个圆形 Circle 类 并计算圆的面积和周长 要求类的构造函数有代参和不带参两种 思考题 定义一个面积 Area 类 通过定义不同的构造方法计算点 圆 矩形 梯形的面积 要求 计算圆的面积时要求从键盘输入半径 计算矩形面积时从键盘输入长和宽 计算梯形面积时从键盘输入矩形的上下底和高 classArea publicArea 构造函数 无参 Console WriteLine 0 publicArea doubler 构造函数 1个参数 计算圆的面积 Console WriteLine Math PI r r 构造函数 2个参数 计算矩形的面积publicArea doublelen doublewid Console WriteLine len wid 构造函数 1个参数 计算梯形的面积publicArea doubleULen doubleLLen doublehigh Console WriteLine ULen LLen high 2 定义Area类 staticvoidMain string args Console WriteLine 点的面积为 AreapointArea newArea Console WriteLine 圆的面积 AreaCircleArea newArea 10 Console WriteLine 矩形的面积 AreaRectangleArea newArea 10 10 Console Write 梯形的面积为 AreatrapeziumArea newArea 10 20 10 Console ReadLine 主函数 实例化时完成面积计算 staticvoidMain string args Console WriteLine 计算点的面积为 AreapointArea newArea Console WriteLine 计算圆的面积 请先输入半径 doubler double Parse Console ReadLine AreaCircleArea newArea r Console WriteLine 计算矩形的面积 请先输入矩形的长与宽 Console Write 长 doublelength double Parse Console ReadLine Console Write 宽 doublewidth double Parse Console ReadLine Console Write 矩形的面积为 AreaRectangleArea newArea length width Console WriteLine 计算梯形的面积 请先输入梯形的上底 下底和高 Console Write 上底 doubleUperLength double Parse Console ReadLine Console Write 下底 doubleLowerLength double Parse Console ReadLine Console Write 高 doublehigh double Parse Console ReadLine Console Write 梯形的面积为 AreatrapeziumArea newArea UperLength LowerLength high Console ReadLine 主函数 用户输入待计算形状的半径或边 析构函数 功能 清除对象 收回对象占用的内存空间特点 与类名相同 前面多一个 一个类只有一个析构函数 析构函数只能在当前类中使用 不允许继承和重载析构函数 不允许显式的调用析构函数 只能由系统自动调用 析构函数没有修饰符 也没有参数 Employee Console WriteLine Employee对象已经被释放 封装 属性 属性体现了面向对象的封装性通过访问器 get set 来操作类的数据内容通过get set访问器对属性值进行读写主要有三种 只有set访问器 表名属性值只可设置 可写 只有get访问器 表名属性值只可读 可读 既有set又有get访问器 表名属性值既可读也可设置 可读可写 说明 属性的get访问器通过return来读取属性值 set访问器通过vlaue来设置属性值 类定义举例 classEmployee privatestringempName 姓名privatestringsex 性别privateintwage 工资privatestringidCard 身份证号 empName字段对应的属性 publicstringEmpName get returnempName set empName value 定义类Employee的定义 将字段设置为private类型 并使用公共属性来获取和设置字段的值 代码如下 sex字段对应的属性 publicstringSex get returnsex set if value 男 value 女 sex value Else sex 男 wage字段对应的属性 publicintWage get returnwage set if value 0 wage value elsewage 0 idCard字段对应的属性 publicstringIDCard get returnidCard set idCard value 访问私有字段 输出员工信息 publicvoidPrintEmpInfo Console WriteLine empName Console WriteLine sex Console WriteLine wage Console WriteLine idCard 方法 方法是一组指令集合 用来实现一个类的对象的行为 如人会 使用工具 狮子会 咬人 语法 访问修饰符 返回值类型方法名 参数 指令集合 方法体 publicfloatgetArea returnlength width 如何编写方法 返回值类型是指当方法执行结束时 方法返回结果的数据类型 例如 对2个整数进行求和的方法 其返回值类型就是整形如果方法没有返回值 使用void关键字 参数是可选的 表示传递给方法中要处理的数据 例如 对2个整数进行求和的方法 就需要2个整形的参数 参数的声明方法和变量一样 如果有多个参数 参数之间用 分开 给方法传递参数 当调用方法时 传递参数的个数 数据类型 顺序必须与方法签名一致方法名 方法的参数列表合称为方法签名 classSimpleMath publicintAdd intx inty returnx y 调用方法时需要传递参数SimpleMathsums newSimpleMath inttotal sums Add 20 30 方法参数的传递方式 C 中方法的参数有4种类型 值参数 不含任何修饰符 引用型函数 以Ref修饰符声明 输出参数 以Out修饰符声明 数组型参数 以Params修饰符声明 若A语句中调用方法B 两者间有参数传递 那么 我们将A调用语句中传送的参数称为实参 被调用的方法B中使用的参数成为形参 方法参数的传递方式 值参数传递 例两数交换 值参数传递示例 staticvoidMain string args inta 3 intb 5 change a b Console WriteLine a 0 b 1 a b staticvoidchange intx inty inttemp temp x x y y temp a 3 b 5 方法参数的传递方式 引用型参数 例把上面例子改写成引用型参数传递 staticvoidMain string args inta 3 intb 5 change refa refb Console WriteLine a 0 b 1 a b staticvoidchange refintx refinty inttemp temp x x y y temp a 5 b 3 方法参数的传递方式 输出型参数 例使用Out关键字练习编写输出参数 staticvoidMain string args inta b change outa outb Console WriteLine n调用change函数后返回主程序 a 0 b 1 a b Console ReadLine privatestaticvoidchange outintx outinty inttemp x 3 y 5 Console WriteLine n函数内交换前x 0 y 1 x y temp x x y y temp Console WriteLine n函数内交换后x 0 y 1 x y 函数内交换前x 3 y 5函数内交换后x 5 y 3调用change函数后返回主程序 a 5 b 3 方法参数的传递方式 当利用值传递参数时 编译程序给实参的值做一份复制 并且将此复制传递给该方法 被调用的方法不会修改内存中实参的值 所以使用值参数时 可以保证实际值是安全的 与值参不同的是 引用型参数并不开辟新的内存区域 当利用引用型参数向方法传递形参时 编译程序将把实际值在内存中的地址传递给方法 与引用型参数类似 输出型参数也不开辟新的内存区域 与引用型参数的差别在于 调用前不需对变量进行初始化 输出型参数用于传递方法返回的数据 方法参数的传递方式 数组型参数 staticintSum paramsint varArr intsum 0 foreach intvainvarArr sum va returnsum staticvoidMain string args intsum1 Sum 1 2 intsum2 Sum 1 2 3 intsum3 Sum 3 10 7 9 11 Console WriteLine sum1 0 nsum2 1 nsum3 2 sum1 sum2 sum3 Console ReadLine 参数的个数由调用方法决定 是可以变化的 数组型参数 使用类的静态成员 类可以具有静态的成员 如静态字段 静态方法使用static关键字修饰静态成员相当于 全局 的 不依赖于某一个具体的对象 类的静态字段 static修饰类的字段时 在一个类中只开辟一块内存空间存储 并在类的所有对象实例间共享 因此static变量也称为类变量 classCat stringname staticstringfood cat1name cat2name cat3name cat4name food 类的静态字段 static变量不依赖于具体对象 因此直接通过类名访问 非静态变量必须首先实例化类的一个对象 再通过对象访问 因此也称为实例变量 classCat stringname staticstringfood staticvoidMain Cat food fish OKCat name Kitty 错误Catcat1 newCat cat1 name Kitty OK 类的静态字段 static变量类似于C语言的全局变量由于在所有的对象间共享 因此可以用于对象之间的通信思考题 怎样统计被创建的Cat对象的总数 classCat publicstaticintcount publicstringname publicCat count 1cat1 2cat2 3cat3 4cat4 count 4 示例 使用静态变量记录进入会场的人数 classPeople privateintnum 记录进入会场的次序staticinttotal 记录进入会场的总人数publicPeople 无参构造函数 total num total publicstaticvoidShowTotalPeople Console WriteLine 现在共有 0 人进入会场 total publicvoidShowPeopleNum stringp name Console WriteLine 0 是第 1 个进入会场的人 p name num 示例 使用静态变量记录进入会场的人数 classProgram staticvoidMain string args PeopleLiLei newPeople LiLei ShowPeopleNum LiLei People ShowTotalPeople PeopleMing newPeople Ming ShowPeopleNum Ming People ShowTotalPeople Console ReadLine 类的静态方法 static修饰的方法称为静态方法 是一个类的全局方法静态方法也叫作类方法 类名 方法名没有static修饰的方法叫实例方法 对象名 方法名注意事项 static方法中不能直接使用非静态成员 因为非静态成员与实例相关 但可以通过对象点取间接使用static方法中不能使用this 与实例相关 非static方法中可以使用静态成员 思考题 利用学过的面向对象知识 改造之前做过的简单计算器程序 将计算器的各种运算的实现部分放在计算器 Caculator 类里 classCaculator publicstaticdoubleGetResult doublenum1 refdoublenum2 stringop doubleresult 0 switch op case result num1 num2 break case result num1 num2 break case result num1 num2 break case while num2 0 Console WriteLine 除数不能为0 请重新输入 num2 double Parse Console ReadLine result num1 num2 break returnresult staticvoidMain string args doublenum1 num2 result 0 Console WriteLine 请输入第一个数 num1 double Parse Console ReadLine Console WriteLine 请输入第二个数 num2 double Parse Console ReadLine Console WriteLine 请输入一个运算符 或 stringop Console ReadLine result Caculator GetResult num1 refnum2 op Console WriteLine 0 1 2 3 num1 op num2 result Console ReadLine 继承 C 支持类的单继承 子类可以继承已有的基类的特征和能力 而且可以加入新的特性或者是修改已有的特性 类继承的基本语法是 class子类名称 父类名 类的主体 说明 1 子类将从父类继承而来的成员变量和方法作为自己的成员变量和方法 2 子类不能继承父类中用private修饰的成员变量和方法 classStudent publicstaticstringsClassName 软件班 静态字段 成员变量publicstringSName 王丽 公有字段privateintage 6 私有字段 不能被继承protectedstringsex 受保护的成员字段publicvoidWriteAge 公有成员方法 Console WriteLine this age privatevoidWriteSName 私有成员方法 不被继承 Console WriteLine SName publicStudent int Age string Name 代参构造函数 age Age SName Name 声明父类Student 声明子类CStudent classCStudent Student privatestringDepartment 子类私有成员变量publicCStudent string department string name string sex base 25 TOM Department department SName name sex sex publicvoidWriteCStudentInfo Console WriteLine 0 1 2 3 SName sex Department sClassName WriteAge 父类成员 继承 子类构造函数 调用父类构造函数 Main 函数 classProgram staticvoidMain string args CStudentcs newCStudent Computer Lily female cs WriteCStudentInfo Console ReadLine C 子类初始化顺序 1 子类先初始化成员变量后构造函数 调用父类成员后构造2 类本身成员先于构造3 父类构造先于子类构造4 静态先于成员5 静态内部按出现顺序6 成员内部按出现顺序 子类与父类构造函数的执行顺序 1 实例化父类时 可以使用new子类 执行构造函数顺序为 先执行父类构造函数 再执行子类构造函数 2 实例化子类时 只可以new子类 执行顺序同上3 父类实例化后 只能执行父类的方法 获得父类的属性等 4 实例化子类后 可同时执行子类和父类的方法和属性 如同名方法 则执行子类的方法 base关键字 在类的继承中 如果在子类中定义了与父类同名的成员变量 则父类的成员变量不能被直接使用 此时称子类的成员变量隐藏了父类的成员变量 如果想在子类中使用被子类隐藏的父类的成员变量或方法 可以使用base关键字 base关键字经常在以下情况下使用 1 访问被隐藏的成员变量或成员方法base 成员变量名 base 成员方法名 参数 2 调用父类的构造方法 classStudent publicstaticstringsClassName 软件班 静态字段 成员变量publicstringSName 王丽 公有字段privateintage 6 私有字段 不能被继承protectedstringsex 受保护的成员字段publicvoidWriteAge 公有成员方法 Console WriteLine this age privatevoidWriteSName 私有成员方法 不被继承 Console WriteLine SName publicStudent int Age string Name 代参构造函数 age Age SName Name 声明父类Student classCStudent Student privatestringDepartment publicstringSName publicCStudent string department string name string sex base 21 TOM 声明子类的构造方法 Department department SName name sex sex publicvoidWriteCStudentInfo Console WriteLine 0 1 2 3 4 base SName SName sex Department sClassName WriteAge 声明子类CStudent classProgram staticvoidMain string args CStudentcs newCStudent Computer Lily female cs WriteCStudentInfo Console ReadLine Main 函数 this关键字 当成员方法的形式参数与成员变量同名 或成员方法内的局部变量与成员变量同名时 为了在成员方法内引用成员变量 需要使用this关键字 this代表了当前对象本身 更准确地说 是当前对象的一个直接引用 可以将其理解为对象的另一个名字 通过这个名字可以访问对象 this关键字经常在以下情况下使用 1 访问当前对象的成员变量或成员方法this 成员变量名 或this 成员方法名 参数 2 将对象作为参数传递到其他方法 例如 方法名 this this关键字 this是一个特殊的引用 指针 它指向的是 自己 也就是当前对象this的作用 点取成员区分同名变量将当前对象 自己 作为参数 传递给其他对象的方法作为方法名表示构造方法 this关键字 classPeople publicstringname publicintage publicPeople stringname intage name name this name name this age age 示例 使用this区分同名变量 this关键字 示例 声明一个职员类 包含姓名 别名和工资字段并打印输出方法 构造函数等成员方法 声明一个计算税费的类 该类包含一个静态方法 税费按工资的8 计算 将职员对象作为该方法的参数来计算职员的税费 classEmployee privatestringname privatestringalias privatedecimalsalary 3000 00m publicEmployee stringname stringalias 构造方法 用this限定name和alias字段this name name this alias alias publicvoidprintEmployee 输出方法 Console WriteLine Name 0 nAlias 1 name alias 用this关键词将对象作为参数调用CalcTax Console WriteLine Taxes 0 C Tax CalcTax this publicdecimalSalary get r

温馨提示

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

评论

0/150

提交评论