1.多态的转型
1.向上转型
我们之前学的多态创建对象,使用的都是向上转型,父类引用指向子类(赋值方式则是从子到父),f拿到子类的地址,就能访问子类的堆内存
2.向下转型
和向上转型相反,子类引用指向父类(赋值是从父到子),f现在记录着地址,这时再将其地址转交给子类对象,如下图,黑线的指向就像Zi z=new Zi(),这不就相当于创建子类对象,那想用什么成员,就可以用了
需要注意的点是,向下转型需要强制转换,因为父类比子类大(父亲肯定比儿子更猛)
2.多态的转型问题
了解了多态的转型后,我们就可以解决上次的问题了,现在国外类里有一个自己的方法check(),使用多态创建对象,编译发现接口中不存在该方法,所以编译报错
这时我们使用向下转型,将接口拿到的权限再转交给国外类,再用重新获得权限的实现类调用自己的方法即可
虽然解决了问题,但我们的代码目前存在安全隐患,如下图,当我们输入1,接口指向国内类时
这个问题叫做类型转换异常
在引用数据类型的强转中(和基本数据类型无关),接口指向国内类对象,然后又使用了向下转型,接口又被转交给了国外类,实际类型是国内类,目标类型又是国外类,所以造成了错误
说白点就是只能接口和对应的实现类进行转型,不能乱转
3.instanceof关键字
对于类型转换异常的解决方法,就是通过instanceof关键字来解决
我们只需要使用if来进行小的判断,看看接口对象是不是国外类型,是,就进行向下转型,不是则无需进行向下转型,也就不会出现刚才的问题
4.案例
思路:不管是什么支付方法,肯定会有支付,所以我们先写一个接口用于支付,再对应三种支付方式写三种类,然后将这些类实现接口,最后用多态和switch分别指向不同的实现类,调用其方法即可
准备好接口和实现类
进行业务