java8在接口中引入了默认方法,通过在方法前加上default关键字就可以在接口中写方法的默认实现,有点类似于C++中的多继承,但是当多个接口或父类中有相同签名的方法时,会引发一些问题,经过实验得出如下结论:
1.当继承的父类和实现的接口中有相同签名的方法时,优先使用父类的方法。
2.当接口的父接口中也有同样的默认方法时,就近原则调用子接口的方法。
3.当实现的多个接口中有相同签名的方法时,必须在实现类中通过重写方法解决冲突问题,否者无法通过编译,在重写的方法中可以通过 接口名.super.方法名(); 的方式显示调用需要的方法。
例子如下:
有一个类和两个接口
public class A { public void methods(){ System.out.println("Object A methods"); } }
public interface B { default void methods(){ System.out.println("interface B methods"); } }
下面通过一个类继承自A并且实现B接口:public interface C { default void methods(){ System.out.println("interface C methods"); } }
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:
通过使用Override重写的方式解决冲突问题,并且在Override方法中通过B.super.methods();的方式显示指定调用B接口中methods方法,最终输出结果为:“interface B methods”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(); } }