一.
先举例,再通过例子来介绍多态的好处。
截图中的例子是非常标准的继承体系的程序的体现。Animal类中的void eat()类是指:动物都具备吃的功能,具体吃什么,不知道。
接着创建对象,运行程序,这是没有问题的。
截图中是创建了一个猫的对象,并调用了吃的动作。如果这里面不止一个猫,有好多猫,猫都要吃东西(第二张截图中,漏掉了c1.eat c2.eat c3.eat.......)。这时候要提高代码复用性(提高的是吃这个动作的复用性,而不是创建猫的复用性,创建对象这个动作肯定是不能少的。),创建一个函数,表示猫吃东西,最后一张截图展现了改进后的样子。
在提高复用性的这一步,使吃的这个过程变得稍微复杂了一些。原先猫的对象直接调用了猫类中的吃的功能,现在通过第三者method()来完成吃这个动作。
这时候创建了狗,狗要吃东西,狗使用函数method()。这是不正确的,因为method()方法的参数列表针对的是猫这个对象。
这时候,需要在建立一个狗吃东西的函数
接着动物的种类又在增加,增加了猪。那么主函数中又要进行改变,创建猪的对象,以及猪吃食物的函数。
到目前为止,程序书写的很麻烦,我们要想办法来解决这样的问题。
梳理一下思路:java是按面向对象来解决问题的。小猫吃饭去,指挥对象做事情。小狗吃饭去,狗有吃饭的功能,我让狗去做事,怎么去吃我不管,吃什么我也不管。猪吃饭去,家里养的动物比较多。这时需要重新思考问题,我们将内容封装变成对象,然后指挥对象做事情。这已经将问题简单化,可是对象多了又变复杂了。这下该思考的是,能不能指挥更多的对象做事情?这就开始寻找这写对象的共性,找寻共性发现,无论是猫,狗,猪,它们都是动物。因此,改变指挥的方式,“动物们吃饭去”,它们就都是吃饭了。这样一来就把复杂的事情再次简单化了。
只要指挥这些对象的共性类型做事情就行了,因为它们都所属共性类型。
这样重新创建的吃饭方法是,针对的动物。主函数中无论哪种动物调用method()方法都可以,编译运行也没有问题。
上面截图中的成功说明了一点,如下图所示,a不断地指向猫,狗,猪这些子类的对象。
这就是简单的多态,狗一种形态,animal一种形态(a也代表着对象)。
以后无论增加什么物种的动物,都可以直接调用method()方法,提高了复用性,增加了扩展性。后期维护也很方便,不像之前,要描述增加很多代码,现在只需要一个method()即可。