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

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

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

还是举昨天的那个例子:

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

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

一、多态的格式

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】基础18:什么叫多态?相关推荐

  1. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  2. java期末判断题题库_(java期末考试选择题题库.doc

    (java期末考试选择题题库 1.分析以下程序: 1)public class x{ 2)public static void main(String[]args){ 3)String ol=new ...

  3. Java格式化日期用斜杠_[java工具类01]__构建格式化输出日期和时间的工具类

    在之前的学习中,我写过一篇关于字符串格式化的,就主要设计到了时间以及日期的各种格式化显示的设置,其主要时通过String类的fomat()方法实现的. 我们可以通过使用不同的转换符来实现格式化显示不同 ...

  4. java中table是什么标签_[Java教程]javascript格式化table标签内容

    [Java教程]javascript格式化table标签内容 0 2015-07-12 20:00:08 项目中遇到这样的需求,一大段文章正文的html代码在手机中显示不全,原因是由于其它有table ...

  5. java技术的核心是哪个_[JAVA]《Java 核心技术》(一)

    1. unicode编码表 utf-8和unicode的互换问题 2. subString(a,b) 获得 [a,b-1]的子串 3. 易犯错误,java没有引用传递 4. ==         比较 ...

  6. java get post 区别详解_[Java教程]GET 与 POST 其实没有什么区别

    [Java教程]GET 与 POST 其实没有什么区别 0 2020-12-30 11:36:20 GET 与 POST 其实没有什么区别 本文写于 2020 年 12 月 30 日 GET 与 PO ...

  7. java监听变量的变化_[Java学习小记]使用PropertyChangeSupport来监听变量的变化

    最近开始要着手写一个web项目 ,之前没怎么 写过Java ,所以觉得蛮有必要把每天学习到的一些知识点或者解决的一些问题给记录下来 .一来供自己在整理过程中掌握巩固,二来也为以后再次出现该问题时能快速 ...

  8. java下載與安裝_[Java] 下載與安裝Java官方開發工具:NetBeans IDE

    [Java] 下載與安裝Java官方開發工具:NetBeans IDE 依個人經驗,當NetBeans用到一半,不知怎樣就當掉,或程式碼被Lock無法修改,通常是該版的NetBeans有Bug 建議下 ...

  9. java在线音乐播放器课程_[Java教程]15款最好的网站音乐播放器

    [Java教程]15款最好的网站音乐播放器 0 2014-10-27 17:02:55 在互联网上有很多的脚本和插件,可以很容易将音乐播放功能集成到网站,以下是15款最好的网站音乐播放器. Flash ...

  10. java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验

    成文原因: 这篇文章是我这周所做的 Java 实验题的一个小总结. 这次实验让我深刻赞同了我们 Java 老师在这节实验课前告诉我们的话: 最重要的是把问题想明白,它要怎么拆分成几个类,每个类里究竟需 ...

最新文章

  1. R学习-小白笔记05
  2. python 接口自动化_Python 接口自动化测试
  3. NodeJs系列二:你好,世界
  4. 十年探索,云上明灯,re:Invent再启掀产业风暴
  5. 吴恩达机器学习笔记十四之大规模机器学习
  6. Opencv--copyTo()函数的使用方法
  7. 在.NET单元测试中使用嵌入式资源
  8. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些
  9. asp.net网页编程 ASP.NET中绑定枚举类型
  10. php基础语法了解,PHP基础语法
  11. c语言 随机漫步,随机漫步理论
  12. Microsoft caffe cifar实例编译之model的生成
  13. js标准时间转换为时间戳
  14. 百度指数Cipher-text加密
  15. 重磅精品课程总有一门是你想要找的
  16. IDEA起步(一) - 工程结构
  17. JS添加/修改CSS样式
  18. 我的世界HMCL启动器以及加入服务器步骤
  19. Mybatis学习笔记(三)
  20. 英飞凌单片机知乎_如何评价单片机大神郭天祥?

热门文章

  1. 裸机服务器装系统步骤,服务器裸机安装操作系统
  2. 「CF1154F」Shovels Shop【背包DP】
  3. 【未来iPhone 手机中将加入卫星通信功能?】
  4. 一、markdown 常见公式
  5. OPPO发布小布虚拟人,开放面向开发者的多元AI能力
  6. 记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
  7. Python 面向对象 (六) 实例学员管理系统
  8. 乡村的野蛮生长|独秀日记
  9. shopnc mysql_(转) shopnc数据库操作
  10. Times New Roman字体的历史