默认方法由来猜想
1. Collection接口、Collections公共类。 同是操作集合,为啥要搞俩?没必要。在接口中搞一些默认实现,一个接口即搞定了。
2. Java8支持Lambda表达式,需要函数式接口。而函数式接口只允许有一个方法的声明。而为了兼容7或之前的版本的Java,用default 声明成默认方法。既不影响它是一个方法声明的函数式接口,也不影响它有多个其它需求的方法,兼容Java之前版本的一些接口的声明。
接口默认方法的类优先原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了另外一个同名方法时,
1、选择父类中的方法。 如果一个父类提供了一个具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
2、接口冲突。 如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法)那么必须覆盖改方法来解决冲突。
public interface MyInterface01 { default void invoke() { System.out.println("MyInterface01"); } }
@FunctionalInterface public interface MyInterface02 { /** * 可以有默认的方法的实现 */ default void invoke() { System.out.println("MyInterface02"); } /** * 可以有静态方法 */ static void show() { System.out.println("This is interface's static method show() "); } /**函数式接口的声明,only one*/ void test(); }
public class FatherClass { void invoke() { System.out.println("FatherClass"); } }
public class MyFun extends FatherClass implements MyInterface01,MyInterface02{ // @Override // public void invoke() { // MyInterface01.super.invoke(); // MyInterface02.super.invoke(); // } @Override public void invoke() { super.invoke(); } public static void main(String[] args) { MyFun fun = new MyFun(); fun.invoke(); } }