目录
1 概念
同一个事物,在不同情况下表现出来的不同属性。
比如 : 猫是动物, 狗也是动物,动物在不同的情况表现出来得属性不一样,这就构成了多态。
在代码中的特征就是 父类修饰了子类。
2 多态的前提条件
-
有继承/实现关系
-
有方法重写
-
有父类引用指向子类对象 ( 例如:Animal c =new Cat )
注意:
第三点是关键特征。
3 多态成员的访问特点
3.1 构造方法:
同继承一样,子类会通过super 访问父类构造方法
3.2 成员变量:
编译看左 , 执行看左
解释:调用的变量在父类中不存在的时候, 编译报错不通过, 执行报错;
调用的变量在父类中存在的时候,结果指向父类变量值。
3.3 成员方法:
编译看左, 执行看右
解释:调用方法在 父类中存在 ,在子类存在,编译通过,执行通过,方法执行子类;
调用方法在 父类中存在 ,在子类不存在,编译通过,执行报错;
调用方法在 父类中不存在 ,编译不通过;
注意:
同一个方法名 子类父类都有, 所以 子类一定会 重写父类的方法。
成员变量和 成员方法执行的 不一样的 原因: 成员方法有重写, 成员变量没有重写。
4 多态的优点和缺点
4.1 优点
提高了代码的拓展性。这里指的是父类的对象可以接收任意子类的对象
4.2 弊端
不能调用子类特有的成员方法。也就是父类没有的成员方法的时候没法正常编译。
弊端的解决办法,是向下转型。也就是强制转换。例如: cat c = (cat)d;
Fu f = new zi() 相当于向上转型,和基本类型中的隐式转换 类似
5 多态强制转换出现的异常
出现 ClassCastException 类型转换异常,对应的实际类型和目标类型不是同一种类型。
解决办法是:
用 instanceof 用来判断是否能强制转型的。
if( a instanceof Dog){}
//判断数据能转换成指定的数据类型,如果是返回true, 不是返回false。
小转大, 范围小的往范围大的转, 系统自动转
大转小, 范围大的往范围小的转, 需要强制转换
书写格式
//父类转为子类; 大转小
Fu d1 = new Fu();
d1 = (zi) d1;
//子类对象传递给父类; 小转大
zi d3 = new zi();
d1 = d3;
6 多态应用场景
多态更多应用在方法传递参数的时候, 用父类修饰形参, 调用方法的时候只要是子类方法就可以传入。