利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。之前我们知道子类对象可以作为父类的对象实例使用,这种做法称为“向上转型”。假如我们现在需要绘制一个平行四边形,这是我们其实就可以在平行四边形类中定义一个 draw() 方法。
public class Parallelogram {
public void draw(Parallelogram parallelogram) {
// do something();
System.out.println("绘制平行四边形图形");
}
}
此时如果我们还需要定义一个绘制正方形的方法,通过定义一个正方形类来处理正方形对象的话,会出现代码冗余的现象;通过定义一个正方形和平行四边形的综合类 ,来分别处理正方形和平行四边形对象的话,也没有太大的意义。如果定义一个四边形类,让它处理所有的继承该类的对象,根据“向上转型”原则可以使每个继承四边形的对象作为 draw() 方法的参数,然后在 draw() 方法中做一些限定就可以根据不同图形类对象来绘制相应的图形,从而使用更为通用的四边形类来取代具体的正方形类和平行四边形类,这样处理能够很好的解决代码冗余的问题,同时也易于维护,因为可以加入任何继承父类的子类对象,而父类方法也无须修改。
创建 Quadrangle 类,再分别创建两个内部类 Square 和 Parallelogramgle,它们都继承了 Quardrangle 类。编写 draw() 方法,该方法接收 Quadrangle 类的对象作为参数,即使用这两个内部类的父类方法作为方法参数,在主方法中分别以两个内部类的实力对象作为参数执行 draw() 方法。
// 四边形类
public class Quadrangle {
// 实例化保存四边形对象的数组对象
private Quadrangle[] quadrangles = new Quadrangle[2];
private int index = 0;
public void draw(Quadrangle quadrangle) {
if (index < quadrangles.length) {
quadrangles[index] = quadrangle;
System.out.println(index);
index ++;
}
}
public static void main(String[] args) {
// 实例化两个四边形对象
Quadrangle quadrangle = new Quadrangle();
// 以正方形对象为参数调用 draw() 方法
quadrangle.draw(new Square());
// 以平行四边形对象为参数调用 draw() 方法
quadrangle.draw(new Parallelogram());
}
}
// 平行四边形类,继承四边形类
public class Parallelogram extends Quadrangle{
public Parallelogram() {
System.out.println("平行四边形");
}
}
public class Square extends Quadrangle{
// 正方形类,继承自四边形类
public Square() {
System.out.println("正方形");
}
}
可以看到,以不同类对象为参数调用 draw() 方法,可以处理不同的图形问题。使用多态节省了开发和维护的时间,因为程序员无需在所有的子类中定义执行相同功能的方法,避免了大量重复代码的编写。同时,只要实例化一个继承父类的子类对象,即可调用相应的方法。