多态的作用
当你需要对一只狗做动作,比如说"喂",可以写一个类,里面写一个方法.main方法里写一个"喂狗"的动作.
然后后来又养了一只猫,也要"喂",那么又写一个类,写一个类似的方法.main方法里写一个"喂猫"的动作.
再然后又养了一只鸟,也要"喂",又写一个类,又写一个方法,main方法里写一个"喂鸟"的动作?
这样比较繁琐.对具体对象编程,会落入无尽的增加和修改.对抽象对象则不会.
可以新建一个类,类名叫"动物",让"狗""猫""鸟"作为"动物"的子类,main方法里只需写一个"喂动物"的动作即可.
这就用到了多态的向上转换.
"狗""猫""鸟"都是"动物"的子类,子--->父可以自动转换.
多态的用法
父类 a = new 子类();
这个叫子--->父,叫向上转换.因为=右边先执行.这个是自动转换.
父类 b = new 子类();
子类 c = (子类)b;
这个是父---->子,叫向下转换,属于强制类型转换,是有风险的.
向下转换不是随意转的,必须是子类的动作(即方法)是特有的,是父类不存在的,没办法了,才用到向下转换.
向下转换由于子类并不是唯一,有可能造成张冠李戴的现象,所以要用到instanceof运算符.
instanceof运算符用法:
父类 b = new 子类1();
子类1 c = (子类1)b;
if(c instanceof 子类1){
java语句;
}else if(c instanceof 子类2){
java语句;
}else if(c instanceof 子类3){
java语句;
}...
可能会有疑问,这里明明写了
父类 b = new 子类1();
明明写了"子类1",知道new出来的肯定是子类1啊,为什么还要写instanceof语句.
这里是看得到,但是有很多直接引用的方法,就不知道里面是什么了,只能去判断.比如:
我写一个方法,小明写另外一个方法.
我这里需要引用小明方法里面的一个变量,比如:
public void play(Instrument i){
java语句;
}
这里的变量i我不知道他会传过来一个什么子类,但是有的子类又要执行它特定的动作,那么java语句中,就要做判断,不做判断,就会出现很经典的运行错误(我忘了英文...)
封装,继承,多态.java的三个重要点.
后面学完super,基础就结束了.