关于java8接口中默认方法的使用

java8在接口中引入了默认方法,通过在方法前加上default关键字就可以在接口中写方法的默认实现,有点类似于C++中的多继承,但是当多个接口或父类中有相同签名的方法时,会引发一些问题,经过实验得出如下结论:

  1. 当继承的父类和实现的接口中有相同签名的方法时,优先使用父类的方法。
  2. 当接口的父接口中也有同样的默认方法时,就近原则调用子接口的方法。
  3. 当实现的多个接口中有相同签名的方法时,必须在实现类中通过重写方法解决冲突问题,否者无法通过编译,在重写的方法中可以通过 接口名.super.方法名(); 的方式显示调用需要的方法。

例子如下:

有一个类和两个接口

1
2
3
4
5
public class A {
public void methods(){
System.out.println("Object A methods");
}
}

1
2
3
4
5
public interface B {
default void methods(){
System.out.println("interface B methods");
}
}
1
2
3
4
5
public interface C {
default void methods() {
System.out.println("interface C methods");
}
}

下面通过一个类继承自A并且实现B接口:

1
2
3
4
5
6
7
public class Test extends A implements B{
public static void main(String[] args){
System.out.println("HelloWord!");
Test test = new Test();
test.methods();
}
}

根据就近原则test将调用父类A的方法并输出”Object A methods”

如果一个类同时实现了接口B和C:

1
2
3
4
5
6
7
8
9
10
11
12
public class Test1 implements B, C {
public static void main(String[] args){
System.out.println("HelloWord!");
Test1 test1 = new Test();
test1.methods();
}

@Override
public void methods() {
B.super.methods();
}
}

通过使用Override重写的方式解决冲突问题,并且在Override方法中通过B.super.methods();的方式显示指定调用B接口中methods方法,最终输出结果为:“interface B methods”