多态5-7的概念问题

多态5-7的概念问题

1、接口里的常量,能被实现类继承吗?如果能或不能,为什么?

2、接口里的默认方法,在实现类没有重写的情况下,能被实现类继承吗?如果能或不能,为什么?

3、接口里的静态方法,能被实现类继承码?如果不能或能,为什么?

4、接口里的默认方法的访问修饰符就是default吗?那么重写默认方法,它的访问修饰符成了public,这是为什么?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
好帮手慕小班 2019-08-26 19:29:05

同学你好,子类可以继承父类的常量,这里同学的说法没错!

    但我们在调用时,虚拟机会根据对象的类型来找对应的属性,例如:

http://img1.sycdn.imooc.com//climg/5d63c0d90001220603000124.jpg

http://img1.sycdn.imooc.com//climg/5d63c0e40001b9bf04610179.jpg

http://img1.sycdn.imooc.com//climg/5d63c1320001287905350480.jpg

由不同的类型来决定调用的是哪个TEMP。所以子类中的重写后的属性也可以说是子类特有的属性。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

好帮手慕小班 2019-08-25 18:08:43

同学你好,这里不能叫重写,因为在一个类或接口中定义了一个常量,那这个常量就是这个类或接口特有的成员,当出现重名的成员变量(常量),我们在调用时,虚拟机会根据对象的类型来找对应的属性,我们调用的是哪个中的常量呐,例如:

http://img1.sycdn.imooc.com//climg/5d625d430001068306940807.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 鱼儿0001 #1
    老师你真的觉得子类不能继承父类的常量吗?你好好想想再回答一下我的问题:对于第二个问题,在接口里写有常量,实现类写有同名常量,老说说这是重写。那么,为什么接口的引用指向实现类实例对象,调用的仍然是接口里的常量而不是实现类的常量呢?还必须得是实现类的引用指向实现类对象,才能调用到实现类自己的常量呢?
    2019-08-26 17:12:09
好帮手慕酷酷 2019-08-24 15:45:31

同学你好,

1、对于第一个问题,你的理解是正确的,其实接口就可以理解为一种特殊的父类。

2、第二个问题,如果实现类也有同名的同类型的常量a,这可以理解为重写,在实现类是不会报错的,但是final类型的常量是不允许被修改的,但实现类也有同名的同类型的常量a会被覆盖的,会调用实现类本身的常量。

3、第三个问题,default标记接口里的普通方法,方法的访问修饰符还是public,老师就是这个意思。你的理解是正确的。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 鱼儿0001 #1
    谢谢老师。对于第二个问题,在接口里写有常量,实现类写有同名常量,老说说这是重写。那么,为什么接口的引用指向实现类实例对象,调用的仍然是接口里的常量而不是实现类的常量呢?还必须得是实现类的引用指向实现类对象,才能调用到实现类自己的常量呢?
    2019-08-25 14:48:31
好帮手慕酷酷 2019-08-23 18:15:00

同学你好,

1、对于接口中的常量是被继承的,但是只能访问,不能修改常量的值。因为继承是子类继承父类的方法和属性,其中属性包括常量。

例如如下代码:

在接口中定义int类型的常量a赋值为1;

http://img1.sycdn.imooc.com//climg/5d5fb6f40001cfab03710124.jpg

有一个Bird类实现了IFly接口

http://img1.sycdn.imooc.com//climg/5d5fb738000199d203700045.jpg

在测试类中创建Bird的对象,通过该对象调用常量

http://img1.sycdn.imooc.com//climg/5d5fb7d60001675b04100162.jpg

输出结果为:

http://img1.sycdn.imooc.com//climg/5d5fb7ea00015c4b02400095.jpg

说明常量被实现类继承了。

2、接口里的默认方法,在实现类没有重写的情况下,可以被实现类继承。

例如如下代码:

在IFly接口中有一个run()的默认方法

http://img1.sycdn.imooc.com//climg/5d5fb8cc00013ba003780194.jpg

Bird类中没有重写该方法:

http://img1.sycdn.imooc.com//climg/5d5fb8e80001d46404290177.jpg

在测试类中创建Bird的对象,通过该对象调用默认方法run()方法。

http://img1.sycdn.imooc.com//climg/5d5fb9230001274703840158.jpg

输出结果为,接口中的默认方法的输出语句:

http://img1.sycdn.imooc.com//climg/5d5fb95000013a0902370085.jpg

所以接口里的默认方法,在实现类没有重写的情况下,被实现类继承了。

3、接口里的静态方法,不能被实现类继承,静态方法只是属于这个接口本身的,静态方法只能通过类名调用,也就只属于接口本身。

例如如下代码:

在IFly接口中含有静态方法jump()

http://img1.sycdn.imooc.com//climg/5d5fbad0000174fa03880219.jpg

在测试类中,我们通过Brid实现类去调用这个静态方法,会报错。

http://img1.sycdn.imooc.com//climg/5d5fbb33000114fa05070137.jpg

所以接口里的静态方法,不能被实现类继承。

4、接口中所有方法的访问修饰符都是public,default只是一个标记,将这个方法标记为普通方法。

例如如下代码:

http://img1.sycdn.imooc.com//climg/5d5fbc670001b90903960232.jpg

所以重写后也是public修饰符。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!




  • 提问者 鱼儿0001 #1
    谢谢老师的耐心回复,感谢感谢,看你发了这么多行回复,真的感谢。我还有点小疑问:1、接口的属性和方法能被实现类继承,能不能将接口理解成一种特殊的父类。毕竟只有父子类才会有继承的概念。2、老师回复我的第一个问题,老师说接口的属性、方法能被实现类继承,你举例说明接口的属性被实现类继承,那要是实现类也有同名的同类型的常量a,这算是重写吗?根据之前的课程可知,接口的引用指向实现类后,引用是调不到实现类重写的常量的,所以我在这里有点困惑。3、default标记接口里的普通方法,方法的访问修饰符还是public,老师你是这意思吗?
    2019-08-24 15:10:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师