多态表现在两个方面
1.一个父类型的引用在指向不同的对象时会有不同的实现;
如:IUnionPay atm;
atm = new ATMABC(); atm = new ATMCBC();
总结,运行时,方法执行看对象!
2.一个子类型对象,“向上造型”成不同的父类型时,可以使用的功能不一样
“向上造型”指子类类型的变量,可以自动“向上”转化为父类型的变量。
ATMCBC cbc = new ATMCBC();
IUnionPay atm = cbc;//变量cbc向上造型为父类型IUnionPay类型
再比如:因为ATMCBC类实现了IPolice接口,所以
IPoloce pol = cbc;//编译正确,变量cbc同样可以向上造型为IPolice类型
这里父类型可以是抽象类,也可以是接口(父类型的变量仅能使用子类型重写父类的方法)
优点:动态调度,不同的对象可以调用不同的方法
缺点:父类型变量只能调用子类中重写父类的方法
缺点解决:强制转换父类型变量转化为子类型变量(或者父类型的变量不能自动转换为子类型的变量),这样父类型变量可以调用更多方法
例如:
1. IPolice pol = new ATMCBC();//父类型变量只能使用takPic方法
ATMCBC c = pol;//编译错误:父类型转换为子类型需要强制转换!
ATMCBC c = (ATMCBC)pol;
//编译正确。因为pol变量所指向的实际对象类型为ATMCBC,目标类型也是ATMCBC;
2. ATMCBC c = (ATMCBC)pol;
IUnionPay p =(IUnionPay)pol;
//因为实际对象时ATMCBC类型,目标类型时IUnionPay类型。实际对象类型是目标类型的子类型。
3.ATMABC aa = (ATMCBC)pol;
//编译正确,但运行错误;因为pol指向的对象类型,不是ATMABC的子类型
强转看对象!目标类型必须是对象类型本身或者对象的父类型