问题
随着默认方法的加入,有可能出现一个类继承了多个方法而他们使用的却是同样的函数签名,怎么判断类会选择哪一个函数执行?
可根据以下3点:
1、类中的方法优先级最高,类和父类中声明的方法优先级高于任何声明为默认方法的优先级;
2、类中无任何声明,子接口的优先级更高,高于任何声明为默认方法的优先级;
3、以上不满足,继承了多接口的类必须通过显示覆盖和调用期望的方法,显式的选择哪种默认方法;
栗子:有4个对象
接口A
public interface A {
default void holler() {
System.out.println("Interface A");
}
}
接口B
public interface B extends A {
default void holler() {
System.out.println("Interface B");
}
}
类C
public class C extends D implements A, B {
public static void main(String[] args) {
m1();
}
private static void m1() {
new C().holler();
}
}
类D
public class D implements A {
// 注掉和不注掉,类C会打印不同的信息
/*@Override
public void holler() {
System.out.println("clazz D");
}*/
}
如果B接口不继承A接口,那么C类将必须 通过显示覆盖和调用期望的方法来 实现;
新类B
public interface B/* extends A*/ {
default void holler() {
System.out.println("Interface B");
}
}
新类C
public class C/* extends D*/ implements A, B {
public static void main(String[] args) {
m1();
}
private static void m1() {
new C().holler();
}
@Override
public void holler() {
// 调用B中的默认方法
B.super.holler();
}
}
菱形继承问题
interface W
public interface W {
default void hello() {
System.out.println("interface W");
}
}
interface X
public interface X extends W {
}
interface Y
public interface Y extends W {
}
clazz Z
public class Z implements X, Y {
public static void main(String[] args) {
new Z().hello();
}
}
想想会打印什么?
实际上只有一个方法声明可以选择,只有W声明了默认方法,其实W是Z的父接口,结果输入“interface W”
如果在X中添加抽象方法会怎么样呢?
public interface X extends W {
// 添加抽象方法
void hello();
}
由于接口X的抽象方法比由接口W继承来的默认方法优先级更高,所以接口X的抽象方法更加具体,所以类Z需要实现X的抽象方法,否则编译不通过!
总结:
1、类中的方法优先级最高,类和父类中声明的方法优先级高于任何声明为默认方法的优先级;
2、类中无任何声明,子接口的优先级更高,高于任何声明为默认方法的优先级;
3、以上不满足,继承了多接口的类必须通过显示覆盖和调用期望的方法,显式的选择哪种默认方法;