《Java面向对象程序设计第》课件多态性.ppt_第1页
《Java面向对象程序设计第》课件多态性.ppt_第2页
《Java面向对象程序设计第》课件多态性.ppt_第3页
《Java面向对象程序设计第》课件多态性.ppt_第4页
《Java面向对象程序设计第》课件多态性.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第六章 多态性 学习目标 理解多态性的概念理解继承层次结构中对象间的关系区分抽象类与具体类抽象类和抽象方法的声明和使用接口的声明和实现final类和final方法嵌套类的概念和使用基本数据类型的包装类 6 1多态性概念和实例 多态性 Polymorphism 在超类中定义的属性或行为 被子类继承之后 可以具有不同的数据类型或表现出不同的行为 这使得同一个属性或行为在超类及其各个子类中具有不同的语义 定义Shapes s draw s调用draw 方法 s指向对象不同会画出不同的图形 圆或矩形或三角形 多态性也是泛指在程序中同一个符号在不同的情况下具有不同解释的现象 6 1多态性概念和实例 6 1多态性概念和实例 续 实现多态性的条件 继承抽象方法引用 Shapes Circlec1 newCircle Rectangler1 newRectangle s c1 s draw 画圆s r1 s draw 画矩型 6 2继承层次结构中对象间的关系 继承层次结构中的子类对象可以视为超类的对象 这样就可以将子类对象赋给超类变量 然而 超类对象并不是其任何子类的对象 即不能将超类对象赋给子类引用 6 2继承层次结构中对象间的关系 续 例如 Point3point newPoint3 30 50 Circle4circle newCircle4 120 89 2 7 Point3pointRef circle 允许 Point3pointRef newCircle4 120 12 0 允许 pointRef toString callCircle4 toString pointRef point pointRef toString callPoint toString Circlecircle point 不允许 编译出错 强制类型转换下列语句组是将point对象强制转换成Circle对象 circle getX 语句是正确的 而circle getRadius 语句在运行时会产生错误 因为circle引用指向的point对象根本无getRadius方法 Point3point newPoint3 30 50 Circlecircle Circle point circle getX circle getRadius run timeerror例6 1中的例子举例说明了继承层次结构中对象间的关系 6 2继承层次结构中对象间的关系 续 例6 2超类对象的引用赋给一个子类类型的变量 HierarchyRelationshipTest2 javapublicclassHierarchyRelationshipTest2 publicstaticvoidmain String args Point3point newPoint3 30 50 Circle3circle circle point 超类对象的引用赋给一个子类类型的变量 是不允许的 6 3抽象类和抽象方法 6 3 1抽象类和具体类的概念6 3 2抽象方法的声明6 3 3抽象类的声明6 3 4抽象类程序设计的举例 6 3 1抽象类和具体类的概念 抽象类 每个抽象类中至少包含一个抽象方法 抽象类只能作为继承层次结构中的超类 所以这些类称为抽象超类 不能实例化抽象类的对象 抽象类的目的是提供一个合适的超类 以派生其他类 具体类 用于实例化对象的类 这种类实现它们声明的所有方法 抽象超类是一般类 它们仅仅指定子类的共同点 并不创建出真实的对象 例如 如果我们要 绘制形状 那我们将绘制什么形状呢 具体类为实例化对象提供了合理的细节 6 3 2抽象方法的声明 用关键字abstract声明抽象方法 publicabstractvoiddraw 抽象方法并不提供实现 包含抽象方法的类必须声明为抽象类 抽象超类的所有具体子类都必须为超类的抽象方法提供具体实现 6 3 3抽象类的声明 使用关键字abstract声明抽象类 形如 publicabstractclassShape 抽象类通常包含一个或多个抽象方法 静态方法不能为抽象方法 抽象超类不能实例化 但可以使用抽象超类来声明引用变量 用以保存抽象类所派生的任何具体类的对象 程序通常使用这种变量来多态地操作子类对象 6 3 4抽象类程序设计的举例 例6 3抽象类的程序设计示例该例子所使用到的类的层次结构如图6 1所示 类的层次以抽象超类Shape为开始 派生出Point类 然后由Point类派生出Circle类 再由Circle类派生出Cylinder类 其中Shape以斜体字出现表示它是抽象类 图6 1Shape类的层次结构 6 4接口的声明和实现 6 4 1接口的概念6 4 2接口的声明6 4 3接口的实现6 4 4接口的程序设计举例 6 4 1接口的概念 接口 用于声明一组类的公共操作的接口 接口由常量和一组抽象方法组成 接口中不包括变量和有具体实现的方法 接口只是声明了功能是什么 方法头 而并没有定义如何实现这个功能 功能的实现 即方法体 是在继承这个接口的各个子类中完成的 接口支持多重继承 在Java中 通常把对接口功能的继承称为 实现 implement 接口与抽象类到底有什么区别 1 接口不能实现任何方法 而抽象类可以 2 类可以实现许多接口 但只有一个父类 3 接口不是类分级结构的一部分 没有联系的类可以实现相同的接口 6 4 1接口的概念 续 6 4 2接口的声明 定义接口的一般格式如下 public interface接口名 extends父接口名列表 常量声明 public final static 类型变量名 常量值 抽象方法声明 public abstract 返回类型方法名 参数列表 接口支持多重继承 接口的定义举例 6 4 2接口的声明 续 publicinterfaceStockWatcher finalStringsunTicker SUNW finalStringoracleTicker ORCL finalStringciscoTicker CSCO voidvalueChanged StringtickerSymbol doublenewValue publicinterfaceShape publicfinalstaticdoublePI 3 1416 publicabstractvoiddraw Graphicsg 6 4 3接口的实现 为了使用接口 要编写实现接口的类 如果一个类实现一个接口 且实现接口中声明的所有方法时 那么这个类才是具体的类 否则它还是一个抽象的类 具体的类才能用来定义对象 抽象的类是不能实例化的 为了声明一个类来实现一个接口 在类的声明中要包括一条implements语句 一个类可以实现多个接口 因此可以在implements后面列出由类实现的接口系列 这些接口以逗号分隔 classClassNameextendsParentClassimplementsinterface1 interface2 接口中方法的实现 6 4 4接口的程序设计举例 下面举例说明接口的使用 该例子中各类之间的层次关系如图6 1 仅仅区别在于用接口Shape替代了抽象超类Shape 例6 4接口程序设计示例 publicinterfaceShape 声明了Shape接口publicdoublegetArea 声明getArea方法publicdoublegetVolume 声明getVolume方法publicStringgetName 声明getName方法 Shape类的层次结构 6 5final方法和final类 常量 变量声明为final 说明该变量是常量 不能在声明后进行修改 并且在声明时必须对它进行初始化 final方法 方法的声明中有final 子类不能重载超类中声明为final的方法 因为子类不可能重载private方法 所以声明为private的方法隐式地为final方法 声明为static的方法也隐式地为final方法 因为只能重载非静态方法 final类 类的声明中包含final final类为不能为超类 final类中所有方法都隐式地为final方法 String类是final类的一个例子 不能扩展该类 使用字符串的程序可以调用String对象在JavaAPI中指定的函数 将类声明为final还可以防止程序员创建绕过安全限制的子类 6 6嵌套类 6 6 1内部类的概念6 6 2内部类的声明6 6 3匿名内部类声明6 6 4嵌套类的程序设计举例 6 6 1内部类的概念 嵌套在其它类里面的类称为内部类 innerclass 外层的类成为外部类 outerclass 内部类主要用于事件处理 6 6 2内部类的声明 内部类的声明格式如下 修饰符 classouterClass 修饰符 classinnerClass 例子6 5内部类使用的例子TestWindow java 程序的显示界面使用javax swing包中的JFrame类生成 定义扩展JFrame的子类TestWindow 程序运行输出结果如下 importjava awt importjava awt event importjavax swing publicclassTestWindowextendsJFrame privateJLabelaLabel privateJTextFieldaField displayField privateJButtoncomputeButton setupGUIpublicTestWindow callJFrameconstructortosettitlebarstringsuper 内部类的使用 计算一个数的平方 useinheritedmethodgetContentPanetogetwindow scontentpaneContainercontainer getContentPane container setLayout newFlowLayout changelayoutaLabel newJLabel Inputa aField newJTextField 10 container add aLabel container add aField setupdisplayFielddisplayField newJTextField 30 displayField setEditable false container add displayField setupcomputeButtoncomputeButton newJButton Compute container add computeButton createaninstanceofinnerclassActionEventHandlerActionEventHandlerhandler newActionEventHandler computeButton addActionListener handler endconstructorpublicstaticvoidmain Stringargs TestWindowwindow newTestWindow window setSize 400 140 window setVisible true endmain innerclassdeclarationforhandlingJButtoneventsprivateclassActionEventHandlerimplementsActionListener methodtohandleactioneventspublicvoidactionPerformed ActionEventevent Stringa aField getText 取用户输入的字符串数intai Integer parseInt a 转换成整型值ai ai ai 计算其平方Stringb String valueOf ai 整型值转换成字符串displayField setText Thesquareof a is b endmethodactionPerformed endinnerclassActionEventHandler endclassTestWindow abstractmethod在组件上打回车键激发ActionEvent事件 调用actionPerformed方法的执行 例子 TestWindow1 javaprivateclassActionEventHandlerimplementsActionListener methodtohandleactioneventspublicvoidactionPerformed ActionEventevent if event getSource exitButton System exit 0 terminatetheapplication userpressedEnterkeyinhourFieldelseif event getSource aField Stringa event getActionCommand intai Integer parseInt a ai ai ai Stringb String valueOf ai displayField setText Thesquareofais b endmethodactionPerformed endinnerclassActionEventHandler event getSource 返回用户正在交互的GUI组件名event getActionCommand 返回用户正在交互的GUI组件的内容 abstractmethod在组件上打回车键激发ActionEvent事件 调用actionPerformed方法的执行 6 6 3匿名内部类声明 匿名内部类 是指定义的内部类没有类名 所以当程序中使用匿名内部类时 在定义匿名内部类的地方创建该类的一个对象 匿名内部类的声明格式如下 newInterfaceName defineinnerclass 例子 TestWindow2 java 新 aField addActionListener registeraFieldeventhandlernewActionListener anonymousinnerclass methodtohandleactioneventspublicvoidactionPerformed ActionEventevent Stringa event getActionCommand intai Integer parseInt a ai ai ai Stringb String valueOf ai displayField setText Thesquareofais b endmethodactionPerformed endofanonymousinnerclass endcalltoaddActionListenerexitButton addActionListener registerexitButtoneventhandlernewActionListener anonymousinnerclass methodtohandleactioneventspublicvoidactionPerformed ActionEventevent System exit 0 endmethodactionPerformed endofanonymousinnerclass endcalltoaddActionListener 6 6 4嵌套类的程序设计举例 该程序包含两个文件Time java和TimeTestWindow java Time java文件定义了一个Time类 TimeTestWindow java文件中定义了一个内部类ActionEventHandler和一个匿名内部类 通过内部类和匿名内部类来处理用户对时间的设置事件 在声明和使用嵌套类时 应该注意以下事项 1 包含嵌套类的类在编译时 将为每个类产生单独的 class文件 嵌套类文件名为OuterClassName InnerClassName class 匿名内部类的文件名为OuterClassName class 从1开始 编译时 每遇到一个匿名内部类 递增1 2 带有名称的内部类可以声明为public protected 包访问或private 并且它们的使用限制与其他类成员相同 3 内部类能以OuterClassName this的形式访问其外部类的this引用 4 外部类负责创建内部类的对象 为创建另一个类的内部类对象 首先创建该外部类的一个对象 并将该对象的引用赋给外部类类型的变量 我们假

温馨提示

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

评论

0/150

提交评论