JAVA面向对象-多态

上文 JAVA面向对象-继承 中介绍了继承、父类和子类,其实将父类对象应用于子类 的特征就是多态。依然以图形类来说明多态,每个图形都拥有绘制自己 的能力,这个能力可以看作是该类具有的行为,如果将子类的对象统一 看作是父类的实例对象,这样当绘制图形时,简单地调用父类也就是图 形类绘制图形的方法即可绘制任何图形,这就是多态最基本的思想。

多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类 及相关类。该统一风格可以由父类来实现,根据父类统一风格的处理, 可以实例化子类的对象。由于整个事件的处理都只依赖于父类的方法, 所以日后只要维护和调整父类的方法即可,这样就降低了维护的难度, 节省了时间。

提到多态,就不得不提抽象类和接口,因为多态的实现并不依赖于具体类,而是依赖于抽象类和接口。

再回到绘制图形的实例上来。图形类作为所有图形的父类,具有绘 制图形的能力,这个方法可以称为“绘制图形”,但如果要执行这个“绘 制图形”的命令,没有人知道应该画什么样的图形,并且如果要在图形 类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所 以使用“抽象”这个词来描述图形类比较恰当。在Java语言中称这样的类 为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定 义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流 程。实质上这个方法也是抽象的,如图形类中的“绘制图形”方法只提供 一个可以绘制图形的标准,并没有提供具体绘制图形的流程,因为没有 人知道究竟需要绘制什么形状的图形。

在多态的机制中,比抽象类更方便的方式是将抽象类定义为接口。 由抽象方法组成的集合就是接口。接口的概念在现实中也极为常见,如 从不同的五金商店买来螺丝帽和螺丝钉,螺丝帽很轻松地就可以拧在螺 丝钉上,可能螺丝帽和螺丝钉的厂家不同,但这两个物品可以轻易地组 合在一起,这是因为生产螺丝帽和螺丝钉的厂家都遵循着一个标准,这 个标准在Java中就是接口。依然拿“绘制图形”来说明,可以将“绘制图 形”作为一个接口的抽象方法,然后使图形类实现这个接口,同时实 现“绘制图形”这个抽象方法,当三角形类需要绘制时,就可以继承图形 类,重写其中的“绘制图形”方法,并改写这个方法为“绘制三角形”,这 样就可以通过这个标准绘制不同的图形。

发表评论