package java.lang; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface {}
Conceptually, a functional interface has exactly one abstract method.
Since default methods have an implementation, they are not abstract.
If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.
打捞要点之后有这么三点:
Since default methods have an implementation, they are not abstract.
"String toString();
"或者" boolean equals(Object obj);
"这样的,算不算呢? 答案是: 不算这个
,因为任何实现接口的对象都会继承Object,所以这些public的Object的方法,不算在列的。 也就是说,你的接口可以声名如下:
/** * Created by niewj on 2017/10/26. */ @FunctionalInterface public interface FunctionalInterfaceSummary { int doSum(int x, int y); // 抽象方法 String toString(); // 不占1的数额 boolean equals(Object obj); // 不占1的数额 // boolean equals(); // 占1的数额,这不是Object方法 default void display() { System.out.println("show sth.."); } }
小结:
2. 声明 函数式接口
之后,有以下特征:
a. 只有一个抽象方法;
b. Object类的public的方法也可以在接口里写出来,因为这不算;
c. default方法不算, 因为它们是implementation。不是abstract!
---[2017-10-26]---