Java第5章继承与多态2.ppt_第1页
Java第5章继承与多态2.ppt_第2页
Java第5章继承与多态2.ppt_第3页
Java第5章继承与多态2.ppt_第4页
Java第5章继承与多态2.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第5章 继承与多态 一 继承性与多态性的实现技术 类是用来描述具有相同属性和行为对象集合的工具 任何一个类别的对象都不是独立存在于客观世界上的 因此类与类之间必定存在着某些关系 概括起来有下列三种 关联关系聚合关系泛化关系 关联关系 关联是指两个或多个类之间的一种特定关系 它描述了各个类对象之间相互依赖的关系 最常见的关联是两个类之间的关联 即二元关联 在Java程序中 常用成员对象实现 聚合关系 顾名思义 聚合是将多个类聚集在一起的意思 聚合的方式有如下几种 包含关系 hasa 组成关系 partof 所属关系 owns 雇佣关系 employed by 在Java程序中用成员对象实现集合关系 泛化关系 泛化描述了两个类之间的 一般 特殊 关系 可以使用 Isa 进行检测 泛化关系体现了类之间的继承关系 在Java程序中 用定义子类实现 继承机制是实现软件可重用的基石 是提高软件系统的可扩展性和可维护性的主要途径 所谓继承是指一个类的定义可以基于另外一个已经存在的类 即子类基于父类 从而实现父类代码的重用 在Java语言中 通过定义子类支持继承性 多态性是面向对象程序设计的一个核心概念 它有助于增加软件系统的可扩展性 自然性和可维护性 所谓多态是指不同的类对象收到同一个消息可以产生完全不同的响应效果的现象 利用多态机制 用户可以发送一个通用的消息给各个类对象 而实现细节由接收对象自行决定 这样 同一个消息可能会导致调用不同的方法 在Java语言中 主要利用子类覆盖父类的成员方法的方式支持多态性 二 类的继承 在Java中 类是一个层次结构 其中有一个被称为Object的特殊超类 所有的类都是Object直接或间接的子类 子类继承父类的数据成员和成员方法 同时也可以更改父类的数据成员或重载父类的成员方法 以及在父类的基础上添加新的数据成员和成员方法 因此 父类和子类之间反映的是 一般与特殊 的关系 应用继承的主要场合 反映类之间的泛化 即 一般 特殊 关系 圆形 矩形 统一同类操作的接口 子类的定义格式 修饰符 子类名称extends父类名称 子类体 注意 没有extends 默认父类为Object只能有一个父类 即单继承子类继承父类中除private部分的全部内容类继承具有传递性 classB intb1 1 publicintb2 2 protectedintb3 3 privateintb4 4 intgetb4 returnb4 classAextendsB inta 5 intsum returnb1 b2 b3 getb4 a b1b2b3b4agetb4 Sum A类对象包含的成员 classClassInheritance publicstaticvoidmain Stringargs Bbb newB System out println B bb b1 bb b2 bb b3 bb getb4 Aaa newA System out println A aa b1 aa b2 aa b3 aa getb4 aa a aa sum 假设ClassInheritance类与A B类在同一个包中 classB intb1 1 publicintb2 2 protectedintb3 3 privateintb4 4 intgetb4 returnb4 voidsetb4 inti b4 i classAextendsB inta 5 classCextendsA intc 6 voidchange intincrease b1 increase b2 increase b3 increase setb4 getb4 increase a increase c increase 继承的传递性 classCPP publicstaticvoidmain Stringarg Ccc newC System out println C cc b1 cc b2 cc b3 cc getb4 cc a cc c cc change 15 System out println C cc b1 cc b2 cc b3 cc getb4 cc a cc c 假设CPP类与A B C类在同一个包中 子类与父类的属性与方法 子类继承父类中除private部分的所有内容 子类中新增加的属性和方法是对父类的扩展 子类中定义的与父类同名的属性是对父类属性的隐藏 同名的成员方法是对父类方法的重载或覆盖 类的成员覆盖 类成员覆盖是指在子类中新增加的数据成员的名称与父类相同 成员方法与父类定义的原型一样 若希望引用父类中的相应成员 需要使用关键字super作为前缀 classA intx 1234 voidshow System out println classA classBextendsA doublex 567 89 数据成员覆盖 不提倡这样使用 voidshow 成员方法覆盖 super show System out println classB 三 子类的构造方法 1 子类应该负责调用父类的构造方法 2 若子类中没有定义构造方法 则它自动地调用父类无参数的构造方法 若子类定义了构造方法 应该在第一条语句的位置调用父类的构造方法 否则系统将在此位置插入一条调用父类无参数构造方法的语句 3 对于父类中含有参数的构造方法 只能在子类的构造方法中利用super显式地调用 classA privateinta A a 0 A inti a i intgetA returna classBextendsA doubleb1 b2 B this 11 1 12 2 B doubled1 doubled2 b1 d1 b2 d2 B inti doubled1 doubled2 super i b1 d1 b2 d2 B inti doubled super i b1 d b2 0 B doubled super 4 b1 0 b2 d 继承性举例 几何图元描述 任何一个几何图元都有颜色和原点这两个基本属性 矩形是一种图元 它还有长 length 宽 width 两个属性 正方形是一种特殊的矩形 它的特殊性在于长和宽相等 第3次上机作业 四 修饰符 static static可以修饰类中的数据成员和成员方法 静态数据成员在加载类时分配空间 它属于类 又称为类变量 而非静态变量称为实例变量 不属于某个特定的对象 因此可以通过类进行访问 往往将属于该类的每个对象共用的数据成员声明成static 用static修饰的成员方法属于整个类的成员方法 又称为类方法 其特点为 调用该方法时 前缀可以使用类名该方法的代码段随着类加载在内存中由于该方法属于整个类 所以 它不能处理和调用属于对象的实例成员 而只能处理或调用static成员 例如 Math类中的绝大部分方法 classStaticClass intx staticinty 3 voidshowx System out println x x staticvoidshow System out print static staticvoidshowy System out println y y staticvoidshow static show showy publicclassStaticTest publicstaticvoidmain Stringargs StaticClass y 1 StaticClass show static StaticClassa1 newStaticClass a1 showx StaticClass showy a1 showy StaticClassa2 newStaticClass a2 x 6 a2 y 7 a2 showx a2 show static a1 show static StaticClass show static y 3show showy show static y 4show showy show static y 7show showy show static 初始化静态成员变量的初始化器 静态初始化器是在类定义中由关键字static引导的一对大括号括起来的语句组 它的任务是对静态成员变量进行初始化 publicclassEmployee privateintm EmpNo 雇员编号privateStringm EmpName 雇员姓名privatecharm EmpSex 雇员性别privatedoublem EmpSalary 雇员工资staticdoublem MinSalary 雇员最低工资staticintm NextEmpNo 下一个雇员的编号static 静态初始化器m MinSalary 250 m NextEmpNo 3001 publicEmployee Stringname charsex doublesal 构造方法 初始化器与构造函数的区别 五 抽象类与修饰符abstract 用abstract修饰的类被称为抽象类 所谓抽象类是指没有完整实现类定义的类 它的主要用途是用来描述概念性的内容 这样可以提高开发效率 更好地统一用户接口 需要注意的是 不能创建抽象类的实例对象 抽象方法 abstract可以修饰成员方法 表明该成员方法是一个抽象的方法 即没有方法体 必须在子类中具体描述方法的实现过程 抽象方法必须存在于抽象类之中 abstractclassA abstractvoidshow abstractvoidshow inti classBextendsA intx voidshow System out println x x voidshow inti x i System out println x x publicclassAbstractUse publicstaticvoidmain String args Bb newB b show b show 7 publicabstractclassFigure 图形 protecteddoublex 10 0 y 5 0 abstractdoublearea publicclassTriangleextendsFigure 三角形 Triangle doublea doubleb x a y b doublearea return0 5 x y publicclassRectangleextendsFigure 矩形 Rectangle doublea doubleb x a y b doublearea returnx y publicclassCircleextendsFigure 圆形 Circle doublea x a finaldoublePI 3 1416 doublearea returnPI x x publicclassPolymorphism publicstaticvoidmain Stringargs Trianglet newTriangle 5 0 2 0 System out println Thetriangleareais t area Rectangler newRectangle 3 0 4 0 System out println Therectangleareais r area Circlec newCircle 10 0 System out println Thecircleareais c area 抽象类小结 抽象方法一定要位于抽象类中 设置抽象类的目的是概念化具有共性的所有事物 并为之设置统一的用户接口 而具体操作的实现在子类中 抽象类中的抽象方法应该是每个子类都具有的操作 但每个子类的具体操作内容不一样 使用抽象类的好处 隐藏具体的操作细节 有利于软件的维护和扩展 六 多态性的实现 类对象之间的类型转换ObjectTypeObject1 newObjectType ObjectTypeObject2 Object1 结果 将Object1的引用赋给Object2若将子类对象的引用赋给父类对象的引用 则可以用显式或隐式实现 即可以直接将子类对象的引用直接赋给父类对象的引用 若将父类对象的引用赋给子类对象的引用 则必须使用显式转换 即强制类型转换 classA classBextendsA 只能访问A类中定义的成员 多态性的实现 在Java语言中 使用动态联编实现多态性 具体实现方式 多态性出现在继承关系中 子类覆盖父类的成员方法 若在程序中调用该方法 则根据对象所引用的实例所属类确定最终调用的代码块 多态性举例 动物 狗 猫 鸭子 importjava util Random publicabstractclassAnimal 动物类 protectedStringtype 动物种类protectedStringname 名称protectedStringbreed 品种publicAnimal Stringtype Stringname Stringbreed publicStringtoString return Thisisa type nIt s name the breed publicabstractvoidsound classDogextendsAnimal Dog类 publicDog Stringname super Dog name Unknow publicDog Stringname Stringbreed super Dog name breed publicvoidsound System out println WoofWoof Cat Duck两个类的定义类似 只是sound 方法内容不一样 publicclassTryPolymorphism 测试类 publicstaticvoidmain String args Animal theAnimals newDog Rover Poodle newCat Max Abyssinian newDuck Daffy Aylesbury AnimalpetChoice 声明父类的引用for inti 0 i 3 i petChoice theAnimals i System out println nYourChoice n petChoice petChoice sound 根据petChoice所指对象类别做出响应 多态性应用举例 学校人事管理 为简化问题的规模 假设只考虑学生和教师 importjava util publicabstractclassPerson privateintnumber privateStringname privateDatebirthday publicPerson publicPerson intnumber Stringname Datebirthday publicvoidsetInfo intnumber Stringname Datebirthday publicintgetNumber returnnumber publicStringgetName returnname publicDategetBirthday returnbirthday publicStringtoString publicclassStudentextendsPerson privateStringmajor publicStudent super publicStudent intnumber Stringname Datebirthday Stringmajor super number name birthday this major newString major publicStringgetMajor returnmajor publicvoidsetInfo intnumber Stringname Datebirthday Stringmajor publicStringtoString returnsuper toString Major major publicclassTeacherextendsPerson privateStringdepartment floatsalary publicTeacher publicTeacher intnumber Stringname Datebirthday Stringdepartment floatsalary publicStringgetDepartment returndepartment publicfloatgetSalary returnsalary publicvoidsetInfo intnumber Stringname Datebirthday Stringdepartment floatsalary publicStringtoString importjava io importjava util publicclassTryClass publicstaticvoidmain String args Datedate Persons date newDate 1984 3 26 s newStudent 100 WangDong date Computer System out println s s newTeacher 200 Chenping newDate 1958 12 2 Comupter 3000 0f System out println s 构造异质链表 异质链表是每个结点存放不同类别对象的链表 要求这些对象所属的类具有相同的父类 LinkList Nodehead Nodetail append toString Node Personinfo Nodenext getInfo getNext setNext toString publicclassNode 结点类 privatePersoninfo privateNodenext publicNode publicNode Personinfo publicPersongetInfo returninfo publicNodegetNext returnnext publicvoidsetNext Nodenode this next node publicStringtoString returninfo toString importjava io publicclassLinkList 链表类 Nodehead 头结点引用Nodetail 尾结点引用publicLinkList publicvoidappend Personinfo publicStringtoString Nodep Strings p head getNext 头结点之后的第1个结点while p null s p getInfo n p p getNext returns importjava io importjava util publicclassTryClass publicstaticvoidmain String args LinkListlink newLinkList Datedate newDate 1984 3 26 Students newStudent 100 WangDong date Computer link append s date newDate 1958 12 2 Teachert newTeacher 200 Chenping date Comupter 3000 0f link append t date newDate 1982 10 26 s newStudent 101 LiLin date Math link append s date newDate 1950 1 12 t newTeacher 201 Zhaoxue date Physics 4000 0f link append t System out println link 第4次上机作业 请将第3题的图元 线段 矩形 椭圆等 存储在一个异质链表中 七 接口 接口可以实现类间多继承结构 接口内部只能定义public的抽象方法和公有的 静态常量 因此接口中的所有方法都需要在子类中实现 接口的定义格式 public interface接口名称 常量 默认publicstaticfinal方法 默认publicabstract 在定义接口时 若没有public 则该接口只能由同一个包中的类或接口引用 interfaceA doubleg 9 8 voidshow classBimplementsA publicvoidshow System out println g g classInterfaceTest publicstaticvoidmain Stringargs Bb newB b show Aa newB a show publicstaticfinal publicabstract 接口的继承举例 interfaceA inta 1 voidshowa interfaceBextendsA intb 2 voidshowb interfaceC intc 3 voidshowc interfaceDextendsB C intd 4 voidshowd classEimplementsD inte 5 publicvoidshowa System out println a a publicvoidshowb System out println b b publicvoidshowc System out println c c publicvoidshowd System out println d d publicvoidshowe System out println e e 类必须实现接口继承的全部方法 classInterface H C publicstaticvoidmain Stringargs Eee newE ee showa ee showb ee showc ee showd ee showe 使用接口应注意的地方及益处 一个类可以继承多个接口 但必须实现每个接口的全部成员方法 若不实现全部成员方法 则必须将该类说明成abstract 使用接口的好处是统一操作接口 即可以在不暴露具体类的前提下 公开操作接口的规范 接口应用举例 对象的比较 在Java语言的java lang包中提供了一个通用接口Comparable 若要使对象之间能够比较大小 就必须让该对象所属的类实现这个接口 这个接口的源代码如下 packagejava lang publicinterfaceComparable publicintcompareTo ObjectO GeometricObject Circle Rectangle comparableCircle Comparable publicabstractclassGeometricObject privateStringcolor white privatebooleanfilled protectedGeometricObject Stringcolor booleanfilled this color color this filled filled publicStringgetColor returncolor publicvoidsetColor Stringcolor this color color publicbooleanisFilled returnfilled publicvoidsetFilled booleanfilled this filled filled publicabstractdoublefindArea publicabstractdoublefindPerimeter publicclassCircleextendsGeometricObject privatedoubleradius publicCircle this 1 0 publicCircle doubleradius this radius white false publicCircle doubleradius Stringcolor booleanfilled super color filled this radius radius publicdoublegetRadius returnradius publicvoidsetRadius doubleradius this radius radius publicdoublefindArea returnradius radius Math PI publicdoublefindPerimeter return2 radius Math PI publicbooleanequals Circlecircle returnthis radius circle getRadius publicStringtoString return Circle radius radius publicclassRectangleextendsGeometricObject privatedoublewidth height publicRectangle this 1 0 1 0 publicRectangle doublewidth doubleheight this width height white false publicRectangle doublewidth doubleheight Stringcolor booleanfilled super color filled this width width this height height publicdoublegetWidth re

温馨提示

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

评论

0/150

提交评论