6.4.3 多态
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
简单来说,就是将子类对象传递给父类对象,由JVM动态控制具体调用的是哪个类中的方法.继承和重写是多态的基础,
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理.这种将子类对象视为父类对象的做法也叫”向上转型”.使用多态节省了开发和维护时间,因为程序员无须在所有的子类中定义执行相同功能的方法,避免了大量重复代码的开发,同时只要实例化一个继承父类的子类对象即可调用相应的方法,这里只需要维护父类中的方法即可.多态性实现了只维护父类,子类的功能实现通过父类来控制.看下面一个代码:
package cn.yourick.duotai; public abstract class ParentDemo { public abstract int test(int i,int a); }
package cn.yourick.duotai; public class SonDemo extends ParentDemo{ @Override public int test(int i, int a) { return i+a; } }
package cn.yourick.duotai; public class SonTest extends ParentDemo{ @Override public int test(int i, int a) { return a*i; } }
package cn.yourick.duotai; public class Test { @org.junit.Test public void test1(){ ParentDemo parentDemo = new SonDemo(); System.out.println("加法:"+parentDemo.test(2, 3)); } @org.junit.Test public void test2(){ ParentDemo parentDemo = new SonTest(); System.out.println("乘法:"+parentDemo.test(2, 3)); } }
上面这些代码就很简单的实现了多态,我们在抽象类中声明了一个方法,通过不同的父类进行不同的实现,然后将对象传递给父类,此时只需要维护父类就可以了,通过传递不同的子类传递,调用不同的方法,实现不同的功能,如上的加法和乘法.
多态的好处:
- l 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- l 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性
- l 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
- l 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。