-
前言
前面介绍继承与覆盖以及强制类型转换时都曾提及“多态”的概念。多态性在实际中的含义就是不同的对象有相同的轮廓或心态,但具体执行的过程却大相径庭。例如,驾驶员在开车时都知道“遇到红灯时刹车”,这与驾驶员驾驶的什么型号的车没有关系,所有的车都具有相同的轮廓或形态的刹车。
在Java开发中,基于继承的多态就是指对象功能的调用者用超类的引用来进行方法的调用。这样,可以提高灵活性,因为用超类的引用能调用各种不同的子类的实现,就像汽车驾驶员可以开不同种类的汽车一样。例:
package chapeter04;
abstract class Car
{
//定义抽象方法brake
public abstract void brake();
}
class Truck extends Car
{
//实现抽象方法
public void brake()
{
System.out.println("卡车刹车!");
}
}
class SUV extends Car
{
public void brake()
{
System.out.println("正在SUV上刹车!");
}
}
public class Sample4_18
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
//声明Car引用并指向Truck类对象
Car c=new Truck();
System.out.println("调用的方法为:");
c.brake();
//c指向SUV对象
c=new SUV();
System.out.println("调用的方法为:");
c.brake();
}
}
上面代码中定义了三个类Car、Truck和SUV,其中Car表示汽车,为抽象类,其中有抽象的刹车(brake)方法,方法的名称表示所有汽车刹车的一般形态。Truck与SUV分别表示卡车与SUV汽车,分别重写实现了它们的父类Car中的抽象刹车方法,提供不同子类的刹车实现。
在main方法中,驾驶者(定义Car型引用c)可以去开卡车(引用c指向Truck对象),同样也可以去开SUV汽车(引用c指向SUV对象)。运行结果为:
从运行结果可以看出,虽然实在汽车(Car)的角度调用刹车方法,但是实际调用的是所指向的具体对象的方法,这样就实现了多态。以后有其他类型汽车的子类也一样可以调用,程序具有很好的灵活性。
下面列出了Java中多态的实质、含义与作用:
- 实际上,抽象类中的抽象方法,只是起到了契约作用,例如:继承自汽车的非抽象类,必须实现具体的刹车方法,否则编译不通过。父类中抽象方法个数是具体子类需要实现方法个数的最低限度,不能比其他少,但是可以比父类中抽象方法的个数多,如一些子类中特有的方法。
- 因为具体子类遵守了契约,所以对于调用者而言,只需要用父类的引用就可以使用所有子类实现各种不同的功能,调用者不必了解子类中方法的实现细节。
- 但是,如果站在具体子类的角度上(使用特定具体子类类型的引用),就没有这么强的灵活性,因为特定类型的子类引用只能指向这个类的对象,想要使用其他类型的对象就不方便了。