首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基础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。

总结:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200502A035J300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券