【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。

总结:

在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘小爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值