Java接口二义性问题与解决方法

Java采用单继承避免多继承带来的二义性问题,但在实现多个接口时可能出现默认方法冲突。解决办法包括超类优先原则和接口冲突时重写默认方法。当接口中有相同默认方法时,如果不重写,编译器会报错。此外,可以通过类型转换调用不同接口中的常量。
摘要由CSDN通过智能技术生成

在Java中,为了解决多继承的二义性问题,减少程序的复杂性,Java使用单继承方式实现类的继承。但有些人又会有疑问,Java同时引用了实现多个接口的方式,不会造成二义性吗?

实际上,会的!

Java核心技术卷一中有提到,解决默认方法冲突有两种方式:
1.超类优先,如果超类提供了相同方法签名的默认方法,其他的方法会被忽略
2.接口冲突,通过覆盖方法解决问题

以下为第二种解决冲突方法
当两个接口拥有两个同样的默认方法签名的方法时,如果实现类不重写该默认方法,编译时会报错。

//接口1
interface TestInterfaceAmbiguity1 {
    int num = 1;
    default public void defaultMethod(){
        System.out.println("TestInterfaceAmbiguity1");
    }
}
//接口2
interface TestInterfaceAmbiguity2 {
    int num = 1;
    default public void defaultMethod(){
        System.out.println("TestInterfaceAmbiguity2");
    }
}

此时如果我们没有在实现类中重写该defaultMethod方法时,IDEA编译器会提示告警
告警
编译时也会看到不兼容的报错信息

java: 类型 com.cyp.fortest.Interface.TestInterfaceAmbiguity1com.cyp.fortest.Interface.TestInterfaceAmbiguity2 不兼容;
  类 com.cyp.fortest.TestInterfaceAmbiguity从类型 com.cyp.fortest.Interface.TestInterfaceAmbiguity1com.cyp.fortest.Interface.TestInterfaceAmbiguity2 中继承了DefaultMethod() 的不相关默认值

这时其实我们就可以清楚,Java为了防止多继承二义性问题,已经对这个问题进行解决。

与此同时我们在接口中可以定义常量,当两个接口中定义了同名常量时,可以通过转换类型实现常量的调用。

public static void main(String[] args) {
        TestInterfaceAmbiguity testInterfaceAmbiguity = new TestInterfaceAmbiguity();
        System.out.println(((TestInterfaceAmbiguity2)testInterfaceAmbiguity).num);
}

详细代码如下:

public class TestInterfaceAmbiguity implements TestInterfaceAmbiguity1, TestInterfaceAmbiguity2 {
    public static void main(String[] args) {
        TestInterfaceAmbiguity testInterfaceAmbiguity = new TestInterfaceAmbiguity();
        System.out.println(((TestInterfaceAmbiguity1)testInterfaceAmbiguity).num);
        testInterfaceAmbiguity.DefaultMethod();
    }
}
interface TestInterfaceAmbiguity1 {
    int num = 1;
    default public void DefaultMethod(){
        System.out.println("TestInterfaceAmbiguity1");
    }
}
interface TestInterfaceAmbiguity2 {
    int num = 2;
    default public void DefaultMethod(){
        System.out.println("TestInterfaceAmbiguity2");
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值