在 Java8 中引入 lambda 的概念,针对集合提供新的访问方式 Steam,所以在不针对 JDK 过往版本的大改情况下,支持向下兼容,针对接口的特性进行修改。
在 JDK1.8 之前,Java 中针对接口的特性有:接口中可以包含变量和方法。接口中的变量被默认指定为 public static final 类型,常见的就是在接口中定义一些常量值,接口中的方法则默认是 public abstract 类型的抽象方法,这个不需要我们进行显示指定,接口中的成员一律默认是 public 类型。
在 JDK1.8 中针对接口增加两大特性。
1. static 方法
在 JDK1.8 中,可以在接口中定义一个或多个静态方法,用法同普通 static 方法类似。
public interface InterfaceA {
/**
* 接口中的静态方法
*/
static void showStaticMethod() {
System.out.println("showStaticMethod");
}
public static void main(String[] args) {
InterfaceA.showStaticMethod();
}
}
注意:接口中的静态方法无法被它的实现类进行继承,即只有当前接口能进行访问。而接口中的静态变量是可以被继承的。
2. default 修饰符
类、成员变量或方法没有 private、protected 或 public 修饰符修饰,则默认是 default 类型。在 JDK1.8 中针对接口中方法可以通过 default 修饰符定义,在接口中,增加 default 方法, 是为了既有的 Java 类库的类增加新的功能, 且不必对这些类重新进行设计。 比如, 只需在 Collection 接口中
增加 default Stream stream(), 相应的 Set 和 List 接口以及它们的子类都包含此的方法, 不必为每个子类都重新copy这个方法。
在 Java8 中针对接口内的方法修饰符有:public、default、abstract,default 修饰的方法在接口中进行实现,接口的实现类可以直接调用,如果有需要可以进行重写。
示例:
public interface InterfaceA {
public static String tag="dsw";
/**
* 接口中的静态方法
*/
static void showStaticMethod() {
System.out.println("showStaticMethod");
}
default void showDefaultMethod() {
System.out.println("showDefaultMethod");
}
}
这里我们可以参照 InterfaceA 定义一个实现类。
class InterfaceClass implements InterfaceA {
@Override
public void doAbstract() {
System.out.println("doAbstract");
}
@Override
public void showDefaultMethod() {
InterfaceA.super.showDefaultMethod();
}
}
从上面可以看到,实现类是可以针对接口中的 default 方法进行重写来满足自身的需要。同时如果实现多个接口,且接口中拥有相同的 default 方法和 static 方法,则需要通过 接口名.super.方法名进行指定。