一、概述
1、定义
- 一个对象具备多种形态,也可以理解为事物存在的多种体现形态(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象)
- 定义格式:父类类型 变量名=new 子类类型();
2、理解
- 多态体现为父类引用变量可以指向子类对象。
- 多态是同一个行为具有多个不同表现形式或形态的能力。
- 多态就是同一个接口,使用不同的实例而执行不同操作。
3、细节
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
二、多态的转型
1、向上转型
多态本身就是向上转型过的过程
- 使用格式:父类类型 变量名=new 子类类型();
- 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
原来:
//创建普通学生类
PbStudentGenaral pbStudentGenaral = new PbStudentGenaral("101", "攀博", "pbteach@126.com");
//创建vip学生类
PbStudentVip pbStudentVip = new PbStudentVip("101", "攀博", "pbteach@126.com", LocalDate.now().plusDays(365));
更改后:
//创建普通学生类
PbStudent studentGenaral = new PbStudentGenaral("101", "攀博", "pbteach@126.com");
//创建Vip学生类
PbStudent studentVip = new PbStudentVip("101", "攀博", "pbteach@126.com", LocalDate.now().plusDays(365));
更改后的代码验证了向上转型。
2、向下转型
一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
- 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
- 适用场景:当要使用子类特有功能时。
PbStudent studentVip = new PbStudentVip("101", "攀博", "pbteach@126.com", LocalDate.now().plusDays(365));
//将studentVip转为PbStudentVip类型
PbStudentVip pbStudentVip = (PbStudentVip) studentVip;
//调用vip学生类特有的方法
pbStudentVip.isValid();
注意:向下转型是非常危险的,要谨慎使用 ,如果studentVip并不是PbStudentVip类型,但是编译时并不报错,在调用isValid()方法时则报错。所以必须确切知道 studentVip可以转为PbStudentVip类型才可以用向下转型。