首先,我们来看一个简单的例子,我们用必胜客的pizza来做个例子
首先定义一个interface,抽象出生产比萨的过程。
Pizza.java
- public interface Pizza {
- public void prepare();
- public void bake();
- public void cut();
- public void box();
- }
然后由各种具体的pizza实现它
香荤至尊比萨
MeatPizza.java
- public class MeatPizza implements Pizza {
- public void prepare() {
- System.out.println("香荤至尊开始准备了");
- }
- public void bake() {
- System.out.println("香荤至尊开始烘烤");
- }
- public void cut() {
- System.out.println("香荤至尊切咯");
- }
- public void box() {
- System.out.println("香荤至尊打包");
- }
- }
金枪鱼比萨
TunaPizza.java
- public class TunaPizza implements Pizza {
- public void prepare() {
- System.out.println("金枪鱼开始准备了");
- }
- public void bake() {
- System.out.println("金枪鱼开始烘烤");
- }
- public void cut() {
- System.out.println("金枪鱼切咯");
- }
- public void box() {
- System.out.println("金枪鱼打包");
- }
- }
夏威夷比萨
HawaiianPizza.java
- public class HawaiianPizza implements Pizza{
- public void prepare() {
- System.out.println("夏威夷开始准备了");
- }
- public void bake() {
- System.out.println("夏威夷开始烘烤");
- }
- public void cut() {
- System.out.println("夏威夷切咯");
- }
- public void box() {
- System.out.println("夏威夷打包");
- }
- }
我们利用多态为我们提供的接口与实现分离,改善程序的组织架构及可读性
下边的代码我们可以看到我们完全可以忘记掉对象类型(type)
- public class Test {
- public static Pizza orderPizza (String type){
- Pizza pizza = null;
- if (type.equals("Meat"))
- pizza = new MeatPizza();
- else if (type.equals("Tuna"))
- pizza = new TunaPizza();
- else if (type.equals("Hawaiian"))
- pizza = new HawaiianPizza();
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- public static void main(String[] args) {
- System.out.println("金枪鱼比萨");
- Test.orderPizza("Tuna");
- System.out.println("香荤至尊比萨");
- Test.orderPizza("Meat");
- System.out.println("夏威夷比萨");
- Test.orderPizza("Hawaiian");
- }
- }
在这里,我先把这个程序的执行结果帖上,看能不能理解
金枪鱼比萨
金枪鱼开始准备了
金枪鱼开始烘烤
金枪鱼切咯
金枪鱼打包
香荤至尊比萨
香荤至尊开始准备了
香荤至尊开始烘烤
香荤至尊切咯
香荤至尊打包
夏威夷比萨
夏威夷开始准备了
夏威夷开始烘烤
夏威夷切咯
夏威夷打包
可能大家无法理解编译器如何知道这个reference(引用)指向的是derived class而不是base class呢?其实编译器是不知道的,其实是binding的缘故,而且是执行期绑定(run-time binding)
这就是多态性的一个重要方面——向上转型(upcasting)
我为什么要给出这个例子呢?还有别的用途,就是想说明一种设计模式——工厂模式
这个例子给出了一个工厂方法,orderPizza,借助这个方法可以生成不同的对象