多态
为什么需要有多态?
一个动作在不同的环境下表现出来的不同种状态
如:
Cut
理发师: 剪头发
导演: 暂停
医生: 开刀
多态的概述:
生活中: 同一个动作在不同的环境下体现出来的不同的状态
代码中:同一个方法在不同的类下体现出来的不同的实现
内存中:父类引用指向子类对象
使用多态的前提条件
(多态在代码中如何来实现?)
1.一定要有继承关系
2.一定要有重写
3.父类引用指向子类对象
父类 fu = new 子类();
多态访问成员的特点
成员变量:编译时期看左边类型,运行时期看左边类型
成员方法:编译时期看左边类型,运行时期看右边类型
构造方法:帮助子类初始化父类继承过来的成员
静态方法:编译时期看左边类型,运行时期看左边类型
多态的优点
1.简化了代码
2.提高了程序的维护性和扩展性
多态的缺点
多态的缺点:使用多态不能够访问子类所持有的方法
解决办法:向下转型
向上转型(自动转换)
格式: <父类型><引用变量名> = (<子类型>)<父类型的引用变量>;
特点:
子类转为父类 父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
向下转型 (强制类型转换)
格式: <子类型><引用变量名> = (<子类型>)<父类型的引用变量>;
特点:
父类转为子类,父类引用转为子类对象,强制类型转换
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
java.lang.ClassCastException:com.sxt.duotaidem.benz cannot be cast to com.sxt.duotaidemo.BMW ClassCastException:类型转换异常
产生原因:在向下转型的过程当中,没有转换成真实的类型
解决办法:在向下转型的过程当中,对父类类型的所有子类做逐一判断
instanceof关键字
左边对象instanceof 右边类 这是一个表达式,结果BOOLEAN类型
判断左边对象是否属于右边类的实例
无法解决的问题 : 如果是object类呢?–后面会有泛型