jdk1.8之前,接口中如果要定义常量,必须是 public static final。方法必须是public abstract;
jdk1.8之后,接口中这些限定符都可以忽略不写了。同时支持接口中定义static方法和default方法;
如果某个接口中只有一个自定义抽象方法,其余是static 、default方法或者Object中的方法声明,那么这中接口可以加上@FunctionalInterface注解,这个接口就是函数式接口。它可以使用 lambda 表达式、方法引用或构造函数引用创建接口的实例。(因为编译器会将任何满足函数接口定义的接口视为函数接口,所以接口声明中的@FunctionalInterface有没有都无所谓)。
default方法可以被实现类或其子类重写,调用的时候也必须通过具体实现类来调用,而static方法,子类不可见,调用只能通过接口类来调用。
一个接口中可以有多个default方法。default方法的更适合实现不需要多态的方法。
@FunctionalInterface public interface Java8Interface { // public static final String STRING = "JAVA 8 DEMO"; String STRING = "JAVA 8 DEMO"; // public abstract void printMessage(); void printMessage(); // public boolean equals(Object var1); boolean equals(Object var1); // java8 new feature static void staticPrintMessage(){ System.out.println("Static " + STRING); } // java8 new feature default void defaultPrintMessageOverride(){ System.out.println("Java8Interface Default " + STRING); } // java8 new feature default void defaultPrintMessage(){ System.out.println("Java8Interface Default " + STRING); } }
public class Java8Class implements Java8Interface{ @Override public void printMessage() { System.out.println("Normal " + STRING); } @Override public void defaultPrintMessageOverride() { System.out.println("Java8Class Default " + STRING); } }
public class Java8Tests { public static void main(String[] args) { Java8Class java8Class = new Java8Class(); java8Class.printMessage(); //Normal JAVA 8 DEMO java8Class.defaultPrintMessage(); //Java8Interface Default JAVA 8 DEMO java8Class.defaultPrintMessageOverride(); //Java8Class Default JAVA 8 DEMO Java8Interface.staticPrintMessage(); //Static JAVA 8 DEMO } }
在java.util.function目录下的类可以用来支持函数式编程
StringBuilder builder = new StringBuilder(); ConsumerappendConsumer = builder1 -> builder.append("Consumer"); appendConsumer.accept(builder); System.out.println("alfer appendConsumer: " + builder.toString()); Consumer clearConsumer = builder1 -> builder.setLength(0); clearConsumer.accept(builder); System.out.println("after clearConsumer" + builder.toString());
类似的还有
BiConsumer
DoubleConsumer 接收一个double值参数的 *** 作并且不返回结果。
IntConsumer 接收一个int值参数的 *** 作并且不返回结果。
longConsumer 接收一个long值参数的 *** 作并且不返回结果。
ObjDoubleConsumer
ObjIntConsumer
ObjLongConsumer
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)