




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 java核心 继承与多态 计算机学院通信软件工程中心张艳梅ymzhang 2 本章主要内容 1 什么是多态 面向对象思想 接口与实现分离 多态原理 后期绑定2 多态的应用覆盖方法抽象类接口3 多态设计的原则从小棍游戏到博弈游戏构造函数不能多态继承还是组合 3 1 面向对象思想 继承 许多人认为代码重用是面向对象程序设计提供的最伟大的一种杠杆 面向对象学者的口号 我们再也不想发明相同的车轮了 我们费尽心思做出一个程序后 假如不得不又新作一个程序实现大致相同的功能 那会是一件非常令人灰心的事情 但若能利用现成的代码 对其进行 克隆 再根据情况进行添加和修改 情况就显得理想多了 继承 正是针对这个目标而设计的 但继承并不完全等价于克隆 继承 一个子类继承了其父类的属性和方法 在Java语言中 继承是通过extends关键字实现的 4 1 面向对象思想 多态 在享受继承带来的好处时 接口却不能重用 不仅不能重用 继承树还会产生更多的接口让我们头疼 如何管理继承树的接口 使其稳定统一 同时又能容纳不断新增的多样化实现呢 多态 使一个统一的对象行为 在实现中呈现多种形态 可以表现父类的行为 也可以表现为子类行为 音乐 曲调 乐器 乐器 演奏 乐谱 管乐 演奏 乐谱 弦乐 演奏 乐谱 铜管 演奏 乐谱 5 1 多态的思想 接口与实现分离 父类的接口 被子类继承 即函数名称和参数列表在继承中保持不变 只改变函数的实现体 例 classInstrument voidplay Notet 乐器类classWindextendsInstrument 管乐类voidplay Notet System out println windplay classStringedextendsInstrnment 弦乐类voidplay Notet System out println stringedplay classBrassextendsInstrument 铜管类voidplay Notet System out println brassplay 6 1 多态的思想 接口与实现分离 需要调用父类和子类共有的接口时 1 先定义父类的对象引用 例 Instrumentf 2 然后根据实际情况创建父类或子类对象 传给该对象引用 例 f newWind 3 现在你可以用该对象引用调用共有的接口了 例 f play note 4 改变引用指向的对象 重新调用共有接口 例 f newStringed f play note 多态效果 同一条接口调用语句 适用于继承树上所有对象 7 1 多态应用示例 classMusic publicvoidtune Instrumenti i play 曲调 引用乐器类publicInstrumentrandInstrument 随机抽取乐器switch int Math random 3 default case0 returnnewWind case1 returnnewStringed case2 returnnewBrass publicstaticvoidmain Stringargs 随机乐器演奏曲调Instrumentf randInstrument tune f 8 1 多态的原理 后期绑定 只写一份函数 接收父类作为参数 却在程序执行时根据对象情况 表现不同子类的行为呢 过程化程序只能在程序执行前期 由编译和连接器完成所有函数的绑定 叫做前期绑定 java可以在编译以后 由JVM在程序执行中动态绑定函数 叫做后期绑定 java除了final函数以外 所有函数都后期绑定 9 1 多态的优点 可扩充性 扩展一个类 而不必重定义和重编译它们 这是面向对象编程的最大特点 当上例的乐器增加 方法增加 tune函数不变 所有新类与旧类相安无事 音乐 曲调 乐器 乐器 演奏 乐谱 调音 管乐 演奏 乐谱 调音 弦乐 敲击乐 演奏 乐谱 调音 演奏 乐谱 调音 铜管 演奏 乐谱 调音 木管 演奏 乐谱 调音 10 2 多态的应用1 覆盖方法 java lang ObjectpublicclassObject publicStringtoString 返回一个描述其对象的字符串小棍游戏继承Object 覆盖toString方法来得到游戏结果publicclassOneRowNimextendsObject publicStringtoString return nSticks nSticks player player publicstaticvoidmain Stringargs OneRowNimgame newOneRowNim System out print game 11 2 注意函数重载不是多态 函数重载overloaded 不同接口增加父类方法的不同实现体 以参数不同来区别多态是利用函数覆写overriding 使一份函数调用呈现多种形态 共同接口重新定义父类的方法 函数名和参数完全一样例 classNote 乐谱类classInstrument publicvoidplay Noten 父类演奏方法 classWindextendsInstrument publicvoidplay Noten 覆写父类方法 classMusic publicvoidtune Instrumenti i play newNote 0 publicstaticvoidmain Stringargs tune newWind 12 2 多态应用2 抽象方法 多态的共同接口 使父类能够体现所有子类的共同点 但多数情况下 父类的函数只是挂名 没有实现体的方法叫做抽象方法 例 Animal speak Cat speak Cow speak Pig speak publicabstractStringspeak return meow return moo return oink 13 2 抽象类 引导正确使用多态 为避免对父类抽象方法的对象调用 java有个抽象类的约束机制abstractclassInstrument 有一个抽象方法就是抽象类abstractvoidplay Noten 抽象方法没有实现体原则 1 抽象类不能创建对象 抽象类的子类默认是抽象类 2 抽象类的子类若不是抽象类 必须为父类所有抽象方法提供定义 3 接口类 如事件监听类都是抽象类 14 2 多态的应用3 接口 Java接口是只包含抽象方法定义和常量的类 使用接口能使设计更灵活 更易扩展 灵活性 使用java接口可以将各种有用的方法与不同类型的对象关联起来 接口具有与特殊类层次结构无关的独立性 扩展性 利用接口来定义有用的方法签名 例 publicinterfaceSpeakable 动物叫声的接口类publicStringspeak publicclassCatextendsAnimalimplementsSpeakable main 函数中代码段Animalanimal newCat System out print animal Animalanimal newCow System out print animal 15 2 多态设计问题 接口还是抽象类 什么情况下我们应该把抽象方法放到父类 又在什么情况下应该把抽象方法放到接口呢 原则 1 在父类中定义的抽象方法应该是对该类对象的基本定义起决定作用的方法 而不应该仅仅是它的角色或功能 2 java接口可以和任何类关联 使我们可以非常灵活地使用它们 16 3 从小棍游戏到博弈游戏 设计目标 我们已经逐步完成了一个小棍游戏的制作 它能否简化我们制作所有两人博弈游戏的工作 使用继承 修改OneRowNim游戏使其适合两人游戏 建立两人游戏的类层次结构抽取小棍游戏所体现的博弈游戏共同点 构建超类 定义所有两人游戏中最常规 最一般的元素 某些是抽象方法 包括小棍游戏在内的所有两人游戏将继承和覆盖其属性和方法 getPlayer getWinner 只在具体游戏中有效 约束为抽象方法gameOver 只在具体游戏中有效 约束为抽象方法report 只在具体游戏中有效 约束为抽象方法prompt 只在具体游戏中有效 约束为抽象方法 17 3 从小棍游戏到博弈游戏 设计目标 我们在小棍游戏的完善中设计了两种用户界面 添加了计算机玩家的算法设计 这些工作也是两人博弈游戏的需要 可是如何让这些与具体游戏实现相关的方法具有统一的接口 使用多态 因为这两项功能可以应用到任何游戏或仿真程序中 设计为接口比较合适 允许计算机作为玩家参与游戏 为此我们设计一个计算机模拟玩家的接口 使其可以和任何两人游戏对象关联 InterfaceIPlayer makeMove 允许游戏使用各种不同的用户界面 包括命令行和图形 因此应该开发一个通用的用户界面接口 InterfaceCGUIPlayableGame 界面初始化 输入等 InterfaceIGame report prompt 18 3 从小棍游戏到博弈游戏 构建超类 nSticks int player int OneRowNim OneRowNim OneRowNim nsticks int takeSticks n int getSticks int getPlayer int getWinner int gameOver boolean report String prompt String PLAYER ONE PLAYER TWO computer1 2 IPlayer TwoPlayerGame getPlayer int setPlayer n int changePlayer addComputer p IPlayer getWinner int gameOver boolean report String prompt String 19 3 从小棍游戏到博弈游戏 计算机玩家接口 OneRowNim makeMove TwoPlayerGame IPlayer addComputer p IPlayer makeMove 20 3 从小棍游戏到博弈游戏 通用界面接口 OneRowNim OneRowNimUser命令行界面 组合 OneRowNimGUI图形界面 TwoPlayerGame OneRowNim 继承 CGUIPlayableGame CGame GUIGame IGame report prompt 21 3 构造函数不能多态 java的继承机制不适用于类的构造函数 继承子类在创建对象时 一定会先调用父类的构造函数 一次让所有继承阶层上的构造函数串联起来 保证对象初始化的正确性 只有调用父类的构造函数才能访问父类的自身成员构造函数中若使用多态 后期绑定 会产生bug 因对象的建立有严格的从上到下顺序 而多态却将其发散到尚未创始化的子类中去构造函数原则 尽可能简单地让对象进入正确状态 如果可以的话不要调用任何函数 22 3 多态设计问题 继承还是组合 多态很巧妙 但多态会产生一大堆继承架构 使设计复杂化不是所有对象都要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 首都精神文明汇报
- 员工培训财务制度
- 2025至2030中国天然调味料载体行业项目调研及市场前景预测评估报告
- 二甲医院特需门诊建设与管理
- 危险化学物品培训
- 三进教学工作汇报
- 离婚协议女方不忠情况下的财产分割与精神抚慰金合同
- 网络游戏IP授权合同:游戏版权授权与运营协议
- 离婚协议无效确认及子女抚养权变更执行异议起诉书
- 2025至2030中国慢性淋巴细胞白血病行业产业运行态势及投资规划深度研究报告
- 公司兼职人员劳务合同4篇
- 2025年能源行业新能源产业风险管理可行性研究报告
- 第一单元-第2课-《国色之韵》课件人教版初中美术八年级上册
- 2.1 认识平均分(课件)数学苏教版二年级上册(新教材)
- 井盖安全常识培训课件
- 半导体器件专用设备零部件制造项目可行性研究报告
- 临床成人床旁心电监测护理规程
- 竞选竞选大学心理委员参考课件
- 药品生产质量管理工程完整版课件
- 构造地质学03章-地质构造分析的力学基础
- 墙体喷射混凝土加固工程方案一
评论
0/150
提交评论