Java接口中的默认方法冲突

在Java中,我们可以为其接口中定义的方法提供一个默认的实现。当然,这可能并没有很大的用处,不过,在某些情况下可能很有用!如果要为接口方法提供一个默认实现,必须要用 default关键字 修饰。

在为接口方法提供一个默认实现的时候,我们可能会遇到一些问题 —— 默认方法冲突!

public class Test{
    public static void main(String[] args) {
        System.out.println(new People().getName());
        System.out.println(new Student().getName());
    }
}

interface Person {
    default String getName(){
        return "<=Person=>";
    }
}

interface Human {
    default String getName(){
        return "<=Human=>";
    }
}

class People implements Person, Human {
    @Override
    public String getName() {
        return Person.super.getName();
    }
}

class Student extends People implements Human {
    @Override
    public String getName() {
        return super.getName();
    }
}

以上的代码就清晰的展现了,在不同的接口中定义相同名称的默认方法产生的方法冲突问题!

运行结果:

 通过结果我们得到结论:

        1. 如果在一个接口中提供了一个默认方法,在另一个接口中同样也提供了一个相同名称且参数类型也相同的默认方法,当一个类 implements 这两个接口并使用其默认方法时,就会产生歧义,所以要在 super.getName( ) 前加上接口名 —— Person.super.getName( )这样就解决了冲突问题!

        2. 当子类继承父类,并从父类子类的接口中继承了相同的方法,在这种情况下,从运行结果中我们可以看出,子类会调用父类的方法,而不是接口中的默认方法,所以我们可以看出,在这种情况下接口中所有的默认方法都会被忽略,只会去调用父类中的方法,体现了类优先的规则 !

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值