`
ialand
  • 浏览: 7761 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

多形性(多态)

 
阅读更多
    按照中国大陆地区的翻译,这应该叫“多态”,不过站在一个初学者的角度,我更喜欢台湾人“多形性”的译法。因为“多态”这个名词显得过于专业,给人生涩和抽象的感觉,不好理解,而“多形性”这一说法,再加上“正方形、三角形均属于形状的一种”的经典例子,将java的这一特性阐释得简单明了。
    按照我的理解,多形性的最大价值也是实现了另一种形式的封装,如果说包实现的是纵向封装(之所以这么说是因为我觉得包只对外提供有限的接口,对于包内的任何实现细节,客户程序都是无需关心的,不管这个细节的实现层次有多深),那么将多形性称之为横向封装应该是比较合适的,因为它将一个总类型(基础类)分解成多个具体的类型(衍生类),对于使用这些类型的客户程序来说,在大多数时候只需要将这多个衍生类当成基础类来使用它们即可,而不必对其进行区分。因为在基础类中声明了每个衍生类都具有的行为(即方法),在每个衍生类中这些行为被重新定义(覆盖)以实现其自己的行为。当我们把衍生类当作基础类来使用的时候,虽然表面上看我们调用的是基础类的方法,但是在运行期间java的方法调用机制会自动去为我们找到我们所使用的衍生类中所对应的方法,这才是真正被执行的方法。这种方法调用机制被称为“动态绑定”,因为具体调用哪个方法是在程序正真运行的时候才知道的,而不是程序被编译的时候就知道了(虽然我们可能知道,但编译器不知道)。
    对于具有多形性的类的使用者来说它是如此的简单方便,对于它的维护者来说这样的特性也同样令人赏心悦目,以本文开始的形状例子为例:开始的时候我们只为形状衍生出了正方形和三角形,假设这个时候完全可以满足客户程序的需要,但随着业务的拓展,我们发现,只有正方形和三角形已经无法满足客户程序的需求了,它迫切需要一个圆形。这个时候形状类的维护者只需要再从形状类衍生出一个圆形类即可,由于圆形和形状具有同样的接口,所以客户程序可以像使用其它形状一样来使用圆形,而不会给客户程序带来更多的使用成本。由此可见,多形性具有良好的扩展性。
    多形性中涉及到造型(即类型转换)的问题,当我们把一个衍生类当成基础类来使用的时候叫作上溯造型,上溯造型的目的很显然是为了更加方便统一地使用一系列类型。在大多数时候上溯造型都是可以完全满足我们的需求的,但在某些情况下,我们需要使用被上溯造型了的类它本身所独有的方法,即在基础类中没有的方法,这个时候要是还想通过基础类来调用它的独有方法,显然是不行的,因为基础类并没有提供这个接口,所以我们还需要将它转换回具体类型才能调用这个独有方法,这个过程就叫下溯造型。上溯造型是安全的,因为基础类具有的接口,衍生类也保证具有,所以我们把衍生类当作基础类来给它发送消息可以保证这个消息会被接收到而不丢失。但是下溯造型却不是安全的,因为衍生类可能具有基础类不具有的接口,所以我们把基础类当作衍生类来给它发送消息调用相应方法的时候可能被调用的接口是不存在的,所以这个消息可能会丢失掉。这也正是上溯造型不必显示声明,而下溯造型必须显示声明的原因了。
分享到:
评论
1 楼 子排牛柳 2009-01-13  
说的 不错

相关推荐

    第7章 多形性.pdf

    在多态场景下,Java采用动态绑定,即晚绑定(Late Binding)。这意味着即使在编译时无法确定对象的具体类型,程序也能在运行时找到正确的方法执行,这就是多态性在运行时的体现。 总结来说,多态性是面向对象编程的...

    Thinking in Java Fourth Edition

    #### 第7章 多形性 - **多态的实现方式**:通过重写和重载两种方式来实现多态性。 - **多态的实际应用**:提供示例展示多态在实际开发中的运用场景。 - **抽象方法与接口**:进一步讨论抽象方法和接口在实现多态方面...

    Java2全方位讲议(内部讲议)7

    Java是一种广泛使用的面向对象的编程语言,其设计思想的核心包括封装、继承和多态三大特性。这份内部讲义深入浅出地介绍了Java的面向对象编程基础。 首先,讲解了对象导向的基本概念。在Java中,对象是类的实例,而...

    Thinking_in_java中文第4版

    ##### 第7章 多形性 1. **动态绑定**:深入探讨多态的核心——动态绑定机制。 2. **抽象的基础类和接口**:讲解抽象类和接口在支持多态方面的作用。 --- 以上章节概述了《Thinking in Java》第四版的部分重要内容...

    Thinking in Java_all

    第七章“多形性”进一步解释了Java的多态特性,包括上溯造型和方法的动态绑定,这在面向对象编程中是至关重要的,因为它允许编写更加灵活和可扩展的代码。 总的来说,《Thinking in Java》是一本全面的教程,不仅...

    C/C++中常用的单词

    #### Polymorphism 多形性,多态现象 多态性是指同一操作作用于不同的对象可以有不同的解释,并产生不同的执行结果。在面向对象编程中,多态性使得程序更加灵活和可扩展。 #### Specialization 特化 特化是指从一个...

    多形网

    2. **面向对象编程**:JavaScript中的类、构造函数、实例化、继承、多态等OOP概念。"多形网"可能通过这些特性实现组件的多样化和可复用性。 3. **模块化和组织结构**:项目可能使用CommonJS、ES6模块或Webpack等...

    java常用词汇汇总

    ### Java常用词汇详解 #### abstract (关键字) - **中文释义**:抽象 - **英文发音**:['.bstr.kt] - **用途**:在Java中,`abstract`是一个关键字,用来定义抽象类或者抽象方法。抽象类是不能被实例化的类,通常...

    C#官方参考手册.pdf

    - **多形性**:解释了多态的概念和在C#中的实现。 ### 功能技术模式匹配 这部分介绍了C# 7.0引入的功能,如模式匹配等: - **弃元**:允许在模式匹配中忽略某个值。 - **模式匹配**:讲解了各种模式匹配的语法和...

    整理后java开发全套达内学习笔记(含练习)

    polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,原理,主义 ['prinsipl] priority n. 优先级 [prai'ɒriti] ...

Global site tag (gtag.js) - Google Analytics