java的多态是什么意思_【Java】基础18:什么叫多态?

面向对象三大特性:封装、继承和多态。

今天学最后一个特性:多态。

什么叫多态呢?按照字面意思理解就是多种形态的意思。

还是举昨天的那个例子:

动物园里动物都得吃食物,兔子吃胡萝卜,猫吃鱼,狗吃肉。

同一行为(吃东西),通过不同的事物(兔,猫,狗),可以体现出不同的形态(兔子吃胡萝卜,猫吃鱼,狗吃肉),这就叫多态。

一、多态的格式

1.格式说明:父类引用指向子类对象。

具体什么意思呢?

变量有基本数据类型和引用数据类型。

其中引用数据类型又分为:数组,类和接口。

父类类型指的是子类继承至的父类,或者子类实现的接口。

按照现实里面的理解就是:一个是亲爹一个是干爹。

2.要存在方法重写

其中父类引用(也就是图中的Zoo)在调用方法时,会先看自己有没有这个方法(eat方法)。

如果没有eat()方法,编译会报错;

如果有这个方法,会执行子类重写后的方法,

口诀就是:编译看左边,运行看右边

就比如上图中:zoo.eat()

①编译会先看左边,Zoo接口中有没有eat()方法,有,编译通过。

②运行结果看右边,是Rabbit对象,那么会执行Rabbit中重写的eat()方法,也就是“兔子吃胡萝卜”。

二、多态的好处

既然是面向对象三大特性,那它有啥好处呢?

当父类类型作为方法形式参数时,更能体现出多态的扩展性与便利。

现在要展现动物的eat()方法和sleep()方法。

如果不使用到多态,常规用法,代码如下:

就是每一个动物都得建立一个对象,并且建立其对象对应的show()方法。

那么问题来了,动物园里那么多动物,每个动物都建一个show()方法,会显得特别繁琐。

如果应用到多态的话,就会简单很多。

代码如下:

每一个动物就建立对象,但是只需要一个show()方法就可以了。

show()方法参数是父类类型的引用。

这样无论建立多少个动物对象,只要是子类,都可以将参数传入这个方法,直接使用。

这就叫代码的可拓展性,以后无论是删减哪种动物,或者是添加哪种动物,这个方法都可以使用,不用改变。

三、多态的弊端

多态这么方便,那它有没有什么弊端呢?

是有的。多态不能调用子类的特有方法,需要使用到强制转换。

兔类中有一个特有的方法jump(),兔类的父接口Zoo中没有这个方法。

那么父类引用zoo就不能调用这个特有的方法。

需要使用到强制转换,也就是(Rabbit)zoo。

格式为:(类型名)变量名。

注意:

上面这段代码,编译是没有问题的,但是运行会报错。

ClassCastException,中文就是:类转换异常。

其实很好理解,变量zoo定义的时候,本来是子类dog对象,现在强制转换成子类Rabbit,自然没法运行。

为了避免出现类转换异常,Java提供了一个关键字:instanceof,给变量名做类型的校验。

格式为:变量名 instanceof 类型如果变量属于该类型,返回true;

如果变量不属于该类型,返回false。

总结:

你可能感兴趣的:(java的多态是什么意思)