猿问

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

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()方法就不一样了吧??

请大神解答一下!


醉里挑灯开车
浏览 1191回答 2
2回答

四无小青年

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

相关分类

Java
我要回答