函数式接口:首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
@FunctionalInterface标记在接口上,“函数式接口”是指仅仅只包含一个 抽象方法*的接口。 在编译期间检查。
- 1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
- 2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
- 3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么 也不算抽象方法。
注:该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
使用案例
@FunctionalInterface public interface Person { //抽象方法 public abstract void sub(); // //java.lang.Object中的方法不是抽象方法 // @Override // public boolean equals(Object v1); // // default不是抽象方法 // public default void defaultMethod(){ // System.out.println("hello"); // } // // //static不是抽象方法 // public static void staticMethod(){ // } }
public class TestPer { public static void main(String[] args) { //使用Lambda表达式 实现了sub()方法 Person person = () ->{ System.out.println("hello,person"); }; //使用匿名内部类 实现sub()方法 Person person2 = new Person() { @Override public void sub() { System.out.println("hello,person 2"); } }; person.sub(); person2.sub(); } }