标签:override app 兼容 表示 自己 依次 http 自己的 ide
继承方面的东西
首先要明白,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
标签:override app 兼容 表示 自己 依次 http 自己的 ide
原文地址:https://www.cnblogs.com/zmlgoes/p/12819393.html