zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第十章-多态-转型2

    一.

    之前的举的例子,Animal a=new Cat(); 当动物的引用指向了猫对象的时候,这时候猫对象具备了两种形态。要么是猫的形态,要么是动物的形态。这时候,猫对象就具备了多态性。当父类指向子对象,这是一种提升。这叫向上转型。转成了动物类型。如果需要子类来进行操作的话,就需要向下转型。

    现在再举一个例子来讲述多态的转型。

    (这个例子有点小问题,子类中具备两个“讲课”方法,方法体不一样)

    按道理说,我们是创建毕老师对象,调用毕老师方法。

    上面截图中的都是早期操作,接下来讲述多态的操作。

     

     举本例能够更加将多态讲解清楚,比例举的动物例子更加清晰。在本例的多态操作中,编译运行的结果是java。我以为输出的会是管理,没想到输出的java。这里对毕老师和毕姥爷中的两个一样的函数做个介绍,毕老师继承了毕姥爷,这样一来,相同的方法子类就覆盖了父类。如果父类中是个抽象类,相同的函数会多一个abstract的关键字,没有方法体,但是子类中的函数依旧会覆盖它。

    这里输出java的原因在于,虽然x是毕姥爷类型,但是在内存图解中,给x的值,却是子类对象毕老师的地址编码。因此,x输出的讲课就是子类对象中的讲课,就是java,而不是父类毕姥爷中的讲课管理。

    对程序进行了修改,发现我理解错了。

    按照之前的理解,这里应该就不存在钓鱼的功能,因为x本质上是子类对象,子类中不存在钓鱼的功能。

    →对于继承的理解还是不够深刻,我的视线全部集中在了相同函数的覆盖上。我以为子类毕老师只有两个功能,讲课和看电影。实际上,对于父类中的一切,子类只要是继承,子类中也是有的,只是没有写出来,也就是钓鱼这个功能,子类中也是有的。如果是相同的声明的函数,子类函数的方法体会覆盖父类函数中的方法体。

    再对程序进行一个修改,如下

    新增了一个x.看电影();这句话。我第一感觉也是可以运行的,但实际是错误的。还是因为前面的理解不够深刻正确。外界一直将x当成毕姥爷来看待,覆盖看不出来,子类中扩展的也看不出来。因此,外界压根就无法调用看电影这个函数。(看电影函数在x中是真实存在的,那怎么使用呢?难道非要转换成子类类型才可以么?)

    想看电影,就用到了子类的特有数据。这就必须进行数据类型的转换。

    整体的流程下来,截图是这样的

    多态的上下转型过程中,有一个东西不会变,自始自终都是子类对象在做着变化。

    要牢记,向上转型有两个作用,提高扩展性和限制子类的特有功能。在向下转换类型的时候,一定要注意防止出现类型转换异常。

  • 相关阅读:
    Android实战技巧:深入解析AsyncTask
    Android开发在路上:少去踩坑,多走捷径
    ART:Android 摆脱卡顿的希望?
    搭建Elasticsearch集群的配置
    Docker学习笔记-(5)容器数据管理,链接容器,构建私有库
    Docker学习笔记-(4)Dockerfile
    Docker学习笔记-(3)网络设置
    Docker学习笔记-(2)端口映射
    Docker学习笔记-(1)常用命令
    【架构】Heartbeat高可用服务(2)
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7827051.html
Copyright © 2011-2022 走看看