- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.派生类对象的方法调用必须通过一个基类类型的变量进行。
2.调用的方法必须在派生类中被定义。
3.调用的方法也必须被声明为基类的一个成员。
4.基类和派生类中对应的方法的签名必须相同。
5.基类和派生类的方法的返回对象类型必须相同或者返回对象类型必须是协变的。
6.派生类的方法的访问说明符不能比基类有更多的限制。
深入 Java 核心 Java 中多态的实现机制
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到 Java 多态性。在 Java
运行时多态性:继承和接口的实现一文中,我们曾详细介绍了 Java 实现运行时多态性的动态方法调度;
今天我们再次深入 Java 核心,一起学习 Java 中多态性的实现。
“polymorphism(多态)”一词来自希腊语,意为“多种形式”。多数 Java 程序员把多态看作对象的
一种能力,使其能调用正确的方法版本。尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅
仅把多态看成纯粹的概念。
Java 中的多态总是子类型的多态。几乎是机械式产生了一些多态的行为,使我们不去考虑其中涉及
的类型问题。本文研究了一种面向类型的对象观点,分析了如何将对象能够表现的行为和对象即将表现的
行为分离开来。抛开 Java 中的多态都是来自继承的概念,我们仍然可以感到 Java 中的接口是一组没有
公共代码的对象共享实现。
多态的分类
多态在面向对象语言中是个很普遍的概念.虽然我们经常把多态混为一谈,但实际上 有四种不同类型
的多态。在开始正式的子类型多态的细节讨论前,然我们先来看看普通面向对象中的多态。
Luca Cardelli 和 Peter Wegner (On Understanding Types, Data Abstraction, and
Polymorphism一文的作者 文章参考资源链接)把多态分为两大类特定的和通用的四小类:强
制的,重载的,参数的和包含的。他们的结构如下:
在这样一个体系中,多态表现出多种形式的能力。通用多态引用有 相同结构类型的大量对象,他们
有着共同的特征。特定的多态涉及的是小部分没有相同特征的对象。四种多态可做以下描述:
◆强制的:一种隐式做类型转换的方法。
◆重载的:将一个标志符用作多个意义。
◆参数的:为不同类型的参数提供相同的操作。
◆包含的:类包含关系的抽象操作。
我将在讲述子类型多态前简单介绍一下这几种多态。
强制的多态
强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。在以下的表达式中
编译器必须决定二元运算符‘+’所应做的工作:
2.0 + 2.0
2.0 + 2
2.0 + 2
第一个表达式将两个 double 的 操作数相加;Java 中特别声明了这种用法。
第二个表达式将 double 型和 int 相加。Java 中没有明确定义这种运算。不过,编 译器隐式的将第
二个操作数转换为 double 型,并作 double 型的加法。做对程序员来说十分方便,否则将会抛出一个编译
错误,或者强制程序员显式的将 int 转换为 double。
第三个表达式将 double 与一个 String 相加。Java 中同样没有定义这样的操作。所以,编译器将
double 转换成 String 类型,并将他们做串联。
强制多态也会发生在方法调用中。假设类 Derived 继承了类 Base,类C 有一个方法,原型为
m(Base),在下面的代码中,编译器隐式的将Derived 类的对象 derived 转化为 Base 类的对象。这种隐式
的转换使 m(Base)方法使用所有能转换成 Base 类的所有参数。
1. C c = new C();
2.
3. Derived derived = new Derived();
4.
5. c.m( derived );
并且,隐式的强制转换,可以避免 类型转换的麻烦,减少编译错误。当然,编译器仍然会优先验证
符合定义的对象类型。
重载的多态
重载 允许用相同的运算符或方法,去表示截然不同的意义。‘+’在上面的程序中有两个意思:两个
double 型的数相加;两个串相连。另外还有整型相加,长整型,等
原创力文档


文档评论(0)