多态_深入浅出详析.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文档。上传文档
查看更多
引言:多态增强了软件的灵活性和性。多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象被引用对象的类型而不是引用变量的类型决定了调用谁的成员方, 但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 比方一下: 你和你朋友都是烟鬼, 某日,你没有带烟, 而你朋友有n种烟, 你说: 来根烟, 朋友给你一根; 你通过烟的过滤嘴, 品出为白沙烟 你再要一根, 品出这次是芙蓉王, 再要一根, 品出这次是熊猫 ... 上面描述的就是多态! 烟 a = 白沙 烟 b = 芙蓉王 烟 c = 熊猫 但发现没有, 仅仅通过烟基类, 引用到不同的具体类对象, 就能让你调用到不同的对象, 这就是多态. 而烟到你嘴里[此时你还没有发现是那种烟], 你仅仅凭借吸的动作,就识别出来,到底是哪种烟对象 这就是多态的悬机. 多态须具备: 1. 基类 和各个子类 2. 基类 引用, 指向实例化的子类对象. 再举一个鸡的例子, 鸡是所有其它鸡的基类, 定义了一个方法shape(), 此方法能指明鸡的形态. 所有的子类[火鸡,山鸡,田鸡等],都有这个shape方法, 表明自己的形态, 如果用下面的方法定义我需要具体的鸡, [基类 引用 = 实现类的对象] for example: 鸡 a = new 火鸡(); 鸡 a = new 田鸡(); 鸡 a = new 山鸡(); 鸡 a = new 母鸡(); 当我使用的时候, 我采用 a 这个引用, a.shape(), 就会得到鸡的形态. 如果我定义的是 鸡 a = new 火鸡(); 那么a.shape得到的是火鸡的形态, 而不需要用具体的 火鸡 a = new 火鸡(); 再通过a.shape得到火鸡的形态多态分两种: (1) 编译时多态:编译时动态重载; (2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖 ??? 这样对于对象而言分为: ??? 理解运行时多态: ??? Car c = new Bus(); ??? Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。 ??? Bus运行时类型? 实际运行是访问heap中的对象,调用实际的方法。 ??? 运行时多态是由运行时类型决定的 ??? 编译时多态是由编译时类型决定的Java的多态性总结: (1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。 (2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。 (3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。 ??? java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (4) 接下来,观察方法执行时的参数类型; (5) 然后看调用对象的声明类型和实例类型; (6) 方法的调度采用最精确参数匹配。/thinkGhoster/archive/2008/04/19/2307001.aspx class A { ???????? public String show(D obj)...{ ??????????????? return (A and D); ???????? } ???????? public String show(A obj)...{ ??????????????? return (A and A); ???????? } } class B extends A{ ???????? public String show(B obj)...{ ??????????????? return (B and B); ???????? } ???????? public String show(A obj)...{ ??????????????? return (B and A); ???????? } } class C extends B...{} class D extends B...{} (二)问题:以下输出结果是什么? A a1 = new A(); ???? ??A a1 = new A(); A a2 = ne

文档评论(0)

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

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

1亿VIP精品文档

相关文档