简单的讲,多态就是同一种功能具有多种实现方式。
多态有两种类型:同一个类中某个行为的多种实现方式;不同子类对相同行为的不同的实现方式。
1、同一个类中某个行为的多种实现方式
在实现某个功能的时候可以采用不同的方式,通常采用相同的名字,而参数不同。例如要初始化一个矩形,可以给出左上角的坐标和矩形的长宽,也可以给出左上角的坐标和右下角的坐标。
public class Rectangle{
private int left; // 左上角横坐标
private int top; //左上角纵坐标
private int width; // 宽
private int height; // 高
public void initiate(int left,int top,int width,int height){
this.top = top;
this.left = left;
this.width = width;
this.height = height;
}
public void initiate(Point lefttop,Point rightbottom){
top = lefttop.getY();
left = lefttop.getX();
width = rightbottom.getX() - lefttop.getX();
height = rightbottom.getY() - lefttop.getY();
}
}
另外,可以考虑构造方法。构造方法用于构造对象,有各种不同的构造对象的方法,所以会有多种构造方法,多个构造方法都是用于构造对象,这就是多态。
2、不同子类有不同的实现方式
在上一讲中描述的图形类的画图方法以及交通工具的移动方法都是多态的典型例子。
对于图形类,具有画图的方法,但是三角形、矩形和圆的画法不同,所以会有不同的实现方式。这种多态与上面介绍同一个类中某个功能的多个实现方式不同,前面是同类的某个功能的不同实现方式,而现在是不同子类的不同实现方式。下面以计算面积为例介绍。
public abstract class Graphics{
public abstract void print(); // 画图的方法
public abstract float area(); //计算面积
}
public class Circle extends Graphics{
private int r; //
private int left; // 圆心的左上角横坐标
private int top; // 圆心的左上角纵坐标
public void print(){
...
}
public float area(){
return 3.1415*r*r;
}
}
public class Rectangle extends Graphics{
private int left; // 圆心的左上角横坐标
private int top; // 圆心的左上角纵坐标
private int width; // 宽
private int height; // 高
public void print(){
...
}
public float area(){
return height*width;
}
}
3、多态性的应用
对于上面第一种形式的多态,方法的调用通过对象名字,要调用哪个方法就写相应的方法名字并提供相应的参数即可。对于第二种形式的多态,如果分别定义子类的对象然后调用相应的方法,与其他普通的方法就没有什么区别了,例如下面的代码:
public static void main(String[] args){
Circle circle = new Circle(); // 创建圆对象
circle.setTop(20); // 此行及以下两行用于初始化
circle.setLeft(30);
circle.setR(10);
System.out.println(circle.area()); //调用计算面积的方法并输出
Rectangle rectangle = new Rectangle ();
rectangle .setTop(20);
rectangle .setLeft(30);
rectangle .setWidth(10);
rectangle .setHeight(10);
System.out.println(rectangle.area());
}
那多态性如何体现呢?请看下次的向上转型和强制类型转换。