首先,什么是多态?
我们应该从什么角度来理解多态?其实,我们不妨把多态理解成一种事物的多种存在形态,

比如,猫和狗都属于动物的子类,可以想象成为动物,而动物又可以变成猫和狗。
多态是将子类对象当作__父类__对象来看待,也就是子类对象可以放入父类中 引用

为了充分理解多态,我们可以从以下这几个方面来理解多态。

第一、从多态的体现方面:我们使用多态的时候,创建的是父类的引用,开辟的是子类的空间,由于没有开辟父类的空间,所以是父类的引用指向子类对象,并不是真正的父类自己创建了对象,而且父类对象的引用还可以作为函数参数来接收子类对象哦!

第二、多态实现的前提:必须是类与类之间要有关系,要么继承,要么实现,存在覆盖,其实就是有抽象函数。

第三、从多态的好处:大大提高程序的可拓展性

第四、多态的应用:1.父类对象的引用指向子类对象,其实本质上是一个向上转型,就像int转成double一样,儿子穿了一身爸爸的衣服,扮成了爸爸。2.但变成了爸爸之后,只能使用爸爸特有的技能,儿子怎么能够使用自己本身的技能呢?这时候就需要向下转型,脱下伪装,将父类对象的引用强转成子类类型,就可以使用子类特有的技能了。

第五、多态的弊端:提高了拓展性,但是只能使用父类的引用访问父类的成员。

多态的三个用法:

  • 1, 对象类型不变,
  • 2, 只能对引用调用其引用类型中声明的方法
  • 3, 在运行时,会根据对象的实际类型找子类覆盖之后的方法

下面程序可以很好的解释什么是多态:
一个A类,定义了m1和m2方法
A类的子类B类,覆盖了m2(),添加了m3方法
多态就是 可以把B类对象放入A类的引用里面,就是把子类放入父类引用,A a =new B();
通过这个引用a能调用m1和m2方法,不能调用m3方法,因为A类中没有调用m3,
a. m2是会调用B类中的m2,B类中的m2重写了A类中的m2,所以找的就是B类覆盖之后的m2.

为便于理解程序已加详细注释说明:

   package d11;class duot{public static void main(String[] args) {/*多态的使用Animal类,定义了eat()和sleep()方法,Animal的子类Dog类,覆盖了sleep类,添加了shout()方法多态就是 可以把(dog类)对象放入(Animal类)的引用里面,就是把子类放入父类引用,Animal a =new Dog();通过这个引用a能调用eat()和sleep()方法,不能调用shout()方法,因为Animal类中没有调用shout(),a.sleep()是会调用dog类中的sleep(),dog类中的sleep()重写了Animal类中的sleep,所以a.sleep()找的就是dog类覆盖之后的sleep().  */Animal a =new Dog();a.eat();//This is a eat()//a.shout();//不能调用shout方法,会报错,Animal类中没有调用shout方法;a.sleep();//sleep 3 hours/*类型转换子类引用赋值给父类引用,可以直接赋值。父类引用赋值给子类引用,必须_强制类型转换,保证编译通过,但是运行时可能发生 类型转换异常。*///(编译时不出错,运行时可能发生类型转换异常)//这个强制类型转换其实是给编译器看的,使他不理会这个异常,//因为Animal类中并不一定装的是这个dog对象。只是可能,//如果换成Animal a =new Cat();则就会编译不报错运行报错类型转换异常Dog d =(Dog)a;//引用间的赋值;需要强制类型转换,d.shout();//这时候就能调用shout方法了,//instanceof关键字/*Instanceof   是一个二元运算符组成一个布尔表达式;使用方法:   引用   instanceof  类名  就是判断该引用所指向的对象 和后边的这个类名是否兼容;可以把instanceof形象的比喻为  是不是    是就是真,不是就是假;*/  //例:a里面装的是一个狗System.out.println(a instanceof Dog);//true    a是一个狗System.out.println(a instanceof Cat);//false    a不是一个猫System.out.println(a instanceof Animal);//true    a是一个动物//instanceof关键字可以规避上面的风险,先判断a里面装的是不是狗 //是去做强转,绝对不会出错,否则不强转;//所以上面程序可以改为:if (a instanceof Dog) {Dog d =(Dog)a;d.shout();}}}class Animal{public void eat(){System.out.println("This is a eat()");}public void sleep(){System.out.println("sleep 6 hours");}}class Dog extends Animal{public void shout(){System.out.println("Wang Wang !!!");}public void sleep(){System.out.println("sleep 3 hours");}}//测试类型强转,和instanceof关键字,class Cat extends Animal{}

其中程序中用到了instanceof关键字,Instanceof 是一个二元运算符组成一个布尔表达式;
可以把instanceof形象的比喻为 是不是 是就是真,不是就是假;

在强制类型转换之前可以用instanceof判断,从而规避类型转换异常的发生;

这里简单说明一下我对多态的认识,下一篇简要阐述一下多态的2种常见用法!

java三大特性之多态的认识,以及多态的实际应用(一)相关推荐

  1. java三大特性:封装、继承、多态

    2019独角兽企业重金招聘Python工程师标准>>> 至今记得若干年前,去面试排了半天的队,到我的时候,面试官问我的第一个问题,java三大特性是什么~我支支吾吾的没有答全~0.0 ...

  2. Java三大特性:封装,继承与多态

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/84592274冷血之心的博客) 目录 (一)封装 封装的定义 封装 ...

  3. Java三大特性(封装、继承、多态)详细讲解

    文章目录 封装 1 封装的好处 2 简单实现 继承 一.类继承简单实现 父类:动物类 子类 猫类 狗类 二.类继承的详细讲解 1. 类继承中成员变量的访问 1.1 成员变量之间的访问 (变量不重名的情 ...

  4. Java三大特性: 封装、继承、多态

    (一)封装 1.什么是封装? 在Java的类中一般有属性和方法,如果我们不想在其他类中new出来本类的对象对其成员变量随意进行修改,那么我们可以将成员变量设成私有的,这样除了自己类中可以访问自己的成员 ...

  5. Java三大特性(封装,继承,多态)之一 -----继承

    目录 一.继承的基本概念与规则 1.继承的概念 2.继承的关键字 3.继承的结果 二.继承代码 1.继承之---最简单继承 2.继承之---构造器加入 3.继承之---多态转型 3.继承之---抽象类 ...

  6. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  7. Java 三大特性 —— 多态

    Java中多态性的实现 一.什么是多态 1.面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2.多态的定义:指允许不 ...

  8. Java提高篇 —— Java三大特性之多态

    一.前言 面向对象编程有三大特性:封装.继承.多态. 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问 ...

  9. java 三大特性理解_java 三大特性--封装、继承和多态理解

    java 三大特性--封装.继承和多态理解 封装 /** * 所谓封装,就是将对象具有的成员变量和成员函数包装和隐藏起来,让外界无法直接使用, * 被封装的成员只能通过某些特定的方式才能访问. * 实 ...

  10. Java的三大特性之封装、继承、多态-----最简理解

    根据网上其他地方的解释,以及查找资料,将自己对java三大特性的理解展示如下. 封装:(属性私有,set/get,在set中限定一些不安全的情况) 封装是指把一个对象的状态信息(也就是属性)隐藏在对象 ...

最新文章

  1. C#中子类与父类的相互转换
  2. 小希的迷宫(并查集)
  3. Android 安全专项-Xposed 劫持用户名密码实践
  4. css实现两端对齐的3种方法
  5. 对计算机的硬盘进行高级格式化,牛刀初试 高级格式化硬盘完全体验
  6. starccm中文用户指南_【干货】Salesforce系统管理员认证考试指南
  7. azure云数据库_Microsoft Azure SQL数据库-分步创建教程
  8. 网页打印和ActiveX控件打印
  9. Amazon IoT Core 服务成本优化
  10. fastboot刷机工具_红魔3/3S 刷机教程
  11. C语言-快速排序实现
  12. python实现SG滤波
  13. UE4(Unreal Engine4)快捷键
  14. java实现高德地图app_入门指南-高德地图手机版 | 高德地图API
  15. impala创建kudu表过程,并发时异常
  16. PLC之六部十层电梯整体框架
  17. openwrt pandorabox kali Captive portal not popping up wifiphisher
  18. 大型软件是否占用计算机内存,软件应用占用内存怎么查看
  19. 程序员初入职场第一年—— 程序员羊皮卷 连载 13
  20. Clickhouse与Doris的区别

热门文章

  1. Unity学习笔记——Unity基础一:unity界面、场景、游戏物体、组件等基本概念
  2. 中小企业办公无线网络覆盖解决方案
  3. 加ing形式的单词有哪些_给下面的单词分类 直接加ing: 去e加ing: 特殊变位:,去e加ing的英语单词...
  4. 小计算机cv值怎么计算方法,变异系数怎么算_excel求变异系数
  5. surface pro3深度linux,Microsoft Surface Pro 3 (简体中文)
  6. 【产品实操】手把手教你安装 TDH8.1.0
  7. JRebel最新激活服务器地址链接
  8. CASIA-SURF
  9. 远程教育的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. android相机拍照