引用类型强制转换

多态表现在两个方面

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的子类型

强转看对象!目标类型必须是对象类型本身或者对象的父类型

猜你喜欢

转载自blog.csdn.net/qq_40531768/article/details/80203662