Java8新特性_接口中的默认方法

 

默认方法由来猜想

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();
    }
}

 

posted @ 2019-01-26 17:03  超轶绝尘  阅读(511)  评论(0编辑  收藏  举报