1,多态概述
现实事物经常会体现出多种形态,如学生是人的一种:学生张三,既是学生也是人,即出现两种形态。
Java可以描述这种关系,Student类继承了Person类,一个Student的对象便既是Student,又是Person。
2,多态代码体现
Java中多态的代码体现在父类引用变量可以指向子类对象,即一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
如Student类可以为Person类的子类。那么一个Student对象既可以赋值给一个Student类型的变量,也可以赋值给一个Person类型的变量。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用各个子类重写后的方法。
多态同样适用于接口与实现类。
具体格式如下:
父类类型 变量名 = new 子类类型();
变量名.方法名();
此时,虽然该变量指向的是子类对象,但表现为一个父类的形态,可以调用一切父类有的方法,子类特有的方法将不能调用。
如:
Person与Student类的多态。
3,多态的使用场景
我们一般在以下场景当中使用多态:
- 变量赋值
- 方法传参
- 返回值返回值
4,多态的好处和弊端(更换举例?)
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。
如:
在Boss类中,有叫员工去工作的方法,当该方法的参数定义为接口时,可以传入任意的子类对象。相比定义多个子类参数,定义多个方法,这样大大提高了代码复用性与扩展性。
class Boss{
public void goToWork(Empolyee e){
e.work();
}
}
所以多态的存在意义(优点)为:
配合继承与方法重写提高了代码的复用性与扩展性,如果没有方法重写,则多态同样没有意义。
多态的弊端: 不能调用子类的特有方法
5,instanceof关键字
我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属于学生类,学生的对象也属于人类。但学生不是家具,不能直接判断学生对象与家具类的关系。
使用格式:
boolean b = 对象 instanceof 数据类型
6,向上向下类型转换
多态本身是子类类型向父类类型向上转型的过程。
多态的转型分为向上转型与向下转型两种:
- 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal p = new Cat();
- 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Cat c = (Cat) a; //变量p 实际上指向Cat对象