在程序设计一个方法时,如果我们希望它能够通用,例如要实现一个动物叫的方法,我们可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫叫,传入其他动物类型时就发出其相应的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。
用一个案例来演示多态的使用:
1 //定义接口Animal 2 interface Animal { 3 void shout();//定义抽象方法 4 } 5 //cat类实现Animal接口 6 class Cat implements Animal{ 7 public void shout(){ 8 System.out.println("喵喵"); 9 } 10 11 } 12 class Dog implements Animal{ 13 public void shout(){ 14 System.out.println("汪汪"); 15 } 16 } 17 //定义测试类 18 public class Ex_2{ 19 public static void main(String[] args){ 20 Animal an1 = new Cat();//创建Cat对象使用Animal类型变量an1引用 21 Animal an2 = new Dog();//创建Cat对象使用Animal类型变量an1引用 22 animalShout(an1); 23 animalShout(an2); 24 } 25 public static void animalShout(Animal an){ 26 an.shout(); 27 } 28 }
这里就涉及到对象的类型转换,在多态的使用中,涉及到将子对象当作父类类型使用(向上转型)或者将父类型当中子类型使用(向下转型)的情况。
向上转型的例子:
Animal an1 = new Cat();//将Cat对象当做父类型
通过一个案例来了解下向下转型:
1 //定义Animal接口 2 interface Animal{ 3 void shout(); 4 } 5 //定义Cat类实现Animal 6 class Cat implements Animal{ 7 public void shout(){ 8 System.out.println("喵喵"); 9 } 10 public void sleep(){ 11 System.out.println("呼呼..."); 12 } 13 } 14 //定义Dog类实现Animal 15 class Dog implements Animal{ 16 public void shout(){ 17 System.out.println("汪汪"); 18 } 19 public void sleep(){ 20 System.out.println("wang..."); 21 } 22 } 23 //创建测试类 24 public class Ex_3{ 25 public static void main(String[] args){ 26 Dog dog = new Dog(); 27 animalShout(dog); 28 } 29 public static void animalShout(Animal animal){ 30 if(animal instenceof Cat){ 31 Cat cat = (Cat)animal;//将Animal对象转换成Cat类型 32 cat.sleep(); 33 cat.shout(); 34 } 35 else{ 36 System.out.println("这不是猫"); 37 } 38 } 39 }
这个案例中 我们把Animal对象转换成了Cat类型。
Cat cat = (Cat)animal;
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、 父类引用指向子类对象
多态的好处:
1)可替换性(substitutability):多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2)可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3)接口性(interface-ability):多 态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和 Sphere为了实现多态,完善或者覆盖这两个接口方法。
4)灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。
5)简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。