前言:
此刻看官们对“java多态性表现在哪三个方面”大致比较关切,兄弟们都需要了解一些“java多态性表现在哪三个方面”的相关内容。那么小编也在网上网罗了一些对于“java多态性表现在哪三个方面””的相关内容,希望同学们能喜欢,看官们一起来了解一下吧!面向对象三大特性:封装、继承和多态。
今天学最后一个特性:多态。
什么叫多态呢?按照字面意思理解就是多种形态的意思。
还是举昨天的那个例子:
动物园里动物都得吃食物,兔子吃胡萝卜,猫吃鱼,狗吃肉。
同一行为(吃东西),通过不同的事物(兔,猫,狗),可以体现出不同的形态(兔子吃胡萝卜,猫吃鱼,狗吃肉),这就叫多态。
一、多态的格式
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多态性表现在哪三个方面 #java多态性的含义