Java编程指南:基础知识、类库应用及案例设计
上QQ阅读APP看书,第一时间看更新

3.4 Java的多态性

多态性是面向对象程序设计的一大特征,多态体现了程序的可扩展性,在应用程序运行时多态又体现了程序代码的重复使用特性。

3.4.1 多态的概念

在面向对象程序设计中,描述一个对象时,多态指的是一个对象的行为方式可以有多种操作形态,根据对象的不同进行不同的操作,因此多态是与对象关联的,这种关联被称为绑定(binding)。绑定分为静态绑定和动态绑定,静态绑定是在编译时完成的,动态绑定则是在程序运行时完成的。绑定与类的继承相结合使对象呈现出多态性,达到一次编写代码多次使用的目的。

Java类中方法的重载呈现出多态的特性,它属于静态绑定。例如,实现两个数的加法运算有两个整数相加、两个长整数相加、两个浮点数相加等。下面的程序是定义了实现两个数的加法运算的类和使用该类的应用程序。

【示例3-24】 应用加法运算类的Java演示程序。

虽然名为Add的方法都是实现相加操作,完成一种操作,但是每个Add()方法都是针对不同的数据类型的,由返回类型和输入参数决定调用哪个Add()方法,上述程序为Add()方法的重载,体现了面向对象程序设计的多态特性。另外,当在子类中覆盖父类中同名的方法时,也是多态特性的一种表现,因为在子类中可以通过super变量访问父类中被覆盖的方法。

绑定与类的继承相结合则可体现出动态绑定的多态特性,当方法的覆盖存在于父、子类之间时,Java的多态特性体现在运行Java程序时动态方法调用上。多态特性发生在程序运行期间,并非在程序编译指定调用重载方法期间。下面的示例程序是在运行期间发生的多态特性。

【示例3-25】 多态特性的Java演示程序。

运行Sample程序,其输出结果为:

当父类对象f被赋予子类对象a时,其调用的方法为子类SubSample_A中定义的覆盖父类的Display()方法,当重新为父类对象f赋予为b对象时,其调用的方法改为子类SubSample_B中定义的覆盖父类的Display()方法,当父类对象f被赋予子类对象c时,其调用的方法为父类定义的Display()方法,因为在SubSample_C类中并没有定义Display()方法,没有发生覆盖现象。该程序显示了在运行时动态调用不同的方法,实现了Java程序运行时的多态特性。

上述示例将子类对象类型作为创建父类对象的基本对象类型的处理过程被称为“上溯造型,Upcasting”或“回溯造型”,子类对象是已经创建好的现成对象模型,是继承了父类的,因此其父类对象可以由子类对象构造生成,实现“上溯,Up”或“回溯”的“造型,Casting”。

另外,“上溯造型”功能也是充分体现了Java在动态时的多态特性。子类对象是在父类的指定范围内重新动态构造父类对象的类型模型,例如下面的示例程序是当声明一个父类变量并为其赋予子类对象时,其属性和行为被限定在父类范围内。

【示例3-26】 父类限定子类的Java演示程序。

3.4.2 多态的应用

【示例3-27】 在面向对象程序设计中,多态主要是通过方法的重载和覆盖体现的,其过程是通过向不同的对象发送相同的信息,根据对象的不同完成不同的工作。例如,定义一个People()类,为相互沟通,所有人共有行为是说话,在People类中则可定义Speak()方法,但是,各个区域的人是说不同语言的,中国人(Chinese)说中文、美国人(American)说英文、日本人(Japanese)说日文等,假设在People类中重载Speak()方法表示不同区域人的说话行为的程序代码为:

上述程序通过Speak()方法的输入参数指定不同区域人的说话行为,该程序设计虽然体现了多态特性,但是它并不符合面向对象程序设计理念,对象没有细分,层次不清晰,People类应该是各个区域人类的父类,因此,上述程序可以修正为:

运行Sample程序时其输出结果为:

上述程序在运行时根据people是哪个区域的“人”决定people.Speak()的实际执行代码,该程序设计是符合面向对象程序设计理念的,因为不论是哪个区域的“人”都是属于“人”类的,而每个区域的“人”又有自己的说话方式,因此当一个“人”属于不同区域时有不同的说话方式,在应用中其行为与对象是动态绑定的,即实现上溯造型,它也是体现了面向对象程序设计中行为方式的多态特性。

3.4.3 构造方法与多态

一个类可以定义多个构造方法,即构造方法的重载,当使用同一个类的不同构造方法创建多个类对象时,其对象也会有所不同,呈现出多种对象的形态,该现象也是面向对象程序设计的多态特性的一种体现。例如,用一个类描述坐标系对象,坐标系有绝对和相对坐标系之分,定义绝对坐标系的原点为(0,0)时,相对坐标系的原点为(x0,y0),当x0和y0的值为0时,绝对坐标系和相对坐标系重合。

【示例3-28】 描述绝对坐标系和相对坐标系的Java演示程序。

创建的两个不同坐标系对象的关系如图3-1所示,相对坐标系在绝对坐标系中,相对坐标系的原点坐标在绝对坐标系中的(10,10)处。

图3-1 绝对坐标系和相对坐标系