面向对象方法与技术参考资料.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面向对象方法与技术参考资料

重载(overload):同一个类中名字相同但参数列表不同的多个方法之间的关系。关于重载,是我们比较熟悉的了,最常见的就是运用在类的多个构造函数中,看一下 Java 帮助文档,就可以明白这一情况了。下面一个谜题:public?class?Confusing?{? ????? ?????private?Confusing(Object?o)?{? ?????????System.out.println(Object);? ?????}? ????? ?????private?Confusing(double[]?dArray)?{? ?????????System.out.println(double?array);? ?????}? ????? ?????public?static?void?main(String[]?args)?{? ?????????new?Confusing(null);? ?????}? ?}??问此时 main() 中将会输出什么?初初一看,并没有多分析就觉得应该是输出“Object”,虽然Java中的数组实际上也是引用类型,但毕竟Object 是所有类的最终父类,而且目前 JDK 就连参数中的基本数据类型变量也可以被自动想上转型成包装类而成为 Object 的子类。于是我保守一点地就认为参数 null 应该是匹配到 Object 那个重载方法去了。可是这答案是错的,JVM 对于重载方法的解析是这样的:先找出方法名匹配的所有可能的方法;然后根据传进来的形参再次筛选出可能的重载方法;最后才是在这些方法中匹配到一个最精确的一个方法。于是,上面的那个谜题就变成确定哪一个才是最精确这一点子上了。而关于如何判断最精确,有这样的机制:如果某个重载方法能够接收所有传递给另一个重载方法的实参类型,那么对于参数列表来看,显然后者至少是前者的子集,当然也就更精确了。回到谜题上来,Confusing(Object)可以接受任何传递给 Confusing(double[ ])的参数(任何数组引用最终能够都是 Object 对象),因此 main() 中的 null 应该是被 JVM 匹配到 Confusing(double[ ]) 中,也就有了与我所认为的结果相反的输出了。小结:这个谜题表明了我们在写重载方法时,最好是明确地区分出各个方法中的参数列表,不要让彼此之间有互相包含、模糊不清的关系。虽然重载是为了在相同名字的方法中传入实参,由 JVM 动态解析选择合适的方法,但有时也很容易陷入这种方便背后所带来的地雷区当中。其中一种可行的办法就是,提供不同的方法名。但是构造函数的名字一定得相同的啊?实际上,就算是构造函数,也有很好的重构手法将其清晰地区分开来,不使用重载而是用不同名称的方法,将原本需要重载的构造函数委托给具有最大完整参数列表的私有构造函数中。又是一本经典,值得看哦…?重写(override):父类中的实例方法被其子类重新实现。既然是实例方法,那就是非 static 修饰的了,否则就是 static 静态方法了,那叫做类方法。在我看来,正是重写这一机制的存在,才为多态机制提供了基础。或许 implements (实现)一个 interface (接口)中所声明的方法也能成为重写,因为 interface 的一部分存在原因也是为了多态。对于重写,在《Java 解惑》中有下面这个谜题让我明白:绝对不能在构造函数中调用可能会被子类重写的方法。class?Point?{ ?????protected?final?int?x,?y; ?????private?final?String?name; ????? ?????Point(int?x,?int?y)?{ ?????????this.x?=?x; ?????????this.y?=?y; ?????????name?=?makeName(); ?????} ??????protected?String?makeName()?{ ?????????return?[?+?x?+?,?+?y?+?]; ?????} ????? ?????public?final?String?toString()?{ ?????????return?name; ?????} ?} ??public?class?ColorPoint?extends?Point?{ ?????private?final?String?color; ????? ?????ColorPoint(int?x,?int?y,?String?color)?{ ?????????super(x,?y); ?????????this.color?=?color; ?????} ????? ?????protected?Str

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档