多态

113 阅读2分钟

多态的作用

当你需要对一只狗做动作,比如说"喂",可以写一个类,里面写一个方法.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,基础就结束了.