java程序设计chap8_第1页
java程序设计chap8_第2页
java程序设计chap8_第3页
java程序设计chap8_第4页
java程序设计chap8_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-WesleyJava Software Solutions Foundations of Program DesignSixth Editionby Lewis & LoftusChapter 8: 继继承承Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-2继继承承 继承是组织和创建、重用类的基本技术 第八章重点讨论: 从现有类派生新类的问题 P

2、rotected修饰符 创建类层次 抽象类 与继承有关的可见性问题 继承设计 GUI组件的继承层次结构 扩展适配器类创建监听器 Timer类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-3Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITimer类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-4继继承承 继承允许

3、一个软件开发人员在已存在类的基础上开发出新类 已经存在的类称为父类,或超类 新类称为子类 子类继承了父类的所有特性 也就是子类继承了父类定义的方法和数据Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-5继继承承 继承关系在UML类图中采用实心线和空心箭头表示,描述如下:VehicleVehicleCarCar 继承的过程是在两个类之间建立“是一种”( is-a)的关系,即子类是一种更具体的父类版本Copyright 2009 Pearson Education, Inc. Publishi

4、ng as Pearson Addison-Wesley8-6继继承承 程序员可以对原有类进行剪裁,包括增加新变量或方法,或者修改继承的方法 软件重用是继承带来的最基本的好处 通过使用已有的软件组件来创建新的软件组件,可以省略很多精力用于设计,实现和测试已有的软件组件Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-7创创建子类建子类 Java语言采用保留字extends 以确立继承关系 See Words.java See Book.java See Dictionary.java cla

5、ss Car extends Vehicle / class contentsCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-8Protected修修饰饰符符 可见性修饰符用于控制对类成员的访问,这种控制也延伸到继承的过程中 采用private可变修饰符定义的变量和方法不能通过名字被子类引用 一个父类的public方法或变量可以在子类中按名访问,然而如果为了子类能够访问而声明一个父类public变量,则将违反封装性的原则 Java提供了第三种可见性修饰符:protected以适应继承Cop

6、yright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-9Protected修修饰饰符符 Protected修饰符允许子类直接引用父类的变量或方法 Protected修饰符相比public可见性提供了更多的封装性,但是不如private可见性严格 声明为protected可见性的变量和方法可以由同一包内的任何类访问 附录E完整解释了所有java修饰符之间的关系 在UML图中,protected成员前加“#”符号表示proteted可见性Copyright 2009 Pearson Education,

7、Inc. Publishing as Pearson Addison-Wesley8-10Words类类图图BookBook# pages : int# pages : int+ pageMessage() : void+ pageMessage() : voidDictionaryDictionary- definitions : int- definitions : int+ definitionMessage() : void+ definitionMessage() : voidWordsWords+ main (args : String) : void+ main (args :

8、String) : voidCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-11Super引用引用 构造方法不能被继承,即使它们拥有public可见性 但可以设想子类可能需要引用父类的构造方法 在一个类中可以使用保留字super引用父类,即使用super引用可以访问父类的成员 See Words2.java See Book2.java See Dictionary2.java Copyright 2009 Pearson Education, Inc. Publishing as Pea

9、rson Addison-Wesley8-12Super引用引用 子类的构造器负责调用父类的构造器 子类构造器的第一行应当使用super引用以调用父类的构造器 super引用也可以用于引用在父类中声明的其他变量和方法 Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-13多多继继承承 Java 支持单继承,即子类只能有唯一的父类 多继承允许一个子类有多个父类 多继承可能带来冲突,例如两个父类的同名变量的情况需要解决 Java不支持多继承 在大多数情况,Java可使用接口提供多继承的最好特性而

10、不会增加歧义性Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-14Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITimer类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-15覆盖方法覆盖方法 子类方法可覆盖它所继承的父类方法 覆盖后子类新方法拥有父类的方法名,但拥有不同的方法体 子类方法优先,覆盖通常发生在继承的

11、情况中 调用方法的对象决定了哪个版本的方法将被实际执行 See Messages.java See Thought.java See Advice.java Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-16覆盖覆盖 父类中的方法可以通过super引用显式调用 如果一个方法以final修饰符声明,那么它不能被子类覆盖 覆盖的概念可以应用到数据变量,称为影子变量 原则上应该避免使用影子变量,因为它会引起代码中的潜在问题Copyright 2009 Pearson Education, In

12、c. Publishing as Pearson Addison-Wesley8-17重重载载 vs. 覆盖覆盖 重载主要处理在同一个类中拥有多个相同名字的方法,这些方法拥有不同的参数 覆盖主要处理两个方法,一个位于父类,一个位于子类 重载为不同参数的同一操作提供定义方法 覆盖提供了在不同对象类型中定义相同操作的方法Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-18Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITime

13、r类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-19类类层层次次结结构构 从一个父类派生出的子类还可以是它自己子类的父类,因此继承关系发展为一个类层次结构BusinessBusinessKMartKMartMacysMacysServiceBusinessServiceBusinessKinkosKinkosRetailBusinessRetailBusinessCopyright 2009 Pearson Education, Inc. Publishing as Pearson

14、Addison-Wesley8-20类类层层次次结结构构 同一个父类的两个子类称为兄弟类 应当合理地将类的公共特性保持在尽可能高的类层次级上 继承机制具有传递性 因此一个子类继承了它的所有祖先类 不存在任何情况下都是最佳的类层次结构Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-21Object类类 Object类定义在java标准类库中的 java.lang包 所有的类都由Object类派生 如果一个类的定义中没有显式用extends子句从另一个类派生自己,则自动从Object类派生 因

15、此Object类是类层次结构的最终根节点Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-22Object类类 Object类包含了一些有用的方法,可以被所有类继承 例如, Object类包含了toString方法的定义 每次我们定义toString方法,我们实际覆盖了继承的定义 Object类中的toString方法返回表示一个对象名字字符串,并且在对象名后跟随一个唯一表示该对象的数值Copyright 2009 Pearson Education, Inc. Publishing as

16、Pearson Addison-Wesley8-23Object类类 Object类的Equals方法返回真值如果两个对象引用实际上指向相同的对象(二者为别名) 可以覆盖任何类的equals方法以提供更实用的方法 String 类定义了equals方法以检测两个字符串是否包含相同的字符 String类的设计者覆盖了从Object类继承的equals方法以提供更实用的版本Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-24抽象类抽象类 抽象类在类层次结构中代表一般性概念 抽象类不能被实例化

17、在类头采用修饰符abstract声明抽象类public abstract class Product / contentsCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-25抽象类抽象类 抽象类通常包含没有定义的抽象方法(类似接口) 不同于接口,修饰符abstract必须应用到每一个抽象方法 一个抽象类通常包含带有全部定义的非抽象方法 一个类声明为抽象并不一定要包含抽象方法Copyright 2009 Pearson Education, Inc. Publishing as Pearso

18、n Addison-Wesley8-26抽象类抽象类 抽象类的子类必须覆盖父类的抽象方法,否则该子类仍然是抽象类 抽象方法不能定义为final 或 static 抽象类的使用是软件设计的重要元素,它允许在一个层次结构中建立一个通用元素,而他往往难以实例化Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-27接口接口层层次次结结构构 继承的概念可应用于接口及类 即一个接口可以另一个接口派生 子接口继承了父接口的所有抽象方法和常量 任何实现子接口的类都必须实现所有的抽象方法 注意类层次和接口层次

19、是截然不同的(它们不会重叠)Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-28Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITimer类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-29可可见见性性 父类的所有变量和方法甚至私有成员都能被子类继承 私有成员不能通过名字被子类引用 在子类中即使不能直接引用父类私有

20、成员,但父类私有成员也总是存在,而且能够间接地引用Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-30可可见见性性 因为父类能够引用私有成员,子类能够通过父类的方法间接引用父类私有成员 Super引用可用于引用父类,即使在没有父类对象存在的情况下 See FoodAnalyzer.java See FoodItem.java See Pizza.java Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison

21、-Wesley8-31Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITimer类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-32继继承承设计设计 继承是面向对象设计的重要特征 合理设计继承关系可以有效地重用软件Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-33继继承承设计设计 每一次的派生都应该具有“是一种”

22、关系 设计类层次结构有利于现有类的重用和将来潜在的软件重用 找出类的公共属性并合理地将公共属性设置在尽可能高的类层次上,以实现类定义的一致性和软件的易维护性 覆盖方法适于增删和修改子类的功能 可以按需要在子类添加新变量,而不要冲定义任何继承下来的变量,避免产生影子变量Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-34继继承承设计设计 要让每一个类管理自己的数据,因此应使用super调用父类的构造方法,并且适当地调用覆盖方法 即使当前暂时没有需要,也应该在子类中适当覆盖通用方法,以免将来被

23、继承的方法无意中引起问题 使用抽象类为类层次结构中底层的具体类定义公共类接口 慎重使用可见性修饰符,在提供子类所需的访问控制的同时,不破坏父类的封装性Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-35继继承的限制承的限制 Final修饰符可用于限制继承 在一个方法声明中使用final修饰符,使得该方法在任何派生类中不能被覆盖 如果一个类被final修饰符所声明,那么该类不能再用于派生新类因此抽象类不能声明为finalCopyright 2009 Pearson Education, In

24、c. Publishing as Pearson Addison-Wesley8-36Outline创建子类创建子类覆盖方法覆盖方法类层次类层次继承与可见性继承与可见性继承设计继承设计继承与继承与GUITimer类类Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-37组组件类的件类的层层次次结结构构 定义GUI组件的所有Java类都为层次结构的一部分(图8.7) 几乎所有Swing 组件都由Jcomponent类派生, 而 Jcomponent类又由Container类派生 许多Swing

25、组件能够作为容器,它们由Container 类派生 例如Jlabel对象可以包含 ImageIconCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-38组组件类的件类的层层次次结结构构 Applet是继承的一个非常好的例子 当定义applet时,我们继承了 Applet类或者Japplet类 Applet 和Japplet类已经处理了所有关于applet创建和执行的细节, 包括: 与浏览器交互从HTML接收applet参数强制安全限制Copyright 2009 Pearson Educa

26、tion, Inc. Publishing as Pearson Addison-Wesley8-39组组件类的件类的层层次次结结构构 也就是我们的applet代码只处理与其他applet不同的部分 当我们定义了applet的paintComponent方法,我们实际覆盖了Jcomponent类和继承自Japplet类的方法Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-40扩展适配器类扩展适配器类 继承也提供了创建监听器类的另外一个技术 监听器类可以通过实现特定接口,例如MouseListener 我们也可以通过继承事件适配器类来创建监听器类 包含多个方法的每个监听器接口都有一个相对应的包含了所有方法的空定义的适配器类Copyright 2009

温馨提示

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

评论

0/150

提交评论