Java特性之多态详解

来源:互联网 发布:js object 添加对象 编辑:程序博客网 时间:2024/06/05 18:47

四大特性:抽象、封装、继承、多态

最近在论坛上看到一个帖子、激烈的讨论多态相关、此文为本人参照相关技术论坛和技术博客的相关观点总结、也包涵博主自己对多态的相关理解、如有错误之处请加以指正、博主定会修正、以免误导他人。如转载此文、请注明出处。

本人观点:java中多态:体现方式为java重写、而java中重载只在编译期体现多态、程序运行之后重载和多态无关、此观点只代表作者在此时点所认知观点 2016年12月19日19:50:58 追記


什么是多态(polymorphism)

  ①大多较专业的解释为:多态指允许不同的类的对象对同一消息(方法调用)做出响应。

     意指相同的消息给予不同的对象会引发不同的动作。 // 2016/12/13 19:59 Meta 追記

     多态是指同样的消息被不同类型的对象接收时导致不同的行为。所谓的消息是指对类的成员函数的调用。 // 《c++程序设计语言 第四版》第307页

  ②个人观点总结(java)是指子类重新定义(重写)父类的抽象方法(abstract、virtual(c++的虚函数))。当子类重新定义了父类的抽象方法后,父类根据赋给它的不同的子类,动态调用属于子类的该方法。

  ③通俗的解释:多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。

  ※ 在JAVA编程思想中多态章节中并没有给出具体定义、但是书中在多态章节再次着重讲解了重写、以及构造方法相关方面。


两种多态形式

  编译时多态 静态绑定 程序运行前发生的事件 重载

  运行时多态 动态绑定 程序运行时发生的事件 重写


多态的作用

  消除类型之间的耦合关系  // <<java编程思想>>第148页 (这让我联想到了Spring


静态多态(dynamic polymorphism)

模板允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。

多数来自于C++程序员的解释、作为一个java程序员、这也是为什么前段时间所纠结的、为何重载会提现多态、于是找到了一本《c++程序设计语言 第四版》参看

  1、编译时多态/特设多态/非参数化多态(Ad-hoc polymorphism)

     ・函数重载(Function Overloading)

     ・运算符重载(Operator Overloading)

     ・带变量的宏多态(macro polymorphism)

  2、参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程。

    总结(java):

    重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。


动态多态(dynamic polymorphism)

通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态。

    多态存在的四个必要条件(Java):

    1、要有继承。

    2、要有方法的重写。

    3、父类引用指向子类对象。

    4、要有父类变量调用重写方法。

简单实例:

package com.ibm.dietime1943.test;public class Polymorphism {public static void main(String[] args) {Choose ce = new Choose();ce.choose(new ColorPrinter()); // 多态调用ce.choose(new MonochromePrinter()); // 多态调用}}abstract class Printer{abstract void print();}class ColorPrinter extends Printer{@Overridevoid print() {System.out.println("print color picture.");}}class MonochromePrinter extends Printer{@Overridevoid print() {System.out.println("print monochrome picture.");}}class Choose{public void choose(Printer p){p.print();}}



Flag Counter

0 0
原创粉丝点击