在 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.方法名进行指定。