JAVA-初步认识-第十章-多态-转型2

一.

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

posted @ 2017-11-13 20:05  前锋营  阅读(176)  评论(0编辑  收藏  举报