为了账号安全,请及时绑定邮箱和手机立即绑定

新手关于接口的小问题请教

新手关于接口的小问题请教

醉里挑灯开车 2017-06-30 11:24:29
interface A {     default String getName(){return getClass().getName() + "-" + hashCode()} } interface B {     default String getName(){return getClass().getName() + "-" + hashCode()} } class C implements A,B {     public String getName(){return B.super.getName();} }如图这段代码,我想问的是类C中调用B类的getName时为什么不能直接  B.getName( )   而是B.super.getName( )这样写岂不是调用的是B的超类的getName()方法了吗??是因为非静态方法不能直接调用?可是B类中getName方法已经重写了吧,用B类超类中的getName()方法就不一样了吧??请大神解答一下!
查看完整描述

2 回答

?
四无小青年

TA贡献88条经验 获得超43个赞

这是java8的新特性默认方法,默认方法允许接口中存在带方法体的方法且子类可以不用重写,在加上接口可以多继承,这就会出现一个类继承多个接口而多个接口具有相同的方法签名这种情况,这会造成歧义,外部直接调用子类的默认方法时不能确定是调用那个接口的方法。
所以java8规定如果存在多继承默认方法冲突,子类需要重写默认方法,或者直接调用更上层的默认方法来消除歧义,不然会编译出错。这就是你所提的问题了,A和B存在相同方法,所以子类通过调用B父类的默认方法来消除歧义。
若解惑,望采纳

查看完整回答
反对 回复 2017-07-04
  • 2 回答
  • 0 关注
  • 1160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信