继承与多态01

Posted zmlgoes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承与多态01相关的知识,希望对你有一定的参考价值。

技术图片

技术图片

技术图片

技术图片

技术图片

继承方面的东西

首先要明白,A extends B,B extends C,那么A 也会 extends C,只要是继承了,那么A就自动的继承了B和C,public的实例变量和方法,如果A有特殊的行为,也就是方法和B,C不同的话,那么一定要override,覆盖,并且覆盖有一定的规则:覆盖的方法必须要有相同的参数和返回类型(不论父类声明的返回类型是什么,返回一样的类型或者是该类型的子类),还有一点是不能降低方法的存取权限,这表示存取权必须相同,或者更为开放,举例来说,你不能覆盖掉一个公有的方法并将它标记为私有。这会让它以为在编译器通过的是个公有方法,然后突然在运行期的时候是私有的,所以jvm会阻止存取。

比如

技术图片

toaster的turnOn方法参数类型不一样,所以并不是一个override,只是个重载方法(overlord),所以,还是会以Appliance引用来调用没有参数的版本。

技术图片

不能降低方法的存取权限

所以现在来看看前面的题目,由题意可知B extends A,但是B.m1()方法覆盖掉了A.m1()方法,其他的B.m2(),B.m3()和A.m2(),A.m3()一样。 C extends B,也就 extends A,但是C.m3()覆盖掉了B.m3(),也就是A.m3(),并且C.m1()也是继承B.m1()的,而不是A.m1(),C.m2()就是和A.m2()一样,所以可知

b.m1(); ------  是自己的m1()方法,所以输出 “B`s m1 , ”

c.m2()--------  使用继承下来的 A.m2(),所以输出 “A`s m2, ”

a.m3()------他是superclass,当然是输出自己的, “A`s m3 , ”

同理,

c.m1()-----B中的

c.m2()------A中的

c.m3()-----自己的

a.m1()------A中的

b.m2()-------A中的

c.m3()-------自己的

------------

接下来这个有点特殊 A a2 = new C(); 虽然引用类型a2是A类型,但是new出来的对象是C,最后,在调用方法是,会调用C的方法,也就是和C c = new C();没有太大差别,但是这两个也是不同对象。

a2.m1()----B中的

a2.m2()----A中的

a2.m3()----C中的

-----------------------

这里还要注意一个调用方法的级别顺序,比如这题的C----B----A,C---A级别越来越高,当你调用C的m1()时,它会先从B中找起,当然如果B中的m1没有覆盖掉A中的m1的话,那就是没啥差别,但是如果B的m1是特殊的方法,已经覆盖了,那么C的m1()应该和B的m1一样,而不是和A的m1一样,也就是会从低阶级别开始找起,找不到再继续向上找起。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

技术图片

这一题考察的也是关于继承,方法覆盖方面的。

首先要知道是for循环依次输出vampire.frighten(0)方法,dragon.frighten(1)方法,monster.frighten(2)方法。

并且Monster是父类,两个之类vampire,dragon继承monster。

第一组选项  

monster 类 frighten方法输出  arragh

vampire类继承了monster,并且方法覆盖符合标准,所以v.frighten()输出a bite,

同样的dragon也是继承了monster,并且方法覆盖正确,则输出breat fire,

所以输出的结果就是

a bite?

breath fire

arragh

第二组

要注意,B选项的方法,返回值类型是int,不符合覆盖方法要满足的返回类型要相同或者兼容,所以错误。

第三组/这一组是我之前有点没理解的

monster父类还是一样输出 arrrgh

但是要注意类vampire是声明了一个scare方法,好像有点不相干的意思,但是要注意一点:只要是继承了父类,那么父类方法在子类中就存在了,调不调用另说(这里很容易忽略掉v.frighten,而注意力在方法scare()上),也就是虽然声明了一个不相干的scare方法,但是for循环中调用的是v.frighten方法,所以类中没有,就会去父类中找,也就是v.frighten()输出的是继承下来的arrrgh,因为它自己类中并没有覆盖,有什么特别的行为。

至于Dragon,还是输出breath fire,所以,结果是

arrrgh

breath fire

arrrgh

第四组 /这组也是有点易搞错的 

monster还是一样,输出 arrrgh

至于类vampire的要注意虽然声明的是frighten,但是要注意后面的参数类型是(byte b),而父类monster的是(int z),这会造成什么情况呢,vampire这个子类的frighten方法根本没有覆盖到monster的frighten方法(参数类型完全一样),所以呢,v.frighte()输出的是monster.vampire,也就是输出“arrgh”

dragon还是输出“breath fire”

结果是

arrgh

breath fire

arrgh

以上是关于继承与多态01的主要内容,如果未能解决你的问题,请参考以下文章

Python类的继承与多态详细介绍

继承与多态01

课堂(继承与多态)动手动脑

Python面向对象编程之继承与多态详解

06-继承与多态 课程作业01 完成课件中的动手动脑的或需要验证的相关内容

第十一周 继承与多态