




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 对象关系研究 课程目标 Java类的继承关系Java类的聚合关系Java类的关联关系继承下的方法重写Java多态实现Object类 继承关系 继承继承是面向对象编程的又一个重要的特点 它允许创建多层次的分类 利用继承 可以先创建一个共有属性的通用类 然后根据该通用类来创建具有特殊属性的新类 父类和子类在Java中 被继承的类称为父类 超类 由继承而得到的新类称为子类 父类可以是Java类库中的类 也可以是自己写的类 一个子类是一个父类的特定版本 它继承了父类定义的所有实例变量和方法 同时添加了自己特有的元素 Java不支持多重继承 也就是说 子类只能有一个父类 extends关键字如果一个子类要继承父类 那么可以使用关键字extends来实现 它的基本格式如下 class子类名extends父类名 body 比如 电话卡类 使用继承定义的电话卡类 示例 例如我们可以把汽车看成一个父类 宝马车看成子类 子类继承了父类的通用属性 如都有引擎 轮子 方向盘等 然后又开创了自己特有的属性 如漂亮的外观 高雅的内饰 强劲的动力等等 我们可以用程序来表达这样的关系 如下 calssCar voidengine voidwheel classBMWextendsCar voidbeautiful voiddriving 如果一个类的声明中没有使用关键字extends 那么这个类被系统默认为是继承了Object父类 Object类是java lang包中的类 在本章的最后将详细介绍Object类 子类的继承性 子类可以从父类继承一部分成员 也可以自己再声明一部分成员 子类继承父类的成员变量作为自己的一个成员变量 就好像它们是在子类中直接声明的一样 可以被子类中自己声明的任何实例方法操作 一个子类也可以成为另一个子类的父类 就像老爸 儿子 孙子的关系一样 子类继承父类 在两种情况下我们需要注意 子类和父类在同一个包中时 虽然子类可以包括其父类的所有成员 但它不能访问声明为private的父类成员 私有成员 子类和父类不在同一个包中时 那么子类只能继承父类声明为protected public的成员 不能继承私有成员和友好成员 示例 classFirstInheritTest publicstaticvoidmain Stringargs Grandsongs newGrandson classDad privateintmoney 100000 私有的intmoneyRMB 100000 intmoneyHK 50000 Stringdmoney Dad System out println 我是老爸 System out println 这是我私有的 不能给你们 money System out println 这些你拿去 sum n publicStringsum dmoney 人民币 moneyRMB 港币 moneyHK returndmoney classSunextendsDad intmoneyDollar 50000 inti j Stringsmoney Sun System out println 我是儿子 自己有美元 moneyDollar System out println 这是我继承的 add n publicStringadd i moneyRMB j moneyHK smoney 人民币 i 港币 j returnsmoney classGrandsonextendsSun intk Stringgsmoney Grandson System out println 我是孙子 啥都没有 System out println 这是我继承的 subs publicStringsubs k moneyDollar gsmoney 美元 k smoney returngsmoney 关联关系 关联关系对象和对象之间除了继承关系之外 还存在着关联关系 包括一对一 一对多 多对一和多对多等关系 关联关系表示不同类的对象之间的结构关系 它在一段时间内将多个类的实例连接在一起 从A类到B类的关联关系表示A或A的对象对B或B的对象进行引用 关联关系具有名称和多重性 多重性定义了被连接的类中有多少个对象可以连接 关联关系 我们假定要完成一个图书馆管理系统 该系统中需要管理很多书 我们需要记录书的基本信息如编号 书名 出版日期等信息 还需要记录书的前言 序等信息 假设我们根据上面的需求 将书设计成一个类 Book 包括了书的编号和名称两个属性 同时将书的前言信息设计成另外一个类 BookExtend 它包括了书的编号和前言信息两个属性 由于一本书有前言 而且也不可能有其他的书的前言部分会和它一样 所以类Book和BookExtend之间很自然的形成了一对一的关系 这两个类的属性以及类之间的关系如图所示 示例 classBook intid Stringname BookExtendbookExtend publicvoidsetId intid this id id publicintgetId returnid publicvoidsetName Stringname this name name publicStringgetName returnname publicvoidsetBookExtend BookExtendbookExtend this bookExtend bookExtend publicBookExtendgetBookExtend returnbookExtend classBookExtend intid Stringname publicvoidsetId intid this id id publicintgetId returnid publicvoidsetName Stringname this name name publicStringgetName returnname 聚合关系 聚合关系是关联关系的一种 是强的关联关系 聚合关系是整体和个体的关系 关联关系的两个类处于同一层次上 而聚合关系两个类处于不同的层次 一个是整体 一个是部分 有许多组成关系的示例 汽车由许多零部件组成 计算机由许多设备组成 图书馆包括大量的书籍 公司部门由雇员组成 如果对此进行建模 那么聚合关系体 汽车 与其组成部分 零部件 之间存在聚合关系的关联关系 聚合关系 比如订单 一个订单Orders中由客户名称 地址 订购的产品品种和数量组成 客户名称和地址我们可以抽象为Customer来代表 产品我们使用Product来代表 由于一个订单中可能订购了多个产品 很显然 一个订单对象中应该有多个Product对象 而且每个Product的数量不一样 我们将Product和其数量再抽象包装成OrderLine订单条目对象 这样 订单中包含多个订单条目 而且订单条目只有依赖某个订单 是其组成部分 是一种强聚合关系 不是普通的聚合或关联关系 而Customer和Order之间是一种聚合关系 如果订单没有客户信息 就不成为订单了 用图表来表示就如图所示 聚合关系 继承下的重写 子类可以通过方法重写来隐藏继承父类的方法 通过方法重写 子类可以把父类的状态和行为变成自己的状态和行为 只要父类的方法能够被子类继承 子类就能重写这个方法 一旦子类重写了这个方法 就表示隐藏了所继承的这个方法 如果子类对象调用这个方法 那也是调用重写后的方法 示例 classA voidsmile System out println 我考试得了第一 我很高兴 voidcry System out println 看完这部电影 我感动的哭了 classBextendsA B smile cry voidsmile System out println 我找到了一份好工作 我太高兴了 classRewriteTest publicstaticvoidmain Stringargs Bb newB 代码说明 在这个程序中 类B继承类A后 重写了父类的smile 方法 从输出结果我们可以看到父类 类A 的smile 方法中的语句并没有打印出来 重写方法既可以操作继承的成员变量 也可以操作子类声明定义的成员变量 如果子类想使用被隐藏的方法 必须使用关键字super super关键字 子类使用super关键字可以调用父类的构造方法 也可以调用被子类隐藏的成员变量和方法 使用super调用父类的构造方法子类不继承父类的构造方法 如果子类想调用父类的构造方法 可以使用super关键字来实现 但是super语句必须是子类构造方法中的第一条语句 子类在创建对象时 子类的构造方法总是调用父类的某个构造方法 如果父类有多个构造方法 那么子类默认调用的是那个不带参数的构造方法 如果父类只有一个带参的构造方法 那么子类必须在自己的构造方法中用super语句来调用父类的带参的构造方法 否则程序会报错 如果子类的构造方法中没有写super语句 那么系统将默认有 super 存在 即调用父类的不带参的构造方法 示例 classA A System out println 我是不带参数的构造方法 A inti System out println 我带了一个int型参数 i i classBextendsA B super 10 调用父类带参的构造方法System out println 我是类B 我继承了类A n 示例 classCextendsA C 调用父类不带参的构造方法System out println 我是类C 我继承了类A classFirstSuperTest publicstaticvoidmain Stringargs Bb newB Cc newC 使用super操作被隐藏的成员变量和方法 我们已经了解到 如果子类隐藏了父类的某个成员变量或者方法 如果不采取某种措施的话 那么子类创建的对象也将无法访问到被隐藏的成员变量或方法 如果使用super关键字的话 就能解决这个问题 classA inta 10 A System out println 我是类A 我被类B继承了 voidsmile System out println 我是类A的smile 方法 示例 classBextendsA inta intb B a 20 System out println 我是类B的a变量 a b super a 操作被隐藏的成员变量aSystem out println 我是类A的a变量 b voidsmile super smile 调用被隐藏的smile 方法System out println 我是类B的smile 方法 classSecondSuperTest publicstaticvoidmain Stringargs Bb newB b smile 多态 多态性是指允许不同类的对象对同一消息做出响应 多态性包括参数化多态性和包含多态性 多态性语言具有灵活 抽象 行为共享 代码共享的优势 很好的解决了应用程序方法同名问题 与继承有关的多态性是指父类的某个方法被其子类重写时 可以各自产生自己的功能行为 指同一个操作被不同类型对象调用时产生不同的行为 我们也可以这样来概括多态性 当我们将子类对象的引用传给声明为父类的一个对象变量 如果子类有这个方法就调用子类的方法 如果子类没有这个方法就调用父类的这个方法 多态的例子 classAnimal Animal System out println 狗 猫都叫动物 voideat System out println 动物都要吃东西的 voidrun System out println 动物都会跑来跑去的 classDogextendsAnimal voideat System out println 狗吃骨头 publicclassTest publicstaticvoidmain Stringargs Dogdog1 newDog dog1 eat Dogdog2 newDog Animalanimal animal dog2 animal eat 如果Dog类有这个方法就调用Dog类的方法animal run 如果Dog类没有这个方法就调用Animal类的方法 Final类 以final修饰的成员变量 对象虽然可以操作使用它 但是不能对它进行更改操作 以final修饰的类是不能被继承的 换句话说 即final类不能有子类 比如下面的程序是无法通过编译的 finalclassA classBextendsA 非法 Final方法 这样来规定final类主要是处于安全性的考虑 例如我们可以将一些重要的类修饰为final类 如果一个方法被修饰为final方法 那么这个方法就不能被子类重写 同时 final方法的行为是不允许子类篡改的 例如下面的test方法就不能被子类重写 classA inta finalvoidtest a 10 Object类 Object类是所有类的超类 也就是说 Java中每一个类都是由Object类扩展而来的 因而每当你创建一个对象 它都将拥有Object类中的全部方法 下面我们来了解Object类的方法以及方法的用途 如下表所示 Object类的方法及其用途 说明 Object类所提供的只是一些基本的方法 我们在编写自己的类时经常需要覆盖这些方法 一方面是加强功能 另一方面也是为了适应当前的情况 Object类中的equals方法用来判断两个对象是否相等 最常见的就是用它来比较两个字符串是否相等 java语言规范要求equals方法具有以下性质 自反性 对于任何非空引用x x equals x 返回true 对称性 对于任何非空引用x和y 当且仅当y equals x 返回true时 x equals y 返回true 传递性 对于任何引用x y和z 如果x equals y 返回true并且y equals z 也返回true 那么x equals z 应该返回true 一致性 如果x和y引用的对象没有改变 那么x equals y 的重复调用应该返回同一结果 对于任何非空引用x x equals null 应该返回false 本章总结 Java类的继承关系Java类的聚合关系Java类的关联关系继承下的方法重写Java多态实现Object类 动手实践 计算箱子体积 对象的继承 计算箱子的体积 目标通过给定的箱子的长 宽 高 实现计算一个箱子的体积与底面积 并且判断 如果箱子体积大于等于5000 打印信息到控制台 这个箱子太大了 我都扛不动了 否则 打印信息为 还好 我还能扛起来 1 使用extends关键字实现子类继承父类 2 使用super关键字调用父类的构造方法及被隐藏的方法 程序运行结果如图所示 箱子类 classBox intwidth height length Box Box intw inth intl this wi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论