如果先在一个接口中将一个方法定义为默认方法,然后又在超类或者另一个接口中定义了同样的方法,那么同时实现这两个接口的类或者既继承了超类又实现了接口的类就会发生冲突。但Java提供相应的规则:
1.超类优先。如果超类提供一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
2.接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,就必须解决冲突。
例子
1.假设Person是一个类(有getName方法),Named是一个接口
interface Named{
default String getName(){
return getClass().getName()
}
}
有一个类Student继承了Person和实现了Named接口:
class Student extends Person implements Named{...}
在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略。接口可添加默认方法在Java SE 8中才有,使用“类优先”原则可以确保Java SE 7的兼容性,如果为一个接口添加默认方法,这对于有这个默认方法之前能正常工作的代码不会有任何影响。
2.假设Person是一个接口(默认实现了getName方法),Named依旧是一个接口,类Student实现了这两个接口:
class Student implements Person,Named{...}
类会继承Person和Named接口中提供的两个不一致的getName方法,并不是从中选择一个,这样Java编译器就会报告一个错误,我们需要解决这个二义性。只需要在Student类中提供一个getName方法,在这个方法中,可以选择两个冲突方法中的一个:
class Student implement Person,Named{
public String getName(){
return Person.super.getName();
}
}