抽象类与接口.pptx_第1页
抽象类与接口.pptx_第2页
抽象类与接口.pptx_第3页
抽象类与接口.pptx_第4页
抽象类与接口.pptx_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

面向对象的Java实现 接口 第三章 2 本章任务 升级HelloACCP 打印ACCP中心与教员的详细信息 正确使用面向接口编程的思想提高系统的可扩展性及可维护性 3 掌握Java抽象类与接口理解Java接口与多态的关系掌握面向接口编程的思想掌握常量接口的使用 本章目标 4 为什么需要抽象类与抽象方法 在我们编写一个类的时候 可能会对一些类的方法进行定义 但是并不具体实现 而是交给该类的子类根据自己的具体情况去实现 这样可以增强类设计的灵活性 如 定义了一个表示各种图形的类Shape 这个类有一些属性 还有一个用于计算这个图形的周长的方法 但是 对于不同的图形 对周长的计算方法不同 我们不能将所有的图形的周长的计算方法都写到这个方法中 通过关键字abstract 我们可以在父类中不实现这个方法 而将它的实现放到子类中去 虽然周长可以用子类重写的方法来实现 但如果要求子类一定要重写父类的这个方法时 如果程序员忘了重写 将会造成运行上的错误 如果采用抽象类 则必须实现此方法才能创建实例 因而就可避免上述错误 5 什么是抽象类 abstract修饰符3 1 由abstract修饰的方法叫抽象方法 由abstract修饰的类叫抽象类抽象方法必须声明在抽象类中抽象方法语法 abstract类型方法名 形参列表 声明抽象类语法 abstractclass类名称 成员变量 方法 abstract方法 说明 抽象方法不具有任何实现代码 6 什么是抽象类 abstract修饰符3 2 7 注 没有实现的方法和空方法体的方法的区别 publicintmethodA 是没有实现的方法publicintmethodA 是空方法体的方法 没有实现的方法可以用abstract来修饰 而空方法体却不能用abstract来修饰 什么是抽象类 abstract修饰符3 3 8 实例 图形类Shape 类中有一个抽象方法 用于返回图形的周长 有一个属性 颜色 有两个子类 三角形和圆 实现抽象方法 在测试类中 输出三角形和圆的周长和颜色 见 形状抽象类文件夹 9 小结1 用抽象类实现Area 其中包含一个计算面积的抽象方法calculateArea 和一个返回图形形状的方法 然后设计圆 Circle 和矩形 Rectangle 两个类实现这个抽象类中的方法calculateArea 分别计算圆和矩形的面积 测试类 要求 要输出 图形的形状 图形的面积 圆的半径 矩形的长与宽 见 TestShape java 10 小结1 用抽象类实现前动物类 将吃的方法声明为抽象方法 并在两个子类中实现该方法 11 生活中的接口 电脑主板上的PCI插槽的规范就类似于Java接口 声卡 显卡 网卡 每种卡的内部结构都不相同 可以把声卡 网卡 显卡都插在PCI插槽上 而不用担心哪个插槽是专门插哪个卡的 主板 12 什么是Java接口5 1 接口包括两个方面 一 接口的定义 一个Java接口是一些方法特征的集合 但没有方法的实现接口的定义格式 访问权限 interface接口名 extends父接口名列表 常量声明 public static final 常量类型常量名 常量值 抽象方法声明 public 返回值方法名 参数列表 从上面的语法规定可以看出 定义接口与定义类非常相似 实际上完全可以把接口理解成为一种特殊的类 接口是由常量和抽象方法组成的特殊类 13 什么是Java接口5 2 二 接口的实现 Java接口中定义的方法在不同的地方被实现 可以具有完全不同的行为 对于接口 用 implements 来 实现 它 格式如下 class类名 extends父类名 implements接口名1 接口名2 注 实现某个接口 意味着就必须实现其中定义的所有方法 14 什么是Java接口5 3 在使用接口时 需注意以下方面 1 接口中的成员自动设置为public 因此接口中不能声明私有的成员2 接口中不能出现方法体实现3 接口不能被实例化4 一个类可以继承一个父类 并且同时实现一个或多个接口 通过接口 可以模拟实现多继承 15 什么是Java接口5 4 一个Java接口是一些方法特征的集合 但没有方法的实现 publicinterfacePCI publicvoidstart publicvoidstop classSoundCardimplementsPCI publicvoidstart System out println Dudu publicvoidstop System out println Soundstop Java接口中定义的方法在不同的地方被实现 可以具有完全不同的行为 这是Java接口 相当于主板上的PCI插槽的规范 classNetworkCardimplementsPCI publicvoidstart System out println Send publicvoidstop System out println Networkstop 声卡 网卡都实现了PCI插槽的规范 但行为完全不同 16 什么是Java接口5 5 publicclassAssembler publicstaticvoidmain String args PCInc newNetworkCard PCIsc newSoundCard nc start sc start 可以使用Java接口标识类型运行时 根据实际创建的对象类型调用相应的方法实现 Dudu Send 控制台输出 2 1 17 实例 将上章形状类及其子类改为 接口与其实现类 18 为什么需要Java接口9 1 故 使用接口 可以实现多继承 通过接口实现不相关类的相同行为 而无需考虑这些类之间的关系 通过接口指明多个类需要实现的方法 19 为什么需要Java接口9 2 interfaceWeapon publicvoidshoot classCar publicvoidmove System out println running classPlane publicvoidmove System out println flying 20 为什么需要Java接口9 3 classTankextendsCarimplementsWeapon publicvoidshoot System out println 发射大炮 classFighterextendsPlaneimplementsWeapon publicvoidshoot System out println 发射飞弹 publicclassInterfaceExample publicstaticvoidmain Stringargs Tanktank newTank Fighterfighter newFighter tank move tank shoot fighter move fighter shoot 改写上章动物类及其子类为 模拟多继承 即将吃的方法改为接口中的方法 21 为什么需要Java接口9 4 为ACCP各中心开发这样一个小系统 包含类型 教员 中心 打印机 具体要求如下 教员 以及中心都具有方法 输出详细信息 detail 中心具有属性 打印机 printer 能够通过中心的打印机打印教员或中心的详细信息系统要具备良好的可扩展性与可维护性 打印 教员 中心 教员详细信息 中心详细信息 detail方法 输出详细信息 22 为什么需要Java接口9 5 以下这个解决方案中存在着什么问题 publicclassAccpTeacher1 输出教员的详细信息publicStringdetail return 本人是ACCP教员 publicclassAccpSchool1 privatePrinterprinter newPrinter 输出中心的详细信息publicStringdetail return 这里是ACCP中心 使用打印机打印教员信息publicvoidprint AccpTeacher1t printer printjz t detail 使用打印机打印中心信息publicvoidprint AccpSchool1s printer printjz s detail publicclassPrinter publicvoidprintjz Stringcontent System out println 开始打印 System out println content 每增加一种新类型 都需要增加相应的print 类型名称var 方法 程序的可扩展性及可维护性极差 这不符合系统的要求 23 为什么需要Java接口9 6 可以通过多态性解决这个问题吗 显然 本系统符合使用多态性的条件 教员 中心 detail方法 负责输出详细信息 教员详细信息 中心详细信息 1 2 2 1 回顾多态的含义 实现同一个接口 使用不同的实例而执行不同操作 24 为什么需要Java接口9 7 在这个系统中 存在继承关系吗 教员 中心属于两种不同的类型 无法通过 is a 找到一个合适的父类教员 中心都存在一个共同的方法特征 detail 它们对detail方法有各自不同的实现 这完全符合Java接口的定义 1 定义一个Java接口 在其中定义detail方法 但没有具体实现 2 实现这个Java接口 不同的类对detail方法有不同的具体实现 3 在中心类的打印方法中 接收接口作为参数 25 为什么需要Java接口9 8 publicinterfaceIntroduceable publicStringdetail publicclassAccpSchool2implementsIntroduceable privatePrinterprinter newPrinter 输出中心的详细信息publicStringdetail return 这里是ACCP中心 使用中心打印机打印信息publicvoidprint Introduceableintro printer printjz intro detail publicclassAccpTeacher2implementsIntroduceable 输出教员的详细信息publicStringdetail return 本人是ACCP教员 通过Java接口 我们同样可以享受到多态性的好处 大大提高了程序的可扩展性及可维护性 使用print方法时 参数可以是任何Introduceable接口的实现类的对象 不必再为不同的类型建立不同的print方法了 使用了Java接口之后 这个系统有了怎样的改进 26 为什么需要Java接口9 9 注 使用继承或者接口都能为我们带来多态性的好处 一般情况下 当两个类之间符合 is a 的关系 并且子类可以复用部分父类的代码 我们使用继承关系实现 其他情况优先选择接口 27 小结2 为刚才完成的系统增加一种新的类型 学员 AccpStudent 具体要求如下 学员具有detail方法 负责输出学员详细信息能够通过中心的打印机打印学员的详细信息系统要具备良好的可扩展性与可维护性编写测试类StudentTest进行测试 要求 通过中心的打印机打印学员的详细信息 StudentTest完整代码实现 AccpStudent完整代码实现 28 小结2 1 编写接口Addition 定义add方法 参数是两个int类型 编写此接口的两种实现 一种是将参数相加后输出 一种是相连后输出 编写测试类进行测试参见代码 接口Addition文件夹2 改写上章乐器类及其子类为接口与其实现类 实现多态 3 编写接口和类 描述一下USB口和打印机 鼠标的关系 参见代码 USB文件夹 29 什么是面向接口编程 开发系统时 主体构架使用接口 接口构成系统的骨架这样就可以通过更换接口的实现类来更换系统的实现 publicclassAccpSchool2implementsIntroduceable privatePrinterprinter newPrinter publicStringdetail return 这里是ACCP中心 使用中心打印机打印信息publicvoidprint Introduceableintro printer print intro detail Introduceable AccpTeacher2 教员 AccpSchool2 中心 30 面向接口编程的示例4 1 升级上述的ACCP系统 要求 打印机有多种类型 比如 黑白打印机 彩色打印机等中心可能配备其中任意一款打印机 负责打印教员 或者中心的详细信息系统要具备良好的可扩展性与可维护性 print方法 打印 彩色打印机 黑白打印机 黑白内容 中心 教员详细信息 彩色内容 31 面向接口编程的示例4 2 采用面向接口编程的方式实现 以下是三个步骤中的第一步 抽象出Java接口1 分析 黑白 彩色打印机都存在一个共同的方法特征 printjz黑白 彩色打印机对printjz方法有各自不同的实现2 结论 抽象出Java接口PrinterFace 在其中定义方法printjz3 具体实现 publicinterfacePrinterFace publicvoidprintjz Stringcontent 32 面向接口编程的示例4 3 采用面向接口编程的方式实现 以下是三个步骤中的第二步 publicclassColorPrinterimplementsPrinterFace publicvoidprintjz Stringcontent System out println 彩色打印 System out println content publicclassBlackPrinterimplementsPrinterFace publicvoidprintjz Stringcontent System out println 黑白打印 System out println content 实现Java接口1 分析 已经抽象出Java接口PrinterFace 并在其中定义了printjz方法黑白 彩色打印机对printjz方法有各自不同的实现2 结论 黑白 彩色打印机都实现PrinterFace接口 各自实现printjz方法3 具体实现 33 面向接口编程的示例4 4 采用面向接口编程的方式实现 以下是三个步骤中的第三步 使用Java接口1 分析 主体构架使用接口 让接口构成系统的骨架2 结论 更换实现接口的类就可以更换系统的实现3 具体实现 publicclassAccpSchool3implementsIntroduceable privatePrinterFaceprinter 打印机publicvoidsetPrinter PrinterFacep this printer p publicStringdetail return 这里是ACCP中心 publicvoidprint Introduceableintro printer printjz intro detail publicclassAccpTest publicstaticvoidmain String args 创建中心实例AccpSchool3school newAccpSchool3 为该中心配备黑白打印机school setPrinter newBlackPrinter school print school 为该中心配备彩色打印机school setPrinter newColorPrinter school print school 34 小结3 阅读如下Java代码 然后请采用面向接口编程的思想 在空白处填写正确的代码 publicinterfacePCI voidstart voidstop classSoundCardimplementsPCI publicvoidstart System out println Dudu publicvoidstop System out println Soundstop classNetworkCardimplementsPCI publicvoidstart System out println Send publicvoidstop System out println Networkstop 这是Java接口 相当于主板上的PCI插槽的规范 声卡 网卡都实现了PCI插槽的规范 但行为完全不同 35 小结3 publicclassMainBoard publicvoidusePCICard p p start p stop publicclassAssembler publicstaticvoidmain String args MainBoardmb newMainBoard 在主板上插入网卡 在主板上插入声卡 提示 通过这个方法 主板上可以插入任意符合PCI插槽规范的卡 PCInc newNetworkCard mb usePCICard nc PCIsc newSoundCard mb usePCICard sc PCI 提示 可以通过更换实现接口的类来更换系统的实现 36 总结 面向接口的编程可以实现接口和实现的分离 这样做的最大好处是能够在客户端未知的情况下修改实现代码 那么什么时候应该抽象出接口呢 一种是用在层与层之间的调用 层和层之间是最忌讳耦合度过高或是改变过于频繁 设计优秀的接口能够解决这个问题 另一种是用在那些不稳定的部分上 如果某些需求的变化性很大 那么定义接口也是一种解决之道 设计良好的接口就像是我们日常使用的万用插座一样 不论插头如何变化 都可以使用 37 为什么需要常量 生活中 一周有七天 如何用代码表示 publicclassWeek privateintdays 7 publicstaticvoidmain String args Weekw newWeek System out println 一周有 w days 天 publicclassWeek privateintdays 7 publicstaticvoidmain String args Weekw newWeek w days System out println 一周有 w days 天 一周有7天 控制台输出 然而 总有不尽人意的事情发生 一周有8天 控制台输出 如何保证变量的值在运行期无法被改变 使用常量 38 什么是常量 常量是一种标识符 它的值在运行期间恒定不变常量标识符在程序中只能被引用 而不能被重新赋值 39 常量的优点 如果不使用常量 直接在程序中填写数字或字符串 将会有什么麻烦 publicstaticdoubletoRadians doubleang returnang 180 0 3 14159265358979323846 publicstaticdoubletoDegrees doubleang returnang 180 0 3 14159265358979323846 publicstaticfinaldoublePI 3 14159265358979323846 圆周率publicstaticdoubletoRadians doubleang returnang 180 0 PI publicstaticdoubletoDegrees doubleang returnang 180 0 PI 程序的可读性变差 用户很难理解数字或字符串的意思 程序的可维护性变差 如果数值改变 则需要在很多地方改动 既麻烦又易出错 使用常量可以增强程序的可读性 可维护性 40 Java中常量的定义规则 加入final关键字代表常量 加入static关键字代表类变量尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串 publicclassAccpStudent publicstaticfinalintFEMALE 1 代表女性publicstaticfinalintMALE 2 代表男性privateintsex 性别publicvoidsetSex intsex if sex FEMALE System out println 这是一名女学生 elseif sex MALE System out println 这是一名男学生 this sex sex 41 在Java接口中声明常量 在Java接口中声明的变量在编译时会自动加上staticfinal的修饰符 即声明为常量 因而Java接口通常是存放常量的最佳地点 publicinterfaceAccpSchoolType publicstaticfinalStringACCP ACCP加盟中心 publicstaticfinalStringBENET BENET直营中心 publicinterfaceAccpSchoolType StringACCP ACCP加盟中心 StringBENET BENET直营中心 等同于 42 实例 编写接口Addition 有两个int类型的常量a b 值分别为3和4 有一个add方法 编写此接口的两种实现 一种是将常量相加后输出 一种是相连后输出 编写测试类进行测试 43 小结4 编写一个用于放置常量的Java接口Constants 具有常量MAX和MIN 编写一个测试类ConstantsTest 在main方法中求取Constants中的两个常量之差编写一个用于放置常量的Java接口Pai 具有常量PI 并有一个计算面积的方法 编写此接的实现类 圆 Circle 实现接口中的面积方法用来求圆的面积 要求用到接口中的常量 编写一个测试类PaiTest 输出圆的面积 Constants完整代码实现 ConstantsTest完整代码实现 44 static修饰符 静态变量 static称为静态修饰符 它可以修饰类中的属性和方法 修饰类中的属性时 表示它们是类的属性 而不专属于任何一个类的具体对象 类的所有实例都共享同一些静态变量 即 静态属性是一个公共的存储单元 任何一个类的对象访问它时 取到的都是相同的数值 因为它们是属于类的变量 不需创建对象就可使用 访问静态成员变量 可以通过 类名 成员变量的形式 当然也可以使用对象名 成员变量 但建议还是使用 类名 成员变量的形式 因为它是属于类的 实例 用静态变量统计有多少人 见 People Count java 45 46 static修饰符 静态方法 static修饰符修饰的方法叫静态方法 目的使该方法独立于类的实例 使用类去访问 而不是类实例 所以也叫类方法 调用静态方法的语法为 类名 方法名 47 static修饰符 静态方法 实例 用静态方法实现求1 2 3 100见 Test Static java 48 main方法 Java启动方法 p

温馨提示

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

评论

0/150

提交评论