关于Java的多态我感觉我不是老师只是个lazy的学生,也讲不清楚,我也不用那些高大上的术语了,以下例子是我打过的程序,粘贴过来说一下我的理解
假如学校开一个晚会,给每个表演者发门卡,进出会场刷卡时会显示他的身份
在此为了简化我们只区分dancer和singer
按照常规我们先分别写出这两个类
Dancer.java
packagefour;
public class Dancer {
public void show2(){
System.out.println("we are dancers");
}
}
Singer.java
packagefour;
public class Singer {
public void show1(){
System.out.println("we aresingers");
};
}
再写一个测试类
packagefour;
public class TestMain {
public static void main(String[] args) {
Singer p1=newSinger();
Dancer p2=newDancer();
p1.show1();
p2.show2();
}
}
测试的结果为
虽然这样可以辨别singer和dancer的身份,但是我们注意到Singer和Dancer类中分别有不一样的show方法,假设有100种不一样的身份也就是要写到show100,显然这样方法太多,会显得麻烦 ,这时候多态就有用了,只需要一个show方法即可。
下面是应用多态改的程序
package three;
public interface People {
void show();
}
package three;
public class Dancer implements People {
public void show() {
System.out.println("we are dancers");
}
}
package three;
public class Singer implements People {
public void show() {
System.out.println("we are singers");
}
}
package three;
import java.util.WeakHashMap;
public class TestMain {
public static void main(String[] args) {
People p1=new Dancer();
People p2=new Singer();
p1.show();
p2.show();
}
}
我们可以看到singer和dancer辨别身份时用的是相同的show方法,这个时候show方法会根据对象类的不同而提示不一样的内容,非常方便,简化的程序
符合多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
当然从这个例子我们也可以发现多态的三个特征,要有继承,要有重写,要有父类应用指向子类对象
1 Dancer类和Singer类都是People累的继承
2对show方法都进行了重写
3 People p1=new Dancer();
People p2=new Singer();
注意不是Dancer p1=new Dancer();
都有父类应用指向子类对象
总结一下多态的好处
1.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
4.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。