Java_SE_学习笔记_①——Java多态——向上转型的意义

多态性在面向对象中是一个最重要的概念,在Java中面向对象主要有以下两种主要体现:

1:方法的重载与覆写

2:对象的多态性

对象的多态性主要分为以下两种类型。

1:向上转型:子类对象——父类对象

2:向下转型:父类对象——子类对象

对于向上转型,程序会自动完成,而对于向下转型时,必须明确地指明要转型的子类类型。

格式:

对象向上转型:父类 父类对象 = 子类实例

对象向下转型:子类 子类对象 = (子类)父类实例

如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法。

而向下转型,在进行对象的向下转型前,必须首先发生对象向上转型,否则会发生java.lang.ClassCastException异常,

所以向下转型并不安全,较少用到。

<hr />

<hr />

<hr />

第一次接触OOP语言,又没有太多经验的童鞋,可能并不明白多态这种特性有多么重要的意义,下面通过一个实例来阐述向上转型的重大用处。

假如一个物流运输公司,有个客户要求你为他运输一定数量的产品到某地,使用某种交通工具.那我们假设你的管理程序中有Truck类,Train类,Plane类专门用来实现使用不同交通工具的成本计算,都有方法cost(Double weight,Double space);那么,问题出来了.客户对于运输器种类是可选择的,你是不是要对每种运输器new个实例放到不同的service方法中为客户服务呢?很明显这么做有很多代码重复,而且效率太低.那么为什么不构造一个运输工具的父类:

1 public class Conveyance{
2   protected weight;
3   protected space;
4   public abstract Double cost(Double weight , Double space){
5   }
6 }

然后子类Truck,Plane,Train分别实现cost方法,再构造一个工厂类为客户制造子类实例

public class ConveyanceFactory{
    public static Conveyance getConveyance(String which){
        if(which.equils("Truck")){return new Truck();}
               else if(which.equils("Train")){return new Train();}
              else if(which.equils("Plane")){return new Plane();}
              else{return null;}
        }
} 

服务程序的方法实现:

public double transportCost(String type,Double weight,Double space){
Conveyance c;Double cost;
c = ConveyanceFactory.getConveyance("type");
cost = c.cost(weight,space);
return cost;
}

看上面服务层的代码多简单‘,而且在MVC层次结构中方法和类的设计也和面向对象.这就是上塑造型给我们带来的好处咯

这回就方便了,需要Truck的时候,客户只要告诉你他要用卡车运输运多少距离多远.那业务员就在option按扭里面选择”卡车”在文本框里输入重量多少距离多远.veiw层把数据传给controler处理成我们的服务程序需要的数据类型。然后服务程序被controler调用,用transportCost方法计算出成本返回给veiw,显示给业务员,业务员就可以告诉客户需要支付多少钱啦。

总结:

多态的向上转型在MVC设计模式中拥有重要作用,通过向上转型,实现了MVC设计模式的分层设计理念,如以上实例,通过ConveyanceFactory,根据用户选择实例化对象,通过向上转型,转换成父类类型,得以使用被子类覆写的子类方法,很好的体现面向对象的设计思想。在JavaEE开发中,MVC设计模式得以大量使用,而向上转型在其中发挥重要作用。