- 多态的含义
多态(polymorphism)源于希腊文字,意思是“多种形式”。在java中我们也有这样有趣的定义,其是指使用父类对象的地方都可以使用子类的对象。简单来说,多态意味着父类型的对象可以访问子类型重写的方法。
比如说我建立了父类型“Animal”和子类型“Bird”;
我可以写出如下代码:
Animal x = new Bird();
我们发现前后的类名“Animal”和“Bird”并不相同,但该语句仍然成立!这就是动态绑定,也是多态的一种表现形式。
- 使用多态的意义
1、可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2、可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3、接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4、灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5、简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
- 多态的使用场景以及示例
- 循环调用基类对象,访问不同派生类方法
如下列代码
public class example {
public static void main(String[] args) {
Animal[] example=new Animal[3];
//第一个样例创建为Animal;
example[0]=new Animal();
//第二个样例创建为Bird;
example[1]=new Bird();
//第三个样例创建为Cat;
example[2]=new Cat();
for(int i=0;i<3;i++) {
example[i].speak();
}
}
}
class Animal{
String x ;
Animal(){
x="animal";
}
void speak() {
System.out.println("I am an animal");
}
}
class Bird extends Animal{
String x ;
Bird(){
x="Bird";
}
void speak() {
System.out.println("I am a Bird");
}
}
class Cat extends Animal{
String x ;
Cat(){
x="Cat";
}
void speak() {
System.out.println("I am a Cat");
}
}
运行结果如下:
我们可以清楚的看到最后输出的时候我们使用speak()方法访问了两种派生类和一个基类的数据,这即是多态;
当然我们也要清楚的认识到,派生类的方法必须要重写(override)才能正确达到我们想要的的效果。
- 实参是派生类;行参是基类
若我们在之后加入showValue 方法使得基类当作形参。
public static void showValue(Animal x){
x.speak();
}
将最后的输出循环稍作修改:
for(int i=0;i<3;i++) {
showValue(example[i]);
}
我们也会得到一样的输出结果: