概述
多态是封装,继承之后,面向对象的三大特征
同一种事物表现出来的多种形态。
前提
- 必须是有子类关系或者实现接口
- 必须要有方法重写
- 必须父类指向子类
须知
当父类引用变量指向子类对象时,调用方法会调用子类重写的方法
定义格式
父类类名 变量名 = new 子类类名
例如:Animal a=new Dog();
使用场景
作为形式参数,接受更多的同种类型的类
public static void feedAnimal(Animal a) {
a.sleep();
a.eat();
}
作为返回值,返回更多数据类型的对象
public static Animal productAnimal(int type) {
if(type == 0){
return new Dog();
} else if(type == 1){
return new Cat();
}
return null;
}
好处
- 提高代码的复用性
- 提高代码的扩展性
- 提高代码的维护性
缺点
不能调用子类特有的成员(成员变量和成员方法)
转型
向上转型
父类引用指向子类对象的过程
Animal a=new Dog();
向下转型
将父类引用强制转换为子类引用
格式:子类类型 变量名=(之内类型)父类类型
Dog d = (Dog)a;
instanceof
作用
判断某个对象是否属于某种数据类型
一样使用在多态之后用来判断父类引用到底指向那个子类类型的对象
格式
boolean b = 引用变量名 instanceof 类名
注意事项
- 毫无关系的两个类型不能进行判断(会出错)
- instanceof 关键字之前引用类型和之后的数据类型必须有子父类关系或者实现接口
代码说明
// 判断a实际的数据类型到底是Dog还是Cat
// boolean b = 引用变量名 instanceof 类名;
// boolean b = a instanceof Dog;
if(a instanceof Dog){ //a就是狗对象
//子类类型变量名=(子类类型)父类引用;
Dog d = (Dog) a;
d.lookHome();
} else if(a instanceof cat){
// 强制转换为Cat
Cat c= (Cat)a;
c.catchMouse();
}