在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.TestInterfaceAmbiguity1 和 com.cyp.fortest.Interface.TestInterfaceAmbiguity2 不兼容;
类 com.cyp.fortest.TestInterfaceAmbiguity从类型 com.cyp.fortest.Interface.TestInterfaceAmbiguity1 和 com.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");
}
}