Java8接口
00 接口静态方法和默认方法
1 java8之前的接口
接口只能包含方法,如果一个接口实现类巨多,那么如果接口要增加方法,需要所有实现类都修改。所以一般设计时,会提供一个接口的基础实现类,一般是虚拟类,然后再对该虚拟类进行扩展并覆盖适用于他们的方法。
2 接口默认方法(java8)
在接口的方法签名中使用default关键字,就可以创建默认方法
当一个类实现类该接口时,就可以不需要再为该方法提供实现。这时,我们只需要在接口中添加默认方法,就可以给所有的实现类扩展新的方法,而不用修改实现类。
public interface InterfaceDemo {
void func1();
default void log(String str){
System.out.println("InterfaceDemo log:" + str);
}
}
如果一个类同时实现了两个接口,这有两个接口实现了同名的默认方法,那么该类必须要提供该方法的本地实现,因为编译器无法确定应该使用哪个超类方法。
接口默认方法帮我们扩展接口时,不必担心破坏实现类,缩小了接口和抽象类的差异;使我们无需创建基类,由实现类自己选择覆盖哪个默认方法实现。
3 接口静态方法(java8)
- 接口静态方法不允许被实现类覆盖,提供安全性。避免实现类中实现不佳,避免不良结果。
- 接口静态方法仅对接口内方法可 见,实例对象无法访问;可以通过采用类名.方法()的方式来调用。
- 接口静态方法非常适合提供如null检查、集合排序等。
public interface InterfaceDemo2 {
default void log(String str) {
if (!isEmpty(str)) {
System.out.println("InterfaceDemo2 log:" + str);
}
}
static boolean isEmpty(String str) {
System.out.println("InterfaceDemo2 default method parameter empty check");
return str == null ? true : "".equals(str) ? true : false;
}
}
public class StaticMethodDemo implements InterfaceDemo2 {
public boolean isEmpty(String str) {
System.out.println("StaticMethodDemo default method parameter empty check");
return str == null ? true : false;
}
public static void main(String[] args) {
StaticMethodDemo demo = new StaticMethodDemo();
demo.log("");
demo.log("test");
}
}
4 java函数式接口
有且只有一个抽象方法的接口,称为函数式接口。
Java 8引入了
@FunctionalInterface注解来将接口标记为函数式接口。@FunctionalInterface注解是一种避免在函数式接口中意外添加抽象方法的工具,就像@Override用来检查重写父类或实现接口的方法的正确性,@FunctionalInterface可以用来检查该接口是否是正确的的函数式接口。当然也可以不添加,但是使用它是一个好习惯。