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设计模式得以大量使用,而向上转型在其中发挥重要作用。