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