2015第七章多态.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2015第七章多态

第七章 多态 在面向对象的程序设计语言中,多态(polymorphic)是继数据抽象和继承之后的第三种基 本特性。 多态通过分离“做什么”和“怎么做”,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建“可扩展的”程序,即无论在项目最初创建时,还是在需要添加新功能时,都可以进行扩充。 “封装”通过合并特征和行为来创建新的数据类型。“实现隐藏”则通过细节“私有化 (private)”将接口和实现分离开来。这种类型的组织机制对那些有过程化程序设计背景 的人来说,更容易理解。而多态的作用则是消除类型之间的耦合关系。在前一章中,我们 已经知道继承允许将对象视为自己本身的类型或它的基类型进行处理。这种能力极为重要, 因为它可以使多种类型(从同一基类导出而来的)被视为同一类型进行处理,而同一份代 码也就可以毫无差别地运行在这些不同类型之上了。多态方法调用允许一种类型表现出与 其他相似类型之间的区别,只要它们都是从同一基类导出而来的。这种区别是根据方法行 为的不同来表示出来的,虽然这些方法都可以通过同一个基类来调用。 在本章中,通过一些基本简单的例子(这些例子中所有与多态无关的代码都被删掉,只剩 下与多态有关的部分)来深入浅出地学习多态(也称作动态绑定 dynamic binding、后期 绑定 late binding或运行时绑定 run-time binding)。 向上转型 在第 6章中,我们已经知道对象既可以作为它自己本身的类型使用,也可以作为它的基类 型使用。而这种将对某个对象的引用视为对其基类型的引用的做法被称作“向上转型 (upcasting)”――因为在继承树的画法中,基类是放置在上方的。 但是,这样做也会引起一个的问题,具体看下面这个有关乐器的例子。既然几个例子都要 演奏乐符(Note),我们就应该在包中单独创建一个 Note类。 //: c07:music:Note.java // Notes to play on musical instruments. package c07.music; import com.bruceeckel.simpletest.*; public class Note { private String noteName; private Note(String noteName) { this.noteName = noteName; } public String toString() { return noteName; } public static final Note MIDDLE_C = new Note(Middle C), C_SHARP = new Note(C Sharp), B_FLAT = new Note(B Flat); // Etc. } ///:~ 这是一个枚举(enumeration)类,包含固定数目的可供选择的不变对象。不能再产生另外 的对象,因为其构造器是私有的。在下面的例子中,Wind是一种 Instrument,因此可以继承 Instrument类。 //: c07:music:Wind.java package c07.music; // Wind objects are instruments // because they have the same interface: public class Wind extends Instrument { // Redefine interface method: public void play(Note n) { System.out.println(Wind.play() + n); } } ///:~ //: c07:music:Music.java // Inheritance upcasting. package c07.music; import com.bruceeckel.simpletest.*; public class Music { private static Test monitor = new Test(); public static void tune(Instrument i) { // ... i.play(Note.MIDDLE_C); } public static void main(String[] args) { Wind flute = new Wind(); tune(flute); // Upcasting monitor.expect(new String[] { Wind.p

文档评论(0)

fETyiQSnPU + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档